From 7f10fe08d444aa9e9104387cb4cb2f0bc0ab1a12 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Fri, 4 Apr 2025 17:06:02 +0200 Subject: [PATCH] GLSL: Fix coopmat function parameter typing. --- .../cooperative-matrix.vk.nocompat.comp.vk | 118 +++++++------- .../cooperative-matrix.vk.nocompat.comp.vk | 152 ++++++++++-------- .../comp/cooperative-matrix.vk.nocompat.comp | 14 ++ spirv_glsl.cpp | 16 +- 4 files changed, 168 insertions(+), 132 deletions(-) diff --git a/reference/opt/shaders/comp/cooperative-matrix.vk.nocompat.comp.vk b/reference/opt/shaders/comp/cooperative-matrix.vk.nocompat.comp.vk index c730aed24..095573980 100644 --- a/reference/opt/shaders/comp/cooperative-matrix.vk.nocompat.comp.vk +++ b/reference/opt/shaders/comp/cooperative-matrix.vk.nocompat.comp.vk @@ -30,68 +30,68 @@ shared uint blah[512]; void main() { - uint _514 = 256u * gl_WorkGroupID.x; - coopmat _519; - coopMatLoad(_519, ssbo32.data, _514, 16u, Layout); - uint _523 = 512u * gl_WorkGroupID.x; - coopmat _528; - coopMatLoad(_528, ssbo16.data, _523, 32u, Layout); - coopmat _537; - coopMatLoad(_537, ssbo32.data, _514, 16u, Layout); - coopmat _546; - coopMatLoad(_546, ssbo16.data, _523, 32u, Layout); - coopmat _555; - coopMatLoad(_555, ssbo32.data, _514, 16u, Layout); - coopmat _564; - coopMatLoad(_564, ssbo16.data, _523, 32u, Layout); - uint _578 = 128u * gl_WorkGroupID.x; - coopmat _583; - coopMatLoad(_583, ssbo32.data, _578, 8u, Layout); - coopmat _592; - coopMatLoad(_592, ssbo16.data, _514, 16u, Layout); - coopmat _601; - coopMatLoad(_601, ssbo32.data, _578, 8u, Layout); - coopmat _610; - coopMatLoad(_610, ssbo16.data, _514, 16u, Layout); - coopmat _619; - coopMatLoad(_619, ssbo32.data, _578, 8u, Layout); - coopmat _628; - coopMatLoad(_628, ssbo16.data, _514, 16u, Layout); - coopMatStore(coopmat(100.0), ssbo32.data, _578, 0u, Layout); - coopMatStore(coopmat(100u), ssbo32.data, _578, 0u, Layout); - coopMatStore(coopmat(-100), ssbo32.data, _578, 0u, Layout); - coopMatStore(coopmat(float16_t(100.0)), ssbo32.data, _578, 0u, Layout); - coopMatStore(coopmat(-100s), ssbo32.data, _578, 0u, Layout); - coopMatStore(coopmat(100us), ssbo32.data, _578, 0u, Layout); - coopmat _726 = coopmat(100.0); - for (int _884 = 0; _884 < int(uint(coopmat(0).length())); ) + uint _549 = 256u * gl_WorkGroupID.x; + coopmat _554; + coopMatLoad(_554, ssbo32.data, _549, 16u, Layout); + uint _558 = 512u * gl_WorkGroupID.x; + coopmat _563; + coopMatLoad(_563, ssbo16.data, _558, 32u, Layout); + coopmat _572; + coopMatLoad(_572, ssbo32.data, _549, 16u, Layout); + coopmat _581; + coopMatLoad(_581, ssbo16.data, _558, 32u, Layout); + coopmat _590; + coopMatLoad(_590, ssbo32.data, _549, 16u, Layout); + coopmat _599; + coopMatLoad(_599, ssbo16.data, _558, 32u, Layout); + uint _613 = 128u * gl_WorkGroupID.x; + coopmat _618; + coopMatLoad(_618, ssbo32.data, _613, 8u, Layout); + coopmat _627; + coopMatLoad(_627, ssbo16.data, _549, 16u, Layout); + coopmat _636; + coopMatLoad(_636, ssbo32.data, _613, 8u, Layout); + coopmat _645; + coopMatLoad(_645, ssbo16.data, _549, 16u, Layout); + coopmat _654; + coopMatLoad(_654, ssbo32.data, _613, 8u, Layout); + coopmat _663; + coopMatLoad(_663, ssbo16.data, _549, 16u, Layout); + coopMatStore(coopmat(100.0), ssbo32.data, _613, 0u, Layout); + coopMatStore(coopmat(100u), ssbo32.data, _613, 0u, Layout); + coopMatStore(coopmat(-100), ssbo32.data, _613, 0u, Layout); + coopMatStore(coopmat(float16_t(100.0)), ssbo32.data, _613, 0u, Layout); + coopMatStore(coopmat(-100s), ssbo32.data, _613, 0u, Layout); + coopMatStore(coopmat(100us), ssbo32.data, _613, 0u, Layout); + coopmat _761 = coopmat(100.0); + for (int _944 = 0; _944 < int(uint(coopmat(0).length())); ) { - _726[_884] += 50.0; - _884++; + _761[_944] += 50.0; + _944++; continue; } - coopMatStore(_726, ssbo32.data, 0u, 16u, Layout); + coopMatStore(_761, ssbo32.data, 0u, 16u, Layout); coopMatStore(coopmat(gl_WorkGroupID.x), ssbo32.data, 0u, 16u, Layout); - coopmat _768; - coopMatLoad(_768, ssbo32.data, _514, 16u, Layout); - coopmat _777; - coopMatLoad(_777, ssbo32.data, _514, 16u, Layout); - coopmat _786; - coopMatLoad(_786, ssbo32.data, _514, 16u, Layout); - coopmat _814; - coopMatLoad(_814, ssbo32.data, _514, 16u, Layout); - coopmat _823; - coopMatLoad(_823, ssbo32.data, _514, 16u, Layout); - coopmat _832; - coopMatLoad(_832, ssbo32.data, _514, 16u, Layout); - coopmat _852; - coopMatLoad(_852, ssbo32.data, _514, 16u, Layout); - coopmat _861; - coopMatLoad(_861, ssbo32.data, _514, 16u, Layout); - coopmat _870; - coopMatLoad(_870, ssbo32.data, _514, 16u, Layout); - coopmat _880; - coopMatLoad(_880, blah, 0u, 16u, Layout); - coopMatStore(_880, blah, 0u, 16u, Layout); + coopmat _806; + coopMatLoad(_806, ssbo32.data, _549, 16u, Layout); + coopmat _815; + coopMatLoad(_815, ssbo32.data, _549, 16u, Layout); + coopmat _824; + coopMatLoad(_824, ssbo32.data, _549, 16u, Layout); + coopmat _857; + coopMatLoad(_857, ssbo32.data, _549, 16u, Layout); + coopmat _866; + coopMatLoad(_866, ssbo32.data, _549, 16u, Layout); + coopmat _875; + coopMatLoad(_875, ssbo32.data, _549, 16u, Layout); + coopmat _895; + coopMatLoad(_895, ssbo32.data, _549, 16u, Layout); + coopmat _904; + coopMatLoad(_904, ssbo32.data, _549, 16u, Layout); + coopmat _913; + coopMatLoad(_913, ssbo32.data, _549, 16u, Layout); + coopmat _923; + coopMatLoad(_923, blah, 0u, 16u, Layout); + coopMatStore(_923, blah, 0u, 16u, Layout); } diff --git a/reference/shaders/comp/cooperative-matrix.vk.nocompat.comp.vk b/reference/shaders/comp/cooperative-matrix.vk.nocompat.comp.vk index 951cc84a8..82898e3c0 100644 --- a/reference/shaders/comp/cooperative-matrix.vk.nocompat.comp.vk +++ b/reference/shaders/comp/cooperative-matrix.vk.nocompat.comp.vk @@ -30,57 +30,57 @@ shared uint blah[512]; void loads_32() { - coopmat _60; - coopMatLoad(_60, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg = _60; + coopmat _71; + coopMatLoad(_71, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg = _71; coopmat A32 = tempArg; - coopmat _79; - coopMatLoad(_79, ssbo16.data, 512u * gl_WorkGroupID.x, 32u, Layout); - coopmat tempArg_1 = _79; + coopmat _90; + coopMatLoad(_90, ssbo16.data, 512u * gl_WorkGroupID.x, 32u, Layout); + coopmat tempArg_1 = _90; A32 = tempArg_1; - coopmat _92; - coopMatLoad(_92, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_2 = _92; - coopmat B32 = tempArg_2; coopmat _103; - coopMatLoad(_103, ssbo16.data, 512u * gl_WorkGroupID.x, 32u, Layout); - coopmat tempArg_3 = _103; + coopMatLoad(_103, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_2 = _103; + coopmat B32 = tempArg_2; + coopmat _114; + coopMatLoad(_114, ssbo16.data, 512u * gl_WorkGroupID.x, 32u, Layout); + coopmat tempArg_3 = _114; B32 = tempArg_3; - coopmat _116; - coopMatLoad(_116, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_4 = _116; - coopmat C32 = tempArg_4; coopmat _127; - coopMatLoad(_127, ssbo16.data, 512u * gl_WorkGroupID.x, 32u, Layout); - coopmat tempArg_5 = _127; + coopMatLoad(_127, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_4 = _127; + coopmat C32 = tempArg_4; + coopmat _138; + coopMatLoad(_138, ssbo16.data, 512u * gl_WorkGroupID.x, 32u, Layout); + coopmat tempArg_5 = _138; C32 = tempArg_5; } void loads_16() { - coopmat _141; - coopMatLoad(_141, ssbo32.data, 128u * gl_WorkGroupID.x, 8u, Layout); - coopmat tempArg = _141; - coopmat A16 = tempArg; coopmat _152; - coopMatLoad(_152, ssbo16.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_1 = _152; + coopMatLoad(_152, ssbo32.data, 128u * gl_WorkGroupID.x, 8u, Layout); + coopmat tempArg = _152; + coopmat A16 = tempArg; + coopmat _163; + coopMatLoad(_163, ssbo16.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_1 = _163; A16 = tempArg_1; - coopmat _164; - coopMatLoad(_164, ssbo32.data, 128u * gl_WorkGroupID.x, 8u, Layout); - coopmat tempArg_2 = _164; - coopmat B16 = tempArg_2; coopmat _175; - coopMatLoad(_175, ssbo16.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_3 = _175; + coopMatLoad(_175, ssbo32.data, 128u * gl_WorkGroupID.x, 8u, Layout); + coopmat tempArg_2 = _175; + coopmat B16 = tempArg_2; + coopmat _186; + coopMatLoad(_186, ssbo16.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_3 = _186; B16 = tempArg_3; - coopmat _187; - coopMatLoad(_187, ssbo32.data, 128u * gl_WorkGroupID.x, 8u, Layout); - coopmat tempArg_4 = _187; - coopmat C16 = tempArg_4; coopmat _198; - coopMatLoad(_198, ssbo16.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_5 = _198; + coopMatLoad(_198, ssbo32.data, 128u * gl_WorkGroupID.x, 8u, Layout); + coopmat tempArg_4 = _198; + coopmat C16 = tempArg_4; + coopmat _209; + coopMatLoad(_209, ssbo16.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_5 = _209; C16 = tempArg_5; } @@ -144,19 +144,27 @@ void scalar_construct() coopMatStore(A, ssbo32.data, 0u, 16u, Layout); } +coopmat coopmat_square(coopmat a) +{ + return a * a; +} + void matmul() { - coopmat _268; - coopMatLoad(_268, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg = _268; - coopmat A = tempArg; - coopmat _279; - coopMatLoad(_279, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_1 = _279; + coopmat A; + coopmat param = A; + A = coopmat_square(param); + coopmat _283; + coopMatLoad(_283, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg = _283; + A = tempArg; + coopmat _293; + coopMatLoad(_293, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_1 = _293; coopmat B = tempArg_1; - coopmat _290; - coopMatLoad(_290, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_2 = _290; + coopmat _304; + coopMatLoad(_304, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_2 = _304; coopmat C = tempArg_2; C = coopMatMulAdd(A, B, C, 0); C = coopMatMulAdd(A, B, C, 0); @@ -165,47 +173,56 @@ void matmul() void matmul_uint() { - coopmat _315; - coopMatLoad(_315, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg = _315; + coopmat _329; + coopMatLoad(_329, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg = _329; coopmat A = tempArg; - coopmat _328; - coopMatLoad(_328, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_1 = _328; + coopmat _342; + coopMatLoad(_342, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_1 = _342; coopmat B = tempArg_1; - coopmat _341; - coopMatLoad(_341, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_2 = _341; + coopmat _355; + coopMatLoad(_355, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_2 = _355; coopmat C = tempArg_2; C = coopMatMulAdd(A, B, C, 31); } void matmul_int() { - coopmat _358; - coopMatLoad(_358, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg = _358; + coopmat _372; + coopMatLoad(_372, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg = _372; coopmat A = tempArg; - coopmat _371; - coopMatLoad(_371, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_1 = _371; + coopmat _385; + coopMatLoad(_385, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_1 = _385; coopmat B = tempArg_1; - coopmat _384; - coopMatLoad(_384, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); - coopmat tempArg_2 = _384; + coopmat _398; + coopMatLoad(_398, ssbo32.data, 256u * gl_WorkGroupID.x, 16u, Layout); + coopmat tempArg_2 = _398; coopmat C = tempArg_2; C = coopMatMulAdd(A, B, C, 31); } void lds() { - coopmat _482; - coopMatLoad(_482, blah, 0u, 16u, Layout); - coopmat tempArg = _482; + coopmat _496; + coopMatLoad(_496, blah, 0u, 16u, Layout); + coopmat tempArg = _496; coopmat A = tempArg; coopMatStore(A, blah, 0u, 16u, Layout); } +void array_of_coopmat() +{ + coopmat As[4]; + for (int i = 0; i < 4; i++) + { + As[i] = coopmat(float(i)); + } +} + void main() { loads_32(); @@ -220,5 +237,6 @@ void main() matmul_uint(); matmul_int(); lds(); + array_of_coopmat(); } diff --git a/shaders/comp/cooperative-matrix.vk.nocompat.comp b/shaders/comp/cooperative-matrix.vk.nocompat.comp index 6fd98e67c..a61e9e325 100644 --- a/shaders/comp/cooperative-matrix.vk.nocompat.comp +++ b/shaders/comp/cooperative-matrix.vk.nocompat.comp @@ -24,6 +24,11 @@ const int UseC = gl_MatrixUseAccumulator; layout(constant_id = 5) const int Layout = gl_CooperativeMatrixLayoutRowMajor; layout(constant_id = 6) const int Scope = gl_ScopeSubgroup; +coopmat coopmat_square(coopmat a) +{ + return a * a; +} + void loads_32() { coopmat A32; @@ -65,6 +70,7 @@ void matmul() coopmat A; coopmat B; coopmat C; + A = coopmat_square(A); coopMatLoad(A, ssbo32.data, 256 * gl_WorkGroupID.x, 16, Layout); coopMatLoad(B, ssbo32.data, 256 * gl_WorkGroupID.x, 16, Layout); coopMatLoad(C, ssbo32.data, 256 * gl_WorkGroupID.x, 16, Layout); @@ -164,6 +170,13 @@ void lds() coopMatStore(A, blah, 0, 16, Layout); } +void array_of_coopmat() +{ + coopmat As[4]; + for (int i = 0; i < 4; i++) + As[i] = coopmat(float(i)); +} + void main() { loads_32(); @@ -178,4 +191,5 @@ void main() matmul_uint(); matmul_int(); lds(); + array_of_coopmat(); } diff --git a/spirv_glsl.cpp b/spirv_glsl.cpp index b7d9c34f5..1ecb79bae 100644 --- a/spirv_glsl.cpp +++ b/spirv_glsl.cpp @@ -16329,13 +16329,17 @@ string CompilerGLSL::type_to_glsl(const SPIRType &type, uint32_t id) require_extension_internal("GL_ARB_shader_atomic_counters"); } - if (type.op == spv::OpTypeCooperativeMatrixKHR) + const SPIRType *coop_type = &type; + while (is_pointer(*coop_type) || is_array(*coop_type)) + coop_type = &get(coop_type->parent_type); + + if (coop_type->op == spv::OpTypeCooperativeMatrixKHR) { require_extension_internal("GL_KHR_cooperative_matrix"); if (!options.vulkan_semantics) SPIRV_CROSS_THROW("Cooperative matrix only available in Vulkan."); // GLSL doesn't support this as spec constant, which makes sense ... - uint32_t use_type = get(type.cooperative.use_id).scalar(); + uint32_t use_type = get(coop_type->cooperative.use_id).scalar(); const char *use = nullptr; switch (use_type) @@ -16356,10 +16360,10 @@ string CompilerGLSL::type_to_glsl(const SPIRType &type, uint32_t id) SPIRV_CROSS_THROW("Invalid matrix use."); } - return join("coopmat<", type_to_glsl(get(type.parent_type)), ", ", - to_expression(type.cooperative.scope_id), ", ", - to_expression(type.cooperative.rows_id), ", ", - to_expression(type.cooperative.columns_id), ", ", use, ">"); + return join("coopmat<", type_to_glsl(get(coop_type->parent_type)), ", ", + to_expression(coop_type->cooperative.scope_id), ", ", + to_expression(coop_type->cooperative.rows_id), ", ", + to_expression(coop_type->cooperative.columns_id), ", ", use, ">"); } if (type.vecsize == 1 && type.columns == 1) // Scalar builtin