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