diff --git a/DDrawCompat/DDraw/DirectDraw.cpp b/DDrawCompat/DDraw/DirectDraw.cpp index 85a1809..3d3052e 100644 --- a/DDrawCompat/DDraw/DirectDraw.cpp +++ b/DDrawCompat/DDraw/DirectDraw.cpp @@ -251,6 +251,11 @@ namespace DDraw if (realPrimary) { realPrimary->Restore(realPrimary); + auto gdiResource = DDraw::PrimarySurface::getGdiResource(); + if (gdiResource) + { + D3dDdi::Device::setGdiResourceHandle(gdiResource); + } } } diff --git a/DDrawCompat/DDraw/RealPrimarySurface.cpp b/DDrawCompat/DDraw/RealPrimarySurface.cpp index db99135..7d507ae 100644 --- a/DDrawCompat/DDraw/RealPrimarySurface.cpp +++ b/DDrawCompat/DDraw/RealPrimarySurface.cpp @@ -308,6 +308,12 @@ namespace g_windowedBackBuffer->Restore(g_windowedBackBuffer); } + auto gdiResource = DDraw::PrimarySurface::getGdiResource(); + if (gdiResource) + { + D3dDdi::Device::setGdiResourceHandle(gdiResource); + } + Compat::ScopedCriticalSection lock(g_presentCs); g_isOverlayUpdatePending = false; g_isUpdatePending = false; diff --git a/DDrawCompat/DDraw/Surfaces/PrimarySurface.cpp b/DDrawCompat/DDraw/Surfaces/PrimarySurface.cpp index 4222d4d..ba2f5ca 100644 --- a/DDrawCompat/DDraw/Surfaces/PrimarySurface.cpp +++ b/DDrawCompat/DDraw/Surfaces/PrimarySurface.cpp @@ -19,7 +19,8 @@ namespace CompatWeakPtr g_primarySurface; CompatWeakPtr g_gdiPrimarySurface; D3dDdi::Device* g_device = nullptr; - HANDLE g_gdiResourceHandle = nullptr; + HANDLE g_gdiDriverResource = nullptr; + HANDLE g_gdiRuntimeResource = nullptr; HANDLE g_frontResource = nullptr; DWORD g_origCaps = 0; HWND g_deviceWindow = nullptr; @@ -66,7 +67,8 @@ namespace DDraw LOG_FUNC("PrimarySurface::~PrimarySurface"); g_device = nullptr; - g_gdiResourceHandle = nullptr; + g_gdiRuntimeResource = nullptr; + g_gdiDriverResource = nullptr; g_frontResource = nullptr; g_primarySurface = nullptr; g_gdiPrimarySurface.release(); @@ -282,6 +284,11 @@ namespace DDraw return g_frontResource; } + HANDLE PrimarySurface::getGdiResource() + { + return g_gdiDriverResource; + } + RECT PrimarySurface::getMonitorRect() { return g_monitorRect; @@ -295,7 +302,7 @@ namespace DDraw template static bool PrimarySurface::isGdiSurface(TSurface* surface) { - return surface && DirectDrawSurface::getRuntimeResourceHandle(*surface) == g_gdiResourceHandle; + return surface && DirectDrawSurface::getRuntimeResourceHandle(*surface) == g_gdiRuntimeResource; } template bool PrimarySurface::isGdiSurface(IDirectDrawSurface*); @@ -310,10 +317,11 @@ namespace DDraw Gdi::VirtualScreen::update(); g_primarySurface = m_surface; - g_gdiResourceHandle = DirectDrawSurface::getRuntimeResourceHandle(*g_primarySurface); + g_gdiRuntimeResource = DirectDrawSurface::getRuntimeResourceHandle(*g_primarySurface); updateFrontResource(); - D3dDdi::Device::setGdiResourceHandle(g_frontResource); + g_gdiDriverResource = g_frontResource; + D3dDdi::Device::setGdiResourceHandle(g_gdiDriverResource); DDSCAPS2 caps = {}; caps.dwCaps = DDSCAPS_FLIP; diff --git a/DDrawCompat/DDraw/Surfaces/PrimarySurface.h b/DDrawCompat/DDraw/Surfaces/PrimarySurface.h index a5e6bf7..aedde00 100644 --- a/DDrawCompat/DDraw/Surfaces/PrimarySurface.h +++ b/DDrawCompat/DDraw/Surfaces/PrimarySurface.h @@ -25,6 +25,7 @@ namespace DDraw static CompatWeakPtr getGdiPrimary(); static CompatWeakPtr getPrimary(); static HANDLE getFrontResource(); + static HANDLE getGdiResource(); static DWORD getOrigCaps(); static void updatePalette(); diff --git a/DDrawCompat/Gdi/VirtualScreen.cpp b/DDrawCompat/Gdi/VirtualScreen.cpp index 99083fb..678b639 100644 --- a/DDrawCompat/Gdi/VirtualScreen.cpp +++ b/DDrawCompat/Gdi/VirtualScreen.cpp @@ -311,7 +311,7 @@ namespace Gdi SelectObject(dc.first, createDib(dc.second.useDefaultPalette)); } - if (gdiResource && DDraw::PrimarySurface::getPrimary()) + if (gdiResource && DDraw::PrimarySurface::getPrimary() && !DDraw::RealPrimarySurface::isLost()) { D3dDdi::Device::setGdiResourceHandle(*gdiResource); }