summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/ir_opt/texture_pass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/ir_opt/texture_pass.cpp')
-rw-r--r--src/shader_recompiler/ir_opt/texture_pass.cpp68
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,