[PATCH vkd3d v2 1/6] vkd3d-shader/hlsl: Parse state blocks in variable definitions.
Giovanni Mascellani
gmascellani at codeweavers.com
Tue Sep 28 03:39:21 CDT 2021
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
Il 28/09/21 03:51, Zebediah Figura ha scritto:
> Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
> ---
> Makefile.am | 1 +
> libs/vkd3d-shader/hlsl.h | 2 +
> libs/vkd3d-shader/hlsl.y | 54 ++++++-
> tests/hlsl-state-block-syntax.shader_test | 173 ++++++++++++++++++++++
> 4 files changed, 223 insertions(+), 7 deletions(-)
> create mode 100644 tests/hlsl-state-block-syntax.shader_test
>
> diff --git a/Makefile.am b/Makefile.am
> index 4a2bf8e18..bc33e0f60 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -74,6 +74,7 @@ vkd3d_shader_tests = \
> tests/hlsl-return-implicit-conversion.shader_test \
> tests/hlsl-return-void.shader_test \
> tests/hlsl-shape.shader_test \
> + tests/hlsl-state-block-syntax.shader_test \
> tests/hlsl-static-initializer.shader_test \
> tests/hlsl-storage-qualifiers.shader_test \
> tests/hlsl-struct-assignment.shader_test \
> diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
> index 27afeedd4..abc870f4f 100644
> --- a/libs/vkd3d-shader/hlsl.h
> +++ b/libs/vkd3d-shader/hlsl.h
> @@ -469,6 +469,8 @@ struct hlsl_ctx
> size_t count, size;
> } constant_defs;
> uint32_t temp_count;
> +
> + uint32_t in_state_block : 1;
> };
>
> enum hlsl_error_level
> diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
> index 19745e725..8ad892f9e 100644
> --- a/libs/vkd3d-shader/hlsl.y
> +++ b/libs/vkd3d-shader/hlsl.y
> @@ -2558,6 +2558,23 @@ variable_decl:
> $$->reg_reservation = $3.reg_reservation;
> }
>
> +state:
> + any_identifier '=' expr ';'
> + {
> + vkd3d_free($1);
> + hlsl_free_instr_list($3);
> + }
> +
> +state_block_start:
> + %empty
> + {
> + ctx->in_state_block = 1;
> + }
> +
> +state_block:
> + %empty
> + | state_block state
> +
> variable_def:
> variable_decl
> | variable_decl '=' complex_initializer
> @@ -2565,6 +2582,11 @@ variable_def:
> $$ = $1;
> $$->initializer = $3;
> }
> + | variable_decl '{' state_block_start state_block '}'
> + {
> + $$ = $1;
> + ctx->in_state_block = 0;
> + }
>
> arrays:
> %empty
> @@ -2861,13 +2883,10 @@ primary_expr:
> hlsl_error(ctx, @1, VKD3D_SHADER_ERROR_HLSL_NOT_DEFINED, "Variable \"%s\" is not defined.", $1);
> YYABORT;
> }
> - if ((load = hlsl_new_var_load(ctx, var, @1)))
> - {
> - if (!($$ = make_list(ctx, &load->node)))
> - YYABORT;
> - }
> - else
> - $$ = NULL;
> + if (!(load = hlsl_new_var_load(ctx, var, @1)))
> + YYABORT;
> + if (!($$ = make_list(ctx, &load->node)))
> + YYABORT;
> }
> | '(' expr ')'
> {
> @@ -2878,6 +2897,27 @@ primary_expr:
> if (!($$ = add_call(ctx, $1, &$3, @1)))
> YYABORT;
> }
> + | NEW_IDENTIFIER
> + {
> + if (ctx->in_state_block)
> + {
> + struct hlsl_ir_load *load;
> + struct hlsl_ir_var *var;
> +
> + if (!(var = hlsl_new_synthetic_var(ctx, "<state-block-expr>",
> + ctx->builtin_types.scalar[HLSL_TYPE_INT], @1)))
> + YYABORT;
> + if (!(load = hlsl_new_var_load(ctx, var, @1)))
> + YYABORT;
> + if (!($$ = make_list(ctx, &load->node)))
> + YYABORT;
> + }
> + else
> + {
> + hlsl_error(ctx, @1, VKD3D_SHADER_ERROR_HLSL_NOT_DEFINED, "Identifier \"%s\" is not declared.\n", $1);
> + YYABORT;
> + }
> + }
>
> postfix_expr:
> primary_expr
> diff --git a/tests/hlsl-state-block-syntax.shader_test b/tests/hlsl-state-block-syntax.shader_test
> new file mode 100644
> index 000000000..26853bf40
> --- /dev/null
> +++ b/tests/hlsl-state-block-syntax.shader_test
> @@ -0,0 +1,173 @@
> +[pixel shader fail]
> +sampler s
> +{
> + foo = float;
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +sampler s = sampler_state
> +{
> + foo = float;
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +sampler s
> +{
> + 2 = 3;
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +sampler s
> +{
> + 2;
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +sampler s
> +{
> + foo;
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +sampler s
> +{
> + foo = bar
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +sampler s {}
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +float f {} = 1;
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +float f = 1 {};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +sampler s = sampler_state;
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +float f {} : register(c1);
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +float f
> +{
> + foo = (sampler)2;
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +float f
> +{
> + foo = (faketype)2;
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +float f
> +{
> + foo = (sampler)bar;
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader fail]
> +float f
> +{
> + foo = bar();
> +};
> +
> +float4 main() : sv_target
> +{
> + return float4(0, 0, 0, 0);
> +}
> +
> +[pixel shader]
> +float u : register(c1) {};
> +float4 main() : sv_target
> +{
> + float zero = 0;
> + float a {};
> + float b
> + {
> + foo = bar;
> + foo = bar;
> + foo = (int)2;
> + foo = (int)bar;
> + foo = float4(bar, baz, qux, xyzzy);
> + foo = zero++;
> + };
> + float c {}, d = 1, e;
> + struct {int a;} s {foo = bar;};
> + return float4(0, 1, zero, 1);
> +}
> +
> +[test]
> +draw quad
> +probe all rgba (0, 1, 0, 1)
>
More information about the wine-devel
mailing list