Browse Source

Updated BSL grammar for technique naming and inheritance

BearishSun 8 years ago
parent
commit
8d2225edcf

+ 1 - 4
Source/BansheeSL/BsLexerFX.l

@@ -48,6 +48,7 @@ false			{ yylval->intValue = 0; return TOKEN_BOOLEAN; }
 	/* Shader keywords */
 	/* Shader keywords */
 options			{ return TOKEN_OPTIONS; }
 options			{ return TOKEN_OPTIONS; }
 technique		{ return TOKEN_TECHNIQUE; }
 technique		{ return TOKEN_TECHNIQUE; }
+mixin			{ return TOKEN_MIXIN; }
 
 
 	/* Options keywords */
 	/* Options keywords */
 separable		{ return TOKEN_SEPARABLE; }
 separable		{ return TOKEN_SEPARABLE; }
@@ -102,10 +103,6 @@ source				{ return TOKEN_SOURCE; }
 dest				{ return TOKEN_DEST; }
 dest				{ return TOKEN_DEST; }
 op					{ return TOKEN_OP; }
 op					{ return TOKEN_OP; }
 
 
-	/* Qualifiers */
-base				{ return TOKEN_BASE; }
-inherits			{ return TOKEN_INHERITS; }
-
 	/* State values */
 	/* State values */
 wire			{ yylval->intValue = FMV_Wire; return TOKEN_FILLMODEVALUE; }
 wire			{ yylval->intValue = FMV_Wire; return TOKEN_FILLMODEVALUE; }
 solid			{ yylval->intValue = FMV_Solid; return TOKEN_FILLMODEVALUE; }
 solid			{ yylval->intValue = FMV_Solid; return TOKEN_FILLMODEVALUE; }

+ 20 - 24
Source/BansheeSL/BsParserFX.y

@@ -80,11 +80,8 @@ typedef struct YYLTYPE {
 %token <intValue>	TOKEN_BLENDOPVALUE
 %token <intValue>	TOKEN_BLENDOPVALUE
 %token <intValue>	TOKEN_COLORMASK
 %token <intValue>	TOKEN_COLORMASK
 
 
-	/* Qualifiers */
-%token TOKEN_BASE TOKEN_INHERITS
-
 	/* Shader keywords */
 	/* Shader keywords */
-%token TOKEN_OPTIONS TOKEN_TECHNIQUE
+%token TOKEN_OPTIONS TOKEN_TECHNIQUE TOKEN_MIXIN
 
 
 	/* Options keywords */
 	/* Options keywords */
 %token TOKEN_SEPARABLE TOKEN_SORT TOKEN_PRIORITY TOKEN_TRANSPARENT
 %token TOKEN_SEPARABLE TOKEN_SORT TOKEN_PRIORITY TOKEN_TRANSPARENT
@@ -97,19 +94,19 @@ typedef struct YYLTYPE {
 %token TOKEN_BLEND TOKEN_RASTER TOKEN_DEPTH TOKEN_STENCIL
 %token TOKEN_BLEND TOKEN_RASTER TOKEN_DEPTH TOKEN_STENCIL
 
 
 	/* Rasterizer state keywords */
 	/* Rasterizer state keywords */
-%token	TOKEN_FILLMODE TOKEN_CULLMODE TOKEN_DEPTHBIAS TOKEN_SDEPTHBIAS
-%token	TOKEN_DEPTHCLIP TOKEN_SCISSOR TOKEN_MULTISAMPLE TOKEN_AALINE
+%token TOKEN_FILLMODE TOKEN_CULLMODE TOKEN_DEPTHBIAS TOKEN_SDEPTHBIAS
+%token TOKEN_DEPTHCLIP TOKEN_SCISSOR TOKEN_MULTISAMPLE TOKEN_AALINE
 
 
 	/* Depth state keywords */
 	/* Depth state keywords */
-%token	TOKEN_DEPTHREAD TOKEN_DEPTHWRITE TOKEN_COMPAREFUNC
+%token TOKEN_DEPTHREAD TOKEN_DEPTHWRITE TOKEN_COMPAREFUNC
 
 
 	/* Stencil state keywords */
 	/* Stencil state keywords */
 %token TOKEN_STENCILREF TOKEN_ENABLED TOKEN_READMASK TOKEN_WRITEMASK 
 %token TOKEN_STENCILREF TOKEN_ENABLED TOKEN_READMASK TOKEN_WRITEMASK 
 %token TOKEN_STENCILOPFRONT TOKEN_STENCILOPBACK TOKEN_FAIL TOKEN_ZFAIL
 %token TOKEN_STENCILOPFRONT TOKEN_STENCILOPBACK TOKEN_FAIL TOKEN_ZFAIL
 
 
 	/* Blend state keywords */
 	/* Blend state keywords */
-%token	TOKEN_ALPHATOCOVERAGE TOKEN_INDEPENDANTBLEND TOKEN_TARGET TOKEN_INDEX
-%token	TOKEN_COLOR TOKEN_ALPHA TOKEN_SOURCE TOKEN_DEST TOKEN_OP
+%token TOKEN_ALPHATOCOVERAGE TOKEN_INDEPENDANTBLEND TOKEN_TARGET TOKEN_INDEX
+%token TOKEN_COLOR TOKEN_ALPHA TOKEN_SOURCE TOKEN_DEST TOKEN_OP
 
 
 %type <nodePtr>		shader;
 %type <nodePtr>		shader;
 %type <nodeOption>	shader_statement;
 %type <nodeOption>	shader_statement;
@@ -162,8 +159,6 @@ typedef struct YYLTYPE {
 %type <nodePtr>		blend_alpha_header;
 %type <nodePtr>		blend_alpha_header;
 %type <nodeOption>	blenddef_option;
 %type <nodeOption>	blenddef_option;
 
 
-%type <nodeOption> technique_qualifier
-
 %%
 %%
 
 
 	/* Shader */
 	/* Shader */
@@ -206,14 +201,25 @@ options_option
 	/* Technique */
 	/* Technique */
 
 
 technique
 technique
-	: technique_header technique_qualifier_list '{' technique_body '}' ';' { nodePop(parse_state); $$ = $1; }
+	: technique_header '{' technique_body '}' ';' { nodePop(parse_state); $$ = $1; }
 	;
 	;
 
 
 technique_header
 technique_header
-	: TOKEN_TECHNIQUE
+	: TOKEN_TECHNIQUE TOKEN_IDENTIFIER
 		{ 
 		{ 
 			$$ = nodeCreate(parse_state->memContext, NT_Technique); 
 			$$ = nodeCreate(parse_state->memContext, NT_Technique); 
 			nodePush(parse_state, $$);
 			nodePush(parse_state, $$);
+			
+			NodeOption entry; entry.type = OT_Identifier; entry.value.strValue = $2;
+			nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &entry); 
+		}
+	| TOKEN_MIXIN TOKEN_IDENTIFIER
+		{ 
+			$$ = nodeCreate(parse_state->memContext, NT_Mixin); 
+			nodePush(parse_state, $$);
+			
+			NodeOption entry; entry.type = OT_Identifier; entry.value.strValue = $2;
+			nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &entry); 
 		}
 		}
 	;
 	;
 
 
@@ -231,6 +237,7 @@ technique_statement
 
 
 technique_option
 technique_option
 	: TOKEN_RENDERER '=' TOKEN_STRING ';'	{ $$.type = OT_Renderer; $$.value.strValue = $3; }
 	: TOKEN_RENDERER '=' TOKEN_STRING ';'	{ $$.type = OT_Renderer; $$.value.strValue = $3; }
+	| TOKEN_MIXIN TOKEN_IDENTIFIER ';'		{ $$.type = OT_Mixin; $$.value.strValue = $2; }
 	| tags									{ $$.type = OT_Tags; $$.value.nodePtr = $1; }
 	| tags									{ $$.type = OT_Tags; $$.value.nodePtr = $1; }
 	;
 	;
 	
 	
@@ -261,17 +268,6 @@ tags_body
 		}	
 		}	
 	;
 	;
 
 
-	/* Technique qualifiers */
-technique_qualifier_list
-	: /* empty */
-	| technique_qualifier technique_qualifier_list		{ nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
-	;
-
-technique_qualifier
-	: ':' TOKEN_BASE '(' TOKEN_STRING ')'		{ $$.type = OT_Base; $$.value.strValue = $4; }
-	| ':' TOKEN_INHERITS '(' TOKEN_STRING ')'	{ $$.type = OT_Inherits; $$.value.strValue = $4; }
-	;	
-	
 	/* Pass */
 	/* Pass */
 
 
 pass
 pass

+ 2 - 2
Source/BansheeSL/Include/BsASTFX.h

@@ -11,6 +11,7 @@ enum tagNodeType
 	NT_Shader,
 	NT_Shader,
 	NT_Options,
 	NT_Options,
 	NT_Technique,
 	NT_Technique,
+	NT_Mixin,
 	NT_Pass,
 	NT_Pass,
 	NT_Blend,
 	NT_Blend,
 	NT_Raster,
 	NT_Raster,
@@ -38,6 +39,7 @@ enum tagOptionType
 	OT_Sort,
 	OT_Sort,
 	OT_Transparent,
 	OT_Transparent,
 	OT_Technique,
 	OT_Technique,
+	OT_Mixin,
 	OT_Raster,
 	OT_Raster,
 	OT_Depth,
 	OT_Depth,
 	OT_Stencil,
 	OT_Stencil,
@@ -78,8 +80,6 @@ enum tagOptionType
 	OT_StencilRef,
 	OT_StencilRef,
 	OT_Tags,
 	OT_Tags,
 	OT_TagValue,
 	OT_TagValue,
-	OT_Base,
-	OT_Inherits,
 	OT_Count
 	OT_Count
 };
 };
 
 

+ 6 - 4
Source/BansheeSL/Include/BsSLFXCompiler.h

@@ -63,12 +63,14 @@ namespace bs
 		/** Information describing a technique, without the actual contents. */
 		/** Information describing a technique, without the actual contents. */
 		struct TechniqueMetaData
 		struct TechniqueMetaData
 		{
 		{
-			StringID renderer = RendererAny;
-			Vector<StringID> tags;
+			String name;
+			Vector<String> includes;
+			bool isMixin;
+
 			String language;
 			String language;
+			StringID renderer = RendererAny;
 
 
-			String baseName;
-			Vector<String> inherits;
+			Vector<StringID> tags;
 		};
 		};
 
 
 		/** Temporary data for describing a technique during parsing. */
 		/** Temporary data for describing a technique during parsing. */

+ 1 - 2
Source/BansheeSL/Source/BsASTFX.c

@@ -13,6 +13,7 @@ OptionInfo OPTION_LOOKUP[] =
 	{ OT_Sort, ODT_Int },
 	{ OT_Sort, ODT_Int },
 	{ OT_Transparent, ODT_Bool },
 	{ OT_Transparent, ODT_Bool },
 	{ OT_Technique, ODT_Complex }, 
 	{ OT_Technique, ODT_Complex }, 
+	{ OT_Mixin, ODT_Complex },
 	{ OT_Raster, ODT_Complex },
 	{ OT_Raster, ODT_Complex },
 	{ OT_Depth, ODT_Complex },
 	{ OT_Depth, ODT_Complex },
 	{ OT_Stencil, ODT_Complex },
 	{ OT_Stencil, ODT_Complex },
@@ -53,8 +54,6 @@ OptionInfo OPTION_LOOKUP[] =
 	{ OT_StencilRef, ODT_Int },
 	{ OT_StencilRef, ODT_Int },
 	{ OT_Tags, ODT_Complex },
 	{ OT_Tags, ODT_Complex },
 	{ OT_TagValue, ODT_String },
 	{ OT_TagValue, ODT_String },
-	{ OT_Base, ODT_String },
-	{ OT_Inherits, ODT_String }
 };
 };
 
 
 NodeOptions* nodeOptionsCreate(void* context)
 NodeOptions* nodeOptionsCreate(void* context)

+ 15 - 12
Source/BansheeSL/Source/BsSLFXCompiler.cpp

@@ -418,6 +418,7 @@ namespace bs
 
 
 		metaData.renderer = RendererAny;
 		metaData.renderer = RendererAny;
 		metaData.language = "hlsl";
 		metaData.language = "hlsl";
+		metaData.isMixin = technique->type == NT_Mixin;
 
 
 		for (int i = 0; i < technique->options->count; i++)
 		for (int i = 0; i < technique->options->count; i++)
 		{
 		{
@@ -440,11 +441,11 @@ namespace bs
 				}
 				}
 			}
 			}
 				break;
 				break;
-			case OT_Base:
-				metaData.baseName = removeQuotes(option->value.strValue);
+			case OT_Identifier:
+				metaData.name = option->value.strValue;
 				break;
 				break;
-			case OT_Inherits:
-				metaData.inherits.push_back(removeQuotes(option->value.strValue));
+			case OT_Mixin:
+				metaData.includes.push_back(option->value.strValue);
 				break;
 				break;
 			default:
 			default:
 				break;
 				break;
@@ -1192,16 +1193,18 @@ namespace bs
 		std::function<bool(const TechniqueMetaData&, TechniqueData&)> parseInherited = 
 		std::function<bool(const TechniqueMetaData&, TechniqueData&)> parseInherited = 
 			[&](const TechniqueMetaData& metaData, TechniqueData& outTechnique)
 			[&](const TechniqueMetaData& metaData, TechniqueData& outTechnique)
 		{
 		{
-			for (auto riter = metaData.inherits.rbegin(); riter != metaData.inherits.rend(); ++riter)
+			for (auto riter = metaData.includes.rbegin(); riter != metaData.includes.rend(); ++riter)
 			{
 			{
-				const String& inherits = *riter;
+				const String& includes = *riter;
 
 
 				UINT32 baseIdx = -1;
 				UINT32 baseIdx = -1;
 				for(UINT32 i = 0; i < (UINT32)techniqueData.size(); i++)
 				for(UINT32 i = 0; i < (UINT32)techniqueData.size(); i++)
 				{
 				{
 					auto& entry = techniqueData[i];
 					auto& entry = techniqueData[i];
+					if (!entry.second.metaData.isMixin)
+						continue;
 
 
-					if (entry.second.metaData.baseName == inherits)
+					if (entry.second.metaData.name == includes)
 					{
 					{
 						bool matches = entry.second.metaData.language == metaData.language || entry.second.metaData.language == "Any";
 						bool matches = entry.second.metaData.language == metaData.language || entry.second.metaData.language == "Any";
 						matches &= entry.second.metaData.renderer == metaData.renderer || entry.second.metaData.renderer == RendererAny;
 						matches &= entry.second.metaData.renderer == metaData.renderer || entry.second.metaData.renderer == RendererAny;
@@ -1217,7 +1220,7 @@ namespace bs
 					auto& entry = techniqueData[baseIdx];
 					auto& entry = techniqueData[baseIdx];
 
 
 					// Was already parsed previously, don't parse it multiple times (happens when multiple techniques 
 					// Was already parsed previously, don't parse it multiple times (happens when multiple techniques 
-					// include the same base)
+					// include the same mixin)
 					if (techniqueWasParsed[baseIdx])
 					if (techniqueWasParsed[baseIdx])
 						continue;
 						continue;
 
 
@@ -1230,7 +1233,7 @@ namespace bs
 				}
 				}
 				else
 				else
 				{
 				{
-					output.errorMessage = "Base technique \"" + inherits + "\" cannot be found.";
+					output.errorMessage = "Base technique \"" + includes + "\" cannot be found.";
 					return false;
 					return false;
 				}
 				}
 			}
 			}
@@ -1243,7 +1246,7 @@ namespace bs
 		for (auto& entry : techniqueData)
 		for (auto& entry : techniqueData)
 		{
 		{
 			const TechniqueMetaData& metaData = entry.second.metaData;
 			const TechniqueMetaData& metaData = entry.second.metaData;
-			if (!metaData.baseName.empty())
+			if (metaData.isMixin)
 				continue;
 				continue;
 
 
 			bs_zero_out(techniqueWasParsed, techniqueData.size());
 			bs_zero_out(techniqueWasParsed, techniqueData.size());
@@ -1263,7 +1266,7 @@ namespace bs
 		for(UINT32 i = 0; i < end; i++)
 		for(UINT32 i = 0; i < end; i++)
 		{
 		{
 			const TechniqueMetaData& metaData = techniqueData[i].second.metaData;
 			const TechniqueMetaData& metaData = techniqueData[i].second.metaData;
-			if (!metaData.baseName.empty())
+			if (metaData.isMixin)
 				continue;
 				continue;
 
 
 			auto createTechniqueForLanguage = [](const String& name, const TechniqueData& orig, bool vulkan)
 			auto createTechniqueForLanguage = [](const String& name, const TechniqueData& orig, bool vulkan)
@@ -1326,7 +1329,7 @@ namespace bs
 		for(auto& entry : techniqueData)
 		for(auto& entry : techniqueData)
 		{
 		{
 			const TechniqueMetaData& metaData = entry.second.metaData;
 			const TechniqueMetaData& metaData = entry.second.metaData;
-			if (!metaData.baseName.empty())
+			if (metaData.isMixin)
 				continue;
 				continue;
 
 
 			Map<UINT32, SPtr<Pass>, std::greater<UINT32>> passes;
 			Map<UINT32, SPtr<Pass>, std::greater<UINT32>> passes;