Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

256 lines
8.7 KiB

//========= Copyright (c) 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//===========================================================================//
#ifndef ISHADER_H
#define ISHADER_H
#ifdef _WIN32
#pragma once
#endif
//==================================================================================================
// **this goes into both platforms which run the translator, either the real Mac client or
// the Windows client running with r_emulategl mode **
//
// size of the VS register bank in ARB / GLSL we expose
#define DXABSTRACT_VS_PARAM_SLOTS 256
#define DXABSTRACT_VS_FIRST_BONE_SLOT VERTEX_SHADER_MODEL
#define DXABSTRACT_VS_LAST_BONE_SLOT (VERTEX_SHADER_SHADER_SPECIFIC_CONST_13-1)
// user clip plane 0 goes in DXABSTRACT_VS_CLIP_PLANE_BASE... plane 1 goes in the slot after that
// dxabstract uses these constants to check plane index limit and to deliver planes to shader for DP4 -> oCLP[n]
#define DXABSTRACT_VS_CLIP_PLANE_BASE (DXABSTRACT_VS_PARAM_SLOTS-2)
//==================================================================================================
#include "materialsystem/imaterialsystem.h"
#include "materialsystem/ishaderapi.h"
//-----------------------------------------------------------------------------
// forward declarations
//-----------------------------------------------------------------------------
class IMaterialVar;
class IShaderShadow;
class IShaderDynamicAPI;
class IShaderInit;
class CBasePerMaterialContextData;
//-----------------------------------------------------------------------------
// Shader flags
//-----------------------------------------------------------------------------
enum ShaderFlags_t
{
SHADER_NOT_EDITABLE = 0x1
};
//-----------------------------------------------------------------------------
// Shader parameter flags
//-----------------------------------------------------------------------------
enum ShaderParamFlags_t
{
SHADER_PARAM_NOT_EDITABLE = 0x1
};
//-----------------------------------------------------------------------------
// Information about each shader parameter
//-----------------------------------------------------------------------------
struct ShaderParamInfo_t
{
const char *m_pName;
const char *m_pHelp;
ShaderParamType_t m_Type;
const char *m_pDefaultValue;
int m_nFlags;
};
//-----------------------------------------------------------------------------
// shaders can keep per material data in classes descended from this
//-----------------------------------------------------------------------------
class CBasePerMaterialContextData
{
public:
uint32 m_nVarChangeID;
bool m_bMaterialVarsChanged; // set by mat system when material vars change. shader should rehtink and then clear the var
FORCEINLINE CBasePerMaterialContextData( void )
{
m_bMaterialVarsChanged = true;
m_nVarChangeID = 0xffffffff;
}
// virtual destructor so that derived classes can have their own data to be cleaned up on
// delete of material
virtual ~CBasePerMaterialContextData( void )
{
}
};
//-----------------------------------------------------------------------------
// shaders can keep per instance data in classes descended from this
//-----------------------------------------------------------------------------
class CBasePerInstanceContextData
{
public:
virtual unsigned char* GetInstanceCommandBuffer() = 0;
// virtual destructor so that derived classes can have their own data
// to be cleaned up on delete of material
virtual ~CBasePerInstanceContextData( void )
{
}
};
//-----------------------------------------------------------------------------
// Standard vertex shader constants
//-----------------------------------------------------------------------------
enum
{
// Standard vertex shader constants
VERTEX_SHADER_MATH_CONSTANTS0 = 0,
VERTEX_SHADER_MATH_CONSTANTS1 = 1,
VERTEX_SHADER_CAMERA_POS = 2,
VERTEX_SHADER_LIGHT_INDEX = 3,
VERTEX_SHADER_MODELVIEWPROJ = 4,
VERTEX_SHADER_VIEWPROJ = 8,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_12 = 12,
VERTEX_SHADER_FLEXSCALE = 13,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_10 = 14,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_11 = 15,
VERTEX_SHADER_FOG_PARAMS = 16,
VERTEX_SHADER_VIEWMODEL = 17,
VERTEX_SHADER_AMBIENT_LIGHT = 21,
VERTEX_SHADER_LIGHTS = 27,
VERTEX_SHADER_LIGHT0_POSITION = 29,
VERTEX_SHADER_MODULATION_COLOR = 47,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_0 = 48,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_1 = 49,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_2 = 50,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_3 = 51,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_4 = 52,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_5 = 53,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_6 = 54,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_7 = 55,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_8 = 56,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_9 = 57,
VERTEX_SHADER_MODEL = 58,
//
// We reserve up through 217 for the 53 bones supported on DX9
//
VERTEX_SHADER_SHADER_SPECIFIC_CONST_CSM = 37, // to match the define in common_vs_fxc.h
VERTEX_SHADER_SHADER_SPECIFIC_CONST_13 = 217,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_14 = 219,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_15 = 221,
VERTEX_SHADER_SHADER_SPECIFIC_CONST_16 = 223,
// 254 ClipPlane0 |------ OpenGL will jam clip planes into these two
// 255 ClipPlane1 |
VERTEX_SHADER_FLEX_WEIGHTS = 1024,
VERTEX_SHADER_MAX_FLEX_WEIGHT_COUNT = 512,
};
#define VERTEX_SHADER_BONE_TRANSFORM( k ) ( VERTEX_SHADER_MODEL + 3 * (k) )
//-----------------------------------------------------------------------------
// Standard vertex shader constants
//-----------------------------------------------------------------------------
enum
{
// Standard vertex shader constants
VERTEX_SHADER_LIGHT_ENABLE_BOOL_CONST = 0,
VERTEX_SHADER_LIGHT_ENABLE_BOOL_CONST_COUNT = 4,
VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_0 = 4,
VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_1 = 5,
VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_2 = 6,
VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_3 = 7,
VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_4 = 8,
VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_5 = 9,
VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_6 = 10,
VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_7 = 11,
};
//-----------------------------------------------------------------------------
// The public methods exposed by each shader
//-----------------------------------------------------------------------------
abstract_class IShader
{
public:
// Returns the shader name
virtual char const* GetName( ) const = 0;
// returns the shader fallbacks
virtual char const* GetFallbackShader( IMaterialVar** params ) const = 0;
// Shader parameters
virtual int GetParamCount( ) const = 0;
virtual const ShaderParamInfo_t& GetParamInfo( int paramIndex ) const = 0;
// These functions must be implemented by the shader
virtual void InitShaderParams( IMaterialVar** ppParams, const char *pMaterialName ) = 0;
virtual void InitShaderInstance( IMaterialVar** ppParams, IShaderInit *pShaderInit, const char *pMaterialName, const char *pTextureGroupName ) = 0;
virtual void DrawElements( IMaterialVar **params, int nModulationFlags,
IShaderShadow* pShaderShadow, IShaderDynamicAPI* pShaderAPI,
VertexCompressionType_t vertexCompression, CBasePerMaterialContextData **pContextDataPtr, CBasePerInstanceContextData** pInstanceDataPtr ) = 0;
virtual void ExecuteFastPath( int * vsDynIndex, int *psDynIndex, IMaterialVar** params,
IShaderDynamicAPI * pShaderAPI, VertexCompressionType_t vertexCompression, CBasePerMaterialContextData **pContextDataPtr,
BOOL bCSMEnabled )
{
*vsDynIndex = -1;
*psDynIndex = -1;
}
// FIXME: Figure out a better way to do this?
virtual int ComputeModulationFlags( IMaterialVar** params, IShaderDynamicAPI* pShaderAPI ) = 0;
virtual bool NeedsPowerOfTwoFrameBufferTexture( IMaterialVar **params, bool bCheckSpecificToThisFrame = true ) const = 0;
virtual bool NeedsFullFrameBufferTexture( IMaterialVar **params, bool bCheckSpecificToThisFrame ) const = 0;
virtual bool IsTranslucent( IMaterialVar **params ) const = 0;
virtual int GetFlags() const = 0;
virtual void SetPPParams( IMaterialVar **params ) = 0;
virtual void SetModulationFlags( int modulationFlags ) = 0;
};
//-----------------------------------------------------------------------------
// Shader dictionaries defined in DLLs
//-----------------------------------------------------------------------------
enum PrecompiledShaderType_t
{
PRECOMPILED_VERTEX_SHADER = 0,
PRECOMPILED_PIXEL_SHADER,
PRECOMPILED_SHADER_TYPE_COUNT,
};
//-----------------------------------------------------------------------------
// Flags field of PrecompiledShader_t
//-----------------------------------------------------------------------------
enum
{
// runtime flags
SHADER_IS_ASM = 0x1,
SHADER_FAILED_LOAD = 0x2,
};
#endif // ISHADER_H