Module: wine Branch: master Commit: 0491fcce303a3bd7c88e4c625181d8a65c1ea2f8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0491fcce303a3bd7c88e4c6251...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Fri Dec 4 11:50:49 2009 +0100
dxgi: Implement IDXGIAdapter::GetDesc().
---
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