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 | 39 ++++++++++++++++++++++++++++++++++++-- dlls/dxcore/tests/dxcore.c | 8 -------- 2 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/dlls/dxcore/dxcore.c b/dlls/dxcore/dxcore.c index 38598f99a89..95b53549567 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,33 @@ 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 +374,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 +382,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 98be90a6c45..50838059002 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 );