mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Force CpuOptimized flag on off-screen plain surfaces
This flag forces linear (non-swizzled) surface layout on Intel HD drivers. Fixes issues with games that keep writing to unlocked surfaces (e.g. Nox) as well as greatly increases lock performance.
This commit is contained in:
parent
32259119c3
commit
0edcde6d55
@ -101,21 +101,79 @@ std::ostream& operator<<(std::ostream& os, const D3DDDIBOX& box)
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
D3DDDI_DEVICEFUNCS& getOrigVtable(HANDLE device);
|
||||||
|
D3DDDI_RESOURCEFLAGS getResourceTypeFlags();
|
||||||
|
void modifyCreateResourceFlags(D3DDDI_RESOURCEFLAGS& flags);
|
||||||
|
|
||||||
|
const UINT g_resourceTypeFlags = getResourceTypeFlags().Value;
|
||||||
|
|
||||||
|
HRESULT APIENTRY createResource(HANDLE hDevice, D3DDDIARG_CREATERESOURCE* pResource)
|
||||||
|
{
|
||||||
|
modifyCreateResourceFlags(pResource->Flags);
|
||||||
|
return getOrigVtable(hDevice).pfnCreateResource(hDevice, pResource);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT APIENTRY createResource2(HANDLE hDevice, D3DDDIARG_CREATERESOURCE2* pResource2)
|
||||||
|
{
|
||||||
|
modifyCreateResourceFlags(pResource2->Flags);
|
||||||
|
return getOrigVtable(hDevice).pfnCreateResource2(hDevice, pResource2);
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT APIENTRY destroyDevice(HANDLE hDevice)
|
HRESULT APIENTRY destroyDevice(HANDLE hDevice)
|
||||||
{
|
{
|
||||||
HRESULT result = D3dDdi::DeviceFuncs::s_origVtables.at(hDevice).pfnDestroyDevice(hDevice);
|
HRESULT result = getOrigVtable(hDevice).pfnDestroyDevice(hDevice);
|
||||||
if (SUCCEEDED(result))
|
if (SUCCEEDED(result))
|
||||||
{
|
{
|
||||||
D3dDdi::DeviceFuncs::s_origVtables.erase(hDevice);
|
D3dDdi::DeviceFuncs::s_origVtables.erase(hDevice);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
D3DDDI_DEVICEFUNCS& getOrigVtable(HANDLE device)
|
||||||
|
{
|
||||||
|
return D3dDdi::DeviceFuncs::s_origVtables.at(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
D3DDDI_RESOURCEFLAGS getResourceTypeFlags()
|
||||||
|
{
|
||||||
|
D3DDDI_RESOURCEFLAGS flags = {};
|
||||||
|
flags.RenderTarget = 1;
|
||||||
|
flags.ZBuffer = 1;
|
||||||
|
flags.DMap = 1;
|
||||||
|
flags.Points = 1;
|
||||||
|
flags.RtPatches = 1;
|
||||||
|
flags.NPatches = 1;
|
||||||
|
flags.Video = 1;
|
||||||
|
flags.CaptureBuffer = 1;
|
||||||
|
flags.Primary = 1;
|
||||||
|
flags.Texture = 1;
|
||||||
|
flags.CubeMap = 1;
|
||||||
|
flags.VertexBuffer = 1;
|
||||||
|
flags.IndexBuffer = 1;
|
||||||
|
flags.DecodeRenderTarget = 1;
|
||||||
|
flags.DecodeCompressedBuffer = 1;
|
||||||
|
flags.VideoProcessRenderTarget = 1;
|
||||||
|
flags.Overlay = 1;
|
||||||
|
flags.TextApi = 1;
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void modifyCreateResourceFlags(D3DDDI_RESOURCEFLAGS& flags)
|
||||||
|
{
|
||||||
|
const bool isOffScreenPlain = 0 == (flags.Value & g_resourceTypeFlags);
|
||||||
|
if (isOffScreenPlain)
|
||||||
|
{
|
||||||
|
flags.CpuOptimized = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace D3dDdi
|
namespace D3dDdi
|
||||||
{
|
{
|
||||||
void DeviceFuncs::setCompatVtable(D3DDDI_DEVICEFUNCS& vtable)
|
void DeviceFuncs::setCompatVtable(D3DDDI_DEVICEFUNCS& vtable)
|
||||||
{
|
{
|
||||||
|
vtable.pfnCreateResource = &createResource;
|
||||||
|
vtable.pfnCreateResource2 = &createResource2;
|
||||||
vtable.pfnDestroyDevice = &destroyDevice;
|
vtable.pfnDestroyDevice = &destroyDevice;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user