diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 170a5492784..c83d0ca1568 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" @@ -4019,20 +4021,44 @@ static HRESULT WINAPI d3d1_CreateViewport(IDirect3D *iface, IDirect3DViewport ** } static HRESULT ddraw_find_device(struct ddraw *ddraw, const D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr, - unsigned int guid_count, const GUID * const *guids) + unsigned int guid_count, const GUID * const *guids, DWORD device_desc_size) { + struct ddraw_find_device_result_v1 + { + DWORD size; + GUID guid; + D3DDEVICEDESC_V1 hw_desc; + D3DDEVICEDESC_V1 sw_desc; + } *fdr1; + struct ddraw_find_device_result_v2 + { + DWORD size; + GUID guid; + D3DDEVICEDESC_V2 hw_desc; + D3DDEVICEDESC_V2 sw_desc; + } *fdr2; D3DDEVICEDESC7 desc7; D3DDEVICEDESC desc1; unsigned int i; HRESULT hr; - TRACE("ddraw %p, fds %p, fdr %p, guid_count %u, guids %p.\n", ddraw, fds, fdr, guid_count, guids); + TRACE("ddraw %p, fds %p, fdr %p, guid_count %u, guids %p, device_desc_size %u.\n", + ddraw, fds, fdr, guid_count, guids, device_desc_size); if (!fds || !fdr) return DDERR_INVALIDPARAMS; - if (fds->dwSize != sizeof(*fds) || fdr->dwSize != sizeof(*fdr)) + if (fds->dwSize != sizeof(*fds)) + { + WARN("Got invalid search structure size %u.\n", fds->dwSize); return DDERR_INVALIDPARAMS; + } + + if (fdr->dwSize != sizeof(*fdr) && fdr->dwSize != sizeof(*fdr2) && fdr->dwSize != sizeof(*fdr1)) + { + WARN("Got invalid result structure size %u.\n", fdr->dwSize); + return DDERR_INVALIDPARAMS; + } if (fds->dwFlags & D3DFDS_COLORMODEL) WARN("Ignoring colour model %#x.\n", fds->dcmColorModel); @@ -4066,8 +4092,33 @@ static HRESULT ddraw_find_device(struct ddraw *ddraw, const D3DFINDDEVICESEARCH /* Now return our own GUID */ ddraw_d3dcaps1_from_7(&desc1, &desc7); fdr->guid = IID_D3DDEVICE_WineD3D; - fdr->ddHwDesc = desc1; - fdr->ddSwDesc = desc1; + + /* Note that "device_desc_size" doesn't necessarily have any relation to + * the actual structure size. However, this matches the behaviour of + * Windows since at least Windows 2000. */ + if (fdr->dwSize == sizeof(*fdr1)) + { + fdr1 = (struct ddraw_find_device_result_v1 *)fdr; + memcpy(&fdr1->hw_desc, &desc1, sizeof(fdr1->hw_desc)); + fdr1->hw_desc.dwSize = device_desc_size; + memcpy(&fdr1->sw_desc, &desc1, sizeof(fdr1->sw_desc)); + fdr1->sw_desc.dwSize = device_desc_size; + } + else if (fdr->dwSize == sizeof(*fdr2)) + { + fdr2 = (struct ddraw_find_device_result_v2 *)fdr; + memcpy(&fdr2->hw_desc, &desc1, sizeof(fdr2->hw_desc)); + fdr2->hw_desc.dwSize = device_desc_size; + memcpy(&fdr2->sw_desc, &desc1, sizeof(fdr2->sw_desc)); + fdr2->sw_desc.dwSize = device_desc_size; + } + else + { + fdr->ddHwDesc = desc1; + fdr->ddHwDesc.dwSize = device_desc_size; + fdr->ddSwDesc = desc1; + fdr->ddSwDesc.dwSize = device_desc_size; + } TRACE("Returning Wine's wined3d device with (undumped) capabilities.\n"); @@ -4086,7 +4137,7 @@ static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fd TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr); - return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids); + return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids, sizeof(D3DDEVICEDESC_V3)); } static HRESULT WINAPI d3d2_FindDevice(IDirect3D2 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr) @@ -4103,7 +4154,7 @@ static HRESULT WINAPI d3d2_FindDevice(IDirect3D2 *iface, D3DFINDDEVICESEARCH *fd TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr); - return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids); + return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids, sizeof(D3DDEVICEDESC_V2)); } static HRESULT WINAPI d3d1_FindDevice(IDirect3D *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr) @@ -4119,7 +4170,7 @@ static HRESULT WINAPI d3d1_FindDevice(IDirect3D *iface, D3DFINDDEVICESEARCH *fds TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr); - return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids); + return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids, sizeof(D3DDEVICEDESC_V1)); } /***************************************************************************** diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index ba9f128dad7..ee4fa5bfaab 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -22,7 +22,8 @@ #include "wine/test.h" #include #include -#include "d3d.h" +#include "ddrawi.h" +#include "d3dhal.h" static BOOL is_ddraw64 = sizeof(DWORD) != sizeof(DWORD *); static DEVMODEW registry_mode; @@ -11724,6 +11725,22 @@ static void test_find_device(void) HWND window; HRESULT hr; + struct + { + DWORD size; + GUID guid; + D3DDEVICEDESC_V1 hw_desc; + D3DDEVICEDESC_V1 sw_desc; + } result_v1; + + struct + { + DWORD size; + GUID guid; + D3DDEVICEDESC_V2 hw_desc; + D3DDEVICEDESC_V2 sw_desc; + } result_v2; + static const struct { const GUID *guid; @@ -11761,6 +11778,10 @@ static void test_find_device(void) hr = IDirect3D_FindDevice(d3d, &search, &result); ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); ok(result.dwSize == sizeof(result), "Got unexpected result size %u.\n", result.dwSize); + ok(result.ddHwDesc.dwSize == sizeof(result_v1.hw_desc), + "Got unexpected HW desc size %u.\n", result.ddHwDesc.dwSize); + ok(result.ddSwDesc.dwSize == sizeof(result_v1.sw_desc), + "Got unexpected SW desc size %u.\n", result.ddSwDesc.dwSize); memset(&search, 0, sizeof(search)); memset(&result, 0, sizeof(result)); @@ -11772,6 +11793,26 @@ static void test_find_device(void) hr = IDirect3D_FindDevice(d3d, &search, &result); ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + search.dwSize = sizeof(search); + + memset(&result_v1, 0, sizeof(result_v1)); + result_v1.size = sizeof(result_v1); + hr = IDirect3D_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v1); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(result_v1.hw_desc.dwSize == sizeof(result_v1.hw_desc), + "Got unexpected HW desc size %u.\n", result_v1.hw_desc.dwSize); + ok(result_v1.sw_desc.dwSize == sizeof(result_v1.sw_desc), + "Got unexpected SW desc size %u.\n", result_v1.sw_desc.dwSize); + + memset(&result_v2, 0, sizeof(result_v2)); + result_v2.size = sizeof(result_v2); + hr = IDirect3D_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v2); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(result_v2.hw_desc.dwSize == sizeof(result_v1.hw_desc), + "Got unexpected HW desc size %u.\n", result_v2.hw_desc.dwSize); + ok(result_v2.sw_desc.dwSize == sizeof(result_v1.sw_desc), + "Got unexpected SW desc size %u.\n", result_v2.sw_desc.dwSize); + for (i = 0; i < ARRAY_SIZE(tests); ++i) { memset(&search, 0, sizeof(search)); @@ -11785,6 +11826,20 @@ static void test_find_device(void) hr = IDirect3D_FindDevice(d3d, &search, &result); ok(hr == tests[i].hr, "Test %u: Got unexpected hr %#x.\n", i, hr); ok(result.dwSize == sizeof(result), "Test %u: Got unexpected result size %u.\n", i, result.dwSize); + if (SUCCEEDED(hr)) + { + ok(result.ddHwDesc.dwSize == sizeof(result_v1.hw_desc), + "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize); + ok(result.ddSwDesc.dwSize == sizeof(result_v1.sw_desc), + "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize); + } + else + { + ok(!result.ddHwDesc.dwSize, + "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize); + ok(!result.ddSwDesc.dwSize, + "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize); + } } /* The HAL device can only be enumerated if hardware acceleration is present. */ diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index b5739c3ab4d..9394705330a 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -24,7 +24,8 @@ #include "wine/test.h" #include #include -#include "d3d.h" +#include "ddrawi.h" +#include "d3dhal.h" static BOOL is_ddraw64 = sizeof(DWORD) != sizeof(DWORD *); static DEVMODEW registry_mode; @@ -13006,6 +13007,22 @@ static void test_find_device(void) HWND window; HRESULT hr; + struct + { + DWORD size; + GUID guid; + D3DDEVICEDESC_V1 hw_desc; + D3DDEVICEDESC_V1 sw_desc; + } result_v1; + + struct + { + DWORD size; + GUID guid; + D3DDEVICEDESC_V2 hw_desc; + D3DDEVICEDESC_V2 sw_desc; + } result_v2; + static const struct { const GUID *guid; @@ -13043,6 +13060,10 @@ static void test_find_device(void) hr = IDirect3D2_FindDevice(d3d, &search, &result); ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); ok(result.dwSize == sizeof(result), "Got unexpected result size %u.\n", result.dwSize); + ok(result.ddHwDesc.dwSize == sizeof(result_v2.hw_desc), + "Got unexpected HW desc size %u.\n", result.ddHwDesc.dwSize); + ok(result.ddSwDesc.dwSize == sizeof(result_v2.sw_desc), + "Got unexpected SW desc size %u.\n", result.ddSwDesc.dwSize); memset(&search, 0, sizeof(search)); memset(&result, 0, sizeof(result)); @@ -13054,6 +13075,26 @@ static void test_find_device(void) hr = IDirect3D2_FindDevice(d3d, &search, &result); ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + search.dwSize = sizeof(search); + + memset(&result_v1, 0, sizeof(result_v1)); + result_v1.size = sizeof(result_v1); + hr = IDirect3D2_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v1); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(result_v1.hw_desc.dwSize == sizeof(result_v2.hw_desc), + "Got unexpected HW desc size %u.\n", result_v1.hw_desc.dwSize); + ok(result_v1.sw_desc.dwSize == sizeof(result_v2.sw_desc), + "Got unexpected SW desc size %u.\n", result_v1.sw_desc.dwSize); + + memset(&result_v2, 0, sizeof(result_v2)); + result_v2.size = sizeof(result_v2); + hr = IDirect3D2_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v2); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(result_v2.hw_desc.dwSize == sizeof(result_v2.hw_desc), + "Got unexpected HW desc size %u.\n", result_v2.hw_desc.dwSize); + ok(result_v2.sw_desc.dwSize == sizeof(result_v2.sw_desc), + "Got unexpected SW desc size %u.\n", result_v2.sw_desc.dwSize); + for (i = 0; i < ARRAY_SIZE(tests); ++i) { memset(&search, 0, sizeof(search)); @@ -13067,6 +13108,20 @@ static void test_find_device(void) hr = IDirect3D2_FindDevice(d3d, &search, &result); ok(hr == tests[i].hr, "Test %u: Got unexpected hr %#x.\n", i, hr); ok(result.dwSize == sizeof(result), "Test %u: Got unexpected result size %u.\n", i, result.dwSize); + if (SUCCEEDED(hr)) + { + ok(result.ddHwDesc.dwSize == sizeof(result_v2.hw_desc), + "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize); + ok(result.ddSwDesc.dwSize == sizeof(result_v2.sw_desc), + "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize); + } + else + { + ok(!result.ddHwDesc.dwSize, + "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize); + ok(!result.ddSwDesc.dwSize, + "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize); + } } /* The HAL device can only be enumerated if hardware acceleration is present. */ diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 337ccb06e42..6a3630a2c0e 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -22,7 +22,8 @@ #include "wine/test.h" #include #include -#include "d3d.h" +#include "ddrawi.h" +#include "d3dhal.h" HRESULT WINAPI GetSurfaceFromDC(HDC dc, struct IDirectDrawSurface **surface, HDC *device_dc); @@ -15100,6 +15101,22 @@ static void test_find_device(void) HWND window; HRESULT hr; + struct + { + DWORD size; + GUID guid; + D3DDEVICEDESC_V1 hw_desc; + D3DDEVICEDESC_V1 sw_desc; + } result_v1; + + struct + { + DWORD size; + GUID guid; + D3DDEVICEDESC_V2 hw_desc; + D3DDEVICEDESC_V2 sw_desc; + } result_v2; + static const struct { const GUID *guid; @@ -15137,6 +15154,10 @@ static void test_find_device(void) hr = IDirect3D3_FindDevice(d3d, &search, &result); ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); ok(result.dwSize == sizeof(result), "Got unexpected result size %u.\n", result.dwSize); + ok(result.ddHwDesc.dwSize == sizeof(result.ddHwDesc), + "Got unexpected HW desc size %u.\n", result.ddHwDesc.dwSize); + ok(result.ddSwDesc.dwSize == sizeof(result.ddSwDesc), + "Got unexpected SW desc size %u.\n", result.ddSwDesc.dwSize); memset(&search, 0, sizeof(search)); memset(&result, 0, sizeof(result)); @@ -15148,6 +15169,26 @@ static void test_find_device(void) hr = IDirect3D3_FindDevice(d3d, &search, &result); ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + search.dwSize = sizeof(search); + + memset(&result_v1, 0, sizeof(result_v1)); + result_v1.size = sizeof(result_v1); + hr = IDirect3D3_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v1); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(result_v1.hw_desc.dwSize == sizeof(result.ddHwDesc), + "Got unexpected HW desc size %u.\n", result_v1.hw_desc.dwSize); + ok(result_v1.sw_desc.dwSize == sizeof(result.ddSwDesc), + "Got unexpected SW desc size %u.\n", result_v1.sw_desc.dwSize); + + memset(&result_v2, 0, sizeof(result_v2)); + result_v2.size = sizeof(result_v2); + hr = IDirect3D3_FindDevice(d3d, &search, (D3DFINDDEVICERESULT *)&result_v2); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(result_v2.hw_desc.dwSize == sizeof(result.ddHwDesc), + "Got unexpected HW desc size %u.\n", result_v2.hw_desc.dwSize); + ok(result_v2.sw_desc.dwSize == sizeof(result.ddSwDesc), + "Got unexpected SW desc size %u.\n", result_v2.sw_desc.dwSize); + for (i = 0; i < ARRAY_SIZE(tests); ++i) { memset(&search, 0, sizeof(search)); @@ -15161,6 +15202,20 @@ static void test_find_device(void) hr = IDirect3D3_FindDevice(d3d, &search, &result); ok(hr == tests[i].hr, "Test %u: Got unexpected hr %#x.\n", i, hr); ok(result.dwSize == sizeof(result), "Test %u: Got unexpected result size %u.\n", i, result.dwSize); + if (SUCCEEDED(hr)) + { + ok(result.ddHwDesc.dwSize == sizeof(result.ddHwDesc), + "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize); + ok(result.ddSwDesc.dwSize == sizeof(result.ddSwDesc), + "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize); + } + else + { + ok(!result.ddHwDesc.dwSize, + "Test %u: Got unexpected HW desc size %u.\n", i, result.ddHwDesc.dwSize); + ok(!result.ddSwDesc.dwSize, + "Test %u: Got unexpected SW desc size %u.\n", i, result.ddSwDesc.dwSize); + } } /* The HAL device can only be enumerated if hardware acceleration is present. */ diff --git a/include/d3dhal.h b/include/d3dhal.h index 9d43313a00b..409cbfdf83b 100644 --- a/include/d3dhal.h +++ b/include/d3dhal.h @@ -47,6 +47,75 @@ typedef struct _D3DDeviceDesc_V1 { DWORD dwMaxVertexCount; } D3DDEVICEDESC_V1,*LPD3DDEVICEDESC_V1; +typedef struct _D3DDeviceDesc_V2 +{ + 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; + + /* DirectX 5 */ + DWORD dwMinTextureWidth; + DWORD dwMinTextureHeight; + DWORD dwMaxTextureWidth; + DWORD dwMaxTextureHeight; + DWORD dwMinStippleWidth; + DWORD dwMaxStippleWidth; + DWORD dwMinStippleHeight; + DWORD dwMaxStippleHeight; +} D3DDEVICEDESC_V2, *LPD3DDEVICEDESC_V2; + +typedef struct _D3DDeviceDesc_V3 +{ + 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; + + /* DirectX 5 */ + DWORD dwMinTextureWidth; + DWORD dwMinTextureHeight; + DWORD dwMaxTextureWidth; + DWORD dwMaxTextureHeight; + DWORD dwMinStippleWidth; + DWORD dwMaxStippleWidth; + DWORD dwMinStippleHeight; + DWORD dwMaxStippleHeight; + + /* DirectX 6 */ + DWORD dwMaxTextureRepeat; + DWORD dwMaxTextureAspectRatio; + DWORD dwMaxAnisotropy; + D3DVALUE dvGuardBandLeft; + D3DVALUE dvGuardBandTop; + D3DVALUE dvGuardBandRight; + D3DVALUE dvGuardBandBottom; + D3DVALUE dvExtentsAdjust; + DWORD dwStencilCaps; + DWORD dwFVFCaps; + DWORD dwTextureOpCaps; + WORD wMaxTextureBlendStages; + WORD wMaxSimultaneousTextures; +} D3DDEVICEDESC_V3, *LPD3DDEVICEDESC_V3; + typedef struct _D3DHAL_GLOBALDRIVERDATA { DWORD dwSize; D3DDEVICEDESC_V1 hwCaps;