summaryrefslogtreecommitdiff
path: root/materialsystem/shaderlib/ShaderDLL.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /materialsystem/shaderlib/ShaderDLL.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'materialsystem/shaderlib/ShaderDLL.cpp')
-rw-r--r--materialsystem/shaderlib/ShaderDLL.cpp169
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 );
+}
+