[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