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

Reintroduced heuristics for preferring software blitting

This commit is contained in:
narzoul 2022-11-05 20:36:31 +01:00
parent 246108bbdf
commit 8e4741ab70
2 changed files with 36 additions and 11 deletions

View File

@ -169,6 +169,7 @@ namespace D3dDdi
m_lockData[i].isVidMemUpToDate = true; m_lockData[i].isVidMemUpToDate = true;
m_lockData[i].isMsaaUpToDate = m_msaaSurface.resource; m_lockData[i].isMsaaUpToDate = m_msaaSurface.resource;
m_lockData[i].isMsaaResolvedUpToDate = m_msaaResolvedSurface.resource; m_lockData[i].isMsaaResolvedUpToDate = m_msaaResolvedSurface.resource;
m_lockData[i].qpcLastCpuAccess = Time::queryPerformanceCounter();
} }
} }
else if (D3DDDIPOOL_SYSTEMMEM == m_fixedData.Pool && 0 != m_formatInfo.bytesPerPixel) else if (D3DDDIPOOL_SYSTEMMEM == m_fixedData.Pool && 0 != m_formatInfo.bytesPerPixel)
@ -242,10 +243,9 @@ namespace D3dDdi
return presentationBlt(data, srcResource); return presentationBlt(data, srcResource);
} }
HRESULT result = bltViaCpu(data, *srcResource); if (shouldBltViaCpu(data, *srcResource))
if (S_FALSE != result)
{ {
return result; return bltViaCpu(data, *srcResource);
} }
return bltViaGpu(data, *srcResource); return bltViaGpu(data, *srcResource);
@ -285,13 +285,6 @@ namespace D3dDdi
HRESULT Resource::bltViaCpu(D3DDDIARG_BLT data, Resource& srcResource) HRESULT Resource::bltViaCpu(D3DDDIARG_BLT data, Resource& srcResource)
{ {
if (m_fixedData.Format != srcResource.m_fixedData.Format ||
0 == m_formatInfo.bytesPerPixel ||
D3DDDIFMT_P8 != m_fixedData.Format && !m_isOversized && !srcResource.m_isOversized)
{
return S_FALSE;
}
D3DDDIARG_LOCK srcLock = {}; D3DDDIARG_LOCK srcLock = {};
srcLock.hResource = data.hSrcResource; srcLock.hResource = data.hSrcResource;
srcLock.SubResourceIndex = data.SrcSubResourceIndex; srcLock.SubResourceIndex = data.SrcSubResourceIndex;
@ -660,6 +653,7 @@ namespace D3dDdi
m_lockData[i].isMsaaUpToDate = m_msaaSurface.resource; m_lockData[i].isMsaaUpToDate = m_msaaSurface.resource;
m_lockData[i].isMsaaResolvedUpToDate = m_msaaResolvedSurface.resource; m_lockData[i].isMsaaResolvedUpToDate = m_msaaResolvedSurface.resource;
m_lockData[i].isRefLocked = false; m_lockData[i].isRefLocked = false;
m_lockData[i].qpcLastCpuAccess = Time::queryPerformanceCounter();
} }
} }
@ -928,6 +922,7 @@ namespace D3dDdi
notifyLock(subResourceIndex); notifyLock(subResourceIndex);
m_lockData[subResourceIndex].isSysMemUpToDate = true; m_lockData[subResourceIndex].isSysMemUpToDate = true;
} }
m_lockData[subResourceIndex].qpcLastCpuAccess = Time::queryPerformanceCounter();
} }
void Resource::loadVidMemResource(UINT subResourceIndex) void Resource::loadVidMemResource(UINT subResourceIndex)
@ -1549,6 +1544,35 @@ namespace D3dDdi
return LOG_RESULT(S_OK); return LOG_RESULT(S_OK);
} }
bool Resource::shouldBltViaCpu(const D3DDDIARG_BLT& data, Resource& srcResource)
{
if (m_fixedData.Format != srcResource.m_fixedData.Format ||
0 == m_formatInfo.bytesPerPixel ||
m_fixedData.Flags.ZBuffer ||
D3DDDIPOOL_SYSTEMMEM != srcResource.m_fixedData.Pool && !srcResource.m_lockResource)
{
return false;
}
if (D3DDDIPOOL_SYSTEMMEM == m_fixedData.Pool ||
D3DDDIFMT_P8 == m_fixedData.Format ||
m_isOversized || srcResource.m_isOversized)
{
return true;
}
if (m_lockData.empty() ||
!m_lockData[data.DstSubResourceIndex].isSysMemUpToDate ||
Time::qpcToMs(Time::queryPerformanceCounter() - m_lockData[data.DstSubResourceIndex].qpcLastCpuAccess) > 200)
{
return false;
}
return Config::Settings::BltFilter::POINT == Config::bltFilter.get() ||
data.SrcRect.right - data.SrcRect.left == data.DstRect.right - data.DstRect.left &&
data.SrcRect.bottom - data.SrcRect.top == data.DstRect.bottom - data.DstRect.top;
}
HRESULT Resource::unlock(const D3DDDIARG_UNLOCK& data) HRESULT Resource::unlock(const D3DDDIARG_UNLOCK& data)
{ {
return (m_lockResource || m_isOversized) ? S_OK : m_device.getOrigVtable().pfnUnlock(m_device, &data); return (m_lockResource || m_isOversized) ? S_OK : m_device.getOrigVtable().pfnUnlock(m_device, &data);

View File

@ -78,7 +78,7 @@ namespace D3dDdi
void* data; void* data;
UINT pitch; UINT pitch;
UINT lockCount; UINT lockCount;
long long qpcLastForcedLock; long long qpcLastCpuAccess;
bool isSysMemUpToDate; bool isSysMemUpToDate;
bool isVidMemUpToDate; bool isVidMemUpToDate;
bool isMsaaUpToDate; bool isMsaaUpToDate;
@ -119,6 +119,7 @@ namespace D3dDdi
void presentLayeredWindows(Resource& dst, UINT dstSubResourceIndex, const RECT& dstRect); void presentLayeredWindows(Resource& dst, UINT dstSubResourceIndex, const RECT& dstRect);
void resolveMsaaDepthBuffer(); void resolveMsaaDepthBuffer();
HRESULT shaderBlt(D3DDDIARG_BLT& data, Resource& dstResource, Resource& srcResource); HRESULT shaderBlt(D3DDDIARG_BLT& data, Resource& dstResource, Resource& srcResource);
bool shouldBltViaCpu(const D3DDDIARG_BLT &data, Resource& srcResource);
Device& m_device; Device& m_device;
HANDLE m_handle; HANDLE m_handle;