From: Nikolay Sivov nsivov@codeweavers.com
--- libs/vkd3d-shader/hlsl.c | 3 ++ libs/vkd3d-shader/hlsl.l | 21 +++++++++++-- libs/vkd3d-shader/hlsl.y | 68 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 88 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index d15abe50..64a6c4df 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -2846,6 +2846,9 @@ static void declare_predefined_types(struct hlsl_ctx *ctx) {"TEXTURE", HLSL_CLASS_OBJECT, HLSL_TYPE_TEXTURE, 1, 1}, {"PIXELSHADER", HLSL_CLASS_OBJECT, HLSL_TYPE_PIXELSHADER, 1, 1}, {"VERTEXSHADER", HLSL_CLASS_OBJECT, HLSL_TYPE_VERTEXSHADER, 1, 1}, + {"technique", HLSL_CLASS_OBJECT, HLSL_TYPE_VOID, 1, 1}, + {"technique10", HLSL_CLASS_OBJECT, HLSL_TYPE_VOID, 1, 1}, + {"technique11", HLSL_CLASS_OBJECT, HLSL_TYPE_VOID, 1, 1}, };
for (bt = 0; bt <= HLSL_TYPE_LAST_SCALAR; ++bt) diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l index 59f31fcd..b45046a3 100644 --- a/libs/vkd3d-shader/hlsl.l +++ b/libs/vkd3d-shader/hlsl.l @@ -56,6 +56,10 @@ DOUBLESLASHCOMMENT "//"[^\n]* STRING "[^"]*" IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
+TECHNIQUE [Tt][Ee][Cc][Hh][Nn][Ii][Qq][Uu][Ee] +TECHNIQUE10 [Tt][Ee][Cc][Hh][Nn][Ii][Qq][Uu][Ee]10 +TECHNIQUE11 [Tt][Ee][Cc][Hh][Nn][Ii][Qq][Uu][Ee]11 + ANY (.)
%% @@ -121,8 +125,21 @@ string {return KW_STRING; } struct {return KW_STRUCT; } switch {return KW_SWITCH; } tbuffer {return KW_TBUFFER; } -technique {return KW_TECHNIQUE; } -technique10 {return KW_TECHNIQUE10; } +{TECHNIQUE} { + struct hlsl_ctx *ctx = yyget_extra(yyscanner); + yylval->name = hlsl_strdup(ctx, yytext); + return KW_TECHNIQUE; + } +{TECHNIQUE10} { + struct hlsl_ctx *ctx = yyget_extra(yyscanner); + yylval->name = hlsl_strdup(ctx, yytext); + return KW_TECHNIQUE10; + } +{TECHNIQUE11} { + struct hlsl_ctx *ctx = yyget_extra(yyscanner); + yylval->name = hlsl_strdup(ctx, yytext); + return KW_TECHNIQUE11; + } texture {return KW_TEXTURE; } texture1D {return KW_TEXTURE1D; } Texture1D {return KW_TEXTURE1D; } diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 4b26a179..c59e431e 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -3745,6 +3745,26 @@ static bool add_method_call(struct hlsl_ctx *ctx, struct list *instrs, struct hl } }
+static bool hlsl_validate_technique_token(struct hlsl_ctx *ctx, const char *token) +{ + if (ctx->profile->type != VKD3D_SHADER_TYPE_EFFECT) + return true; + + switch (ctx->profile->major_version) + { + case 2: + return !strcmp(token, "technique"); + case 4: + return !strcmp(token, "technique10"); + case 5: + return !strcmp(token, "technique11"); + default: + vkd3d_unreachable(); + } + + return false; +} + }
%locations @@ -3837,8 +3857,6 @@ static bool add_method_call(struct hlsl_ctx *ctx, struct list *instrs, struct hl %token KW_STRUCT %token KW_SWITCH %token KW_TBUFFER -%token KW_TECHNIQUE -%token KW_TECHNIQUE10 %token KW_TEXTURE %token KW_TEXTURE1D %token KW_TEXTURE1DARRAY @@ -3925,6 +3943,9 @@ static bool add_method_call(struct hlsl_ctx *ctx, struct list *instrs, struct hl %token <name> NEW_IDENTIFIER %token <name> STRING %token <name> TYPE_IDENTIFIER +%token <name> KW_TECHNIQUE +%token <name> KW_TECHNIQUE10 +%token <name> KW_TECHNIQUE11
%type <arrays> arrays
@@ -3957,6 +3978,7 @@ static bool add_method_call(struct hlsl_ctx *ctx, struct list *instrs, struct hl
%type <name> any_identifier %type <name> var_identifier +%type <name> technique_name
%type <parameter> parameter
@@ -3994,8 +4016,50 @@ hlsl_prog: destroy_instr_list($2); } | hlsl_prog preproc_directive + | hlsl_prog technique | hlsl_prog ';'
+technique_name: + %empty + { + $$ = NULL; + } + | var_identifier + +pass_list: + %empty + +/* Exact name matching only happens for effect profiles and only for keywords specific to particular profile. + Other profiles allow insensitive matching. */ +technique9: + KW_TECHNIQUE technique_name '{' pass_list '}' + { + if (!hlsl_validate_technique_token(ctx, $1)) + hlsl_error(ctx, &@1, VKD3D_SHADER_ERROR_HLSL_NOT_DEFINED, "Identifier "%s" is not defined.", $1); + hlsl_fixme(ctx, &@$, "Unsupported keyword "%s".", $1); + } + +technique10: + KW_TECHNIQUE10 technique_name '{' pass_list '}' + { + if (!hlsl_validate_technique_token(ctx, $1)) + hlsl_error(ctx, &@1, VKD3D_SHADER_ERROR_HLSL_NOT_DEFINED, "Identifier "%s" is not defined.", $1); + hlsl_fixme(ctx, &@$, "Unsupported keyword "%s".", $1); + } + +technique11: + KW_TECHNIQUE11 technique_name '{' pass_list '}' + { + if (!hlsl_validate_technique_token(ctx, $1)) + hlsl_error(ctx, &@1, VKD3D_SHADER_ERROR_HLSL_NOT_DEFINED, "Identifier "%s" is not defined.", $1); + hlsl_fixme(ctx, &@$, "Unsupported keyword "%s".", $1); + } + +technique: + technique9 + | technique10 + | technique11 + buffer_declaration: buffer_type any_identifier colon_attribute {