@@ -320,6 +320,7 @@ static constexpr RenderFormat BACKBUFFER_FORMAT = RenderFormat::B8G8R8A8_UNORM;
320
320
static std::unique_ptr<RenderCommandSemaphore> g_acquireSemaphores[NUM_FRAMES];
321
321
static std::unique_ptr<RenderCommandSemaphore> g_renderSemaphores[NUM_FRAMES];
322
322
static uint32_t g_backBufferIndex;
323
+ static std::unique_ptr<GuestSurface> g_backBufferHolder;
323
324
static GuestSurface* g_backBuffer;
324
325
325
326
static std::unique_ptr<RenderTexture> g_intermediaryBackBufferTexture;
@@ -1948,7 +1949,10 @@ bool Video::CreateHostDevice(const char *sdlVideoDriver)
1948
1949
desc.renderTargetCount = 1 ;
1949
1950
g_gammaCorrectionPipeline = g_device->createGraphicsPipeline (desc);
1950
1951
1951
- g_backBuffer = g_userHeap.AllocPhysical <GuestSurface>(ResourceType::RenderTarget);
1952
+ // NOTE: We initially allocate this on host memory to make the installer work, even if the 4 GB memory allocation fails.
1953
+ g_backBufferHolder = std::make_unique<GuestSurface>(ResourceType::RenderTarget);
1954
+
1955
+ g_backBuffer = g_backBufferHolder.get ();
1952
1956
g_backBuffer->width = 1280 ;
1953
1957
g_backBuffer->height = 720 ;
1954
1958
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,
2006
2010
LoadTexture ((uint8_t *)achievement.pImageBuffer , achievement.ImageBufferSize ).release ();
2007
2011
}
2008
2012
2013
+ // Move backbuffer to guest memory.
2014
+ assert (!g_memory.IsInMemoryRange (g_backBuffer) && g_backBufferHolder != nullptr );
2015
+ g_backBuffer = g_userHeap.AllocPhysical <GuestSurface>(std::move (*g_backBufferHolder));
2016
+ g_backBufferHolder = nullptr ;
2017
+
2009
2018
auto device = g_userHeap.AllocPhysical <GuestDevice>();
2010
2019
memset (device, 0 , sizeof (*device));
2011
2020
0 commit comments