diff options
| author | 2021-05-25 22:13:50 -0400 | |
|---|---|---|
| committer | 2021-07-22 21:51:36 -0400 | |
| commit | 5399906c26292634ab3eec5fce88640092e9c4c2 (patch) | |
| tree | 1205e3116c0592a42a4ad5173cbf9716372489ac /src/shader_recompiler | |
| parent | glsl: Update phi node management (diff) | |
| download | yuzu-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.cpp | 9 | ||||
| -rw-r--r-- | src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp | 10 | ||||
| -rw-r--r-- | src/shader_recompiler/shader_info.h | 3 |
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 | ||