Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1311 lines
39 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //
  7. //=============================================================================//
  8. #include "togl/rendermechanism.h"
  9. #include "hardwareconfig.h"
  10. #include "shaderapi/ishaderutil.h"
  11. #include "shaderapi_global.h"
  12. #include "materialsystem/materialsystem_config.h"
  13. #include "tier1/convar.h"
  14. #include "shaderdevicebase.h"
  15. #include "tier0/icommandline.h"
  16. //-----------------------------------------------------------------------------
  17. //
  18. // Hardware Config!
  19. //
  20. //-----------------------------------------------------------------------------
  21. static CHardwareConfig s_HardwareConfig;
  22. CHardwareConfig *g_pHardwareConfig = &s_HardwareConfig;
  23. EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CHardwareConfig, IMaterialSystemHardwareConfig,
  24. MATERIALSYSTEM_HARDWARECONFIG_INTERFACE_VERSION, s_HardwareConfig )
  25. template<typename T>
  26. static void ccs_create_convar_from_hwconfig( const T& val, const char *pName )
  27. {
  28. int nValue = static_cast<int>( val );
  29. ConVar *pConVar = g_pCVar->FindVar( pName );
  30. if ( pConVar )
  31. {
  32. pConVar->SetValue( nValue );
  33. }
  34. else
  35. {
  36. // Don't care if this leaks - this is only used for development
  37. pConVar = new ConVar( pName, "" );
  38. }
  39. if ( !nValue )
  40. pConVar->SetValue( "0" );
  41. else
  42. pConVar->SetValue( nValue );
  43. }
  44. static void ccs_create_convar_from_hwconfig( const char *pVal, const char *pName )
  45. {
  46. ConVar *pConVar = g_pCVar->FindVar( pName );
  47. if ( pConVar )
  48. {
  49. pConVar->SetValue( pVal );
  50. }
  51. else
  52. {
  53. // Don't care if this leaks - this is only used for development
  54. pConVar = new ConVar( pName, "" );
  55. }
  56. pConVar->SetValue( pVal );
  57. }
  58. CON_COMMAND_F( ccs_create_convars_from_hwconfig, "Create convars from the current hardware config, useful for diffing purposes", FCVAR_CHEAT )
  59. {
  60. if ( !g_pHardwareConfig )
  61. return;
  62. const HardwareCaps_t &caps = g_pHardwareConfig->CapsForEdit();
  63. #define HWCFG( Name ) ccs_create_convar_from_hwconfig( caps.Name, #Name )
  64. HWCFG( m_NumTextureStages );
  65. HWCFG( m_nMaxAnisotropy );
  66. HWCFG( m_MaxTextureWidth );
  67. HWCFG( m_MaxTextureHeight );
  68. HWCFG( m_MaxTextureDepth );
  69. HWCFG( m_MaxTextureAspectRatio );
  70. HWCFG( m_MaxPrimitiveCount );
  71. HWCFG( m_NumPixelShaderConstants );
  72. HWCFG( m_NumBooleanPixelShaderConstants );
  73. HWCFG( m_NumIntegerPixelShaderConstants );
  74. HWCFG( m_NumVertexShaderConstants );
  75. HWCFG( m_NumBooleanVertexShaderConstants );
  76. HWCFG( m_NumIntegerVertexShaderConstants );
  77. HWCFG( m_TextureMemorySize );
  78. HWCFG( m_MaxNumLights );
  79. HWCFG( m_MaxBlendMatrices );
  80. HWCFG( m_MaxBlendMatrixIndices );
  81. HWCFG( m_MaxVertexShaderBlendMatrices );
  82. HWCFG( m_MaxUserClipPlanes );
  83. HWCFG( m_HDRType );
  84. HWCFG( m_pShaderDLL );
  85. HWCFG( m_ShadowDepthTextureFormat );
  86. HWCFG( m_NullTextureFormat );
  87. HWCFG( m_nVertexTextureCount );
  88. HWCFG( m_nMaxVertexTextureDimension );
  89. HWCFG( m_AlphaToCoverageState );
  90. HWCFG( m_AlphaToCoverageEnableValue );
  91. HWCFG( m_AlphaToCoverageDisableValue );
  92. HWCFG( m_nMaxViewports );
  93. HWCFG( m_flMinGammaControlPoint );
  94. HWCFG( m_flMaxGammaControlPoint );
  95. HWCFG( m_nGammaControlPointCount );
  96. HWCFG( m_MaxVertexShader30InstructionSlots );
  97. HWCFG( m_MaxPixelShader30InstructionSlots );
  98. HWCFG( m_MaxSimultaneousRenderTargets );
  99. HWCFG( m_bDeviceOk );
  100. HWCFG( m_HasSetDeviceGammaRamp );
  101. HWCFG( m_SupportsVertexShaders );
  102. HWCFG( m_SupportsVertexShaders_2_0 );
  103. HWCFG( m_SupportsPixelShaders );
  104. HWCFG( m_SupportsPixelShaders_1_4 );
  105. HWCFG( m_SupportsPixelShaders_2_0 );
  106. HWCFG( m_SupportsPixelShaders_2_b );
  107. HWCFG( m_SupportsShaderModel_3_0 );
  108. HWCFG( m_bSupportsAnisotropicFiltering );
  109. HWCFG( m_bSupportsMagAnisotropicFiltering );
  110. HWCFG( m_bSupportsVertexTextures );
  111. HWCFG( m_ZBiasAndSlopeScaledDepthBiasSupported );
  112. HWCFG( m_SupportsMipmapping );
  113. HWCFG( m_SupportsOverbright );
  114. HWCFG( m_SupportsCubeMaps );
  115. HWCFG( m_SupportsHardwareLighting );
  116. HWCFG( m_SupportsMipmappedCubemaps );
  117. HWCFG( m_SupportsNonPow2Textures );
  118. HWCFG( m_PreferDynamicTextures );
  119. HWCFG( m_HasProjectedBumpEnv );
  120. HWCFG( m_SupportsSRGB );
  121. HWCFG( m_bSupportsSpheremapping );
  122. HWCFG( m_UseFastClipping );
  123. HWCFG( m_bNeedsATICentroidHack );
  124. HWCFG( m_bDisableShaderOptimizations );
  125. HWCFG( m_bColorOnSecondStream );
  126. HWCFG( m_bSupportsStreamOffset );
  127. HWCFG( m_bFogColorSpecifiedInLinearSpace );
  128. HWCFG( m_bFogColorAlwaysLinearSpace );
  129. HWCFG( m_bSupportsAlphaToCoverage );
  130. HWCFG( m_bSupportsShadowDepthTextures );
  131. HWCFG( m_bSupportsFetch4 );
  132. HWCFG( m_bSoftwareVertexProcessing );
  133. HWCFG( m_bScissorSupported );
  134. HWCFG( m_bSupportsFloat32RenderTargets );
  135. HWCFG( m_bSupportsBorderColor );
  136. HWCFG( m_bDX10Card );
  137. HWCFG( m_bDX10Blending );
  138. HWCFG( m_bSupportsStaticControlFlow );
  139. HWCFG( m_FakeSRGBWrite );
  140. HWCFG( m_CanDoSRGBReadFromRTs );
  141. HWCFG( m_bSupportsGLMixedSizeTargets );
  142. HWCFG( m_bCanStretchRectFromTextures );
  143. HWCFG( m_MaxHDRType );
  144. #undef HWCFG
  145. }
  146. CHardwareConfig::CHardwareConfig()
  147. {
  148. memset( &m_Caps, 0, sizeof( HardwareCaps_t ) );
  149. memset( &m_ActualCaps, 0, sizeof( HardwareCaps_t ) );
  150. memset( &m_UnOverriddenCaps, 0, sizeof( HardwareCaps_t ) );
  151. #ifdef POSIX
  152. GLMPRINTF((" CHardwareConfig::CHardwareConfig setting m_bHDREnabled to false on %8x", this ));
  153. #endif
  154. m_bHDREnabled = false;
  155. // FIXME: This is kind of a hack to deal with DX8 worldcraft startup.
  156. // We can at least have this much texture
  157. m_Caps.m_MaxTextureWidth = m_Caps.m_MaxTextureHeight = m_Caps.m_MaxTextureDepth = 256;
  158. }
  159. //-----------------------------------------------------------------------------
  160. bool CHardwareConfig::GetHDREnabled( void ) const
  161. {
  162. // printf("\n CHardwareConfig::GetHDREnabled returning m_bHDREnabled value of %s on %8x", m_bHDREnabled?"true":"false", this );
  163. return m_bHDREnabled;
  164. }
  165. void CHardwareConfig::SetHDREnabled( bool bEnable )
  166. {
  167. // printf("\n CHardwareConfig::SetHDREnabled setting m_bHDREnabled to value of %s on %8x", bEnable?"true":"false", this );
  168. m_bHDREnabled = bEnable;
  169. }
  170. //-----------------------------------------------------------------------------
  171. // Gets the recommended configuration associated with a particular dx level
  172. //-----------------------------------------------------------------------------
  173. void CHardwareConfig::ForceCapsToDXLevel( HardwareCaps_t *pCaps, int nDxLevel, const HardwareCaps_t &actualCaps )
  174. {
  175. if ( !IsPC() || nDxLevel >= 100 )
  176. return;
  177. pCaps->m_nDXSupportLevel = nDxLevel;
  178. switch( nDxLevel )
  179. {
  180. case 60:
  181. // NOTE: Prior to dx9, numsamplers = num texture stages
  182. pCaps->m_NumTextureStages = min( 2, actualCaps.m_NumTextureStages );
  183. pCaps->m_NumSamplers = pCaps->m_NumTextureStages;
  184. pCaps->m_SupportsVertexShaders = false;
  185. pCaps->m_SupportsVertexShaders_2_0 = false;
  186. pCaps->m_SupportsPixelShaders = false;
  187. pCaps->m_SupportsPixelShaders_1_4 = false;
  188. pCaps->m_SupportsPixelShaders_2_0 = false;
  189. pCaps->m_SupportsPixelShaders_2_b = false;
  190. pCaps->m_SupportsShaderModel_3_0 = false;
  191. pCaps->m_bSupportsStaticControlFlow = false;
  192. pCaps->m_SupportsCompressedTextures = COMPRESSED_TEXTURES_OFF;
  193. pCaps->m_SupportsCompressedVertices = VERTEX_COMPRESSION_NONE;
  194. pCaps->m_bSupportsAnisotropicFiltering = false;
  195. pCaps->m_bSupportsMagAnisotropicFiltering = false;
  196. pCaps->m_nMaxAnisotropy = 1;
  197. pCaps->m_MaxTextureWidth = max( 256, pCaps->m_MaxTextureWidth );
  198. pCaps->m_MaxTextureHeight = max( 256, pCaps->m_MaxTextureHeight );
  199. pCaps->m_MaxTextureDepth = max( 256, pCaps->m_MaxTextureDepth );
  200. // m_MaxTextureAspectRatio;
  201. // int m_MaxPrimitiveCount;
  202. pCaps->m_ZBiasAndSlopeScaledDepthBiasSupported = false;
  203. // pCaps->m_SupportsMipmapping =
  204. // bool m_SupportsOverbright;
  205. pCaps->m_SupportsCubeMaps = false;
  206. pCaps->m_NumPixelShaderConstants = 0;
  207. pCaps->m_NumBooleanPixelShaderConstants = 0;
  208. pCaps->m_NumIntegerPixelShaderConstants = 0;
  209. pCaps->m_NumVertexShaderConstants = 0;
  210. pCaps->m_NumBooleanVertexShaderConstants = 0;
  211. pCaps->m_NumIntegerVertexShaderConstants = 0;
  212. pCaps->m_NumBooleanPixelShaderConstants = 0;
  213. pCaps->m_NumIntegerPixelShaderConstants = 0;
  214. pCaps->m_TextureMemorySize = 32 * 1024 * 1024;
  215. pCaps->m_MaxNumLights = 0;
  216. pCaps->m_SupportsHardwareLighting = 0;
  217. pCaps->m_MaxBlendMatrices = 0;
  218. pCaps->m_MaxBlendMatrixIndices = 0;
  219. pCaps->m_MaxVertexShaderBlendMatrices = 0;
  220. pCaps->m_SupportsMipmappedCubemaps = false;
  221. pCaps->m_SupportsNonPow2Textures = false;
  222. // pCaps->m_DXSupportLevel = 60;
  223. pCaps->m_PreferDynamicTextures = false;
  224. pCaps->m_HasProjectedBumpEnv = false;
  225. pCaps->m_MaxUserClipPlanes = 0;
  226. pCaps->m_SupportsSRGB = false;
  227. pCaps->m_FakeSRGBWrite = false;
  228. pCaps->m_CanDoSRGBReadFromRTs = true;
  229. pCaps->m_bSupportsGLMixedSizeTargets = false;
  230. pCaps->m_HDRType = HDR_TYPE_NONE;
  231. // pCaps->m_bSupportsSpheremapping = true;
  232. pCaps->m_UseFastClipping = true;
  233. pCaps->m_bNeedsATICentroidHack = false;
  234. pCaps->m_bColorOnSecondStream = false;
  235. pCaps->m_bSupportsStreamOffset = false;
  236. pCaps->m_bFogColorSpecifiedInLinearSpace = false;
  237. pCaps->m_bFogColorAlwaysLinearSpace = false;
  238. pCaps->m_bSupportsAlphaToCoverage = false;
  239. pCaps->m_bSupportsShadowDepthTextures = false;
  240. pCaps->m_bSupportsFetch4 = false;
  241. pCaps->m_bSupportsBorderColor = false;
  242. // m_bSoftwareVertexProcessing
  243. pCaps->m_nVertexTextureCount = 0;
  244. pCaps->m_nMaxVertexTextureDimension = 0;
  245. pCaps->m_bSupportsVertexTextures = false;
  246. pCaps->m_nMaxViewports = 1;
  247. // m_bScissorSupported
  248. pCaps->m_bSupportsFloat32RenderTargets = false;
  249. // ImageFormat m_ShadowDepthTextureFormat;
  250. // ImageFormat m_NullTextureFormat;
  251. // m_AlphaToCoverageState;
  252. // m_AlphaToCoverageEnableValue;
  253. // m_AlphaToCoverageDisableValue;
  254. // m_flMinGammaControlPoint
  255. // m_flMaxGammaControlPoint
  256. // m_nGammaControlPointCount
  257. pCaps->m_MaxVertexShader30InstructionSlots = 0;
  258. pCaps->m_MaxPixelShader30InstructionSlots = 0;
  259. pCaps->m_bCanStretchRectFromTextures = false;
  260. break;
  261. case 70:
  262. // NOTE: Prior to dx9, numsamplers = num texture stages
  263. pCaps->m_NumTextureStages = min( 2, actualCaps.m_NumTextureStages );
  264. pCaps->m_NumSamplers = pCaps->m_NumTextureStages;
  265. pCaps->m_SupportsVertexShaders = false;
  266. pCaps->m_SupportsVertexShaders_2_0 = false;
  267. pCaps->m_SupportsPixelShaders = false;
  268. pCaps->m_SupportsPixelShaders_1_4 = false;
  269. pCaps->m_SupportsPixelShaders_2_0 = false;
  270. pCaps->m_SupportsPixelShaders_2_b = false;
  271. pCaps->m_SupportsShaderModel_3_0 = false;
  272. pCaps->m_bSupportsStaticControlFlow = false;
  273. // pCaps->m_SupportsCompressedTextures = true;
  274. pCaps->m_SupportsCompressedVertices = VERTEX_COMPRESSION_NONE;
  275. pCaps->m_bSupportsAnisotropicFiltering = false;
  276. pCaps->m_bSupportsMagAnisotropicFiltering = false;
  277. pCaps->m_nMaxAnisotropy = 1;
  278. // pCaps->m_MaxTextureWidth = max( 256, pCaps->m_MaxTextureWidth );
  279. // pCaps->m_MaxTextureHeight = max( 256, pCaps->m_MaxTextureHeight );
  280. // pCaps->m_MaxTextureDepth = max( 256, pCaps->m_MaxTextureDepth );
  281. // m_MaxTextureAspectRatio;
  282. // int m_MaxPrimitiveCount;
  283. pCaps->m_ZBiasAndSlopeScaledDepthBiasSupported = false;
  284. // pCaps->m_SupportsMipmapping =
  285. // bool m_SupportsOverbright;
  286. // pCaps->m_SupportsCubeMaps = false;
  287. pCaps->m_NumPixelShaderConstants = 0;
  288. pCaps->m_NumBooleanPixelShaderConstants = 0;
  289. pCaps->m_NumIntegerPixelShaderConstants = 0;
  290. pCaps->m_NumBooleanPixelShaderConstants = 0;
  291. pCaps->m_NumIntegerPixelShaderConstants = 0;
  292. pCaps->m_NumVertexShaderConstants = 0;
  293. pCaps->m_NumBooleanVertexShaderConstants = 0;
  294. pCaps->m_NumIntegerVertexShaderConstants = 0;
  295. pCaps->m_TextureMemorySize = 32 * 1024 * 1024;
  296. pCaps->m_MaxNumLights = 2;
  297. pCaps->m_SupportsHardwareLighting = 1;
  298. pCaps->m_MaxBlendMatrices = 0;
  299. pCaps->m_MaxBlendMatrixIndices = 0;
  300. pCaps->m_MaxVertexShaderBlendMatrices = 0;
  301. pCaps->m_SupportsMipmappedCubemaps = false;
  302. pCaps->m_SupportsNonPow2Textures = false;
  303. pCaps->m_nDXSupportLevel = 70;
  304. pCaps->m_PreferDynamicTextures = false;
  305. pCaps->m_HasProjectedBumpEnv = false;
  306. pCaps->m_MaxUserClipPlanes = 0;
  307. pCaps->m_SupportsSRGB = false;
  308. pCaps->m_FakeSRGBWrite = false;
  309. pCaps->m_CanDoSRGBReadFromRTs = true;
  310. pCaps->m_bSupportsGLMixedSizeTargets = false;
  311. pCaps->m_HDRType = HDR_TYPE_NONE;
  312. // pCaps->m_bSupportsSpheremapping = true;
  313. pCaps->m_UseFastClipping = true;
  314. pCaps->m_bNeedsATICentroidHack = false;
  315. // pCaps->m_bColorOnSecondStream = false; // dont' force this!
  316. pCaps->m_bSupportsStreamOffset = false;
  317. pCaps->m_bFogColorSpecifiedInLinearSpace = false;
  318. pCaps->m_bFogColorAlwaysLinearSpace = false;
  319. pCaps->m_bSupportsAlphaToCoverage = false;
  320. pCaps->m_bSupportsShadowDepthTextures = false;
  321. pCaps->m_bSupportsFetch4 = false;
  322. pCaps->m_bSupportsBorderColor = false;
  323. // m_bSoftwareVertexProcessing
  324. pCaps->m_nVertexTextureCount = 0;
  325. pCaps->m_nMaxVertexTextureDimension = 0;
  326. pCaps->m_bSupportsVertexTextures = false;
  327. pCaps->m_nMaxViewports = 1;
  328. // m_bScissorSupported
  329. pCaps->m_bSupportsFloat32RenderTargets = false;
  330. pCaps->m_bDX10Card = false;
  331. pCaps->m_bDX10Blending = false;
  332. pCaps->m_bCanStretchRectFromTextures = false;
  333. break;
  334. case 80:
  335. // NOTE: Prior to dx9, numsamplers = num texture stages
  336. // We clamp num texture stages to 2, though, since we never use
  337. // fixed-function shaders with more than 2 texture stages
  338. pCaps->m_NumTextureStages = min( 2, actualCaps.m_NumTextureStages );
  339. pCaps->m_NumSamplers = min( 4, actualCaps.m_NumTextureStages );
  340. // pCaps->m_SupportsVertexShaders = true;
  341. pCaps->m_SupportsVertexShaders_2_0 = false;
  342. // pCaps->m_SupportsPixelShaders = false;
  343. pCaps->m_SupportsPixelShaders_1_4 = false;
  344. pCaps->m_SupportsPixelShaders_2_0 = false;
  345. pCaps->m_SupportsPixelShaders_2_b = false;
  346. pCaps->m_SupportsShaderModel_3_0 = false;
  347. pCaps->m_bSupportsStaticControlFlow = false;
  348. // pCaps->m_SupportsCompressedTextures = true;
  349. pCaps->m_SupportsCompressedVertices = VERTEX_COMPRESSION_NONE;
  350. // pCaps->m_bSupportsAnisotropicFiltering = false;
  351. // pCaps->m_bSupportsMagAnisotropicFiltering = false;
  352. // pCaps->m_nMaxAnisotropy = 1;
  353. // pCaps->m_MaxTextureWidth = max( 256, pCaps->m_MaxTextureWidth );
  354. // pCaps->m_MaxTextureHeight = max( 256, pCaps->m_MaxTextureHeight );
  355. // pCaps->m_MaxTextureDepth = max( 256, pCaps->m_MaxTextureDepth );
  356. // m_MaxTextureAspectRatio;
  357. // int m_MaxPrimitiveCount;
  358. // pCaps->m_ZBiasAndSlopeScaledDepthBiasSupported = false;
  359. // pCaps->m_SupportsMipmapping =
  360. // bool m_SupportsOverbright;
  361. // pCaps->m_SupportsCubeMaps = false;
  362. pCaps->m_NumPixelShaderConstants = 8;
  363. pCaps->m_NumVertexShaderConstants = min( 96, pCaps->m_NumVertexShaderConstants );
  364. pCaps->m_NumBooleanVertexShaderConstants = 0;
  365. pCaps->m_NumIntegerVertexShaderConstants = 0;
  366. pCaps->m_NumBooleanPixelShaderConstants = 0;
  367. pCaps->m_NumIntegerPixelShaderConstants = 0;
  368. // pCaps->m_TextureMemorySize = 32 * 1024 * 1024;
  369. // pCaps->m_MaxNumLights = 0;
  370. // pCaps->m_SupportsHardwareLighting = 0;
  371. // pCaps->m_MaxBlendMatrices = 0;
  372. // pCaps->m_MaxBlendMatrixIndices = 0;
  373. pCaps->m_MaxVertexShaderBlendMatrices = min( 16, pCaps->m_MaxVertexShaderBlendMatrices );
  374. // pCaps->m_SupportsMipmappedCubemaps = false;
  375. // pCaps->m_SupportsNonPow2Textures = false;
  376. pCaps->m_nDXSupportLevel = 80;
  377. // pCaps->m_PreferDynamicTextures = false;
  378. // pCaps->m_HasProjectedBumpEnv = false;
  379. // pCaps->m_MaxUserClipPlanes = 0;
  380. pCaps->m_bSupportsGLMixedSizeTargets = false;
  381. pCaps->m_HDRType = HDR_TYPE_NONE;
  382. // pCaps->m_bSupportsSpheremapping = true;
  383. // pCaps->m_UseFastClipping = true;
  384. // pCaps->m_bNeedsATICentroidHack = false;
  385. // pCaps->m_bColorOnSecondStream = false;
  386. pCaps->m_bSupportsStreamOffset = false;
  387. pCaps->m_bFogColorSpecifiedInLinearSpace = false;
  388. pCaps->m_bFogColorAlwaysLinearSpace = false;
  389. pCaps->m_bSupportsAlphaToCoverage = false;
  390. pCaps->m_bSupportsShadowDepthTextures = false;
  391. pCaps->m_bSupportsFetch4 = false;
  392. // m_bSoftwareVertexProcessing
  393. pCaps->m_nVertexTextureCount = 0;
  394. pCaps->m_nMaxVertexTextureDimension = 0;
  395. pCaps->m_bSupportsVertexTextures = false;
  396. pCaps->m_MaxNumLights = 2;
  397. pCaps->m_nMaxViewports = 1;
  398. // m_bScissorSupported
  399. pCaps->m_SupportsSRGB = false;
  400. pCaps->m_FakeSRGBWrite = false;
  401. pCaps->m_CanDoSRGBReadFromRTs = true;
  402. pCaps->m_bSupportsGLMixedSizeTargets = false;
  403. pCaps->m_bSupportsFetch4 = false;
  404. pCaps->m_bSupportsBorderColor = false;
  405. pCaps->m_bSupportsFloat32RenderTargets = false;
  406. // ImageFormat m_ShadowDepthTextureFormat;
  407. // ImageFormat m_NullTextureFormat;
  408. // m_AlphaToCoverageState;
  409. // m_AlphaToCoverageEnableValue;
  410. // m_AlphaToCoverageDisableValue;
  411. // m_flMinGammaControlPoint
  412. // m_flMaxGammaControlPoint
  413. // m_nGammaControlPointCount
  414. pCaps->m_MaxVertexShader30InstructionSlots = 0;
  415. pCaps->m_MaxPixelShader30InstructionSlots = 0;
  416. pCaps->m_bDX10Card = false;
  417. pCaps->m_bDX10Blending = false;
  418. pCaps->m_bCanStretchRectFromTextures = false;
  419. break;
  420. case 81:
  421. // NOTE: Prior to dx9, numsamplers = num texture stages
  422. // We clamp num texture stages to 2, though, since we never use
  423. // fixed-function shaders with more than 2 texture stages
  424. pCaps->m_NumTextureStages = min( 2, actualCaps.m_NumTextureStages );
  425. pCaps->m_NumSamplers = min( 6, actualCaps.m_NumTextureStages );
  426. // pCaps->m_SupportsVertexShaders = true;
  427. pCaps->m_SupportsVertexShaders_2_0 = false;
  428. // pCaps->m_SupportsPixelShaders = false;
  429. pCaps->m_SupportsPixelShaders_1_4 = true;
  430. pCaps->m_SupportsPixelShaders_2_0 = false;
  431. pCaps->m_SupportsPixelShaders_2_b = false;
  432. pCaps->m_SupportsShaderModel_3_0 = false;
  433. pCaps->m_bSupportsStaticControlFlow = false;
  434. // pCaps->m_SupportsCompressedTextures = true;
  435. pCaps->m_SupportsCompressedVertices = VERTEX_COMPRESSION_NONE;
  436. // pCaps->m_bSupportsAnisotropicFiltering = false;
  437. // pCaps->m_bSupportsMagAnisotropicFiltering = false;
  438. // pCaps->m_nMaxAnisotropy = 1;
  439. // pCaps->m_MaxTextureWidth = max( 256, pCaps->m_MaxTextureWidth );
  440. // pCaps->m_MaxTextureHeight = max( 256, pCaps->m_MaxTextureHeight );
  441. // pCaps->m_MaxTextureDepth = max( 256, pCaps->m_MaxTextureDepth );
  442. // m_MaxTextureAspectRatio;
  443. // int m_MaxPrimitiveCount;
  444. // pCaps->m_ZBiasAndSlopeScaledDepthBiasSupported = false;
  445. // pCaps->m_SupportsMipmapping =
  446. // bool m_SupportsOverbright;
  447. // pCaps->m_SupportsCubeMaps = false;
  448. pCaps->m_NumPixelShaderConstants = 8;
  449. pCaps->m_NumVertexShaderConstants = min( 96, pCaps->m_NumVertexShaderConstants );
  450. pCaps->m_NumBooleanVertexShaderConstants = 0;
  451. pCaps->m_NumIntegerVertexShaderConstants = 0;
  452. pCaps->m_NumBooleanPixelShaderConstants = 0;
  453. pCaps->m_NumIntegerPixelShaderConstants = 0;
  454. // pCaps->m_TextureMemorySize = 32 * 1024 * 1024;
  455. pCaps->m_MaxNumLights = 2;
  456. // pCaps->m_SupportsHardwareLighting = 0;
  457. // pCaps->m_MaxBlendMatrices = 0;
  458. // pCaps->m_MaxBlendMatrixIndices = 0;
  459. pCaps->m_MaxVertexShaderBlendMatrices = min( 16, pCaps->m_MaxVertexShaderBlendMatrices );
  460. // pCaps->m_SupportsMipmappedCubemaps = false;
  461. // pCaps->m_SupportsNonPow2Textures = false;
  462. pCaps->m_nDXSupportLevel = 81;
  463. // pCaps->m_PreferDynamicTextures = false;
  464. // pCaps->m_HasProjectedBumpEnv = false;
  465. // pCaps->m_MaxUserClipPlanes = 0;
  466. pCaps->m_SupportsSRGB = false;
  467. pCaps->m_FakeSRGBWrite = false;
  468. pCaps->m_CanDoSRGBReadFromRTs = true;
  469. pCaps->m_bSupportsGLMixedSizeTargets = false;
  470. pCaps->m_HDRType = HDR_TYPE_NONE;
  471. // pCaps->m_bSupportsSpheremapping = true;
  472. // pCaps->m_UseFastClipping = true;
  473. // pCaps->m_bNeedsATICentroidHack = false;
  474. // pCaps->m_bColorOnSecondStream = false;
  475. pCaps->m_bSupportsStreamOffset = false;
  476. pCaps->m_bFogColorSpecifiedInLinearSpace = false;
  477. pCaps->m_bFogColorAlwaysLinearSpace = false;
  478. pCaps->m_bSupportsAlphaToCoverage = false;
  479. pCaps->m_bSupportsShadowDepthTextures = false;
  480. pCaps->m_bSupportsFetch4 = false;
  481. pCaps->m_bSupportsBorderColor = false;
  482. // m_bSoftwareVertexProcessing
  483. pCaps->m_nVertexTextureCount = 0;
  484. pCaps->m_nMaxVertexTextureDimension = 0;
  485. pCaps->m_bSupportsVertexTextures = false;
  486. pCaps->m_nMaxViewports = 1;
  487. // m_bScissorSupported
  488. pCaps->m_bSupportsFloat32RenderTargets = false;
  489. // ImageFormat m_ShadowDepthTextureFormat;
  490. // ImageFormat m_NullTextureFormat;
  491. // m_AlphaToCoverageState;
  492. // m_AlphaToCoverageEnableValue;
  493. // m_AlphaToCoverageDisableValue;
  494. // m_flMinGammaControlPoint
  495. // m_flMaxGammaControlPoint
  496. // m_nGammaControlPointCount
  497. pCaps->m_MaxVertexShader30InstructionSlots = 0;
  498. pCaps->m_MaxPixelShader30InstructionSlots = 0;
  499. pCaps->m_bDX10Card = false;
  500. pCaps->m_bDX10Blending = false;
  501. pCaps->m_bCanStretchRectFromTextures = false;
  502. break;
  503. case 90:
  504. pCaps->m_nVertexTextureCount = 0;
  505. pCaps->m_nMaxVertexTextureDimension = 0;
  506. pCaps->m_bSupportsVertexTextures = false;
  507. pCaps->m_bSupportsStreamOffset = true;
  508. pCaps->m_bSupportsGLMixedSizeTargets = true;
  509. if ( IsOpenGL() )
  510. {
  511. //FIXME this is way too complicated, we should just check the caps bit from GLM
  512. pCaps->m_bSupportsStaticControlFlow = false;
  513. if (1) //(CommandLine()->FindParm("-glslmode"))
  514. {
  515. // rbarris 03Feb10: this is now hardwired because we are defaulting GLSL mode "on".
  516. // so this will mean that the engine will always ask for user clip planes.
  517. // this will misbehave under ARB mode, since ARB shaders won't respect that state.
  518. // it's difficult to make this fluid without teaching the engine about a cap that could change during run.
  519. pCaps->m_MaxUserClipPlanes = 2;
  520. pCaps->m_UseFastClipping = false;
  521. }
  522. else
  523. {
  524. pCaps->m_MaxUserClipPlanes = 0;
  525. pCaps->m_UseFastClipping = true;
  526. }
  527. pCaps->m_MaxNumLights = 2;
  528. }
  529. else
  530. {
  531. pCaps->m_bSupportsStaticControlFlow = true;
  532. pCaps->m_MaxNumLights = pCaps->m_SupportsPixelShaders_2_b ? 4 : 2; // 2b gets four lights, 2.0 gets two...
  533. }
  534. pCaps->m_bSupportsBorderColor = false;
  535. pCaps->m_nMaxViewports = 1;
  536. pCaps->m_NumPixelShaderConstants = 32;
  537. pCaps->m_nMaxVertexTextureDimension = 0;
  538. pCaps->m_MaxVertexShader30InstructionSlots = 0;
  539. pCaps->m_MaxPixelShader30InstructionSlots = 0;
  540. pCaps->m_bCanStretchRectFromTextures = false;
  541. break;
  542. case 92:
  543. pCaps->m_nVertexTextureCount = 0;
  544. pCaps->m_nMaxVertexTextureDimension = 0;
  545. pCaps->m_bSupportsVertexTextures = false;
  546. pCaps->m_bSupportsBorderColor = false;
  547. // 2b gets four lights, 2.0 gets two...
  548. pCaps->m_SupportsShaderModel_3_0 = false;
  549. if ( IsOpenGL() )
  550. {
  551. if ( IsOSX() )
  552. {
  553. pCaps->m_bSupportsStaticControlFlow = CommandLine()->CheckParm( "-glslcontrolflow" ) != NULL;
  554. }
  555. else
  556. {
  557. pCaps->m_bSupportsStaticControlFlow = !CommandLine()->CheckParm( "-noglslcontrolflow" );
  558. }
  559. pCaps->m_MaxUserClipPlanes = 2;
  560. pCaps->m_UseFastClipping = false;
  561. pCaps->m_MaxNumLights = pCaps->m_bSupportsStaticControlFlow ? MAX_NUM_LIGHTS : ( MAX_NUM_LIGHTS - 2 );
  562. }
  563. else
  564. {
  565. pCaps->m_MaxNumLights = MAX_NUM_LIGHTS;
  566. }
  567. pCaps->m_nMaxViewports = 1;
  568. pCaps->m_NumPixelShaderConstants = 32;
  569. pCaps->m_nMaxVertexTextureDimension = 0;
  570. pCaps->m_bDX10Card = false;
  571. pCaps->m_bDX10Blending = false;
  572. pCaps->m_MaxVertexShader30InstructionSlots = 0;
  573. pCaps->m_MaxPixelShader30InstructionSlots = 0;
  574. pCaps->m_bCanStretchRectFromTextures = false;
  575. break;
  576. case 95:
  577. pCaps->m_bSupportsStreamOffset = true;
  578. pCaps->m_bSupportsStaticControlFlow = true;
  579. pCaps->m_bDX10Card = false;
  580. pCaps->m_bDX10Blending = false;
  581. pCaps->m_MaxNumLights = MAX_NUM_LIGHTS;
  582. pCaps->m_nMaxViewports = 1;
  583. pCaps->m_bSupportsBorderColor = false;
  584. pCaps->m_bCanStretchRectFromTextures = false;
  585. break;
  586. case 100:
  587. break;
  588. default:
  589. Assert( 0 );
  590. break;
  591. }
  592. }
  593. //-----------------------------------------------------------------------------
  594. // Sets up the hardware caps given the specified DX level
  595. //-----------------------------------------------------------------------------
  596. void CHardwareConfig::SetupHardwareCaps( int nDXLevel, const HardwareCaps_t &actualCaps )
  597. {
  598. Assert( nDXLevel != 0 );
  599. memcpy( &m_Caps, &actualCaps, sizeof(HardwareCaps_t) );
  600. memcpy( &m_UnOverriddenCaps, &actualCaps, sizeof(HardwareCaps_t) );
  601. // Don't bother with fallbacks for DX10 or consoles
  602. #ifdef DX_TO_GL_ABSTRACTION
  603. if ( nDXLevel >= 100 )
  604. #else
  605. if ( !( IsPC() || IsPosix() ) || ( nDXLevel >= 100 ) )
  606. #endif
  607. return;
  608. // Slam the support level to what we were requested
  609. m_Caps.m_nDXSupportLevel = nDXLevel;
  610. if ( m_Caps.m_nDXSupportLevel != m_Caps.m_nMaxDXSupportLevel || CommandLine()->ParmValue( "-maxdxlevel", 0 ) > 0 )
  611. {
  612. // We're falling back to some other dx level
  613. ForceCapsToDXLevel( &m_Caps, m_Caps.m_nDXSupportLevel, m_ActualCaps );
  614. }
  615. // Clamp num texture stages to 2, since it's only used for fixed function
  616. m_Caps.m_NumTextureStages = min( 2, m_Caps.m_NumTextureStages );
  617. // Read dxsupport.cfg which has config overrides for particular cards.
  618. g_pShaderDeviceMgr->ReadHardwareCaps( m_Caps, m_Caps.m_nDXSupportLevel );
  619. // This is the spot to validate read in caps versus actual caps.
  620. if ( m_Caps.m_MaxUserClipPlanes > m_ActualCaps.m_MaxUserClipPlanes )
  621. {
  622. m_Caps.m_MaxUserClipPlanes = m_ActualCaps.m_MaxUserClipPlanes;
  623. }
  624. if ( m_Caps.m_MaxUserClipPlanes == 0 )
  625. {
  626. m_Caps.m_UseFastClipping = true;
  627. }
  628. if ( IsOpenGL() )
  629. {
  630. m_Caps.m_MaxNumLights = MIN( m_Caps.m_MaxNumLights, ( m_Caps.m_bSupportsStaticControlFlow && m_Caps.m_SupportsPixelShaders_2_b ) ? MAX_NUM_LIGHTS : ( MAX_NUM_LIGHTS - 2 ) );
  631. m_Caps.m_bSupportsShadowDepthTextures = true;
  632. }
  633. else // not POSIX or emulated
  634. {
  635. // 2b supports more lights than just 2.0
  636. if ( m_Caps.m_SupportsPixelShaders_2_b )
  637. {
  638. m_Caps.m_MaxNumLights = MIN( m_Caps.m_MaxNumLights, MAX_NUM_LIGHTS );
  639. }
  640. else
  641. {
  642. m_Caps.m_MaxNumLights = MIN( m_Caps.m_MaxNumLights, MAX_NUM_LIGHTS - 2 );
  643. }
  644. }
  645. m_Caps.m_MaxNumLights = min( m_Caps.m_MaxNumLights, (int)MAX_NUM_LIGHTS );
  646. memcpy( &m_UnOverriddenCaps, &m_Caps, sizeof(HardwareCaps_t) );
  647. }
  648. //-----------------------------------------------------------------------------
  649. // Sets up the hardware caps given the specified DX level
  650. //-----------------------------------------------------------------------------
  651. void CHardwareConfig::SetupHardwareCaps( const ShaderDeviceInfo_t& mode, const HardwareCaps_t &actualCaps )
  652. {
  653. memcpy( &m_ActualCaps, &actualCaps, sizeof(HardwareCaps_t) );
  654. SetupHardwareCaps( mode.m_nDXLevel, actualCaps );
  655. }
  656. void CHardwareConfig::OverrideStreamOffsetSupport( bool bOverrideEnabled, bool bEnableSupport )
  657. {
  658. if ( bOverrideEnabled )
  659. {
  660. m_Caps.m_bSupportsStreamOffset = bEnableSupport;
  661. if ( !m_ActualCaps.m_bSupportsStreamOffset )
  662. {
  663. m_Caps.m_bSupportsStreamOffset = false;
  664. }
  665. }
  666. else
  667. {
  668. // Go back to default
  669. m_Caps.m_bSupportsStreamOffset = m_UnOverriddenCaps.m_bSupportsStreamOffset;
  670. }
  671. }
  672. //-----------------------------------------------------------------------------
  673. // Implementation of IMaterialSystemHardwareConfig
  674. //-----------------------------------------------------------------------------
  675. bool CHardwareConfig::HasDestAlphaBuffer() const
  676. {
  677. if ( !g_pShaderDevice )
  678. return false;
  679. return (g_pShaderDevice->GetBackBufferFormat() == IMAGE_FORMAT_BGRA8888);
  680. }
  681. bool CHardwareConfig::HasStencilBuffer() const
  682. {
  683. return StencilBufferBits() > 0;
  684. }
  685. int CHardwareConfig::GetFrameBufferColorDepth() const
  686. {
  687. if ( !g_pShaderDevice )
  688. return 0;
  689. return ShaderUtil()->ImageFormatInfo( g_pShaderDevice->GetBackBufferFormat() ).m_NumBytes;
  690. }
  691. int CHardwareConfig::GetSamplerCount() const
  692. {
  693. return m_Caps.m_NumSamplers;
  694. }
  695. bool CHardwareConfig::HasSetDeviceGammaRamp() const
  696. {
  697. return m_Caps.m_HasSetDeviceGammaRamp;
  698. }
  699. bool CHardwareConfig::SupportsCompressedTextures() const
  700. {
  701. Assert( m_Caps.m_SupportsCompressedTextures != COMPRESSED_TEXTURES_NOT_INITIALIZED );
  702. return m_Caps.m_SupportsCompressedTextures == COMPRESSED_TEXTURES_ON;
  703. }
  704. VertexCompressionType_t CHardwareConfig::SupportsCompressedVertices() const
  705. {
  706. return m_Caps.m_SupportsCompressedVertices;
  707. }
  708. bool CHardwareConfig::SupportsBorderColor() const
  709. {
  710. return m_Caps.m_bSupportsBorderColor;
  711. }
  712. bool CHardwareConfig::SupportsFetch4() const
  713. {
  714. return m_Caps.m_bSupportsFetch4;
  715. }
  716. bool CHardwareConfig::CanStretchRectFromTextures() const
  717. {
  718. return m_Caps.m_bCanStretchRectFromTextures;
  719. }
  720. bool CHardwareConfig::SupportsVertexAndPixelShaders() const
  721. {
  722. if ( (ShaderUtil()->GetConfig().dxSupportLevel != 0) && (GetDXSupportLevel() < 80) )
  723. return false;
  724. return m_Caps.m_SupportsPixelShaders;
  725. }
  726. bool CHardwareConfig::SupportsPixelShaders_1_4() const
  727. {
  728. if ( (ShaderUtil()->GetConfig().dxSupportLevel != 0) && (GetDXSupportLevel() < 81) )
  729. return false;
  730. return m_Caps.m_SupportsPixelShaders_1_4;
  731. }
  732. bool CHardwareConfig::SupportsPixelShaders_2_0() const
  733. {
  734. if ( (ShaderUtil()->GetConfig().dxSupportLevel != 0) && (GetDXSupportLevel() < 90) )
  735. return false;
  736. return m_Caps.m_SupportsPixelShaders_2_0;
  737. }
  738. bool CHardwareConfig::SupportsPixelShaders_2_b() const
  739. {
  740. if ((ShaderUtil()->GetConfig().dxSupportLevel != 0) &&
  741. (GetDXSupportLevel() < 90))
  742. return false;
  743. return m_Caps.m_SupportsPixelShaders_2_b;
  744. }
  745. bool CHardwareConfig::SupportsVertexShaders_2_0() const
  746. {
  747. if ((ShaderUtil()->GetConfig().dxSupportLevel != 0) &&
  748. (GetDXSupportLevel() < 90))
  749. return false;
  750. return m_Caps.m_SupportsVertexShaders_2_0;
  751. }
  752. bool CHardwareConfig::SupportsStaticControlFlow() const
  753. {
  754. return m_Caps.m_bSupportsStaticControlFlow;
  755. }
  756. bool CHardwareConfig::SupportsShaderModel_3_0() const
  757. {
  758. if ((ShaderUtil()->GetConfig().dxSupportLevel != 0) &&
  759. (GetDXSupportLevel() < 95))
  760. return false;
  761. return m_Caps.m_SupportsShaderModel_3_0;
  762. }
  763. // If you change these, make the corresponding change in common_ps_fxc.h
  764. #define NVIDIA_PCF_POISSON 0
  765. #define ATI_NOPCF 1
  766. #define ATI_NO_PCF_FETCH4 2
  767. int CHardwareConfig::GetShadowFilterMode() const
  768. {
  769. #ifdef DX_TO_GL_ABSTRACTION
  770. if ( !m_Caps.m_bSupportsShadowDepthTextures )
  771. return 0;
  772. #else
  773. if ( !m_Caps.m_bSupportsShadowDepthTextures || !ShaderUtil()->GetConfig().ShadowDepthTexture() )
  774. return 0;
  775. #endif
  776. switch ( m_Caps.m_ShadowDepthTextureFormat )
  777. {
  778. case IMAGE_FORMAT_NV_DST16:
  779. case IMAGE_FORMAT_NV_DST24:
  780. return NVIDIA_PCF_POISSON; // NVIDIA hardware bilinear PCF
  781. case IMAGE_FORMAT_ATI_DST16:
  782. case IMAGE_FORMAT_ATI_DST24:
  783. if ( m_Caps.m_bSupportsFetch4 )
  784. return ATI_NO_PCF_FETCH4; // ATI fetch4 depth texture sampling
  785. return ATI_NOPCF; // ATI vanilla depth texture sampling
  786. #if defined( _X360 )
  787. case IMAGE_FORMAT_X360_DST16:
  788. case IMAGE_FORMAT_X360_DST24:
  789. case IMAGE_FORMAT_X360_DST24F:
  790. return 0;
  791. #endif
  792. default:
  793. return 0;
  794. }
  795. return 0;
  796. }
  797. static ConVar r_shader_srgb( "r_shader_srgb", "0", FCVAR_ALLOWED_IN_COMPETITIVE, "-1 = use hardware caps. 0 = use hardware srgb. 1 = use shader srgb(software lookup)" ); // -1=use caps 0=off 1=on
  798. int CHardwareConfig::NeedsShaderSRGBConversion() const
  799. {
  800. if ( IsX360() )
  801. {
  802. // 360 always now uses a permanent hw solution
  803. return false;
  804. }
  805. int cValue = r_shader_srgb.GetInt();
  806. switch( cValue )
  807. {
  808. case 0:
  809. return false;
  810. case 1:
  811. return true;
  812. default:
  813. return m_Caps.m_bDX10Blending; // !!! change to return false after portal deport built!!!!!
  814. }
  815. }
  816. bool CHardwareConfig::UsesSRGBCorrectBlending() const
  817. {
  818. int cValue = r_shader_srgb.GetInt();
  819. return ( cValue == 0 ) && ( ( m_Caps.m_bDX10Blending ) || IsX360() );
  820. }
  821. static ConVar mat_disablehwmorph( "mat_disablehwmorph", "0", FCVAR_ALLOWED_IN_COMPETITIVE, "Disables HW morphing for particular mods" );
  822. bool CHardwareConfig::HasFastVertexTextures() const
  823. {
  824. static int bEnableFastVertexTextures = -1;
  825. static bool bDisableHWMorph = false;
  826. if ( bEnableFastVertexTextures < 0 )
  827. {
  828. bEnableFastVertexTextures = 1;
  829. if ( CommandLine()->FindParm( "-disallowhwmorph" ) )
  830. {
  831. bEnableFastVertexTextures = 0;
  832. }
  833. bDisableHWMorph = ( mat_disablehwmorph.GetInt() != 0 );
  834. }
  835. // JasonM - turned this off for Orange Box release...
  836. return false;
  837. // return m_Caps.m_bDX10Card && ( GetDXSupportLevel() >= 95 ) && ( bEnableFastVertexTextures != 0 ) && ( !bDisableHWMorph );
  838. }
  839. int CHardwareConfig::MaxHWMorphBatchCount() const
  840. {
  841. return ShaderUtil()->MaxHWMorphBatchCount();
  842. }
  843. int CHardwareConfig::MaximumAnisotropicLevel() const
  844. {
  845. return m_Caps.m_nMaxAnisotropy;
  846. }
  847. int CHardwareConfig::MaxTextureWidth() const
  848. {
  849. return m_Caps.m_MaxTextureWidth;
  850. }
  851. int CHardwareConfig::MaxTextureHeight() const
  852. {
  853. return m_Caps.m_MaxTextureHeight;
  854. }
  855. int CHardwareConfig::TextureMemorySize() const
  856. {
  857. return m_Caps.m_TextureMemorySize;
  858. }
  859. bool CHardwareConfig::SupportsOverbright() const
  860. {
  861. return m_Caps.m_SupportsOverbright;
  862. }
  863. bool CHardwareConfig::SupportsCubeMaps() const
  864. {
  865. if ( (ShaderUtil()->GetConfig().dxSupportLevel > 0) && (GetDXSupportLevel() < 70) )
  866. return false;
  867. return m_Caps.m_SupportsCubeMaps;
  868. }
  869. bool CHardwareConfig::SupportsMipmappedCubemaps() const
  870. {
  871. if ( (ShaderUtil()->GetConfig().dxSupportLevel > 0) && (GetDXSupportLevel() < 70) )
  872. return false;
  873. return m_Caps.m_SupportsMipmappedCubemaps;
  874. }
  875. bool CHardwareConfig::SupportsNonPow2Textures() const
  876. {
  877. return m_Caps.m_SupportsNonPow2Textures;
  878. }
  879. int CHardwareConfig::GetTextureStageCount() const
  880. {
  881. return m_Caps.m_NumTextureStages;
  882. }
  883. int CHardwareConfig::NumVertexShaderConstants() const
  884. {
  885. return m_Caps.m_NumVertexShaderConstants;
  886. }
  887. int CHardwareConfig::NumBooleanVertexShaderConstants() const
  888. {
  889. return m_Caps.m_NumBooleanVertexShaderConstants;
  890. }
  891. int CHardwareConfig::NumIntegerVertexShaderConstants() const
  892. {
  893. return m_Caps.m_NumIntegerVertexShaderConstants;
  894. }
  895. int CHardwareConfig::NumPixelShaderConstants() const
  896. {
  897. return m_Caps.m_NumPixelShaderConstants;
  898. }
  899. int CHardwareConfig::NumBooleanPixelShaderConstants() const
  900. {
  901. return m_Caps.m_NumBooleanPixelShaderConstants;
  902. }
  903. int CHardwareConfig::NumIntegerPixelShaderConstants() const
  904. {
  905. return m_Caps.m_NumIntegerPixelShaderConstants;
  906. }
  907. int CHardwareConfig::MaxNumLights() const
  908. {
  909. return m_Caps.m_MaxNumLights;
  910. }
  911. bool CHardwareConfig::SupportsHardwareLighting() const
  912. {
  913. if ( (ShaderUtil()->GetConfig().dxSupportLevel > 0) && (GetDXSupportLevel() < 70) )
  914. return false;
  915. return m_Caps.m_SupportsHardwareLighting;
  916. }
  917. int CHardwareConfig::MaxBlendMatrices() const
  918. {
  919. if ( (ShaderUtil()->GetConfig().dxSupportLevel > 0) && (GetDXSupportLevel() < 70) )
  920. return 1;
  921. return m_Caps.m_MaxBlendMatrices;
  922. }
  923. int CHardwareConfig::MaxBlendMatrixIndices() const
  924. {
  925. if ( (ShaderUtil()->GetConfig().dxSupportLevel > 0) && (GetDXSupportLevel() < 70) )
  926. return 1;
  927. return m_Caps.m_MaxBlendMatrixIndices;
  928. }
  929. int CHardwareConfig::MaxTextureAspectRatio() const
  930. {
  931. return m_Caps.m_MaxTextureAspectRatio;
  932. }
  933. int CHardwareConfig::MaxVertexShaderBlendMatrices() const
  934. {
  935. if ( (ShaderUtil()->GetConfig().dxSupportLevel > 0) && (GetDXSupportLevel() < 70) )
  936. return 1;
  937. return m_Caps.m_MaxVertexShaderBlendMatrices;
  938. }
  939. // Useful for testing fastclip on Windows
  940. extern ConVar mat_fastclip;
  941. int CHardwareConfig::MaxUserClipPlanes() const
  942. {
  943. if ( mat_fastclip.GetBool() )
  944. return 0;
  945. return m_Caps.m_MaxUserClipPlanes;
  946. }
  947. bool CHardwareConfig::UseFastClipping() const
  948. {
  949. // rbarris broke this up for easier view of outcome in debugger
  950. bool fastclip = mat_fastclip.GetBool();
  951. bool result = m_Caps.m_UseFastClipping || fastclip;
  952. return result;
  953. }
  954. int CHardwareConfig::MaxTextureDepth() const
  955. {
  956. return m_Caps.m_MaxTextureDepth;
  957. }
  958. int CHardwareConfig::GetDXSupportLevel() const
  959. {
  960. if ( ShaderUtil()->GetConfig().dxSupportLevel != 0 )
  961. {
  962. return min( ShaderUtil()->GetConfig().dxSupportLevel, m_Caps.m_nDXSupportLevel );
  963. }
  964. return m_Caps.m_nDXSupportLevel;
  965. }
  966. const char *CHardwareConfig::GetShaderDLLName() const
  967. {
  968. return ( m_Caps.m_pShaderDLL && m_Caps.m_pShaderDLL[0] ) ? m_Caps.m_pShaderDLL : "DEFAULT";
  969. }
  970. bool CHardwareConfig::ReadPixelsFromFrontBuffer() const
  971. {
  972. if ( IsX360() )
  973. {
  974. // future proof safety, not allowing the front read path
  975. return false;
  976. }
  977. // GR - in DX 9.0a can blit from MSAA back buffer
  978. return false;
  979. }
  980. bool CHardwareConfig::PreferDynamicTextures() const
  981. {
  982. if ( IsX360() )
  983. {
  984. // future proof safety, not allowing these
  985. return false;
  986. }
  987. return m_Caps.m_PreferDynamicTextures;
  988. }
  989. bool CHardwareConfig::SupportsHDR() const
  990. {
  991. // This is a deprecated function. . use GetHDRType instead. For shipping HL2, this always being false is correct.
  992. Assert( 0 );
  993. return false;
  994. }
  995. bool CHardwareConfig::SupportsHDRMode( HDRType_t nHDRType ) const
  996. {
  997. switch( nHDRType )
  998. {
  999. case HDR_TYPE_NONE:
  1000. return true;
  1001. case HDR_TYPE_INTEGER:
  1002. return ( m_Caps.m_MaxHDRType == HDR_TYPE_INTEGER ) || ( m_Caps.m_MaxHDRType == HDR_TYPE_FLOAT );
  1003. case HDR_TYPE_FLOAT:
  1004. return ( m_Caps.m_MaxHDRType == HDR_TYPE_FLOAT );
  1005. }
  1006. return false;
  1007. }
  1008. bool CHardwareConfig::HasProjectedBumpEnv() const
  1009. {
  1010. return m_Caps.m_HasProjectedBumpEnv;
  1011. }
  1012. bool CHardwareConfig::SupportsSpheremapping() const
  1013. {
  1014. return m_Caps.m_bSupportsSpheremapping;
  1015. }
  1016. bool CHardwareConfig::NeedsAAClamp() const
  1017. {
  1018. return false;
  1019. }
  1020. bool CHardwareConfig::NeedsATICentroidHack() const
  1021. {
  1022. return m_Caps.m_bNeedsATICentroidHack;
  1023. }
  1024. bool CHardwareConfig::SupportsColorOnSecondStream() const
  1025. {
  1026. return m_Caps.m_bColorOnSecondStream;
  1027. }
  1028. bool CHardwareConfig::SupportsStaticPlusDynamicLighting() const
  1029. {
  1030. return GetDXSupportLevel() >= 80;
  1031. }
  1032. bool CHardwareConfig::PreferReducedFillrate() const
  1033. {
  1034. return ShaderUtil()->GetConfig().ReduceFillrate();
  1035. }
  1036. // This is the max dx support level supported by the card
  1037. int CHardwareConfig::GetMaxDXSupportLevel() const
  1038. {
  1039. return m_ActualCaps.m_nMaxDXSupportLevel;
  1040. }
  1041. bool CHardwareConfig::SpecifiesFogColorInLinearSpace() const
  1042. {
  1043. return m_Caps.m_bFogColorSpecifiedInLinearSpace;
  1044. }
  1045. bool CHardwareConfig::SupportsSRGB() const
  1046. {
  1047. return m_Caps.m_SupportsSRGB;
  1048. }
  1049. bool CHardwareConfig::FakeSRGBWrite() const
  1050. {
  1051. return m_Caps.m_FakeSRGBWrite;
  1052. }
  1053. bool CHardwareConfig::CanDoSRGBReadFromRTs() const
  1054. {
  1055. return m_Caps.m_CanDoSRGBReadFromRTs;
  1056. }
  1057. bool CHardwareConfig::SupportsGLMixedSizeTargets() const
  1058. {
  1059. return m_Caps.m_bSupportsGLMixedSizeTargets;
  1060. }
  1061. bool CHardwareConfig::IsAAEnabled() const
  1062. {
  1063. return g_pShaderDevice ? g_pShaderDevice->IsAAEnabled() : false;
  1064. // bool bAntialiasing = ( m_PresentParameters.MultiSampleType != D3DMULTISAMPLE_NONE );
  1065. // return bAntialiasing;
  1066. }
  1067. int CHardwareConfig::GetVertexTextureCount() const
  1068. {
  1069. return m_Caps.m_nVertexTextureCount;
  1070. }
  1071. int CHardwareConfig::GetMaxVertexTextureDimension() const
  1072. {
  1073. return m_Caps.m_nMaxVertexTextureDimension;
  1074. }
  1075. HDRType_t CHardwareConfig::GetHDRType() const
  1076. {
  1077. bool enabled = m_bHDREnabled;
  1078. int dxlev = GetDXSupportLevel();
  1079. int dxsupp = dxlev >= 90;
  1080. HDRType_t caps_hdr = m_Caps.m_HDRType;
  1081. HDRType_t result = HDR_TYPE_NONE;
  1082. //printf("\nCHardwareConfig::GetHDRType...");
  1083. if (enabled)
  1084. {
  1085. //printf("-> enabled...");
  1086. if (dxsupp)
  1087. {
  1088. //printf("-> supported...");
  1089. result = caps_hdr;
  1090. }
  1091. }
  1092. //printf("-> result is %d.\n", result);
  1093. return result;
  1094. /*
  1095. if ( m_bHDREnabled && ( GetDXSupportLevel() >= 90 ) )
  1096. return m_Caps.m_HDRType;
  1097. return HDR_TYPE_NONE;
  1098. */
  1099. }
  1100. HDRType_t CHardwareConfig::GetHardwareHDRType() const
  1101. {
  1102. return m_Caps.m_HDRType;
  1103. }
  1104. bool CHardwareConfig::SupportsStreamOffset() const
  1105. {
  1106. return ( (GetDXSupportLevel() >= 90) && m_Caps.m_bSupportsStreamOffset );
  1107. }
  1108. int CHardwareConfig::StencilBufferBits() const
  1109. {
  1110. return g_pShaderDevice ? g_pShaderDevice->StencilBufferBits() : 0;
  1111. }
  1112. int CHardwareConfig:: MaxViewports() const
  1113. {
  1114. return m_Caps.m_nMaxViewports;
  1115. }
  1116. int CHardwareConfig::GetActualSamplerCount() const
  1117. {
  1118. return m_ActualCaps.m_NumSamplers;
  1119. }
  1120. int CHardwareConfig::GetActualTextureStageCount() const
  1121. {
  1122. return m_ActualCaps.m_NumTextureStages;
  1123. }
  1124. const char *CHardwareConfig::GetHWSpecificShaderDLLName() const
  1125. {
  1126. return m_Caps.m_pShaderDLL && m_Caps.m_pShaderDLL[0] ? m_Caps.m_pShaderDLL : NULL;
  1127. }
  1128. bool CHardwareConfig::SupportsMipmapping() const
  1129. {
  1130. return m_Caps.m_SupportsMipmapping;
  1131. }
  1132. bool CHardwareConfig::ActuallySupportsPixelShaders_2_b() const
  1133. {
  1134. return m_ActualCaps.m_SupportsPixelShaders_2_b;
  1135. }