From d7c4217174337d31778a5582b71b8c98e8a55852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Sun, 28 Feb 2016 05:02:48 +0100 Subject: ddraw: Accept d3d1 and d3d2 versions of D3DFINDDEVICERESULT in IDirect3D_FindDevice. --- dlls/ddraw/ddraw.c | 24 +++++++++++++++++++---- dlls/ddraw/tests/d3d.c | 14 ++++++++++++++ include/d3dcaps.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 4 deletions(-) diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 782b6b5..0d2ec53 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -3992,8 +3992,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(D3DFINDDEVICERESULT1) && + fdr->dwSize != sizeof(D3DFINDDEVICERESULT2) && fdr->dwSize != sizeof(D3DFINDDEVICERESULT))) return DDERR_INVALIDPARAMS; if ((fds->dwFlags & D3DFDS_COLORMODEL) @@ -4022,8 +4022,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(D3DFINDDEVICERESULT1)) + { + D3DFINDDEVICERESULT1 *fdr1 = (D3DFINDDEVICERESULT1 *)fdr; + memcpy(&fdr1->ddHwDesc, &desc1, sizeof(fdr1->ddHwDesc)); + memcpy(&fdr1->ddSwDesc, &desc1, sizeof(fdr1->ddSwDesc)); + } + else if (fdr->dwSize == sizeof(D3DFINDDEVICERESULT2)) + { + D3DFINDDEVICERESULT2 *fdr2 = (D3DFINDDEVICERESULT2 *)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 06f16f3..12db306 100644 --- a/dlls/ddraw/tests/d3d.c +++ b/dlls/ddraw/tests/d3d.c @@ -3211,6 +3211,8 @@ static void FindDevice(void) D3DFINDDEVICESEARCH search = {0}; D3DFINDDEVICERESULT result = {0}; + D3DFINDDEVICERESULT1 result1 = {0}; + D3DFINDDEVICERESULT2 result2 = {0}; IDirect3DDevice *d3dhal; HRESULT hr; int i; @@ -3251,6 +3253,18 @@ static void FindDevice(void) ok(hr == D3D_OK, "Expected IDirect3D1::FindDevice to return D3D_OK, got 0x%08x\n", hr); + result1.dwSize = sizeof(result1); + + hr = IDirect3D_FindDevice(Direct3D1, &search, (D3DFINDDEVICERESULT *)&result1); + ok(hr == D3D_OK, + "Expected IDirect3D1::FindDevice to return D3D_OK, got 0x%08x\n", hr); + + result2.dwSize = sizeof(result2); + + hr = IDirect3D_FindDevice(Direct3D1, &search, (D3DFINDDEVICERESULT *)&result2); + 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; diff --git a/include/d3dcaps.h b/include/d3dcaps.h index 4fc76ba..51e3efa 100644 --- a/include/d3dcaps.h +++ b/include/d3dcaps.h @@ -193,6 +193,44 @@ typedef struct _D3dPrimCaps { #define D3DPTADDRESSCAPS_BORDER 0x00000008 #define D3DPTADDRESSCAPS_INDEPENDENTUV 0x00000010 +typedef struct _D3DDeviceDesc1 { + DWORD dwSize; + DWORD dwFlags; + D3DCOLORMODEL dcmColorModel; + DWORD dwDevCaps; + D3DTRANSFORMCAPS dtcTransformCaps; + BOOL bClipping; + D3DLIGHTINGCAPS dlcLightingCaps; + D3DPRIMCAPS dpcLineCaps; + D3DPRIMCAPS dpcTriCaps; + DWORD dwDeviceRenderBitDepth; + DWORD dwDeviceZBufferBitDepth; + DWORD dwMaxBufferSize; + DWORD dwMaxVertexCount; +} D3DDEVICEDESC1,*LPD3DDEVICEDESC1; +#define D3DDEVICEDESCSIZE1 (sizeof(D3DDEVICEDESC1)) + +typedef struct _D3DDeviceDesc2 { + DWORD dwSize; + DWORD dwFlags; + D3DCOLORMODEL dcmColorModel; + DWORD dwDevCaps; + D3DTRANSFORMCAPS dtcTransformCaps; + BOOL bClipping; + D3DLIGHTINGCAPS dlcLightingCaps; + D3DPRIMCAPS dpcLineCaps; + D3DPRIMCAPS dpcTriCaps; + DWORD dwDeviceRenderBitDepth; + DWORD dwDeviceZBufferBitDepth; + DWORD dwMaxBufferSize; + DWORD dwMaxVertexCount; + + DWORD dwMinTextureWidth,dwMinTextureHeight; + DWORD dwMaxTextureWidth,dwMaxTextureHeight; + DWORD dwMinStippleWidth,dwMaxStippleWidth; + DWORD dwMinStippleHeight,dwMaxStippleHeight; +} D3DDEVICEDESC2,*LPD3DDEVICEDESC2; +#define D3DDEVICEDESCSIZE2 (sizeof(D3DDEVICEDESC2)) typedef struct _D3DDeviceDesc { DWORD dwSize; @@ -382,6 +420,20 @@ typedef struct _D3DFINDDEVICESEARCH { D3DPRIMCAPS dpcPrimCaps; } D3DFINDDEVICESEARCH,*LPD3DFINDDEVICESEARCH; +typedef struct _D3DFINDDEVICERESULT1 { + DWORD dwSize; + GUID guid; + D3DDEVICEDESC1 ddHwDesc; + D3DDEVICEDESC1 ddSwDesc; +} D3DFINDDEVICERESULT1,*LPD3DFINDDEVICERESULT1; + +typedef struct _D3DFINDDEVICERESULT2 { + DWORD dwSize; + GUID guid; + D3DDEVICEDESC2 ddHwDesc; + D3DDEVICEDESC2 ddSwDesc; +} D3DFINDDEVICERESULT2,*LPD3DFINDDEVICERESULT2; + typedef struct _D3DFINDDEVICERESULT { DWORD dwSize; GUID guid; -- 2.7.1