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:
parent
0801a74af5
commit
83941ddb8e
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user