Module: vkd3d Branch: master Commit: 9ad48f16ea261792045d16e884eb1f768227d90c URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/9ad48f16ea261792045d16e884eb1f...
Author: Zebediah Figura zfigura@codeweavers.com Date: Tue Jan 16 18:45:29 2024 -0600
vkd3d-shader/hlsl: Forbid mismatched argument types in ternaries.
---
libs/vkd3d-shader/hlsl.y | 16 ++++++++++++++++ tests/hlsl/ternary.shader_test | 8 ++++---- 2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 12c955f2..c308916e 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -4120,6 +4120,22 @@ static bool add_ternary(struct hlsl_ctx *ctx, struct hlsl_block *block, common_type = hlsl_get_numeric_type(ctx, cond_type->class, common_type->base_type, cond_type->dimx, cond_type->dimy); } + else if (cond_type->dimx != common_type->dimx || cond_type->dimy != common_type->dimy) + { + /* This condition looks wrong but is correct. + * floatN is compatible with float1xN, but not with floatNx1. */ + + struct vkd3d_string_buffer *cond_string, *value_string; + + cond_string = hlsl_type_to_string(ctx, cond_type); + value_string = hlsl_type_to_string(ctx, common_type); + if (cond_string && value_string) + hlsl_error(ctx, &first->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE, + "Ternary condition type '%s' is not compatible with value type '%s'.", + cond_string->buffer, value_string->buffer); + hlsl_release_string_buffer(ctx, cond_string); + hlsl_release_string_buffer(ctx, value_string); + }
if (!(first = add_implicit_conversion(ctx, block, first, common_type, &first->loc))) return false; diff --git a/tests/hlsl/ternary.shader_test b/tests/hlsl/ternary.shader_test index 5f38d896..902d2e11 100644 --- a/tests/hlsl/ternary.shader_test +++ b/tests/hlsl/ternary.shader_test @@ -124,7 +124,7 @@ probe all rgba (5.0, 6.0, 7.0, 1.0) % * the result operands are scalar; % * one is a typeN and the other is a type1xN
-[pixel shader fail todo] +[pixel shader fail]
uniform float4 cond; uniform float2x2 a, b; @@ -135,7 +135,7 @@ float4 main() : sv_target }
-[pixel shader fail todo] +[pixel shader fail]
uniform float2x2 cond; uniform float4 a, b; @@ -162,7 +162,7 @@ draw quad probe all rgba (1.0, 6.0, 7.0, 4.0)
-[pixel shader fail todo] +[pixel shader fail]
uniform float3 cond; uniform float4 a, b; @@ -174,7 +174,7 @@ float4 main() : sv_target }
-[pixel shader fail todo] +[pixel shader fail]
uniform float4 cond; uniform float4x1 a, b;