Files
gMod/header/D3D9DeviceWrapper.h
GWToolbox Bot 2b2a817c15 Wrap D3D9 COM objects instead of MinHook-patching the cold path
CreateDevice(Ex)/CreateTexture/CreateVolumeTexture/CreateCubeTexture/
UpdateTexture/BeginScene/SetTexture/GetTexture/Release are now intercepted
via ordinary compiled virtual dispatch on wrapper objects returned from
Direct3DCreate9(Ex), instead of MinHook patching the real object's vtable
slots. Nothing is ever patched in this path, so it sidesteps every
self-modifying-code/JIT-cache concern the ARM64 emulator (Windows-on-ARM's
xtajit, or Wine on FEX-Emu/box64) has with inline code patching.

The late-attach path (SetDevice/RegisterExistingDevice/D3D9Hooks.cpp) is
unchanged: wrapping only works when gMod controls object creation from the
start, so late-attach still needs MinHook and remains gated off under ARM64
emulation.
2026-07-07 10:17:08 +00:00

306 lines
26 KiB
C++

#pragma once
#include <d3d9.h>
#include <atomic>
class TextureClient;
// Wraps a real IDirect3DDevice9 so CreateTexture/CreateVolumeTexture/CreateCubeTexture/
// UpdateTexture/BeginScene/SetTexture/GetTexture/Release are intercepted via ordinary
// compiled virtual dispatch instead of a MinHook-patched vtable slot (unstable under
// ARM64 emulation). Every other method is a pure forward to the real device.
class WrappedDirect3DDevice9 : public IDirect3DDevice9 {
public:
explicit WrappedDirect3DDevice9(IDirect3DDevice9* real);
IDirect3DDevice9* RealDevice() const { return real_; }
TextureClient* Client() const { return client_; }
void SetClient(TextureClient* client) { client_ = client; }
STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj) override;
STDMETHOD_(ULONG, AddRef)() override;
STDMETHOD_(ULONG, Release)() override;
STDMETHOD(TestCooperativeLevel)() override;
STDMETHOD_(UINT, GetAvailableTextureMem)() override;
STDMETHOD(EvictManagedResources)() override;
STDMETHOD(GetDirect3D)(IDirect3D9** ppD3D9) override;
STDMETHOD(GetDeviceCaps)(D3DCAPS9* pCaps) override;
STDMETHOD(GetDisplayMode)(UINT iSwapChain, D3DDISPLAYMODE* pMode) override;
STDMETHOD(GetCreationParameters)(D3DDEVICE_CREATION_PARAMETERS* pParameters) override;
STDMETHOD(SetCursorProperties)(UINT XHotSpot, UINT YHotSpot, IDirect3DSurface9* pCursorBitmap) override;
STDMETHOD_(void, SetCursorPosition)(int X, int Y, DWORD Flags) override;
STDMETHOD_(BOOL, ShowCursor)(BOOL bShow) override;
STDMETHOD(CreateAdditionalSwapChain)(D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain9** pSwapChain) override;
STDMETHOD(GetSwapChain)(UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) override;
STDMETHOD_(UINT, GetNumberOfSwapChains)() override;
STDMETHOD(Reset)(D3DPRESENT_PARAMETERS* pPresentationParameters) override;
STDMETHOD(Present)(const RECT* pSourceRect, const RECT* pDestRect, HWND hDestWindowOverride, const RGNDATA* pDirtyRegion) override;
STDMETHOD(GetBackBuffer)(UINT iSwapChain, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9** ppBackBuffer) override;
STDMETHOD(GetRasterStatus)(UINT iSwapChain, D3DRASTER_STATUS* pRasterStatus) override;
STDMETHOD(SetDialogBoxMode)(BOOL bEnableDialogs) override;
STDMETHOD_(void, SetGammaRamp)(UINT iSwapChain, DWORD Flags, const D3DGAMMARAMP* pRamp) override;
STDMETHOD_(void, GetGammaRamp)(UINT iSwapChain, D3DGAMMARAMP* pRamp) override;
STDMETHOD(CreateTexture)(UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle) override;
STDMETHOD(CreateVolumeTexture)(UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture9** ppVolumeTexture, HANDLE* pSharedHandle) override;
STDMETHOD(CreateCubeTexture)(UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture9** ppCubeTexture, HANDLE* pSharedHandle) override;
STDMETHOD(CreateVertexBuffer)(UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle) override;
STDMETHOD(CreateIndexBuffer)(UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle) override;
STDMETHOD(CreateRenderTarget)(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Lockable, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle) override;
STDMETHOD(CreateDepthStencilSurface)(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Discard, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle) override;
STDMETHOD(UpdateSurface)(IDirect3DSurface9* pSourceSurface, const RECT* pSourceRect, IDirect3DSurface9* pDestinationSurface, const POINT* pDestPoint) override;
STDMETHOD(UpdateTexture)(IDirect3DBaseTexture9* pSourceTexture, IDirect3DBaseTexture9* pDestinationTexture) override;
STDMETHOD(GetRenderTargetData)(IDirect3DSurface9* pRenderTarget, IDirect3DSurface9* pDestSurface) override;
STDMETHOD(GetFrontBufferData)(UINT iSwapChain, IDirect3DSurface9* pDestSurface) override;
STDMETHOD(StretchRect)(IDirect3DSurface9* pSourceSurface, const RECT* pSourceRect, IDirect3DSurface9* pDestSurface, const RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter) override;
STDMETHOD(ColorFill)(IDirect3DSurface9* pSurface, const RECT* pRect, D3DCOLOR color) override;
STDMETHOD(CreateOffscreenPlainSurface)(UINT Width, UINT Height, D3DFORMAT Format, D3DPOOL Pool, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle) override;
STDMETHOD(SetRenderTarget)(DWORD RenderTargetIndex, IDirect3DSurface9* pRenderTarget) override;
STDMETHOD(GetRenderTarget)(DWORD RenderTargetIndex, IDirect3DSurface9** ppRenderTarget) override;
STDMETHOD(SetDepthStencilSurface)(IDirect3DSurface9* pNewZStencil) override;
STDMETHOD(GetDepthStencilSurface)(IDirect3DSurface9** ppZStencilSurface) override;
STDMETHOD(BeginScene)() override;
STDMETHOD(EndScene)() override;
STDMETHOD(Clear)(DWORD Count, const D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil) override;
STDMETHOD(SetTransform)(D3DTRANSFORMSTATETYPE State, const D3DMATRIX* pMatrix) override;
STDMETHOD(GetTransform)(D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix) override;
STDMETHOD(MultiplyTransform)(D3DTRANSFORMSTATETYPE, const D3DMATRIX*) override;
STDMETHOD(SetViewport)(const D3DVIEWPORT9* pViewport) override;
STDMETHOD(GetViewport)(D3DVIEWPORT9* pViewport) override;
STDMETHOD(SetMaterial)(const D3DMATERIAL9* pMaterial) override;
STDMETHOD(GetMaterial)(D3DMATERIAL9* pMaterial) override;
STDMETHOD(SetLight)(DWORD Index, const D3DLIGHT9*) override;
STDMETHOD(GetLight)(DWORD Index, D3DLIGHT9*) override;
STDMETHOD(LightEnable)(DWORD Index, BOOL Enable) override;
STDMETHOD(GetLightEnable)(DWORD Index, BOOL* pEnable) override;
STDMETHOD(SetClipPlane)(DWORD Index, const float* pPlane) override;
STDMETHOD(GetClipPlane)(DWORD Index, float* pPlane) override;
STDMETHOD(SetRenderState)(D3DRENDERSTATETYPE State, DWORD Value) override;
STDMETHOD(GetRenderState)(D3DRENDERSTATETYPE State, DWORD* pValue) override;
STDMETHOD(CreateStateBlock)(D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppSB) override;
STDMETHOD(BeginStateBlock)() override;
STDMETHOD(EndStateBlock)(IDirect3DStateBlock9** ppSB) override;
STDMETHOD(SetClipStatus)(const D3DCLIPSTATUS9* pClipStatus) override;
STDMETHOD(GetClipStatus)(D3DCLIPSTATUS9* pClipStatus) override;
STDMETHOD(GetTexture)(DWORD Stage, IDirect3DBaseTexture9** ppTexture) override;
STDMETHOD(SetTexture)(DWORD Stage, IDirect3DBaseTexture9* pTexture) override;
STDMETHOD(GetTextureStageState)(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD* pValue) override;
STDMETHOD(SetTextureStageState)(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) override;
STDMETHOD(GetSamplerState)(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD* pValue) override;
STDMETHOD(SetSamplerState)(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) override;
STDMETHOD(ValidateDevice)(DWORD* pNumPasses) override;
STDMETHOD(SetPaletteEntries)(UINT PaletteNumber, const PALETTEENTRY* pEntries) override;
STDMETHOD(GetPaletteEntries)(UINT PaletteNumber, PALETTEENTRY* pEntries) override;
STDMETHOD(SetCurrentTexturePalette)(UINT PaletteNumber) override;
STDMETHOD(GetCurrentTexturePalette)(UINT* PaletteNumber) override;
STDMETHOD(SetScissorRect)(const RECT* pRect) override;
STDMETHOD(GetScissorRect)(RECT* pRect) override;
STDMETHOD(SetSoftwareVertexProcessing)(BOOL bSoftware) override;
STDMETHOD_(BOOL, GetSoftwareVertexProcessing)() override;
STDMETHOD(SetNPatchMode)(float nSegments) override;
STDMETHOD_(float, GetNPatchMode)() override;
STDMETHOD(DrawPrimitive)(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) override;
STDMETHOD(DrawIndexedPrimitive)(D3DPRIMITIVETYPE, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount) override;
STDMETHOD(DrawPrimitiveUP)(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride) override;
STDMETHOD(DrawIndexedPrimitiveUP)(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertices, UINT PrimitiveCount, const void* pIndexData, D3DFORMAT IndexDataFormat, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride) override;
STDMETHOD(ProcessVertices)(UINT SrcStartIndex, UINT DestIndex, UINT VertexCount, IDirect3DVertexBuffer9* pDestBuffer, IDirect3DVertexDeclaration9* pVertexDecl, DWORD Flags) override;
STDMETHOD(CreateVertexDeclaration)(const D3DVERTEXELEMENT9* pVertexElements, IDirect3DVertexDeclaration9** ppDecl) override;
STDMETHOD(SetVertexDeclaration)(IDirect3DVertexDeclaration9* pDecl) override;
STDMETHOD(GetVertexDeclaration)(IDirect3DVertexDeclaration9** ppDecl) override;
STDMETHOD(SetFVF)(DWORD FVF) override;
STDMETHOD(GetFVF)(DWORD* pFVF) override;
STDMETHOD(CreateVertexShader)(const DWORD* pFunction, IDirect3DVertexShader9** ppShader) override;
STDMETHOD(SetVertexShader)(IDirect3DVertexShader9* pShader) override;
STDMETHOD(GetVertexShader)(IDirect3DVertexShader9** ppShader) override;
STDMETHOD(SetVertexShaderConstantF)(UINT StartRegister, const float* pConstantData, UINT Vector4fCount) override;
STDMETHOD(GetVertexShaderConstantF)(UINT StartRegister, float* pConstantData, UINT Vector4fCount) override;
STDMETHOD(SetVertexShaderConstantI)(UINT StartRegister, const int* pConstantData, UINT Vector4iCount) override;
STDMETHOD(GetVertexShaderConstantI)(UINT StartRegister, int* pConstantData, UINT Vector4iCount) override;
STDMETHOD(SetVertexShaderConstantB)(UINT StartRegister, const BOOL* pConstantData, UINT BoolCount) override;
STDMETHOD(GetVertexShaderConstantB)(UINT StartRegister, BOOL* pConstantData, UINT BoolCount) override;
STDMETHOD(SetStreamSource)(UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride) override;
STDMETHOD(GetStreamSource)(UINT StreamNumber, IDirect3DVertexBuffer9** ppStreamData, UINT* pOffsetInBytes, UINT* pStride) override;
STDMETHOD(SetStreamSourceFreq)(UINT StreamNumber, UINT Setting) override;
STDMETHOD(GetStreamSourceFreq)(UINT StreamNumber, UINT* pSetting) override;
STDMETHOD(SetIndices)(IDirect3DIndexBuffer9* pIndexData) override;
STDMETHOD(GetIndices)(IDirect3DIndexBuffer9** ppIndexData) override;
STDMETHOD(CreatePixelShader)(const DWORD* pFunction, IDirect3DPixelShader9** ppShader) override;
STDMETHOD(SetPixelShader)(IDirect3DPixelShader9* pShader) override;
STDMETHOD(GetPixelShader)(IDirect3DPixelShader9** ppShader) override;
STDMETHOD(SetPixelShaderConstantF)(UINT StartRegister, const float* pConstantData, UINT Vector4fCount) override;
STDMETHOD(GetPixelShaderConstantF)(UINT StartRegister, float* pConstantData, UINT Vector4fCount) override;
STDMETHOD(SetPixelShaderConstantI)(UINT StartRegister, const int* pConstantData, UINT Vector4iCount) override;
STDMETHOD(GetPixelShaderConstantI)(UINT StartRegister, int* pConstantData, UINT Vector4iCount) override;
STDMETHOD(SetPixelShaderConstantB)(UINT StartRegister, const BOOL* pConstantData, UINT BoolCount) override;
STDMETHOD(GetPixelShaderConstantB)(UINT StartRegister, BOOL* pConstantData, UINT BoolCount) override;
STDMETHOD(DrawRectPatch)(UINT Handle, const float* pNumSegs, const D3DRECTPATCH_INFO* pRectPatchInfo) override;
STDMETHOD(DrawTriPatch)(UINT Handle, const float* pNumSegs, const D3DTRIPATCH_INFO* pTriPatchInfo) override;
STDMETHOD(DeletePatch)(UINT Handle) override;
STDMETHOD(CreateQuery)(D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery) override;
protected:
IDirect3DDevice9* real_;
std::atomic<ULONG> ref_count_;
TextureClient* client_;
// Shared by Release() here and by WrappedDirect3DDevice9Ex::Release(); deletes
// client_ exactly as h_DeviceRelease does, via TextureClient::CurrentClient().
void TeardownTextureClient();
};
// Adds IDirect3DDevice9Ex's own methods via ordinary forwards, plus CreateDeviceEx-style
// interception is one level up (in WrappedDirect3D9Ex); this class only needs to override
// the base's virtuals once (inherited) and add the Ex-only ones.
class WrappedDirect3DDevice9Ex : public IDirect3DDevice9Ex {
public:
explicit WrappedDirect3DDevice9Ex(IDirect3DDevice9Ex* real);
IDirect3DDevice9Ex* RealDeviceEx() const { return real_; }
TextureClient* Client() const { return client_; }
void SetClient(TextureClient* client) { client_ = client; }
STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj) override;
STDMETHOD_(ULONG, AddRef)() override;
STDMETHOD_(ULONG, Release)() override;
STDMETHOD(TestCooperativeLevel)() override;
STDMETHOD_(UINT, GetAvailableTextureMem)() override;
STDMETHOD(EvictManagedResources)() override;
STDMETHOD(GetDirect3D)(IDirect3D9** ppD3D9) override;
STDMETHOD(GetDeviceCaps)(D3DCAPS9* pCaps) override;
STDMETHOD(GetDisplayMode)(UINT iSwapChain, D3DDISPLAYMODE* pMode) override;
STDMETHOD(GetCreationParameters)(D3DDEVICE_CREATION_PARAMETERS* pParameters) override;
STDMETHOD(SetCursorProperties)(UINT XHotSpot, UINT YHotSpot, IDirect3DSurface9* pCursorBitmap) override;
STDMETHOD_(void, SetCursorPosition)(int X, int Y, DWORD Flags) override;
STDMETHOD_(BOOL, ShowCursor)(BOOL bShow) override;
STDMETHOD(CreateAdditionalSwapChain)(D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain9** pSwapChain) override;
STDMETHOD(GetSwapChain)(UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) override;
STDMETHOD_(UINT, GetNumberOfSwapChains)() override;
STDMETHOD(Reset)(D3DPRESENT_PARAMETERS* pPresentationParameters) override;
STDMETHOD(Present)(const RECT* pSourceRect, const RECT* pDestRect, HWND hDestWindowOverride, const RGNDATA* pDirtyRegion) override;
STDMETHOD(GetBackBuffer)(UINT iSwapChain, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9** ppBackBuffer) override;
STDMETHOD(GetRasterStatus)(UINT iSwapChain, D3DRASTER_STATUS* pRasterStatus) override;
STDMETHOD(SetDialogBoxMode)(BOOL bEnableDialogs) override;
STDMETHOD_(void, SetGammaRamp)(UINT iSwapChain, DWORD Flags, const D3DGAMMARAMP* pRamp) override;
STDMETHOD_(void, GetGammaRamp)(UINT iSwapChain, D3DGAMMARAMP* pRamp) override;
STDMETHOD(CreateTexture)(UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle) override;
STDMETHOD(CreateVolumeTexture)(UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture9** ppVolumeTexture, HANDLE* pSharedHandle) override;
STDMETHOD(CreateCubeTexture)(UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture9** ppCubeTexture, HANDLE* pSharedHandle) override;
STDMETHOD(CreateVertexBuffer)(UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle) override;
STDMETHOD(CreateIndexBuffer)(UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle) override;
STDMETHOD(CreateRenderTarget)(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Lockable, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle) override;
STDMETHOD(CreateDepthStencilSurface)(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Discard, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle) override;
STDMETHOD(UpdateSurface)(IDirect3DSurface9* pSourceSurface, const RECT* pSourceRect, IDirect3DSurface9* pDestinationSurface, const POINT* pDestPoint) override;
STDMETHOD(UpdateTexture)(IDirect3DBaseTexture9* pSourceTexture, IDirect3DBaseTexture9* pDestinationTexture) override;
STDMETHOD(GetRenderTargetData)(IDirect3DSurface9* pRenderTarget, IDirect3DSurface9* pDestSurface) override;
STDMETHOD(GetFrontBufferData)(UINT iSwapChain, IDirect3DSurface9* pDestSurface) override;
STDMETHOD(StretchRect)(IDirect3DSurface9* pSourceSurface, const RECT* pSourceRect, IDirect3DSurface9* pDestSurface, const RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter) override;
STDMETHOD(ColorFill)(IDirect3DSurface9* pSurface, const RECT* pRect, D3DCOLOR color) override;
STDMETHOD(CreateOffscreenPlainSurface)(UINT Width, UINT Height, D3DFORMAT Format, D3DPOOL Pool, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle) override;
STDMETHOD(SetRenderTarget)(DWORD RenderTargetIndex, IDirect3DSurface9* pRenderTarget) override;
STDMETHOD(GetRenderTarget)(DWORD RenderTargetIndex, IDirect3DSurface9** ppRenderTarget) override;
STDMETHOD(SetDepthStencilSurface)(IDirect3DSurface9* pNewZStencil) override;
STDMETHOD(GetDepthStencilSurface)(IDirect3DSurface9** ppZStencilSurface) override;
STDMETHOD(BeginScene)() override;
STDMETHOD(EndScene)() override;
STDMETHOD(Clear)(DWORD Count, const D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil) override;
STDMETHOD(SetTransform)(D3DTRANSFORMSTATETYPE State, const D3DMATRIX* pMatrix) override;
STDMETHOD(GetTransform)(D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix) override;
STDMETHOD(MultiplyTransform)(D3DTRANSFORMSTATETYPE, const D3DMATRIX*) override;
STDMETHOD(SetViewport)(const D3DVIEWPORT9* pViewport) override;
STDMETHOD(GetViewport)(D3DVIEWPORT9* pViewport) override;
STDMETHOD(SetMaterial)(const D3DMATERIAL9* pMaterial) override;
STDMETHOD(GetMaterial)(D3DMATERIAL9* pMaterial) override;
STDMETHOD(SetLight)(DWORD Index, const D3DLIGHT9*) override;
STDMETHOD(GetLight)(DWORD Index, D3DLIGHT9*) override;
STDMETHOD(LightEnable)(DWORD Index, BOOL Enable) override;
STDMETHOD(GetLightEnable)(DWORD Index, BOOL* pEnable) override;
STDMETHOD(SetClipPlane)(DWORD Index, const float* pPlane) override;
STDMETHOD(GetClipPlane)(DWORD Index, float* pPlane) override;
STDMETHOD(SetRenderState)(D3DRENDERSTATETYPE State, DWORD Value) override;
STDMETHOD(GetRenderState)(D3DRENDERSTATETYPE State, DWORD* pValue) override;
STDMETHOD(CreateStateBlock)(D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppSB) override;
STDMETHOD(BeginStateBlock)() override;
STDMETHOD(EndStateBlock)(IDirect3DStateBlock9** ppSB) override;
STDMETHOD(SetClipStatus)(const D3DCLIPSTATUS9* pClipStatus) override;
STDMETHOD(GetClipStatus)(D3DCLIPSTATUS9* pClipStatus) override;
STDMETHOD(GetTexture)(DWORD Stage, IDirect3DBaseTexture9** ppTexture) override;
STDMETHOD(SetTexture)(DWORD Stage, IDirect3DBaseTexture9* pTexture) override;
STDMETHOD(GetTextureStageState)(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD* pValue) override;
STDMETHOD(SetTextureStageState)(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) override;
STDMETHOD(GetSamplerState)(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD* pValue) override;
STDMETHOD(SetSamplerState)(DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) override;
STDMETHOD(ValidateDevice)(DWORD* pNumPasses) override;
STDMETHOD(SetPaletteEntries)(UINT PaletteNumber, const PALETTEENTRY* pEntries) override;
STDMETHOD(GetPaletteEntries)(UINT PaletteNumber, PALETTEENTRY* pEntries) override;
STDMETHOD(SetCurrentTexturePalette)(UINT PaletteNumber) override;
STDMETHOD(GetCurrentTexturePalette)(UINT* PaletteNumber) override;
STDMETHOD(SetScissorRect)(const RECT* pRect) override;
STDMETHOD(GetScissorRect)(RECT* pRect) override;
STDMETHOD(SetSoftwareVertexProcessing)(BOOL bSoftware) override;
STDMETHOD_(BOOL, GetSoftwareVertexProcessing)() override;
STDMETHOD(SetNPatchMode)(float nSegments) override;
STDMETHOD_(float, GetNPatchMode)() override;
STDMETHOD(DrawPrimitive)(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) override;
STDMETHOD(DrawIndexedPrimitive)(D3DPRIMITIVETYPE, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount) override;
STDMETHOD(DrawPrimitiveUP)(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride) override;
STDMETHOD(DrawIndexedPrimitiveUP)(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertices, UINT PrimitiveCount, const void* pIndexData, D3DFORMAT IndexDataFormat, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride) override;
STDMETHOD(ProcessVertices)(UINT SrcStartIndex, UINT DestIndex, UINT VertexCount, IDirect3DVertexBuffer9* pDestBuffer, IDirect3DVertexDeclaration9* pVertexDecl, DWORD Flags) override;
STDMETHOD(CreateVertexDeclaration)(const D3DVERTEXELEMENT9* pVertexElements, IDirect3DVertexDeclaration9** ppDecl) override;
STDMETHOD(SetVertexDeclaration)(IDirect3DVertexDeclaration9* pDecl) override;
STDMETHOD(GetVertexDeclaration)(IDirect3DVertexDeclaration9** ppDecl) override;
STDMETHOD(SetFVF)(DWORD FVF) override;
STDMETHOD(GetFVF)(DWORD* pFVF) override;
STDMETHOD(CreateVertexShader)(const DWORD* pFunction, IDirect3DVertexShader9** ppShader) override;
STDMETHOD(SetVertexShader)(IDirect3DVertexShader9* pShader) override;
STDMETHOD(GetVertexShader)(IDirect3DVertexShader9** ppShader) override;
STDMETHOD(SetVertexShaderConstantF)(UINT StartRegister, const float* pConstantData, UINT Vector4fCount) override;
STDMETHOD(GetVertexShaderConstantF)(UINT StartRegister, float* pConstantData, UINT Vector4fCount) override;
STDMETHOD(SetVertexShaderConstantI)(UINT StartRegister, const int* pConstantData, UINT Vector4iCount) override;
STDMETHOD(GetVertexShaderConstantI)(UINT StartRegister, int* pConstantData, UINT Vector4iCount) override;
STDMETHOD(SetVertexShaderConstantB)(UINT StartRegister, const BOOL* pConstantData, UINT BoolCount) override;
STDMETHOD(GetVertexShaderConstantB)(UINT StartRegister, BOOL* pConstantData, UINT BoolCount) override;
STDMETHOD(SetStreamSource)(UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride) override;
STDMETHOD(GetStreamSource)(UINT StreamNumber, IDirect3DVertexBuffer9** ppStreamData, UINT* pOffsetInBytes, UINT* pStride) override;
STDMETHOD(SetStreamSourceFreq)(UINT StreamNumber, UINT Setting) override;
STDMETHOD(GetStreamSourceFreq)(UINT StreamNumber, UINT* pSetting) override;
STDMETHOD(SetIndices)(IDirect3DIndexBuffer9* pIndexData) override;
STDMETHOD(GetIndices)(IDirect3DIndexBuffer9** ppIndexData) override;
STDMETHOD(CreatePixelShader)(const DWORD* pFunction, IDirect3DPixelShader9** ppShader) override;
STDMETHOD(SetPixelShader)(IDirect3DPixelShader9* pShader) override;
STDMETHOD(GetPixelShader)(IDirect3DPixelShader9** ppShader) override;
STDMETHOD(SetPixelShaderConstantF)(UINT StartRegister, const float* pConstantData, UINT Vector4fCount) override;
STDMETHOD(GetPixelShaderConstantF)(UINT StartRegister, float* pConstantData, UINT Vector4fCount) override;
STDMETHOD(SetPixelShaderConstantI)(UINT StartRegister, const int* pConstantData, UINT Vector4iCount) override;
STDMETHOD(GetPixelShaderConstantI)(UINT StartRegister, int* pConstantData, UINT Vector4iCount) override;
STDMETHOD(SetPixelShaderConstantB)(UINT StartRegister, const BOOL* pConstantData, UINT BoolCount) override;
STDMETHOD(GetPixelShaderConstantB)(UINT StartRegister, BOOL* pConstantData, UINT BoolCount) override;
STDMETHOD(DrawRectPatch)(UINT Handle, const float* pNumSegs, const D3DRECTPATCH_INFO* pRectPatchInfo) override;
STDMETHOD(DrawTriPatch)(UINT Handle, const float* pNumSegs, const D3DTRIPATCH_INFO* pTriPatchInfo) override;
STDMETHOD(DeletePatch)(UINT Handle) override;
STDMETHOD(CreateQuery)(D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery) override;
STDMETHOD(SetConvolutionMonoKernel)(UINT width, UINT height, float* rows, float* columns) override;
STDMETHOD(ComposeRects)(IDirect3DSurface9* pSrc, IDirect3DSurface9* pDst, IDirect3DVertexBuffer9* pSrcRectDescs, UINT NumRects, IDirect3DVertexBuffer9* pDstRectDescs, D3DCOMPOSERECTSOP Operation, int Xoffset, int Yoffset) override;
STDMETHOD(PresentEx)(const RECT* pSourceRect, const RECT* pDestRect, HWND hDestWindowOverride, const RGNDATA* pDirtyRegion, DWORD dwFlags) override;
STDMETHOD(GetGPUThreadPriority)(INT* pPriority) override;
STDMETHOD(SetGPUThreadPriority)(INT Priority) override;
STDMETHOD(WaitForVBlank)(UINT iSwapChain) override;
STDMETHOD(CheckResourceResidency)(IDirect3DResource9** pResourceArray, UINT32 NumResources) override;
STDMETHOD(SetMaximumFrameLatency)(UINT MaxLatency) override;
STDMETHOD(GetMaximumFrameLatency)(UINT* pMaxLatency) override;
STDMETHOD(CheckDeviceState)(HWND hDestinationWindow) override;
STDMETHOD(CreateRenderTargetEx)(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Lockable, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle, DWORD Usage) override;
STDMETHOD(CreateOffscreenPlainSurfaceEx)(UINT Width, UINT Height, D3DFORMAT Format, D3DPOOL Pool, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle, DWORD Usage) override;
STDMETHOD(CreateDepthStencilSurfaceEx)(UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Discard, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle, DWORD Usage) override;
STDMETHOD(ResetEx)(D3DPRESENT_PARAMETERS* pPresentationParameters, D3DDISPLAYMODEEX* pFullscreenDisplayMode) override;
STDMETHOD(GetDisplayModeEx)(UINT iSwapChain, D3DDISPLAYMODEEX* pMode, D3DDISPLAYROTATION* pRotation) override;
private:
IDirect3DDevice9Ex* real_;
std::atomic<ULONG> ref_count_;
TextureClient* client_;
void TeardownTextureClient();
};