[PATCH 4/5] dxgi: Implement IDXGIAdapter::GetDesc().

Henri Verbeet hverbeet at codeweavers.com
Fri Dec 4 04:50:49 CST 2009


---
 dlls/dxgi/adapter.c      |   46 ++++++++++++++++++++++++++++++++++++++++++----
 dlls/dxgi/dxgi_main.c    |    2 +-
 dlls/dxgi/dxgi_private.h |    5 +++--
 dlls/wined3d/directx.c   |    1 +
 include/wine/wined3d.idl |    1 +
 5 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/dlls/dxgi/adapter.c b/dlls/dxgi/adapter.c
index d13e3e1..7046d7c 100644
--- a/dlls/dxgi/adapter.c
+++ b/dlls/dxgi/adapter.c
@@ -104,7 +104,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_adapter_GetParent(IWineDXGIAdapter *iface,
 
     TRACE("iface %p, riid %s, parent %p\n", iface, debugstr_guid(riid), parent);
 
-    return IDXGIFactory_QueryInterface(This->parent, riid, parent);
+    return IWineDXGIFactory_QueryInterface(This->parent, riid, parent);
 }
 
 /* IDXGIAdapter methods */
@@ -132,9 +132,47 @@ static HRESULT STDMETHODCALLTYPE dxgi_adapter_EnumOutputs(IWineDXGIAdapter *ifac
 
 static HRESULT STDMETHODCALLTYPE dxgi_adapter_GetDesc(IWineDXGIAdapter *iface, DXGI_ADAPTER_DESC *desc)
 {
-    FIXME("iface %p, desc %p stub!\n", iface, desc);
+    struct dxgi_adapter *This = (struct dxgi_adapter *)iface;
+    WINED3DADAPTER_IDENTIFIER adapter_id;
+    char description[128];
+    IWineD3D *wined3d;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, desc %p.\n", iface, desc);
+
+    if (!desc) return E_INVALIDARG;
+
+    wined3d = IWineDXGIFactory_get_wined3d(This->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 = IWineD3D_GetAdapterIdentifier(wined3d, This->ordinal, 0, &adapter_id);
+    IWineD3D_Release(wined3d);
+    LeaveCriticalSection(&dxgi_cs);
+
+    if (SUCCEEDED(hr))
+    {
+        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));
+    }
+
+    return hr;
 }
 
 static HRESULT STDMETHODCALLTYPE dxgi_adapter_CheckInterfaceSupport(IWineDXGIAdapter *iface,
@@ -175,7 +213,7 @@ static const struct IWineDXGIAdapterVtbl dxgi_adapter_vtbl =
     dxgi_adapter_get_ordinal,
 };
 
-HRESULT dxgi_adapter_init(struct dxgi_adapter *adapter, IDXGIFactory *parent, UINT ordinal)
+HRESULT dxgi_adapter_init(struct dxgi_adapter *adapter, IWineDXGIFactory *parent, UINT ordinal)
 {
     struct dxgi_output *output;
 
diff --git a/dlls/dxgi/dxgi_main.c b/dlls/dxgi/dxgi_main.c
index 3b153ab..489f986 100644
--- a/dlls/dxgi/dxgi_main.c
+++ b/dlls/dxgi/dxgi_main.c
@@ -129,7 +129,7 @@ HRESULT WINAPI CreateDXGIFactory(REFIID riid, void **factory)
             goto fail;
         }
 
-        hr = dxgi_adapter_init(adapter, (IDXGIFactory *)object, i);
+        hr = dxgi_adapter_init(adapter, (IWineDXGIFactory *)object, i);
         if (FAILED(hr))
         {
             UINT j;
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index 2929534..033168b 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -26,6 +26,7 @@
 #include "wingdi.h"
 #include "winuser.h"
 #include "objbase.h"
+#include "winnls.h"
 
 #include "dxgi.h"
 #ifdef DXGI_INIT_GUID
@@ -111,13 +112,13 @@ void dxgi_output_init(struct dxgi_output *output, struct dxgi_adapter *adapter)
 struct dxgi_adapter
 {
     const struct IWineDXGIAdapterVtbl *vtbl;
-    IDXGIFactory *parent;
+    IWineDXGIFactory *parent;
     LONG refcount;
     UINT ordinal;
     IDXGIOutput *output;
 };
 
-HRESULT dxgi_adapter_init(struct dxgi_adapter *adapter, IDXGIFactory *parent, UINT ordinal) DECLSPEC_HIDDEN;
+HRESULT dxgi_adapter_init(struct dxgi_adapter *adapter, IWineDXGIFactory *parent, UINT ordinal) DECLSPEC_HIDDEN;
 
 /* IDXGISwapChain */
 extern const struct IDXGISwapChainVtbl dxgi_swapchain_vtbl DECLSPEC_HIDDEN;
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 5e00438..60db4a4 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2425,6 +2425,7 @@ static HRESULT WINAPI IWineD3DImpl_GetAdapterIdentifier(IWineD3D *iface, UINT Ad
     memcpy(&pIdentifier->device_identifier, &IID_D3DDEVICE_D3DUID, sizeof(pIdentifier->device_identifier));
     pIdentifier->whql_level = (Flags & WINED3DENUM_NO_WHQL_LEVEL) ? 0 : 1;
     memcpy(&pIdentifier->adapter_luid, &adapter->luid, sizeof(pIdentifier->adapter_luid));
+    pIdentifier->video_memory = adapter->TextureRam;
 
     return WINED3D_OK;
 }
diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl
index da21af8..8bcc2a8 100644
--- a/include/wine/wined3d.idl
+++ b/include/wine/wined3d.idl
@@ -1706,6 +1706,7 @@ typedef struct _WINED3DADAPTER_IDENTIFIER
     GUID device_identifier;
     DWORD whql_level;
     LUID adapter_luid;
+    SIZE_T video_memory;
 } WINED3DADAPTER_IDENTIFIER;
 
 typedef struct _WINED3DPRESENT_PARAMETERS
-- 
1.6.4.4




More information about the wine-patches mailing list