summaryrefslogtreecommitdiff
path: root/src/shader_recompiler
diff options
context:
space:
mode:
authorGravatar ameerj2021-05-25 22:13:50 -0400
committerGravatar ameerj2021-07-22 21:51:36 -0400
commit5399906c26292634ab3eec5fce88640092e9c4c2 (patch)
tree1205e3116c0592a42a4ad5173cbf9716372489ac /src/shader_recompiler
parentglsl: Update phi node management (diff)
downloadyuzu-5399906c26292634ab3eec5fce88640092e9c4c2.tar.gz
yuzu-5399906c26292634ab3eec5fce88640092e9c4c2.tar.xz
yuzu-5399906c26292634ab3eec5fce88640092e9c4c2.zip
glsl: Track S32 atomics
Diffstat (limited to 'src/shader_recompiler')
-rw-r--r--src/shader_recompiler/backend/glsl/emit_context.cpp9
-rw-r--r--src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp10
-rw-r--r--src/shader_recompiler/shader_info.h3
3 files changed, 16 insertions, 6 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp
index 6f769fa10..7b6c6d22b 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_context.cpp
@@ -110,9 +110,12 @@ void EmitContext::DefineHelperFunctions() {
110 code += "uint CasFloatMax16x2(uint op_a,f16vec2 op_b){return " 110 code += "uint CasFloatMax16x2(uint op_a,f16vec2 op_b){return "
111 "packFloat2x16(max(unpackFloat2x16(op_a),op_b));}\n"; 111 "packFloat2x16(max(unpackFloat2x16(op_a),op_b));}\n";
112 } 112 }
113 // TODO: Track this usage 113 if (info.uses_atomic_s32_min) {
114 code += "uint CasMinS32(uint op_a,uint op_b){return uint(min(int(op_a),int(op_b)));}"; 114 code += "uint CasMinS32(uint op_a,uint op_b){return uint(min(int(op_a),int(op_b)));}";
115 code += "uint CasMaxS32(uint op_a,uint op_b){return uint(max(int(op_a),int(op_b)));}"; 115 }
116 if (info.uses_atomic_s32_max) {
117 code += "uint CasMaxS32(uint op_a,uint op_b){return uint(max(int(op_a),int(op_b)));}";
118 }
116} 119}
117 120
118} // namespace Shader::Backend::GLSL 121} // namespace Shader::Backend::GLSL
diff --git a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
index fb2031fc8..c22e5992a 100644
--- a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
+++ b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
@@ -687,9 +687,7 @@ void VisitUsages(Info& info, IR::Inst& inst) {
687 case IR::Opcode::LoadStorage32: 687 case IR::Opcode::LoadStorage32:
688 case IR::Opcode::WriteStorage32: 688 case IR::Opcode::WriteStorage32:
689 case IR::Opcode::StorageAtomicIAdd32: 689 case IR::Opcode::StorageAtomicIAdd32:
690 case IR::Opcode::StorageAtomicSMin32:
691 case IR::Opcode::StorageAtomicUMin32: 690 case IR::Opcode::StorageAtomicUMin32:
692 case IR::Opcode::StorageAtomicSMax32:
693 case IR::Opcode::StorageAtomicUMax32: 691 case IR::Opcode::StorageAtomicUMax32:
694 case IR::Opcode::StorageAtomicAnd32: 692 case IR::Opcode::StorageAtomicAnd32:
695 case IR::Opcode::StorageAtomicOr32: 693 case IR::Opcode::StorageAtomicOr32:
@@ -759,6 +757,14 @@ void VisitUsages(Info& info, IR::Inst& inst) {
759 info.used_storage_buffer_types |= IR::Type::U32; 757 info.used_storage_buffer_types |= IR::Type::U32;
760 info.uses_atomic_f32x2_max = true; 758 info.uses_atomic_f32x2_max = true;
761 break; 759 break;
760 case IR::Opcode::StorageAtomicSMin32:
761 info.used_storage_buffer_types |= IR::Type::U32;
762 info.uses_atomic_s32_min = true;
763 break;
764 case IR::Opcode::StorageAtomicSMax32:
765 info.used_storage_buffer_types |= IR::Type::U32;
766 info.uses_atomic_s32_max = true;
767 break;
762 case IR::Opcode::GlobalAtomicIAdd64: 768 case IR::Opcode::GlobalAtomicIAdd64:
763 case IR::Opcode::GlobalAtomicSMin64: 769 case IR::Opcode::GlobalAtomicSMin64:
764 case IR::Opcode::GlobalAtomicUMin64: 770 case IR::Opcode::GlobalAtomicUMin64:
diff --git a/src/shader_recompiler/shader_info.h b/src/shader_recompiler/shader_info.h
index be05eafcf..9f7f0b42c 100644
--- a/src/shader_recompiler/shader_info.h
+++ b/src/shader_recompiler/shader_info.h
@@ -189,8 +189,9 @@ struct Info {
189 bool uses_atomic_f32x2_add{}; 189 bool uses_atomic_f32x2_add{};
190 bool uses_atomic_f32x2_min{}; 190 bool uses_atomic_f32x2_min{};
191 bool uses_atomic_f32x2_max{}; 191 bool uses_atomic_f32x2_max{};
192 bool uses_atomic_s32_min{};
193 bool uses_atomic_s32_max{};
192 bool uses_int64_bit_atomics{}; 194 bool uses_int64_bit_atomics{};
193 bool uses_s32_atomics{};
194 bool uses_global_memory{}; 195 bool uses_global_memory{};
195 bool uses_atomic_image_u32{}; 196 bool uses_atomic_image_u32{};
196 197