mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Fixed GDI updates interrupted by presentation sync
This commit is contained in:
parent
77bdff3f1c
commit
66e0d20897
@ -188,6 +188,18 @@ namespace D3dDdi
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Resource::beginGdiAccess(bool isReadOnly)
|
||||||
|
{
|
||||||
|
if (m_lockResource)
|
||||||
|
{
|
||||||
|
if (!m_lockData[0].isSysMemUpToDate)
|
||||||
|
{
|
||||||
|
copyToSysMem(0);
|
||||||
|
}
|
||||||
|
m_lockData[0].isVidMemUpToDate &= isReadOnly;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT Resource::blt(D3DDDIARG_BLT data)
|
HRESULT Resource::blt(D3DDDIARG_BLT data)
|
||||||
{
|
{
|
||||||
if (!isValidRect(data.DstSubResourceIndex, data.DstRect))
|
if (!isValidRect(data.DstSubResourceIndex, data.DstRect))
|
||||||
@ -455,6 +467,14 @@ namespace D3dDdi
|
|||||||
LOG_RESULT(m_lockResource.get());
|
LOG_RESULT(m_lockResource.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Resource::endGdiAccess(bool isReadOnly)
|
||||||
|
{
|
||||||
|
if (m_lockResource && !isReadOnly && m_lockData[0].isSysMemUpToDate)
|
||||||
|
{
|
||||||
|
m_lockData[0].isVidMemUpToDate = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Resource::fixVertexData(UINT offset, UINT count, UINT stride)
|
void Resource::fixVertexData(UINT offset, UINT count, UINT stride)
|
||||||
{
|
{
|
||||||
if (!m_fixedData.Flags.MightDrawFromLocked ||
|
if (!m_fixedData.Flags.MightDrawFromLocked ||
|
||||||
|
@ -26,8 +26,10 @@ namespace D3dDdi
|
|||||||
|
|
||||||
operator HANDLE() const { return m_handle; }
|
operator HANDLE() const { return m_handle; }
|
||||||
|
|
||||||
|
void beginGdiAccess(bool isReadOnly);
|
||||||
HRESULT blt(D3DDDIARG_BLT data);
|
HRESULT blt(D3DDDIARG_BLT data);
|
||||||
HRESULT colorFill(D3DDDIARG_COLORFILL data);
|
HRESULT colorFill(D3DDDIARG_COLORFILL data);
|
||||||
|
void endGdiAccess(bool isReadOnly);
|
||||||
void fixVertexData(UINT offset, UINT count, UINT stride);
|
void fixVertexData(UINT offset, UINT count, UINT stride);
|
||||||
void* getLockPtr(UINT subResourceIndex);
|
void* getLockPtr(UINT subResourceIndex);
|
||||||
HRESULT lock(D3DDDIARG_LOCK& data);
|
HRESULT lock(D3DDDIARG_LOCK& data);
|
||||||
|
@ -16,25 +16,23 @@ namespace Gdi
|
|||||||
auto gdiResource = D3dDdi::Device::getGdiResource();
|
auto gdiResource = D3dDdi::Device::getGdiResource();
|
||||||
if (gdiResource)
|
if (gdiResource)
|
||||||
{
|
{
|
||||||
D3DDDIARG_LOCK lockData = {};
|
gdiResource->beginGdiAccess(ACCESS_READ == m_access);
|
||||||
lockData.hResource = gdiResource;
|
|
||||||
lockData.Flags.ReadOnly = ACCESS_READ == access;
|
|
||||||
gdiResource->lock(lockData);
|
|
||||||
|
|
||||||
D3DDDIARG_UNLOCK unlockData = {};
|
|
||||||
unlockData.hResource = gdiResource;
|
|
||||||
gdiResource->unlock(unlockData);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AccessGuard::~AccessGuard()
|
AccessGuard::~AccessGuard()
|
||||||
{
|
{
|
||||||
if (m_condition && ACCESS_WRITE == m_access)
|
if (m_condition)
|
||||||
{
|
{
|
||||||
D3dDdi::ScopedCriticalSection lock;
|
D3dDdi::ScopedCriticalSection lock;
|
||||||
auto gdiResource = D3dDdi::Device::getGdiResource();
|
auto gdiResource = D3dDdi::Device::getGdiResource();
|
||||||
if (!gdiResource || DDraw::PrimarySurface::getFrontResource() == *gdiResource)
|
if (gdiResource)
|
||||||
|
{
|
||||||
|
gdiResource->endGdiAccess(ACCESS_READ == m_access);
|
||||||
|
}
|
||||||
|
if (ACCESS_WRITE == m_access &&
|
||||||
|
(!gdiResource || DDraw::PrimarySurface::getFrontResource() == *gdiResource))
|
||||||
{
|
{
|
||||||
DDraw::RealPrimarySurface::gdiUpdate();
|
DDraw::RealPrimarySurface::gdiUpdate();
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace D3dDdi
|
|
||||||
{
|
|
||||||
class Resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Gdi
|
namespace Gdi
|
||||||
{
|
{
|
||||||
enum Access
|
enum Access
|
||||||
|
@ -217,7 +217,10 @@ namespace
|
|||||||
return onNcPaint(hwnd, wParam, origWndProc);
|
return onNcPaint(hwnd, wParam, origWndProc);
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
|
{
|
||||||
|
D3dDdi::ScopedCriticalSection lock;
|
||||||
return onPaint(hwnd, origWndProc);
|
return onPaint(hwnd, origWndProc);
|
||||||
|
}
|
||||||
|
|
||||||
case WM_PRINTCLIENT:
|
case WM_PRINTCLIENT:
|
||||||
{
|
{
|
||||||
@ -238,7 +241,8 @@ namespace
|
|||||||
case 0x1e5:
|
case 0x1e5:
|
||||||
if (-1 == wParam)
|
if (-1 == wParam)
|
||||||
{
|
{
|
||||||
RedrawWindow(hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_ERASE);
|
D3dDdi::ScopedCriticalSection lock;
|
||||||
|
RedrawWindow(hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW);
|
||||||
}
|
}
|
||||||
return CallWindowProc(origWndProc, hwnd, msg, wParam, lParam);
|
return CallWindowProc(origWndProc, hwnd, msg, wParam, lParam);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user