diff options
Diffstat (limited to 'materialsystem/shaderlib/ShaderDLL.cpp')
| -rw-r--r-- | materialsystem/shaderlib/ShaderDLL.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/materialsystem/shaderlib/ShaderDLL.cpp b/materialsystem/shaderlib/ShaderDLL.cpp new file mode 100644 index 0000000..e52b601 --- /dev/null +++ b/materialsystem/shaderlib/ShaderDLL.cpp @@ -0,0 +1,169 @@ +//========= 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 ); +} + |