////////////////////////////////////////////////////////////////////// // // Crytek CryENGINE Source code // // File: SystemRender.cpp // Description: CryENGINE system core // // History: // -Jan 6,2004: split from system.cpp // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "System.h" #ifndef _XBOX #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include "windows.h" #endif #else #include #endif #include #include "Log.h" #include "XConsole.h" #include #include #include "CrySizerStats.h" #include "CrySizerImpl.h" #ifdef WIN32 #include "luadebugger/luadbginterface.h" #include "luadebugger/LuaDbg.h" #endif #if !defined(LINUX) #include extern HRESULT GetDXVersion( DWORD* pdwDirectXVersion, TCHAR* strDirectXVersion, int cchDirectXVersion ); #endif extern int g_nPrecaution; #if !defined(LINUX) ///////////////////////////////////////////////////////////////////////////////// int CSystem::AutoDetectRenderer(char *Vendor, char *Device) { HRESULT hr; LPDIRECTDRAW7 pDD; HINSTANCE hDDInstance; int nRenderer = R_DX9_RENDERER; // Dynamically load the DLL. typedef HRESULT (WINAPI *DD_CREATE_FUNC)(GUID* lpGUID, void* lplpDD, REFIID iid,IUnknown* pUnkOuter); typedef HRESULT (WINAPI *DD_ENUM_FUNC )(LPDDENUMCALLBACKEXA lpCallback,void* lpContext,DWORD dwFlags); DD_CREATE_FUNC ddCreateFunc; DD_ENUM_FUNC ddEnumFunc; hDDInstance = CryLoadLibrary(_T("ddraw.dll")); if( hDDInstance == NULL ) return nRenderer; ddCreateFunc = (DD_CREATE_FUNC)GetProcAddress( hDDInstance, "DirectDrawCreateEx" ); ddEnumFunc = (DD_ENUM_FUNC )GetProcAddress( hDDInstance, "DirectDrawEnumerateExA" ); if( !ddCreateFunc || !ddEnumFunc ) return nRenderer; if(FAILED(hr=ddCreateFunc(NULL,&pDD,IID_IDirectDraw7,NULL))) { FreeLibrary(hDDInstance); return nRenderer; } DDDEVICEIDENTIFIER2 DeviceIdentifier; memset(&DeviceIdentifier,0,sizeof(DeviceIdentifier)); if(FAILED(hr=pDD->GetDeviceIdentifier(&DeviceIdentifier,0))) { pDD->Release(); FreeLibrary(hDDInstance); return nRenderer; } bool bUnsupported = false; switch(DeviceIdentifier.dwVendorId) { // 3DFX case 0x1142: case 0x10d9: case 0x121a: strcpy(Vendor, "3DFX"); bUnsupported = true; switch (DeviceIdentifier.dwDeviceId) { case 0x0001: strcpy(Device, "Voodoo 1"); break; case 0x0002: strcpy(Device, "Voodoo 2"); break; case 0x0003: case 0x0004: strcpy(Device, "Banshee"); break; case 0x0005: strcpy(Device, "Voodoo 3"); break; case 0x0007: case 0x0009: strcpy(Device, "Voodoo 4"); break; case 0x643d: strcpy(Device, "Rush (Alliance)"); break; case 0x8626: strcpy(Device, "Rush (Macronix)"); break; default: strcpy(Device, "Unknown"); } break; case 0x104a: strcpy(Vendor, "ST Microelectronics"); bUnsupported = true; switch (DeviceIdentifier.dwDeviceId) { case 0x0010: strcpy(Device, "Kyro I/II"); break; default: strcpy(Device, "Unknown"); } break; case 0x1002: strcpy(Vendor, "ATI"); nRenderer = R_DX9_RENDERER; switch (DeviceIdentifier.dwDeviceId) { case 0x4158: strcpy(Device, "Mach 32"); bUnsupported = true; break; case 0x4337: strcpy(Device, "IGP 340M"); bUnsupported = true; break; case 0x4354: strcpy(Device, "Mach 64"); bUnsupported = true; break; case 0x4358: strcpy(Device, "Mach 64"); bUnsupported = true; break; case 0x4554: strcpy(Device, "Mach 64"); bUnsupported = true; break; case 0x4654: strcpy(Device, "Mach 64"); bUnsupported = true; break; case 0x4742: strcpy(Device, "Rage Pro"); bUnsupported = true; break; case 0x4744: strcpy(Device, "Rage Pro"); bUnsupported = true; break; case 0x4747: strcpy(Device, "Rage Pro"); bUnsupported = true; break; case 0x4749: strcpy(Device, "Rage Pro"); bUnsupported = true; break; case 0x474c: strcpy(Device, "Rage XC"); bUnsupported = true; break; case 0x474d: strcpy(Device, "Rage XL"); bUnsupported = true; break; case 0x474e: strcpy(Device, "Rage XC"); bUnsupported = true; break; case 0x474f: strcpy(Device, "Rage XL"); bUnsupported = true; break; case 0x4750: strcpy(Device, "Rage Pro"); bUnsupported = true; break; case 0x4751: strcpy(Device, "Rage Pro"); bUnsupported = true; break; case 0x4752: strcpy(Device, "Rage XL"); bUnsupported = true; break; case 0x4753: strcpy(Device, "Rage XC"); bUnsupported = true; break; case 0x4754: strcpy(Device, "Rage II"); bUnsupported = true; break; case 0x4755: strcpy(Device, "Rage II+"); bUnsupported = true; break; case 0x4756: strcpy(Device, "Rage IIC"); bUnsupported = true; break; case 0x4757: strcpy(Device, "Rage IIC"); bUnsupported = true; break; case 0x4758: strcpy(Device, "Mach 64"); bUnsupported = true; break; case 0x4759: strcpy(Device, "Rage IIC"); bUnsupported = true; break; case 0x475a: strcpy(Device, "Rage IIC"); bUnsupported = true; break; case 0x4c42: strcpy(Device, "Rage LT Pro"); bUnsupported = true; break; case 0x4c44: strcpy(Device, "Rage LT Pro"); bUnsupported = true; break; case 0x4c47: strcpy(Device, "Rage LT"); bUnsupported = true; break; case 0x4c49: strcpy(Device, "Rage LT Pro"); bUnsupported = true; break; case 0x4c50: strcpy(Device, "Rage LT Pro"); bUnsupported = true; break; case 0x4c51: strcpy(Device, "Rage LT Pro"); bUnsupported = true; break; case 0x4c45: strcpy(Device, "Rage Mobility"); bUnsupported = true; break; case 0x4c46: strcpy(Device, "Rage Mobility"); bUnsupported = true; break; case 0x4c4d: strcpy(Device, "Rage Mobility"); bUnsupported = true; break; case 0x4c4e: strcpy(Device, "Rage Mobility"); bUnsupported = true; break; case 0x4c52: strcpy(Device, "Rage Mobility"); bUnsupported = true; break; case 0x4c53: strcpy(Device, "Rage Mobility"); bUnsupported = true; break; case 0x4c54: strcpy(Device, "Rage Mobility"); bUnsupported = true; break; case 0x4d46: strcpy(Device, "Rage Mobility 128"); bUnsupported = true; break; case 0x4d4c: strcpy(Device, "Rage Mobility 128"); bUnsupported = true; break; case 0x5041: strcpy(Device, "Rage 128 Pro PCI"); bUnsupported = true; break; case 0x5042: strcpy(Device, "Rage 128 Pro AGP2X"); bUnsupported = true; break; case 0x5043: strcpy(Device, "Rage 128 Pro AGP4X"); bUnsupported = true; break; case 0x5044: strcpy(Device, "Rage 128 Pro PCI TMDS"); bUnsupported = true; break; case 0x5045: strcpy(Device, "Rage 128 Pro AGP2X TMDS"); bUnsupported = true; break; case 0x5046: strcpy(Device, "Rage 128 Pro AGP4X TMDS"); bUnsupported = true; break; case 0x5047: strcpy(Device, "Rage 128 Pro PCI"); bUnsupported = true; break; case 0x5048: strcpy(Device, "Rage 128 Pro AGP2X"); bUnsupported = true; break; case 0x5049: strcpy(Device, "Rage 128 Pro AGP4X"); bUnsupported = true; break; case 0x504a: strcpy(Device, "Rage 128 Pro PCI TMDS"); bUnsupported = true; break; case 0x504b: strcpy(Device, "Rage 128 Pro AGP2X TMDS"); bUnsupported = true; break; case 0x504c: strcpy(Device, "Rage 128 Pro AGP4X TMDS"); bUnsupported = true; break; case 0x504d: strcpy(Device, "Rage 128 Pro PCI"); bUnsupported = true; break; case 0x504e: strcpy(Device, "Rage 128 Pro AGP2X"); bUnsupported = true; break; case 0x504f: strcpy(Device, "Rage 128 Pro AGP4X"); bUnsupported = true; break; case 0x5050: strcpy(Device, "Rage 128 Pro PCI TMDS"); bUnsupported = true; break; case 0x5051: strcpy(Device, "Rage 128 Pro AGP2X TMDS"); bUnsupported = true; break; case 0x5052: strcpy(Device, "Rage 128 Pro AGP4X TMDS"); bUnsupported = true; break; case 0x5053: strcpy(Device, "Rage 128 Pro PCI"); bUnsupported = true; break; case 0x5054: strcpy(Device, "Rage 128 Pro AGP2X"); bUnsupported = true; break; case 0x5055: strcpy(Device, "Rage 128 Pro AGP4X"); bUnsupported = true; break; case 0x5056: strcpy(Device, "Rage 128 Pro PCI TMDS"); bUnsupported = true; break; case 0x5057: strcpy(Device, "Rage 128 Pro AGP2X TMDS"); bUnsupported = true; break; case 0x5058: strcpy(Device, "Rage 128 Pro AGP4X TMDS"); bUnsupported = true; break; case 0x5245: strcpy(Device, "Rage 128 GL PCI"); bUnsupported = true; break; case 0x5246: strcpy(Device, "Rage 128 GL AGP"); bUnsupported = true; break; case 0x5247: strcpy(Device, "Rage 128"); bUnsupported = true; break; case 0x524b: strcpy(Device, "Rage 128 VR PCI"); bUnsupported = true; break; case 0x524c: strcpy(Device, "Rage 128 VR AGP"); bUnsupported = true; break; case 0x5345: strcpy(Device, "Rage 128 4X PCI"); bUnsupported = true; break; case 0x5346: strcpy(Device, "Rage 128 4X AGP2X"); bUnsupported = true; break; case 0x5347: strcpy(Device, "Rage 128 4X AGP4X"); bUnsupported = true; break; case 0x5348: strcpy(Device, "Rage 128 4X"); bUnsupported = true; break; case 0x534b: strcpy(Device, "Rage 128 4X PCI"); bUnsupported = true; break; case 0x534c: strcpy(Device, "Rage 128 4X AGP2X"); bUnsupported = true; break; case 0x534d: strcpy(Device, "Rage 128 4X AGP4X"); bUnsupported = true; break; case 0x534e: strcpy(Device, "Rage 128 4X"); bUnsupported = true; break; case 0x5354: strcpy(Device, "Mach 64"); bUnsupported = true; break; case 0x5446: strcpy(Device, "Rage 128 Pro Ultra GL AGP"); bUnsupported = true; break; case 0x544c: strcpy(Device, "Rage 128 Pro Ultra VR AGP"); bUnsupported = true; break; case 0x5452: strcpy(Device, "Rage 128 Pro Ultra4XL VR-R AGP"); bUnsupported = true; break; case 0x5453: strcpy(Device, "Rage 128 Pro"); bUnsupported = true; break; case 0x5454: strcpy(Device, "Rage 128 Pro"); bUnsupported = true; break; case 0x5455: strcpy(Device, "Rage 128 Pro"); bUnsupported = true; break; case 0x5654: strcpy(Device, "Mach 64"); bUnsupported = true; break; case 0x5655: strcpy(Device, "Mach 64"); bUnsupported = true; break; case 0x5656: strcpy(Device, "Mach 64"); bUnsupported = true; break; case 0x4c57: strcpy(Device, "Radeon Mobility 7500"); bUnsupported = true; break; case 0x4c58: strcpy(Device, "Radeon Mobility 7500"); bUnsupported = true; break; case 0x4c59: strcpy(Device, "Radeon Mobility VE"); bUnsupported = true; break; case 0x4c5a: strcpy(Device, "Radeon Mobility VE"); bUnsupported = true; break; case 0x4c64: strcpy(Device, "Radeon Mobility 9000"); break; case 0x4c66: strcpy(Device, "Radeon Mobility 9000"); break; case 0x4966: strcpy(Device, "Radeon 9000"); break; case 0x496e: strcpy(Device, "Radeon 9000 - Secondary"); break; case 0x514d: strcpy(Device, "Radeon 9100"); break; case 0x5834: strcpy(Device, "Radeon 9100 IGP"); break; case 0x4242: strcpy(Device, "Radeon 8500 DV"); break; case 0x4152: strcpy(Device, "Radeon 9600"); break; case 0x4172: strcpy(Device, "Radeon 9600 - Secondary"); break; case 0x4164: strcpy(Device, "Radeon 9500 - Secondary"); break; case 0x4144: strcpy(Device, "Radeon 9500"); break; case 0x4e45: strcpy(Device, "Radeon 9500 Pro / 9700"); break; case 0x4150: strcpy(Device, "Radeon 9600 Pro"); break; case 0x4151: strcpy(Device, "Radeon 9600"); break; case 0x4170: strcpy(Device, "Radeon 9600 Pro - Secondary"); break; case 0x4171: strcpy(Device, "Radeon 9600 - Secondary"); break; case 0x4e46: strcpy(Device, "Radeon 9600 TX"); break; case 0x4e66: strcpy(Device, "Radeon 9600 TX - Secondary"); break; case 0x4e44: strcpy(Device, "Radeon 9700 Pro"); break; case 0x4e64: strcpy(Device, "Radeon 9700 Pro - Secondary"); break; case 0x4e65: strcpy(Device, "Radeon 9500 Pro / 9700 - Secondary"); break; case 0x4e49: strcpy(Device, "Radeon 9800"); break; case 0x4e69: strcpy(Device, "Radeon 9800 - Secondary"); break; case 0x4148: strcpy(Device, "Radeon 9800"); break; case 0x4168: strcpy(Device, "Radeon 9800 - Secondary"); break; case 0x4e48: strcpy(Device, "Radeon 9800 Pro"); break; case 0x4e68: strcpy(Device, "Radeon 9800 Pro - Secondary"); break; case 0x4e4a: strcpy(Device, "Radeon 9800 XT"); break; case 0x4e6a: strcpy(Device, "Radeon 9800 XT - Secondary"); break; case 0x5960: strcpy(Device, "Radeon 9200 Pro"); break; case 0x5940: strcpy(Device, "Radeon 9200 Pro - Secondary"); break; case 0x5961: strcpy(Device, "Radeon 9200"); break; case 0x5941: strcpy(Device, "Radeon 9200 - Secondary"); break; case 0x5964: strcpy(Device, "Radeon 9200SE"); break; case 0x5144: strcpy(Device, "Radeon 7200"); break; case 0x5145: strcpy(Device, "Radeon"); break; case 0x5146: strcpy(Device, "Radeon"); break; case 0x5147: strcpy(Device, "Radeon"); break; case 0x5148: strcpy(Device, "Radeon FireGL"); break; case 0x5157: strcpy(Device, "Radeon 7500"); break; case 0x5159: strcpy(Device, "Radeon 7000 VE"); break; case 0x515a: strcpy(Device, "Radeon VE"); break; case 0x516c: strcpy(Device, "Radeon"); break; case 0x514c: strcpy(Device, "Radeon 8500"); break; case 0x514e: strcpy(Device, "Radeon 8500"); break; case 0x514f: strcpy(Device, "Radeon 8500"); break; case 0x4136: strcpy(Device, "IGP 320"); break; case 0x4137: strcpy(Device, "IGP 340"); break; case 0x4A49: strcpy(Device, "Radeon X800 Pro"); break; case 0x4A4A: strcpy(Device, "Radeon X800 SE"); break; case 0x4A4B: strcpy(Device, "Radeon X800"); break; case 0x4A4C: strcpy(Device, "Radeon X800 Series"); break; case 0x4A50: strcpy(Device, "Radeon X800 XT"); break; case 0x4A69: strcpy(Device, "Radeon X800 Pro Secondary"); break; case 0x4A6A: strcpy(Device, "Radeon X800 SE Secondary"); break; case 0x4A6b: strcpy(Device, "Radeon X800 Secondary"); break; case 0x4A6C: strcpy(Device, "Radeon X800 Series Secondary"); break; case 0x4A70: strcpy(Device, "Radeon X800 XT Secondary"); break; default: strcpy(Device, "Unknown"); } break; case 0x104c: case 0x10ba: case 0x3d3d: case 0x1048: strcpy(Vendor, "3D Labs"); switch (DeviceIdentifier.dwDeviceId) { case 0x0001: strcpy(Device, "GLiNT 300SX"); bUnsupported = true; break; case 0x0002: strcpy(Device, "GLiNT 500TX"); bUnsupported = true; break; case 0x0003: strcpy(Device, "GLiNT"); bUnsupported = true; break; case 0x0004: strcpy(Device, "Permedia"); bUnsupported = true; break; case 0x0005: strcpy(Device, "Permedia"); bUnsupported = true; break; case 0x0006: strcpy(Device, "GLiNT MX"); bUnsupported = true; break; case 0x0007: strcpy(Device, "Permedia 2"); bUnsupported = true; break; case 0x0008: strcpy(Device, "GLiNT G1"); bUnsupported = true; break; case 0x0009: strcpy(Device, "Permedia 2"); bUnsupported = true; break; case 0x000b: strcpy(Device, "Oxygen Series R3"); bUnsupported = true; break; case 0x000d: strcpy(Device, "Oxygen Series R4"); bUnsupported = true; break; case 0x000e: strcpy(Device, "Oxygen Series Gamma2"); bUnsupported = true; break; case 0x0100: strcpy(Device, "Permedia 2"); bUnsupported = true; break; case 0x0301: strcpy(Device, "Permedia 2"); bUnsupported = true; break; case 0x1004: strcpy(Device, "Permedia"); bUnsupported = true; break; case 0x3d04: strcpy(Device, "Permedia 1"); bUnsupported = true; break; case 0x3d07: strcpy(Device, "Permedia 2"); bUnsupported = true; break; case 0x8901: strcpy(Device, "GLiNT"); bUnsupported = true; break; case 0x000a: strcpy(Device, "Permedia 3"); break; case 0x000c: strcpy(Device, "Permedia 4"); break; default: strcpy(Device, "Unknown"); } break; case 0x1039: strcpy(Vendor, "SiS"); switch (DeviceIdentifier.dwDeviceId) { case 0x0204: strcpy(Device, "6215"); bUnsupported = true; break; case 0x0205: strcpy(Device, "6205"); bUnsupported = true; break; case 0x0305: strcpy(Device, "305"); bUnsupported = true; break; case 0x6306: strcpy(Device, "530"); bUnsupported = true; break; case 0x6326: strcpy(Device, "6326"); bUnsupported = true; break; case 0x6325: strcpy(Device, "650"); bUnsupported = true; break; case 0x0325: strcpy(Device, "315"); break; case 0x0330: strcpy(Device, "Xabre 330"); break; default: strcpy(Device, "Unknown"); } break; case 0x5333: strcpy(Vendor, "S3"); switch (DeviceIdentifier.dwDeviceId) { case 0x9102: strcpy(Device, "Savage 2000"); bUnsupported = true; break; case 0x8a20: strcpy(Device, "Savage 3D"); bUnsupported = true; break; case 0x8a21: strcpy(Device, "Savage 3D S3"); bUnsupported = true; break; case 0x8a22: strcpy(Device, "Savage 3D S4"); bUnsupported = true; break; case 0x8a23: strcpy(Device, "Savage 3D S4"); bUnsupported = true; break; case 0x8a25: strcpy(Device, "Savage4 ProSavage"); bUnsupported = true; break; case 0x8a26: strcpy(Device, "ProSavage"); bUnsupported = true; break; case 0x8c10: strcpy(Device, "Savage MX"); bUnsupported = true; break; case 0x8c12: strcpy(Device, "Savage IX"); bUnsupported = true; break; case 0x8c22: strcpy(Device, "SuperSavage 128 MX"); bUnsupported = true; break; case 0x8c2a: strcpy(Device, "SuperSavage 128 IX"); bUnsupported = true; break; case 0x8c2b: strcpy(Device, "SuperSavage 128 IX DDR"); bUnsupported = true; break; case 0x8c2c: strcpy(Device, "SuperSavage IX"); bUnsupported = true; break; case 0x8c2d: strcpy(Device, "SuperSavage IX DDR"); bUnsupported = true; break; case 0x8c2e: strcpy(Device, "SuperSavage IXC SDR"); bUnsupported = true; break; case 0x8c2f: strcpy(Device, "SuperSavage IXC DDR"); bUnsupported = true; break; case 0x8d04: strcpy(Device, "ProSavage"); bUnsupported = true; break; case 0x5631: strcpy(Device, "Virge"); bUnsupported = true; break; case 0x8811: strcpy(Device, "Trio 64"); bUnsupported = true; break; case 0x8812: strcpy(Device, "Trio 64"); bUnsupported = true; break; case 0x8814: strcpy(Device, "Trio 64 Plus"); bUnsupported = true; break; case 0x8815: strcpy(Device, "Aurora 128"); bUnsupported = true; break; case 0x883d: strcpy(Device, "Virge"); bUnsupported = true; break; case 0x8880: strcpy(Device, "Virge"); bUnsupported = true; break; case 0x88c0: strcpy(Device, "Virge"); bUnsupported = true; break; case 0x88c1: strcpy(Device, "Virge"); bUnsupported = true; break; case 0x88d0: strcpy(Device, "Virge"); bUnsupported = true; break; case 0x88d1: strcpy(Device, "Virge"); bUnsupported = true; break; case 0x88f0: strcpy(Device, "Virge"); bUnsupported = true; break; case 0x8901: strcpy(Device, "Trio 64 DX"); bUnsupported = true; break; case 0x8904: strcpy(Device, "Trio 3D"); bUnsupported = true; break; case 0x8a01: strcpy(Device, "Virge DXGX"); bUnsupported = true; break; case 0x8a10: strcpy(Device, "Virge GX2"); bUnsupported = true; break; case 0x8a13: strcpy(Device, "Trio3D"); bUnsupported = true; break; case 0x8c00: strcpy(Device, "Virge MX"); bUnsupported = true; break; case 0x8c01: strcpy(Device, "Virge MX"); bUnsupported = true; break; case 0x8c02: strcpy(Device, "Virge MXC"); bUnsupported = true; break; case 0x8c03: strcpy(Device, "Virge MX"); bUnsupported = true; break; case 0x8d02: strcpy(Device, "Graphics Twister"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x102b: strcpy(Vendor, "Matrox"); switch (DeviceIdentifier.dwDeviceId) { case 0x0518: strcpy(Device, "Millennium"); bUnsupported = true; break; case 0x0519: strcpy(Device, "Millennium"); bUnsupported = true; break; case 0x051a: strcpy(Device, "Mystique"); bUnsupported = true; break; case 0x051b: strcpy(Device, "Millennium II"); bUnsupported = true; break; case 0x051f: strcpy(Device, "Millennium II"); bUnsupported = true; break; case 0x0d10: strcpy(Device, "Mystique"); bUnsupported = true; break; case 0x1000: strcpy(Device, "G100 PCI"); bUnsupported = true; break; case 0x1001: strcpy(Device, "G100 AGP"); bUnsupported = true; break; case 0x0520: strcpy(Device, "G200 PCI"); bUnsupported = true; break; case 0x0521: strcpy(Device, "G200 AGP"); bUnsupported = true; break; case 0x1525: strcpy(Device, "Fusion G450"); bUnsupported = true; break; case 0x0525: strcpy(Device, "G400/450"); bUnsupported = true; break; case 0x2007: strcpy(Device, "Mistral"); bUnsupported = true; break; case 0x2527: strcpy(Device, "G550"); break; case 0x1527: strcpy(Device, "Fusion G800"); break; case 0x0527: strcpy(Device, "Parhelia 128"); break; default: strcpy(Device, "Unknown"); } break; case 0x14Af: strcpy(Vendor, "Guillemot"); switch (DeviceIdentifier.dwDeviceId) { case 0x5810: strcpy(Device, "TNT2"); bUnsupported = true; break; case 0x5820: strcpy(Device, "TNT2 Ultra"); bUnsupported = true; break; case 0x5620: strcpy(Device, "TNT2 M64"); bUnsupported = true; break; case 0x5020: strcpy(Device, "GeForce 256"); bUnsupported = true; break; case 0x5008: strcpy(Device, "TNT Vanta"); bUnsupported = true; break; case 0x4D20: strcpy(Device, "TNT2 M64"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x10b4: case 0x12d2: case 0x10de: strcpy(Vendor, "nVidia"); switch (DeviceIdentifier.dwDeviceId) { case 0x1b1d: strcpy(Device, "Riva 128"); bUnsupported = true; break; case 0x0008: strcpy(Device, "NV 1"); bUnsupported = true; break; case 0x0009: strcpy(Device, "NV 1"); bUnsupported = true; break; case 0x0010: strcpy(Device, "NV 2"); bUnsupported = true; break; case 0x0018: strcpy(Device, "Riva 128"); bUnsupported = true; break; case 0x0019: strcpy(Device, "Riva 128 ZX"); bUnsupported = true; break; case 0x0020: strcpy(Device, "TNT"); bUnsupported = true; break; case 0x002e: strcpy(Device, "TNT Vanta"); bUnsupported = true; break; case 0x002f: strcpy(Device, "TNT Vanta"); bUnsupported = true; break; case 0x00a0: strcpy(Device, "TNT2 Aladdin"); bUnsupported = true; break; case 0x0028: strcpy(Device, "Riva TNT2/TNT2 Pro"); bUnsupported = true; break; case 0x0029: strcpy(Device, "TNT2 Ultra"); bUnsupported = true; break; case 0x002a: strcpy(Device, "TNT2"); bUnsupported = true; break; case 0x002b: strcpy(Device, "TNT2"); bUnsupported = true; break; case 0x002c: strcpy(Device, "TNT Vanta/Vanta LT"); bUnsupported = true; break; case 0x002d: strcpy(Device, "TNT2 M64/M64 Pro"); bUnsupported = true; break; case 0x0040: strcpy(Device, "GeForce 6800 Ultra"); break; case 0x0041: strcpy(Device, "GeForce 6800"); break; case 0x0042: case 0x0043: case 0x0044: case 0x0045: case 0x0046: case 0x0047: case 0x0048: case 0x004a: case 0x004b: case 0x004c: case 0x004d: case 0x004f: strcpy(Device, "NV40"); break; case 0x0049: case 0x004e: strcpy(Device, "NV40GL"); break; case 0x00f9: strcpy(Device, "GeForce 6800 Ultra"); break; case 0x00fa: strcpy(Device, "GeForce PCX 5750"); break; case 0x00fb: strcpy(Device, "GeForce PCX 5900"); break; case 0x00fc: strcpy(Device, "GeForce PCX 5300"); break; case 0x00fd: strcpy(Device, "Quadro PCI-E Series"); break; case 0x00fe: strcpy(Device, "Quadro FX 1300"); break; case 0x00ff: strcpy(Device, "GeForce PCX 4300"); break; case 0x0100: strcpy(Device, "GeForce 256"); break; case 0x0101: strcpy(Device, "GeForce 256 DDR"); break; case 0x0102: strcpy(Device, "GeForce 256 Ultra"); break; case 0x0103: strcpy(Device, "GeForce 256 Quadro"); break; case 0x0110: strcpy(Device, "GeForce2 MX/MX 400"); break; case 0x0111: strcpy(Device, "GeForce2 MX 100/200"); break; case 0x0112: strcpy(Device, "GeForce2 Go"); break; case 0x0113: strcpy(Device, "Quadro2 MXR/EX"); break; case 0x0150: strcpy(Device, "GeForce2 GTS/GeForce2 Pro"); break; case 0x0151: strcpy(Device, "GeForce2 Ti"); break; case 0x0152: strcpy(Device, "GeForce2 Ultra"); break; case 0x0153: strcpy(Device, "Quadro2 Pro"); break; case 0x0170: strcpy(Device, "GeForce4 MX 460"); break; case 0x0171: strcpy(Device, "GeForce4 MX 440"); break; case 0x0172: strcpy(Device, "GeForce4 MX 420"); break; case 0x0173: strcpy(Device, "GeForce4 MX 440-SE"); break; case 0x0174: strcpy(Device, "GeForce4 Go 440"); break; case 0x0175: strcpy(Device, "GeForce4 Go 420"); break; case 0x0176: strcpy(Device, "GeForce4 Go 420"); break; case 0x0177: strcpy(Device, "GeForce4 460 Go"); break; case 0x0178: strcpy(Device, "Quadro4 550 XGL"); break; case 0x0179: strcpy(Device, "GeForce4 Go 440"); break; case 0x017a: strcpy(Device, "Quadro NVS"); break; case 0x017b: strcpy(Device, "Quadro 550 XGL"); break; case 0x017c: strcpy(Device, "Quadro4 500 GoGL"); break; case 0x017d: strcpy(Device, "GeForce4 410 Go 16M"); break; case 0x0181: strcpy(Device, "GeForce4 MX 440 with AGP8X"); break; case 0x0182: strcpy(Device, "GeForce4 MX 440SE with AGP8X"); break; case 0x0183: strcpy(Device, "GeForce4 MX 420 with AGP8X"); break; case 0x0188: strcpy(Device, "Quadro4 580 XGL"); break; case 0x018a: strcpy(Device, "Quadro NVS with AGP8X"); break; case 0x018b: strcpy(Device, "Quadro4 380 XGL"); break; case 0x01a0: strcpy(Device, "GeForce2 Integrated GPU (nForce)"); break; case 0x01f0: strcpy(Device, "GeForce4 MX Integrated GPU (nForce2)"); break; case 0x0200: strcpy(Device, "GeForce3"); break; case 0x0201: strcpy(Device, "GeForce3 Ti200"); break; case 0x0202: strcpy(Device, "GeForce3 Ti500"); break; case 0x0203: strcpy(Device, "Quadro DCC"); break; case 0x0250: strcpy(Device, "GeForce4 Ti 4600"); break; case 0x0251: strcpy(Device, "GeForce4 Ti 4400"); break; case 0x0253: strcpy(Device, "GeForce4 Ti 4200"); break; case 0x0258: strcpy(Device, "Quadro4 900 XGL"); break; case 0x0259: strcpy(Device, "Quadro4 750 XGL"); break; case 0x025b: strcpy(Device, "Quadro4 700 XGL"); break; case 0x0280: strcpy(Device, "GeForce4 Ti 4800"); break; case 0x0281: strcpy(Device, "GeForce4 Ti4200 with AGP8X"); break; case 0x0282: strcpy(Device, "GeForce4 Ti 4800 SE"); break; case 0x0288: strcpy(Device, "Quadro4 980 XGL"); break; case 0x0289: strcpy(Device, "Quadro4 780 XGL"); break; case 0x02a0: strcpy(Device, "GeForce3 XBOX"); break; case 0x0301: strcpy(Device, "GeForce FX 5800 Ultra"); break; case 0x0302: strcpy(Device, "GeForce FX 5800"); break; case 0x0308: strcpy(Device, "Quadro FX 2000"); break; case 0x0309: strcpy(Device, "Quadro FX 1000"); break; case 0x030a: strcpy(Device, "ICE FX 2000"); break; case 0x0311: strcpy(Device, "GeForce FX 5600 Ultra"); break; case 0x0312: strcpy(Device, "GeForce FX 5600"); break; case 0x0313: strcpy(Device, "NV31"); break; case 0x0314: strcpy(Device, "GeForce FX 5600XT"); break; case 0x031a: strcpy(Device, "GeForce FX Go5600"); break; case 0x0321: strcpy(Device, "GeForce FX 5200 Ultra"); break; case 0x0322: strcpy(Device, "GeForce FX 5200"); break; case 0x0323: strcpy(Device, "GeForce FX 5200SE"); break; case 0x0324: strcpy(Device, "GeForce FX Go5200"); break; case 0x0325: strcpy(Device, "GeForce FX Go5250"); break; case 0x0328: strcpy(Device, "GeForce FX Go5200 32M/64M"); break; case 0x032a: strcpy(Device, "Quadro NVS 280 PCI"); break; case 0x032b: strcpy(Device, "Quadro FX 500"); break; case 0x032c: strcpy(Device, "GeForce FX Go53xx Series"); break; case 0x032d: strcpy(Device, "GeForce FX Go5100"); break; case 0x032f: strcpy(Device, "NV34GL"); break; case 0x0330: strcpy(Device, "GeForce FX 5900 Ultra"); break; case 0x0331: strcpy(Device, "GeForce FX 5900"); break; case 0x0332: strcpy(Device, "GeForce FX 5900XT"); break; case 0x0333: strcpy(Device, "GeForce FX 5950 Ultra"); break; case 0x0338: strcpy(Device, "Quadro FX 3000"); break; case 0x0341: strcpy(Device, "GeForce FX 5700 Ultra"); break; case 0x0342: strcpy(Device, "GeForce FX 5700"); break; case 0x0343: strcpy(Device, "GeForce FX 5700LE"); break; case 0x0344: strcpy(Device, "GeForce FX 5700VE"); break; case 0x0345: strcpy(Device, "NV36"); break; case 0x0347: strcpy(Device, "GeForce FX Go5700"); break; case 0x0348: strcpy(Device, "GeForce FX Go5700"); break; case 0x0349: strcpy(Device, "NV36M Pro"); break; case 0x034b: strcpy(Device, "NV36MAP"); break; case 0x034c: strcpy(Device, "Quadro FX Go1000"); break; case 0x034e: strcpy(Device, "Quadro FX 1100"); break; case 0x034f: strcpy(Device, "NV36GL"); break; default: strcpy(Device, "Unknown"); } break; case 0x8086: strcpy(Vendor, "Intel"); switch (DeviceIdentifier.dwDeviceId) { case 0x7121: strcpy(Device, "810"); bUnsupported = true; break; case 0x7123: strcpy(Device, "810"); bUnsupported = true; break; case 0x7125: strcpy(Device, "810e"); bUnsupported = true; break; case 0x7127: strcpy(Device, "810"); bUnsupported = true; break; case 0x1132: strcpy(Device, "815"); bUnsupported = true; break; case 0x7800: strcpy(Device, "740"); bUnsupported = true; break; case 0x1240: strcpy(Device, "752"); bUnsupported = true; break; case 0x3577: strcpy(Device, "830"); break; case 0x2562: strcpy(Device, "845"); break; case 0x2572: strcpy(Device, "865G"); break; default: strcpy(Device, "Unknown"); } break; case 0x1033: strcpy(Vendor, "VideoLogic"); switch (DeviceIdentifier.dwDeviceId) { case 0x0046: strcpy(Device, "PowerVR"); bUnsupported = true; break; case 0x0067: strcpy(Device, "PowerVR2"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x1023: strcpy(Vendor, "Trident"); switch (DeviceIdentifier.dwDeviceId) { case 0x8420: strcpy(Device, "CyberBlade i7"); bUnsupported = true; break; case 0x8820: strcpy(Device, "CyberBlade XP"); bUnsupported = true; break; case 0x9320: strcpy(Device, "Cyber9320"); bUnsupported = true; break; case 0x9388: strcpy(Device, "Cyber9388"); bUnsupported = true; break; case 0x9397: strcpy(Device, "Cyber9397"); bUnsupported = true; break; case 0x939A: strcpy(Device, "Cyber9397 DVD"); bUnsupported = true; break; case 0x9440: strcpy(Device, "Cyber"); bUnsupported = true; break; case 0x9520: strcpy(Device, "Cyber9520"); bUnsupported = true; break; case 0x9525: strcpy(Device, "Cyber9520 DVD"); bUnsupported = true; break; case 0x9540: strcpy(Device, "CyberBlade E4"); bUnsupported = true; break; case 0x9660: strcpy(Device, "Cyber9385"); bUnsupported = true; break; case 0x9750: strcpy(Device, "975"); bUnsupported = true; break; case 0x9754: strcpy(Device, "9753"); bUnsupported = true; break; case 0x9850: strcpy(Device, "3D Image"); bUnsupported = true; break; case 0x9880: strcpy(Device, "Blade 3D"); bUnsupported = true; break; case 0x9910: strcpy(Device, "CyberBlade XP"); bUnsupported = true; break; case 0x9930: strcpy(Device, "CyberBlade XPm"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x105d: strcpy(Vendor, "Number Nine"); switch (DeviceIdentifier.dwDeviceId) { case 0x493d: strcpy(Device, "Revolution 3D"); bUnsupported = true; break; case 0x5348: strcpy(Device, "Revolution IV"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x126f: strcpy(Vendor, "Silicon Motion"); switch (DeviceIdentifier.dwDeviceId) { case 0x720 : strcpy(Device, "Lynx 3DM"); bUnsupported = true; break; case 0x820 : strcpy(Device, "Lynx 3D"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x1013: strcpy(Vendor, "Cirrus"); switch (DeviceIdentifier.dwDeviceId) { case 0x0038: strcpy(Device, "GD7548"); bUnsupported = true; break; case 0x00a0: strcpy(Device, "GD5430"); bUnsupported = true; break; case 0x00a8: strcpy(Device, "GD5434"); bUnsupported = true; break; case 0x00ac: strcpy(Device, "GD5436"); bUnsupported = true; break; case 0x00b8: strcpy(Device, "GD5446"); bUnsupported = true; break; case 0x00bc: strcpy(Device, "GD5480"); bUnsupported = true; break; case 0x00d0: strcpy(Device, "CL5462"); bUnsupported = true; break; case 0x00d4: strcpy(Device, "GD5464"); bUnsupported = true; break; case 0x00d6: strcpy(Device, "GD5465"); bUnsupported = true; break; case 0x0301: strcpy(Device, "GD5446"); bUnsupported = true; break; case 0x1100: strcpy(Device, "CL6729"); bUnsupported = true; break; case 0x1202: strcpy(Device, "GD7543"); bUnsupported = true; break; case 0x6001: strcpy(Device, "CL4610"); bUnsupported = true; break; case 0x6003: strcpy(Device, "CL4614"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x1163: strcpy(Vendor, "Rendition"); switch (DeviceIdentifier.dwDeviceId) { case 0x0001: strcpy(Device, "Verite 1000"); bUnsupported = true; break; case 0x2000: strcpy(Device, "Verite 2100"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x110b: strcpy(Vendor, "Chromatic"); switch (DeviceIdentifier.dwDeviceId) { case 0x0004: strcpy(Device, "MPact"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x100e: strcpy(Vendor, "Weitek"); switch (DeviceIdentifier.dwDeviceId) { case 0x9001: strcpy(Device, "P9000"); bUnsupported = true; break; case 0x9100: strcpy(Device, "P9100"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x0e11: strcpy(Vendor, "Compaq"); switch (DeviceIdentifier.dwDeviceId) { case 0x3032: strcpy(Device, "QVision"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x1011: strcpy(Vendor, "Digital"); switch (DeviceIdentifier.dwDeviceId) { case 0x0004: strcpy(Device, "TGA"); bUnsupported = true; break; case 0x000d: strcpy(Device, "TGA2"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x10c8: strcpy(Vendor, "NeoMagic"); switch (DeviceIdentifier.dwDeviceId) { case 0x0001: strcpy(Device, "128"); bUnsupported = true; break; case 0x0002: strcpy(Device, "128"); bUnsupported = true; break; case 0x0003: strcpy(Device, "128ZV"); bUnsupported = true; break; case 0x0004: strcpy(Device, "128XD"); bUnsupported = true; break; case 0x0005: strcpy(Device, "256AV"); bUnsupported = true; break; case 0x0006: strcpy(Device, "256ZX"); bUnsupported = true; break; case 0x0016: strcpy(Device, "256XL"); bUnsupported = true; break; case 0x0025: strcpy(Device, "256AV"); bUnsupported = true; break; case 0x0083: strcpy(Device, "128ZV"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x100c: strcpy(Vendor, "Tseng Labs"); switch (DeviceIdentifier.dwDeviceId) { case 0x3202: strcpy(Device, "ET4000"); bUnsupported = true; break; case 0x3205: strcpy(Device, "ET4000"); bUnsupported = true; break; case 0x3206: strcpy(Device, "ET4000"); bUnsupported = true; break; case 0x3207: strcpy(Device, "ET4000"); bUnsupported = true; break; case 0x3208: strcpy(Device, "ET6000"); bUnsupported = true; break; case 0x4702: strcpy(Device, "ET6300"); bUnsupported = true; break; default: strcpy(Device, "Unknown"); } break; case 0x18ca: strcpy(Vendor, "XGI"); switch (DeviceIdentifier.dwDeviceId) { case 0x40: strcpy(Device, "Volary V8 DUO Ultra"); break; default: strcpy(Device, "Unknown"); } break; default: strcpy(Vendor, "Unknown"); break; } pDD->Release(); FreeLibrary(hDDInstance); if (bUnsupported) return -1; //Check DX version DWORD dwDirectXVersion = 0; TCHAR strDirectXVersion[10]; TCHAR strResult[128]; hr = GetDXVersion( &dwDirectXVersion, strDirectXVersion, 10 ); if( SUCCEEDED(hr) ) { if( dwDirectXVersion > 0 ) { sprintf(strResult, TEXT("DirectX %s installed"), strDirectXVersion); if (dwDirectXVersion < 0x90000) nRenderer = R_GL_RENDERER; } else { strncpy(strResult, TEXT("DirectX not installed"), 128 ); nRenderer = R_GL_RENDERER; } strResult[127] = 0; } else { sprintf( strResult, TEXT("Unknown version of DirectX installed"), hr ); nRenderer = R_GL_RENDERER; strResult[127] = 0; } GetILog()->LogToFile("System: INFO: %s\n", strResult); return nRenderer; } #endif ///////////////////////////////////////////////////////////////////////////////// void CSystem::CreateRendererVars() { // load renderer settings from engine.ini //m_rWidth = GetIConsole()->CreateVariable("r_Width", "800", VF_DUMPTODISK); //m_rHeight = GetIConsole()->CreateVariable("r_Height", "600", VF_DUMPTODISK); m_rWidth = GetIConsole()->CreateVariable("r_Width", "1024", VF_DUMPTODISK, "Sets the display width, in pixels. Default is 1024.\n" "Usage: r_Width [800/1024]"); m_rHeight = GetIConsole()->CreateVariable("r_Height", "768", VF_DUMPTODISK, "Sets the display height, in pixels. Default is 768.\n" "Usage: r_Height [600/768]"); m_rColorBits = GetIConsole()->CreateVariable("r_ColorBits", "32", VF_DUMPTODISK, "Sets the color resolution, in bits per pixel. Default is 32.\n" "Usage: r_ColorBits [32/24/16/8]"); m_rDepthBits = GetIConsole()->CreateVariable("r_DepthBits", "32", VF_DUMPTODISK); m_rStencilBits = GetIConsole()->CreateVariable("r_StencilBits", "8", VF_DUMPTODISK); m_rDriver= GetIConsole()->CreateVariable("r_Driver", "Direct3D9", VF_DUMPTODISK, "Sets the renderer driver. Default is 'Direct3D9'.\n" "Usage: r_Driver Direct3D9"); #ifdef _DEBUG m_rFullscreen = GetIConsole()->CreateVariable("r_Fullscreen", "0", VF_DUMPTODISK, "Toggles fullscreen mode. Default is 1 (fullscreen).\n" "Usage: r_Fullscreen [0/1]\n" "In debug mode, the display is automatically set to windowed mode."); m_rDisplayInfo = GetIConsole()->CreateVariable("r_DisplayInfo", "1", VF_DUMPTODISK, "Toggles debugging information display. Default is 0 (off)." "Usage: r_DisplayInfo [0/1]\n" "In debug mode, the information is automatically displayed."); #else m_rFullscreen = GetIConsole()->CreateVariable("r_Fullscreen", "1", VF_DUMPTODISK, "Toggles fullscreen mode. Default is 1 (fullscreen).\n" "Usage: r_Fullscreen [0/1]\n" "In debug mode, the display is automatically set to windowed mode."); m_rDisplayInfo = GetIConsole()->CreateVariable("r_DisplayInfo", "0", VF_DUMPTODISK, "Toggles debugging information display. Default is 0 (off)." "Usage: r_DisplayInfo [0/1]\n" "In debug mode, the information is automatically displayed."); #endif } ////////////////////////////////////////////////////////////////////// static IRenderer *g_pRenderer; static void g_DrawLine(float *v1,float *v2) { Vec3 V1, V2; //V1.Set(v1[0],); //V2.Set(v2); V1.Set(v1[0],v1[1],v1[2]); V2.Set(v2[0],v2[1],v2[2]); g_pRenderer->DrawLine(V1,V2); } ////////////////////////////////////////////////////////////////////////// void CSystem::RenderBegin() { FUNCTION_PROFILER( this,PROFILE_SYSTEM ); if (m_bIgnoreUpdates) return; ////////////////////////////////////////////////////////////////////// //start the rendering pipeline if (m_pRenderer) m_pRenderer->BeginFrame(); } ////////////////////////////////////////////////////////////////////////// void CSystem::RenderEnd() { FUNCTION_PROFILER( this,PROFILE_SYSTEM ); if (m_bIgnoreUpdates) return; if (!m_pRenderer) return; if (m_pConsole) { m_pConsole->Draw(); m_Time.MeasureTime("3ConsDraw"); } RenderStats(); RenderStatistics (); ////////////////////////////////////////////////////////////////////// //draw labels m_pRenderer->FlushTextMessages(); // Flush render data and swap buffers. m_pRenderer->Update(); m_Time.MeasureTime("3RendFlush"); } ////////////////////////////////////////////////////////////////////////// void CSystem::UpdateLoadingScreen() { if (!m_bEditor) { if (GetIRenderer()->EF_Query(EFQ_RecurseLevel) <= 0) { RenderBegin(); GetIConsole()->Draw(); RenderEnd(); } } // This happens during loading, give windows opportunity to process window messages. #ifdef WIN32 if (m_hWnd && ::IsWindow((HWND)m_hWnd)) { MSG msg; // Don't make any steps while 3D device is lost while (true) { while (PeekMessage(&msg, (HWND)m_hWnd, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } int *nLost = (int *)GetIRenderer()->EF_Query(EFQ_DeviceLost, 0); if (!*nLost) break; } } #endif } //! Renders the statistics; this is called from RenderEnd, but if the //! Host application (Editor) doesn't employ the Render cycle in ISystem, //! it may call this method to render the essential statistics ////////////////////////////////////////////////////////////////////////// void CSystem::RenderStatistics () { // Render profile info. m_FrameProfileSystem.Render(); RenderMemStats(); int profValue = m_sys_profile->GetIVal(); if (profValue != m_profile_old) { m_profile_old = profValue; if (profValue) { // Turn on frame profiler. if (!m_FrameProfileSystem.IsEnabled()) { if (profValue > 0) m_FrameProfileSystem.Enable(true,true); else m_FrameProfileSystem.Enable(true,false); // Not display. } if (profValue < 0) profValue = -profValue; m_FrameProfileSystem.SetDisplayQuantity( (CFrameProfileSystem::EDisplayQuantity)(profValue-1) ); } else if (m_FrameProfileSystem.IsEnabled()) { // Turn off frame profiler. m_FrameProfileSystem.Enable(false,false); } } if (m_FrameProfileSystem.IsEnabled()) { static string sSysProfileFilter; if (stricmp(m_sys_profile_filter->GetString(),sSysProfileFilter.c_str()) != 0) { sSysProfileFilter = m_sys_profile_filter->GetString(); m_FrameProfileSystem.SetSubsystemFilter( sSysProfileFilter.c_str() ); } m_FrameProfileSystem.SetHistogramScale( m_sys_profile_graphScale->GetFVal() ); m_FrameProfileSystem.SetDrawGraph( m_sys_profile_graph->GetIVal() != 0 ); m_FrameProfileSystem.SetNetworkProfiler( m_sys_profile_network->GetIVal() != 0 ); m_FrameProfileSystem.SetPeakTolerance( m_sys_profile_peak->GetFVal() ); m_FrameProfileSystem.SetPageFaultsGraph( m_sys_profile_pagefaultsgraph->GetIVal() != 0 ); } static int memProfileValueOld = 0; int memProfileValue = m_sys_profile_memory->GetIVal(); if (memProfileValue != memProfileValueOld) { memProfileValueOld = memProfileValue; m_FrameProfileSystem.EnableMemoryProfile( memProfileValue!=0 ); } } ////////////////////////////////////////////////////////////////////// void CSystem::Render() { if (m_bIgnoreUpdates) return; //check what is the current process if (!m_pProcess) return; //should never happen //check if the game is in pause or //in menu mode //bool bPause=false; //if (m_pProcess->GetFlags() & PROC_MENU) // bPause=true; FUNCTION_PROFILER( this,PROFILE_SYSTEM ); ////////////////////////////////////////////////////////////////////// //draw if (m_pProcess && (m_pProcess->GetFlags() & PROC_3DENGINE)) { if (!IsEquivalent(m_ViewCamera.GetPos(),Vec3(0,0,0),VEC_EPSILON)) { if (m_pI3DEngine) m_pI3DEngine->SetCamera(m_ViewCamera); m_pProcess->Draw(); if (m_pAISystem) m_pAISystem->DebugDraw(g_pRenderer); } } else { if (m_pProcess) m_pProcess->Draw(); } ////////////////////////////////////////////////////////////////////// //draw physics helpers int id = m_pRenderer->GetFrameID(); if (m_pIPhysicalWorld) { g_pRenderer = GetIRenderer(); g_pRenderer->SetMaterialColor(0.5f,1.0f,0.9f,1.0f); m_pIPhysicalWorld->DrawPhysicsHelperInformation(g_DrawLine); if (m_pIPhysicalWorld->GetPhysVars()->bProfileEntities) { phys_profile_info *pInfos; int i,nEnts = m_pIPhysicalWorld->GetEntityProfileInfo(pInfos); float fColor[4] = { 0.3f,0.6f,1.0f,1.0f }; for(i=0;iDraw2dLabel( 10.0f,60.0f+i*12.0f, 1.0f, fColor,false, "%.2fms/%d %s (id %d)",CFrameProfilerTimer::TicksToSeconds(pInfos[i].nTicks)*1000.0f,pInfos[i].nCalls,pInfos[i].pName,pInfos[i].id ); } } // ProcessSleep() { #ifdef WIN32 WIN_HWND hRendWnd = GetIRenderer()->GetHWND(); if(!hRendWnd) return; static bool bSleep=0; WIN_HWND hActiveWnd = ::GetActiveWindow(); char sBuff[128]=""; GetWindowText( (HWND)hRendWnd,sBuff,128); if(hActiveWnd != hRendWnd && strncmp(sBuff,"- Far Cry -",11)==0) { #if !defined(LINUX) Sleep(50); #endif // if(!bSleep) // GetILog()->LogToConsole("Sleep ON"); bSleep = true; } else { // if(bSleep) // GetILog()->LogToConsole("Sleep OFF"); bSleep = false; } #endif } } ////////////////////////////////////////////////////////////////////////// void CSystem::RenderMemStats() { // check for the presence of the system if (!m_pConsole || !m_pRenderer || !m_cvMemStats->GetIVal()) { SAFE_DELETE(m_pMemStats); return; } TickMemStats(); assert (m_pMemStats); // render the statistics { CrySizerStatsRenderer StatsRenderer (this, m_pMemStats, m_cvMemStatsMaxDepth->GetIVal(), m_cvMemStatsThreshold->GetIVal()); StatsRenderer.render((m_pRenderer->GetFrameID()+2)%m_cvMemStats->GetIVal() <= 1); } } ////////////////////////////////////////////////////////////////////////// void CSystem::RenderStats() { if (!m_pConsole || !m_pI3DEngine) return; // Draw engine stats //ICVar * pDispInfoCVar = m_pConsole->GetCVar("r_DisplayInfo"); if (m_rDisplayInfo->GetIVal()) { // Draw 3dengine stats and get last text cursor position float nTextPosX=101-20, nTextPosY=-2, nTextStepY=3; m_pI3DEngine->DisplayInfo(nTextPosX, nTextPosY, nTextStepY); // Draw non 3dengine stats if (m_rDisplayInfo->GetIVal()==2) { size_t nSoundCurrMem,nSoundMaxMem; m_pRenderer->TextToScreen( nTextPosX-15, nTextPosY+=nTextStepY, "SysMem %.1f mb", float(DumpMMStats(NULL))/1024.f); if (m_pISound) { m_pISound->GetSoundMemoryUsageInfo(nSoundCurrMem,nSoundMaxMem); m_pRenderer->TextToScreen( nTextPosX-18, nTextPosY+=nTextStepY, "Sound %2.1f/%2.1f mb", (float)(nSoundCurrMem)/(1024.0f*1024.0f), (float)(nSoundMaxMem)/(1024.0f*1024.0f)); } } /* float fLogic=0, fRender=0, fSum=0; m_Time.GetBasicStats(fLogic, fRender, fSum); m_pRenderer->TextToScreen( nTextPosX-23, nTextPosY+=nTextStepY, "Think=%.1f Draw=%.1f ms", fLogic, fRender); */ m_Time.MeasureTime("3SysStats"); } }