-- v5: vkd3d-shader/hlsl: Discern between signed and unsigned ints when parsing.
From: Francisco Casas fcasas@codeweavers.com
--- tests/hlsl/initializer-numeric.shader_test | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+)
diff --git a/tests/hlsl/initializer-numeric.shader_test b/tests/hlsl/initializer-numeric.shader_test index 40576887a..d480b9d1d 100644 --- a/tests/hlsl/initializer-numeric.shader_test +++ b/tests/hlsl/initializer-numeric.shader_test @@ -46,3 +46,31 @@ float4 main() : sv_target [test] draw quad probe all rgba (10.1, 1.1, 1.2, 2.1) 4 + + +[pixel shader todo] +float4 main() : sv_target +{ + float4 aa = { 3U, 0xfau, 020u, -1u}; + return aa; +} + +[test] +todo(sm<6) draw quad +todo(sm<6) probe all rgba (3.0, 250.0, 16.0, 4.2949673e+009) 4 + + +[require] +shader model < 6.0 + +[pixel shader todo] +float4 main() : sv_target +{ + // 3000000000 is -1294967296 when it doesn't have the 'u' suffix, except in SM6. + float2 aa = {3000000000, 3000000000U}; + return float4(aa, 0.0, 0.0); +} + +[test] +todo draw quad +todo probe all rgba (-1294967296.0, 3000000000.0, 0.0, 0.0) 4
From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/hlsl.l | 6 +++--- tests/hlsl/initializer-numeric.shader_test | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l index 0e5f2bb61..c35709903 100644 --- a/libs/vkd3d-shader/hlsl.l +++ b/libs/vkd3d-shader/hlsl.l @@ -203,15 +203,15 @@ while {return KW_WHILE; } yylval->floatval = atof(yytext); return C_FLOAT; } -0x[0-9a-fA-F]+ { +0x[0-9a-fA-F]+[uU]? { yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; } -0[0-7]+ { +0[0-7]+[uU]? { yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; } -[0-9]+ { +[0-9]+[uU]? { yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; } diff --git a/tests/hlsl/initializer-numeric.shader_test b/tests/hlsl/initializer-numeric.shader_test index d480b9d1d..81d19d06c 100644 --- a/tests/hlsl/initializer-numeric.shader_test +++ b/tests/hlsl/initializer-numeric.shader_test @@ -48,7 +48,7 @@ draw quad probe all rgba (10.1, 1.1, 1.2, 2.1) 4
-[pixel shader todo] +[pixel shader] float4 main() : sv_target { float4 aa = { 3U, 0xfau, 020u, -1u}; @@ -56,14 +56,14 @@ float4 main() : sv_target }
[test] -todo(sm<6) draw quad +draw quad todo(sm<6) probe all rgba (3.0, 250.0, 16.0, 4.2949673e+009) 4
[require] shader model < 6.0
-[pixel shader todo] +[pixel shader] float4 main() : sv_target { // 3000000000 is -1294967296 when it doesn't have the 'u' suffix, except in SM6. @@ -72,5 +72,5 @@ float4 main() : sv_target }
[test] -todo draw quad +draw quad todo probe all rgba (-1294967296.0, 3000000000.0, 0.0, 0.0) 4
From: Francisco Casas fcasas@codeweavers.com
--- tests/hlsl/function-overload.shader_test | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/tests/hlsl/function-overload.shader_test b/tests/hlsl/function-overload.shader_test index ae35c4837..7b298ba30 100644 --- a/tests/hlsl/function-overload.shader_test +++ b/tests/hlsl/function-overload.shader_test @@ -41,6 +41,27 @@ todo(sm<6) draw quad probe all rgba (0.1, 0.2, 0.1, 0.2)
+[pixel shader todo fail(sm>=6)] +float func(int arg) +{ + return 1.0; +} + +float func(uint arg) +{ + return 2.0; +} + +float4 main() : sv_target +{ + return float4(func(3u), func(3lu), func(3l), func(3)); +} + +[test] +todo(sm<6) draw quad +probe all rgba (2.0, 2.0, 1.0, 1.0) + + % float and float1 can be defined separately...
[pixel shader]
From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/hlsl.l | 18 +++++++++++++++--- libs/vkd3d-shader/hlsl.y | 10 ++++++++++ tests/hlsl/initializer-numeric.shader_test | 4 ++-- 3 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l index c35709903..401fba604 100644 --- a/libs/vkd3d-shader/hlsl.l +++ b/libs/vkd3d-shader/hlsl.l @@ -203,18 +203,30 @@ while {return KW_WHILE; } yylval->floatval = atof(yytext); return C_FLOAT; } -0x[0-9a-fA-F]+[uU]? { +0x[0-9a-fA-F]+[lL]? { yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; } -0[0-7]+[uU]? { +0[0-7]+[lL]? { yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; } -[0-9]+[uU]? { +[0-9]+[lL]? { yylval->intval = vkd3d_parse_integer(yytext); return C_INTEGER; } +0x[0-9a-fA-F]+([uU]|[uU][lL]|[lL][uU]) { + yylval->intval = vkd3d_parse_integer(yytext); + return C_UNSIGNED; + } +0[0-7]+([uU]|[uU][lL]|[lL][uU]) { + yylval->intval = vkd3d_parse_integer(yytext); + return C_UNSIGNED; + } +[0-9]+([uU]|[uU][lL]|[lL][uU]) { + yylval->intval = vkd3d_parse_integer(yytext); + return C_UNSIGNED; + }
{WS}+ {} {NEWLINE} { diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 5e0d48d3c..00430961c 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -4939,6 +4939,7 @@ static void check_duplicated_switch_cases(struct hlsl_ctx *ctx, const struct hls %token <floatval> C_FLOAT
%token <intval> C_INTEGER +%token <intval> C_UNSIGNED %token <intval> PRE_LINE
%type <list> type_specs @@ -6673,6 +6674,15 @@ primary_expr: if (!($$ = make_block(ctx, c))) YYABORT; } + | C_UNSIGNED + { + struct hlsl_ir_node *c; + + if (!(c = hlsl_new_uint_constant(ctx, $1, &@1))) + YYABORT; + if (!($$ = make_block(ctx, c))) + YYABORT; + } | boolean { struct hlsl_ir_node *c; diff --git a/tests/hlsl/initializer-numeric.shader_test b/tests/hlsl/initializer-numeric.shader_test index 81d19d06c..617b67405 100644 --- a/tests/hlsl/initializer-numeric.shader_test +++ b/tests/hlsl/initializer-numeric.shader_test @@ -57,7 +57,7 @@ float4 main() : sv_target
[test] draw quad -todo(sm<6) probe all rgba (3.0, 250.0, 16.0, 4.2949673e+009) 4 +probe all rgba (3.0, 250.0, 16.0, 4.2949673e+009) 4
[require] @@ -73,4 +73,4 @@ float4 main() : sv_target
[test] draw quad -todo probe all rgba (-1294967296.0, 3000000000.0, 0.0, 0.0) 4 +probe all rgba (-1294967296.0, 3000000000.0, 0.0, 0.0) 4
On Tue Nov 21 00:11:49 2023 +0000, Zebediah Figura wrote:
Why introduce the separate "integer" rule?
I suppose part of the reason is to handle vector and matrix, but it turns out those are supposed to be able to take arbitrary expressions anyway, constant folding and all.
Yep, that was indeed the function. But since it is as you say, I removed the rule and just used C_INTEGER, I can imagine the case of using "u" on these sizes infrequent enough.
The function-overload tests fail on native. The problem is that "3(l)" is actually not an signed integer constant—it's an *unspecified* integer constant. Yes, native has those. I think there's a similar thing for floats too. So I'd just get rid of those components for now.