diff options
| author | 2021-04-23 17:47:54 -0400 | |
|---|---|---|
| committer | 2021-07-22 21:51:30 -0400 | |
| commit | 7ecc6de56ae01602b25408db8b6658d7a41a419a (patch) | |
| tree | 2bff17b5b55e9f37ac5e4031c77962216813d5d5 /src/shader_recompiler/ir_opt/texture_pass.cpp | |
| parent | shader: Initial OpenGL implementation (diff) | |
| download | yuzu-7ecc6de56ae01602b25408db8b6658d7a41a419a.tar.gz yuzu-7ecc6de56ae01602b25408db8b6658d7a41a419a.tar.xz yuzu-7ecc6de56ae01602b25408db8b6658d7a41a419a.zip | |
shader: Implement Int32 SUATOM/SURED
Diffstat (limited to 'src/shader_recompiler/ir_opt/texture_pass.cpp')
| -rw-r--r-- | src/shader_recompiler/ir_opt/texture_pass.cpp | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index 2b38bcf42..9e0a2fb09 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp | |||
| @@ -76,6 +76,39 @@ IR::Opcode IndexedInstruction(const IR::Inst& inst) { | |||
| 76 | case IR::Opcode::BoundImageWrite: | 76 | case IR::Opcode::BoundImageWrite: |
| 77 | case IR::Opcode::BindlessImageWrite: | 77 | case IR::Opcode::BindlessImageWrite: |
| 78 | return IR::Opcode::ImageWrite; | 78 | return IR::Opcode::ImageWrite; |
| 79 | case IR::Opcode::BoundImageAtomicIAdd32: | ||
| 80 | case IR::Opcode::BindlessImageAtomicIAdd32: | ||
| 81 | return IR::Opcode::ImageAtomicIAdd32; | ||
| 82 | case IR::Opcode::BoundImageAtomicSMin32: | ||
| 83 | case IR::Opcode::BindlessImageAtomicSMin32: | ||
| 84 | return IR::Opcode::ImageAtomicSMin32; | ||
| 85 | case IR::Opcode::BoundImageAtomicUMin32: | ||
| 86 | case IR::Opcode::BindlessImageAtomicUMin32: | ||
| 87 | return IR::Opcode::ImageAtomicUMin32; | ||
| 88 | case IR::Opcode::BoundImageAtomicSMax32: | ||
| 89 | case IR::Opcode::BindlessImageAtomicSMax32: | ||
| 90 | return IR::Opcode::ImageAtomicSMax32; | ||
| 91 | case IR::Opcode::BoundImageAtomicUMax32: | ||
| 92 | case IR::Opcode::BindlessImageAtomicUMax32: | ||
| 93 | return IR::Opcode::ImageAtomicUMax32; | ||
| 94 | case IR::Opcode::BoundImageAtomicInc32: | ||
| 95 | case IR::Opcode::BindlessImageAtomicInc32: | ||
| 96 | return IR::Opcode::ImageAtomicInc32; | ||
| 97 | case IR::Opcode::BoundImageAtomicDec32: | ||
| 98 | case IR::Opcode::BindlessImageAtomicDec32: | ||
| 99 | return IR::Opcode::ImageAtomicDec32; | ||
| 100 | case IR::Opcode::BoundImageAtomicAnd32: | ||
| 101 | case IR::Opcode::BindlessImageAtomicAnd32: | ||
| 102 | return IR::Opcode::ImageAtomicAnd32; | ||
| 103 | case IR::Opcode::BoundImageAtomicOr32: | ||
| 104 | case IR::Opcode::BindlessImageAtomicOr32: | ||
| 105 | return IR::Opcode::ImageAtomicOr32; | ||
| 106 | case IR::Opcode::BoundImageAtomicXor32: | ||
| 107 | case IR::Opcode::BindlessImageAtomicXor32: | ||
| 108 | return IR::Opcode::ImageAtomicXor32; | ||
| 109 | case IR::Opcode::BoundImageAtomicExchange32: | ||
| 110 | case IR::Opcode::BindlessImageAtomicExchange32: | ||
| 111 | return IR::Opcode::ImageAtomicExchange32; | ||
| 79 | default: | 112 | default: |
| 80 | return IR::Opcode::Void; | 113 | return IR::Opcode::Void; |
| 81 | } | 114 | } |
| @@ -95,6 +128,17 @@ bool IsBindless(const IR::Inst& inst) { | |||
| 95 | case IR::Opcode::BindlessImageGradient: | 128 | case IR::Opcode::BindlessImageGradient: |
| 96 | case IR::Opcode::BindlessImageRead: | 129 | case IR::Opcode::BindlessImageRead: |
| 97 | case IR::Opcode::BindlessImageWrite: | 130 | case IR::Opcode::BindlessImageWrite: |
| 131 | case IR::Opcode::BindlessImageAtomicIAdd32: | ||
| 132 | case IR::Opcode::BindlessImageAtomicSMin32: | ||
| 133 | case IR::Opcode::BindlessImageAtomicUMin32: | ||
| 134 | case IR::Opcode::BindlessImageAtomicSMax32: | ||
| 135 | case IR::Opcode::BindlessImageAtomicUMax32: | ||
| 136 | case IR::Opcode::BindlessImageAtomicInc32: | ||
| 137 | case IR::Opcode::BindlessImageAtomicDec32: | ||
| 138 | case IR::Opcode::BindlessImageAtomicAnd32: | ||
| 139 | case IR::Opcode::BindlessImageAtomicOr32: | ||
| 140 | case IR::Opcode::BindlessImageAtomicXor32: | ||
| 141 | case IR::Opcode::BindlessImageAtomicExchange32: | ||
| 98 | return true; | 142 | return true; |
| 99 | case IR::Opcode::BoundImageSampleImplicitLod: | 143 | case IR::Opcode::BoundImageSampleImplicitLod: |
| 100 | case IR::Opcode::BoundImageSampleExplicitLod: | 144 | case IR::Opcode::BoundImageSampleExplicitLod: |
| @@ -108,6 +152,17 @@ bool IsBindless(const IR::Inst& inst) { | |||
| 108 | case IR::Opcode::BoundImageGradient: | 152 | case IR::Opcode::BoundImageGradient: |
| 109 | case IR::Opcode::BoundImageRead: | 153 | case IR::Opcode::BoundImageRead: |
| 110 | case IR::Opcode::BoundImageWrite: | 154 | case IR::Opcode::BoundImageWrite: |
| 155 | case IR::Opcode::BoundImageAtomicIAdd32: | ||
| 156 | case IR::Opcode::BoundImageAtomicSMin32: | ||
| 157 | case IR::Opcode::BoundImageAtomicUMin32: | ||
| 158 | case IR::Opcode::BoundImageAtomicSMax32: | ||
| 159 | case IR::Opcode::BoundImageAtomicUMax32: | ||
| 160 | case IR::Opcode::BoundImageAtomicInc32: | ||
| 161 | case IR::Opcode::BoundImageAtomicDec32: | ||
| 162 | case IR::Opcode::BoundImageAtomicAnd32: | ||
| 163 | case IR::Opcode::BoundImageAtomicOr32: | ||
| 164 | case IR::Opcode::BoundImageAtomicXor32: | ||
| 165 | case IR::Opcode::BoundImageAtomicExchange32: | ||
| 111 | return false; | 166 | return false; |
| 112 | default: | 167 | default: |
| 113 | throw InvalidArgument("Invalid opcode {}", inst.GetOpcode()); | 168 | throw InvalidArgument("Invalid opcode {}", inst.GetOpcode()); |
| @@ -359,11 +414,22 @@ void TexturePass(Environment& env, IR::Program& program) { | |||
| 359 | u32 index; | 414 | u32 index; |
| 360 | switch (inst->GetOpcode()) { | 415 | switch (inst->GetOpcode()) { |
| 361 | case IR::Opcode::ImageRead: | 416 | case IR::Opcode::ImageRead: |
| 417 | case IR::Opcode::ImageAtomicIAdd32: | ||
| 418 | case IR::Opcode::ImageAtomicSMin32: | ||
| 419 | case IR::Opcode::ImageAtomicUMin32: | ||
| 420 | case IR::Opcode::ImageAtomicSMax32: | ||
| 421 | case IR::Opcode::ImageAtomicUMax32: | ||
| 422 | case IR::Opcode::ImageAtomicInc32: | ||
| 423 | case IR::Opcode::ImageAtomicDec32: | ||
| 424 | case IR::Opcode::ImageAtomicAnd32: | ||
| 425 | case IR::Opcode::ImageAtomicOr32: | ||
| 426 | case IR::Opcode::ImageAtomicXor32: | ||
| 427 | case IR::Opcode::ImageAtomicExchange32: | ||
| 362 | case IR::Opcode::ImageWrite: { | 428 | case IR::Opcode::ImageWrite: { |
| 363 | if (cbuf.has_secondary) { | 429 | if (cbuf.has_secondary) { |
| 364 | throw NotImplementedException("Unexpected separate sampler"); | 430 | throw NotImplementedException("Unexpected separate sampler"); |
| 365 | } | 431 | } |
| 366 | const bool is_written{inst->GetOpcode() == IR::Opcode::ImageWrite}; | 432 | const bool is_written{inst->GetOpcode() != IR::Opcode::ImageRead}; |
| 367 | if (flags.type == TextureType::Buffer) { | 433 | if (flags.type == TextureType::Buffer) { |
| 368 | index = descriptors.Add(ImageBufferDescriptor{ | 434 | index = descriptors.Add(ImageBufferDescriptor{ |
| 369 | .format = flags.image_format, | 435 | .format = flags.image_format, |