diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/shader/decode/texture.cpp | 17 |
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 | ||