1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Don't set GDI resource while primary is lost

This commit is contained in:
narzoul 2022-12-20 21:43:05 +01:00
parent 0801a74af5
commit 83941ddb8e
5 changed files with 26 additions and 6 deletions

View File

@ -251,6 +251,11 @@ namespace DDraw
if (realPrimary)
{
realPrimary->Restore(realPrimary);
auto gdiResource = DDraw::PrimarySurface::getGdiResource();
if (gdiResource)
{
D3dDdi::Device::setGdiResourceHandle(gdiResource);
}
}
}

View File

@ -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;

View File

@ -19,7 +19,8 @@ namespace
CompatWeakPtr<IDirectDrawSurface7> g_primarySurface;
CompatWeakPtr<IDirectDrawSurface7> 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 <typename TSurface>
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;

View File

@ -25,6 +25,7 @@ namespace DDraw
static CompatWeakPtr<IDirectDrawSurface7> getGdiPrimary();
static CompatWeakPtr<IDirectDrawSurface7> getPrimary();
static HANDLE getFrontResource();
static HANDLE getGdiResource();
static DWORD getOrigCaps();
static void updatePalette();

View File

@ -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);
}