diff --git a/DDrawCompat/Common/CompatQueryInterface.h b/DDrawCompat/Common/CompatQueryInterface.h
index 629312d..8483241 100644
--- a/DDrawCompat/Common/CompatQueryInterface.h
+++ b/DDrawCompat/Common/CompatQueryInterface.h
@@ -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);
diff --git a/DDrawCompat/DDrawCompat.vcxproj b/DDrawCompat/DDrawCompat.vcxproj
index e534258..5f7435f 100644
--- a/DDrawCompat/DDrawCompat.vcxproj
+++ b/DDrawCompat/DDrawCompat.vcxproj
@@ -196,10 +196,12 @@
+
+
@@ -244,6 +246,7 @@
+
diff --git a/DDrawCompat/DDrawCompat.vcxproj.filters b/DDrawCompat/DDrawCompat.vcxproj.filters
index d7f26b2..17de3a4 100644
--- a/DDrawCompat/DDrawCompat.vcxproj.filters
+++ b/DDrawCompat/DDrawCompat.vcxproj.filters
@@ -264,6 +264,12 @@
Header Files\Direct3d
+
+ Header Files\Direct3d\Visitors
+
+
+ Header Files\Direct3d
+
@@ -398,6 +404,9 @@
Source Files\Direct3d
+
+ Source Files\Direct3d
+
diff --git a/DDrawCompat/Direct3d/Direct3dTexture.cpp b/DDrawCompat/Direct3d/Direct3dTexture.cpp
new file mode 100644
index 0000000..fa0201f
--- /dev/null
+++ b/DDrawCompat/Direct3d/Direct3dTexture.cpp
@@ -0,0 +1,12 @@
+#include "Direct3d/Direct3dTexture.h"
+
+namespace Direct3d
+{
+ template
+ void Direct3dTexture::setCompatVtable(Vtable& /*vtable*/)
+ {
+ }
+
+ template Direct3dTexture;
+ template Direct3dTexture;
+}
diff --git a/DDrawCompat/Direct3d/Direct3dTexture.h b/DDrawCompat/Direct3d/Direct3dTexture.h
new file mode 100644
index 0000000..bdae7bb
--- /dev/null
+++ b/DDrawCompat/Direct3d/Direct3dTexture.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "Common/CompatVtable.h"
+#include "Direct3d/Visitors/Direct3dTextureVtblVisitor.h"
+
+namespace Direct3d
+{
+ template
+ class Direct3dTexture : public CompatVtable>
+ {
+ public:
+ static void setCompatVtable(Vtable& vtable);
+ };
+}
+
+SET_COMPAT_VTABLE(IDirect3DTextureVtbl, Direct3d::Direct3dTexture);
+SET_COMPAT_VTABLE(IDirect3DTexture2Vtbl, Direct3d::Direct3dTexture);
diff --git a/DDrawCompat/Direct3d/Hooks.cpp b/DDrawCompat/Direct3d/Hooks.cpp
index 4e05c8c..f15d522 100644
--- a/DDrawCompat/Direct3d/Hooks.cpp
+++ b/DDrawCompat/Direct3d/Hooks.cpp
@@ -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 d3d, CompatRef renderTarget);
void hookDirect3dDevice7(CompatRef d3d, CompatRef renderTarget);
+ void hookDirect3dTexture(CompatRef dd);
void hookDirect3dViewport(CompatRef d3d);
template
@@ -82,6 +84,7 @@ namespace
hookVtable(d3d);
hookVtable(d3d);
hookDirect3dDevice(*d3d, renderTarget);
+ hookDirect3dTexture(dd);
hookDirect3dViewport(*d3d);
}
}
@@ -114,6 +117,27 @@ namespace
hookVtable(d3dDevice);
}
+ void hookDirect3dTexture(CompatRef 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 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(texture);
+ hookVtable(texture);
+ }
+
void hookDirect3dViewport(CompatRef d3d)
{
CompatPtr viewport;
diff --git a/DDrawCompat/Direct3d/Visitors/Direct3dTextureVtblVisitor.h b/DDrawCompat/Direct3d/Visitors/Direct3dTextureVtblVisitor.h
new file mode 100644
index 0000000..4418a91
--- /dev/null
+++ b/DDrawCompat/Direct3d/Visitors/Direct3dTextureVtblVisitor.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#define CINTERFACE
+
+#include
+
+#include "Common/VtableVisitor.h"
+
+template <>
+struct VtableForEach
+{
+ template
+ static void forEach(Visitor& visitor)
+ {
+ VtableForEach::forEach(visitor);
+
+ DD_VISIT(Initialize);
+ DD_VISIT(GetHandle);
+ DD_VISIT(PaletteChanged);
+ DD_VISIT(Load);
+ DD_VISIT(Unload);
+ }
+};
+
+template <>
+struct VtableForEach
+{
+ template
+ static void forEach(Visitor& visitor)
+ {
+ VtableForEach::forEach(visitor);
+
+ DD_VISIT(GetHandle);
+ DD_VISIT(PaletteChanged);
+ DD_VISIT(Load);
+ }
+};