Module: vkd3d Branch: master Commit: d279d34801bfa852d15a699813c6a62227537c5e URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/d279d34801bfa852d15a699813c6a6...
Author: Francisco Casas fcasas@codeweavers.com Date: Thu Jan 26 10:13:20 2023 -0300
vkd3d-shader/hlsl: Parse array types in function parameters.
---
libs/vkd3d-shader/hlsl.y | 20 ++++++++++++++++---- tests/array-parameters.shader_test | 26 ++++++++++++++++++++------ 2 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 9967db98..d1ca91b8 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -4317,10 +4317,11 @@ param_list: }
parameter: - var_modifiers type_no_void any_identifier colon_attribute + var_modifiers type_no_void any_identifier arrays colon_attribute { - struct hlsl_type *type; unsigned int modifiers = $1; + struct hlsl_type *type; + unsigned int i;
if (!(type = apply_type_modifiers(ctx, $2, &modifiers, @1))) YYABORT; @@ -4328,10 +4329,21 @@ parameter: $$.modifiers = modifiers; if (!($$.modifiers & (HLSL_STORAGE_IN | HLSL_STORAGE_OUT))) $$.modifiers |= HLSL_STORAGE_IN; + + for (i = 0; i < $4.count; ++i) + { + if ($4.sizes[i] == HLSL_ARRAY_ELEMENTS_COUNT_IMPLICIT) + { + hlsl_error(ctx, &@3, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE, + "Implicit size arrays not allowed in function parameters."); + } + type = hlsl_new_array_type(ctx, type, $4.sizes[i]); + } $$.type = type; + $$.name = $3; - $$.semantic = $4.semantic; - $$.reg_reservation = $4.reg_reservation; + $$.semantic = $5.semantic; + $$.reg_reservation = $5.reg_reservation; }
texture_type: diff --git a/tests/array-parameters.shader_test b/tests/array-parameters.shader_test index 615aa3f4..3b7d628d 100644 --- a/tests/array-parameters.shader_test +++ b/tests/array-parameters.shader_test @@ -1,4 +1,4 @@ -[pixel shader todo] +[pixel shader] float fun(float a[2]) { return 10 * a[0] + a[1]; @@ -12,8 +12,8 @@ float4 main() : sv_target }
[test] -todo draw quad -todo probe all rgba (25.0, 25.0, 25.0, 25.0) +draw quad +probe all rgba (25.0, 25.0, 25.0, 25.0)
[pixel shader fail] @@ -58,7 +58,7 @@ float4 main() : sv_target }
-[pixel shader todo] +[pixel shader] float4 fun(float a[2][4]) { float4 res; @@ -78,8 +78,22 @@ float4 main() : sv_target }
[test] -todo draw quad -todo probe all rgba (15.0, 26.0, 37.0, 48.0) +draw quad +probe all rgba (15.0, 26.0, 37.0, 48.0) + + +[pixel shader fail] +float fun(float a[2]) +{ + return a[2]; // out of bounds. +} + +float4 main() : sv_target +{ + float f[2] = {1, 2}; + + return fun(f); +}
[pixel shader fail]