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

Moved Direct3D parts to Direct3d namespace and subdirectory

This commit is contained in:
narzoul 2016-08-28 14:08:07 +02:00
parent 55f840cb50
commit 1a9b4ce860
17 changed files with 346 additions and 275 deletions

View File

@ -1,11 +0,0 @@
#pragma once
#include <guiddef.h>
#include "CompatPtr.h"
namespace CompatDepthBuffer
{
template <typename TDirect3d, typename TD3dDeviceDesc>
void fixSupportedZBufferBitDepths(CompatPtr<TDirect3d> d3d, TD3dDeviceDesc& desc);
}

View File

@ -1,11 +0,0 @@
#pragma once
#include "CompatVtable.h"
#include "Direct3dVtblVisitor.h"
template <typename TDirect3d>
class CompatDirect3d : public CompatVtable<CompatDirect3d<TDirect3d>, TDirect3d>
{
public:
static void setCompatVtable(Vtable<TDirect3d>& vtable);
};

View File

@ -1,11 +0,0 @@
#pragma once
#include "CompatVtable.h"
#include "Direct3dDeviceVtblVisitor.h"
template <typename TDirect3dDevice>
class CompatDirect3dDevice : public CompatVtable<CompatDirect3dDevice<TDirect3dDevice>, TDirect3dDevice>
{
public:
static void setCompatVtable(Vtable<TDirect3dDevice>& vtable);
};

View File

@ -2,8 +2,6 @@
#include <d3d.h> #include <d3d.h>
#include "CompatDirect3d.h"
#include "CompatDirect3dDevice.h"
#include "CompatPtr.h" #include "CompatPtr.h"
#include "CompatRef.h" #include "CompatRef.h"
#include "DDraw/ActivateAppHandler.h" #include "DDraw/ActivateAppHandler.h"
@ -14,108 +12,12 @@
#include "DDraw/RealPrimarySurface.h" #include "DDraw/RealPrimarySurface.h"
#include "DDraw/Repository.h" #include "DDraw/Repository.h"
#include "DDrawLog.h" #include "DDrawLog.h"
#include "DDrawProcs.h"
namespace namespace
{ {
void hookDirect3dDevice(CompatRef<IDirect3D3> d3d, CompatRef<IDirectDrawSurface4> renderTarget);
void hookDirect3dDevice7(CompatRef<IDirect3D7> d3d, CompatRef<IDirectDrawSurface7> renderTarget);
template <typename CompatInterface> template <typename CompatInterface>
void hookVtable(const CompatPtr<typename CompatInterface::Interface>& intf); void hookVtable(const CompatPtr<typename CompatInterface::Interface>& intf);
template <typename TDirect3d, typename TDirectDraw>
CompatPtr<TDirect3d> createDirect3d(CompatRef<TDirectDraw> dd)
{
CompatPtr<TDirect3d> d3d;
HRESULT result = dd->QueryInterface(&dd, Compat::getIntfId<TDirect3d>(),
reinterpret_cast<void**>(&d3d.getRef()));
if (FAILED(result))
{
Compat::Log() << "Failed to create a Direct3D object for hooking: " << result;
}
return d3d;
}
template <typename TDirect3dDevice, typename TDirect3d, typename TDirectDrawSurface,
typename... Params>
CompatPtr<TDirect3dDevice> createDirect3dDevice(
CompatRef<TDirect3d> d3d, CompatRef<TDirectDrawSurface> renderTarget, Params... params)
{
CompatPtr<TDirect3dDevice> d3dDevice;
HRESULT result = d3d->CreateDevice(
&d3d, IID_IDirect3DRGBDevice, &renderTarget, &d3dDevice.getRef(), params...);
if (FAILED(result))
{
Compat::Log() << "Failed to create a Direct3D device for hooking: " << result;
}
return d3dDevice;
}
CompatPtr<IDirectDrawSurface7> createRenderTarget(CompatRef<IDirectDraw7> dd)
{
DDSURFACEDESC2 desc = {};
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CAPS;
desc.dwWidth = 1;
desc.dwHeight = 1;
desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat);
desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
desc.ddpfPixelFormat.dwRGBBitCount = 32;
desc.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
desc.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
desc.ddpfPixelFormat.dwBBitMask = 0x000000FF;
desc.ddsCaps.dwCaps = DDSCAPS_3DDEVICE;
CompatPtr<IDirectDrawSurface7> renderTarget;
HRESULT result = dd->CreateSurface(&dd, &desc, &renderTarget.getRef(), nullptr);
if (FAILED(result))
{
Compat::Log() << "Failed to create a render target for hooking: " << result;
}
return renderTarget;
}
void hookDirect3d(CompatRef<IDirectDraw> dd, CompatRef<IDirectDrawSurface4> renderTarget)
{
CompatPtr<IDirect3D3> d3d(createDirect3d<IDirect3D3>(dd));
if (d3d)
{
hookVtable<CompatDirect3d<IDirect3D>>(d3d);
hookVtable<CompatDirect3d<IDirect3D2>>(d3d);
hookVtable<CompatDirect3d<IDirect3D3>>(d3d);
hookDirect3dDevice(*d3d, renderTarget);
}
}
void hookDirect3d7(CompatRef<IDirectDraw7> dd, CompatRef<IDirectDrawSurface7> renderTarget)
{
CompatPtr<IDirect3D7> d3d(createDirect3d<IDirect3D7>(dd));
if (d3d)
{
hookVtable<CompatDirect3d<IDirect3D7>>(d3d);
hookDirect3dDevice7(*d3d, renderTarget);
}
}
void hookDirect3dDevice(CompatRef<IDirect3D3> d3d, CompatRef<IDirectDrawSurface4> renderTarget)
{
CompatPtr<IDirect3DDevice3> d3dDevice(
createDirect3dDevice<IDirect3DDevice3>(d3d, renderTarget, nullptr));
hookVtable<CompatDirect3dDevice<IDirect3DDevice>>(d3dDevice);
hookVtable<CompatDirect3dDevice<IDirect3DDevice2>>(d3dDevice);
hookVtable<CompatDirect3dDevice<IDirect3DDevice3>>(d3dDevice);
}
void hookDirect3dDevice7(CompatRef<IDirect3D7> d3d, CompatRef<IDirectDrawSurface7> renderTarget)
{
CompatPtr<IDirect3DDevice7> d3dDevice(
createDirect3dDevice<IDirect3DDevice7>(d3d, renderTarget));
hookVtable<CompatDirect3dDevice<IDirect3DDevice7>>(d3dDevice);
}
void hookDirectDraw(CompatRef<IDirectDraw7> dd) void hookDirectDraw(CompatRef<IDirectDraw7> dd)
{ {
DDraw::DirectDraw<IDirectDraw7>::s_origVtable = *(&dd)->lpVtbl; DDraw::DirectDraw<IDirectDraw7>::s_origVtable = *(&dd)->lpVtbl;
@ -206,14 +108,6 @@ namespace DDraw
hookDirectDrawSurface(*dd7); hookDirectDrawSurface(*dd7);
hookDirectDrawPalette(*dd7); hookDirectDrawPalette(*dd7);
CompatPtr<IDirectDrawSurface7> renderTarget7(createRenderTarget(*dd7));
if (renderTarget7)
{
CompatPtr<IDirectDrawSurface4> renderTarget4(renderTarget7);
hookDirect3d(*dd, *renderTarget4);
hookDirect3d7(*dd7, *renderTarget7);
}
ActivateAppHandler::installHooks(); ActivateAppHandler::installHooks();
} }

View File

@ -93,6 +93,7 @@
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>
</ClCompile> </ClCompile>
<Link> <Link>
<ModuleDefinitionFile>DDrawCompat.def</ModuleDefinitionFile> <ModuleDefinitionFile>DDrawCompat.def</ModuleDefinitionFile>
@ -121,6 +122,7 @@
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DDRAWCOMPAT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DDRAWCOMPAT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<ObjectFileName>$(IntDir)%(RelativeDir)</ObjectFileName>
</ClCompile> </ClCompile>
<Link> <Link>
<ModuleDefinitionFile>DDrawCompat.def</ModuleDefinitionFile> <ModuleDefinitionFile>DDrawCompat.def</ModuleDefinitionFile>
@ -151,9 +153,6 @@
<ClInclude Include="CompatD3dDdiAdapterFuncs.h" /> <ClInclude Include="CompatD3dDdiAdapterFuncs.h" />
<ClInclude Include="CompatD3dDdiDeviceCallbacks.h" /> <ClInclude Include="CompatD3dDdiDeviceCallbacks.h" />
<ClInclude Include="CompatD3dDdiDeviceFuncs.h" /> <ClInclude Include="CompatD3dDdiDeviceFuncs.h" />
<ClInclude Include="CompatDepthBuffer.h" />
<ClInclude Include="CompatDirect3d.h" />
<ClInclude Include="CompatDirect3dDevice.h" />
<ClInclude Include="CompatFontSmoothing.h" /> <ClInclude Include="CompatFontSmoothing.h" />
<ClInclude Include="CompatHooks.h" /> <ClInclude Include="CompatHooks.h" />
<ClInclude Include="CompatPtr.h" /> <ClInclude Include="CompatPtr.h" />
@ -184,8 +183,12 @@
<ClInclude Include="DDraw\IReleaseNotifier.h" /> <ClInclude Include="DDraw\IReleaseNotifier.h" />
<ClInclude Include="DDraw\RealPrimarySurface.h" /> <ClInclude Include="DDraw\RealPrimarySurface.h" />
<ClInclude Include="Direct3dDeviceVtblVisitor.h" /> <ClInclude Include="Direct3dDeviceVtblVisitor.h" />
<ClInclude Include="Direct3dTypes.h" />
<ClInclude Include="Direct3dVtblVisitor.h" /> <ClInclude Include="Direct3dVtblVisitor.h" />
<ClInclude Include="Direct3d\DepthBuffer.h" />
<ClInclude Include="Direct3d\Direct3d.h" />
<ClInclude Include="Direct3d\Direct3dDevice.h" />
<ClInclude Include="Direct3d\Hooks.h" />
<ClInclude Include="Direct3d\Types.h" />
<ClInclude Include="DirectDrawPaletteVtblVisitor.h" /> <ClInclude Include="DirectDrawPaletteVtblVisitor.h" />
<ClInclude Include="DirectDrawSurfaceVtblVisitor.h" /> <ClInclude Include="DirectDrawSurfaceVtblVisitor.h" />
<ClInclude Include="DirectDrawVtblVisitor.h" /> <ClInclude Include="DirectDrawVtblVisitor.h" />
@ -209,9 +212,6 @@
<ClCompile Include="CompatD3dDdiAdapterFuncs.cpp" /> <ClCompile Include="CompatD3dDdiAdapterFuncs.cpp" />
<ClCompile Include="CompatD3dDdiDeviceCallbacks.cpp" /> <ClCompile Include="CompatD3dDdiDeviceCallbacks.cpp" />
<ClCompile Include="CompatD3dDdiDeviceFuncs.cpp" /> <ClCompile Include="CompatD3dDdiDeviceFuncs.cpp" />
<ClCompile Include="CompatDepthBuffer.cpp" />
<ClCompile Include="CompatDirect3d.cpp" />
<ClCompile Include="CompatDirect3dDevice.cpp" />
<ClCompile Include="CompatFontSmoothing.cpp" /> <ClCompile Include="CompatFontSmoothing.cpp" />
<ClCompile Include="CompatHooks.cpp" /> <ClCompile Include="CompatHooks.cpp" />
<ClCompile Include="CompatRegistry.cpp" /> <ClCompile Include="CompatRegistry.cpp" />
@ -228,6 +228,10 @@
<ClCompile Include="DDraw\Repository.cpp" /> <ClCompile Include="DDraw\Repository.cpp" />
<ClCompile Include="DDraw\IReleaseNotifier.cpp" /> <ClCompile Include="DDraw\IReleaseNotifier.cpp" />
<ClCompile Include="DDraw\RealPrimarySurface.cpp" /> <ClCompile Include="DDraw\RealPrimarySurface.cpp" />
<ClCompile Include="Direct3d\DepthBuffer.cpp" />
<ClCompile Include="Direct3d\Direct3d.cpp" />
<ClCompile Include="Direct3d\Direct3dDevice.cpp" />
<ClCompile Include="Direct3d\Hooks.cpp" />
<ClCompile Include="DllMain.cpp" /> <ClCompile Include="DllMain.cpp" />
<ClCompile Include="DDrawProcs.cpp" /> <ClCompile Include="DDrawProcs.cpp" />
<ClCompile Include="Gdi\Gdi.cpp" /> <ClCompile Include="Gdi\Gdi.cpp" />

View File

@ -25,6 +25,12 @@
<Filter Include="Source Files\DDraw"> <Filter Include="Source Files\DDraw">
<UniqueIdentifier>{bcc85014-8548-43ff-902f-16bcb6a0e96b}</UniqueIdentifier> <UniqueIdentifier>{bcc85014-8548-43ff-902f-16bcb6a0e96b}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Header Files\Direct3d">
<UniqueIdentifier>{1e5628f5-39bf-4080-ae94-938081671cf8}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\Direct3d">
<UniqueIdentifier>{08a23b36-cd96-4214-985b-0473ecf6ecab}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="DDrawProcs.h"> <ClInclude Include="DDrawProcs.h">
@ -81,21 +87,9 @@
<ClInclude Include="Direct3dVtblVisitor.h"> <ClInclude Include="Direct3dVtblVisitor.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="CompatDirect3d.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Direct3dDeviceVtblVisitor.h"> <ClInclude Include="Direct3dDeviceVtblVisitor.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="CompatDirect3dDevice.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Direct3dTypes.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="CompatDepthBuffer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="D3dDdiAdapterCallbacksVisitor.h"> <ClInclude Include="D3dDdiAdapterCallbacksVisitor.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@ -195,6 +189,21 @@
<ClInclude Include="DDraw\DirectDrawSurface.h"> <ClInclude Include="DDraw\DirectDrawSurface.h">
<Filter>Header Files\DDraw</Filter> <Filter>Header Files\DDraw</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Direct3d\Direct3d.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Direct3dDevice.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
<ClInclude Include="Direct3d\DepthBuffer.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Types.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Hooks.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="DllMain.cpp"> <ClCompile Include="DllMain.cpp">
@ -224,15 +233,6 @@
<ClCompile Include="CompatHooks.cpp"> <ClCompile Include="CompatHooks.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="CompatDirect3d.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CompatDirect3dDevice.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CompatDepthBuffer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CompatD3dDdiDeviceFuncs.cpp"> <ClCompile Include="CompatD3dDdiDeviceFuncs.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -311,6 +311,18 @@
<ClCompile Include="DDraw\DirectDrawSurface.cpp"> <ClCompile Include="DDraw\DirectDrawSurface.cpp">
<Filter>Source Files\DDraw</Filter> <Filter>Source Files\DDraw</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Direct3d\Direct3d.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
<ClCompile Include="Direct3d\Direct3dDevice.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
<ClCompile Include="Direct3d\DepthBuffer.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
<ClCompile Include="Direct3d\Hooks.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="DDrawCompat.def"> <None Include="DDrawCompat.def">

View File

@ -1,7 +1,7 @@
#include <algorithm> #include <algorithm>
#include <vector> #include <vector>
#include "CompatDepthBuffer.h" #include "Direct3d/DepthBuffer.h"
namespace namespace
{ {
@ -101,24 +101,27 @@ namespace
} }
} }
namespace CompatDepthBuffer namespace Direct3d
{ {
template <typename TDirect3d, typename TD3dDeviceDesc> namespace DepthBuffer
void fixSupportedZBufferBitDepths(
CompatPtr<TDirect3d> d3d, TD3dDeviceDesc& desc)
{ {
if (isHardwareZBufferSupported(desc)) template <typename TDirect3d, typename TD3dDeviceDesc>
void fixSupportedZBufferBitDepths(
CompatPtr<TDirect3d> d3d, TD3dDeviceDesc& desc)
{ {
const DWORD supportedBitDepths = getSupportedZBufferBitDepths(d3d, getDeviceGuid(desc)); if (isHardwareZBufferSupported(desc))
if (0 != supportedBitDepths && supportedBitDepths != desc.dwDeviceZBufferBitDepth)
{ {
logSupportedZBufferBitDepthsChanged( const DWORD supportedBitDepths = getSupportedZBufferBitDepths(d3d, getDeviceGuid(desc));
d3d, getDeviceGuid(desc), desc.dwDeviceZBufferBitDepth, supportedBitDepths); if (0 != supportedBitDepths && supportedBitDepths != desc.dwDeviceZBufferBitDepth)
desc.dwDeviceZBufferBitDepth = supportedBitDepths; {
logSupportedZBufferBitDepthsChanged(
d3d, getDeviceGuid(desc), desc.dwDeviceZBufferBitDepth, supportedBitDepths);
desc.dwDeviceZBufferBitDepth = supportedBitDepths;
}
} }
} }
}
template void fixSupportedZBufferBitDepths(CompatPtr<IDirect3D3>, D3DDEVICEDESC&); template void fixSupportedZBufferBitDepths(CompatPtr<IDirect3D3>, D3DDEVICEDESC&);
template void fixSupportedZBufferBitDepths(CompatPtr<IDirect3D7>, D3DDEVICEDESC7&); template void fixSupportedZBufferBitDepths(CompatPtr<IDirect3D7>, D3DDEVICEDESC7&);
}
} }

View File

@ -0,0 +1,14 @@
#pragma once
#include <guiddef.h>
#include "CompatPtr.h"
namespace Direct3d
{
namespace DepthBuffer
{
template <typename TDirect3d, typename TD3dDeviceDesc>
void fixSupportedZBufferBitDepths(CompatPtr<TDirect3d> d3d, TD3dDeviceDesc& desc);
}
}

View File

@ -1,7 +1,7 @@
#include "CompatDepthBuffer.h"
#include "CompatDirect3d.h"
#include "CompatPtr.h" #include "CompatPtr.h"
#include "Direct3dTypes.h" #include "Direct3d/DepthBuffer.h"
#include "Direct3d/Direct3d.h"
#include "Direct3d/Types.h"
namespace namespace
{ {
@ -9,7 +9,7 @@ namespace
struct EnumDevicesParams struct EnumDevicesParams
{ {
CompatPtr<TDirect3d> d3d; CompatPtr<TDirect3d> d3d;
typename Types<TDirect3d>::TD3dEnumDevicesCallback enumDevicesCallback; typename Direct3d::Types<TDirect3d>::TD3dEnumDevicesCallback enumDevicesCallback;
void* userArg; void* userArg;
}; };
@ -22,7 +22,7 @@ namespace
LPVOID lpContext) LPVOID lpContext)
{ {
auto& params = *reinterpret_cast<EnumDevicesParams<IDirect3D3>*>(lpContext); auto& params = *reinterpret_cast<EnumDevicesParams<IDirect3D3>*>(lpContext);
CompatDepthBuffer::fixSupportedZBufferBitDepths<IDirect3D3>(params.d3d, *lpD3DHWDeviceDesc); Direct3d::DepthBuffer::fixSupportedZBufferBitDepths<IDirect3D3>(params.d3d, *lpD3DHWDeviceDesc);
return params.enumDevicesCallback(lpGuid, lpDeviceDescription, lpDeviceName, return params.enumDevicesCallback(lpGuid, lpDeviceDescription, lpDeviceName,
lpD3DHWDeviceDesc, lpD3DHELDeviceDesc, params.userArg); lpD3DHWDeviceDesc, lpD3DHELDeviceDesc, params.userArg);
} }
@ -34,7 +34,7 @@ namespace
LPVOID lpContext) LPVOID lpContext)
{ {
auto& params = *reinterpret_cast<EnumDevicesParams<IDirect3D7>*>(lpContext); auto& params = *reinterpret_cast<EnumDevicesParams<IDirect3D7>*>(lpContext);
CompatDepthBuffer::fixSupportedZBufferBitDepths<IDirect3D7>(params.d3d, *lpD3DDeviceDesc); Direct3d::DepthBuffer::fixSupportedZBufferBitDepths<IDirect3D7>(params.d3d, *lpD3DDeviceDesc);
return params.enumDevicesCallback(lpDeviceDescription, lpDeviceName, return params.enumDevicesCallback(lpDeviceDescription, lpDeviceName,
lpD3DDeviceDesc, params.userArg); lpD3DDeviceDesc, params.userArg);
} }
@ -49,7 +49,7 @@ namespace
This, lpEnumDevicesCallback, lpUserArg); This, lpEnumDevicesCallback, lpUserArg);
} }
typedef typename Types<TDirect3d>::TDirect3dHighest TDirect3dHighest; typedef typename Direct3d::Types<TDirect3d>::TDirect3dHighest TDirect3dHighest;
CompatPtr<TDirect3dHighest> d3d(Compat::queryInterface<TDirect3dHighest>(This)); CompatPtr<TDirect3dHighest> d3d(Compat::queryInterface<TDirect3dHighest>(This));
EnumDevicesParams<TDirect3dHighest> params = { d3d, lpEnumDevicesCallback, lpUserArg }; EnumDevicesParams<TDirect3dHighest> params = { d3d, lpEnumDevicesCallback, lpUserArg };
@ -58,14 +58,17 @@ namespace
} }
} }
template <typename TDirect3d> namespace Direct3d
void CompatDirect3d<TDirect3d>::setCompatVtable(Vtable<TDirect3d>& vtable)
{ {
vtable.EnumDevices = &enumDevices; template <typename TDirect3d>
// No need to fix FindDevice since it uses EnumDevices void Direct3d<TDirect3d>::setCompatVtable(Vtable<TDirect3d>& vtable)
} {
vtable.EnumDevices = &enumDevices;
// No need to fix FindDevice since it uses EnumDevices
}
template CompatDirect3d<IDirect3D>; template Direct3d<IDirect3D>;
template CompatDirect3d<IDirect3D2>; template Direct3d<IDirect3D2>;
template CompatDirect3d<IDirect3D3>; template Direct3d<IDirect3D3>;
template CompatDirect3d<IDirect3D7>; template Direct3d<IDirect3D7>;
}

View File

@ -0,0 +1,14 @@
#pragma once
#include "CompatVtable.h"
#include "Direct3dVtblVisitor.h"
namespace Direct3d
{
template <typename TDirect3d>
class Direct3d : public CompatVtable<Direct3d<TDirect3d>, TDirect3d>
{
public:
static void setCompatVtable(Vtable<TDirect3d>& vtable);
};
}

View File

@ -1,21 +1,21 @@
#include "CompatDepthBuffer.h"
#include "CompatDirect3dDevice.h"
#include "CompatPtr.h" #include "CompatPtr.h"
#include "CompatRef.h" #include "CompatRef.h"
#include "Direct3dTypes.h" #include "Direct3d/DepthBuffer.h"
#include "Direct3d/Direct3dDevice.h"
#include "Direct3d/Types.h"
namespace namespace
{ {
template <typename TDirect3dDevice, typename TD3dDeviceDesc> template <typename TDirect3dDevice, typename TD3dDeviceDesc>
void fixSupportedZBufferBitDepths(CompatRef<TDirect3dDevice> d3dDevice, TD3dDeviceDesc& desc) void fixSupportedZBufferBitDepths(CompatRef<TDirect3dDevice> d3dDevice, TD3dDeviceDesc& desc)
{ {
typedef typename Types<TDirect3dDevice>::TDirect3d TDirect3d; typedef typename Direct3d::Types<TDirect3dDevice>::TDirect3d TDirect3d;
CompatPtr<TDirect3d> d3d; CompatPtr<TDirect3d> d3d;
if (SUCCEEDED(CompatVtableBase<TDirect3dDevice>::s_origVtable.GetDirect3D( if (SUCCEEDED(CompatVtableBase<TDirect3dDevice>::s_origVtable.GetDirect3D(
&d3dDevice, &d3d.getRef()))) &d3dDevice, &d3d.getRef())))
{ {
typedef typename Types<TDirect3dDevice>::TDirect3dHighest TDirect3dHighest; typedef typename Direct3d::Types<TDirect3dDevice>::TDirect3dHighest TDirect3dHighest;
CompatDepthBuffer::fixSupportedZBufferBitDepths<TDirect3dHighest>(d3d, desc); Direct3d::DepthBuffer::fixSupportedZBufferBitDepths<TDirect3dHighest>(d3d, desc);
} }
} }
@ -35,13 +35,16 @@ namespace
} }
} }
template <typename TDirect3dDevice> namespace Direct3d
void CompatDirect3dDevice<TDirect3dDevice>::setCompatVtable(Vtable<TDirect3dDevice>& vtable)
{ {
vtable.GetCaps = &getCaps; template <typename TDirect3dDevice>
} void Direct3dDevice<TDirect3dDevice>::setCompatVtable(Vtable<TDirect3dDevice>& vtable)
{
vtable.GetCaps = &getCaps;
}
template CompatDirect3dDevice<IDirect3DDevice>; template Direct3dDevice<IDirect3DDevice>;
template CompatDirect3dDevice<IDirect3DDevice2>; template Direct3dDevice<IDirect3DDevice2>;
template CompatDirect3dDevice<IDirect3DDevice3>; template Direct3dDevice<IDirect3DDevice3>;
template CompatDirect3dDevice<IDirect3DDevice7>; template Direct3dDevice<IDirect3DDevice7>;
}

View File

@ -0,0 +1,14 @@
#pragma once
#include "CompatVtable.h"
#include "Direct3dDeviceVtblVisitor.h"
namespace Direct3d
{
template <typename TDirect3dDevice>
class Direct3dDevice : public CompatVtable<Direct3dDevice<TDirect3dDevice>, TDirect3dDevice>
{
public:
static void setCompatVtable(Vtable<TDirect3dDevice>& vtable);
};
}

View File

@ -0,0 +1,141 @@
#define CINTERFACE
#include <d3d.h>
#include "CompatPtr.h"
#include "CompatRef.h"
#include "DDraw/Repository.h"
#include "DDrawLog.h"
#include "Direct3d/Direct3d.h"
#include "Direct3d/Direct3dDevice.h"
#include "Direct3d/Hooks.h"
namespace
{
void hookDirect3dDevice(CompatRef<IDirect3D3> d3d, CompatRef<IDirectDrawSurface4> renderTarget);
void hookDirect3dDevice7(CompatRef<IDirect3D7> d3d, CompatRef<IDirectDrawSurface7> renderTarget);
template <typename CompatInterface>
void hookVtable(const CompatPtr<typename CompatInterface::Interface>& intf);
template <typename TDirect3d, typename TDirectDraw>
CompatPtr<TDirect3d> createDirect3d(CompatRef<TDirectDraw> dd)
{
CompatPtr<TDirect3d> d3d;
HRESULT result = dd->QueryInterface(&dd, Compat::getIntfId<TDirect3d>(),
reinterpret_cast<void**>(&d3d.getRef()));
if (FAILED(result))
{
Compat::Log() << "Failed to create a Direct3D object for hooking: " << result;
}
return d3d;
}
template <typename TDirect3dDevice, typename TDirect3d, typename TDirectDrawSurface,
typename... Params>
CompatPtr<TDirect3dDevice> createDirect3dDevice(
CompatRef<TDirect3d> d3d, CompatRef<TDirectDrawSurface> renderTarget, Params... params)
{
CompatPtr<TDirect3dDevice> d3dDevice;
HRESULT result = d3d->CreateDevice(
&d3d, IID_IDirect3DRGBDevice, &renderTarget, &d3dDevice.getRef(), params...);
if (FAILED(result))
{
Compat::Log() << "Failed to create a Direct3D device for hooking: " << result;
}
return d3dDevice;
}
CompatPtr<IDirectDrawSurface7> createRenderTarget(CompatRef<IDirectDraw7> dd)
{
DDSURFACEDESC2 desc = {};
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CAPS;
desc.dwWidth = 1;
desc.dwHeight = 1;
desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat);
desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
desc.ddpfPixelFormat.dwRGBBitCount = 32;
desc.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
desc.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
desc.ddpfPixelFormat.dwBBitMask = 0x000000FF;
desc.ddsCaps.dwCaps = DDSCAPS_3DDEVICE;
CompatPtr<IDirectDrawSurface7> renderTarget;
HRESULT result = dd->CreateSurface(&dd, &desc, &renderTarget.getRef(), nullptr);
if (FAILED(result))
{
Compat::Log() << "Failed to create a render target for hooking: " << result;
}
return renderTarget;
}
void hookDirect3d(CompatRef<IDirectDraw> dd, CompatRef<IDirectDrawSurface4> renderTarget)
{
CompatPtr<IDirect3D3> d3d(createDirect3d<IDirect3D3>(dd));
if (d3d)
{
hookVtable<Direct3d::Direct3d<IDirect3D>>(d3d);
hookVtable<Direct3d::Direct3d<IDirect3D2>>(d3d);
hookVtable<Direct3d::Direct3d<IDirect3D3>>(d3d);
hookDirect3dDevice(*d3d, renderTarget);
}
}
void hookDirect3d7(CompatRef<IDirectDraw7> dd, CompatRef<IDirectDrawSurface7> renderTarget)
{
CompatPtr<IDirect3D7> d3d(createDirect3d<IDirect3D7>(dd));
if (d3d)
{
hookVtable<Direct3d::Direct3d<IDirect3D7>>(d3d);
hookDirect3dDevice7(*d3d, renderTarget);
}
}
void hookDirect3dDevice(CompatRef<IDirect3D3> d3d, CompatRef<IDirectDrawSurface4> renderTarget)
{
CompatPtr<IDirect3DDevice3> d3dDevice(
createDirect3dDevice<IDirect3DDevice3>(d3d, renderTarget, nullptr));
hookVtable<Direct3d::Direct3dDevice<IDirect3DDevice>>(d3dDevice);
hookVtable<Direct3d::Direct3dDevice<IDirect3DDevice2>>(d3dDevice);
hookVtable<Direct3d::Direct3dDevice<IDirect3DDevice3>>(d3dDevice);
}
void hookDirect3dDevice7(CompatRef<IDirect3D7> d3d, CompatRef<IDirectDrawSurface7> renderTarget)
{
CompatPtr<IDirect3DDevice7> d3dDevice(
createDirect3dDevice<IDirect3DDevice7>(d3d, renderTarget));
hookVtable<Direct3d::Direct3dDevice<IDirect3DDevice7>>(d3dDevice);
}
template <typename CompatInterface>
void hookVtable(const CompatPtr<typename CompatInterface::Interface>& intf)
{
CompatInterface::hookVtable(intf.get()->lpVtbl);
}
}
namespace Direct3d
{
void installHooks()
{
auto dd7(DDraw::Repository::getDirectDraw());
CompatPtr<IDirectDraw> dd;
CALL_ORIG_DDRAW(DirectDrawCreate, nullptr, &dd.getRef(), nullptr);
if (!dd || !dd7 || FAILED(dd->SetCooperativeLevel(dd, nullptr, DDSCL_NORMAL)))
{
Compat::Log() << "Failed to hook Direct3d interfaces";
return;
}
CompatPtr<IDirectDrawSurface7> renderTarget7(createRenderTarget(*dd7));
if (renderTarget7)
{
CompatPtr<IDirectDrawSurface4> renderTarget4(renderTarget7);
hookDirect3d(*dd, *renderTarget4);
hookDirect3d7(*dd7, *renderTarget7);
}
}
}

View File

@ -0,0 +1,6 @@
#pragma once
namespace Direct3d
{
void installHooks();
}

View File

@ -0,0 +1,57 @@
#pragma once
#define CINTERFACE
#include <d3d.h>
namespace Direct3d
{
struct Types1
{
typedef IDirect3D TDirect3d;
typedef IDirect3D3 TDirect3dHighest;
typedef IDirect3DDevice TDirect3dDevice;
typedef D3DDEVICEDESC TD3dDeviceDesc;
typedef LPD3DENUMDEVICESCALLBACK TD3dEnumDevicesCallback;
};
struct Types2
{
typedef IDirect3D2 TDirect3d;
typedef IDirect3D3 TDirect3dHighest;
typedef IDirect3DDevice2 TDirect3dDevice;
typedef D3DDEVICEDESC TD3dDeviceDesc;
typedef LPD3DENUMDEVICESCALLBACK TD3dEnumDevicesCallback;
};
struct Types3
{
typedef IDirect3D3 TDirect3d;
typedef IDirect3D3 TDirect3dHighest;
typedef IDirect3DDevice3 TDirect3dDevice;
typedef D3DDEVICEDESC TD3dDeviceDesc;
typedef LPD3DENUMDEVICESCALLBACK TD3dEnumDevicesCallback;
};
struct Types7
{
typedef IDirect3D7 TDirect3d;
typedef IDirect3D7 TDirect3dHighest;
typedef IDirect3DDevice7 TDirect3dDevice;
typedef D3DDEVICEDESC7 TD3dDeviceDesc;
typedef LPD3DENUMDEVICESCALLBACK7 TD3dEnumDevicesCallback;
};
template <typename Interface>
struct Types;
template <> struct Types<IDirect3D> : Types1 {};
template <> struct Types<IDirect3D2> : Types2 {};
template <> struct Types<IDirect3D3> : Types3 {};
template <> struct Types<IDirect3D7> : Types7 {};
template <> struct Types<IDirect3DDevice> : Types1 {};
template <> struct Types<IDirect3DDevice2> : Types2 {};
template <> struct Types<IDirect3DDevice3> : Types3 {};
template <> struct Types<IDirect3DDevice7> : Types7 {};
}

View File

@ -1,64 +0,0 @@
#pragma once
#define CINTERFACE
#include <d3d.h>
struct Direct3dTypes
{
typedef IDirect3D TDirect3d;
typedef IDirect3D3 TDirect3dHighest;
typedef IDirect3DDevice TDirect3dDevice;
typedef D3DDEVICEDESC TD3dDeviceDesc;
typedef LPD3DENUMDEVICESCALLBACK TD3dEnumDevicesCallback;
};
struct Direct3dTypes2
{
typedef IDirect3D2 TDirect3d;
typedef IDirect3D3 TDirect3dHighest;
typedef IDirect3DDevice2 TDirect3dDevice;
typedef D3DDEVICEDESC TD3dDeviceDesc;
typedef LPD3DENUMDEVICESCALLBACK TD3dEnumDevicesCallback;
};
struct Direct3dTypes3
{
typedef IDirect3D3 TDirect3d;
typedef IDirect3D3 TDirect3dHighest;
typedef IDirect3DDevice3 TDirect3dDevice;
typedef D3DDEVICEDESC TD3dDeviceDesc;
typedef LPD3DENUMDEVICESCALLBACK TD3dEnumDevicesCallback;
};
struct Direct3dTypes7
{
typedef IDirect3D7 TDirect3d;
typedef IDirect3D7 TDirect3dHighest;
typedef IDirect3DDevice7 TDirect3dDevice;
typedef D3DDEVICEDESC7 TD3dDeviceDesc;
typedef LPD3DENUMDEVICESCALLBACK7 TD3dEnumDevicesCallback;
};
template <typename Interface>
struct Types;
#define D3D_CONCAT(x, y, ...) x##y
#define D3D_TYPES(Interface, ...) \
template <> \
struct Types<D3D_CONCAT(Interface, __VA_ARGS__)> : D3D_CONCAT(Direct3dTypes, __VA_ARGS__) \
{}
D3D_TYPES(IDirect3D);
D3D_TYPES(IDirect3D, 2);
D3D_TYPES(IDirect3D, 3);
D3D_TYPES(IDirect3D, 7);
D3D_TYPES(IDirect3DDevice);
D3D_TYPES(IDirect3DDevice, 2);
D3D_TYPES(IDirect3DDevice, 3);
D3D_TYPES(IDirect3DDevice, 7);
#undef D3D_TYPES
#undef D3D_CONCAT

View File

@ -12,6 +12,7 @@
#include "DDraw/DisplayMode.h" #include "DDraw/DisplayMode.h"
#include "DDraw/Hooks.h" #include "DDraw/Hooks.h"
#include "DDrawProcs.h" #include "DDrawProcs.h"
#include "Direct3d/Hooks.h"
#include "Gdi/Gdi.h" #include "Gdi/Gdi.h"
#include "Time.h" #include "Time.h"
@ -31,6 +32,8 @@ namespace
D3dDdiHooks::installHooks(); D3dDdiHooks::installHooks();
Compat::Log() << "Installing DirectDraw hooks"; Compat::Log() << "Installing DirectDraw hooks";
DDraw::installHooks(); DDraw::installHooks();
Compat::Log() << "Installing Direct3D hooks";
Direct3d::installHooks();
Compat::Log() << "Installing GDI hooks"; Compat::Log() << "Installing GDI hooks";
Gdi::installHooks(); Gdi::installHooks();
Compat::Log() << "Installing registry hooks"; Compat::Log() << "Installing registry hooks";