diff options
Diffstat (limited to 'src/mesa/drivers/windows/gldirect/gldlame8.c')
-rw-r--r-- | src/mesa/drivers/windows/gldirect/gldlame8.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/mesa/drivers/windows/gldirect/gldlame8.c b/src/mesa/drivers/windows/gldirect/gldlame8.c new file mode 100644 index 00000000000..5ac519c1749 --- /dev/null +++ b/src/mesa/drivers/windows/gldirect/gldlame8.c @@ -0,0 +1,181 @@ +/**************************************************************************** +* +* Mesa 3-D graphics library +* Direct3D Driver Interface +* +* ======================================================================== +* +* Copyright (C) 1991-2004 SciTech Software, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* SCITECH SOFTWARE INC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* ====================================================================== +* +* Language: ANSI C +* Environment: Windows 9x (Win32) +* +* Description: GLDirect utility for determining lame boards/drivers. +* +****************************************************************************/ + +#define STRICT +#define WIN32_LEAN_AND_MEAN +#include <d3d8.h> + +/* +Ack. Broken out from gldlame.c because of broken D3D headers. KeithH +*/ + +/**************************************************************************** +REMARKS: +Scans list of DirectDraw devices for specific device IDs. +****************************************************************************/ + +#define VENDORID_ATI 0x1002 + +static DWORD devATIRagePro[] = { + 0x4742, // 3D RAGE PRO BGA AGP 1X/2X + 0x4744, // 3D RAGE PRO BGA AGP 1X only + 0x4749, // 3D RAGE PRO BGA PCI 33 MHz + 0x4750, // 3D RAGE PRO PQFP PCI 33 MHz + 0x4751, // 3D RAGE PRO PQFP PCI 33 MHz limited 3D + 0x4C42, // 3D RAGE LT PRO BGA-312 AGP 133 MHz + 0x4C44, // 3D RAGE LT PRO BGA-312 AGP 66 MHz + 0x4C49, // 3D RAGE LT PRO BGA-312 PCI 33 MHz + 0x4C50, // 3D RAGE LT PRO BGA-256 PCI 33 MHz + 0x4C51, // 3D RAGE LT PRO BGA-256 PCI 33 MHz limited 3D +}; + +static DWORD devATIRageIIplus[] = { + 0x4755, // 3D RAGE II+ + 0x4756, // 3D RAGE IIC PQFP PCI + 0x4757, // 3D RAGE IIC BGA AGP + 0x475A, // 3D RAGE IIC PQFP AGP + 0x4C47, // 3D RAGE LT-G +}; + +static __inline BOOL IsDevice( + DWORD *lpDeviceIdList, + DWORD dwDeviceId, + int count) +{ + int i; + + for (i=0; i<count; i++) + if (dwDeviceId == lpDeviceIdList[i]) + return TRUE; + + return FALSE; +} + +/**************************************************************************** +REMARKS: +Test the Direct3D8 device for "lameness" with respect to GLDirect. +This is done on per-chipset basis, as in GLD CAD driver (DGLCONTEXT.C). +If bTestForWHQL is set then the device is tested to see if it is +certified, and bIsWHQL is set to indicate TRUE or FALSE. Otherwise bIsWHQL +is not set. [WHQL = Windows Hardware Quality Labs] + +NOTE: There is a one- or two-second time penalty incurred in determining + the WHQL certification date. +****************************************************************************/ +BOOL IsThisD3D8Lame( + IDirect3D8 *pD3D, + DWORD dwAdapter, + BOOL bTestForWHQL, + BOOL *bIsWHQL) +{ + DWORD dwFlags = bTestForWHQL ? 0 : D3DENUM_NO_WHQL_LEVEL; + D3DADAPTER_IDENTIFIER8 d3dai; + HRESULT hr; + + hr = IDirect3D8_GetAdapterIdentifier(pD3D, dwAdapter, dwFlags, &d3dai); + if (FAILED(hr)) + return TRUE; // Definitely lame if adapter details can't be obtained! + + if (bTestForWHQL) { + *bIsWHQL = d3dai.WHQLLevel ? TRUE : FALSE; + } + + // Vendor 1: ATI + if (d3dai.VendorId == VENDORID_ATI) { + // Test A: ATI Rage PRO + if (IsDevice(devATIRagePro, d3dai.DeviceId, sizeof(devATIRagePro))) + return TRUE; // bad mipmapping + // Test B: ATI Rage II+ + if (IsDevice(devATIRageIIplus, d3dai.DeviceId, sizeof(devATIRageIIplus))) + return TRUE; // bad HW alpha testing + } + + return FALSE; +} + +/**************************************************************************** +REMARKS: +Test the Direct3DDevice8 device for "lameness" with respect to GLDirect. +This is done by querying for particular caps, as in GLD CPL (CPLMAIN.CPP). +****************************************************************************/ +BOOL IsThisD3D8DeviceLame( + IDirect3DDevice8 *pDev) +{ + D3DCAPS8 d3dCaps; + HRESULT hr; + + hr = IDirect3DDevice8_GetDeviceCaps(pDev, &d3dCaps); + if (FAILED(hr)) + return TRUE; + + // Test 1: Perspective-correct textures + // Any card that cannot do perspective-textures is *exceptionally* lame. + if (!(d3dCaps.TextureCaps & D3DPTEXTURECAPS_PERSPECTIVE)) { + return TRUE; // Lame! + } + + // Test 2: Bilinear filtering + if (!(d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR)) { + return TRUE; // Lame! + } + + // Test 3: Mipmapping + if (!(d3dCaps.TextureCaps & D3DPTEXTURECAPS_MIPMAP)) { + return TRUE; // Lame! + } + + // Test 4: Depth-test modes (?) + + // Test 5: Blend Modes -- Based on DX7 D3DIM MTEXTURE.CPP caps test + + // Accept devices that can do multipass, alpha blending + if( !((d3dCaps.DestBlendCaps & D3DPBLENDCAPS_INVSRCALPHA) && + (d3dCaps.SrcBlendCaps & D3DPBLENDCAPS_SRCALPHA)) ) + return TRUE; + + // Accept devices that can do multipass, color blending + if( !((d3dCaps.DestBlendCaps & D3DPBLENDCAPS_SRCCOLOR) && + (d3dCaps.SrcBlendCaps & D3DPBLENDCAPS_ZERO)) ) + return TRUE; + + // Accept devices that really support multiple textures. + if( !((d3dCaps.MaxTextureBlendStages > 1 ) && + (d3dCaps.MaxSimultaneousTextures > 1 ) && + (d3dCaps.TextureOpCaps & D3DTEXOPCAPS_MODULATE )) ) + return TRUE; + + return FALSE; // Not lame +} |