From 116b807b9c375dba3f2a551efda492571b3d29f1 Mon Sep 17 00:00:00 2001 From: Vitaliy Margolen Date: Thu, 12 Jul 2007 07:18:01 -0600 Subject: [PATCH] dxdiagn: Add reporting of some display related information. --- dlls/dxdiagn/Makefile.in | 2 +- dlls/dxdiagn/provider.c | 114 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 100 insertions(+), 16 deletions(-) diff --git a/dlls/dxdiagn/Makefile.in b/dlls/dxdiagn/Makefile.in index e2cf511c918..132d8285cbe 100644 --- a/dlls/dxdiagn/Makefile.in +++ b/dlls/dxdiagn/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = dxdiagn.dll -IMPORTS = version ole32 oleaut32 user32 advapi32 kernel32 +IMPORTS = ddraw version ole32 oleaut32 user32 advapi32 kernel32 EXTRALIBS = -lstrmiids -ldxguid -luuid C_SRCS = \ diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c index 260c3a73fb5..fe0543cd727 100644 --- a/dlls/dxdiagn/provider.c +++ b/dlls/dxdiagn/provider.c @@ -31,6 +31,7 @@ #include "strmif.h" #include "vfw.h" #include "mmddk.h" +#include WINE_DEFAULT_DEBUG_CHANNEL(dxdiag); @@ -138,6 +139,32 @@ HRESULT DXDiag_CreateDXDiagProvider(LPCLASSFACTORY iface, LPUNKNOWN punkOuter, R return IDxDiagProviderImpl_QueryInterface ((PDXDIAGPROVIDER)provider, riid, ppobj); } +static inline HRESULT add_prop_str( IDxDiagContainer* cont, LPCWSTR prop, LPCWSTR str ) +{ + HRESULT hr; + VARIANT var; + + V_VT( &var ) = VT_BSTR; + V_BSTR( &var ) = SysAllocString( str ); + hr = IDxDiagContainerImpl_AddProp( cont, prop, &var ); + VariantClear( &var ); + + return hr; +} + +static inline HRESULT add_prop_ui4( IDxDiagContainer* cont, LPCWSTR prop, DWORD data ) +{ + HRESULT hr; + VARIANT var; + + V_VT( &var ) = VT_UI4; + V_UI4( &var ) = data; + hr = IDxDiagContainerImpl_AddProp( cont, prop, &var ); + VariantClear( &var ); + + return hr; +} + /** * @param szFilePath: usually GetSystemDirectoryW * @param szFileName: name of the dll without path @@ -389,21 +416,78 @@ static HRESULT DXDiag_InitDXDiagDirectXFilesContainer(IDxDiagContainer* pSubCont return hr; } -static HRESULT DXDiag_InitDXDiagDisplayContainer(IDxDiagContainer* pSubCont) { - HRESULT hr = S_OK; - /* - static const WCHAR szDescription[] = {'s','z','D','e','s','c','r','i','p','t','i','o','n',0}; - static const WCHAR szDeviceName[] = {'s','z','D','e','v','i','c','e','N','a','m','e',0}; - static const WCHAR szKeyDeviceID[] = {'s','z','K','e','y','D','e','v','i','c','e','I','D',0}; - static const WCHAR szKeyDeviceKey[] = {'s','z','K','e','y','D','e','v','i','c','e','K','e','y',0}; - WCHAR szAdapterName[512]; - VARIANT v; - IDxDiagContainer* pDisplayAdapterSubCont = NULL; - hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pDisplayAdapterSubCont); - if (FAILED(hr)) { return hr; } - hr = IDxDiagContainerImpl_AddChildContainer(pSubCont, szAdapterName, pDisplayAdapterSubCont); - */ - return hr; +static HRESULT DXDiag_InitDXDiagDisplayContainer(IDxDiagContainer* pSubCont) +{ + static const WCHAR szDescription[] = {'s','z','D','e','s','c','r','i','p','t','i','o','n',0}; + static const WCHAR szDeviceName[] = {'s','z','D','e','v','i','c','e','N','a','m','e',0}; + static const WCHAR szKeyDeviceID[] = {'s','z','K','e','y','D','e','v','i','c','e','I','D',0}; + static const WCHAR szKeyDeviceKey[] = {'s','z','K','e','y','D','e','v','i','c','e','K','e','y',0}; + static const WCHAR szVendorId[] = {'s','z','V','e','n','d','o','r','I','d',0}; + static const WCHAR szDeviceId[] = {'s','z','D','e','v','i','c','e','I','d',0}; + static const WCHAR dwWidth[] = {'d','w','W','i','d','t','h',0}; + static const WCHAR dwHeight[] = {'d','w','H','e','i','g','h','t',0}; + static const WCHAR dwBpp[] = {'d','w','B','p','p',0}; + static const WCHAR szDisplayMemoryLocalized[] = {'s','z','D','i','s','p','l','a','y','M','e','m','o','r','y','L','o','c','a','l','i','z','e','d',0}; + static const WCHAR szDisplayMemoryEnglish[] = {'s','z','D','i','s','p','l','a','y','M','e','m','o','r','y','E','n','g','l','i','s','h',0}; + + static const WCHAR szAdapterID[] = {'0',0}; + static const WCHAR szEmpty[] = {0}; + + HRESULT hr; + IDxDiagContainer *pDisplayAdapterSubCont = NULL; + + IDirectDraw7 *pDirectDraw; + DDSCAPS2 dd_caps; + DISPLAY_DEVICEW disp_dev; + DDSURFACEDESC2 surface_descr; + DWORD tmp; + WCHAR buffer[256]; + + hr = DXDiag_CreateDXDiagContainer( &IID_IDxDiagContainer, (void**) &pDisplayAdapterSubCont ); + if (FAILED( hr )) return hr; + hr = IDxDiagContainerImpl_AddChildContainer( pSubCont, szAdapterID, pDisplayAdapterSubCont ); + if (FAILED( hr )) return hr; + + if (EnumDisplayDevicesW( NULL, 0, &disp_dev, 0 )) + { + add_prop_str( pDisplayAdapterSubCont, szDeviceName, disp_dev.DeviceName ); + add_prop_str( pDisplayAdapterSubCont, szDescription, disp_dev.DeviceString ); + } + + hr = DirectDrawCreateEx( NULL, (LPVOID *)&pDirectDraw, &IID_IDirectDraw7, NULL); + if (FAILED( hr )) return hr; + + dd_caps.dwCaps = DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY; + dd_caps.dwCaps2 = dd_caps.dwCaps3 = dd_caps.dwCaps4 = 0; + hr = IDirectDraw7_GetAvailableVidMem( pDirectDraw, &dd_caps, &tmp, NULL ); + if (SUCCEEDED(hr)) + { + static const WCHAR mem_fmt[] = {'%','.','1','f',' ','M','B',0}; + + snprintfW( buffer, sizeof(buffer), mem_fmt, ((float)tmp) / 1000000.0 ); + add_prop_str( pDisplayAdapterSubCont, szDisplayMemoryLocalized, buffer ); + add_prop_str( pDisplayAdapterSubCont, szDisplayMemoryEnglish, buffer ); + } + + surface_descr.dwSize = sizeof(surface_descr); + hr = IDirectDraw7_GetDisplayMode( pDirectDraw, &surface_descr ); + if (SUCCEEDED(hr)) + { + if (surface_descr.dwFlags & DDSD_WIDTH) + add_prop_ui4( pDisplayAdapterSubCont, dwWidth, surface_descr.dwWidth ); + if (surface_descr.dwFlags & DDSD_HEIGHT) + add_prop_ui4( pDisplayAdapterSubCont, dwHeight, surface_descr.dwHeight ); + if (surface_descr.dwFlags & DDSD_PIXELFORMAT) + add_prop_ui4( pDisplayAdapterSubCont, dwBpp, surface_descr.ddpfPixelFormat.dwRGBBitCount ); + } + + add_prop_str( pDisplayAdapterSubCont, szVendorId, szEmpty ); + add_prop_str( pDisplayAdapterSubCont, szDeviceId, szEmpty ); + add_prop_str( pDisplayAdapterSubCont, szKeyDeviceKey, szEmpty ); + add_prop_str( pDisplayAdapterSubCont, szKeyDeviceID, szEmpty ); + + IUnknown_Release( pDirectDraw ); + return hr; } static HRESULT DXDiag_InitDXDiagDirectSoundContainer(IDxDiagContainer* pSubCont) { -- 2.11.4.GIT