[PATCH 3/4] ddraw: Find the correct GUIDs for each D3D version in FindDevice().
Henri Verbeet
hverbeet at codeweavers.com
Tue Sep 11 09:09:27 CDT 2018
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/ddraw/ddraw.c | 83 ++++++++++++++++++++++++++++++-----------------
dlls/ddraw/tests/ddraw1.c | 6 ++--
dlls/ddraw/tests/ddraw2.c | 8 ++---
3 files changed, 59 insertions(+), 38 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index e5f1e4f8c75..170a5492784 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -4018,35 +4018,20 @@ static HRESULT WINAPI d3d1_CreateViewport(IDirect3D *iface, IDirect3DViewport **
outer_unknown);
}
-/*****************************************************************************
- * IDirect3D3::FindDevice
- *
- * This method finds a device with the requested properties and returns a
- * device description
- *
- * Versions 1, 2 and 3
- * Params:
- * fds: Describes the requested device characteristics
- * fdr: Returns the device description
- *
- * Returns:
- * D3D_OK on success
- * DDERR_INVALIDPARAMS if no device was found
- *
- *****************************************************************************/
-static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr)
+static HRESULT ddraw_find_device(struct ddraw *ddraw, const D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr,
+ unsigned int guid_count, const GUID * const *guids)
{
- struct ddraw *ddraw = impl_from_IDirect3D3(iface);
D3DDEVICEDESC7 desc7;
D3DDEVICEDESC desc1;
+ unsigned int i;
HRESULT hr;
- TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
+ TRACE("ddraw %p, fds %p, fdr %p, guid_count %u, guids %p.\n", ddraw, fds, fdr, guid_count, guids);
- if (!fds || !fdr) return DDERR_INVALIDPARAMS;
+ if (!fds || !fdr)
+ return DDERR_INVALIDPARAMS;
- if (fds->dwSize != sizeof(D3DFINDDEVICESEARCH)
- || fdr->dwSize != sizeof(D3DFINDDEVICERESULT))
+ if (fds->dwSize != sizeof(*fds) || fdr->dwSize != sizeof(*fdr))
return DDERR_INVALIDPARAMS;
if (fds->dwFlags & D3DFDS_COLORMODEL)
@@ -4054,12 +4039,22 @@ static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fd
if (fds->dwFlags & D3DFDS_GUID)
{
- TRACE("Trying to match guid %s.\n", debugstr_guid(&(fds->guid)));
- if (!IsEqualGUID(&IID_D3DDEVICE_WineD3D, &fds->guid)
- && !IsEqualGUID(&IID_IDirect3DHALDevice, &fds->guid)
- && !IsEqualGUID(&IID_IDirect3DRGBDevice, &fds->guid))
+ BOOL found = FALSE;
+
+ TRACE("Trying to match GUID %s.\n", debugstr_guid(&fds->guid));
+
+ for (i = 0; i < guid_count; ++i)
+ {
+ if (IsEqualGUID(guids[i], &fds->guid))
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
{
- WARN("No match for this GUID.\n");
+ WARN("Failed to match GUID %s.\n", debugstr_guid(&fds->guid));
return DDERR_NOTFOUND;
}
}
@@ -4079,22 +4074,52 @@ static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fd
return D3D_OK;
}
+static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr)
+{
+ struct ddraw *ddraw = impl_from_IDirect3D3(iface);
+ static const GUID * const guids[] =
+ {
+ &IID_D3DDEVICE_WineD3D,
+ &IID_IDirect3DHALDevice,
+ &IID_IDirect3DRGBDevice,
+ };
+
+ TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
+
+ return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids);
+}
+
static HRESULT WINAPI d3d2_FindDevice(IDirect3D2 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr)
{
struct ddraw *ddraw = impl_from_IDirect3D2(iface);
+ static const GUID * const guids[] =
+ {
+ &IID_D3DDEVICE_WineD3D,
+ &IID_IDirect3DHALDevice,
+ &IID_IDirect3DMMXDevice,
+ &IID_IDirect3DRGBDevice,
+ &IID_IDirect3DRampDevice,
+ };
TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
- return d3d3_FindDevice(&ddraw->IDirect3D3_iface, fds, fdr);
+ return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids);
}
static HRESULT WINAPI d3d1_FindDevice(IDirect3D *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr)
{
struct ddraw *ddraw = impl_from_IDirect3D(iface);
+ static const GUID * const guids[] =
+ {
+ &IID_D3DDEVICE_WineD3D,
+ &IID_IDirect3DHALDevice,
+ &IID_IDirect3DRGBDevice,
+ &IID_IDirect3DRampDevice,
+ };
TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
- return d3d3_FindDevice(&ddraw->IDirect3D3_iface, fds, fdr);
+ return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids);
}
/*****************************************************************************
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index b8dafdb6281..ba9f128dad7 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -11728,12 +11728,11 @@ static void test_find_device(void)
{
const GUID *guid;
HRESULT hr;
- BOOL todo;
}
tests[] =
{
{&IID_IDirect3D, DDERR_NOTFOUND},
- {&IID_IDirect3DRampDevice, D3D_OK, TRUE},
+ {&IID_IDirect3DRampDevice, D3D_OK},
{&IID_IDirect3DRGBDevice, D3D_OK},
{&IID_IDirect3DMMXDevice, DDERR_NOTFOUND},
{&IID_IDirect3DRefDevice, DDERR_NOTFOUND},
@@ -11784,8 +11783,7 @@ static void test_find_device(void)
result.dwSize = sizeof(result);
hr = IDirect3D_FindDevice(d3d, &search, &result);
- todo_wine_if(tests[i].todo)
- ok(hr == tests[i].hr, "Test %u: Got unexpected hr %#x.\n", i, hr);
+ 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);
}
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 762b4d9aba3..b5739c3ab4d 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -13010,14 +13010,13 @@ static void test_find_device(void)
{
const GUID *guid;
HRESULT hr;
- BOOL todo;
}
tests[] =
{
{&IID_IDirect3D, DDERR_NOTFOUND},
- {&IID_IDirect3DRampDevice, D3D_OK, TRUE},
+ {&IID_IDirect3DRampDevice, D3D_OK},
{&IID_IDirect3DRGBDevice, D3D_OK},
- {&IID_IDirect3DMMXDevice, D3D_OK, TRUE},
+ {&IID_IDirect3DMMXDevice, D3D_OK},
{&IID_IDirect3DRefDevice, DDERR_NOTFOUND},
{&IID_IDirect3DTnLHalDevice, DDERR_NOTFOUND},
{&IID_IDirect3DNullDevice, DDERR_NOTFOUND},
@@ -13066,8 +13065,7 @@ static void test_find_device(void)
result.dwSize = sizeof(result);
hr = IDirect3D2_FindDevice(d3d, &search, &result);
- todo_wine_if(tests[i].todo)
- ok(hr == tests[i].hr, "Test %u: Got unexpected hr %#x.\n", i, hr);
+ 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);
}
--
2.11.0
More information about the wine-devel
mailing list