From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dxcore/dxcore.c | 70 +++++++++++++++++++++++++++++--------- dlls/dxcore/tests/dxcore.c | 8 ++--- 2 files changed, 58 insertions(+), 20 deletions(-)
diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index 7b753728dc4..de40f934cf0 100644 --- a/dlls/dxcore/dxcore.c +++ b/dlls/dxcore/dxcore.c @@ -470,23 +470,11 @@ done: return hr; }
-static HRESULT STDMETHODCALLTYPE dxcore_adapter_factory_CreateAdapterList(IDXCoreAdapterFactory *iface, uint32_t num_attributes, - const GUID *filter_attributes, REFIID riid, void **out) +static HRESULT dxcore_create_adapter_list(REFIID riid, void **out) { struct dxcore_adapter_list *list; HRESULT hr;
- FIXME("iface %p, num_attributes %u, filter_attributes %p, riid %s, out %p semi-stub!\n", iface, num_attributes, filter_attributes, - debugstr_guid(riid), out); - - if (!out) - return E_POINTER; - - *out = NULL; - - if (!num_attributes || !filter_attributes) - return E_INVALIDARG; - if (!(list = calloc(1, sizeof(*list)))) return E_OUTOFMEMORY;
@@ -500,15 +488,65 @@ static HRESULT STDMETHODCALLTYPE dxcore_adapter_factory_CreateAdapterList(IDXCor
hr = IDXCoreAdapterList_QueryInterface(&list->IDXCoreAdapterList_iface, riid, out); IDXCoreAdapterList_Release(&list->IDXCoreAdapterList_iface); - TRACE("created IDXCoreAdapterList %p.\n", *out); + return hr; }
+static HRESULT STDMETHODCALLTYPE dxcore_adapter_factory_CreateAdapterList(IDXCoreAdapterFactory *iface, uint32_t num_attributes, + const GUID *filter_attributes, REFIID riid, void **out) +{ + FIXME("iface %p, num_attributes %u, filter_attributes %p, riid %s, out %p semi-stub!\n", iface, num_attributes, filter_attributes, + debugstr_guid(riid), out); + + if (!out) + return E_POINTER; + + *out = NULL; + + if (!num_attributes || !filter_attributes) + return E_INVALIDARG; + + return dxcore_create_adapter_list(riid, out); +} + static HRESULT STDMETHODCALLTYPE dxcore_adapter_factory_GetAdapterByLuid(IDXCoreAdapterFactory *iface, REFLUID adapter_luid, REFIID riid, void **out) { - FIXME("iface %p, adapter_luid %p, riid %s, out %p stub!\n", iface, adapter_luid, debugstr_guid(riid), out); - return E_NOTIMPL; + IDXCoreAdapterList *list; + IDXCoreAdapter *adapter; + uint32_t count; + HRESULT hr; + LUID luid; + + TRACE("iface %p, adapter_luid %p, riid %s, out %p.\n", iface, adapter_luid, debugstr_guid(riid), out); + + if (FAILED(hr = dxcore_create_adapter_list(&IID_IDXCoreAdapterList, (void **)&list))) + return hr; + + count = IDXCoreAdapterList_GetAdapterCount(list); + + for (uint32_t i = 0; i < count; ++i) + { + if (SUCCEEDED(IDXCoreAdapterList_GetAdapter(list, i, &IID_IDXCoreAdapter, (void **)&adapter))) + { + if (SUCCEEDED(IDXCoreAdapter_GetProperty(adapter, InstanceLuid, sizeof(luid), &luid))) + { + if (!memcmp(&luid, adapter_luid, sizeof(luid))) + { + hr = IDXCoreAdapter_QueryInterface(adapter, riid, out); + + IDXCoreAdapter_Release(adapter); + IDXCoreAdapterList_Release(list); + return hr; + } + } + IDXCoreAdapter_Release(adapter); + } + } + + IDXCoreAdapterList_Release(list); + + return E_INVALIDARG; }
static BOOL STDMETHODCALLTYPE dxcore_adapter_factory_IsNotificationTypeSupported(IDXCoreAdapterFactory *iface, DXCoreNotificationType type) diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 53952a40003..24cbad49b4f 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -84,9 +84,11 @@ static void test_DXCoreCreateAdapterFactory(void) check_interface(factory, &IID_IUnknown, TRUE); check_interface(factory, &IID_IDXCoreAdapterFactory, TRUE);
- hr = IDXCoreAdapterFactory_CreateAdapterList(factory, 0, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterList, (void **)&list); + hr = IDXCoreAdapterFactory_CreateAdapterList(factory, 0, NULL, &IID_IDXCoreAdapterList, (void **)&list); ok(hr == E_INVALIDARG, "got hr %#lx.\n", hr); ok(list == NULL, "got list %p.\n", list); + hr = IDXCoreAdapterFactory_CreateAdapterList(factory, 0, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterList, (void **)&list); + ok(hr == E_INVALIDARG, "got hr %#lx.\n", hr); hr = IDXCoreAdapterFactory_CreateAdapterList(factory, 1, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterFactory, (void **)&list); ok(hr == E_NOINTERFACE, "got hr %#lx.\n", hr); hr = IDXCoreAdapterFactory_CreateAdapterList(factory, 1, NULL, &IID_IDXCoreAdapterFactory, (void **)&list); @@ -276,10 +278,8 @@ static void test_GetAdapterByLuid(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IDXCoreAdapterFactory_GetAdapterByLuid(factory, &luid, &IID_IDXCoreAdapter, (void **)&adapter2); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - IDXCoreAdapter_Release(adapter2); + IDXCoreAdapter_Release(adapter2);
IDXCoreAdapter_Release(adapter); }