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.
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//===========================================================================//
#include "shaderlib/ShaderDLL.h"
#include "materialsystem/IShader.h"
#include "tier1/utlvector.h"
#include "tier0/dbg.h"
#include "materialsystem/imaterialsystemhardwareconfig.h"
#include "materialsystem/materialsystem_config.h"
#include "IShaderSystem.h"
#include "materialsystem/ishaderapi.h"
#include "shaderlib_cvar.h"
#include "mathlib/mathlib.h"
#include "tier1/tier1.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
//-----------------------------------------------------------------------------
// The standard implementation of CShaderDLL
//-----------------------------------------------------------------------------
class CShaderDLL : public IShaderDLLInternal, public IShaderDLL { public: CShaderDLL();
// methods of IShaderDLL
virtual bool Connect( CreateInterfaceFn factory ); virtual void Disconnect(); virtual int ShaderCount() const; virtual IShader *GetShader( int nShader );
// methods of IShaderDLLInternal
virtual bool Connect( CreateInterfaceFn factory, bool bIsMaterialSystem ); virtual void Disconnect( bool bIsMaterialSystem ); virtual void InsertShader( IShader *pShader );
private: CUtlVector< IShader * > m_ShaderList; };
//-----------------------------------------------------------------------------
// Global interfaces/structures
//-----------------------------------------------------------------------------
IMaterialSystemHardwareConfig* g_pHardwareConfig; const MaterialSystem_Config_t *g_pConfig;
//-----------------------------------------------------------------------------
// Interfaces/structures local to shaderlib
//-----------------------------------------------------------------------------
IShaderSystem* g_pSLShaderSystem;
// Pattern necessary because shaders register themselves in global constructors
static CShaderDLL *s_pShaderDLL;
//-----------------------------------------------------------------------------
// Global accessor
//-----------------------------------------------------------------------------
IShaderDLL *GetShaderDLL() { // Pattern necessary because shaders register themselves in global constructors
if ( !s_pShaderDLL ) { s_pShaderDLL = new CShaderDLL; }
return s_pShaderDLL; }
IShaderDLLInternal *GetShaderDLLInternal() { // Pattern necessary because shaders register themselves in global constructors
if ( !s_pShaderDLL ) { s_pShaderDLL = new CShaderDLL; }
return static_cast<IShaderDLLInternal*>( s_pShaderDLL ); }
//-----------------------------------------------------------------------------
// Singleton interface
//-----------------------------------------------------------------------------
EXPOSE_INTERFACE_FN( (InstantiateInterfaceFn)GetShaderDLLInternal, IShaderDLLInternal, SHADER_DLL_INTERFACE_VERSION );
//-----------------------------------------------------------------------------
// Connect, disconnect...
//-----------------------------------------------------------------------------
CShaderDLL::CShaderDLL() { MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f ); }
//-----------------------------------------------------------------------------
// Connect, disconnect...
//-----------------------------------------------------------------------------
bool CShaderDLL::Connect( CreateInterfaceFn factory, bool bIsMaterialSystem ) { g_pHardwareConfig = (IMaterialSystemHardwareConfig*)factory( MATERIALSYSTEM_HARDWARECONFIG_INTERFACE_VERSION, NULL ); g_pConfig = (const MaterialSystem_Config_t*)factory( MATERIALSYSTEM_CONFIG_VERSION, NULL ); g_pSLShaderSystem = (IShaderSystem*)factory( SHADERSYSTEM_INTERFACE_VERSION, NULL );
if ( !bIsMaterialSystem ) { ConnectTier1Libraries( &factory, 1 ); InitShaderLibCVars( factory ); }
return ( g_pConfig != NULL ) && (g_pHardwareConfig != NULL) && ( g_pSLShaderSystem != NULL ); }
void CShaderDLL::Disconnect( bool bIsMaterialSystem ) { if ( !bIsMaterialSystem ) { ConVar_Unregister(); DisconnectTier1Libraries(); }
g_pHardwareConfig = NULL; g_pConfig = NULL; g_pSLShaderSystem = NULL; }
bool CShaderDLL::Connect( CreateInterfaceFn factory ) { return Connect( factory, false ); }
void CShaderDLL::Disconnect() { Disconnect( false ); }
//-----------------------------------------------------------------------------
// Iterates over all shaders
//-----------------------------------------------------------------------------
int CShaderDLL::ShaderCount() const { return m_ShaderList.Count(); }
IShader *CShaderDLL::GetShader( int nShader ) { if ( ( nShader < 0 ) || ( nShader >= m_ShaderList.Count() ) ) return NULL;
return m_ShaderList[nShader]; }
//-----------------------------------------------------------------------------
// Adds to the shader lists
//-----------------------------------------------------------------------------
void CShaderDLL::InsertShader( IShader *pShader ) { Assert( pShader ); m_ShaderList.AddToTail( pShader ); }
|