Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58133
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58192
-- v4: dxcore: Implement IDXCoreAdapter::GetProperty( HardwareID ). dxcore/tests: Add IDXCoreAdapter::GetProperty() tests. dxcore: Implement IDXCoreAdapterList::GetAdapter(). dxcore/tests: Add IDXCoreAdapterList::GetAdapter() tests.
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- include/dxcore_interface.h | 84 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+)
diff --git a/include/dxcore_interface.h b/include/dxcore_interface.h index 635a7f047a5..ba81f827fd6 100644 --- a/include/dxcore_interface.h +++ b/include/dxcore_interface.h @@ -170,6 +170,40 @@ DECLARE_INTERFACE_IID_(IDXCoreAdapter, IUnknown, "f0db4c7f-fe5a-42a2-bd62-f2a6cf #endif };
+#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDXCoreAdapter_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDXCoreAdapter_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDXCoreAdapter_Release(p) (p)->lpVtbl->Release(p) +/*** IDXCoreAdapter methods ***/ +#define IDXCoreAdapter_IsValid(p) (p)->lpVtbl->IsValid(p) +#define IDXCoreAdapter_IsAttributeSupported(p,a) (p)->lpVtbl->IsAttributeSupported(p,a) +#define IDXCoreAdapter_IsPropertySupported(p,a) (p)->lpVtbl->IsPropertySupported(p,a) +#define IDXCoreAdapter_GetProperty(p,a,b,c) (p)->lpVtbl->GetProperty(p,a,b,c) +#define IDXCoreAdapter_GetPropertySize(p,a,b) (p)->lpVtbl->GetPropertySize(p,a,b) +#define IDXCoreAdapter_IsQueryStateSupported(p,a) (p)->lpVtbl->IsQueryStateSupported(p,a) +#define IDXCoreAdapter_QueryState(p,a,b,c,d,e) (p)->lpVtbl->QueryState(p,a,b,c,d,e) +#define IDXCoreAdapter_IsSetStateSupported(p,a) (p)->lpVtbl->IsSetStateSupported(p,a) +#define IDXCoreAdapter_SetState(p,a,b,c,d,e) (p)->lpVtbl->SetState(p,a,b,c,d,e) +#define IDXCoreAdapter_GetFactory(p,a,b) (p)->lpVtbl->GetFactory(p,a,b) +#else +/*** IUnknown methods ***/ +#define IDXCoreAdapter_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDXCoreAdapter_AddRef(p) (p)->AddRef() +#define IDXCoreAdapter_Release(p) (p)->Release() +/*** IDXCoreAdapter methods ***/ +#define IDXCoreAdapter_IsValid(p) (p)->IsValid() +#define IDXCoreAdapter_IsAttributeSupported(p,a) (p)->IsAttributeSupported(a) +#define IDXCoreAdapter_IsPropertySupported(p,a) (p)->IsPropertySupported(a) +#define IDXCoreAdapter_GetProperty(p,a,b,c) (p)->GetProperty(a,b,c) +#define IDXCoreAdapter_GetPropertySize(p,a,b) (p)->GetPropertySize(a,b) +#define IDXCoreAdapter_IsQueryStateSupported(p,a) (p)->IsQueryStateSupported(a) +#define IDXCoreAdapter_QueryState(p,a,b,c,d,e) (p)->QueryState(a,b,c,d,e) +#define IDXCoreAdapter_IsSetStateSupported(p,a) (p)->IsSetStateSupported(a) +#define IDXCoreAdapter_SetState(p,a,b,c,d,e) (p)->SetState(a,b,c,d,e) +#define IDXCoreAdapter_GetFactory(p,a,b) (p)->GetFactory(a,b) +#endif + #undef INTERFACE #define INTERFACE IDXCoreAdapterList DECLARE_INTERFACE_IID_(IDXCoreAdapterList, IUnknown, "526c7776-40e9-459b-b711-f32ad76dfc28") @@ -201,6 +235,32 @@ DECLARE_INTERFACE_IID_(IDXCoreAdapterList, IUnknown, "526c7776-40e9-459b-b711-f3 #endif };
+#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDXCoreAdapterList_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDXCoreAdapterList_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDXCoreAdapterList_Release(p) (p)->lpVtbl->Release(p) +/*** IDXCoreAdapterList methods ***/ +#define IDXCoreAdapterList_GetAdapter(p,a,b,c) (p)->lpVtbl->GetAdapter(p,a,b,c) +#define IDXCoreAdapterList_GetAdapterCount(p) (p)->lpVtbl->GetAdapterCount(p) +#define IDXCoreAdapterList_IsStale(p) (p)->lpVtbl->IsStale(p) +#define IDXCoreAdapterList_GetFactory(p,a,b) (p)->lpVtbl->GetFactory(p,a,b) +#define IDXCoreAdapterList_Sort(p,a,b) (p)->lpVtbl->Sort(p,a,b) +#define IDXCoreAdapterList_IsAdapterPreferenceSupported(p,a) (p)->lpVtbl->IsAdapterPreferenceSupported(p,a) +#else +/*** IUnknown methods ***/ +#define IDXCoreAdapterList_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDXCoreAdapterList_AddRef(p) (p)->AddRef() +#define IDXCoreAdapterList_Release(p) (p)->Release() +/*** IDXCoreAdapterList methods ***/ +#define IDXCoreAdapterList_GetAdapter(p,a,b) (p)->GetAdapter(a,b) +#define IDXCoreAdapterList_GetAdapterCount(p) (p)->GetAdapterCount() +#define IDXCoreAdapterList_IsStale(p) (p)->IsStale() +#define IDXCoreAdapterList_GetFactory(p,a,b) (p)->GetFactory(a,b) +#define IDXCoreAdapterList_Sort(p,a,b) (p)->Sort(a,b) +#define IDXCoreAdapterList_IsAdapterPreferenceSupported(p,a) (p)->IsAdapterPreferenceSupported(a) +#endif + #undef INTERFACE #define INTERFACE IDXCoreAdapterFactory DECLARE_INTERFACE_IID_(IDXCoreAdapterFactory, IUnknown, "78ee5945-c36e-4b13-a669-005dd11c0f06") @@ -232,4 +292,28 @@ DECLARE_INTERFACE_IID_(IDXCoreAdapterFactory, IUnknown, "78ee5945-c36e-4b13-a669 #endif };
+#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDXCoreAdapterFactory_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDXCoreAdapterFactory_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDXCoreAdapterFactory_Release(p) (p)->lpVtbl->Release(p) +/*** IDXCoreAdapterFactory methods ***/ +#define IDXCoreAdapterFactory_CreateAdapterList(p,a,b,c,d) (p)->lpVtbl->CreateAdapterList(p,a,b,c,d) +#define IDXCoreAdapterFactory_GetAdapterByLuid(p,a,b,c) (p)->lpVtbl->GetAdapterByLuid(p,a,b,c) +#define IDXCoreAdapterFactory_IsNotificationTypeSupported(p,a) (p)->lpVtbl->IsNotificationTypeSupported(p,a) +#define IDXCoreAdapterFactory_RegisterEventNotification(p,a,b,c,d,e) (p)->lpVtbl->RegisterEventNotification(p,a,b,c,d,e) +#define IDXCoreAdapterFactory_UnregisterEventNotification(p,a) (p)->lpVtbl->UnregisterEventNotification(p,a) +#else +/*** IUnknown methods ***/ +#define IDXCoreAdapterFactory_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IDXCoreAdapterFactory_AddRef(p) (p)->AddRef() +#define IDXCoreAdapterFactory_Release(p) (p)->Release() +/*** IDXCoreAdapterFactory methods ***/ +#define IDXCoreAdapterFactory_CreateAdapterList(p,a,b,c,d) (p)->CreateAdapterList(a,b,c,d) +#define IDXCoreAdapterFactory_GetAdapterByLuid(p,a,b,c) (p)->GetAdapterByLuid(a,b,c) +#define IDXCoreAdapterFactory_IsNotificationTypeSupported(p,a) (p)->IsNotificationTypeSupported(a) +#define IDXCoreAdapterFactory_RegisterEventNotification(p,a,b,c,d,e) (p)->RegisterEventNotification(a,b,c,d,e) +#define IDXCoreAdapterFactory_UnregisterEventNotification(p,a) (p)->UnregisterEventNotification(a) +#endif + #endif /* __DXCORE_INTERFACE__ */
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- configure.ac | 1 + dlls/dxcore/tests/Makefile.in | 5 ++ dlls/dxcore/tests/dxcore.c | 102 ++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 dlls/dxcore/tests/Makefile.in create mode 100644 dlls/dxcore/tests/dxcore.c
diff --git a/configure.ac b/configure.ac index 06da342bd4f..af37f5b75e0 100644 --- a/configure.ac +++ b/configure.ac @@ -2687,6 +2687,7 @@ WINE_CONFIG_MAKEFILE(dlls/dwrite) WINE_CONFIG_MAKEFILE(dlls/dwrite/tests) WINE_CONFIG_MAKEFILE(dlls/dx8vb) WINE_CONFIG_MAKEFILE(dlls/dxcore) +WINE_CONFIG_MAKEFILE(dlls/dxcore/tests) WINE_CONFIG_MAKEFILE(dlls/dxdiagn) WINE_CONFIG_MAKEFILE(dlls/dxdiagn/tests) WINE_CONFIG_MAKEFILE(dlls/dxgi) diff --git a/dlls/dxcore/tests/Makefile.in b/dlls/dxcore/tests/Makefile.in new file mode 100644 index 00000000000..841f1c9d14f --- /dev/null +++ b/dlls/dxcore/tests/Makefile.in @@ -0,0 +1,5 @@ +TESTDLL = dxcore.dll +IMPORTS = uuid + +SOURCES = \ + dxcore.c diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c new file mode 100644 index 00000000000..266a53f8f89 --- /dev/null +++ b/dlls/dxcore/tests/dxcore.c @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2025 Mohamad Al-Jaf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> + +#define COBJMACROS +#include "initguid.h" +#include "dxcore.h" + +#include "wine/test.h" + +static HRESULT (WINAPI *pDXCoreCreateAdapterFactory)(REFIID riid, void **ppv); + +#define check_interface( obj, iid, supported ) check_interface_( __LINE__, obj, iid, supported ) +static void check_interface_( unsigned int line, void *obj, const IID *iid, BOOL supported ) +{ + IUnknown *iface = obj; + HRESULT hr, expected_hr; + IUnknown *unk; + + expected_hr = supported ? S_OK : E_NOINTERFACE; + + hr = IUnknown_QueryInterface( iface, iid, (void **)&unk ); + ok_(__FILE__, line)( hr == expected_hr, "got hr %#lx.\n", hr ); + if (SUCCEEDED(hr)) IUnknown_Release( unk ); +} + +static void test_DXCoreCreateAdapterFactory(void) +{ + IDXCoreAdapterFactory *adapter_factory2 = (void *)0xdeadbeef; + IDXCoreAdapterFactory *adapter_factory = (void *)0xdeadbeef; + HRESULT hr; + LONG ref; + + if (0) /* Crashes on w1064v1909 */ + { + todo_wine + hr = pDXCoreCreateAdapterFactory( NULL, NULL ); + ok( hr == E_POINTER, "got hr %#lx.\n", hr ); + } + hr = pDXCoreCreateAdapterFactory( &IID_IDXCoreAdapterFactory, NULL ); + todo_wine + ok( hr == E_POINTER || broken(hr == E_NOINTERFACE) /* w1064v1909 */, "got hr %#lx.\n", hr ); + hr = pDXCoreCreateAdapterFactory( &DXCORE_ADAPTER_ATTRIBUTE_D3D11_GRAPHICS, (void **)&adapter_factory ); + ok( hr == E_NOINTERFACE, "got hr %#lx.\n", hr ); + todo_wine + ok( adapter_factory == NULL || broken(adapter_factory == (void *)0xdeadbeef) /* w1064v1909 */, "got adapter_factory %p.\n", adapter_factory ); + + hr = pDXCoreCreateAdapterFactory( &IID_IDXCoreAdapterFactory, (void **)&adapter_factory ); + todo_wine + ok( hr == S_OK || broken(hr == E_NOINTERFACE) /* w1064v1909 */, "got hr %#lx.\n", hr ); + if (FAILED(hr)) return; + + hr = pDXCoreCreateAdapterFactory( &IID_IDXCoreAdapterFactory, (void **)&adapter_factory2 ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + ok( adapter_factory == adapter_factory2, "got adapter_factory %p, adapter_factory2 %p.\n", adapter_factory, adapter_factory2 ); + ref = IDXCoreAdapterFactory_Release( adapter_factory2 ); + ok( ref == 1, "got ref %ld.\n", ref ); + + check_interface( adapter_factory, &IID_IAgileObject, FALSE ); + check_interface( adapter_factory, &IID_IDXCoreAdapter, FALSE ); + check_interface( adapter_factory, &IID_IDXCoreAdapterList, FALSE ); + + ref = IDXCoreAdapterFactory_Release( adapter_factory ); + ok( ref == 0, "got ref %ld.\n", ref ); +} + +START_TEST(dxcore) +{ + HMODULE dxcore_handle = LoadLibraryA( "dxcore.dll" ); + if (!dxcore_handle) + { + win_skip( "Could not load dxcore.dll\n" ); + return; + } + pDXCoreCreateAdapterFactory = (void *)GetProcAddress( dxcore_handle, "DXCoreCreateAdapterFactory" ); + if (!pDXCoreCreateAdapterFactory) + { + win_skip( "Failed to get DXCoreCreateAdapterFactory address, skipping dxcore tests\n" ); + FreeLibrary( dxcore_handle ); + return; + } + + test_DXCoreCreateAdapterFactory(); + + FreeLibrary( dxcore_handle ); +}
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/dxcore/Makefile.in | 2 +- dlls/dxcore/dxcore.c | 146 +++++++++++++++++++++++++++++++++++++ dlls/dxcore/main.c | 28 ------- dlls/dxcore/tests/dxcore.c | 4 - 4 files changed, 147 insertions(+), 33 deletions(-) create mode 100644 dlls/dxcore/dxcore.c delete mode 100644 dlls/dxcore/main.c
diff --git a/dlls/dxcore/Makefile.in b/dlls/dxcore/Makefile.in index efee290e914..579cceded7e 100644 --- a/dlls/dxcore/Makefile.in +++ b/dlls/dxcore/Makefile.in @@ -3,4 +3,4 @@ MODULE = dxcore.dll EXTRADLLFLAGS = -Wb,--prefer-native
SOURCES = \ - main.c + dxcore.c diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c new file mode 100644 index 00000000000..a07fe0c49e8 --- /dev/null +++ b/dlls/dxcore/dxcore.c @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2023 Mohamad Al-Jaf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> + +#define COBJMACROS +#include "initguid.h" +#include "dxcore.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dxcore); + +struct dxcore_adapter_factory_statics +{ + IDXCoreAdapterFactory IDXCoreAdapterFactory_iface; + LONG ref; +}; + +static inline struct dxcore_adapter_factory_statics *impl_from_IDXCoreAdapterFactory( IDXCoreAdapterFactory *iface ) +{ + return CONTAINING_RECORD( iface, struct dxcore_adapter_factory_statics, IDXCoreAdapterFactory_iface ); +} + +static HRESULT WINAPI dxcore_adapter_factory_statics_QueryInterface( IDXCoreAdapterFactory *iface, REFIID iid, void **out ) +{ + struct dxcore_adapter_factory_statics *impl = impl_from_IDXCoreAdapterFactory( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IDXCoreAdapterFactory )) + { + *out = &impl->IDXCoreAdapterFactory_iface; + IUnknown_AddRef( (IUnknown *)*out ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI dxcore_adapter_factory_statics_AddRef( IDXCoreAdapterFactory *iface ) +{ + struct dxcore_adapter_factory_statics *impl = impl_from_IDXCoreAdapterFactory( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI dxcore_adapter_factory_statics_Release( IDXCoreAdapterFactory *iface ) +{ + struct dxcore_adapter_factory_statics *impl = impl_from_IDXCoreAdapterFactory( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p, ref %lu.\n", iface, ref ); + + if (!ref) free( impl ); + return ref; +} + +static HRESULT WINAPI dxcore_adapter_factory_statics_CreateAdapterList( IDXCoreAdapterFactory *iface, uint32_t num_attributes, + const GUID *filter_attributes, REFIID riid, void **ppv ) +{ + FIXME( "iface %p, num_attributes %u, filter_attributes %p, riid %s, ppv %p stub!\n", iface, num_attributes, filter_attributes, debugstr_guid( riid ), ppv ); + return E_NOTIMPL; +} + +static HRESULT WINAPI dxcore_adapter_factory_statics_GetAdapterByLuid( IDXCoreAdapterFactory *iface, REFLUID adapter_luid, REFIID riid, void **ppv ) +{ + FIXME( "iface %p, adapter_luid %p, riid %s, ppv %p stub!\n", iface, adapter_luid, debugstr_guid( riid ), ppv ); + return E_NOTIMPL; +} + +static BOOL WINAPI dxcore_adapter_factory_statics_IsNotificationTypeSupported( IDXCoreAdapterFactory *iface, DXCoreNotificationType type ) +{ + FIXME( "iface %p, type %u stub!\n", iface, type ); + return FALSE; +} + +static HRESULT WINAPI dxcore_adapter_factory_statics_RegisterEventNotification( IDXCoreAdapterFactory *iface, IUnknown *dxcore_object, + DXCoreNotificationType type, PFN_DXCORE_NOTIFICATION_CALLBACK callback, + void *callback_context, uint32_t *event_cookie ) +{ + FIXME( "iface %p, dxcore_object %p, type %u, callback %p, callback_context %p, event_cookie %p stub!\n", iface, dxcore_object, type, callback, callback_context, event_cookie ); + return E_NOTIMPL; +} + +static HRESULT WINAPI dxcore_adapter_factory_statics_UnregisterEventNotification( IDXCoreAdapterFactory *iface, uint32_t event_cookie ) +{ + FIXME( "iface %p, event_cookie %u stub!\n", iface, event_cookie ); + return E_NOTIMPL; +} + +static const struct IDXCoreAdapterFactoryVtbl dxcore_adapter_factory_statics_vtbl = +{ + /* IUnknown methods */ + dxcore_adapter_factory_statics_QueryInterface, + dxcore_adapter_factory_statics_AddRef, + dxcore_adapter_factory_statics_Release, + /* IDXCoreAdapterFactory methods */ + dxcore_adapter_factory_statics_CreateAdapterList, + dxcore_adapter_factory_statics_GetAdapterByLuid, + dxcore_adapter_factory_statics_IsNotificationTypeSupported, + dxcore_adapter_factory_statics_RegisterEventNotification, + dxcore_adapter_factory_statics_UnregisterEventNotification, +}; + +HRESULT WINAPI DXCoreCreateAdapterFactory( REFIID riid, void **ppv ) +{ + static struct dxcore_adapter_factory_statics *impl = NULL; + + TRACE( "riid %s, ppv %p\n", debugstr_guid( riid ), ppv ); + + if (!ppv) return E_POINTER; + if (!impl) + { + if (!(impl = calloc( 1, sizeof( *impl ) ))) + { + *ppv = NULL; + return E_OUTOFMEMORY; + } + + impl->IDXCoreAdapterFactory_iface.lpVtbl = &dxcore_adapter_factory_statics_vtbl; + impl->ref = 0; + } + + TRACE( "created IDXCoreAdapterFactory %p.\n", *ppv ); + return IDXCoreAdapterFactory_QueryInterface( &impl->IDXCoreAdapterFactory_iface, riid, ppv ); +} diff --git a/dlls/dxcore/main.c b/dlls/dxcore/main.c deleted file mode 100644 index dcc294d04fa..00000000000 --- a/dlls/dxcore/main.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2023 Mohamad Al-Jaf - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "dxcore.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(dxcore); - -HRESULT WINAPI DXCoreCreateAdapterFactory( REFIID riid, void **ppv ) -{ - FIXME( "riid %s, ppv %p stub!\n", debugstr_guid(riid), ppv ); - return E_NOINTERFACE; -} diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 266a53f8f89..58424ee8b56 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -49,20 +49,16 @@ static void test_DXCoreCreateAdapterFactory(void)
if (0) /* Crashes on w1064v1909 */ { - todo_wine hr = pDXCoreCreateAdapterFactory( NULL, NULL ); ok( hr == E_POINTER, "got hr %#lx.\n", hr ); } hr = pDXCoreCreateAdapterFactory( &IID_IDXCoreAdapterFactory, NULL ); - todo_wine ok( hr == E_POINTER || broken(hr == E_NOINTERFACE) /* w1064v1909 */, "got hr %#lx.\n", hr ); hr = pDXCoreCreateAdapterFactory( &DXCORE_ADAPTER_ATTRIBUTE_D3D11_GRAPHICS, (void **)&adapter_factory ); ok( hr == E_NOINTERFACE, "got hr %#lx.\n", hr ); - todo_wine ok( adapter_factory == NULL || broken(adapter_factory == (void *)0xdeadbeef) /* w1064v1909 */, "got adapter_factory %p.\n", adapter_factory );
hr = pDXCoreCreateAdapterFactory( &IID_IDXCoreAdapterFactory, (void **)&adapter_factory ); - todo_wine ok( hr == S_OK || broken(hr == E_NOINTERFACE) /* w1064v1909 */, "got hr %#lx.\n", hr ); if (FAILED(hr)) return;
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/dxcore/tests/dxcore.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 58424ee8b56..f41e3e21d69 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -44,6 +44,8 @@ static void test_DXCoreCreateAdapterFactory(void) { IDXCoreAdapterFactory *adapter_factory2 = (void *)0xdeadbeef; IDXCoreAdapterFactory *adapter_factory = (void *)0xdeadbeef; + IDXCoreAdapterList *adapter_list2 = (void *)0xdeadbeef; + IDXCoreAdapterList *adapter_list = (void *)0xdeadbeef; HRESULT hr; LONG ref;
@@ -72,6 +74,41 @@ static void test_DXCoreCreateAdapterFactory(void) check_interface( adapter_factory, &IID_IDXCoreAdapter, FALSE ); check_interface( adapter_factory, &IID_IDXCoreAdapterList, FALSE );
+ hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 0, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterList, (void **)&adapter_list ); + todo_wine + ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); + todo_wine + ok( adapter_list == NULL, "got adapter_list %p.\n", adapter_list ); + hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterFactory, (void **)&adapter_list ); + todo_wine + ok( hr == E_NOINTERFACE, "got hr %#lx.\n", hr ); + hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, NULL, &IID_IDXCoreAdapterFactory, (void **)&adapter_list ); + todo_wine + ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); + hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterFactory, NULL ); + todo_wine + ok( hr == E_POINTER, "got hr %#lx.\n", hr ); + + hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterList, (void **)&adapter_list ); + todo_wine + ok( hr == S_OK, "got hr %#lx.\n", hr ); + hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterList, (void **)&adapter_list2 ); + todo_wine + ok( hr == S_OK, "got hr %#lx.\n", hr ); + todo_wine + ok( adapter_list != adapter_list2, "got same adapter_list %p, adapter_list2 %p.\n", adapter_list, adapter_list ); + if (SUCCEEDED(hr)) + { + ref = IDXCoreAdapterList_Release( adapter_list2 ); + ok( ref == 0, "got ref %ld.\n", ref ); + + check_interface( adapter_list, &IID_IAgileObject, FALSE ); + check_interface( adapter_list, &IID_IDXCoreAdapter, FALSE ); + check_interface( adapter_list, &IID_IDXCoreAdapterFactory, FALSE ); + + ref = IDXCoreAdapterList_Release( adapter_list ); + ok( ref == 0, "got ref %ld.\n", ref ); + } ref = IDXCoreAdapterFactory_Release( adapter_factory ); ok( ref == 0, "got ref %ld.\n", ref ); }
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/dxcore/Makefile.in | 3 +- dlls/dxcore/dxcore.c | 121 ++++++++++++++++++++++++++++++++++++- dlls/dxcore/tests/dxcore.c | 11 ---- 3 files changed, 121 insertions(+), 14 deletions(-)
diff --git a/dlls/dxcore/Makefile.in b/dlls/dxcore/Makefile.in index 579cceded7e..147216555e9 100644 --- a/dlls/dxcore/Makefile.in +++ b/dlls/dxcore/Makefile.in @@ -1,4 +1,5 @@ -MODULE = dxcore.dll +MODULE = dxcore.dll +IMPORTS = wined3d
EXTRADLLFLAGS = -Wb,--prefer-native
diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index a07fe0c49e8..337cb50a4ae 100644 --- a/dlls/dxcore/dxcore.c +++ b/dlls/dxcore/dxcore.c @@ -21,11 +21,112 @@ #define COBJMACROS #include "initguid.h" #include "dxcore.h" +#include "wine/wined3d.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(dxcore);
+struct dxcore_adapter_list +{ + IDXCoreAdapterList IDXCoreAdapterList_iface; + LONG ref; +}; + +static inline struct dxcore_adapter_list *impl_from_IDXCoreAdapterList( IDXCoreAdapterList *iface ) +{ + return CONTAINING_RECORD( iface, struct dxcore_adapter_list, IDXCoreAdapterList_iface ); +} + +static HRESULT WINAPI dxcore_adapter_list_QueryInterface( IDXCoreAdapterList *iface, REFIID iid, void **out ) +{ + struct dxcore_adapter_list *impl = impl_from_IDXCoreAdapterList( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IDXCoreAdapterList )) + { + *out = &impl->IDXCoreAdapterList_iface; + IUnknown_AddRef( (IUnknown *)*out ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI dxcore_adapter_list_AddRef( IDXCoreAdapterList *iface ) +{ + struct dxcore_adapter_list *impl = impl_from_IDXCoreAdapterList( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI dxcore_adapter_list_Release( IDXCoreAdapterList *iface ) +{ + struct dxcore_adapter_list *impl = impl_from_IDXCoreAdapterList( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p, ref %lu.\n", iface, ref ); + + if (!ref) free( impl ); + return ref; +} + +static HRESULT WINAPI dxcore_adapter_list_GetAdapter( IDXCoreAdapterList *iface, uint32_t index, REFIID riid, void **ppv ) +{ + FIXME( "iface %p, index %u, riid %s, ppv %p stub!\n", iface, index, debugstr_guid( riid ), ppv ); + return E_NOTIMPL; +} + +static uint32_t WINAPI dxcore_adapter_list_GetAdapterCount( IDXCoreAdapterList *iface ) +{ + FIXME( "iface %p stub!\n", iface ); + return 0; +} + +static BOOL WINAPI dxcore_adapter_list_IsStale( IDXCoreAdapterList *iface ) +{ + FIXME( "iface %p stub!\n", iface ); + return FALSE; +} + +static HRESULT WINAPI dxcore_adapter_list_GetFactory( IDXCoreAdapterList *iface, REFIID riid, void **ppv ) +{ + FIXME( "iface %p, riid %s, ppv %p stub!\n", iface, debugstr_guid( riid ), ppv ); + return E_NOTIMPL; +} + +static HRESULT WINAPI dxcore_adapter_list_Sort( IDXCoreAdapterList *iface, uint32_t num_preferences, const DXCoreAdapterPreference *preferences ) +{ + FIXME( "iface %p, num_preferences %u, preferences %p stub!\n", iface, num_preferences, preferences ); + return E_NOTIMPL; +} + +static BOOL WINAPI dxcore_adapter_list_IsAdapterPreferenceSupported( IDXCoreAdapterList *iface, DXCoreAdapterPreference preference ) +{ + FIXME( "iface %p, preference %u stub!\n", iface, preference ); + return FALSE; +} + +static const struct IDXCoreAdapterListVtbl dxcore_adapter_list_vtbl = +{ + /* IUnknown methods */ + dxcore_adapter_list_QueryInterface, + dxcore_adapter_list_AddRef, + dxcore_adapter_list_Release, + /* IDXCoreAdapterList methods */ + dxcore_adapter_list_GetAdapter, + dxcore_adapter_list_GetAdapterCount, + dxcore_adapter_list_IsStale, + dxcore_adapter_list_GetFactory, + dxcore_adapter_list_Sort, + dxcore_adapter_list_IsAdapterPreferenceSupported, +}; + struct dxcore_adapter_factory_statics { IDXCoreAdapterFactory IDXCoreAdapterFactory_iface; @@ -78,8 +179,24 @@ static ULONG WINAPI dxcore_adapter_factory_statics_Release( IDXCoreAdapterFactor static HRESULT WINAPI dxcore_adapter_factory_statics_CreateAdapterList( IDXCoreAdapterFactory *iface, uint32_t num_attributes, const GUID *filter_attributes, REFIID riid, void **ppv ) { - FIXME( "iface %p, num_attributes %u, filter_attributes %p, riid %s, ppv %p stub!\n", iface, num_attributes, filter_attributes, debugstr_guid( riid ), ppv ); - return E_NOTIMPL; + struct dxcore_adapter_list *impl; + HRESULT hr; + + FIXME( "iface %p, num_attributes %u, filter_attributes %p, riid %s, ppv %p semi-stub!\n", iface, num_attributes, filter_attributes, debugstr_guid( riid ), ppv ); + + if (!ppv) return E_POINTER; + *ppv = NULL; + + if (!num_attributes || !filter_attributes) return E_INVALIDARG; + if (!(impl = calloc( 1, sizeof( *impl ) ))) return E_OUTOFMEMORY; + + impl->IDXCoreAdapterList_iface.lpVtbl = &dxcore_adapter_list_vtbl; + impl->ref = 1; + + hr = IDXCoreAdapterList_QueryInterface( &impl->IDXCoreAdapterList_iface, riid, ppv ); + IDXCoreAdapterList_Release( &impl->IDXCoreAdapterList_iface ); + TRACE( "created IDXCoreAdapterList %p.\n", *ppv ); + return hr; }
static HRESULT WINAPI dxcore_adapter_factory_statics_GetAdapterByLuid( IDXCoreAdapterFactory *iface, REFLUID adapter_luid, REFIID riid, void **ppv ) diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index f41e3e21d69..451c7153b0f 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -75,30 +75,20 @@ static void test_DXCoreCreateAdapterFactory(void) check_interface( adapter_factory, &IID_IDXCoreAdapterList, FALSE );
hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 0, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterList, (void **)&adapter_list ); - todo_wine ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); - todo_wine ok( adapter_list == NULL, "got adapter_list %p.\n", adapter_list ); hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterFactory, (void **)&adapter_list ); - todo_wine ok( hr == E_NOINTERFACE, "got hr %#lx.\n", hr ); hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, NULL, &IID_IDXCoreAdapterFactory, (void **)&adapter_list ); - todo_wine ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterFactory, NULL ); - todo_wine ok( hr == E_POINTER, "got hr %#lx.\n", hr );
hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterList, (void **)&adapter_list ); - todo_wine ok( hr == S_OK, "got hr %#lx.\n", hr ); hr = IDXCoreAdapterFactory_CreateAdapterList( adapter_factory, 1, &DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS, &IID_IDXCoreAdapterList, (void **)&adapter_list2 ); - todo_wine ok( hr == S_OK, "got hr %#lx.\n", hr ); - todo_wine ok( adapter_list != adapter_list2, "got same adapter_list %p, adapter_list2 %p.\n", adapter_list, adapter_list ); - if (SUCCEEDED(hr)) - { ref = IDXCoreAdapterList_Release( adapter_list2 ); ok( ref == 0, "got ref %ld.\n", ref );
@@ -108,7 +98,6 @@ static void test_DXCoreCreateAdapterFactory(void)
ref = IDXCoreAdapterList_Release( adapter_list ); ok( ref == 0, "got ref %ld.\n", ref ); - } ref = IDXCoreAdapterFactory_Release( adapter_factory ); ok( ref == 0, "got ref %ld.\n", ref ); }
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 | 25 +++++++++++++++++++++++-- dlls/dxcore/tests/dxcore.c | 4 ++++ 2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index 337cb50a4ae..f63f1c9f3b9 100644 --- a/dlls/dxcore/dxcore.c +++ b/dlls/dxcore/dxcore.c @@ -31,6 +31,8 @@ struct dxcore_adapter_list { IDXCoreAdapterList IDXCoreAdapterList_iface; LONG ref; + + uint32_t adapter_count; };
static inline struct dxcore_adapter_list *impl_from_IDXCoreAdapterList( IDXCoreAdapterList *iface ) @@ -84,8 +86,9 @@ static HRESULT WINAPI dxcore_adapter_list_GetAdapter( IDXCoreAdapterList *iface,
static uint32_t WINAPI dxcore_adapter_list_GetAdapterCount( IDXCoreAdapterList *iface ) { - FIXME( "iface %p stub!\n", iface ); - return 0; + struct dxcore_adapter_list *impl = impl_from_IDXCoreAdapterList( iface ); + TRACE( "iface %p\n", iface ); + return impl->adapter_count; }
static BOOL WINAPI dxcore_adapter_list_IsStale( IDXCoreAdapterList *iface ) @@ -176,6 +179,19 @@ static ULONG WINAPI dxcore_adapter_factory_statics_Release( IDXCoreAdapterFactor return ref; }
+static HRESULT get_adapters( struct dxcore_adapter_list *impl ) +{ + struct wined3d *wined3d = wined3d_create( 0 ); + HRESULT hr = S_OK; + + if (!wined3d) return E_FAIL; + + impl->adapter_count = wined3d_get_adapter_count( wined3d ); + + wined3d_decref( wined3d ); + return hr; +} + static HRESULT WINAPI dxcore_adapter_factory_statics_CreateAdapterList( IDXCoreAdapterFactory *iface, uint32_t num_attributes, const GUID *filter_attributes, REFIID riid, void **ppv ) { @@ -192,6 +208,11 @@ static HRESULT WINAPI dxcore_adapter_factory_statics_CreateAdapterList( IDXCoreA
impl->IDXCoreAdapterList_iface.lpVtbl = &dxcore_adapter_list_vtbl; impl->ref = 1; + if (FAILED(hr = get_adapters( impl ))) + { + IDXCoreAdapterList_Release( &impl->IDXCoreAdapterList_iface ); + return hr; + }
hr = IDXCoreAdapterList_QueryInterface( &impl->IDXCoreAdapterList_iface, riid, ppv ); IDXCoreAdapterList_Release( &impl->IDXCoreAdapterList_iface ); diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 451c7153b0f..c50bf1aa999 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -46,6 +46,7 @@ static void test_DXCoreCreateAdapterFactory(void) IDXCoreAdapterFactory *adapter_factory = (void *)0xdeadbeef; IDXCoreAdapterList *adapter_list2 = (void *)0xdeadbeef; IDXCoreAdapterList *adapter_list = (void *)0xdeadbeef; + uint32_t adapter_count = 0; HRESULT hr; LONG ref;
@@ -96,6 +97,9 @@ static void test_DXCoreCreateAdapterFactory(void) check_interface( adapter_list, &IID_IDXCoreAdapter, FALSE ); check_interface( adapter_list, &IID_IDXCoreAdapterFactory, FALSE );
+ adapter_count = IDXCoreAdapterList_GetAdapterCount( adapter_list ); + ok( adapter_count != 0, "IDXCoreAdapterList_GetAdapterCount returned 0.\n" ); + ref = IDXCoreAdapterList_Release( adapter_list ); ok( ref == 0, "got ref %ld.\n", ref ); ref = IDXCoreAdapterFactory_Release( adapter_factory );
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/dxcore/tests/dxcore.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index c50bf1aa999..00c441732f0 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -46,6 +46,8 @@ static void test_DXCoreCreateAdapterFactory(void) IDXCoreAdapterFactory *adapter_factory = (void *)0xdeadbeef; IDXCoreAdapterList *adapter_list2 = (void *)0xdeadbeef; IDXCoreAdapterList *adapter_list = (void *)0xdeadbeef; + IDXCoreAdapter *adapter2 = (void *)0xdeadbeef; + IDXCoreAdapter *adapter = (void *)0xdeadbeef; uint32_t adapter_count = 0; HRESULT hr; LONG ref; @@ -100,6 +102,39 @@ static void test_DXCoreCreateAdapterFactory(void) adapter_count = IDXCoreAdapterList_GetAdapterCount( adapter_list ); ok( adapter_count != 0, "IDXCoreAdapterList_GetAdapterCount returned 0.\n" );
+ hr = IDXCoreAdapterList_GetAdapter( adapter_list, 0xdeadbeef, &IID_IDXCoreAdapter, NULL ); + todo_wine + ok( hr == E_POINTER, "got hr %#lx.\n", hr ); + hr = IDXCoreAdapterList_GetAdapter( adapter_list, adapter_count, &IID_IDXCoreAdapter, (void **)&adapter ); + todo_wine + ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); + todo_wine + ok( adapter == NULL, "got adapter %p.\n", adapter ); + hr = IDXCoreAdapterList_GetAdapter( adapter_list, 0, &IID_IDXCoreAdapterList, (void **)&adapter ); + todo_wine + ok( hr == E_NOINTERFACE, "got hr %#lx.\n", hr ); + + hr = IDXCoreAdapterList_GetAdapter( adapter_list, 0, &IID_IDXCoreAdapter, (void **)&adapter ); + todo_wine + ok( hr == S_OK, "got hr %#lx.\n", hr ); + if (SUCCEEDED(hr)) + { + hr = IDXCoreAdapterList_GetAdapter( adapter_list, 0, &IID_IDXCoreAdapter, (void **)&adapter2 ); + todo_wine + ok( hr == S_OK, "got hr %#lx.\n", hr ); + ok( adapter == adapter2, "got adapter %p, adapter2 %p.\n", adapter, adapter2 ); + ref = IDXCoreAdapter_Release( adapter2 ); + todo_wine + ok( ref == 3, "got ref %ld.\n", ref ); + + check_interface( adapter, &IID_IAgileObject, FALSE ); + check_interface( adapter, &IID_IDXCoreAdapterList, FALSE ); + check_interface( adapter, &IID_IDXCoreAdapterFactory, FALSE ); + + ref = IDXCoreAdapter_Release( adapter ); + todo_wine + ok( ref == 2, "got ref %ld.\n", ref ); + } ref = IDXCoreAdapterList_Release( adapter_list ); ok( ref == 0, "got ref %ld.\n", ref ); ref = IDXCoreAdapterFactory_Release( adapter_factory );
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/dxcore/dxcore.c | 180 ++++++++++++++++++++++++++++++++++++- dlls/dxcore/tests/dxcore.c | 9 -- 2 files changed, 176 insertions(+), 13 deletions(-)
diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index f63f1c9f3b9..38598f99a89 100644 --- a/dlls/dxcore/dxcore.c +++ b/dlls/dxcore/dxcore.c @@ -27,11 +27,144 @@
WINE_DEFAULT_DEBUG_CHANNEL(dxcore);
+struct dxcore_adapter +{ + IDXCoreAdapter IDXCoreAdapter_iface; + LONG ref; +}; + +static inline struct dxcore_adapter *impl_from_IDXCoreAdapter( IDXCoreAdapter *iface ) +{ + return CONTAINING_RECORD( iface, struct dxcore_adapter, IDXCoreAdapter_iface ); +} + +static HRESULT WINAPI dxcore_adapter_QueryInterface( IDXCoreAdapter *iface, REFIID iid, void **out ) +{ + struct dxcore_adapter *impl = impl_from_IDXCoreAdapter( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IDXCoreAdapter )) + { + *out = &impl->IDXCoreAdapter_iface; + IUnknown_AddRef( (IUnknown *)*out ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI dxcore_adapter_AddRef( IDXCoreAdapter *iface ) +{ + struct dxcore_adapter *impl = impl_from_IDXCoreAdapter( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI dxcore_adapter_Release( IDXCoreAdapter *iface ) +{ + struct dxcore_adapter *impl = impl_from_IDXCoreAdapter( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p, ref %lu.\n", iface, ref ); + + if (!ref) free( impl ); + return ref; +} + +static BOOL WINAPI dxcore_adapter_IsValid( IDXCoreAdapter *iface ) +{ + FIXME( "iface %p stub!\n", iface ); + return FALSE; +} + +static BOOL WINAPI dxcore_adapter_IsAttributeSupported( IDXCoreAdapter *iface, REFGUID attribute ) +{ + FIXME( "iface %p, attribute %s stub!\n", iface, debugstr_guid( attribute ) ); + return FALSE; +} + +static BOOL WINAPI dxcore_adapter_IsPropertySupported( IDXCoreAdapter *iface, DXCoreAdapterProperty property ) +{ + FIXME( "iface %p, property %u stub!\n", iface, property ); + return FALSE; +} + +static HRESULT WINAPI 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; +} + +static HRESULT WINAPI dxcore_adapter_GetPropertySize( IDXCoreAdapter *iface, DXCoreAdapterProperty property, size_t *buffer_size ) +{ + FIXME( "iface %p, property %u, buffer_size %p stub!\n", iface, property, buffer_size ); + return E_NOTIMPL; +} + +static BOOL WINAPI dxcore_adapter_IsQueryStateSupported( IDXCoreAdapter *iface, DXCoreAdapterState property ) +{ + FIXME( "iface %p, property %u stub!\n", iface, property ); + return FALSE; +} + +static HRESULT WINAPI dxcore_adapter_QueryState( IDXCoreAdapter *iface, DXCoreAdapterState state, size_t state_details_size, + const void *state_details, size_t buffer_size, void *buffer ) +{ + FIXME( "iface %p, state %u, state_details_size %Iu, state_details %p, buffer_size %Iu, buffer %p stub!\n", + iface, state, state_details_size, state_details, buffer_size, buffer ); + return E_NOTIMPL; +} + +static BOOL WINAPI dxcore_adapter_IsSetStateSupported( IDXCoreAdapter *iface, DXCoreAdapterState property ) +{ + FIXME( "iface %p, property %u stub!\n", iface, property ); + return FALSE; +} + +static HRESULT WINAPI dxcore_adapter_SetState( IDXCoreAdapter *iface, DXCoreAdapterState state, size_t state_details_size, + const void *state_details, size_t buffer_size, const void *buffer ) +{ + FIXME( "iface %p, state %u, state_details_size %Iu, state_details %p, buffer_size %Iu, buffer %p stub!\n", + iface, state, state_details_size, state_details, buffer_size, buffer ); + return E_NOTIMPL; +} + +static HRESULT WINAPI dxcore_adapter_GetFactory( IDXCoreAdapter *iface, REFIID riid, void **ppv ) +{ + FIXME( "iface %p, riid %s, ppv %p stub!\n", iface, debugstr_guid( riid ), ppv ); + return E_NOTIMPL; +} + +static const struct IDXCoreAdapterVtbl dxcore_adapter_vtbl = +{ + /* IUnknown methods */ + dxcore_adapter_QueryInterface, + dxcore_adapter_AddRef, + dxcore_adapter_Release, + /* IDXCoreAdapter methods */ + dxcore_adapter_IsValid, + dxcore_adapter_IsAttributeSupported, + dxcore_adapter_IsPropertySupported, + dxcore_adapter_GetProperty, + dxcore_adapter_GetPropertySize, + dxcore_adapter_IsQueryStateSupported, + dxcore_adapter_QueryState, + dxcore_adapter_IsSetStateSupported, + dxcore_adapter_SetState, + dxcore_adapter_GetFactory, +}; + struct dxcore_adapter_list { IDXCoreAdapterList IDXCoreAdapterList_iface; LONG ref;
+ struct dxcore_adapter **adapters; uint32_t adapter_count; };
@@ -74,14 +207,33 @@ static ULONG WINAPI dxcore_adapter_list_Release( IDXCoreAdapterList *iface )
TRACE( "iface %p, ref %lu.\n", iface, ref );
- if (!ref) free( impl ); + if (!ref) + { + for (UINT i = 0; i < impl->adapter_count; i++) + if (impl->adapters[i]) IDXCoreAdapter_Release( &impl->adapters[i]->IDXCoreAdapter_iface ); + free( impl->adapters ); + free( impl ); + } return ref; }
static HRESULT WINAPI dxcore_adapter_list_GetAdapter( IDXCoreAdapterList *iface, uint32_t index, REFIID riid, void **ppv ) { - FIXME( "iface %p, index %u, riid %s, ppv %p stub!\n", iface, index, debugstr_guid( riid ), ppv ); - return E_NOTIMPL; + struct dxcore_adapter_list *impl = impl_from_IDXCoreAdapterList( iface ); + IDXCoreAdapter *adapter; + + TRACE( "iface %p, index %u, riid %s, ppv %p\n", iface, index, debugstr_guid( riid ), ppv ); + + if (!ppv) return E_POINTER; + if (index >= impl->adapter_count) + { + *ppv = NULL; + return E_INVALIDARG; + } + + adapter = &impl->adapters[index]->IDXCoreAdapter_iface; + TRACE( "returning IDXCoreAdapter %p for index %u.\n", adapter, index ); + return IDXCoreAdapter_QueryInterface( adapter, riid, ppv ); }
static uint32_t WINAPI dxcore_adapter_list_GetAdapterCount( IDXCoreAdapterList *iface ) @@ -185,9 +337,29 @@ static HRESULT get_adapters( struct dxcore_adapter_list *impl ) HRESULT hr = S_OK;
if (!wined3d) return E_FAIL; + if (!(impl->adapter_count = wined3d_get_adapter_count( wined3d ) )) goto done; + if (!(impl->adapters = calloc( impl->adapter_count, sizeof( *impl->adapters ) ))) + { + hr = E_OUTOFMEMORY; + goto done; + }
- impl->adapter_count = wined3d_get_adapter_count( wined3d ); + for (UINT i = 0; i < impl->adapter_count; i++) + { + struct dxcore_adapter *dxcore_adapter = calloc( 1, sizeof( *dxcore_adapter )); + + if (!dxcore_adapter) + { + hr = E_OUTOFMEMORY; + goto done; + } + + dxcore_adapter->IDXCoreAdapter_iface.lpVtbl = &dxcore_adapter_vtbl; + dxcore_adapter->ref = 1;
+ impl->adapters[i] = dxcore_adapter; + } +done: wined3d_decref( wined3d ); return hr; } diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 00c441732f0..5c845f05cb4 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -103,24 +103,16 @@ static void test_DXCoreCreateAdapterFactory(void) ok( adapter_count != 0, "IDXCoreAdapterList_GetAdapterCount returned 0.\n" );
hr = IDXCoreAdapterList_GetAdapter( adapter_list, 0xdeadbeef, &IID_IDXCoreAdapter, NULL ); - todo_wine ok( hr == E_POINTER, "got hr %#lx.\n", hr ); hr = IDXCoreAdapterList_GetAdapter( adapter_list, adapter_count, &IID_IDXCoreAdapter, (void **)&adapter ); - todo_wine ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); - todo_wine ok( adapter == NULL, "got adapter %p.\n", adapter ); hr = IDXCoreAdapterList_GetAdapter( adapter_list, 0, &IID_IDXCoreAdapterList, (void **)&adapter ); - todo_wine ok( hr == E_NOINTERFACE, "got hr %#lx.\n", hr );
hr = IDXCoreAdapterList_GetAdapter( adapter_list, 0, &IID_IDXCoreAdapter, (void **)&adapter ); - todo_wine ok( hr == S_OK, "got hr %#lx.\n", hr ); - if (SUCCEEDED(hr)) - { hr = IDXCoreAdapterList_GetAdapter( adapter_list, 0, &IID_IDXCoreAdapter, (void **)&adapter2 ); - todo_wine ok( hr == S_OK, "got hr %#lx.\n", hr ); ok( adapter == adapter2, "got adapter %p, adapter2 %p.\n", adapter, adapter2 ); ref = IDXCoreAdapter_Release( adapter2 ); @@ -134,7 +126,6 @@ static void test_DXCoreCreateAdapterFactory(void) ref = IDXCoreAdapter_Release( adapter ); todo_wine ok( ref == 2, "got ref %ld.\n", ref ); - } ref = IDXCoreAdapterList_Release( adapter_list ); ok( ref == 0, "got ref %ld.\n", ref ); ref = IDXCoreAdapterFactory_Release( adapter_factory );
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- dlls/dxcore/tests/dxcore.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 5c845f05cb4..07f7a9831ab 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -48,6 +48,8 @@ static void test_DXCoreCreateAdapterFactory(void) IDXCoreAdapterList *adapter_list = (void *)0xdeadbeef; IDXCoreAdapter *adapter2 = (void *)0xdeadbeef; IDXCoreAdapter *adapter = (void *)0xdeadbeef; + struct DXCoreHardwareID *hardware_id; + void *buffer = (void *)0xdeadbeef; uint32_t adapter_count = 0; HRESULT hr; LONG ref; @@ -123,6 +125,39 @@ static void test_DXCoreCreateAdapterFactory(void) check_interface( adapter, &IID_IDXCoreAdapterList, FALSE ); 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 ); + ref = IDXCoreAdapter_Release( adapter ); todo_wine ok( ref == 2, "got ref %ld.\n", ref );
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 | 41 ++++++++++++++++++++++++++++++++++++-- dlls/dxcore/tests/dxcore.c | 8 -------- 2 files changed, 39 insertions(+), 10 deletions(-)
diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index 38598f99a89..2b4ac18e5ef 100644 --- a/dlls/dxcore/dxcore.c +++ b/dlls/dxcore/dxcore.c @@ -31,6 +31,8 @@ struct dxcore_adapter { IDXCoreAdapter IDXCoreAdapter_iface; LONG ref; + + struct wined3d_adapter_identifier identifier; };
static inline struct dxcore_adapter *impl_from_IDXCoreAdapter( IDXCoreAdapter *iface ) @@ -96,8 +98,35 @@ static BOOL WINAPI dxcore_adapter_IsPropertySupported( IDXCoreAdapter *iface, DX
static HRESULT WINAPI 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 *impl = 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 = impl->identifier.vendor_id; + hardware_id->deviceID = impl->identifier.device_id; + hardware_id->subSysID = impl->identifier.subsystem_id; + hardware_id->revision = impl->identifier.revision; + break; + } + default: + { + FIXME( "property %u not implemented.\n", property ); + return DXGI_ERROR_INVALID_CALL; + } + } + + return S_OK; }
static HRESULT WINAPI dxcore_adapter_GetPropertySize( IDXCoreAdapter *iface, DXCoreAdapterProperty property, size_t *buffer_size ) @@ -347,6 +376,7 @@ static HRESULT get_adapters( struct dxcore_adapter_list *impl ) for (UINT i = 0; i < impl->adapter_count; i++) { struct dxcore_adapter *dxcore_adapter = calloc( 1, sizeof( *dxcore_adapter )); + const struct wined3d_adapter *wined3d_adapter;
if (!dxcore_adapter) { @@ -354,6 +384,13 @@ static HRESULT get_adapters( struct dxcore_adapter_list *impl ) 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->ref = 1;
diff --git a/dlls/dxcore/tests/dxcore.c b/dlls/dxcore/tests/dxcore.c index 07f7a9831ab..a492a698514 100644 --- a/dlls/dxcore/tests/dxcore.c +++ b/dlls/dxcore/tests/dxcore.c @@ -126,36 +126,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 );
ref = IDXCoreAdapter_Release( adapter );
On Fri May 16 05:59:55 2025 +0000, Mohamad Al-Jaf wrote:
Sounds good, is the current style okay or do you want it to match the wined3d one?
Yes, if it's under the d3d umbrella I'd appreciate it matching d3d style.
On Sun May 18 07:15:57 2025 +0000, Mohamad Al-Jaf wrote:
Sure, I was going to implement it in a second MR, but it's nice to have someone test it. I've pushed the implementation. It works in Gigapixel AI so it's likely to also work in Photo AI.
Thank you! This gets it much further along in starting up. Looks like there's some additional issues to work through, but not in dxcore.