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.
287 lines
12 KiB
287 lines
12 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//
|
||
|
//===========================================================================//
|
||
|
|
||
|
#ifndef HARDWARECONFIG_H
|
||
|
#define HARDWARECONFIG_H
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#include "materialsystem/imaterialsystemhardwareconfig.h"
|
||
|
#include "IHardwareConfigInternal.h"
|
||
|
#include "bitmap/imageformat.h"
|
||
|
#include "materialsystem/imaterialsystem.h"
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Forward declarations
|
||
|
//-----------------------------------------------------------------------------
|
||
|
struct ShaderDeviceInfo_t;
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Vendor IDs sometimes needed for vendor-specific code
|
||
|
//-----------------------------------------------------------------------------
|
||
|
#define VENDORID_NVIDIA 0x10DE
|
||
|
#define VENDORID_ATI 0x1002
|
||
|
#define VENDORID_INTEL 0x8086
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// ShaderAPI constants
|
||
|
//-----------------------------------------------------------------------------
|
||
|
enum
|
||
|
{
|
||
|
#if defined( DX_TO_GL_ABSTRACTION )
|
||
|
MAXUSERCLIPPLANES = 2,
|
||
|
#else
|
||
|
MAXUSERCLIPPLANES = 6,
|
||
|
#endif
|
||
|
MAX_NUM_LIGHTS = 4,
|
||
|
MAX_OUTPUTS = 3,
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Hardware caps structures
|
||
|
//-----------------------------------------------------------------------------
|
||
|
enum CompressedTextureState_t
|
||
|
{
|
||
|
COMPRESSED_TEXTURES_ON,
|
||
|
COMPRESSED_TEXTURES_OFF,
|
||
|
COMPRESSED_TEXTURES_NOT_INITIALIZED
|
||
|
};
|
||
|
|
||
|
struct HardwareCaps_t : public MaterialAdapterInfo_t
|
||
|
{
|
||
|
// *****************************NOTE*********************************************
|
||
|
// If you change any members, make sure and reflect the changes in CHardwareConfig::ForceCapsToDXLevel for every dxlevel!!!!!
|
||
|
// If you change any members, make sure and reflect the changes in CHardwareConfig::ForceCapsToDXLevel for every dxlevel!!!!!
|
||
|
// If you change any members, make sure and reflect the changes in CHardwareConfig::ForceCapsToDXLevel for every dxlevel!!!!!
|
||
|
// If you change any members, make sure and reflect the changes in CHardwareConfig::ForceCapsToDXLevel for every dxlevel!!!!!
|
||
|
// If you change any members, make sure and reflect the changes in CHardwareConfig::ForceCapsToDXLevel for every dxlevel!!!!!
|
||
|
// *****************************NOTE*********************************************
|
||
|
//
|
||
|
// NOTE: Texture stages are an obsolete concept; used by fixed-function hardware
|
||
|
// Samplers are dx9+, indicating how many textures we can simultaneously bind
|
||
|
// In Dx8, samplers didn't exist and texture stages were used to indicate the
|
||
|
// number of simultaneously bound textures; we'll emulate that by slamming
|
||
|
// the number of samplers to == the number of texture stages.
|
||
|
CompressedTextureState_t m_SupportsCompressedTextures;
|
||
|
VertexCompressionType_t m_SupportsCompressedVertices;
|
||
|
int m_NumSamplers;
|
||
|
int m_NumTextureStages;
|
||
|
int m_nMaxAnisotropy;
|
||
|
int m_MaxTextureWidth;
|
||
|
int m_MaxTextureHeight;
|
||
|
int m_MaxTextureDepth;
|
||
|
int m_MaxTextureAspectRatio;
|
||
|
int m_MaxPrimitiveCount;
|
||
|
int m_NumPixelShaderConstants;
|
||
|
int m_NumBooleanPixelShaderConstants;
|
||
|
int m_NumIntegerPixelShaderConstants;
|
||
|
int m_NumVertexShaderConstants;
|
||
|
int m_NumBooleanVertexShaderConstants;
|
||
|
int m_NumIntegerVertexShaderConstants;
|
||
|
int m_TextureMemorySize;
|
||
|
int m_MaxNumLights;
|
||
|
int m_MaxBlendMatrices;
|
||
|
int m_MaxBlendMatrixIndices;
|
||
|
int m_MaxVertexShaderBlendMatrices;
|
||
|
int m_MaxUserClipPlanes;
|
||
|
HDRType_t m_HDRType;
|
||
|
char m_pShaderDLL[32];
|
||
|
ImageFormat m_ShadowDepthTextureFormat;
|
||
|
ImageFormat m_NullTextureFormat;
|
||
|
int m_nVertexTextureCount;
|
||
|
int m_nMaxVertexTextureDimension;
|
||
|
unsigned long m_AlphaToCoverageState; // State to ping to toggle Alpha To Coverage (vendor-dependent)
|
||
|
unsigned long m_AlphaToCoverageEnableValue; // Value to set above state to turn on Alpha To Coverage (vendor-dependent)
|
||
|
unsigned long m_AlphaToCoverageDisableValue; // Value to set above state to turn off Alpha To Coverage (vendor-dependent)
|
||
|
int m_nMaxViewports;
|
||
|
float m_flMinGammaControlPoint;
|
||
|
float m_flMaxGammaControlPoint;
|
||
|
int m_nGammaControlPointCount;
|
||
|
int m_MaxVertexShader30InstructionSlots;
|
||
|
int m_MaxPixelShader30InstructionSlots;
|
||
|
int m_MaxSimultaneousRenderTargets;
|
||
|
|
||
|
bool m_bDeviceOk : 1;
|
||
|
bool m_HasSetDeviceGammaRamp : 1;
|
||
|
bool m_SupportsVertexShaders : 1;
|
||
|
bool m_SupportsVertexShaders_2_0 : 1;
|
||
|
bool m_SupportsPixelShaders : 1;
|
||
|
bool m_SupportsPixelShaders_1_4 : 1;
|
||
|
bool m_SupportsPixelShaders_2_0 : 1;
|
||
|
bool m_SupportsPixelShaders_2_b : 1;
|
||
|
bool m_SupportsShaderModel_3_0 : 1;
|
||
|
bool m_bSupportsAnisotropicFiltering : 1;
|
||
|
bool m_bSupportsMagAnisotropicFiltering : 1;
|
||
|
bool m_bSupportsVertexTextures : 1;
|
||
|
bool m_ZBiasAndSlopeScaledDepthBiasSupported : 1;
|
||
|
bool m_SupportsMipmapping : 1;
|
||
|
bool m_SupportsOverbright : 1;
|
||
|
bool m_SupportsCubeMaps : 1;
|
||
|
bool m_SupportsHardwareLighting : 1;
|
||
|
bool m_SupportsMipmappedCubemaps : 1;
|
||
|
bool m_SupportsNonPow2Textures : 1;
|
||
|
bool m_PreferDynamicTextures : 1;
|
||
|
bool m_HasProjectedBumpEnv : 1;
|
||
|
bool m_SupportsSRGB : 1; // Means both read and write
|
||
|
bool m_bSupportsSpheremapping : 1;
|
||
|
bool m_UseFastClipping : 1;
|
||
|
bool m_bNeedsATICentroidHack : 1;
|
||
|
bool m_bDisableShaderOptimizations : 1;
|
||
|
bool m_bColorOnSecondStream : 1;
|
||
|
bool m_bSupportsStreamOffset : 1;
|
||
|
bool m_bFogColorSpecifiedInLinearSpace : 1;
|
||
|
bool m_bFogColorAlwaysLinearSpace : 1;
|
||
|
bool m_bSupportsAlphaToCoverage : 1;
|
||
|
bool m_bSupportsShadowDepthTextures : 1;
|
||
|
bool m_bSupportsFetch4 : 1;
|
||
|
bool m_bSoftwareVertexProcessing : 1;
|
||
|
bool m_bScissorSupported : 1;
|
||
|
bool m_bSupportsFloat32RenderTargets : 1;
|
||
|
bool m_bSupportsBorderColor : 1;
|
||
|
bool m_bDX10Card : 1; // Indicates DX10 part with performant vertex textures running DX9 path
|
||
|
bool m_bDX10Blending : 1; // Indicates DX10 part that does DX10 blending (but may not have performant vertex textures, such as Intel parts)
|
||
|
bool m_bSupportsStaticControlFlow : 1; // Useful on OpenGL, where we have a mix of support...
|
||
|
bool m_FakeSRGBWrite : 1; // Gotta do this on OpenGL. Mostly hidden, but some high level code needs to know
|
||
|
bool m_CanDoSRGBReadFromRTs : 1; // Gotta do this on OpenGL. Mostly hidden, but some high level code needs to know
|
||
|
bool m_bSupportsGLMixedSizeTargets : 1; // on OpenGL, are mixed size depth buffers supported - aka ARB_framebuffer_object
|
||
|
bool m_bCanStretchRectFromTextures : 1; // Does the device expose D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES (or is it >DX9?)
|
||
|
|
||
|
HDRType_t m_MaxHDRType;
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Contains the hardware configuration for the current device
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CHardwareConfig : public IHardwareConfigInternal
|
||
|
{
|
||
|
public:
|
||
|
CHardwareConfig();
|
||
|
|
||
|
// Sets up the hardware caps given the specified DX level
|
||
|
void SetupHardwareCaps( const ShaderDeviceInfo_t& mode, const HardwareCaps_t &actualCaps );
|
||
|
|
||
|
// FIXME: This is for backward compat only.. don't use these
|
||
|
void SetupHardwareCaps( int nDXLevel, const HardwareCaps_t &actualCaps );
|
||
|
HardwareCaps_t& ActualCapsForEdit() { return m_ActualCaps; }
|
||
|
HardwareCaps_t& CapsForEdit() { return m_Caps; }
|
||
|
|
||
|
// Members of IMaterialSystemHardwareConfig
|
||
|
virtual bool HasDestAlphaBuffer() const;
|
||
|
virtual bool HasStencilBuffer() const;
|
||
|
virtual int GetFrameBufferColorDepth() const;
|
||
|
virtual int GetSamplerCount() const;
|
||
|
virtual bool HasSetDeviceGammaRamp() const;
|
||
|
virtual bool SupportsCompressedTextures() const;
|
||
|
virtual VertexCompressionType_t SupportsCompressedVertices() const;
|
||
|
virtual bool SupportsBorderColor() const;
|
||
|
virtual bool SupportsFetch4() const;
|
||
|
virtual bool CanStretchRectFromTextures() const;
|
||
|
virtual bool SupportsVertexAndPixelShaders() const;
|
||
|
virtual bool SupportsPixelShaders_1_4() const;
|
||
|
virtual bool SupportsPixelShaders_2_0() const;
|
||
|
virtual bool SupportsStaticControlFlow() const;
|
||
|
virtual bool SupportsVertexShaders_2_0() const;
|
||
|
virtual int MaximumAnisotropicLevel() const;
|
||
|
virtual int MaxTextureWidth() const;
|
||
|
virtual int MaxTextureHeight() const;
|
||
|
virtual int TextureMemorySize() const;
|
||
|
virtual bool SupportsOverbright() const;
|
||
|
virtual bool SupportsCubeMaps() const;
|
||
|
virtual bool SupportsMipmappedCubemaps() const;
|
||
|
virtual bool SupportsNonPow2Textures() const;
|
||
|
virtual int GetTextureStageCount() const;
|
||
|
virtual int NumVertexShaderConstants() const;
|
||
|
virtual int NumBooleanVertexShaderConstants() const;
|
||
|
virtual int NumIntegerVertexShaderConstants() const;
|
||
|
virtual int NumPixelShaderConstants() const;
|
||
|
virtual int NumBooleanPixelShaderConstants() const;
|
||
|
virtual int NumIntegerPixelShaderConstants() const;
|
||
|
virtual int MaxNumLights() const;
|
||
|
virtual bool SupportsHardwareLighting() const;
|
||
|
virtual int MaxBlendMatrices() const;
|
||
|
virtual int MaxBlendMatrixIndices() const;
|
||
|
virtual int MaxTextureAspectRatio() const;
|
||
|
virtual int MaxVertexShaderBlendMatrices() const;
|
||
|
virtual int MaxUserClipPlanes() const;
|
||
|
virtual bool UseFastClipping() const;
|
||
|
virtual int GetDXSupportLevel() const;
|
||
|
virtual const char *GetShaderDLLName() const;
|
||
|
virtual bool ReadPixelsFromFrontBuffer() const;
|
||
|
virtual bool PreferDynamicTextures() const;
|
||
|
virtual bool SupportsHDR() const;
|
||
|
virtual bool HasProjectedBumpEnv() const;
|
||
|
virtual bool SupportsSpheremapping() const;
|
||
|
virtual bool NeedsAAClamp() const;
|
||
|
virtual bool NeedsATICentroidHack() const;
|
||
|
virtual bool SupportsColorOnSecondStream() const;
|
||
|
virtual bool SupportsStaticPlusDynamicLighting() const;
|
||
|
virtual bool PreferReducedFillrate() const;
|
||
|
virtual int GetMaxDXSupportLevel() const;
|
||
|
virtual bool SpecifiesFogColorInLinearSpace() const;
|
||
|
virtual bool SupportsSRGB() const;
|
||
|
virtual bool FakeSRGBWrite() const;
|
||
|
virtual bool CanDoSRGBReadFromRTs() const;
|
||
|
virtual bool SupportsGLMixedSizeTargets() const;
|
||
|
virtual bool IsAAEnabled() const;
|
||
|
virtual int GetVertexTextureCount() const;
|
||
|
virtual int GetMaxVertexTextureDimension() const;
|
||
|
virtual int MaxTextureDepth() const;
|
||
|
virtual HDRType_t GetHDRType() const;
|
||
|
virtual HDRType_t GetHardwareHDRType() const;
|
||
|
virtual bool SupportsPixelShaders_2_b() const;
|
||
|
virtual bool SupportsShaderModel_3_0() const;
|
||
|
virtual bool SupportsStreamOffset() const;
|
||
|
virtual int StencilBufferBits() const;
|
||
|
virtual int MaxViewports() const;
|
||
|
virtual void OverrideStreamOffsetSupport( bool bOverrideEnabled, bool bEnableSupport );
|
||
|
virtual int GetShadowFilterMode() const;
|
||
|
virtual int NeedsShaderSRGBConversion() const;
|
||
|
virtual bool UsesSRGBCorrectBlending() const;
|
||
|
virtual bool HasFastVertexTextures() const;
|
||
|
virtual int MaxHWMorphBatchCount() const;
|
||
|
|
||
|
const char *GetHWSpecificShaderDLLName() const;
|
||
|
int GetActualSamplerCount() const;
|
||
|
int GetActualTextureStageCount() const;
|
||
|
bool SupportsMipmapping() const;
|
||
|
virtual bool ActuallySupportsPixelShaders_2_b() const;
|
||
|
|
||
|
virtual bool SupportsHDRMode( HDRType_t nHDRMode ) const;
|
||
|
|
||
|
const HardwareCaps_t& ActualCaps() const { return m_ActualCaps; }
|
||
|
const HardwareCaps_t& Caps() const { return m_Caps; }
|
||
|
virtual bool GetHDREnabled( void ) const;
|
||
|
virtual void SetHDREnabled( bool bEnable );
|
||
|
|
||
|
protected:
|
||
|
// Gets the recommended configuration associated with a particular dx level
|
||
|
void ForceCapsToDXLevel( HardwareCaps_t *pCaps, int nDxLevel, const HardwareCaps_t &actualCaps );
|
||
|
|
||
|
// Members related to capabilities
|
||
|
HardwareCaps_t m_ActualCaps;
|
||
|
HardwareCaps_t m_Caps;
|
||
|
HardwareCaps_t m_UnOverriddenCaps;
|
||
|
bool m_bHDREnabled;
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Singleton hardware config
|
||
|
//-----------------------------------------------------------------------------
|
||
|
extern CHardwareConfig *g_pHardwareConfig;
|
||
|
|
||
|
|
||
|
#endif // HARDWARECONFIG_H
|