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

Hooked the IDirect3DTexture interfaces

This commit is contained in:
narzoul 2016-10-15 16:31:45 +02:00
parent 6e95f7ca1b
commit 2d22ace9f1
7 changed files with 106 additions and 0 deletions

View File

@ -47,6 +47,8 @@ namespace Compat
DEFINE_BASE_INTF(IDirect3D7, IDirectDraw);
DEFINE_BASE_INTF(IDirect3DDevice2, IDirect3DDevice);
DEFINE_BASE_INTF(IDirect3DDevice3, IDirect3DDevice);
DEFINE_BASE_INTF(IDirect3DTexture, IDirectDrawSurface);
DEFINE_BASE_INTF(IDirect3DTexture2, IDirectDrawSurface);
DEFINE_BASE_INTF(IDirect3DViewport2, IDirect3DViewport);
DEFINE_BASE_INTF(IDirect3DViewport3, IDirect3DViewport);
@ -80,6 +82,8 @@ namespace Compat
DEFINE_INTF_ID(IDirect3DDevice2);
DEFINE_INTF_ID(IDirect3DDevice3);
DEFINE_INTF_ID(IDirect3DDevice7);
DEFINE_INTF_ID(IDirect3DTexture);
DEFINE_INTF_ID(IDirect3DTexture2);
DEFINE_INTF_ID(IDirect3DViewport);
DEFINE_INTF_ID(IDirect3DViewport2);
DEFINE_INTF_ID(IDirect3DViewport3);

View File

@ -196,10 +196,12 @@
<ClInclude Include="Direct3d\DepthBuffer.h" />
<ClInclude Include="Direct3d\Direct3d.h" />
<ClInclude Include="Direct3d\Direct3dDevice.h" />
<ClInclude Include="Direct3d\Direct3dTexture.h" />
<ClInclude Include="Direct3d\Direct3dViewport.h" />
<ClInclude Include="Direct3d\Hooks.h" />
<ClInclude Include="Direct3d\Types.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dDeviceVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dTextureVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dViewportVtblVisitor.h" />
<ClInclude Include="Direct3d\Visitors\Direct3dVtblVisitor.h" />
<ClInclude Include="Dll\Procs.h" />
@ -244,6 +246,7 @@
<ClCompile Include="Direct3d\DepthBuffer.cpp" />
<ClCompile Include="Direct3d\Direct3d.cpp" />
<ClCompile Include="Direct3d\Direct3dDevice.cpp" />
<ClCompile Include="Direct3d\Direct3dTexture.cpp" />
<ClCompile Include="Direct3d\Direct3dViewport.cpp" />
<ClCompile Include="Direct3d\Hooks.cpp" />
<ClCompile Include="Dll\Procs.cpp" />

View File

@ -264,6 +264,12 @@
<ClInclude Include="Direct3d\Direct3dViewport.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Visitors\Direct3dTextureVtblVisitor.h">
<Filter>Header Files\Direct3d\Visitors</Filter>
</ClInclude>
<ClInclude Include="Direct3d\Direct3dTexture.h">
<Filter>Header Files\Direct3d</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Gdi\Gdi.cpp">
@ -398,6 +404,9 @@
<ClCompile Include="Direct3d\Direct3dViewport.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
<ClCompile Include="Direct3d\Direct3dTexture.cpp">
<Filter>Source Files\Direct3d</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="Dll\DDrawCompat.def">

View File

@ -0,0 +1,12 @@
#include "Direct3d/Direct3dTexture.h"
namespace Direct3d
{
template <typename TDirect3dTexture>
void Direct3dTexture<TDirect3dTexture>::setCompatVtable(Vtable<TDirect3dTexture>& /*vtable*/)
{
}
template Direct3dTexture<IDirect3DTexture>;
template Direct3dTexture<IDirect3DTexture2>;
}

View File

@ -0,0 +1,17 @@
#pragma once
#include "Common/CompatVtable.h"
#include "Direct3d/Visitors/Direct3dTextureVtblVisitor.h"
namespace Direct3d
{
template <typename TDirect3dTexture>
class Direct3dTexture : public CompatVtable<Vtable<TDirect3dTexture>>
{
public:
static void setCompatVtable(Vtable<TDirect3dTexture>& vtable);
};
}
SET_COMPAT_VTABLE(IDirect3DTextureVtbl, Direct3d::Direct3dTexture<IDirect3DTexture>);
SET_COMPAT_VTABLE(IDirect3DTexture2Vtbl, Direct3d::Direct3dTexture<IDirect3DTexture2>);

View File

@ -8,6 +8,7 @@
#include "DDraw/Repository.h"
#include "Direct3d/Direct3d.h"
#include "Direct3d/Direct3dDevice.h"
#include "Direct3d/Direct3dTexture.h"
#include "Direct3d/Direct3dViewport.h"
#include "Direct3d/Hooks.h"
#include "Dll/Procs.h"
@ -16,6 +17,7 @@ namespace
{
void hookDirect3dDevice(CompatRef<IDirect3D3> d3d, CompatRef<IDirectDrawSurface4> renderTarget);
void hookDirect3dDevice7(CompatRef<IDirect3D7> d3d, CompatRef<IDirectDrawSurface7> renderTarget);
void hookDirect3dTexture(CompatRef<IDirectDraw> dd);
void hookDirect3dViewport(CompatRef<IDirect3D3> d3d);
template <typename Interface>
@ -82,6 +84,7 @@ namespace
hookVtable<IDirect3D2>(d3d);
hookVtable<IDirect3D3>(d3d);
hookDirect3dDevice(*d3d, renderTarget);
hookDirect3dTexture(dd);
hookDirect3dViewport(*d3d);
}
}
@ -114,6 +117,27 @@ namespace
hookVtable<IDirect3DDevice7>(d3dDevice);
}
void hookDirect3dTexture(CompatRef<IDirectDraw> dd)
{
DDSURFACEDESC desc = {};
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
desc.dwWidth = 1;
desc.dwHeight = 1;
desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY;
CompatPtr<IDirectDrawSurface> texture;
HRESULT result = dd->CreateSurface(&dd, &desc, &texture.getRef(), nullptr);
if (FAILED(result))
{
Compat::Log() << "Failed to create a texture for hooking: " << result;
return;
}
hookVtable<IDirect3DTexture>(texture);
hookVtable<IDirect3DTexture2>(texture);
}
void hookDirect3dViewport(CompatRef<IDirect3D3> d3d)
{
CompatPtr<IDirect3DViewport3> viewport;

View File

@ -0,0 +1,37 @@
#pragma once
#define CINTERFACE
#include <d3d.h>
#include "Common/VtableVisitor.h"
template <>
struct VtableForEach<IDirect3DTextureVtbl>
{
template <typename Vtable, typename Visitor>
static void forEach(Visitor& visitor)
{
VtableForEach<IUnknownVtbl>::forEach<Vtable>(visitor);
DD_VISIT(Initialize);
DD_VISIT(GetHandle);
DD_VISIT(PaletteChanged);
DD_VISIT(Load);
DD_VISIT(Unload);
}
};
template <>
struct VtableForEach<IDirect3DTexture2Vtbl>
{
template <typename Vtable, typename Visitor>
static void forEach(Visitor& visitor)
{
VtableForEach<IUnknownVtbl>::forEach<Vtable>(visitor);
DD_VISIT(GetHandle);
DD_VISIT(PaletteChanged);
DD_VISIT(Load);
}
};