From: Mohamad Al-Jaf mohamadaljaf@gmail.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58133 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58192 --- dlls/dxcore/dxcore.c | 44 ++++++++++++++++++++++++++++++++++++-- dlls/dxcore/tests/dxcore.c | 8 ------- 2 files changed, 42 insertions(+), 10 deletions(-)
diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index 09c731142f2..63879a52a11 100644 --- a/dlls/dxcore/dxcore.c +++ b/dlls/dxcore/dxcore.c @@ -31,6 +31,8 @@ struct dxcore_adapter { IDXCoreAdapter IDXCoreAdapter_iface; LONG refcount; + + struct wined3d_adapter_identifier identifier; };
static inline struct dxcore_adapter *impl_from_IDXCoreAdapter(IDXCoreAdapter *iface) @@ -101,8 +103,38 @@ static BOOL STDMETHODCALLTYPE dxcore_adapter_IsPropertySupported(IDXCoreAdapter static HRESULT STDMETHODCALLTYPE dxcore_adapter_GetProperty(IDXCoreAdapter *iface, DXCoreAdapterProperty property, size_t buffer_size, void *buffer) { - FIXME("iface %p, property %u, buffer_size %Iu, buffer stub!%p\n", iface, property, buffer_size, buffer); - return E_NOTIMPL; + struct dxcore_adapter *adapter = impl_from_IDXCoreAdapter(iface); + + TRACE("iface %p, property %u, buffer_size %Iu, buffer %p\n", iface, property, buffer_size, buffer); + + if (!buffer) + return E_POINTER; + if (!buffer_size) + return E_INVALIDARG; + + switch (property) + { + case HardwareID: + { + struct DXCoreHardwareID *hardware_id = buffer; + + if (buffer_size != sizeof(DXCoreHardwareID)) + return E_INVALIDARG; + + hardware_id->vendorID = adapter->identifier.vendor_id; + hardware_id->deviceID = adapter->identifier.device_id; + hardware_id->subSysID = adapter->identifier.subsystem_id; + hardware_id->revision = adapter->identifier.revision; + break; + } + default: + { + FIXME("property %u not implemented.\n", property); + return DXGI_ERROR_INVALID_CALL; + } + } + + return S_OK; }
static HRESULT STDMETHODCALLTYPE dxcore_adapter_GetPropertySize(IDXCoreAdapter *iface, DXCoreAdapterProperty property, @@ -373,6 +405,7 @@ static HRESULT get_adapters(struct dxcore_adapter_list *list) for (UINT i = 0; i < list->adapter_count; i++) { struct dxcore_adapter *dxcore_adapter = calloc(1, sizeof(*dxcore_adapter)); + const struct wined3d_adapter *wined3d_adapter;
if (!dxcore_adapter) { @@ -380,6 +413,13 @@ static HRESULT get_adapters(struct dxcore_adapter_list *list) goto done; }
+ wined3d_adapter = wined3d_get_adapter(wined3d, i); + if (FAILED(hr = wined3d_adapter_get_identifier(wined3d_adapter, 0, &dxcore_adapter->identifier))) + { + free(dxcore_adapter); + goto done; + } + dxcore_adapter->IDXCoreAdapter_iface.lpVtbl = &dxcore_adapter_vtbl; dxcore_adapter->refcount = 1;
diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 0300973f6a2..dcc9026b7b8 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -127,36 +127,28 @@ static void test_DXCoreCreateAdapterFactory(void) check_interface(adapter, &IID_IDXCoreAdapterFactory, FALSE);
hr = IDXCoreAdapter_GetProperty(adapter, HardwareID, 0, NULL); - todo_wine ok(hr == E_POINTER, "got hr %#lx.\n", hr); hr = IDXCoreAdapter_GetProperty(adapter, HardwareID, 0, buffer); - todo_wine ok(hr == E_INVALIDARG, "got hr %#lx.\n", hr);
buffer = calloc(1, sizeof(HardwareID)); ok(buffer != NULL, "failed to allocate memory for buffer.\n"); hr = IDXCoreAdapter_GetProperty(adapter, HardwareID, sizeof(HardwareID), buffer); - todo_wine ok(hr == E_INVALIDARG, "got hr %#lx.\n", hr); free(buffer); buffer = calloc(1, sizeof(DXCoreHardwareID)); ok(buffer != NULL, "failed to allocate memory for buffer.\n"); hr = IDXCoreAdapter_GetProperty(adapter, 0xdeadbeef, sizeof(DXCoreHardwareID), buffer); - todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "got hr %#lx.\n", hr); free(buffer);
buffer = calloc(1, sizeof(DXCoreHardwareID)); ok(buffer != NULL, "failed to allocate memory for buffer.\n"); hr = IDXCoreAdapter_GetProperty(adapter, HardwareID, sizeof(DXCoreHardwareID), buffer); - todo_wine ok(hr == S_OK, "got hr %#lx.\n", hr); - if (SUCCEEDED(hr)) - { hardware_id = buffer; ok(hardware_id->vendorID != 0, "failed to get vendorID\n"); ok(hardware_id->deviceID != 0, "failed to get deviceID\n"); - } free(buffer);
refcount = IDXCoreAdapter_Release(adapter);