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.
|
|
//===== Copyright 1996-2005, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
//===========================================================================//
#include "shaderlib/ShaderDLL.h"
#include "materialsystem/IShader.h"
#include "tier1/utlvector.h"
#include "tier1/utllinkedlist.h"
#include "tier0/dbg.h"
#include "materialsystem/imaterialsystemhardwareconfig.h"
#include "materialsystem/materialsystem_config.h"
#include "materialsystem/ishadersystem.h"
#include "materialsystem/ishaderapi.h"
#include "shaderlib_cvar.h"
#include "mathlib/mathlib.h"
#include "tier2/tier2.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();
// methods of IShaderDLLInternal
virtual int ShaderCount() const; virtual IShader *GetShader( int nShader ); int ShaderComboSemanticsCount() const; const ShaderComboSemantics_t *GetComboSemantics( int n ); virtual bool Connect( CreateInterfaceFn factory, bool bIsMaterialSystem ); virtual void Disconnect( bool bIsMaterialSystem ); virtual void InsertShader( IShader *pShader );
virtual void AddShaderComboInformation( const ShaderComboSemantics_t *pSemantics );
private: CUtlVector< IShader * > m_ShaderList; CUtlLinkedList< const ShaderComboSemantics_t * > m_ShaderComboSemantics; };
//-----------------------------------------------------------------------------
// Global interfaces/structures
//-----------------------------------------------------------------------------
#if !defined( _PS3 ) && !defined( _OSX )
IMaterialSystemHardwareConfig* g_pHardwareConfig; const MaterialSystem_Config_t *g_pConfig; #else
extern MaterialSystem_Config_t g_config; const MaterialSystem_Config_t *g_pConfig = &g_config; #endif
//-----------------------------------------------------------------------------
// Interfaces/structures local to shaderlib
//-----------------------------------------------------------------------------
#ifndef _PS3
IShaderSystem* g_pSLShaderSystem; #endif
// 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 ) { #if defined( _PS3 )
return true; #elif defined( OSX )
g_pSLShaderSystem = (IShaderSystem*)factory( SHADERSYSTEM_INTERFACE_VERSION, NULL ); return ( g_pSLShaderSystem != NULL ); #else
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 ); #endif
}
void CShaderDLL::Disconnect( bool bIsMaterialSystem ) { #if defined( OSX )
g_pSLShaderSystem = NULL; #elif !defined( _PS3 )
if ( !bIsMaterialSystem ) { ConVar_Unregister(); DisconnectTier1Libraries(); }
g_pHardwareConfig = NULL; g_pConfig = NULL; g_pSLShaderSystem = NULL; #endif
}
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 ); }
//-----------------------------------------------------------------------------
// Iterates over all shader semantics
//-----------------------------------------------------------------------------
int CShaderDLL::ShaderComboSemanticsCount() const { return m_ShaderComboSemantics.Count(); }
const ShaderComboSemantics_t *CShaderDLL::GetComboSemantics( int n ) { if ( ( n < 0 ) || ( n >= m_ShaderComboSemantics.Count() ) ) return NULL;
return m_ShaderComboSemantics[n]; }
//-----------------------------------------------------------------------------
// Adds to the shader combo semantics list
//-----------------------------------------------------------------------------
void CShaderDLL::AddShaderComboInformation( const ShaderComboSemantics_t *pSemantics ) { m_ShaderComboSemantics.AddToTail( pSemantics ); }
|