summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/shader/decode/texture.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/video_core/shader/decode/texture.cpp b/src/video_core/shader/decode/texture.cpp
index 4b14cdf58..cf99cc5be 100644
--- a/src/video_core/shader/decode/texture.cpp
+++ b/src/video_core/shader/decode/texture.cpp
@@ -161,16 +161,16 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
161 case OpCode::Id::TXD: { 161 case OpCode::Id::TXD: {
162 UNIMPLEMENTED_IF_MSG(instr.txd.UsesMiscMode(TextureMiscMode::AOFFI), 162 UNIMPLEMENTED_IF_MSG(instr.txd.UsesMiscMode(TextureMiscMode::AOFFI),
163 "AOFFI is not implemented"); 163 "AOFFI is not implemented");
164 UNIMPLEMENTED_IF_MSG(instr.txd.is_array != 0, "TXD Array is not implemented");
165 164
165 const bool is_array = instr.txd.is_array != 0;
166 u64 base_reg = instr.gpr8.Value(); 166 u64 base_reg = instr.gpr8.Value();
167 const auto derivate_reg = instr.gpr20.Value(); 167 const auto derivate_reg = instr.gpr20.Value();
168 const auto texture_type = instr.txd.texture_type.Value(); 168 const auto texture_type = instr.txd.texture_type.Value();
169 const auto coord_count = GetCoordCount(texture_type); 169 const auto coord_count = GetCoordCount(texture_type);
170 170
171 const Sampler* sampler = is_bindless 171 const Sampler* sampler =
172 ? GetBindlessSampler(base_reg, {{texture_type, false, false}}) 172 is_bindless ? GetBindlessSampler(base_reg, {{texture_type, is_array, false}})
173 : GetSampler(instr.sampler, {{texture_type, false, false}}); 173 : GetSampler(instr.sampler, {{texture_type, is_array, false}});
174 Node4 values; 174 Node4 values;
175 if (sampler == nullptr) { 175 if (sampler == nullptr) {
176 for (u32 element = 0; element < values.size(); ++element) { 176 for (u32 element = 0; element < values.size(); ++element) {
@@ -179,6 +179,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
179 WriteTexInstructionFloat(bb, instr, values); 179 WriteTexInstructionFloat(bb, instr, values);
180 break; 180 break;
181 } 181 }
182
182 if (is_bindless) { 183 if (is_bindless) {
183 base_reg++; 184 base_reg++;
184 } 185 }
@@ -192,8 +193,14 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {
192 derivates.push_back(GetRegister(derivate_reg + derivate + 1)); 193 derivates.push_back(GetRegister(derivate_reg + derivate + 1));
193 } 194 }
194 195
196 Node array_node = {};
197 if (is_array) {
198 const Node info_reg = GetRegister(base_reg + coord_count);
199 array_node = BitfieldExtract(info_reg, 0, 16);
200 }
201
195 for (u32 element = 0; element < values.size(); ++element) { 202 for (u32 element = 0; element < values.size(); ++element) {
196 MetaTexture meta{*sampler, {}, {}, {}, {}, derivates, {}, {}, {}, element}; 203 MetaTexture meta{*sampler, array_node, {}, {}, {}, derivates, {}, {}, {}, element};
197 values[element] = Operation(OperationCode::TextureGradient, std::move(meta), coords); 204 values[element] = Operation(OperationCode::TextureGradient, std::move(meta), coords);
198 } 205 }
199 206