From 4ebd56bf9e36c8ae4477e69be388a1bee00b3f89 Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Wed, 3 Nov 2021 00:03:26 -0400 Subject: [PATCH] MSL: Correctly emit user(clip/cullN) for clip/cull builtins in tess output struct. Only emit user(locnN) for tess builtin input variables, and allow output builtin to emit user(clip/cullN). Previously, output builtin would emit location if input builtin also existed. --- spirv_msl.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spirv_msl.cpp b/spirv_msl.cpp index c1ec1d1e..9a154099 100644 --- a/spirv_msl.cpp +++ b/spirv_msl.cpp @@ -2251,7 +2251,7 @@ void CompilerMSL::add_plain_variable_to_interface_block(StorageClass storage, co set_member_decoration(ib_type.self, ib_mbr_idx, DecorationComponent, comp); mark_location_as_used_by_shader(locn, get(type_id), storage); } - else if (is_builtin && is_tessellation_shader() && inputs_by_builtin.count(builtin)) + else if (is_builtin && is_tessellation_shader() && storage == StorageClassInput && inputs_by_builtin.count(builtin)) { uint32_t locn = inputs_by_builtin[builtin].location; set_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn); @@ -2416,7 +2416,7 @@ void CompilerMSL::add_composite_variable_to_interface_block(StorageClass storage set_member_decoration(ib_type.self, ib_mbr_idx, DecorationComponent, comp); mark_location_as_used_by_shader(locn, *usable_type, storage); } - else if (is_builtin && is_tessellation_shader() && inputs_by_builtin.count(builtin)) + else if (is_builtin && is_tessellation_shader() && storage == StorageClassInput && inputs_by_builtin.count(builtin)) { uint32_t locn = inputs_by_builtin[builtin].location + i; set_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn); @@ -2589,7 +2589,7 @@ void CompilerMSL::add_composite_member_variable_to_interface_block(StorageClass set_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn); mark_location_as_used_by_shader(locn, *usable_type, storage); } - else if (is_builtin && is_tessellation_shader() && inputs_by_builtin.count(builtin)) + else if (is_builtin && is_tessellation_shader() && storage == StorageClassInput && inputs_by_builtin.count(builtin)) { uint32_t locn = inputs_by_builtin[builtin].location + i; set_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn); @@ -2780,7 +2780,7 @@ void CompilerMSL::add_plain_member_variable_to_interface_block(StorageClass stor set_member_decoration(ib_type.self, ib_mbr_idx, DecorationLocation, locn); mark_location_as_used_by_shader(locn, get(mbr_type_id), storage); } - else if (is_builtin && is_tessellation_shader() && inputs_by_builtin.count(builtin)) + else if (is_builtin && is_tessellation_shader() && storage == StorageClassInput && inputs_by_builtin.count(builtin)) { uint32_t locn = 0; auto builtin_itr = inputs_by_builtin.find(builtin);