I see current Chrome is hitting this.
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- tests/hlsl/loop.shader_test | 143 ++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+)
diff --git a/tests/hlsl/loop.shader_test b/tests/hlsl/loop.shader_test index 4fbf14d8f..3d515c9d5 100644 --- a/tests/hlsl/loop.shader_test +++ b/tests/hlsl/loop.shader_test @@ -100,3 +100,146 @@ float4 main() : sv_target uniform 0 float 4.0 todo(sm>=6) draw quad probe all rgba (410.1, 410.1, 410.1, 410.1) + +% loop attribute by itself +[pixel shader todo] +float4 main() : sv_target +{ + float ret = 0.0; + + [loop] for (int i = 0; i < 10; ++i) + { + ret += 1.0; + } + + return ret; +} + +[test] +todo draw quad +probe all rgba (10.0, 10.0, 10.0, 10.0) + +[pixel shader todo] +float4 main() : sv_target +{ + float ret = 0.0; + int i = 0; + + [loop] while (i < 10) + { + ret += 1.0; + i++; + } + + return ret; +} + +[test] +todo draw quad +probe all rgba (10.0, 10.0, 10.0, 10.0) + +[pixel shader todo] +float4 main() : sv_target +{ + float ret = 0.0; + int i = 0; + + [loop] do + { + i++; + ret += 1.0; + } while (i < 10); + + return ret; +} + +[test] +todo draw quad +probe all rgba (10.0, 10.0, 10.0, 10.0) + +% unroll can't be used with fastopt or loop +[pixel shader fail todo] +float4 main() : sv_target +{ + float ret = 0.0; + + [loop] [unroll(1)] for (int i = 0; i < 10; ++i) + { + ret += 1.0; + } + + return ret; +} + +[pixel shader fail todo] +float4 main() : sv_target +{ + float ret = 0.0; + + [fastopt] [unroll(1)] for (int i = 0; i < 10; ++i) + { + ret += 1.0; + } + + return ret; +} + +[pixel shader fail todo] +float4 main() : sv_target +{ + float ret = 0.0; + int i = 0; + + [loop] [unroll(1)] while (i < 10) + { + ret += 1.0; + i++; + } + + return ret; +} + +[pixel shader fail todo] +float4 main() : sv_target +{ + float ret = 0.0; + int i = 0; + + [fastopt] [unroll(1)] while (i < 10) + { + ret += 1.0; + i++; + } + + return ret; +} + +[pixel shader fail] +float4 main() : sv_target +{ + float ret = 0.0; + int i = 0; + + [loop] [unroll(1)] do + { + ret += 1.0; + i++; + } while (i < 10) + + return ret; +} + +[pixel shader fail] +float4 main() : sv_target +{ + float ret = 0.0; + int i = 0; + + [fastopt] [unroll(1)] do + { + ret += 1.0; + i++; + } while (i < 10) + + return ret; +}
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- libs/vkd3d-shader/hlsl.y | 24 ++++++++++++++++++++++++ tests/hlsl/loop.shader_test | 8 ++++---- 2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index e58574f75..d90e890d4 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -508,6 +508,28 @@ static void resolve_loop_continue(struct hlsl_ctx *ctx, struct hlsl_block *block } }
+static void check_loop_attributes(struct hlsl_ctx *ctx, const struct parse_attribute_list *attributes, + const struct vkd3d_shader_location *loc) +{ + bool has_unroll = false, has_loop = false, has_fastopt = false; + unsigned int i; + + for (i = 0; i < attributes->count; ++i) + { + const char *name = attributes->attrs[i]->name; + + has_loop |= !strcmp(name, "loop"); + has_unroll |= !strcmp(name, "unroll"); + has_fastopt |= !strcmp(name, "fastopt"); + } + + if (has_unroll && has_loop) + hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX, "Unroll attribute can't be used with 'loop' attribute."); + + if (has_unroll && has_fastopt) + hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX, "Unroll attribute can't be used with 'fastopt' attribute."); +} + static struct hlsl_block *create_loop(struct hlsl_ctx *ctx, enum loop_type type, const struct parse_attribute_list *attributes, struct hlsl_block *init, struct hlsl_block *cond, struct hlsl_block *iter, struct hlsl_block *body, const struct vkd3d_shader_location *loc) @@ -518,6 +540,8 @@ static struct hlsl_block *create_loop(struct hlsl_ctx *ctx, enum loop_type type, if (attribute_list_has_duplicates(attributes)) hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SYNTAX, "Found duplicate attribute.");
+ check_loop_attributes(ctx, attributes, loc); + /* Ignore unroll(0) attribute, and any invalid attribute. */ for (i = 0; i < attributes->count; ++i) { diff --git a/tests/hlsl/loop.shader_test b/tests/hlsl/loop.shader_test index 3d515c9d5..6a5240a73 100644 --- a/tests/hlsl/loop.shader_test +++ b/tests/hlsl/loop.shader_test @@ -158,7 +158,7 @@ todo draw quad probe all rgba (10.0, 10.0, 10.0, 10.0)
% unroll can't be used with fastopt or loop -[pixel shader fail todo] +[pixel shader fail] float4 main() : sv_target { float ret = 0.0; @@ -171,7 +171,7 @@ float4 main() : sv_target return ret; }
-[pixel shader fail todo] +[pixel shader fail] float4 main() : sv_target { float ret = 0.0; @@ -184,7 +184,7 @@ float4 main() : sv_target return ret; }
-[pixel shader fail todo] +[pixel shader fail] float4 main() : sv_target { float ret = 0.0; @@ -199,7 +199,7 @@ float4 main() : sv_target return ret; }
-[pixel shader fail todo] +[pixel shader fail] float4 main() : sv_target { float ret = 0.0;
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- libs/vkd3d-shader/hlsl.y | 7 +++++-- tests/hlsl/loop.shader_test | 12 ++++++------ 2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index d90e890d4..09a80386d 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -557,8 +557,11 @@ static struct hlsl_block *create_loop(struct hlsl_ctx *ctx, enum loop_type type, hlsl_warning(ctx, loc, VKD3D_SHADER_ERROR_HLSL_NOT_IMPLEMENTED, "Loop unrolling is not implemented."); } } - else if (!strcmp(attr->name, "loop") - || !strcmp(attr->name, "fastopt") + else if (!strcmp(attr->name, "loop")) + { + /* TODO: this attribute will be used to disable unrolling, once it's implememented. */ + } + else if (!strcmp(attr->name, "fastopt") || !strcmp(attr->name, "allow_uav_condition")) { hlsl_fixme(ctx, loc, "Unhandled attribute '%s'.", attr->name); diff --git a/tests/hlsl/loop.shader_test b/tests/hlsl/loop.shader_test index 6a5240a73..c15e48798 100644 --- a/tests/hlsl/loop.shader_test +++ b/tests/hlsl/loop.shader_test @@ -102,7 +102,7 @@ todo(sm>=6) draw quad probe all rgba (410.1, 410.1, 410.1, 410.1)
% loop attribute by itself -[pixel shader todo] +[pixel shader] float4 main() : sv_target { float ret = 0.0; @@ -116,10 +116,10 @@ float4 main() : sv_target }
[test] -todo draw quad +todo(sm>=6) draw quad probe all rgba (10.0, 10.0, 10.0, 10.0)
-[pixel shader todo] +[pixel shader] float4 main() : sv_target { float ret = 0.0; @@ -135,10 +135,10 @@ float4 main() : sv_target }
[test] -todo draw quad +todo(sm>=6) draw quad probe all rgba (10.0, 10.0, 10.0, 10.0)
-[pixel shader todo] +[pixel shader] float4 main() : sv_target { float ret = 0.0; @@ -154,7 +154,7 @@ float4 main() : sv_target }
[test] -todo draw quad +todo(sm>=6) draw quad probe all rgba (10.0, 10.0, 10.0, 10.0)
% unroll can't be used with fastopt or loop
This merge request was approved by Zebediah Figura.
This merge request was approved by Giovanni Mascellani.