From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dxcore/dxcore.c | 47 ++++++++++++++++++++++++++------------ dlls/dxcore/tests/dxcore.c | 22 ++++++++++++++++++ 2 files changed, 55 insertions(+), 14 deletions(-)
diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index 83f9f33a5d4..37a85ac65f0 100644 --- a/dlls/dxcore/dxcore.c +++ b/dlls/dxcore/dxcore.c @@ -35,6 +35,7 @@ struct dxcore_adapter LONG refcount;
struct wined3d_adapter_identifier identifier; + char driver_description[128]; };
static inline struct dxcore_adapter *impl_from_IDXCoreAdapter(IDXCoreAdapter *iface) @@ -119,6 +120,9 @@ static HRESULT dxcore_adapter_get_property_size(struct dxcore_adapter *adapter, case IsHardware: *size = property_sizes[property]; return S_OK; + case DriverDescription: + *size = strlen(adapter->driver_description) + 1; + return S_OK;
default: FIXME("Property %u not implemented.\n", property); @@ -141,6 +145,9 @@ static HRESULT STDMETHODCALLTYPE dxcore_adapter_GetProperty(IDXCoreAdapter *ifac if (FAILED(hr = dxcore_adapter_get_property_size(adapter, property, &size))) return hr;
+ if (property == DriverDescription && buffer) + *(char *)buffer = 0; + if (buffer_size < size) return E_INVALIDARG;
@@ -166,6 +173,12 @@ static HRESULT STDMETHODCALLTYPE dxcore_adapter_GetProperty(IDXCoreAdapter *ifac *(BYTE *)buffer = 1; break;
+ case DriverDescription: + { + memcpy(buffer, adapter->identifier.description, size); + break; + } + default: break; } @@ -430,17 +443,25 @@ static ULONG STDMETHODCALLTYPE dxcore_adapter_factory_Release(IDXCoreAdapterFact return refcount; }
-static HRESULT dxcore_adapter_create(const struct wined3d_adapter_identifier *adapter_id, +static HRESULT dxcore_adapter_create(const struct wined3d_adapter *wined3d_adapter, struct dxcore_adapter **ret_adapter) { struct dxcore_adapter *adapter; + HRESULT hr;
if (!(adapter = calloc(1, sizeof(*adapter)))) return E_OUTOFMEMORY;
adapter->IDXCoreAdapter_iface.lpVtbl = &dxcore_adapter_vtbl; adapter->refcount = 1; - adapter->identifier = *adapter_id; + + adapter->identifier.description_size = sizeof(adapter->driver_description); + adapter->identifier.description = adapter->driver_description; + if (FAILED(hr = wined3d_adapter_get_identifier(wined3d_adapter, 0, &adapter->identifier))) + { + free(adapter); + return hr; + }
TRACE("Created adapter %p.\n", adapter); *ret_adapter = adapter; @@ -466,12 +487,7 @@ static HRESULT get_adapters(struct dxcore_adapter_list *list)
for (UINT i = 0; i < list->adapter_count; i++) { - struct wined3d_adapter_identifier adapter_id = {0}; - - if (FAILED(hr = wined3d_adapter_get_identifier(wined3d_get_adapter(wined3d, i), 0, &adapter_id))) - goto done; - - if (FAILED(hr = dxcore_adapter_create(&adapter_id, &list->adapters[i]))) + if (FAILED(hr = dxcore_adapter_create(wined3d_get_adapter(wined3d, i), &list->adapters[i]))) goto done; }
@@ -531,18 +547,21 @@ static HRESULT STDMETHODCALLTYPE dxcore_adapter_factory_GetAdapterByLuid(IDXCore for (uint32_t i = 0; i < count; ++i) { struct wined3d_adapter_identifier adapter_id = {0}; + struct wined3d_adapter *wined3d_adapter;
- wined3d_adapter_get_identifier(wined3d_get_adapter(wined3d, i), 0, &adapter_id); + wined3d_adapter = wined3d_get_adapter(wined3d, i); + wined3d_adapter_get_identifier(wined3d_adapter, 0, &adapter_id);
if (!memcmp(adapter_luid, &adapter_id.adapter_luid, sizeof(LUID))) { + hr = dxcore_adapter_create(wined3d_adapter, &adapter); wined3d_decref(wined3d);
- if (FAILED(hr = dxcore_adapter_create(&adapter_id, &adapter))) - return hr; - - hr = IDXCoreAdapter_QueryInterface(&adapter->IDXCoreAdapter_iface, riid, out); - IDXCoreAdapter_Release(&adapter->IDXCoreAdapter_iface); + if (SUCCEEDED(hr)) + { + hr = IDXCoreAdapter_QueryInterface(&adapter->IDXCoreAdapter_iface, riid, out); + IDXCoreAdapter_Release(&adapter->IDXCoreAdapter_iface); + } return hr; } } diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 018c86cf3ec..cb29ea247e6 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -159,6 +159,7 @@ static void test_GetProperty(void) LUID luid[2]; size_t size; HRESULT hr; + char *str;
if (FAILED(pDXCoreCreateAdapterFactory(&IID_IDXCoreAdapterFactory, (void **)&factory))) return; @@ -250,6 +251,27 @@ static void test_GetProperty(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); ok(dummy == is_hardware, "Got value %#x.\n", dummy);
+ /* DriverDescription */ + size = 0; + hr = IDXCoreAdapter_GetPropertySize(adapter, DriverDescription, &size); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!!size, "Unexpected property size.\n"); + + str = malloc(size); + + hr = IDXCoreAdapter_GetProperty(adapter, DriverDescription, size, str); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IDXCoreAdapter_GetProperty(adapter, DriverDescription, size, NULL); + ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + + *str = 0x1; + hr = IDXCoreAdapter_GetProperty(adapter, DriverDescription, size - 1, str); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(!*str, "Unexpected buffer contents %s.\n", wine_dbgstr_a(str)); + + free(str); + IDXCoreAdapter_Release(adapter); }
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dxcore/dxcore.c | 8 ++++++++ dlls/dxcore/tests/dxcore.c | 10 ++++++++++ 2 files changed, 18 insertions(+)
diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index 37a85ac65f0..a25c4c16cce 100644 --- a/dlls/dxcore/dxcore.c +++ b/dlls/dxcore/dxcore.c @@ -109,6 +109,7 @@ static HRESULT dxcore_adapter_get_property_size(struct dxcore_adapter *adapter, static const size_t property_sizes[] = { [InstanceLuid] = sizeof(LUID), + [DriverVersion] = sizeof(LARGE_INTEGER), [HardwareID] = sizeof(DXCoreHardwareID), [IsHardware] = sizeof(BYTE), }; @@ -116,6 +117,7 @@ static HRESULT dxcore_adapter_get_property_size(struct dxcore_adapter *adapter, switch (property) { case InstanceLuid: + case DriverVersion: case HardwareID: case IsHardware: *size = property_sizes[property]; @@ -157,6 +159,12 @@ static HRESULT STDMETHODCALLTYPE dxcore_adapter_GetProperty(IDXCoreAdapter *ifac *(LUID *)buffer = adapter->identifier.adapter_luid; break;
+ case DriverVersion: + { + *(LARGE_INTEGER *)buffer = adapter->identifier.driver_version; + break; + } + case HardwareID: { struct DXCoreHardwareID *hardware_id = buffer; diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index cb29ea247e6..bfac112aa05 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -155,6 +155,7 @@ static void test_GetProperty(void) DXCoreHardwareID hwid[2]; IDXCoreAdapter *adapter; uint32_t count, dummy; + LARGE_INTEGER version; BYTE is_hardware; LUID luid[2]; size_t size; @@ -272,6 +273,15 @@ static void test_GetProperty(void)
free(str);
+ /* DriverVersion */ + size = 0; + hr = IDXCoreAdapter_GetPropertySize(adapter, DriverVersion, &size); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(size == sizeof(LARGE_INTEGER), "Unexpected property size.\n"); + + hr = IDXCoreAdapter_GetProperty(adapter, DriverVersion, size, &version); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IDXCoreAdapter_Release(adapter); }
``` + if (property == DriverDescription && buffer) + *(char *)buffer = 0; ```
What if buffer_size == 0?