From: Victor Chiletto vchiletto@codeweavers.com
--- libs/vkd3d-shader/hlsl.y | 26 ++++++++++----- .../register-reservations-numeric.shader_test | 33 +++++++++++++++++++ 2 files changed, 51 insertions(+), 8 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 7fc35d4e1..485011e6e 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -1198,15 +1198,12 @@ static bool add_effect_group(struct hlsl_ctx *ctx, const char *name, struct hlsl return true; }
-static struct hlsl_reg_reservation parse_reg_reservation(const char *reg_string) +static struct hlsl_reg_reservation parse_reg_reservation(const char *reg_string, unsigned int bracket_offset) { struct hlsl_reg_reservation reservation = {0};
- if (!sscanf(reg_string + 1, "%u", &reservation.reg_index)) - { - FIXME("Unsupported register reservation syntax.\n"); - return reservation; - } + sscanf(reg_string + 1, "%u", &reservation.reg_index); + reservation.reg_index += bracket_offset; reservation.reg_type = ascii_tolower(reg_string[0]); return reservation; } @@ -6256,7 +6253,12 @@ semantic: register_opt: ':' KW_REGISTER '(' any_identifier ')' { - $$ = parse_reg_reservation($4); + $$ = parse_reg_reservation($4, 0); + vkd3d_free($4); + } + | ':' KW_REGISTER '(' any_identifier '[' expr ']' ')' + { + $$ = parse_reg_reservation($4, evaluate_static_expression_as_uint(ctx, $6, &@6)); vkd3d_free($4); } | ':' KW_REGISTER '(' any_identifier ',' any_identifier ')' @@ -6264,7 +6266,15 @@ register_opt: FIXME("Ignoring shader target %s in a register reservation.\n", debugstr_a($4)); vkd3d_free($4);
- $$ = parse_reg_reservation($6); + $$ = parse_reg_reservation($6, 0); + vkd3d_free($6); + } + | ':' KW_REGISTER '(' any_identifier ',' any_identifier '[' expr ']' ')' + { + FIXME("Ignoring shader target %s in a register reservation.\n", debugstr_a($4)); + vkd3d_free($4); + + $$ = parse_reg_reservation($6, evaluate_static_expression_as_uint(ctx, $8, &@8)); vkd3d_free($6); }
diff --git a/tests/hlsl/register-reservations-numeric.shader_test b/tests/hlsl/register-reservations-numeric.shader_test index 21d0f727a..3597ffb03 100644 --- a/tests/hlsl/register-reservations-numeric.shader_test +++ b/tests/hlsl/register-reservations-numeric.shader_test @@ -277,3 +277,36 @@ float4 main() : sv_target f += i; return f; } + +% expressions as offsets and other oddities +[require] + +[pixel shader] +// no offset at all, implicitly c0. +float a : register (c); + +// numeric exprs. +float b : register (c0[1 + 1 * 2 * 0]); + +// float offsets truncate. +float c : register (c0[2 + 0.1]); + +// boolean offsets. +float d : register (c0[true + true + true]); + +// negative offsets. +float f : register (c5[-1]); + +float4 main() : sv_target +{ + return a + b + c + d + f; +} + +[test] +uniform 0 float 1 +uniform 4 float 2 +uniform 8 float 3 +uniform 12 float 4 +uniform 16 float 5 +todo(glsl) draw quad +probe all rgba (15.0, 15.0, 15.0, 15.0)