diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index e24ce4de..29ebb842 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -320,6 +320,7 @@ static constexpr RenderFormat BACKBUFFER_FORMAT = RenderFormat::B8G8R8A8_UNORM; static std::unique_ptr g_acquireSemaphores[NUM_FRAMES]; static std::unique_ptr g_renderSemaphores[NUM_FRAMES]; static uint32_t g_backBufferIndex; +static std::unique_ptr g_backBufferHolder; static GuestSurface* g_backBuffer; static std::unique_ptr g_intermediaryBackBufferTexture; @@ -1948,7 +1949,10 @@ bool Video::CreateHostDevice(const char *sdlVideoDriver) desc.renderTargetCount = 1; g_gammaCorrectionPipeline = g_device->createGraphicsPipeline(desc); - g_backBuffer = g_userHeap.AllocPhysical(ResourceType::RenderTarget); + // NOTE: We initially allocate this on host memory to make the installer work, even if the 4 GB memory allocation fails. + g_backBufferHolder = std::make_unique(ResourceType::RenderTarget); + + g_backBuffer = g_backBufferHolder.get(); g_backBuffer->width = 1280; g_backBuffer->height = 720; g_backBuffer->format = BACKBUFFER_FORMAT; @@ -2006,6 +2010,11 @@ static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, LoadTexture((uint8_t *)achievement.pImageBuffer, achievement.ImageBufferSize).release(); } + // Move backbuffer to guest memory. + assert(!g_memory.IsInMemoryRange(g_backBuffer) && g_backBufferHolder != nullptr); + g_backBuffer = g_userHeap.AllocPhysical(std::move(*g_backBufferHolder)); + g_backBufferHolder = nullptr; + auto device = g_userHeap.AllocPhysical(); memset(device, 0, sizeof(*device));