[PATCH 4/5] dxgi: Implement IDXGIAdapter1.
Henri Verbeet
hverbeet at codeweavers.com
Tue Jan 28 03:09:25 CST 2014
---
dlls/dxgi/adapter.c | 64 ++++++++++++++++++++++++++++++---------------
dlls/dxgi/tests/device.c | 29 ++++++++++++++++++++
include/wine/winedxgi.idl | 2 +-
3 files changed, 73 insertions(+), 22 deletions(-)
diff --git a/dlls/dxgi/adapter.c b/dlls/dxgi/adapter.c
index 87d886b..d18db85 100644
--- a/dlls/dxgi/adapter.c
+++ b/dlls/dxgi/adapter.c
@@ -38,6 +38,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_adapter_QueryInterface(IWineDXGIAdapter *i
if (IsEqualGUID(riid, &IID_IUnknown)
|| IsEqualGUID(riid, &IID_IDXGIObject)
|| IsEqualGUID(riid, &IID_IDXGIAdapter)
+ || IsEqualGUID(riid, &IID_IDXGIAdapter1)
|| IsEqualGUID(riid, &IID_IWineDXGIAdapter))
{
IUnknown_AddRef(iface);
@@ -135,9 +136,9 @@ static HRESULT STDMETHODCALLTYPE dxgi_adapter_EnumOutputs(IWineDXGIAdapter *ifac
return S_OK;
}
-static HRESULT STDMETHODCALLTYPE dxgi_adapter_GetDesc(IWineDXGIAdapter *iface, DXGI_ADAPTER_DESC *desc)
+static HRESULT STDMETHODCALLTYPE dxgi_adapter_GetDesc1(IWineDXGIAdapter *iface, DXGI_ADAPTER_DESC1 *desc)
{
- struct dxgi_adapter *This = impl_from_IWineDXGIAdapter(iface);
+ struct dxgi_adapter *adapter = impl_from_IWineDXGIAdapter(iface);
struct wined3d_adapter_identifier adapter_id;
char description[128];
struct wined3d *wined3d;
@@ -145,38 +146,57 @@ static HRESULT STDMETHODCALLTYPE dxgi_adapter_GetDesc(IWineDXGIAdapter *iface, D
TRACE("iface %p, desc %p.\n", iface, desc);
- if (!desc) return E_INVALIDARG;
+ if (!desc)
+ return E_INVALIDARG;
- wined3d = IWineDXGIFactory_get_wined3d(This->parent);
+ wined3d = IWineDXGIFactory_get_wined3d(adapter->parent);
adapter_id.driver_size = 0;
adapter_id.description = description;
adapter_id.description_size = sizeof(description);
adapter_id.device_name_size = 0;
EnterCriticalSection(&dxgi_cs);
- hr = wined3d_get_adapter_identifier(wined3d, This->ordinal, 0, &adapter_id);
+ hr = wined3d_get_adapter_identifier(wined3d, adapter->ordinal, 0, &adapter_id);
wined3d_decref(wined3d);
LeaveCriticalSection(&dxgi_cs);
- if (SUCCEEDED(hr))
+ if (FAILED(hr))
+ return hr;
+
+ if (!MultiByteToWideChar(CP_ACP, 0, description, -1, desc->Description, 128))
{
- if (!MultiByteToWideChar(CP_ACP, 0, description, -1, desc->Description, 128))
- {
- DWORD err = GetLastError();
- ERR("Failed to translate description %s (%#x).\n", debugstr_a(description), err);
- hr = E_FAIL;
- }
-
- desc->VendorId = adapter_id.vendor_id;
- desc->DeviceId = adapter_id.device_id;
- desc->SubSysId = adapter_id.subsystem_id;
- desc->Revision = adapter_id.revision;
- desc->DedicatedVideoMemory = adapter_id.video_memory;
- desc->DedicatedSystemMemory = 0; /* FIXME */
- desc->SharedSystemMemory = 0; /* FIXME */
- memcpy(&desc->AdapterLuid, &adapter_id.adapter_luid, sizeof(desc->AdapterLuid));
+ DWORD err = GetLastError();
+ ERR("Failed to translate description %s (%#x).\n", debugstr_a(description), err);
+ hr = E_FAIL;
}
+ desc->VendorId = adapter_id.vendor_id;
+ desc->DeviceId = adapter_id.device_id;
+ desc->SubSysId = adapter_id.subsystem_id;
+ desc->Revision = adapter_id.revision;
+ desc->DedicatedVideoMemory = adapter_id.video_memory;
+ desc->DedicatedSystemMemory = 0; /* FIXME */
+ desc->SharedSystemMemory = 0; /* FIXME */
+ memcpy(&desc->AdapterLuid, &adapter_id.adapter_luid, sizeof(desc->AdapterLuid));
+ desc->Flags = 0;
+
+ return hr;
+}
+
+static HRESULT STDMETHODCALLTYPE dxgi_adapter_GetDesc(IWineDXGIAdapter *iface, DXGI_ADAPTER_DESC *desc)
+{
+ DXGI_ADAPTER_DESC1 desc1;
+ HRESULT hr;
+
+ TRACE("iface %p, desc %p.\n", iface, desc);
+
+ if (!desc)
+ return E_INVALIDARG;
+
+ if (FAILED(hr = dxgi_adapter_GetDesc1(iface, &desc1)))
+ return hr;
+ memcpy(desc, &desc1, sizeof(*desc));
+
return hr;
}
@@ -214,6 +234,8 @@ static const struct IWineDXGIAdapterVtbl dxgi_adapter_vtbl =
dxgi_adapter_EnumOutputs,
dxgi_adapter_GetDesc,
dxgi_adapter_CheckInterfaceSupport,
+ /* IDXGIAdapter1 methods */
+ dxgi_adapter_GetDesc1,
/* IWineDXGIAdapter methods */
dxgi_adapter_get_ordinal,
};
diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c
index 9be59db..b8e7b33 100644
--- a/dlls/dxgi/tests/device.c
+++ b/dlls/dxgi/tests/device.c
@@ -101,6 +101,8 @@ static void test_device_interfaces(IDXGIDevice *device)
static void test_adapter_desc(IDXGIDevice *device)
{
+ DXGI_ADAPTER_DESC1 desc1;
+ IDXGIAdapter1 *adapter1;
DXGI_ADAPTER_DESC desc;
IDXGIAdapter *adapter;
HRESULT hr;
@@ -126,6 +128,33 @@ static void test_adapter_desc(IDXGIDevice *device)
desc.SharedSystemMemory, desc.SharedSystemMemory / (1024 * 1024));
trace("LUID: %08x:%08x.\n", desc.AdapterLuid.HighPart, desc.AdapterLuid.LowPart);
+ hr = IDXGIAdapter_QueryInterface(adapter, &IID_IDXGIAdapter1, (void **)&adapter1);
+ ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE), "Got unexpected hr %#x.\n", hr);
+ if (hr == E_NOINTERFACE)
+ goto done;
+
+ hr = IDXGIAdapter1_GetDesc1(adapter1, &desc1);
+ ok(SUCCEEDED(hr), "GetDesc1 failed, hr %#x.\n", hr);
+
+ ok(!lstrcmpW(desc.Description, desc1.Description),
+ "Got unexpected description %s.\n", wine_dbgstr_w(desc1.Description));
+ ok(desc1.VendorId == desc.VendorId, "Got unexpected vendor ID %04x.\n", desc1.VendorId);
+ ok(desc1.DeviceId == desc.DeviceId, "Got unexpected device ID %04x.\n", desc1.DeviceId);
+ ok(desc1.SubSysId == desc.SubSysId, "Got unexpected sub system ID %04x.\n", desc1.SubSysId);
+ ok(desc1.Revision == desc.Revision, "Got unexpected revision %02x.\n", desc1.Revision);
+ ok(desc1.DedicatedVideoMemory == desc.DedicatedVideoMemory,
+ "Got unexpected dedicated video memory %lu.\n", desc1.DedicatedVideoMemory);
+ ok(desc1.DedicatedSystemMemory == desc.DedicatedSystemMemory,
+ "Got unexpected dedicated system memory %lu.\n", desc1.DedicatedSystemMemory);
+ ok(desc1.SharedSystemMemory == desc.SharedSystemMemory,
+ "Got unexpected shared system memory %lu.\n", desc1.SharedSystemMemory);
+ ok(!memcmp(&desc.AdapterLuid, &desc1.AdapterLuid, sizeof(desc.AdapterLuid)),
+ "Got unexpected adapter LUID %08x:%08x.\n", desc1.AdapterLuid.HighPart, desc1.AdapterLuid.LowPart);
+ trace("Flags: %08x.\n", desc1.Flags);
+
+ IDXGIAdapter1_Release(adapter1);
+
+done:
IDXGIAdapter_Release(adapter);
}
diff --git a/include/wine/winedxgi.idl b/include/wine/winedxgi.idl
index 363030a..a3baece 100644
--- a/include/wine/winedxgi.idl
+++ b/include/wine/winedxgi.idl
@@ -33,7 +33,7 @@ interface IWineDXGIFactory : IDXGIFactory
local,
uuid(ab1de34c-2963-4ffd-8493-40f580e510e5)
]
-interface IWineDXGIAdapter : IDXGIAdapter
+interface IWineDXGIAdapter : IDXGIAdapter1
{
UINT get_ordinal();
}
--
1.7.10.4
More information about the wine-patches
mailing list