From 13e6981cc82963245edd74d95ddf4a5b9685dbd0 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Wed, 7 Jun 2023 13:54:50 +0200 Subject: [PATCH] MSL: Consider changed array types for array-of-constant-bool in struct. --- .../frag/struct-bool-edge-cases.frag | 2 +- spirv_glsl.cpp | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/reference/shaders-msl-no-opt/frag/struct-bool-edge-cases.frag b/reference/shaders-msl-no-opt/frag/struct-bool-edge-cases.frag index 4452f57b..51ec74ee 100644 --- a/reference/shaders-msl-no-opt/frag/struct-bool-edge-cases.frag +++ b/reference/shaders-msl-no-opt/frag/struct-bool-edge-cases.frag @@ -93,6 +93,6 @@ fragment void main0() spvUnsafeArray c2 = { bool3(t2.c[0]), bool3(t2.c[1]) }; spvUnsafeArray d2 = { bool4(t2.d[0]), bool4(t2.d[1]) }; t = Test{ short(true), short2(bool2(true, false)), short3(bool3(true)), short4(bool4(false)) }; - t2 = Test2{ spvUnsafeArray({ short(true), short(true) }), spvUnsafeArray({ short2(bool2(true)), short2(bool2(false)) }), spvUnsafeArray({ short3(bool3(true)), short3(bool3(false)) }), spvUnsafeArray({ short4(bool4(true)), short4(bool4(false)) }), Test{ short(true), short2(bool2(true, false)), short3(bool3(true)), short4(bool4(false)) } }; + t2 = Test2{ spvUnsafeArray({ short(true), short(true) }), spvUnsafeArray({ short2(bool2(true)), short2(bool2(false)) }), spvUnsafeArray({ short3(bool3(true)), short3(bool3(false)) }), spvUnsafeArray({ short4(bool4(true)), short4(bool4(false)) }), Test{ short(true), short2(bool2(true, false)), short3(bool3(true)), short4(bool4(false)) } }; } diff --git a/spirv_glsl.cpp b/spirv_glsl.cpp index cfbec525..a0522baf 100644 --- a/spirv_glsl.cpp +++ b/spirv_glsl.cpp @@ -5737,7 +5737,19 @@ string CompilerGLSL::constant_expression(const SPIRConstant &c, else if (backend.use_initializer_list && backend.use_typed_initializer_list && backend.array_is_value_type && type_is_top_level_array(type) && !array_type_decays) { - res = type_to_glsl_constructor(type) + "({ "; + const auto *p_type = &type; + SPIRType tmp_type; + + if (inside_struct_scope && + backend.boolean_in_struct_remapped_type != SPIRType::Boolean && + type.basetype == SPIRType::Boolean) + { + tmp_type = type; + tmp_type.basetype = backend.boolean_in_struct_remapped_type; + p_type = &tmp_type; + } + + res = type_to_glsl_constructor(*p_type) + "({ "; needs_trailing_tracket = true; } else if (backend.use_initializer_list)