From 52d59718c72049649d95518fe8a5b007c8cb6c94 Mon Sep 17 00:00:00 2001 From: Roderick Colenbrander Date: Sun, 23 Nov 2008 22:33:29 +0100 Subject: [PATCH] wined3d: Add registry key for overriding pci device id. --- dlls/wined3d/directx.c | 6 ++++++ dlls/wined3d/wined3d_main.c | 27 ++++++++++++++++++++++++++- dlls/wined3d/wined3d_private.h | 3 +++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index e096c86972..8b6317305f 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -1669,6 +1669,12 @@ static HRESULT WINAPI IWineD3DImpl_GetAdapterIdentifier(IWineD3D *iface, UINT Ad *(pIdentifier->Revision) = 0; *pIdentifier->DeviceIdentifier = IID_D3DDEVICE_D3DUID; + if(wined3d_settings.pci_device_id != PCI_DEVICE_NONE) + { + TRACE_(d3d_caps)("Overriding pci device id with: %x\n", wined3d_settings.pci_device_id); + *(pIdentifier->DeviceId) = wined3d_settings.pci_device_id; + } + if (Flags & WINED3DENUM_NO_WHQL_LEVEL) { *(pIdentifier->WHQLLevel) = 0; } else { diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c index fa1d0284f6..3175c3d7bf 100644 --- a/dlls/wined3d/wined3d_main.c +++ b/dlls/wined3d/wined3d_main.c @@ -43,6 +43,7 @@ wined3d_settings_t wined3d_settings = TRUE, /* Use of GLSL enabled by default */ ORM_BACKBUFFER, /* Use the backbuffer to do offscreen rendering */ RTL_AUTO, /* Automatically determine best locking method */ + PCI_DEVICE_NONE,/* PCI Device ID */ 0, /* The default of memory is set in FillGLCaps */ NULL, /* No wine logo by default */ FALSE /* Disable multisampling for now due to Nvidia driver bugs which happens for some users */ @@ -77,6 +78,15 @@ static inline DWORD get_config_key(HKEY defkey, HKEY appkey, const char* name, c return ERROR_FILE_NOT_FOUND; } +static inline DWORD get_config_key_dword(HKEY defkey, HKEY appkey, const char* name, DWORD *data) +{ + DWORD type; + DWORD size = sizeof(DWORD); + if (0 != appkey && !RegQueryValueExA( appkey, name, 0, &type, (LPBYTE) data, &size ) && (type == REG_DWORD)) return 0; + if (0 != defkey && !RegQueryValueExA( defkey, name, 0, &type, (LPBYTE) data, &size ) && (type == REG_DWORD)) return 0; + return ERROR_FILE_NOT_FOUND; +} + static void wined3d_do_nothing(void) { } @@ -92,7 +102,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) DWORD size = sizeof(buffer); HKEY hkey = 0; HKEY appkey = 0; - DWORD len; + DWORD len, tmpvalue; WNDCLASSA wc; /* We need our own window class for a fake window which we use to retrieve GL capabilities */ @@ -238,6 +248,21 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) wined3d_settings.rendertargetlock_mode = RTL_TEXTEX; } } + if ( !get_config_key_dword( hkey, appkey, "VideoPciDeviceID", &tmpvalue) ) + { + int pci_device_id = tmpvalue; + + /* A pci device id is 16-bit */ + if(pci_device_id > 0xffff) + { + ERR("Invalid value for VideoPciDeviceID. The value should be smaller or equal to 65535 or 0xffff\n"); + } + else + { + TRACE("Using PCI Device ID %04x\n", pci_device_id); + wined3d_settings.pci_device_id = pci_device_id; + } + } if ( !get_config_key( hkey, appkey, "VideoMemorySize", buffer, size) ) { int TmpVideoMemorySize = atoi(buffer); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index fb05ec0d7a..0e8fe52bb2 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -185,6 +185,8 @@ static inline float float_16_to_32(const unsigned short *in) { #define RTL_TEXDRAW 3 #define RTL_TEXTEX 4 +#define PCI_DEVICE_NONE 0xffff /* e.g. 0x14f for a Geforce6200 */ + /* NOTE: When adding fields to this structure, make sure to update the default * values in wined3d_main.c as well. */ typedef struct wined3d_settings_s { @@ -198,6 +200,7 @@ typedef struct wined3d_settings_s { BOOL glslRequested; int offscreen_rendering_mode; int rendertargetlock_mode; + unsigned short pci_device_id; /* Memory tracking and object counting */ unsigned int emulated_textureram; char *logo;