"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSGraphicsLib/Src/ShaderLanguage/LSGShaderTranslationProcessorBase.h

00001 
00018 #ifndef __LSG_SHADERTRANSLATIONPROCESSORBASE_H__
00019 #define __LSG_SHADERTRANSLATIONPROCESSORBASE_H__
00020 
00021 #include "../LSGGraphicsLib.h"
00022 #include "LSGShaderLanguageParser.h"
00023 #include "LSGShaderParserWrapper.h"
00024 #include "LSGShaderSyntaxNodes.h"
00025 
00029 #define LSG_STB_OOM                                                                                     "Out of memory."
00030 
00031 namespace lsg {
00032 
00042         class CShaderTranslationProcessorBase {
00043         public :
00044                 // == Various constructors.
00045                 LSE_CALLCTOR                                                                            CShaderTranslationProcessorBase();
00046                 virtual LSE_CALLCTOR                                                            ~CShaderTranslationProcessorBase();
00047 
00048 
00049                 // == Enumerations.
00053                 enum LSG_ERROR_CODES {
00054                         LSG_EC_SUCCESS,                                                                 
00055                         LSG_EC_INVALIDTREE,                                                             
00056                         LSG_EC_OUTOFMEMORY,                                                             
00057                         LSG_EC_PROCESSINGERROR,                                                 
00058                         LSG_EC_NOMAIN,                                                                  
00059                         LSG_EC_MAINOVERLOADED,                                                  
00060                 };
00061 
00065                 enum LSG_PROCESSING_DIRECTIVE {
00066                         LSG_PD_CONTINUE,                                                                
00067                         LSG_PD_SKIP_SUB_NODES,                                                  
00068                         LSG_PD_ERROR,                                                                   
00069                 };
00070 
00071 
00072                 // == Types.
00076                 typedef struct LSG_STACK_OBJ {
00077                         // == Enumerations.
00081                         enum LSG_BITS {
00082                                 LSG_B_INMAIN                                                            = (1 << 0),
00083                                 LSG_B_INSTRUCTDEF                                                       = (1 << 1),
00084                                 LSG_B_ISFUNCDEF                                                         = (1 << 2),
00085                                 LSG_B_DONOTREPLACE                                                      = (1 << 3),
00086                         };
00087 
00088 
00092                         CString                                                                                 sNodeString;
00093 
00097                         LSUINT32                                                                                ui32Index;
00098 
00102                         LSUINT32                                                                                ui32ParentIndex;
00103 
00107                         union {
00108                                 LSUINT32                                                                        ui32Data;
00109                                 LSUINT32                                                                        ui32InMain                              : 1;
00110                                 LSUINT32                                                                        ui32InStructDef                 : 1;
00111                                 LSUINT32                                                                        ui32IsFuncDef                   : 1;
00112                                 LSUINT32                                                                        ui32DoNotReplace                : 1;
00113                         }                                                                                               u;
00114 
00118                         LSBOOL                                                                                  bPassThrough;
00119 
00123                         CString                                                                                 sPreFix;
00124 
00128                         CString                                                                                 sPostFix;
00129                 } * LPLSG_STACK_OBJ, * const LPCLSG_STACK_OBJ;
00130 
00136                 typedef struct LSG_UNIFORM_SEMANTIC {
00140                         CString                                                                                 sName;
00141 
00145                         LSUINT64                                                                                ui64Type;
00146 
00150                         LSUINT32                                                                                ui32SemanticType;
00151 
00155                         LSUINT32                                                                                ui32SemanticIndex;
00156                 } * LPLSG_UNIFORM_SEMANTIC, * const LPCLSG_UNIFORM_SEMANTIC;
00157 
00161                 typedef CVector<LSG_UNIFORM_SEMANTIC>                           LSG_UNIFORM_SEMANTIC_LIST;
00162 
00166                 typedef struct LSG_UNIFORM {
00170                         CString                                                                                 sName;
00171 
00175                         LSUINT64                                                                                ui64Type;
00176 
00180                         LSUINT32                                                                                ui32Array;
00181 
00185                         LSUINT32                                                                                ui32Size;
00186 
00190                         LSUINTPTR                                                                               uiptrApiSpecific;
00191 
00195                         LSUINTPTR                                                                               uiptrApiParam;
00196                 } * LPLSG_UNIFORM, * const LPCLSG_UNIFORM;
00197 
00201                 typedef CVector<LSG_UNIFORM>                                            LSG_UNIFORM_LIST, * LPLSG_UNIFORM_LIST, * const LPCLSG_UNIFORM_LIST;
00202 
00206                 typedef struct LSG_ATTRIBUTE {
00210                         CString                                                                                 sName;
00211 
00215                         LSUINT64                                                                                ui64Type;
00216 
00220                         LSUINT32                                                                                ui32SemanticType;
00221 
00225                         LSUINT32                                                                                ui32SemanticIndex;
00226 
00230                         LSBOOL                                                                                  bInput;
00231                 } * LPLSG_ATTRIBUTE, * const LPCLSG_ATTRIBUTE;
00232 
00236                 typedef CVector<LSG_ATTRIBUTE>                                          LSG_ATTRIBUTE_LIST;
00237 
00241                 typedef struct LSG_NODE_TYPE {
00245                         LSUINT64                                                                                ui64Type;
00246 
00250                         LSUINT32                                                                                ui32Array;
00251 
00255                         LSBOOL                                                                                  bIsExplicit;
00256 
00260                         LSUINT32                                                                                ui32Scope;
00261 
00265                         CShaderScope::LSG_TYPE                                                  tType;
00266 
00270                         LSBOOL                                                                                  bUniform;
00271 
00272 
00273                         // == Various contrsuctors.
00274                         LSE_CALLCTOR                                                                    LSG_NODE_TYPE();
00275                 } * LPLSG_NODE_TYPE, * const LPCLSG_NODE_TYPE;
00276 
00280                 typedef CVectorPoD<LSG_NODE_TYPE>                                       LSG_NODE_TYPE_LIST, * LPLSG_NODE_TYPE_LIST, * const LPCLSG_NODE_TYPE_LIST;
00281 
00282                 
00283                 // == Functions.
00293                 LSG_ERROR_CODES LSE_CALL                                                        ProcessSyntaxTree( CShaderLanguageParser &_slpContainer, CString &_sResult, CString &_sError );
00294 
00301                 LSBOOL LSE_CALL                                                                         CopyGlobalSemantics( LSG_UNIFORM_SEMANTIC_LIST &_uslOut ) const;
00302 
00309                 LSBOOL LSE_CALL                                                                         CopyGlobalUniforms( LSG_UNIFORM_LIST &_ulOut ) const;
00310 
00317                 LSBOOL LSE_CALL                                                                         CopyAttributes( LSG_ATTRIBUTE_LIST &_aOut ) const;
00318 
00327                 LSBOOL LSE_CALL                                                                         GetNodeType( LSUINT32 _ui32NodeIndex, LSG_NODE_TYPE_LIST &_ntlRet ) const;
00328 
00329         protected :
00330                 // == Types.
00334                 typedef CVector<LSG_STACK_OBJ, LSUINT32>                        LSG_NODE_STACK;
00335 
00339                 typedef struct LSG_NODE_CALLBACK {
00343                         CShaderLanguageParser *                                                 pslpContainer;
00344 
00348                         const LSG_SHADER_SYNTAX_NODES::LSG_NODE_DATA *  pndNode;
00349 
00353                         LSG_NODE_STACK *                                                                pnsNodeStack;
00354 
00358                         CString *                                                                               psShaderText;
00359 
00363                         CString *                                                                               psResult;
00364 
00368                         CString                                                                                 sError;
00369 
00373                         LSUINT32                                                                                ui32Index;
00374 
00378                         LSUINT32                                                                                ui32ParentIndex;
00379 
00383                         LSUINT32                                                                                ui32Data;
00384                 } * LPLSG_NODE_CALLBACK, * const LPCLSG_NODE_CALLBACK;
00385                 
00386 
00387 
00388                 // == Members.
00393                 CShaderScopeStack                                                                       m_sssScopes;
00394                 
00398                 LSBOOL                                                                                          m_bHaveMain;
00399 
00403                 LSBOOL                                                                                          m_bDefiningMain;
00404 
00408                 CVectorPoD<LSUINT32, LSUINT32>                                          m_vMainParms;
00409 
00413                 CVectorPoD<LSUINT32, LSUINT32>                                          m_vLastParms;
00414 
00418                 LSBOOL                                                                                          m_bMultiPixelOutputs;
00419 
00423                 CShaderLanguageParser *                                                         m_pslpContainer;
00424 
00428                 LSG_UNIFORM_SEMANTIC_LIST                                                       m_uslGlobalSemantics;
00429 
00433                 LSG_UNIFORM_LIST                                                                        m_ulGlobalUniforms;
00434 
00438                 LSG_ATTRIBUTE_LIST                                                                      m_alAttributes;
00439 
00440 
00441                 // == Functions.
00453                 static LSBOOL LSE_CALL                                                          PushNode( LSG_NODE_STACK &_nsStack, LSUINT32 _ui32Index, LSUINT32 _ui32ParentIndex, LSUINT32 _ui32Data = 0UL, const LSCHAR * _pcPostFix = NULL, const LSCHAR * _pcPreFix = NULL );
00454 
00455 
00456         protected :
00457                 // == Functions.
00464                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       DefaultNodeHandler( LSG_NODE_CALLBACK &_ncData );
00465 
00472                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       DefaultNodePostHandler( LSG_NODE_CALLBACK &_ncData );
00473 
00481                 virtual LSBOOL LSE_CALL                                                         PostShaderString( CString &_sShader, CString &_sError );
00482 
00490                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleExternalDeclarationList( LSG_NODE_CALLBACK &_ncData );
00491 
00499                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleDiscard( LSG_NODE_CALLBACK &_ncData );
00500 
00508                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleReturn( LSG_NODE_CALLBACK &_ncData );
00509 
00517                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleBreak( LSG_NODE_CALLBACK &_ncData );
00518 
00526                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleContinue( LSG_NODE_CALLBACK &_ncData );
00527 
00535                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleFor( LSG_NODE_CALLBACK &_ncData );
00536 
00544                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleDoWhile( LSG_NODE_CALLBACK &_ncData );
00545 
00553                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleWhile( LSG_NODE_CALLBACK &_ncData );
00554 
00562                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleForInit( LSG_NODE_CALLBACK &_ncData );
00563 
00571                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleIfElse( LSG_NODE_CALLBACK &_ncData );
00572 
00580                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleFunctionDefinition( LSG_NODE_CALLBACK &_ncData );
00581 
00589                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleFunctionDeclaration( LSG_NODE_CALLBACK &_ncData );
00590 
00598                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleParamaterDeclarationList( LSG_NODE_CALLBACK &_ncData );
00599 
00607                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleParamaterDeclaration( LSG_NODE_CALLBACK &_ncData );
00608 
00616                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleParamaterDeclarator( LSG_NODE_CALLBACK &_ncData );
00617 
00625                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleStruct( LSG_NODE_CALLBACK &_ncData );
00626 
00634                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleStructDeclarationList( LSG_NODE_CALLBACK &_ncData );
00635 
00643                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleStructDeclaration( LSG_NODE_CALLBACK &_ncData );
00644 
00652                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleStructDeclaratorList( LSG_NODE_CALLBACK &_ncData );
00653 
00661                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleStructDeclarator( LSG_NODE_CALLBACK &_ncData );
00662 
00670                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleBlankStatement( LSG_NODE_CALLBACK &_ncData );
00671 
00679                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleNewScopeStatement( LSG_NODE_CALLBACK &_ncData );
00680 
00688                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleStatementList( LSG_NODE_CALLBACK &_ncData );
00689 
00697                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleInitList( LSG_NODE_CALLBACK &_ncData );
00698 
00706                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleInitListWrap( LSG_NODE_CALLBACK &_ncData );
00707 
00715                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleSingleDeclaration( LSG_NODE_CALLBACK &_ncData );
00716 
00724                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleSemantic( LSG_NODE_CALLBACK &_ncData );
00725 
00733                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleFullySpecifiedType( LSG_NODE_CALLBACK &_ncData );
00734 
00742                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleTypeSpecifierNoPrecision( LSG_NODE_CALLBACK &_ncData );
00743 
00751                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleDeclarationStatement( LSG_NODE_CALLBACK &_ncData );
00752 
00760                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleExpressionStatement( LSG_NODE_CALLBACK &_ncData );
00761 
00769                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleConstructor( LSG_NODE_CALLBACK &_ncData );
00770 
00778                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleFieldSelect( LSG_NODE_CALLBACK &_ncData );
00779 
00787                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleFunctionCall( LSG_NODE_CALLBACK &_ncData );
00788 
00796                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleArgList( LSG_NODE_CALLBACK &_ncData );
00797 
00805                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleIntrinsic( LSG_NODE_CALLBACK &_ncData );
00806 
00814                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleComma( LSG_NODE_CALLBACK &_ncData );
00815 
00823                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleAssignment( LSG_NODE_CALLBACK &_ncData );
00824 
00832                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleTertiary( LSG_NODE_CALLBACK &_ncData );
00833 
00841                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleMath( LSG_NODE_CALLBACK &_ncData );
00842 
00850                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleCast( LSG_NODE_CALLBACK &_ncData );
00851 
00859                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleUnary( LSG_NODE_CALLBACK &_ncData );
00860 
00868                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandlePrefixDecrement( LSG_NODE_CALLBACK &_ncData );
00869 
00877                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandlePrefixIncrement( LSG_NODE_CALLBACK &_ncData );
00878 
00886                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandlePostfixDecrement( LSG_NODE_CALLBACK &_ncData );
00887 
00895                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandlePostfixIncrement( LSG_NODE_CALLBACK &_ncData );
00896 
00904                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleArrayAccess( LSG_NODE_CALLBACK &_ncData );
00905 
00913                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleIdentifier( LSG_NODE_CALLBACK &_ncData );
00914 
00922                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleBoolean( LSG_NODE_CALLBACK &_ncData );
00923 
00931                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleNumeric( LSG_NODE_CALLBACK &_ncData );
00932 
00940                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       HandleString( LSG_NODE_CALLBACK &_ncData );
00941 
00948                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       RegisterVariableWithCurrentScope( LSG_NODE_CALLBACK &_ncData );
00949 
00956                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       RegisterFunctionWithCurrentScope( LSG_NODE_CALLBACK &_ncData );
00957 
00964                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       RegisterStructWithCurrentScope( LSG_NODE_CALLBACK &_ncData );
00965 
00972                 virtual LSG_PROCESSING_DIRECTIVE LSE_CALL                       RegisterParmsWithNewScope( LSG_NODE_CALLBACK &_ncData );
00973 
00981                 virtual LSBOOL LSE_CALL                                                         DecodeTypeQualifier( LSUINT64 _ui64Qualifier, CString &_sString );
00982 
00990                 virtual LSBOOL LSE_CALL                                                         DecodeType( LSUINT64 _ui64Type, CString &_sString );
00991 
00999                 LSVOID LSE_CALL                                                                         PrintError( CString &_sError, const LSCHAR * _pcError, const LSG_NODE_CALLBACK &_ncData ) const;
01000 
01008                 LSBOOL LSE_CALL                                                                         HasParentOfType( const LSG_NODE_CALLBACK &_ncData, LSG_NODE _nType ) const;
01009 
01017                 const LSG_STACK_OBJ * LSE_CALL                                          GetParentOfType( const LSG_NODE_CALLBACK &_ncData, LSG_NODE _nType ) const;
01018 
01019         };
01020 
01021 }       // namespace lsg
01022 
01023 #endif  // __LSG_SHADERTRANSLATIONPROCESSORBASE_H__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator