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;