"L. Spiro Engine"
|
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__