[PATCH 2/2] ddraw: Accept d3d1 and d3d2 versions of D3DFINDDEVICERESULT in IDirect3D_FindDevice.
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Tue Sep 4 00:21:34 CDT 2018
Based off a patch by Michael Muller.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
dlls/ddraw/ddraw.c | 40 ++++++++++++++++++++++++++++++++++++----
dlls/ddraw/tests/d3d.c | 29 ++++++++++++++++++++++++++++-
2 files changed, 64 insertions(+), 5 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index e60c5f3..fe81f90 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -25,6 +25,8 @@
#include "wine/port.h"
#include "ddraw_private.h"
+#include "ddrawi.h"
+#include "d3dhal.h"
#include "wine/exception.h"
@@ -74,6 +76,20 @@ static struct enum_device_entry
},
};
+typedef struct _D3DFINDDEVICERESULT1 {
+ DWORD dwSize;
+ GUID guid;
+ D3DDEVICEDESC_V1 ddHwDesc;
+ D3DDEVICEDESC_V1 ddSwDesc;
+} D3DFINDDEVICERESULT_V1;
+
+typedef struct _D3DFINDDEVICERESULT2 {
+ DWORD dwSize;
+ GUID guid;
+ D3DDEVICEDESC_V2 ddHwDesc;
+ D3DDEVICEDESC_V2 ddSwDesc;
+} D3DFINDDEVICERESULT_V2;
+
static void STDMETHODCALLTYPE ddraw_null_wined3d_object_destroyed(void *parent) {}
const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops =
@@ -4045,8 +4061,8 @@ static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fd
if (!fds || !fdr) return DDERR_INVALIDPARAMS;
- if (fds->dwSize != sizeof(D3DFINDDEVICESEARCH)
- || fdr->dwSize != sizeof(D3DFINDDEVICERESULT))
+ if (fds->dwSize != sizeof(D3DFINDDEVICESEARCH) || (fdr->dwSize != sizeof(D3DFINDDEVICERESULT_V1) &&
+ fdr->dwSize != sizeof(D3DFINDDEVICERESULT_V2) && fdr->dwSize != sizeof(D3DFINDDEVICERESULT)))
return DDERR_INVALIDPARAMS;
if ((fds->dwFlags & D3DFDS_COLORMODEL)
@@ -4075,8 +4091,24 @@ static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fd
/* Now return our own GUID */
ddraw_d3dcaps1_from_7(&desc1, &desc7);
fdr->guid = IID_D3DDEVICE_WineD3D;
- fdr->ddHwDesc = desc1;
- fdr->ddSwDesc = desc1;
+
+ if (fdr->dwSize == sizeof(D3DFINDDEVICERESULT_V1))
+ {
+ D3DFINDDEVICERESULT_V1 *fdr1 = (D3DFINDDEVICERESULT_V1 *)fdr;
+ memcpy(&fdr1->ddHwDesc, &desc1, sizeof(fdr1->ddHwDesc));
+ memcpy(&fdr1->ddSwDesc, &desc1, sizeof(fdr1->ddSwDesc));
+ }
+ else if (fdr->dwSize == sizeof(D3DFINDDEVICERESULT_V2))
+ {
+ D3DFINDDEVICERESULT_V2 *fdr2 = (D3DFINDDEVICERESULT_V2 *)fdr;
+ memcpy(&fdr2->ddHwDesc, &desc1, sizeof(fdr2->ddHwDesc));
+ memcpy(&fdr2->ddSwDesc, &desc1, sizeof(fdr2->ddSwDesc));
+ }
+ else
+ {
+ fdr->ddHwDesc = desc1;
+ fdr->ddSwDesc = desc1;
+ }
TRACE("Returning Wine's wined3d device with (undumped) capabilities.\n");
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index ec0f8d7..2234399 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -27,6 +27,8 @@
#include "initguid.h"
#include "ddraw.h"
#include "d3d.h"
+#include "ddrawi.h"
+#include "d3dhal.h"
#include "unknwn.h"
static IDirectDraw7 *lpDD;
@@ -44,6 +46,20 @@ static IDirect3DExecuteBuffer *ExecuteBuffer = NULL;
static IDirect3DViewport *Viewport = NULL;
static IDirect3DLight *Light = NULL;
+typedef struct _D3DFINDDEVICERESULT1 {
+ DWORD dwSize;
+ GUID guid;
+ D3DDEVICEDESC_V1 ddHwDesc;
+ D3DDEVICEDESC_V1 ddSwDesc;
+} D3DFINDDEVICERESULT_V1;
+
+typedef struct _D3DFINDDEVICERESULT2 {
+ DWORD dwSize;
+ GUID guid;
+ D3DDEVICEDESC_V2 ddHwDesc;
+ D3DDEVICEDESC_V2 ddSwDesc;
+} D3DFINDDEVICERESULT_V2;
+
typedef struct {
int total;
int rgb;
@@ -1628,7 +1644,6 @@ static void FindDevice(void)
&IID_IDirect3DRefDevice,
&IID_IDirect3DTnLHalDevice,
&IID_IDirect3DNullDevice};
-
D3DFINDDEVICESEARCH search = {0};
D3DFINDDEVICERESULT result = {0};
IDirect3DDevice *d3dhal;
@@ -1671,6 +1686,18 @@ static void FindDevice(void)
ok(hr == D3D_OK,
"Expected IDirect3D1::FindDevice to return D3D_OK, got 0x%08x\n", hr);
+ result.dwSize = sizeof(D3DFINDDEVICERESULT_V1);
+
+ hr = IDirect3D_FindDevice(Direct3D1, &search, (D3DFINDDEVICERESULT *)&result);
+ ok(hr == D3D_OK,
+ "Expected IDirect3D1::FindDevice to return D3D_OK, got 0x%08x\n", hr);
+
+ result.dwSize = sizeof(D3DFINDDEVICERESULT_V2);
+
+ hr = IDirect3D_FindDevice(Direct3D1, &search, (D3DFINDDEVICERESULT *)&result);
+ ok(hr == D3D_OK,
+ "Expected IDirect3D1::FindDevice to return D3D_OK, got 0x%08x\n", hr);
+
/* Try an arbitrary non-device GUID. */
search.dwSize = sizeof(search);
search.dwFlags = D3DFDS_GUID;
--
1.9.1
More information about the wine-devel
mailing list