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

Suppress flushes from execute buffers

Mitigates performance issues in Rowan's Mig Alley (issue #12).
This commit is contained in:
narzoul 2020-05-18 00:52:28 +02:00
parent 8f67fd158c
commit ca9404ec6f
13 changed files with 383 additions and 107 deletions

View File

@ -32,6 +32,8 @@
} \
}
#define LOG_CONST_CASE(constant) case constant: return os << #constant;
std::ostream& operator<<(std::ostream& os, std::nullptr_t);
std::ostream& operator<<(std::ostream& os, const char* str);
std::ostream& operator<<(std::ostream& os, const unsigned char* data);

View File

@ -29,34 +29,34 @@ namespace D3dDdi
{
}
HRESULT Device::blt(const D3DDDIARG_BLT& data)
HRESULT Device::blt(const D3DDDIARG_BLT* data)
{
auto it = m_resources.find(data.hDstResource);
auto it = m_resources.find(data->hDstResource);
if (it != m_resources.end())
{
return it->second.blt(data);
return it->second.blt(*data);
}
prepareForRendering(data.hSrcResource, data.SrcSubResourceIndex, true);
return m_origVtable.pfnBlt(m_device, &data);
prepareForRendering(data->hSrcResource, data->SrcSubResourceIndex, true);
return m_origVtable.pfnBlt(m_device, data);
}
HRESULT Device::clear(const D3DDDIARG_CLEAR& data, UINT numRect, const RECT* rect)
HRESULT Device::clear(const D3DDDIARG_CLEAR* data, UINT numRect, const RECT* rect)
{
if (data.Flags & D3DCLEAR_TARGET)
if (data->Flags & D3DCLEAR_TARGET)
{
prepareForRendering();
}
return m_origVtable.pfnClear(m_device, &data, numRect, rect);
return m_origVtable.pfnClear(m_device, data, numRect, rect);
}
HRESULT Device::colorFill(const D3DDDIARG_COLORFILL& data)
HRESULT Device::colorFill(const D3DDDIARG_COLORFILL* data)
{
auto it = m_resources.find(data.hResource);
auto it = m_resources.find(data->hResource);
if (it != m_resources.end())
{
return it->second.colorFill(data);
return it->second.colorFill(*data);
}
return m_origVtable.pfnColorFill(m_device, &data);
return m_origVtable.pfnColorFill(m_device, data);
}
template <typename Arg>
@ -74,14 +74,14 @@ namespace D3dDdi
}
}
HRESULT Device::createResource(D3DDDIARG_CREATERESOURCE& data)
HRESULT Device::createResource(D3DDDIARG_CREATERESOURCE* data)
{
return createResourceImpl(data);
return createResourceImpl(*data);
}
HRESULT Device::createResource2(D3DDDIARG_CREATERESOURCE2& data)
HRESULT Device::createResource2(D3DDDIARG_CREATERESOURCE2* data)
{
return createResourceImpl(data);
return createResourceImpl(*data);
}
HRESULT Device::destroyResource(HANDLE resource)
@ -124,111 +124,129 @@ namespace D3dDdi
return result;
}
HRESULT Device::drawIndexedPrimitive(const D3DDDIARG_DRAWINDEXEDPRIMITIVE& data)
HRESULT Device::drawIndexedPrimitive(const D3DDDIARG_DRAWINDEXEDPRIMITIVE* data)
{
prepareForRendering();
return m_origVtable.pfnDrawIndexedPrimitive(m_device, &data);
return m_origVtable.pfnDrawIndexedPrimitive(m_device, data);
}
HRESULT Device::drawIndexedPrimitive2(const D3DDDIARG_DRAWINDEXEDPRIMITIVE2& data,
HRESULT Device::drawIndexedPrimitive2(const D3DDDIARG_DRAWINDEXEDPRIMITIVE2* data,
UINT indicesSize, const void* indexBuffer, const UINT* flagBuffer)
{
prepareForRendering();
return m_origVtable.pfnDrawIndexedPrimitive2(m_device, &data, indicesSize, indexBuffer, flagBuffer);
return m_origVtable.pfnDrawIndexedPrimitive2(m_device, data, indicesSize, indexBuffer, flagBuffer);
}
HRESULT Device::drawPrimitive(const D3DDDIARG_DRAWPRIMITIVE& data, const UINT* flagBuffer)
HRESULT Device::drawPrimitive(const D3DDDIARG_DRAWPRIMITIVE* data, const UINT* flagBuffer)
{
if (m_streamSource && 0 != m_streamSourceData.Stride)
{
m_streamSource->fixVertexData(m_streamSourceData.Offset + data.VStart * m_streamSourceData.Stride,
data.PrimitiveCount, m_streamSourceData.Stride);
m_streamSource->fixVertexData(m_streamSourceData.Offset + data->VStart * m_streamSourceData.Stride,
data->PrimitiveCount, m_streamSourceData.Stride);
}
prepareForRendering();
return m_origVtable.pfnDrawPrimitive(m_device, &data, flagBuffer);
return m_origVtable.pfnDrawPrimitive(m_device, data, flagBuffer);
}
HRESULT Device::drawPrimitive2(const D3DDDIARG_DRAWPRIMITIVE2& data)
HRESULT Device::drawPrimitive2(const D3DDDIARG_DRAWPRIMITIVE2* data)
{
prepareForRendering();
return m_origVtable.pfnDrawPrimitive2(m_device, &data);
return m_origVtable.pfnDrawPrimitive2(m_device, data);
}
HRESULT Device::drawRectPatch(const D3DDDIARG_DRAWRECTPATCH& data, const D3DDDIRECTPATCH_INFO* info,
HRESULT Device::drawRectPatch(const D3DDDIARG_DRAWRECTPATCH* data, const D3DDDIRECTPATCH_INFO* info,
const FLOAT* patch)
{
prepareForRendering();
return m_origVtable.pfnDrawRectPatch(m_device, &data, info, patch);
return m_origVtable.pfnDrawRectPatch(m_device, data, info, patch);
}
HRESULT Device::drawTriPatch(const D3DDDIARG_DRAWTRIPATCH& data, const D3DDDITRIPATCH_INFO* info,
HRESULT Device::drawTriPatch(const D3DDDIARG_DRAWTRIPATCH* data, const D3DDDITRIPATCH_INFO* info,
const FLOAT* patch)
{
prepareForRendering();
return m_origVtable.pfnDrawTriPatch(m_device, &data, info, patch);
return m_origVtable.pfnDrawTriPatch(m_device, data, info, patch);
}
HRESULT Device::lock(D3DDDIARG_LOCK& data)
HRESULT Device::flush()
{
auto it = m_resources.find(data.hResource);
if (!s_isFlushEnabled)
{
return S_OK;
}
return m_origVtable.pfnFlush(m_device);
}
HRESULT Device::flush1(UINT FlushFlags)
{
if (!s_isFlushEnabled && 0 == FlushFlags)
{
return S_OK;
}
return m_origVtable.pfnFlush1(m_device, FlushFlags);
}
HRESULT Device::lock(D3DDDIARG_LOCK* data)
{
auto it = m_resources.find(data->hResource);
if (it != m_resources.end())
{
return it->second.lock(data);
return it->second.lock(*data);
}
return m_origVtable.pfnLock(m_device, &data);
return m_origVtable.pfnLock(m_device, data);
}
HRESULT Device::openResource(D3DDDIARG_OPENRESOURCE& data)
HRESULT Device::openResource(D3DDDIARG_OPENRESOURCE* data)
{
HRESULT result = m_origVtable.pfnOpenResource(m_device, &data);
if (SUCCEEDED(result) && data.Flags.Fullscreen)
HRESULT result = m_origVtable.pfnOpenResource(m_device, data);
if (SUCCEEDED(result) && data->Flags.Fullscreen)
{
m_sharedPrimary = data.hResource;
m_sharedPrimary = data->hResource;
}
return result;
}
HRESULT Device::present(const D3DDDIARG_PRESENT& data)
HRESULT Device::present(const D3DDDIARG_PRESENT* data)
{
prepareForRendering(data.hSrcResource, data.SrcSubResourceIndex, true);
return m_origVtable.pfnPresent(m_device, &data);
prepareForRendering(data->hSrcResource, data->SrcSubResourceIndex, true);
return m_origVtable.pfnPresent(m_device, data);
}
HRESULT Device::present1(D3DDDIARG_PRESENT1& data)
HRESULT Device::present1(D3DDDIARG_PRESENT1* data)
{
for (UINT i = 0; i < data.SrcResources; ++i)
for (UINT i = 0; i < data->SrcResources; ++i)
{
prepareForRendering(data.phSrcResources[i].hResource, data.phSrcResources[i].SubResourceIndex, true);
prepareForRendering(data->phSrcResources[i].hResource, data->phSrcResources[i].SubResourceIndex, true);
}
return m_origVtable.pfnPresent1(m_device, &data);
return m_origVtable.pfnPresent1(m_device, data);
}
HRESULT Device::setRenderTarget(const D3DDDIARG_SETRENDERTARGET& data)
HRESULT Device::setRenderTarget(const D3DDDIARG_SETRENDERTARGET* data)
{
HRESULT result = m_origVtable.pfnSetRenderTarget(m_device, &data);
if (SUCCEEDED(result) && 0 == data.RenderTargetIndex)
HRESULT result = m_origVtable.pfnSetRenderTarget(m_device, data);
if (SUCCEEDED(result) && 0 == data->RenderTargetIndex)
{
m_renderTarget = getResource(data.hRenderTarget);
m_renderTargetSubResourceIndex = data.SubResourceIndex;
m_renderTarget = getResource(data->hRenderTarget);
m_renderTargetSubResourceIndex = data->SubResourceIndex;
}
return result;
}
HRESULT Device::setStreamSource(const D3DDDIARG_SETSTREAMSOURCE& data)
HRESULT Device::setStreamSource(const D3DDDIARG_SETSTREAMSOURCE* data)
{
HRESULT result = m_origVtable.pfnSetStreamSource(m_device, &data);
if (SUCCEEDED(result) && 0 == data.Stream)
HRESULT result = m_origVtable.pfnSetStreamSource(m_device, data);
if (SUCCEEDED(result) && 0 == data->Stream)
{
m_streamSourceData = data;
m_streamSource = getResource(data.hVertexBuffer);
m_streamSourceData = *data;
m_streamSource = getResource(data->hVertexBuffer);
}
return result;
}
HRESULT Device::setStreamSourceUm(const D3DDDIARG_SETSTREAMSOURCEUM& data, const void* umBuffer)
HRESULT Device::setStreamSourceUm(const D3DDDIARG_SETSTREAMSOURCEUM* data, const void* umBuffer)
{
HRESULT result = m_origVtable.pfnSetStreamSourceUm(m_device, &data, umBuffer);
if (SUCCEEDED(result) && 0 == data.Stream)
HRESULT result = m_origVtable.pfnSetStreamSourceUm(m_device, data, umBuffer);
if (SUCCEEDED(result) && 0 == data->Stream)
{
m_streamSourceData = {};
m_streamSource = nullptr;
@ -236,26 +254,26 @@ namespace D3dDdi
return result;
}
HRESULT Device::unlock(const D3DDDIARG_UNLOCK& data)
HRESULT Device::unlock(const D3DDDIARG_UNLOCK* data)
{
auto it = m_resources.find(data.hResource);
auto it = m_resources.find(data->hResource);
if (it != m_resources.end())
{
return it->second.unlock(data);
return it->second.unlock(*data);
}
return m_origVtable.pfnUnlock(m_device, &data);
return m_origVtable.pfnUnlock(m_device, data);
}
HRESULT Device::updateWInfo(const D3DDDIARG_WINFO& data)
HRESULT Device::updateWInfo(const D3DDDIARG_WINFO* data)
{
if (1.0f == data.WNear && 1.0f == data.WFar)
if (1.0f == data->WNear && 1.0f == data->WFar)
{
D3DDDIARG_WINFO wInfo = {};
wInfo.WNear = 0.0f;
wInfo.WFar = 1.0f;
return m_origVtable.pfnUpdateWInfo(m_device, &wInfo);
}
return m_origVtable.pfnUpdateWInfo(m_device, &data);
return m_origVtable.pfnUpdateWInfo(m_device, data);
}
Resource* Device::getGdiResource()
@ -307,6 +325,11 @@ namespace D3dDdi
return it != m_resources.end() ? &it->second : nullptr;
}
void Device::enableFlush(bool enable)
{
s_isFlushEnabled = enable;
}
Resource* Device::findResource(HANDLE resource)
{
for (auto& device : s_devices)
@ -322,6 +345,7 @@ namespace D3dDdi
void Device::setGdiResourceHandle(HANDLE resource)
{
ScopedCriticalSection lock;
if ((!resource && !g_gdiResource) ||
(g_gdiResource && resource == *g_gdiResource))
{
@ -348,4 +372,5 @@ namespace D3dDdi
}
std::map<HANDLE, Device> Device::s_devices;
bool Device::s_isFlushEnabled = true;
}

View File

@ -17,30 +17,32 @@ namespace D3dDdi
public:
operator HANDLE() const { return m_device; }
HRESULT blt(const D3DDDIARG_BLT& data);
HRESULT clear(const D3DDDIARG_CLEAR& data, UINT numRect, const RECT* rect);
HRESULT colorFill(const D3DDDIARG_COLORFILL& data);
HRESULT createResource(D3DDDIARG_CREATERESOURCE& data);
HRESULT createResource2(D3DDDIARG_CREATERESOURCE2& data);
HRESULT blt(const D3DDDIARG_BLT* data);
HRESULT clear(const D3DDDIARG_CLEAR* data, UINT numRect, const RECT* rect);
HRESULT colorFill(const D3DDDIARG_COLORFILL* data);
HRESULT createResource(D3DDDIARG_CREATERESOURCE* data);
HRESULT createResource2(D3DDDIARG_CREATERESOURCE2* data);
HRESULT destroyResource(HANDLE resource);
HRESULT drawIndexedPrimitive(const D3DDDIARG_DRAWINDEXEDPRIMITIVE& data);
HRESULT drawIndexedPrimitive2(const D3DDDIARG_DRAWINDEXEDPRIMITIVE2& data,
HRESULT drawIndexedPrimitive(const D3DDDIARG_DRAWINDEXEDPRIMITIVE* data);
HRESULT drawIndexedPrimitive2(const D3DDDIARG_DRAWINDEXEDPRIMITIVE2* data,
UINT indicesSize, const void* indexBuffer, const UINT* flagBuffer);
HRESULT drawPrimitive(const D3DDDIARG_DRAWPRIMITIVE& data, const UINT* flagBuffer);
HRESULT drawPrimitive2(const D3DDDIARG_DRAWPRIMITIVE2& data);
HRESULT drawRectPatch(const D3DDDIARG_DRAWRECTPATCH& data, const D3DDDIRECTPATCH_INFO* info,
HRESULT drawPrimitive(const D3DDDIARG_DRAWPRIMITIVE* data, const UINT* flagBuffer);
HRESULT drawPrimitive2(const D3DDDIARG_DRAWPRIMITIVE2* data);
HRESULT drawRectPatch(const D3DDDIARG_DRAWRECTPATCH* data, const D3DDDIRECTPATCH_INFO* info,
const FLOAT* patch);
HRESULT drawTriPatch(const D3DDDIARG_DRAWTRIPATCH& data, const D3DDDITRIPATCH_INFO* info,
HRESULT drawTriPatch(const D3DDDIARG_DRAWTRIPATCH* data, const D3DDDITRIPATCH_INFO* info,
const FLOAT* patch);
HRESULT lock(D3DDDIARG_LOCK& data);
HRESULT openResource(D3DDDIARG_OPENRESOURCE& data);
HRESULT present(const D3DDDIARG_PRESENT& data);
HRESULT present1(D3DDDIARG_PRESENT1& data);
HRESULT setRenderTarget(const D3DDDIARG_SETRENDERTARGET& data);
HRESULT setStreamSource(const D3DDDIARG_SETSTREAMSOURCE& data);
HRESULT setStreamSourceUm(const D3DDDIARG_SETSTREAMSOURCEUM& data, const void* umBuffer);
HRESULT unlock(const D3DDDIARG_UNLOCK& data);
HRESULT updateWInfo(const D3DDDIARG_WINFO& data);
HRESULT flush();
HRESULT flush1(UINT FlushFlags);
HRESULT lock(D3DDDIARG_LOCK* data);
HRESULT openResource(D3DDDIARG_OPENRESOURCE* data);
HRESULT present(const D3DDDIARG_PRESENT* data);
HRESULT present1(D3DDDIARG_PRESENT1* data);
HRESULT setRenderTarget(const D3DDDIARG_SETRENDERTARGET* data);
HRESULT setStreamSource(const D3DDDIARG_SETSTREAMSOURCE* data);
HRESULT setStreamSourceUm(const D3DDDIARG_SETSTREAMSOURCEUM* data, const void* umBuffer);
HRESULT unlock(const D3DDDIARG_UNLOCK* data);
HRESULT updateWInfo(const D3DDDIARG_WINFO* data);
Adapter& getAdapter() const { return m_adapter; }
const D3DDDI_DEVICEFUNCS& getOrigVtable() const { return m_origVtable; }
@ -53,6 +55,7 @@ namespace D3dDdi
static Device& get(HANDLE device);
static void remove(HANDLE device);
static void enableFlush(bool enable);
static Resource* findResource(HANDLE resource);
static Resource* getGdiResource();
static void setGdiResourceHandle(HANDLE resource);
@ -75,5 +78,6 @@ namespace D3dDdi
Resource* m_streamSource;
static std::map<HANDLE, Device> s_devices;
static bool s_isFlushEnabled;
};
}

View File

@ -3,10 +3,10 @@
namespace
{
template <typename DeviceMethodPtr, DeviceMethodPtr deviceMethod, typename Arg, typename... Params>
HRESULT WINAPI deviceFunc(HANDLE device, Arg* data, Params... params)
template <typename DeviceMethodPtr, DeviceMethodPtr deviceMethod, typename... Params>
HRESULT WINAPI deviceFunc(HANDLE device, Params... params)
{
return (D3dDdi::Device::get(device).*deviceMethod)(*data, params...);
return (D3dDdi::Device::get(device).*deviceMethod)(params...);
}
HRESULT APIENTRY destroyDevice(HANDLE hDevice)
@ -18,11 +18,6 @@ namespace
}
return result;
}
HRESULT APIENTRY destroyResource(HANDLE hDevice, HANDLE hResource)
{
return D3dDdi::Device::get(hDevice).destroyResource(hResource);
}
}
#define DEVICE_FUNC(func) deviceFunc<decltype(&Device::func), &Device::func>
@ -42,13 +37,15 @@ namespace D3dDdi
vtable.pfnCreateResource = &DEVICE_FUNC(createResource);
vtable.pfnCreateResource2 = &DEVICE_FUNC(createResource2);
vtable.pfnDestroyDevice = &destroyDevice;
vtable.pfnDestroyResource = &destroyResource;
vtable.pfnDestroyResource = &DEVICE_FUNC(destroyResource);
vtable.pfnDrawIndexedPrimitive = &DEVICE_FUNC(drawIndexedPrimitive);
vtable.pfnDrawIndexedPrimitive2 = &DEVICE_FUNC(drawIndexedPrimitive2);
vtable.pfnDrawPrimitive = &DEVICE_FUNC(drawPrimitive);
vtable.pfnDrawPrimitive2 = &DEVICE_FUNC(drawPrimitive2);
vtable.pfnDrawRectPatch = &DEVICE_FUNC(drawRectPatch);
vtable.pfnDrawTriPatch = &DEVICE_FUNC(drawTriPatch);
vtable.pfnFlush = &DEVICE_FUNC(flush);
vtable.pfnFlush1 = &DEVICE_FUNC(flush1);
vtable.pfnLock = &DEVICE_FUNC(lock);
vtable.pfnOpenResource = &DEVICE_FUNC(openResource);
vtable.pfnPresent = &DEVICE_FUNC(present);

View File

@ -5,6 +5,8 @@
#include <d3d.h>
#include <d3dumddi.h>
#include <D3dDdi/Log/CommonLog.h>
std::ostream& operator<<(std::ostream& os, const D3DDDI_ALLOCATIONLIST& data);
std::ostream& operator<<(std::ostream& os, const D3DDDI_PATCHLOCATIONLIST& data);
std::ostream& operator<<(std::ostream& os, const D3DDDIARG_CREATEDEVICE& data);

View File

@ -7,6 +7,8 @@
#include <winternl.h>
#include <../km/d3dkmthk.h>
#include <D3dDdi/Log/CommonLog.h>
std::ostream& operator<<(std::ostream& os, const D3DDDI_ALLOCATIONINFO& data);
std::ostream& operator<<(std::ostream& os, const D3DDDICB_ALLOCATE& data);
std::ostream& operator<<(std::ostream& os, const D3DDDICB_DEALLOCATE& data);

View File

@ -1,11 +1,18 @@
#include "Common/Log.h"
#include "D3dDdi/Log/DeviceFuncsLog.h"
#include <Common/Log.h>
#include <D3dDdi/Log/DeviceFuncsLog.h>
std::ostream& operator<<(std::ostream& os, const D3DDDI_RATIONAL& val)
std::ostream& operator<<(std::ostream& os, D3DDDI_POOL val)
{
return Compat::LogStruct(os)
<< val.Numerator
<< val.Denominator;
switch (val)
{
LOG_CONST_CASE(D3DDDIPOOL_SYSTEMMEM);
LOG_CONST_CASE(D3DDDIPOOL_VIDEOMEMORY);
LOG_CONST_CASE(D3DDDIPOOL_LOCALVIDMEM);
LOG_CONST_CASE(D3DDDIPOOL_NONLOCALVIDMEM);
LOG_CONST_CASE(D3DDDIPOOL_STAGINGMEM);
}
return os << "D3DDDIPOOL_" << static_cast<DWORD>(val);
}
std::ostream& operator<<(std::ostream& os, const D3DDDI_SURFACEINFO& val)
@ -254,3 +261,202 @@ std::ostream& operator<<(std::ostream& os, const D3DDDIBOX& box)
<< box.Front
<< box.Back;
}
std::ostream& operator<<(std::ostream& os, D3DDDIRENDERSTATETYPE val)
{
switch (val)
{
LOG_CONST_CASE(D3DDDIRS_ZENABLE);
LOG_CONST_CASE(D3DDDIRS_FILLMODE);
LOG_CONST_CASE(D3DDDIRS_SHADEMODE);
LOG_CONST_CASE(D3DDDIRS_LINEPATTERN);
LOG_CONST_CASE(D3DDDIRS_ZWRITEENABLE);
LOG_CONST_CASE(D3DDDIRS_ALPHATESTENABLE);
LOG_CONST_CASE(D3DDDIRS_LASTPIXEL);
LOG_CONST_CASE(D3DDDIRS_SRCBLEND);
LOG_CONST_CASE(D3DDDIRS_DESTBLEND);
LOG_CONST_CASE(D3DDDIRS_CULLMODE);
LOG_CONST_CASE(D3DDDIRS_ZFUNC);
LOG_CONST_CASE(D3DDDIRS_ALPHAREF);
LOG_CONST_CASE(D3DDDIRS_ALPHAFUNC);
LOG_CONST_CASE(D3DDDIRS_DITHERENABLE);
LOG_CONST_CASE(D3DDDIRS_ALPHABLENDENABLE);
LOG_CONST_CASE(D3DDDIRS_FOGENABLE);
LOG_CONST_CASE(D3DDDIRS_SPECULARENABLE);
LOG_CONST_CASE(D3DDDIRS_ZVISIBLE);
LOG_CONST_CASE(D3DDDIRS_FOGCOLOR);
LOG_CONST_CASE(D3DDDIRS_FOGTABLEMODE);
LOG_CONST_CASE(D3DDDIRS_FOGSTART);
LOG_CONST_CASE(D3DDDIRS_FOGEND);
LOG_CONST_CASE(D3DDDIRS_FOGDENSITY);
LOG_CONST_CASE(D3DDDIRS_EDGEANTIALIAS);
LOG_CONST_CASE(D3DDDIRS_COLORKEYENABLE);
LOG_CONST_CASE(D3DDDIRS_OLDALPHABLENDENABLE);
LOG_CONST_CASE(D3DDDIRS_ZBIAS);
LOG_CONST_CASE(D3DDDIRS_RANGEFOGENABLE);
LOG_CONST_CASE(D3DDDIRS_TRANSLUCENTSORTINDEPENDENT);
LOG_CONST_CASE(D3DDDIRS_STENCILENABLE);
LOG_CONST_CASE(D3DDDIRS_STENCILFAIL);
LOG_CONST_CASE(D3DDDIRS_STENCILZFAIL);
LOG_CONST_CASE(D3DDDIRS_STENCILPASS);
LOG_CONST_CASE(D3DDDIRS_STENCILFUNC);
LOG_CONST_CASE(D3DDDIRS_STENCILREF);
LOG_CONST_CASE(D3DDDIRS_STENCILMASK);
LOG_CONST_CASE(D3DDDIRS_STENCILWRITEMASK);
LOG_CONST_CASE(D3DDDIRS_TEXTUREFACTOR);
LOG_CONST_CASE(D3DDDIRS_SCENECAPTURE);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN00);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN01);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN02);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN03);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN04);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN05);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN06);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN07);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN08);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN09);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN10);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN11);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN12);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN13);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN14);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN15);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN16);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN17);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN18);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN19);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN20);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN21);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN22);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN23);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN24);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN25);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN26);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN27);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN28);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN29);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN30);
LOG_CONST_CASE(D3DDDIRS_STIPPLEPATTERN31);
LOG_CONST_CASE(D3DDDIRS_WRAP0);
LOG_CONST_CASE(D3DDDIRS_WRAP1);
LOG_CONST_CASE(D3DDDIRS_WRAP2);
LOG_CONST_CASE(D3DDDIRS_WRAP3);
LOG_CONST_CASE(D3DDDIRS_WRAP4);
LOG_CONST_CASE(D3DDDIRS_WRAP5);
LOG_CONST_CASE(D3DDDIRS_WRAP6);
LOG_CONST_CASE(D3DDDIRS_WRAP7);
LOG_CONST_CASE(D3DDDIRS_CLIPPING);
LOG_CONST_CASE(D3DDDIRS_LIGHTING);
LOG_CONST_CASE(D3DDDIRS_AMBIENT);
LOG_CONST_CASE(D3DDDIRS_FOGVERTEXMODE);
LOG_CONST_CASE(D3DDDIRS_COLORVERTEX);
LOG_CONST_CASE(D3DDDIRS_LOCALVIEWER);
LOG_CONST_CASE(D3DDDIRS_NORMALIZENORMALS);
LOG_CONST_CASE(D3DDDIRS_COLORKEYBLENDENABLE);
LOG_CONST_CASE(D3DDDIRS_DIFFUSEMATERIALSOURCE);
LOG_CONST_CASE(D3DDDIRS_SPECULARMATERIALSOURCE);
LOG_CONST_CASE(D3DDDIRS_AMBIENTMATERIALSOURCE);
LOG_CONST_CASE(D3DDDIRS_EMISSIVEMATERIALSOURCE);
LOG_CONST_CASE(D3DDDIRS_VERTEXBLEND);
LOG_CONST_CASE(D3DDDIRS_CLIPPLANEENABLE);
LOG_CONST_CASE(D3DDDIRS_SOFTWAREVERTEXPROCESSING);
LOG_CONST_CASE(D3DDDIRS_POINTSIZE);
LOG_CONST_CASE(D3DDDIRS_POINTSIZE_MIN);
LOG_CONST_CASE(D3DDDIRS_POINTSPRITEENABLE);
LOG_CONST_CASE(D3DDDIRS_POINTSCALEENABLE);
LOG_CONST_CASE(D3DDDIRS_POINTSCALE_A);
LOG_CONST_CASE(D3DDDIRS_POINTSCALE_B);
LOG_CONST_CASE(D3DDDIRS_POINTSCALE_C);
LOG_CONST_CASE(D3DDDIRS_MULTISAMPLEANTIALIAS);
LOG_CONST_CASE(D3DDDIRS_MULTISAMPLEMASK);
LOG_CONST_CASE(D3DDDIRS_PATCHEDGESTYLE);
LOG_CONST_CASE(D3DDDIRS_PATCHSEGMENTS);
LOG_CONST_CASE(D3DDDIRS_DEBUGMONITORTOKEN);
LOG_CONST_CASE(D3DDDIRS_POINTSIZE_MAX);
LOG_CONST_CASE(D3DDDIRS_INDEXEDVERTEXBLENDENABLE);
LOG_CONST_CASE(D3DDDIRS_COLORWRITEENABLE);
LOG_CONST_CASE(D3DDDIRS_DELETERTPATCH);
LOG_CONST_CASE(D3DDDIRS_TWEENFACTOR);
LOG_CONST_CASE(D3DDDIRS_BLENDOP);
LOG_CONST_CASE(D3DDDIRS_POSITIONDEGREE);
LOG_CONST_CASE(D3DDDIRS_NORMALDEGREE);
LOG_CONST_CASE(D3DDDIRS_SCISSORTESTENABLE);
LOG_CONST_CASE(D3DDDIRS_SLOPESCALEDEPTHBIAS);
LOG_CONST_CASE(D3DDDIRS_ANTIALIASEDLINEENABLE);
LOG_CONST_CASE(D3DDDIRS_MINTESSELLATIONLEVEL);
LOG_CONST_CASE(D3DDDIRS_MAXTESSELLATIONLEVEL);
LOG_CONST_CASE(D3DDDIRS_ADAPTIVETESS_X);
LOG_CONST_CASE(D3DDDIRS_ADAPTIVETESS_Y);
LOG_CONST_CASE(D3DDDIRS_ADAPTIVETESS_Z);
LOG_CONST_CASE(D3DDDIRS_ADAPTIVETESS_W);
LOG_CONST_CASE(D3DDDIRS_ENABLEADAPTIVETESSELLATION);
LOG_CONST_CASE(D3DDDIRS_TWOSIDEDSTENCILMODE);
LOG_CONST_CASE(D3DDDIRS_CCW_STENCILFAIL);
LOG_CONST_CASE(D3DDDIRS_CCW_STENCILZFAIL);
LOG_CONST_CASE(D3DDDIRS_CCW_STENCILPASS);
LOG_CONST_CASE(D3DDDIRS_CCW_STENCILFUNC);
LOG_CONST_CASE(D3DDDIRS_COLORWRITEENABLE1);
LOG_CONST_CASE(D3DDDIRS_COLORWRITEENABLE2);
LOG_CONST_CASE(D3DDDIRS_COLORWRITEENABLE3);
LOG_CONST_CASE(D3DDDIRS_BLENDFACTOR);
LOG_CONST_CASE(D3DDDIRS_SRGBWRITEENABLE);
LOG_CONST_CASE(D3DDDIRS_DEPTHBIAS);
LOG_CONST_CASE(D3DDDIRS_WRAP8);
LOG_CONST_CASE(D3DDDIRS_WRAP9);
LOG_CONST_CASE(D3DDDIRS_WRAP10);
LOG_CONST_CASE(D3DDDIRS_WRAP11);
LOG_CONST_CASE(D3DDDIRS_WRAP12);
LOG_CONST_CASE(D3DDDIRS_WRAP13);
LOG_CONST_CASE(D3DDDIRS_WRAP14);
LOG_CONST_CASE(D3DDDIRS_WRAP15);
LOG_CONST_CASE(D3DDDIRS_SEPARATEALPHABLENDENABLE);
LOG_CONST_CASE(D3DDDIRS_SRCBLENDALPHA);
LOG_CONST_CASE(D3DDDIRS_DESTBLENDALPHA);
LOG_CONST_CASE(D3DDDIRS_BLENDOPALPHA);
}
return os << "D3DDDIRS_" << static_cast<DWORD>(val);
}
std::ostream& operator<<(std::ostream& os, D3DDDITEXTURESTAGESTATETYPE val)
{
switch (val)
{
LOG_CONST_CASE(D3DDDITSS_TEXTUREMAP);
LOG_CONST_CASE(D3DDDITSS_COLOROP);
LOG_CONST_CASE(D3DDDITSS_COLORARG1);
LOG_CONST_CASE(D3DDDITSS_COLORARG2);
LOG_CONST_CASE(D3DDDITSS_ALPHAOP);
LOG_CONST_CASE(D3DDDITSS_ALPHAARG1);
LOG_CONST_CASE(D3DDDITSS_ALPHAARG2);
LOG_CONST_CASE(D3DDDITSS_BUMPENVMAT00);
LOG_CONST_CASE(D3DDDITSS_BUMPENVMAT01);
LOG_CONST_CASE(D3DDDITSS_BUMPENVMAT10);
LOG_CONST_CASE(D3DDDITSS_BUMPENVMAT11);
LOG_CONST_CASE(D3DDDITSS_TEXCOORDINDEX);
LOG_CONST_CASE(D3DDDITSS_ADDRESSU);
LOG_CONST_CASE(D3DDDITSS_ADDRESSV);
LOG_CONST_CASE(D3DDDITSS_BORDERCOLOR);
LOG_CONST_CASE(D3DDDITSS_MAGFILTER);
LOG_CONST_CASE(D3DDDITSS_MINFILTER);
LOG_CONST_CASE(D3DDDITSS_MIPFILTER);
LOG_CONST_CASE(D3DDDITSS_MIPMAPLODBIAS);
LOG_CONST_CASE(D3DDDITSS_MAXMIPLEVEL);
LOG_CONST_CASE(D3DDDITSS_MAXANISOTROPY);
LOG_CONST_CASE(D3DDDITSS_BUMPENVLSCALE);
LOG_CONST_CASE(D3DDDITSS_BUMPENVLOFFSET);
LOG_CONST_CASE(D3DDDITSS_TEXTURETRANSFORMFLAGS);
LOG_CONST_CASE(D3DDDITSS_ADDRESSW);
LOG_CONST_CASE(D3DDDITSS_COLORARG0);
LOG_CONST_CASE(D3DDDITSS_ALPHAARG0);
LOG_CONST_CASE(D3DDDITSS_RESULTARG);
LOG_CONST_CASE(D3DDDITSS_SRGBTEXTURE);
LOG_CONST_CASE(D3DDDITSS_ELEMENTINDEX);
LOG_CONST_CASE(D3DDDITSS_DMAPOFFSET);
LOG_CONST_CASE(D3DDDITSS_CONSTANT);
LOG_CONST_CASE(D3DDDITSS_DISABLETEXTURECOLORKEY);
LOG_CONST_CASE(D3DDDITSS_TEXTURECOLORKEYVAL);
}
return os << "D3DDDITSS_" << static_cast<DWORD>(val);
}

View File

@ -5,7 +5,9 @@
#include <d3d.h>
#include <d3dumddi.h>
std::ostream& operator<<(std::ostream& os, const D3DDDI_RATIONAL& val);
#include <D3dDdi/Log/CommonLog.h>
std::ostream& operator<<(std::ostream& os, D3DDDI_POOL val);
std::ostream& operator<<(std::ostream& os, const D3DDDI_SURFACEINFO& val);
std::ostream& operator<<(std::ostream& os, const D3DDDIARG_BLT& val);
std::ostream& operator<<(std::ostream& os, const D3DDDIARG_CLEAR& val);
@ -30,3 +32,5 @@ std::ostream& operator<<(std::ostream& os, const D3DDDIARG_UNLOCK& val);
std::ostream& operator<<(std::ostream& os, const D3DDDIARG_WINFO& val);
std::ostream& operator<<(std::ostream& os, const D3DDDIARG_ZRANGE& val);
std::ostream& operator<<(std::ostream& os, const D3DDDIBOX& val);
std::ostream& operator<<(std::ostream& os, D3DDDIRENDERSTATETYPE val);
std::ostream& operator<<(std::ostream& os, D3DDDITEXTURESTAGESTATETYPE val);

View File

@ -7,6 +7,8 @@
#include <winternl.h>
#include <../km/d3dkmthk.h>
#include <D3dDdi/Log/CommonLog.h>
std::ostream& operator<<(std::ostream& os, const LUID& luid);
std::ostream& operator<<(std::ostream& os, const D3DKMT_CREATECONTEXT& data);
std::ostream& operator<<(std::ostream& os, const D3DKMT_CREATECONTEXTVIRTUAL& data);

View File

@ -158,6 +158,7 @@
<ClInclude Include="D3dDdi\Hooks.h" />
<ClInclude Include="D3dDdi\KernelModeThunks.h" />
<ClInclude Include="D3dDdi\Log\AdapterFuncsLog.h" />
<ClInclude Include="D3dDdi\Log\CommonLog.h" />
<ClInclude Include="D3dDdi\Log\DeviceCallbacksLog.h" />
<ClInclude Include="D3dDdi\Log\DeviceFuncsLog.h" />
<ClInclude Include="D3dDdi\Log\KernelModeThunksLog.h" />
@ -246,6 +247,7 @@
<ClCompile Include="D3dDdi\Hooks.cpp" />
<ClCompile Include="D3dDdi\KernelModeThunks.cpp" />
<ClCompile Include="D3dDdi\Log\AdapterFuncsLog.cpp" />
<ClCompile Include="D3dDdi\Log\CommonLog.cpp" />
<ClCompile Include="D3dDdi\Log\DeviceCallbacksLog.cpp" />
<ClCompile Include="D3dDdi\Log\DeviceFuncsLog.cpp" />
<ClCompile Include="D3dDdi\Log\KernelModeThunksLog.cpp" />

View File

@ -384,6 +384,9 @@
<ClInclude Include="Dll\Dll.h">
<Filter>Header Files\Dll</Filter>
</ClInclude>
<ClInclude Include="D3dDdi\Log\CommonLog.h">
<Filter>Header Files\D3dDdi\Log</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Gdi\Gdi.cpp">
@ -587,5 +590,8 @@
<ClCompile Include="Dll\Dll.cpp">
<Filter>Source Files\Dll</Filter>
</ClCompile>
<ClCompile Include="D3dDdi\Log\CommonLog.cpp">
<Filter>Source Files\D3dDdi\Log</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -1,11 +1,23 @@
#include "Common/CompatPtr.h"
#include "Common/CompatRef.h"
#include "Direct3d/DepthBuffer.h"
#include "Direct3d/Direct3dDevice.h"
#include "Direct3d/Types.h"
#include <Common/CompatPtr.h>
#include <Common/CompatRef.h>
#include <D3dDdi/Device.h>
#include <Direct3d/DepthBuffer.h>
#include <Direct3d/Direct3dDevice.h>
#include <Direct3d/Types.h>
namespace
{
HRESULT STDMETHODCALLTYPE execute(IDirect3DDevice* This,
LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer, LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags)
{
D3dDdi::ScopedCriticalSection lock;
D3dDdi::Device::enableFlush(false);
HRESULT result = CompatVtable<IDirect3DDeviceVtbl>::s_origVtable.Execute(
This, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags);
D3dDdi::Device::enableFlush(true);
return result;
}
template <typename TDirect3dDevice, typename TD3dDeviceDesc>
void fixSupportedZBufferBitDepths(CompatRef<TDirect3dDevice> d3dDevice, TD3dDeviceDesc& desc)
{
@ -33,6 +45,16 @@ namespace
}
return result;
}
void setCompatVtable(IDirect3DDeviceVtbl& vtable)
{
vtable.Execute = &execute;
}
template <typename TDirect3dDeviceVtbl>
void setCompatVtable(TDirect3dDeviceVtbl& /*vtable*/)
{
}
}
namespace Direct3d
@ -40,6 +62,7 @@ namespace Direct3d
template <typename TDirect3dDevice>
void Direct3dDevice<TDirect3dDevice>::setCompatVtable(Vtable<TDirect3dDevice>& vtable)
{
::setCompatVtable(vtable);
vtable.GetCaps = &getCaps;
}

View File

@ -185,6 +185,8 @@ namespace Gdi
return nullptr;
}
RECT virtualScreenBounds = Gdi::VirtualScreen::getBounds();
D3dDdi::ScopedCriticalSection driverLock;
Compat::ScopedCriticalSection lock(g_cs);
auto it = g_origDcToCompatDc.find(origDc);
@ -210,7 +212,6 @@ namespace Gdi
POINT origin = {};
GetDCOrgEx(origDc, &origin);
RECT virtualScreenBounds = Gdi::VirtualScreen::getBounds();
if (wnd && GetDesktopWindow() != wnd)
{
origin.x -= virtualScreenBounds.left;