Richard Boegli's CnC_Generals_Zero_Hour Fork WIP
This is documentation of Richard Boegil's Zero Hour Fork
 
Loading...
Searching...
No Matches
dx8caps.cpp
Go to the documentation of this file.
1/*
2** Command & Conquer Generals Zero Hour(tm)
3** Copyright 2025 Electronic Arts Inc.
4**
5** This program is free software: you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation, either version 3 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19/***********************************************************************************************
20 *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
21 ***********************************************************************************************
22 * *
23 * Project Name : dx8 caps *
24 * *
25 * $Archive:: /Commando/Code/ww3d2/dx8caps.cpp $*
26 * *
27 * Original Author:: Hector Yee *
28 * *
29 * Author : Kenny Mitchell *
30 * *
31 * $Modtime:: 06/27/02 1:27p $*
32 * *
33 * $Revision:: 31 $*
34 * *
35 * 06/27/02 KM Z Format support *
36 *---------------------------------------------------------------------------------------------*
37 * Functions: *
38 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
39
40#include "always.h"
41#include "dx8caps.h"
42#include "dx8wrapper.h"
43#include "formconv.h"
44#pragma warning (disable : 4201) // nonstandard extension - nameless struct
45#include <windows.h>
46#include <mmsystem.h>
47
48static StringClass CapsWorkString;
49
50#define DXLOG(n) CapsWorkString.Format n ; CapsLog+=CapsWorkString;
51#define COMPACTLOG(n) CapsWorkString.Format n ; CompactLog+=CapsWorkString;
52
53static const char* VendorNames[]={
54 "Unknown",
55 "NVidia",
56 "ATI",
57 "Intel",
58 "S3",
59 "PowerVR",
60 "Matrox",
61 "3Dfx",
62 "3DLabs",
63 "CirrusLogic",
64 "Rendition"
65};
66
67DX8Caps::VendorIdType DX8Caps::Define_Vendor(unsigned vendor_id)
68{
69 switch (vendor_id) {
70 case 0x3d3d:
71 case 0x104c: return VENDOR_3DLABS;
72 case 0x12D2: // STB - NVIDIA's Riva128
73 case 0x14AF: // Guillemot's NVIDIA based cards
74 case 0x10de: return VENDOR_NVIDIA;
75 case 0x1002: return VENDOR_ATI;
76 case 0x8086: return VENDOR_INTEL;
77 case 0x5333: return VENDOR_S3;
78 case 0x104A: return VENDOR_POWERVR;
79 case 0x102B: return VENDOR_MATROX;
80 case 0x1142: // Alliance based reference cards
81 case 0x109D: // Macronix based reference cards
82 case 0x121A: return VENDOR_3DFX;
83 default:
84 return VENDOR_UNKNOWN;
85 }
86}
87
88static const char* DeviceNamesNVidia[]={
89 "Unknown NVidia device",
90 "GeForce3",
91 "Quadro2 PRO",
92 "GeForce2 Go",
93 "GeForce2 ULTRA",
94 "GeForce2 GTS",
95 "Quadro",
96 "GeForce DDR",
97 "GeForce 256",
98 "TNT2 Aladdin",
99 "TNT2",
100 "TNT2 ULTRA",
101 "TNT2 Vanta",
102 "TNT2 M64",
103 "TNT",
104 "RIVA 128",
105 "TNT Vanta",
106 "NV1",
107 "GeForce2 MX"
108 "GeForce4 Ti 4600",
109 "GeForce4 Ti 4400",
110 "GeForce4 Ti",
111 "GeForce4 Ti 4200",
112 "GeForce4 MX 460",
113 "GeForce4 MX 440",
114 "GeForce4 MX 420",
115 "GeForce4",
116 "GeForce4 Go 440",
117 "GeForce4 Go 420",
118 "GeForce4 Go 420 32M",
119 "GeForce4 Go 440 64M",
120 "GeForce4 Go",
121 "GeForce3 Ti 500",
122 "GeForce3 Ti 200",
123 "GeForce2 Integrated",
124 "GeForce2 Ti",
125 "Quadro2 MXR//EX//GO",
126 "GeFORCE2_MX 100//200",
127 "GeFORCE2_MX 400",
128 "Quadro DCC"
129};
130
131static const char* DeviceNamesATI[]={
132 "Unknown ATI Device",
133 "Rage II",
134 "Rage II+",
135 "Rage IIc PCI",
136 "Rage IIc AGP",
137 "Rage 128 Mobility",
138 "Rage 128 Mobility M3",
139 "Rage 128 Mobility M4",
140 "Rage 128 PRO ULTRA",
141 "Rage 128 4X",
142 "Rage 128 PRO GL",
143 "Rage 128 PRO VR",
144 "Rage 128 GL",
145 "Rage 128 VR",
146 "Rage PRO",
147 "Rage PRO Mobility",
148 "Mobility Radeon",
149 "Mobility Radeon VE(M6)",
150 "Radeon VE",
151 "Radeon DDR",
152 "Radeon",
153 "Mobility R7500",
154 "R7500",
155 "R8500"
156};
157
158static const char* DeviceNames3DLabs[]={
159 "Unknown 3DLabs Device",
160 "Permedia",
161 "300SX",
162 "500TX",
163 "Delta",
164 "MX",
165 "Gamma",
166 "Permedia2S (ST)",
167 "Permedia3",
168 "R3",
169 "Permedia4",
170 "R4",
171 "G2",
172 "Oxygen VX1",
173 "TI P1",
174 "Permedia2"
175};
176
177static const char* DeviceNames3Dfx[]={
178 "Unknown 3Dfx Device",
179 "Voodoo 5500 AGP",
180 "Voodoo 3",
181 "Banshee",
182 "Voodoo 2",
183 "Voodoo Graphics",
184 "Voodoo Rush"
185};
186
187static const char* DeviceNamesMatrox[]={
188 "Unknown Matrox Device",
189 "G550",
190 "G400",
191 "G200 AGP",
192 "G200 PCI",
193 "G100 PCI",
194 "G100 AGP",
195 "Millennium II AGP",
196 "Millennium II PCI",
197 "Mystique",
198 "Millennium",
199 "Parhelia",
200 "Parhelia AGP 8X"
201};
202
203static const char* DeviceNamesPowerVR[]={
204 "Unknown PowerVR Device",
205 "Kyro"
206};
207
208static const char* DeviceNamesS3[]={
209 "Unknown S3 Device",
210 "Savage MX",
211 "Savage 4",
212 "Savage 200"
213};
214
215static const char* DeviceNamesIntel[]={
216 "Unknown Intel Device",
217 "i810",
218 "i810e",
219 "i815"
220};
221
222DX8Caps::DeviceTypeATI DX8Caps::Get_ATI_Device(unsigned device_id)
223{
224 switch (device_id) {
225 case 0x4754: return DEVICE_ATI_RAGE_II;
226 case 0x4755: return DEVICE_ATI_RAGE_II_PLUS;
227 case 0x5656: return DEVICE_ATI_RAGE_IIC_PCI;
228 case 0x4756: return DEVICE_ATI_RAGE_IIC_PCI;
229 case 0x475A: return DEVICE_ATI_RAGE_IIC_AGP;
230 case 0x4759: return DEVICE_ATI_RAGE_IIC_AGP;
231 case 0x4757: return DEVICE_ATI_RAGE_IIC_AGP;
232 case 0x4742:
233 case 0x4744:
234 case 0x4749:
235 case 0x4750:
236 case 0x474C:
237 case 0x474E:
238 case 0x474D:
239 case 0x474F:
240 case 0x4752: return DEVICE_ATI_RAGE_PRO;
241
242 case 0x4C4D:
243 case 0x4C52:
244 case 0x4C42:
245 case 0x4C49:
246 case 0x4C50: return DEVICE_ATI_RAGE_PRO_MOBILITY;
247
248 case 0x4C57: return DEVICE_ATI_MOBILITY_R7500;
249
250 case 0x4C59:
251 case 0x4C5A: return DEVICE_ATI_MOBILITY_RADEON_VE_M6;
252
253 case 0x4D46:
254 case 0x4D4C: return DEVICE_ATI_RAGE_128_MOBILITY_M4;
255 case 0x4C45:
256 case 0x4C46: return DEVICE_ATI_RAGE_128_MOBILITY_M3;
257
258 case 0x5041:
259 case 0x5042:
260 case 0x5043:
261 case 0x5044:
262 case 0x5045:
263 case 0x5046: return DEVICE_ATI_RAGE_128_PRO_GL;
264
265 case 0x5047:
266 case 0x5048:
267 case 0x5049:
268 case 0x504A:
269 case 0x504B:
270 case 0x504C:
271 case 0x504D:
272 case 0x504E:
273 case 0x504F:
274 case 0x5050:
275 case 0x5051:
276 case 0x5052:
277 case 0x5053:
278 case 0x5054:
279 case 0x5055:
280 case 0x5056:
281 case 0x5057:
282 case 0x5058: return DEVICE_ATI_RAGE_128_PRO_VR;
283
284 case 0x5159:
285 case 0x515A: return DEVICE_ATI_RADEON_VE;
286
287 case 0x5144:
288 case 0x5145:
289 case 0x5146:
290 case 0x5147: return DEVICE_ATI_RADEON_DDR;
291
292 case 0x514c:
293 case 0x514e:
294 case 0x514f: return DEVICE_ATI_R8500;
295
296 case 0x5157: return DEVICE_ATI_R7500;
297
298 case 0x5245:
299 case 0x5246:
300 case 0x534B:
301 case 0x534C:
302 case 0x534D: return DEVICE_ATI_RAGE_128_GL;
303
304 case 0x524B:
305 case 0x524C:
306 case 0x5345:
307 case 0x5346:
308 case 0x5347: return DEVICE_ATI_RAGE_128_VR;
309
310 case 0x5446:
311 case 0x544C:
312 case 0x5452:
313 case 0x5453:
314 case 0x5454:
315 case 0x5455: return DEVICE_ATI_RAGE_128_PRO_ULTRA;
316
317 case 0x534E: return DEVICE_ATI_RAGE_128_4X;
318
319 default: return DEVICE_ATI_UNKNOWN;
320 }
321}
322
323DX8Caps::DeviceType3DLabs DX8Caps::Get_3DLabs_Device(unsigned device_id)
324{
325 switch (device_id) {
326 case 0x0001: return DEVICE_3DLABS_300SX;
327 case 0x0002: return DEVICE_3DLABS_500TX;
328 case 0x0003: return DEVICE_3DLABS_DELTA;
329 case 0x0004: return DEVICE_3DLABS_PERMEDIA;
330 case 0x0006: return DEVICE_3DLABS_MX;
331 case 0x0007: return DEVICE_3DLABS_PERMEDIA2;
332 case 0x0008: return DEVICE_3DLABS_GAMMA;
333 case 0x0009: return DEVICE_3DLABS_PERMEDIA2S_ST;
334 case 0x000a: return DEVICE_3DLABS_PERMEDIA3;
335 case 0x000b: return DEVICE_3DLABS_R3;
336 case 0x000c: return DEVICE_3DLABS_PERMEDIA4;
337 case 0x000d: return DEVICE_3DLABS_R4;
338 case 0x000e: return DEVICE_3DLABS_G2;
339 case 0x4C59: return DEVICE_3DLABS_OXYGEN_VX1;
340 case 0x3D04: return DEVICE_3DLABS_TI_P1;
341 case 0x3D07: return DEVICE_3DLABS_PERMEDIA2;
342 default: return DEVICE_3DLABS_UNKNOWN;
343 }
344}
345
346DX8Caps::DeviceTypeNVidia DX8Caps::Get_NVidia_Device(unsigned device_id)
347{
348 switch (device_id) {
349 case 0x0250: return DEVICE_NVIDIA_GEFORCE4_TI_4600;
350 case 0x0251: return DEVICE_NVIDIA_GEFORCE4_TI_4400;
351 case 0x0252: return DEVICE_NVIDIA_GEFORCE4_TI;
352 case 0x0253: return DEVICE_NVIDIA_GEFORCE4_TI_4200;
353 case 0x0170: return DEVICE_NVIDIA_GEFORCE4_MX_460;
354 case 0x0171: return DEVICE_NVIDIA_GEFORCE4_MX_440;
355 case 0x0172: return DEVICE_NVIDIA_GEFORCE4_MX_420;
356 case 0x0173: return DEVICE_NVIDIA_GEFORCE4;
357 case 0x0174: return DEVICE_NVIDIA_GEFORCE4_GO_440;
358 case 0x0175: return DEVICE_NVIDIA_GEFORCE4_GO_420;
359 case 0x0176: return DEVICE_NVIDIA_GEFORCE4_GO_420_32M;
360 case 0x0178: return DEVICE_NVIDIA_GEFORCE4_GO;
361 case 0x0179: return DEVICE_NVIDIA_GEFORCE4_GO_440_64M;
362 case 0x0203: return DEVICE_NVIDIA_QUADRO_DCC;
363 case 0x0202: return DEVICE_NVIDIA_GEFORCE3_TI_500;
364 case 0x0201: return DEVICE_NVIDIA_GEFORCE3_TI_200;
365 case 0x0200: return DEVICE_NVIDIA_GEFORCE3;
366 case 0x01A0: return DEVICE_NVIDIA_GEFORCE2_INTEGRATED;
367 case 0x0153: return DEVICE_NVIDIA_QUADRO2_PRO;
368 case 0x0152: return DEVICE_NVIDIA_GEFORCE2_ULTRA;
369 case 0x0151: return DEVICE_NVIDIA_GEFORCE2_TI;
370 case 0x0150: return DEVICE_NVIDIA_GEFORCE2_GTS;
371 case 0x0113: return DEVICE_NVIDIA_QUADRO2_MXR_EX_GO;
372 case 0x0112: return DEVICE_NVIDIA_GEFORCE2_GO;
373 case 0x0111: return DEVICE_NVIDIA_GEFORCE2_MX_100_200;
374 case 0x0110: return DEVICE_NVIDIA_GEFORCE2_MX_400;
375 case 0x0103: return DEVICE_NVIDIA_QUADRO;
376 case 0x0101: return DEVICE_NVIDIA_GEFORCE_DDR;
377 case 0x0100: return DEVICE_NVIDIA_GEFORCE_256;
378 case 0x00A0: return DEVICE_NVIDIA_TNT2_ALADDIN;
379 case 0x0028: return DEVICE_NVIDIA_TNT2;
380 case 0x0029: return DEVICE_NVIDIA_TNT2_ULTRA;
381 case 0x002C: return DEVICE_NVIDIA_TNT2_VANTA;
382 case 0x002D: return DEVICE_NVIDIA_TNT2_M64;
383 case 0x0020: return DEVICE_NVIDIA_TNT;
384 case 0x0008: return DEVICE_NVIDIA_NV1;
385
386 // STB cards
387 case 0x0019:
388 case 0x0018: return DEVICE_NVIDIA_RIVA_128;
389
390 // Guillemot Cards
391 case 0x5008: return DEVICE_NVIDIA_TNT_VANTA; // Maxi Gamer Phoenix 2
392 case 0x5810: return DEVICE_NVIDIA_TNT2; // Maxi Gamer Xentor
393 case 0x5820: return DEVICE_NVIDIA_TNT2_ULTRA; // Maxi Gamer Xentor 32
394 case 0x4d20: return DEVICE_NVIDIA_TNT2_M64; // Maxi Gamer Cougar
395 case 0x5620: return DEVICE_NVIDIA_TNT2_M64; // Maxi Gamer Cougar Video Edition
396 case 0x5020: return DEVICE_NVIDIA_GEFORCE_256; // Maxi Gamer 3D Prophet
397
398 default: return DEVICE_NVIDIA_UNKNOWN;
399 }
400}
401
402
403DX8Caps::DeviceType3Dfx DX8Caps::Get_3Dfx_Device(unsigned device_id)
404{
405 switch (device_id) {
406 case 0x0009: return DEVICE_3DFX_VOODOO_5500_AGP;
407 case 0x0005: return DEVICE_3DFX_VOODOO_3;
408 case 0x0003: return DEVICE_3DFX_BANSHEE;
409 case 0x0002: return DEVICE_3DFX_VOODOO_2;
410 case 0x0001: return DEVICE_3DFX_VOODOO_GRAPHICS;
411 case 0x643d: // Alliance AT25/AT3D based reference board
412 case 0x8626: // Macronix based reference board
414 default: return DEVICE_3DFX_UNKNOWN;
415 }
416}
417
418DX8Caps::DeviceTypeMatrox DX8Caps::Get_Matrox_Device(unsigned device_id)
419{
420 switch (device_id) {
421 case 0x2527: return DEVICE_MATROX_G550;
422 case 0x0525: return DEVICE_MATROX_G400;
423 case 0x0521: return DEVICE_MATROX_G200_AGP;
424 case 0x0520: return DEVICE_MATROX_G200_PCI;
425 case 0x1000: return DEVICE_MATROX_G100_PCI;
426 case 0x1001: return DEVICE_MATROX_G100_AGP;
427 case 0x051F: return DEVICE_MATROX_MILLENNIUM_II_AGP;
428 case 0x051B: return DEVICE_MATROX_MILLENNIUM_II_PCI;
429 case 0x051A: return DEVICE_MATROX_MYSTIQUE;
430 case 0x0519: return DEVICE_MATROX_MILLENNIUM;
431 case 0x0527: return DEVICE_MATROX_PARHELIA;
432 case 0x0528: return DEVICE_MATROX_PARHELIA_AGP8X;
433
434 default: return DEVICE_MATROX_UNKNOWN;
435 }
436}
437
438DX8Caps::DeviceTypePowerVR DX8Caps::Get_PowerVR_Device(unsigned device_id)
439{
440 switch (device_id) {
441 case 0x0010: return DEVICE_POWERVR_KYRO;
442 default: return DEVICE_POWERVR_UNKNOWN;
443 }
444}
445
446DX8Caps::DeviceTypeS3 DX8Caps::Get_S3_Device(unsigned device_id)
447{
448 switch (device_id) {
449 case 0x8C10: return DEVICE_S3_SAVAGE_MX;
450 case 0x8A22: return DEVICE_S3_SAVAGE_4;
451 case 0x9102: return DEVICE_S3_SAVAGE_200;
452 default: return DEVICE_S3_UNKNOWN;
453 }
454}
455
456DX8Caps::DeviceTypeIntel DX8Caps::Get_Intel_Device(unsigned device_id)
457{
458 switch (device_id) {
459 case 0x7123: return DEVICE_INTEL_810;
460 case 0x7121: return DEVICE_INTEL_810E;
461 case 0x1132: return DEVICE_INTEL_815;
462 default: return DEVICE_INTEL_UNKNOWN;
463 }
464}
465
467 IDirect3D8* direct3d,
468 IDirect3DDevice8* D3DDevice,
469 WW3DFormat display_format,
470 const D3DADAPTER_IDENTIFIER8& adapter_id)
471 :
472 Direct3D(direct3d),
473 MaxDisplayWidth(0),
474 MaxDisplayHeight(0)
475{
476 Init_Caps(D3DDevice);
477 Compute_Caps(display_format, adapter_id);
478}
479
481 IDirect3D8* direct3d,
482 const D3DCAPS8& caps,
483 WW3DFormat display_format,
484 const D3DADAPTER_IDENTIFIER8& adapter_id)
485 :
486 Direct3D(direct3d),
487 Caps(caps),
488 MaxDisplayWidth(0),
489 MaxDisplayHeight(0)
490{
491 if ((Caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)==D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
492 SupportTnL=true;
493 } else {
494 SupportTnL=false;
495 }
496
497 Compute_Caps(display_format,adapter_id);
498}
499
500//Don't really need this but I added this function to free static variables so
501//they don't show up in our memory manager as a leak. -MW 7-22-03
503{
504 CapsWorkString.Release_Resources();
505}
506
507// ----------------------------------------------------------------------------
508//
509// Init the caps structure
510//
511// ----------------------------------------------------------------------------
512
513void DX8Caps::Init_Caps(IDirect3DDevice8* D3DDevice)
514{
515 D3DDevice->SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING,TRUE);
516 DX8CALL(GetDeviceCaps(&Caps));
517
518 if ((Caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)==D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
519 SupportTnL=true;
520
521 D3DDevice->SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING,FALSE);
522 DX8CALL(GetDeviceCaps(&Caps));
523 } else {
524 SupportTnL=false;
525 }
526}
527
528// ----------------------------------------------------------------------------
529//
530// Compute the caps bits
531//
532// ----------------------------------------------------------------------------
533void DX8Caps::Compute_Caps(WW3DFormat display_format, const D3DADAPTER_IDENTIFIER8& adapter_id)
534{
535// Init_Caps(D3DDevice);
536
537 CanDoMultiPass=true;
538 IsFogAllowed=true;
539
540 CapsLog="";
541 CompactLog="";
542 DXLOG(("Video Card: %s\r\n",adapter_id.Description));
543 DXLOG(("Driver: %s\r\n",adapter_id.Driver));
544
545 DriverDLL=adapter_id.Driver;
546 int Product = HIWORD(adapter_id.DriverVersion.HighPart);
547 int Version = LOWORD(adapter_id.DriverVersion.HighPart);
548 int SubVersion = HIWORD(adapter_id.DriverVersion.LowPart);
549 DriverBuildVersion = LOWORD(adapter_id.DriverVersion.LowPart);
550
551 DXLOG(("Product=%d, Version=%d, SubVersion=%d, Build=%d\r\n",Product, Version, SubVersion, DriverBuildVersion));
552
553 VendorId=Define_Vendor(adapter_id.VendorId);
554 // Make a guess - if driver doesn't intruduce itself and the name starts with 3, what could it possibly be?
555 if (VendorId==VENDOR_UNKNOWN) {
556 if (DriverDLL[0]=='3') VendorId=VENDOR_3DFX;
557 }
558 COMPACTLOG(("%s\t",VendorNames[VendorId]));
559 DXLOG(("Video Card Chip Vendor: %s\r\n",VendorNames[VendorId]));
560 DXLOG(("Type of chip: "));
561 switch (VendorId) {
562 default:
563 case VENDOR_UNKNOWN:
564 DeviceId=0;
565 DXLOG(("Unknown"));
566 COMPACTLOG(("Unknown"));
567 break;
568 case VENDOR_NVIDIA:
569 DeviceId=(unsigned)Get_NVidia_Device(adapter_id.DeviceId);
570 DXLOG((DeviceNamesNVidia[DeviceId]));
571 COMPACTLOG((DeviceNamesNVidia[DeviceId]));
572 break;
573 case VENDOR_ATI:
574 DeviceId=(unsigned)Get_ATI_Device(adapter_id.DeviceId);
575 DXLOG((DeviceNamesATI[DeviceId]));
576 COMPACTLOG((DeviceNamesATI[DeviceId]));
577 break;
578 case VENDOR_INTEL:
579 DeviceId=(unsigned)Get_Intel_Device(adapter_id.DeviceId);
580 DXLOG((DeviceNamesIntel[DeviceId]));
581 COMPACTLOG((DeviceNamesIntel[DeviceId]));
582 break;
583 case VENDOR_S3:
584 DeviceId=(unsigned)Get_S3_Device(adapter_id.DeviceId);
585 DXLOG((DeviceNamesS3[DeviceId]));
586 COMPACTLOG((DeviceNamesS3[DeviceId]));
587 break;
588 case VENDOR_POWERVR:
589 DeviceId=(unsigned)Get_PowerVR_Device(adapter_id.DeviceId);
590 DXLOG((DeviceNamesPowerVR[DeviceId]));
591 COMPACTLOG((DeviceNamesPowerVR[DeviceId]));
592 break;
593 case VENDOR_MATROX:
594 DeviceId=(unsigned)Get_Matrox_Device(adapter_id.DeviceId);
595 DXLOG((DeviceNamesMatrox[DeviceId]));
596 COMPACTLOG((DeviceNamesMatrox[DeviceId]));
597 break;
598 case VENDOR_3DFX:
599 DeviceId=(unsigned)Get_3Dfx_Device(adapter_id.DeviceId);
600 DXLOG((DeviceNames3Dfx[DeviceId]));
601 COMPACTLOG((DeviceNames3Dfx[DeviceId]));
602 break;
603 case VENDOR_3DLABS:
604 DeviceId=(unsigned)Get_3DLabs_Device(adapter_id.DeviceId);
605 DXLOG((DeviceNames3DLabs[DeviceId]));
606 COMPACTLOG((DeviceNames3DLabs[DeviceId]));
607 break;
608 }
609
610 COMPACTLOG(("\t%d\t",DriverBuildVersion));
611
612 DXLOG(("\r\n"));
613
614 DXLOG(("Vendor id: 0x%x\r\n",adapter_id.VendorId));
615 DXLOG(("Device id: 0x%x\r\n",adapter_id.DeviceId));
616 DXLOG(("SubSys id: 0x%x\r\n",adapter_id.SubSysId));
617 DXLOG(("Revision: %d\r\n",adapter_id.Revision));
618
619 DXLOG(("GUID = {0x%x, 0x%x, 0x%x}, {0x%2.2x, 0x%2.2x, 0x%2.2x, 0x%2.2x, 0x%2.2x, 0x%2.2x, 0x%2.2x, 0x%2.2x}\r\n",
620 adapter_id.DeviceIdentifier.Data1,
621 adapter_id.DeviceIdentifier.Data2,
622 adapter_id.DeviceIdentifier.Data3,
623 adapter_id.DeviceIdentifier.Data4[0],
624 adapter_id.DeviceIdentifier.Data4[1],
625 adapter_id.DeviceIdentifier.Data4[2],
626 adapter_id.DeviceIdentifier.Data4[3],
627 adapter_id.DeviceIdentifier.Data4[4],
628 adapter_id.DeviceIdentifier.Data4[5],
629 adapter_id.DeviceIdentifier.Data4[6],
630 adapter_id.DeviceIdentifier.Data4[7]));
631
632
633 SupportPointSprites = (Caps.MaxPointSize > 1.0f);
634 SupportNPatches = ((Caps.DevCaps&D3DDEVCAPS_NPATCHES)==D3DDEVCAPS_NPATCHES);
635 SupportZBias = ((Caps.RasterCaps&D3DPRASTERCAPS_ZBIAS)==D3DPRASTERCAPS_ZBIAS);
636 supportGamma=((Caps.Caps2&D3DCAPS2_FULLSCREENGAMMA)==D3DCAPS2_FULLSCREENGAMMA);
637 SupportModAlphaAddClr = (Caps.TextureOpCaps & D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR) == D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR;
638 SupportDot3=(Caps.TextureOpCaps & D3DTEXOPCAPS_DOTPRODUCT3) == D3DTEXOPCAPS_DOTPRODUCT3;
639 SupportCubemaps=(Caps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP) == D3DPTEXTURECAPS_CUBEMAP;
640 SupportAnisotropicFiltering=
641 (Caps.TextureFilterCaps&D3DPTFILTERCAPS_MAGFANISOTROPIC) && (Caps.TextureFilterCaps&D3DPTFILTERCAPS_MINFANISOTROPIC);
642
643 DXLOG(("Hardware T&L support: %s\r\n",SupportTnL ? "Yes" : "No"));
644 DXLOG(("NPatch support: %s\r\n",SupportNPatches ? "Yes" : "No"));
645 DXLOG(("ZBias support: %s\r\n",SupportZBias ? "Yes" : "No"));
646 DXLOG(("Gamma support: %s\r\n",supportGamma ? "Yes" : "No"));
647 DXLOG(("ModAlphaAddClr support: %s\r\n",SupportModAlphaAddClr ? "Yes" : "No"));
648 DXLOG(("Dot3 support: %s\r\n",SupportDot3 ? "Yes" : "No"));
649 DXLOG(("Anisotropic filtering support: %s\r\n",SupportAnisotropicFiltering ? "Yes" : "No"));
650
651 Check_Texture_Format_Support(display_format,Caps);
652 Check_Render_To_Texture_Support(display_format,Caps);
653 Check_Depth_Stencil_Support(display_format,Caps);
654 Check_Texture_Compression_Support(Caps);
655 Check_Bumpmap_Support(Caps);
656 Check_Shader_Support(Caps);
657 Check_Driver_Version_Status();
658 Check_Maximum_Texture_Support(Caps);
659
660 MaxTexturesPerPass=Caps.MaxSimultaneousTextures;
661
662 DXLOG(("Max textures per pass: %d\r\n",MaxTexturesPerPass));
663
664 Vendor_Specific_Hacks(adapter_id);
665 CapsWorkString="";
666}
667
668// ----------------------------------------------------------------------------
669//
670// Check bump map texture support
671//
672// ----------------------------------------------------------------------------
673
674void DX8Caps::Check_Bumpmap_Support(const D3DCAPS8& caps)
675{
676 SupportBumpEnvmap=!!(caps.TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAP);
677 SupportBumpEnvmapLuminance=!!(caps.TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAPLUMINANCE);
678 DXLOG(("Bumpmap support: %s\r\n",SupportBumpEnvmap ? "Yes" : "No"));
679 DXLOG(("Bumpmap luminance support: %s\r\n",SupportBumpEnvmapLuminance ? "Yes" : "No"));
680}
681
682// ----------------------------------------------------------------------------
683//
684// Check compressed texture support
685//
686// ----------------------------------------------------------------------------
687
688void DX8Caps::Check_Texture_Compression_Support(const D3DCAPS8& caps)
689{
690 SupportDXTC=SupportTextureFormat[WW3D_FORMAT_DXT1]|
691 SupportTextureFormat[WW3D_FORMAT_DXT2]|
692 SupportTextureFormat[WW3D_FORMAT_DXT3]|
693 SupportTextureFormat[WW3D_FORMAT_DXT4]|
694 SupportTextureFormat[WW3D_FORMAT_DXT5];
695 DXLOG(("Texture compression support: %s\r\n",SupportDXTC ? "Yes" : "No"));
696}
697
698void DX8Caps::Check_Texture_Format_Support(WW3DFormat display_format,const D3DCAPS8& caps)
699{
700 if (display_format==WW3D_FORMAT_UNKNOWN) {
701 for (unsigned i=0;i<WW3D_FORMAT_COUNT;++i) {
702 SupportTextureFormat[i]=false;
703 }
704 return;
705 }
706 D3DFORMAT d3d_display_format=WW3DFormat_To_D3DFormat(display_format);
707 for (unsigned i=0;i<WW3D_FORMAT_COUNT;++i) {
708 if (i==WW3D_FORMAT_UNKNOWN) {
709 SupportTextureFormat[i]=false;
710 }
711 else {
712 WW3DFormat format=(WW3DFormat)i;
713 SupportTextureFormat[i]=SUCCEEDED(
714 Direct3D->CheckDeviceFormat(
715 caps.AdapterOrdinal,
716 caps.DeviceType,
717 d3d_display_format,
718 0,
719 D3DRTYPE_TEXTURE,
720 WW3DFormat_To_D3DFormat(format)));
721 if (SupportTextureFormat[i]) {
722 StringClass name(0,true);
723 Get_WW3D_Format_Name(format,name);
724 DXLOG(("Supports texture format: %s\r\n",name));
725 }
726 }
727 }
728}
729
730void DX8Caps::Check_Render_To_Texture_Support(WW3DFormat display_format,const D3DCAPS8& caps)
731{
732 if (display_format==WW3D_FORMAT_UNKNOWN) {
733 for (unsigned i=0;i<WW3D_FORMAT_COUNT;++i) {
734 SupportRenderToTextureFormat[i]=false;
735 }
736 return;
737 }
738 D3DFORMAT d3d_display_format=WW3DFormat_To_D3DFormat(display_format);
739 for (unsigned i=0;i<WW3D_FORMAT_COUNT;++i) {
740 if (i==WW3D_FORMAT_UNKNOWN) {
741 SupportRenderToTextureFormat[i]=false;
742 }
743 else {
744 WW3DFormat format=(WW3DFormat)i;
745 SupportRenderToTextureFormat[i]=SUCCEEDED(
746 Direct3D->CheckDeviceFormat(
747 caps.AdapterOrdinal,
748 caps.DeviceType,
749 d3d_display_format,
750 D3DUSAGE_RENDERTARGET,
751 D3DRTYPE_TEXTURE,
752 WW3DFormat_To_D3DFormat(format)));
753 if (SupportRenderToTextureFormat[i]) {
754 StringClass name(0,true);
755 Get_WW3D_Format_Name(format,name);
756 DXLOG(("Supports render-to-texture format: %s\r\n",name));
757 }
758 }
759 }
760}
761
762//**********************************************************************************************
764
766void DX8Caps::Check_Depth_Stencil_Support(WW3DFormat display_format, const D3DCAPS8& caps)
767{
768 if (display_format==WW3D_FORMAT_UNKNOWN)
769 {
770 for (unsigned i=0;i<WW3D_ZFORMAT_COUNT;++i)
771 {
772 SupportDepthStencilFormat[i]=false;
773 }
774 return;
775 }
776
777 D3DFORMAT d3d_display_format=WW3DFormat_To_D3DFormat(display_format);
778
779 for (unsigned i=0;i<WW3D_ZFORMAT_COUNT;++i)
780 {
781 if (i==WW3D_ZFORMAT_UNKNOWN)
782 {
783 SupportDepthStencilFormat[i]=false;
784 }
785 else
786 {
787 WW3DZFormat format=(WW3DZFormat)i;
788 SupportDepthStencilFormat[i]=SUCCEEDED
789 (
790 Direct3D->CheckDeviceFormat
791 (
792 caps.AdapterOrdinal,
793 caps.DeviceType,
794 d3d_display_format,
795 D3DUSAGE_DEPTHSTENCIL,
796 D3DRTYPE_TEXTURE,
798 )
799 );
800
801 if (SupportDepthStencilFormat[i])
802 {
803 StringClass name(0,true);
804 Get_WW3D_ZFormat_Name(format,name);
805 DXLOG(("Supports depth stencil format: %s\r\n",name));
806 }
807 }
808 }
809}
810
811void DX8Caps::Check_Maximum_Texture_Support(const D3DCAPS8& caps)
812{
813 MaxSimultaneousTextures=caps.MaxSimultaneousTextures;
814}
815
816void DX8Caps::Check_Shader_Support(const D3DCAPS8& caps)
817{
818 VertexShaderVersion=caps.VertexShaderVersion;
819 PixelShaderVersion=caps.PixelShaderVersion;
820 DXLOG(("Vertex shader version: %d.%d, pixel shader version: %d.%d\r\n",
821 (VertexShaderVersion>>8)&0xff,VertexShaderVersion&0xff,
822 (PixelShaderVersion>>8)&0xff,PixelShaderVersion&0xff));
823}
824
825void DX8Caps::Check_Driver_Version_Status()
826{
827 DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
828
829 switch (VendorId) {
830 // All 3Dfx drivers are bad
831 case VENDOR_3DFX:
832 DriverVersionStatus=DRIVER_STATUS_BAD;
833 break;
834 case VENDOR_NVIDIA:
835 if (!stricmp(DriverDLL,"nv4.dll")) {
836 switch (DriverBuildVersion) {
837 case 327: // 5.00.2165.327
838 DriverVersionStatus=DRIVER_STATUS_BAD;
839 }
840 }
841
842 if (!stricmp(DriverDLL,"nv4_disp.dll") || !stricmp(DriverDLL,"nvdd32.dll")) {
843 switch (DriverBuildVersion) {
844 // 23.11 Is known to be very unstable
845 case 2311:
846 DriverVersionStatus=DRIVER_STATUS_BAD;
847 break;
848 // 21.83 Has occasional lock-up at start or exit
849 // Darren Korman (DKORMAN2389-2K GeForce3)
850 case 2183:
851 case 2240:
852 DriverVersionStatus=DRIVER_STATUS_OK;
853 break;
854 // 21.81 Has occasional lock-up at start or exit
855 case 2181:
856 DriverVersionStatus=DRIVER_STATUS_OK;
857 break;
858 case 1440: // Denzil had problems in opening 16 bit modes, fixed by updating driver
859 DriverVersionStatus=DRIVER_STATUS_BAD;
860 break;
861 case 1410:
862 DriverVersionStatus=DRIVER_STATUS_BAD;
863 break;
864 case 1260: // Byon - BYONG
865 DriverVersionStatus=DRIVER_STATUS_BAD;
866 break;
867 case 1241: // Steve Tall gets occasional blue screening with this driver version (blue screen happens in the driver dll)
868 DriverVersionStatus=DRIVER_STATUS_BAD;
869 break;
870 case 1240: // Robert Powers
871 DriverVersionStatus=DRIVER_STATUS_BAD;
872 break;
873 case 1101:
874 DriverVersionStatus=DRIVER_STATUS_BAD;//DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
875 break;
876 case 650: // Rich Donelly - RENEGADE-JENNA2
877 DriverVersionStatus=DRIVER_STATUS_BAD;//DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
878 break;
879 case 649:
880 DriverVersionStatus=DRIVER_STATUS_BAD;//DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
881 break;
882 case 635:
883 DriverVersionStatus=DRIVER_STATUS_BAD;
884 break;
885 case 634: // Sean Decker - SDECKER2339-2K
886 DriverVersionStatus=DRIVER_STATUS_BAD;//DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
887 break;
888 case 625: // TESTIBM240
889 DriverVersionStatus=DRIVER_STATUS_BAD;//DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
890 break;
891 case 618:
892 DriverVersionStatus=DRIVER_STATUS_BAD;
893 break;
894 default:
895 if (DriverBuildVersion<2000) { // All under 20.xx versions are too old!
896 DriverVersionStatus=DRIVER_STATUS_BAD;
897 }
898 else {
899 DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
900 }
901 }
902 }
903 // Elsa OEM drivers?
904 if (!stricmp(DriverDLL,"egdad.dll")) {
905 // We know of version 5.9.0.312 (asked MShelling if he the drivers seem ok)
906 switch (DriverBuildVersion) {
907 default:
908 DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
909 case 312:
910 DriverVersionStatus=DRIVER_STATUS_OK;
911 }
912 }
913
914 // Elsa GLoria
915 if (!stricmp(DriverDLL,"egliid.dll")) {
916 switch (DriverBuildVersion) {
917 default:
918 DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
919 case 172:
920 DriverVersionStatus=DRIVER_STATUS_OK;
921 }
922
923 }
924
925 // ASUS OEM drivers?
926 if (!stricmp(DriverDLL,"v66_disp.dll")) {
927 // TOMSS1: 5.0.2195.379
928 }
929 break;
930 case VENDOR_ATI:
931 if (!stricmp(DriverDLL,"ati2dvag.dll")) {
932 switch (DriverBuildVersion) {
933 case 3287:
934 DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
935 break;
936 case 3281:
937 DriverVersionStatus=DRIVER_STATUS_OK; // Not really ok, but we have to accept something...
938 break;
939 case 3063:
940 DriverVersionStatus=DRIVER_STATUS_BAD;
941 break;
942 case 3273:
943 DriverVersionStatus=DRIVER_STATUS_BAD;
944 break;
945 case 3276:
946 DriverVersionStatus=DRIVER_STATUS_BAD;
947 break;
948 }
949 }
950 if (!stricmp(DriverDLL,"atid32ae.dll")) {
951 switch (DriverBuildVersion) {
952 case 1010:
953 DriverVersionStatus=DRIVER_STATUS_OK;
954 }
955 }
956 if (!stricmp(DriverDLL,"ati3drai.dll")) {
957 switch (DriverBuildVersion) {
958 case 1119:
959 DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
960 }
961 }
962 break;
963 case VENDOR_POWERVR:
964 if (!stricmp(DriverDLL,"pmx2hal.dll")) {
965 switch (DriverBuildVersion) {
966 case 3111: // Michael Ruppert - TESTIBM104
967 default: DriverVersionStatus=DRIVER_STATUS_UNKNOWN;
968 }
969 }
970 break;
971 }
972
973 switch (DriverVersionStatus) {
974 default:
976 DXLOG(("Driver version status: Unknown\r\n"));
977 break;
978 case DRIVER_STATUS_OK:
979 DXLOG(("Driver version status: OK (No known problems)\r\n"));
980 break;
982 DXLOG(("Driver version status: Good\r\n"));
983 break;
985 DXLOG(("Driver version status: Bad (Driver update recommended)\r\n"));
986 break;
987 }
988}
989
990bool DX8Caps::Is_Valid_Display_Format(int width, int height, WW3DFormat format)
991{
992 // If nothing limits the maximum resolution, accept any resolution
993 if (MaxDisplayWidth==0 && MaxDisplayHeight==0) return true;
994
995 if (width>MaxDisplayWidth || height>MaxDisplayHeight) return false;
996 return true;
997}
998
999// ----------------------------------------------------------------------------
1000//
1001// Implement some vendor-specific hacks to fix certain driver bugs that can't be
1002// avoided otherwise.
1003//
1004// ----------------------------------------------------------------------------
1005
1006void DX8Caps::Vendor_Specific_Hacks(const D3DADAPTER_IDENTIFIER8& adapter_id)
1007{
1008 if (VendorId==VENDOR_NVIDIA)
1009 {
1010 if (SupportNPatches) {
1011 DXLOG(("NVidia Driver reported N-Patch support, disabling.\r\n"));
1012 }
1013 if (SupportTextureFormat[WW3D_FORMAT_DXT1]) {
1014 DXLOG(("Disabling DXT1 support on NVidia hardware.\r\n"));
1015 }
1016
1017 SupportNPatches = false; // Driver incorrectly report N-Patch support
1018 SupportTextureFormat[WW3D_FORMAT_DXT1] = false; // DXT1 is broken on NVidia hardware
1019 SupportDXTC=
1020 SupportTextureFormat[WW3D_FORMAT_DXT1]|
1021 SupportTextureFormat[WW3D_FORMAT_DXT2]|
1022 SupportTextureFormat[WW3D_FORMAT_DXT3]|
1023 SupportTextureFormat[WW3D_FORMAT_DXT4]|
1024 SupportTextureFormat[WW3D_FORMAT_DXT5];
1025
1026
1027 if (DeviceId == DEVICE_NVIDIA_GEFORCE2_MX ||
1028 DeviceId == DEVICE_NVIDIA_GEFORCE2_MX_400 )
1029 {
1030 DXLOG(("Maximum screen resolution limited to 1024 x 768 on NVidia GeForce2 mx/mx400 cards\r\n"));
1031 MaxDisplayWidth=1024;
1032 MaxDisplayHeight=768;
1033 }
1034
1035
1036
1037 }
1038
1039 if (VendorId==VENDOR_MATROX) {
1040 // G400 and G550 claim support for ModAlphaAddClr but argument limitations make it unusable.
1041 if (DeviceId==DEVICE_MATROX_G400 ||
1042 DeviceId==DEVICE_MATROX_G550) {
1043 DXLOG(("ModAlphaAddClr disabled Matrox G400 and G550 cards (cannot put texture in 2nd arg)\r\n"));
1044 SupportModAlphaAddClr = false;
1045 }
1046 }
1047
1048 if (VendorId==VENDOR_ATI) {
1049 // Rage Pro doesn't handle multitexturing well enough...
1050 // It also doesn't really handle render-to-texture...
1051 if (DeviceId==DEVICE_ATI_RAGE_PRO || DeviceId==DEVICE_ATI_RAGE_PRO_MOBILITY) {
1052 DXLOG(("Disabling multitexturing on ATI Rage Pro\r\n"));
1053 MaxTexturesPerPass=1;
1054 CanDoMultiPass=false;
1055
1056 DXLOG(("Disabling render-to-texture on Rage Pro\r\n"));
1057 for (unsigned i=0;i<WW3D_FORMAT_COUNT;++i) {
1058 SupportRenderToTextureFormat[i]=false;
1059 }
1060 }
1061
1062 // Rage 128 Pro GL is used in ATI Rage Fury Maxx
1063 // The driver support is bad and the card seems to suffer quite a bit from
1064 // lock-ups and rendering errors. These ease up when multitexturing and
1065 // render-to-texture are disabled.
1066 // However, E&B requires multitexturing, so renabling it.
1067 if (DeviceId==DEVICE_ATI_RAGE_128_PRO_GL) {
1068 CanDoMultiPass=false;
1069
1070 DXLOG(("Disabling render-to-texture on ATI Rage 128 Pro GL\r\n"));
1071 for (unsigned i=0;i<WW3D_FORMAT_COUNT;++i) {
1072 SupportRenderToTextureFormat[i]=false;
1073 }
1074
1075 }
1076
1077 if (DeviceId==DEVICE_ATI_RAGE_128_MOBILITY ||
1081 DeviceId==DEVICE_ATI_RAGE_128_4X ||
1082 DeviceId==DEVICE_ATI_RAGE_128_PRO_GL ||
1083 DeviceId==DEVICE_ATI_RAGE_128_PRO_VR ||
1084 DeviceId==DEVICE_ATI_RAGE_128_GL ||
1085 DeviceId==DEVICE_ATI_RAGE_128_VR) {
1086 DXLOG(("Maximum screen resolution limited to 1280 x 1024 on ATI Rage 128 cards\r\n"));
1087 MaxDisplayWidth=1280;
1088 MaxDisplayHeight=1024;
1089 DXLOG(("ModAlphaAddClr disabled ATI Rage 128 cards (cannot put texture in 2nd arg)\r\n"));
1090 SupportModAlphaAddClr = false;
1091 }
1092
1093 if (DeviceId==DEVICE_ATI_MOBILITY_RADEON ||
1095 DeviceId==DEVICE_ATI_RADEON_VE ||
1096 DeviceId==DEVICE_ATI_RADEON_DDR ||
1097 DeviceId==DEVICE_ATI_RADEON ||
1098 DeviceId==DEVICE_ATI_MOBILITY_R7500 ||
1099 DeviceId==DEVICE_ATI_R7500) {
1100 DXLOG(("Disabling render-to-texture on Radeon\r\n"));
1101 for (unsigned i=0;i<WW3D_FORMAT_COUNT;++i) {
1102 SupportRenderToTextureFormat[i]=false;
1103 }
1104 }
1105
1106 // CAT-lab reported that selecting anisotorpic filtering on Radeon VE causes a lock up after a while
1107 if (DeviceId==DEVICE_ATI_RADEON_VE) {
1108 DXLOG(("Disabling anisotropic filtering on Radeon VE\r\n"));
1109 SupportAnisotropicFiltering=false;
1110 }
1111
1112
1113 }
1114
1115 if (VendorId==VENDOR_3DFX) {
1116 // Voodoo2, Banshee and Voodoo3 don't handle multi-texturing with DX8 well enough.
1117 if (DeviceId==DEVICE_3DFX_VOODOO_3 ||
1118 DeviceId==DEVICE_3DFX_BANSHEE ||
1119 DeviceId==DEVICE_3DFX_VOODOO_2) {
1120 DXLOG(("Disabling multitexturing on Voodoo2/Voodoo3/Banshee\r\n"));
1121 MaxTexturesPerPass=1; // Especially important on Banshee (multitexturing crashes)!!!
1122
1123 DXLOG(("Maximum screen resolution limited to 1280 x 1024 on Voodoo2/Voodoo3/Banshee\r\n"));
1124 MaxDisplayWidth=1280;
1125 MaxDisplayHeight=1024;
1126 }
1127
1128 if (DeviceId==DEVICE_3DFX_VOODOO_3) {
1129 DXLOG(("Disabling render-to-texture on Voodoo3\r\n"));
1130 for (unsigned i=0;i<WW3D_FORMAT_COUNT;++i) {
1131 SupportRenderToTextureFormat[i]=false;
1132 }
1133 }
1134 }
1135
1136 if (VendorId==VENDOR_POWERVR) {
1137 DXLOG(("Maximum screen resolution limited to 1280 x 1024 on PowerVR Kyro cards\r\n"));
1138 MaxDisplayWidth=1280;
1139 MaxDisplayHeight=1024;
1140
1141 // No fog on scene capture cards! (They don't like fog color changes in mid-frame)
1142 IsFogAllowed=false;
1143 }
1144
1145 if (VendorId==VENDOR_S3) {
1146 if (DeviceId==DEVICE_S3_SAVAGE_4) {
1147 DXLOG(("Maximum screen resolution limited to 1024 x 768 on S3 Savage 4 cards\r\n"));
1148 MaxDisplayWidth=800;//1024;
1149 MaxDisplayHeight=600;//768;
1150 }
1151
1152 if (DeviceId==DEVICE_S3_SAVAGE_200) {
1153 DXLOG(("Disabling multitexturing on S3 Savage 2000\r\n"));
1154 MaxTexturesPerPass=1;
1155 CanDoMultiPass=false;
1156 }
1157
1158
1159 }
1160}
1161
#define TRUE
Definition BaseType.h:109
#define FALSE
Definition BaseType.h:113
@ DRIVER_STATUS_BAD
Definition dx8caps.h:58
@ DRIVER_STATUS_GOOD
Definition dx8caps.h:56
@ DRIVER_STATUS_UNKNOWN
Definition dx8caps.h:55
@ DRIVER_STATUS_OK
Definition dx8caps.h:57
DeviceTypeNVidia
Definition dx8caps.h:121
@ DEVICE_NVIDIA_GEFORCE4_MX_420
Definition dx8caps.h:147
@ DEVICE_NVIDIA_GEFORCE_DDR
Definition dx8caps.h:129
@ DEVICE_NVIDIA_GEFORCE_256
Definition dx8caps.h:130
@ DEVICE_NVIDIA_GEFORCE2_INTEGRATED
Definition dx8caps.h:156
@ DEVICE_NVIDIA_GEFORCE2_MX_100_200
Definition dx8caps.h:159
@ DEVICE_NVIDIA_GEFORCE4_GO_440
Definition dx8caps.h:149
@ DEVICE_NVIDIA_QUADRO_DCC
Definition dx8caps.h:161
@ DEVICE_NVIDIA_GEFORCE2_MX_400
Definition dx8caps.h:160
@ DEVICE_NVIDIA_GEFORCE4
Definition dx8caps.h:148
@ DEVICE_NVIDIA_QUADRO2_MXR_EX_GO
Definition dx8caps.h:158
@ DEVICE_NVIDIA_GEFORCE2_ULTRA
Definition dx8caps.h:126
@ DEVICE_NVIDIA_GEFORCE4_TI
Definition dx8caps.h:143
@ DEVICE_NVIDIA_GEFORCE3_TI_200
Definition dx8caps.h:155
@ DEVICE_NVIDIA_TNT2_ULTRA
Definition dx8caps.h:133
@ DEVICE_NVIDIA_GEFORCE4_GO_420_32M
Definition dx8caps.h:151
@ DEVICE_NVIDIA_TNT2_M64
Definition dx8caps.h:135
@ DEVICE_NVIDIA_GEFORCE4_TI_4600
Definition dx8caps.h:141
@ DEVICE_NVIDIA_TNT_VANTA
Definition dx8caps.h:138
@ DEVICE_NVIDIA_NV1
Definition dx8caps.h:139
@ DEVICE_NVIDIA_GEFORCE4_MX_440
Definition dx8caps.h:146
@ DEVICE_NVIDIA_GEFORCE4_MX_460
Definition dx8caps.h:145
@ DEVICE_NVIDIA_GEFORCE4_GO
Definition dx8caps.h:153
@ DEVICE_NVIDIA_GEFORCE4_TI_4200
Definition dx8caps.h:144
@ DEVICE_NVIDIA_QUADRO2_PRO
Definition dx8caps.h:124
@ DEVICE_NVIDIA_TNT2
Definition dx8caps.h:132
@ DEVICE_NVIDIA_GEFORCE2_TI
Definition dx8caps.h:157
@ DEVICE_NVIDIA_GEFORCE4_GO_440_64M
Definition dx8caps.h:152
@ DEVICE_NVIDIA_RIVA_128
Definition dx8caps.h:137
@ DEVICE_NVIDIA_GEFORCE4_TI_4400
Definition dx8caps.h:142
@ DEVICE_NVIDIA_TNT2_ALADDIN
Definition dx8caps.h:131
@ DEVICE_NVIDIA_UNKNOWN
Definition dx8caps.h:122
@ DEVICE_NVIDIA_GEFORCE2_GO
Definition dx8caps.h:125
@ DEVICE_NVIDIA_QUADRO
Definition dx8caps.h:128
@ DEVICE_NVIDIA_GEFORCE4_GO_420
Definition dx8caps.h:150
@ DEVICE_NVIDIA_TNT2_VANTA
Definition dx8caps.h:134
@ DEVICE_NVIDIA_GEFORCE3_TI_500
Definition dx8caps.h:154
@ DEVICE_NVIDIA_GEFORCE3
Definition dx8caps.h:123
@ DEVICE_NVIDIA_GEFORCE2_MX
Definition dx8caps.h:140
@ DEVICE_NVIDIA_GEFORCE2_GTS
Definition dx8caps.h:127
@ DEVICE_NVIDIA_TNT
Definition dx8caps.h:136
DeviceTypeATI
Definition dx8caps.h:75
@ DEVICE_ATI_RAGE_128_MOBILITY
Definition dx8caps.h:81
@ DEVICE_ATI_RAGE_128_MOBILITY_M4
Definition dx8caps.h:83
@ DEVICE_ATI_RAGE_128_PRO_VR
Definition dx8caps.h:87
@ DEVICE_ATI_RAGE_128_PRO_ULTRA
Definition dx8caps.h:84
@ DEVICE_ATI_RADEON_DDR
Definition dx8caps.h:95
@ DEVICE_ATI_RAGE_128_PRO_GL
Definition dx8caps.h:86
@ DEVICE_ATI_RAGE_IIC_AGP
Definition dx8caps.h:80
@ DEVICE_ATI_R8500
Definition dx8caps.h:99
@ DEVICE_ATI_RADEON_VE
Definition dx8caps.h:94
@ DEVICE_ATI_RAGE_PRO_MOBILITY
Definition dx8caps.h:91
@ DEVICE_ATI_R7500
Definition dx8caps.h:98
@ DEVICE_ATI_MOBILITY_R7500
Definition dx8caps.h:97
@ DEVICE_ATI_RAGE_128_MOBILITY_M3
Definition dx8caps.h:82
@ DEVICE_ATI_RAGE_128_GL
Definition dx8caps.h:88
@ DEVICE_ATI_RAGE_II_PLUS
Definition dx8caps.h:78
@ DEVICE_ATI_RAGE_128_4X
Definition dx8caps.h:85
@ DEVICE_ATI_RAGE_II
Definition dx8caps.h:77
@ DEVICE_ATI_RAGE_128_VR
Definition dx8caps.h:89
@ DEVICE_ATI_UNKNOWN
Definition dx8caps.h:76
@ DEVICE_ATI_MOBILITY_RADEON_VE_M6
Definition dx8caps.h:93
@ DEVICE_ATI_RADEON
Definition dx8caps.h:96
@ DEVICE_ATI_RAGE_IIC_PCI
Definition dx8caps.h:79
@ DEVICE_ATI_MOBILITY_RADEON
Definition dx8caps.h:92
@ DEVICE_ATI_RAGE_PRO
Definition dx8caps.h:90
DeviceTypeIntel
Definition dx8caps.h:202
@ DEVICE_INTEL_810E
Definition dx8caps.h:205
@ DEVICE_INTEL_815
Definition dx8caps.h:206
@ DEVICE_INTEL_810
Definition dx8caps.h:204
@ DEVICE_INTEL_UNKNOWN
Definition dx8caps.h:203
DeviceTypeS3
Definition dx8caps.h:195
@ DEVICE_S3_UNKNOWN
Definition dx8caps.h:196
@ DEVICE_S3_SAVAGE_200
Definition dx8caps.h:199
@ DEVICE_S3_SAVAGE_4
Definition dx8caps.h:198
@ DEVICE_S3_SAVAGE_MX
Definition dx8caps.h:197
VendorIdType
Definition dx8caps.h:61
@ VENDOR_ATI
Definition dx8caps.h:64
@ VENDOR_UNKNOWN
Definition dx8caps.h:62
@ VENDOR_3DFX
Definition dx8caps.h:69
@ VENDOR_S3
Definition dx8caps.h:66
@ VENDOR_NVIDIA
Definition dx8caps.h:63
@ VENDOR_MATROX
Definition dx8caps.h:68
@ VENDOR_INTEL
Definition dx8caps.h:65
@ VENDOR_POWERVR
Definition dx8caps.h:67
@ VENDOR_3DLABS
Definition dx8caps.h:70
DeviceTypeMatrox
Definition dx8caps.h:174
@ DEVICE_MATROX_PARHELIA_AGP8X
Definition dx8caps.h:187
@ DEVICE_MATROX_G100_AGP
Definition dx8caps.h:181
@ DEVICE_MATROX_G200_PCI
Definition dx8caps.h:179
@ DEVICE_MATROX_PARHELIA
Definition dx8caps.h:186
@ DEVICE_MATROX_G550
Definition dx8caps.h:176
@ DEVICE_MATROX_MILLENNIUM_II_AGP
Definition dx8caps.h:182
@ DEVICE_MATROX_MYSTIQUE
Definition dx8caps.h:184
@ DEVICE_MATROX_UNKNOWN
Definition dx8caps.h:175
@ DEVICE_MATROX_G200_AGP
Definition dx8caps.h:178
@ DEVICE_MATROX_MILLENNIUM_II_PCI
Definition dx8caps.h:183
@ DEVICE_MATROX_MILLENNIUM
Definition dx8caps.h:185
@ DEVICE_MATROX_G400
Definition dx8caps.h:177
@ DEVICE_MATROX_G100_PCI
Definition dx8caps.h:180
DeviceType3Dfx
Definition dx8caps.h:164
@ DEVICE_3DFX_VOODOO_GRAPHICS
Definition dx8caps.h:170
@ DEVICE_3DFX_VOODOO_RUSH
Definition dx8caps.h:171
@ DEVICE_3DFX_VOODOO_5500_AGP
Definition dx8caps.h:166
@ DEVICE_3DFX_VOODOO_3
Definition dx8caps.h:167
@ DEVICE_3DFX_VOODOO_2
Definition dx8caps.h:169
@ DEVICE_3DFX_UNKNOWN
Definition dx8caps.h:165
@ DEVICE_3DFX_BANSHEE
Definition dx8caps.h:168
bool Is_Valid_Display_Format(int width, int height, WW3DFormat format)
Definition dx8caps.cpp:990
DeviceType3DLabs
Definition dx8caps.h:102
@ DEVICE_3DLABS_PERMEDIA
Definition dx8caps.h:104
@ DEVICE_3DLABS_R3
Definition dx8caps.h:112
@ DEVICE_3DLABS_TI_P1
Definition dx8caps.h:117
@ DEVICE_3DLABS_OXYGEN_VX1
Definition dx8caps.h:116
@ DEVICE_3DLABS_PERMEDIA4
Definition dx8caps.h:113
@ DEVICE_3DLABS_UNKNOWN
Definition dx8caps.h:103
@ DEVICE_3DLABS_PERMEDIA2
Definition dx8caps.h:118
@ DEVICE_3DLABS_G2
Definition dx8caps.h:115
@ DEVICE_3DLABS_PERMEDIA3
Definition dx8caps.h:111
@ DEVICE_3DLABS_DELTA
Definition dx8caps.h:107
@ DEVICE_3DLABS_R4
Definition dx8caps.h:114
@ DEVICE_3DLABS_500TX
Definition dx8caps.h:106
@ DEVICE_3DLABS_GAMMA
Definition dx8caps.h:109
@ DEVICE_3DLABS_300SX
Definition dx8caps.h:105
@ DEVICE_3DLABS_MX
Definition dx8caps.h:108
@ DEVICE_3DLABS_PERMEDIA2S_ST
Definition dx8caps.h:110
static void Shutdown(void)
Definition dx8caps.cpp:502
DeviceTypePowerVR
Definition dx8caps.h:190
@ DEVICE_POWERVR_UNKNOWN
Definition dx8caps.h:191
@ DEVICE_POWERVR_KYRO
Definition dx8caps.h:192
void Compute_Caps(WW3DFormat display_format, const D3DADAPTER_IDENTIFIER8 &adapter_id)
Definition dx8caps.cpp:533
DX8Caps(IDirect3D8 *direct3d, const D3DCAPS8 &caps, WW3DFormat display_format, const D3DADAPTER_IDENTIFIER8 &adapter_id)
Definition dx8caps.cpp:480
#define DXLOG(n)
Definition dx8caps.cpp:50
#define COMPACTLOG(n)
Definition dx8caps.cpp:51
#define DX8CALL(x)
Definition dx8wrapper.h:138
D3DFORMAT WW3DFormat_To_D3DFormat(WW3DFormat ww3d_format)
Definition formconv.cpp:142
D3DFORMAT WW3DZFormat_To_D3DFormat(WW3DZFormat ww3d_zformat)
Depth Stencil W3D to D3D format conversion.
Definition formconv.cpp:173
void Get_WW3D_ZFormat_Name(WW3DZFormat format, StringClass &name)
Get W3D depth stencil format string name.
void Get_WW3D_Format_Name(WW3DFormat format, StringClass &name)
WW3DFormat
Definition ww3dformat.h:75
@ WW3D_FORMAT_DXT3
Definition ww3dformat.h:98
@ WW3D_FORMAT_DXT2
Definition ww3dformat.h:97
@ WW3D_FORMAT_COUNT
Definition ww3dformat.h:101
@ WW3D_FORMAT_DXT5
Definition ww3dformat.h:100
@ WW3D_FORMAT_UNKNOWN
Definition ww3dformat.h:76
@ WW3D_FORMAT_DXT4
Definition ww3dformat.h:99
@ WW3D_FORMAT_DXT1
Definition ww3dformat.h:96
WW3DZFormat
Definition ww3dformat.h:106
@ WW3D_ZFORMAT_UNKNOWN
Definition ww3dformat.h:107
@ WW3D_ZFORMAT_COUNT
Definition ww3dformat.h:121