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) if (realPrimary)
{ {
realPrimary->Restore(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); g_windowedBackBuffer->Restore(g_windowedBackBuffer);
} }
auto gdiResource = DDraw::PrimarySurface::getGdiResource();
if (gdiResource)
{
D3dDdi::Device::setGdiResourceHandle(gdiResource);
}
Compat::ScopedCriticalSection lock(g_presentCs); Compat::ScopedCriticalSection lock(g_presentCs);
g_isOverlayUpdatePending = false; g_isOverlayUpdatePending = false;
g_isUpdatePending = false; g_isUpdatePending = false;

View File

@ -19,7 +19,8 @@ namespace
CompatWeakPtr<IDirectDrawSurface7> g_primarySurface; CompatWeakPtr<IDirectDrawSurface7> g_primarySurface;
CompatWeakPtr<IDirectDrawSurface7> g_gdiPrimarySurface; CompatWeakPtr<IDirectDrawSurface7> g_gdiPrimarySurface;
D3dDdi::Device* g_device = nullptr; D3dDdi::Device* g_device = nullptr;
HANDLE g_gdiResourceHandle = nullptr; HANDLE g_gdiDriverResource = nullptr;
HANDLE g_gdiRuntimeResource = nullptr;
HANDLE g_frontResource = nullptr; HANDLE g_frontResource = nullptr;
DWORD g_origCaps = 0; DWORD g_origCaps = 0;
HWND g_deviceWindow = nullptr; HWND g_deviceWindow = nullptr;
@ -66,7 +67,8 @@ namespace DDraw
LOG_FUNC("PrimarySurface::~PrimarySurface"); LOG_FUNC("PrimarySurface::~PrimarySurface");
g_device = nullptr; g_device = nullptr;
g_gdiResourceHandle = nullptr; g_gdiRuntimeResource = nullptr;
g_gdiDriverResource = nullptr;
g_frontResource = nullptr; g_frontResource = nullptr;
g_primarySurface = nullptr; g_primarySurface = nullptr;
g_gdiPrimarySurface.release(); g_gdiPrimarySurface.release();
@ -282,6 +284,11 @@ namespace DDraw
return g_frontResource; return g_frontResource;
} }
HANDLE PrimarySurface::getGdiResource()
{
return g_gdiDriverResource;
}
RECT PrimarySurface::getMonitorRect() RECT PrimarySurface::getMonitorRect()
{ {
return g_monitorRect; return g_monitorRect;
@ -295,7 +302,7 @@ namespace DDraw
template <typename TSurface> template <typename TSurface>
static bool PrimarySurface::isGdiSurface(TSurface* surface) 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*); template bool PrimarySurface::isGdiSurface(IDirectDrawSurface*);
@ -310,10 +317,11 @@ namespace DDraw
Gdi::VirtualScreen::update(); Gdi::VirtualScreen::update();
g_primarySurface = m_surface; g_primarySurface = m_surface;
g_gdiResourceHandle = DirectDrawSurface::getRuntimeResourceHandle(*g_primarySurface); g_gdiRuntimeResource = DirectDrawSurface::getRuntimeResourceHandle(*g_primarySurface);
updateFrontResource(); updateFrontResource();
D3dDdi::Device::setGdiResourceHandle(g_frontResource); g_gdiDriverResource = g_frontResource;
D3dDdi::Device::setGdiResourceHandle(g_gdiDriverResource);
DDSCAPS2 caps = {}; DDSCAPS2 caps = {};
caps.dwCaps = DDSCAPS_FLIP; caps.dwCaps = DDSCAPS_FLIP;

View File

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

View File

@ -311,7 +311,7 @@ namespace Gdi
SelectObject(dc.first, createDib(dc.second.useDefaultPalette)); SelectObject(dc.first, createDib(dc.second.useDefaultPalette));
} }
if (gdiResource && DDraw::PrimarySurface::getPrimary()) if (gdiResource && DDraw::PrimarySurface::getPrimary() && !DDraw::RealPrimarySurface::isLost())
{ {
D3dDdi::Device::setGdiResourceHandle(*gdiResource); D3dDdi::Device::setGdiResourceHandle(*gdiResource);
} }