"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSGraphicsLib/Src/OpenGLShaders/LSGOpenGlShaderProgramManager.h

00001 
00020 #ifndef __LSG_OPENGLSHADERPROGRAMMANAGER_H__
00021 #define __LSG_OPENGLSHADERPROGRAMMANAGER_H__
00022 
00023 #include "../LSGGraphicsLib.h"
00024 #include "../ShaderLanguage/LSGShaderBase.h"
00025 #include "../ShaderLanguage/LSGShaderTranslationProcessorBase.h"
00026 #include "../VertexBuffer/LSGVertexBufferBase.h"
00027 #include "LSGOpenGlCompiledShader.h"
00028 #include "Map/LSTLMap.h"
00029 
00030 #if defined( LSG_OGL )
00031 
00032 namespace lsg {
00033 
00044         class COpenGlShaderProgramManager {
00045         public :
00046                 // == Types.
00050                 typedef struct LSG_ATTRIBUTE_USAGE_LOCS {
00054                         GLint                                                                                                           iLoc[LSG_VBM_MAX_USAGES];
00055                 } * LPLSG_ATTRIBUTE_USAGE_LOCS, * const LPCLSG_ATTRIBUTE_USAGE_LOCS;
00056 
00063                 class COpenGlShaderProgram {
00064                 public :
00065                         // == Various constructors.
00066                         LSE_CALLCTOR                                                                                            COpenGlShaderProgram();
00067                         LSE_CALLCTOR                                                                                            ~COpenGlShaderProgram();
00068 
00069 
00070                         // == Functions.
00076                         LSVOID LSE_CALL                                                                                         AddShader( COpenGlCompiledShader * _pogcsShader );
00077 
00084                         COpenGlCompiledShader * LSE_CALL                                                        GetShader( CShaderLanguageParser::LSG_SHADER_TYPES _stShaderType );
00085 
00092                         const COpenGlCompiledShader * LSE_CALL                                          GetShader( CShaderLanguageParser::LSG_SHADER_TYPES _stShaderType ) const;
00093 
00102                         LSBOOL LSE_CALL                                                                                         Compile( const CShaderTranslationProcessorBase::LSG_UNIFORM_LIST * _pulUniforms,
00103                                 const CShaderTranslationProcessorBase::LSG_ATTRIBUTE_LIST * _palAttributes,
00104                                 CString &_sError );
00105 
00109                         LSVOID LSE_CALL                                                                                         Activate();
00110 
00116                         LSUINT32 LSE_CALL                                                                                       GetRef() const;
00117 
00123                         LSUINT32 LSE_CALL                                                                                       GetId() const;
00124 
00130                         const LSG_ATTRIBUTE_USAGE_LOCS * LSE_CALL                                       GetAttributeLocs() const;
00131 
00138                         CShaderBase::LSG_HANDLE LSE_CALL                                                        GetConstantByName( const LSCHAR * _pcName );
00139 
00147                         LSBOOL LSE_CALL                                                                                         SetFloat( CShaderBase::LSG_HANDLE _hHandle, LSFLOAT _fValue );
00148 
00157                         LSBOOL LSE_CALL                                                                                         SetFloatArray( CShaderBase::LSG_HANDLE _hHandle, const LSFLOAT * _pfValues, LSUINT32 _ui32Total );
00158 
00166                         LSBOOL LSE_CALL                                                                                         SetInt( CShaderBase::LSG_HANDLE _hHandle, LSINT32 _iValue );
00167 
00176                         LSBOOL LSE_CALL                                                                                         SetIntArray( CShaderBase::LSG_HANDLE _hHandle, const LSINT32 * _piValues, LSUINT32 _ui32Total );
00177 
00186                         LSBOOL LSE_CALL                                                                                         SetBoolArray( CShaderBase::LSG_HANDLE _hHandle, const LSBOOL * _pbValues, LSUINT32 _ui32Total );
00187 
00195                         LSBOOL LSE_CALL                                                                                         SetVector2( CShaderBase::LSG_HANDLE _hHandle, const CVector2 &_vValue );
00196 
00205                         LSBOOL LSE_CALL                                                                                         SetVector2Array( CShaderBase::LSG_HANDLE _hHandle, const CVector2 * _pvValues, LSUINT32 _ui32Total );
00206 
00214                         LSBOOL LSE_CALL                                                                                         SetVector3( CShaderBase::LSG_HANDLE _hHandle, const CVector3 &_vValue );
00215 
00224                         LSBOOL LSE_CALL                                                                                         SetVector3Array( CShaderBase::LSG_HANDLE _hHandle, const CVector3 * _pvValues, LSUINT32 _ui32Total );
00225 
00233                         LSBOOL LSE_CALL                                                                                         SetVector4( CShaderBase::LSG_HANDLE _hHandle, const CVector4 &_vValue );
00234 
00243                         LSBOOL LSE_CALL                                                                                         SetVector4Array( CShaderBase::LSG_HANDLE _hHandle, const CVector4 * _pvValues, LSUINT32 _ui32Total );
00244 
00252                         LSBOOL LSE_CALL                                                                                         SetMatrix2x2( CShaderBase::LSG_HANDLE _hHandle, const CMatrix2x2 &_mValue );
00253 
00261                         LSBOOL LSE_CALL                                                                                         SetMatrix3x3( CShaderBase::LSG_HANDLE _hHandle, const CMatrix3x3 &_mValue );
00262 
00270                         LSBOOL LSE_CALL                                                                                         SetMatrix4x4( CShaderBase::LSG_HANDLE _hHandle, const CMatrix4x4 &_mValue );
00271 
00280                         LSBOOL LSE_CALL                                                                                         SetMatrix4x4Array( CShaderBase::LSG_HANDLE _hHandle, const CMatrix4x4 * _pmValues, LSUINT32 _ui32Total );
00281 
00282 
00283                 protected :
00284                         // == Types.
00288                         typedef struct LSG_UNIFORM_MAP {
00292                                 LSUINTPTR                                                                                               uiptrApiId;
00293 
00297                                 LSUINT32                                                                                                ui32DataPtr;
00298 
00303                                 LSBOOL                                                                                                  bDirty;
00304 
00308                                 LSUINT32                                                                                                ui32Name;
00309 
00313                                 CShaderLanguageParser::LSG_SHADER_TYPES                                 stType;
00314                         } * LPLSG_UNIFORM_MAP, * const LPCLSG_UNIFORM_MAP;
00315 
00316 
00317                         // == Members.
00321                         COpenGlCompiledShader *                                                                         m_pogcsShader[CShaderLanguageParser::LSG_ST_TOTAL];
00322 
00326                         LSG_ATTRIBUTE_USAGE_LOCS *                                                                      m_paulLocs;
00327 
00331                         GLuint                                                                                                          m_uiProgram;
00332 
00336                         LSUINT32                                                                                                        m_ui32Ref;
00337 
00341                         CShaderTranslationProcessorBase::LSG_UNIFORM_LIST                       m_ulUniforms[CShaderLanguageParser::LSG_ST_TOTAL];
00342 
00346                         LSUINT32                                                                                                        m_ui32NextUniformStart;
00347 
00351                         CVectorPoD<LSUINT8, LSUINT32>                                                           m_vUniformBuffer;
00352 
00360                         CVectorPoD<LSG_UNIFORM_MAP>                                                                     m_vUniformDataMap;
00361 
00365                         CVectorPoD<LSUINT8, LSUINT32>                                                           m_vTempBuffer;
00366 
00367 
00368                         // == Functions.
00372                         LSVOID LSE_CALL                                                                                         IncRef();
00373 
00377                         LSVOID LSE_CALL                                                                                         DecRef();
00378 
00385                         static LSUINT32 LSE_CALL                                                                        ShaderSemanticToVertexAttribute( LSUINT32 _ui32Semantic );
00386 
00387                 private :
00388                         friend class                                                                                            COpenGlShaderProgramManager;
00389                 };
00390 
00391 
00392                 // == Functions.
00398                 static LSVOID LSE_CALL                                                                                  SetSharing( LSBOOL _bVal );
00399 
00412                 static COpenGlShaderProgram * LSE_CALL                                                  CreateShaderProgram( COpenGlCompiledShader * _pogcsVertexShader,
00413                         COpenGlCompiledShader * _pogcsPixelShader, COpenGlCompiledShader * _pogcsGeometryShader,
00414                         const CShaderTranslationProcessorBase::LSG_UNIFORM_LIST * _pulUniforms,
00415                         const CShaderTranslationProcessorBase::LSG_ATTRIBUTE_LIST * _palAttributes,
00416                         CString &_sError );
00417 
00424                 static LSVOID LSE_CALL                                                                                  DeleteShaderProgram( COpenGlShaderProgram * _pogspProgram );
00425 
00431                 static LSUINT32 LSE_CALL                                                                                DeleteUnreferencedShaderPrograms();
00432 
00433 
00434         protected :
00435                 // == Types.
00440                 typedef struct LSG_SHADER_PROGRAM_KEY {
00444                         LSUINT32                                                                                                        ui32VertexId;
00445 
00449                         LSUINT32                                                                                                        ui32PixelId;
00450 
00454                         LSUINT32                                                                                                        ui32GeometryId;
00455 
00456 
00457                         // == Various constructors.
00458                         LSE_CALLCTOR                                                                                            LSG_SHADER_PROGRAM_KEY();
00459                         
00460                         // == Operators.
00467                         LSBOOL LSE_CALL                                                                                         operator < ( const LSG_SHADER_PROGRAM_KEY &_spkOther ) const;
00468 
00475                         LSBOOL LSE_CALL                                                                                         operator == ( const LSG_SHADER_PROGRAM_KEY &_spkOther ) const;
00476                 } * LPLSG_SHADER_PROGRAM_KEY, * LPCLSG_SHADER_PROGRAM_KEY;
00477 
00478 
00479                 // == Members.
00480                 // Is sharing enabled?  Defaults to true.  Tools/editors should set this to false at program start.
00481                 static LSBOOL                                                                                                   m_bSharing;
00482 
00483                 // Map of shader programs.
00484                 static CMap<LSG_SHADER_PROGRAM_KEY, COpenGlShaderProgram *>             m_mShaders;
00485 
00486 
00487                 // == Functions.
00494                 static LSG_SHADER_PROGRAM_KEY LSE_CALL                                                  CreateKey( const COpenGlShaderProgram &_ogspProgram );
00495         };
00496 
00497 }       // namespace lsg
00498 
00499 #endif  // #if defined( LSG_OGL )
00500 
00501 #endif  // __LSG_OPENGLSHADERPROGRAMMANAGER_H__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator