diff options
| author | 2019-11-12 13:43:08 -0400 | |
|---|---|---|
| committer | 2019-11-14 11:15:27 -0400 | |
| commit | cd0f5dfc17209eab146879faad51186b130c4951 (patch) | |
| tree | 0185de18a433f22edb69260d3f54779419e2b807 /src/video_core/shader/decode | |
| parent | Shader_IR: Implement FLO instruction. (diff) | |
| download | yuzu-cd0f5dfc17209eab146879faad51186b130c4951.tar.gz yuzu-cd0f5dfc17209eab146879faad51186b130c4951.tar.xz yuzu-cd0f5dfc17209eab146879faad51186b130c4951.zip | |
Shader_IR: Implement TXD instruction.
Diffstat (limited to 'src/video_core/shader/decode')
| -rw-r--r-- | src/video_core/shader/decode/texture.cpp | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/src/video_core/shader/decode/texture.cpp b/src/video_core/shader/decode/texture.cpp index bb926a132..0e501919d 100644 --- a/src/video_core/shader/decode/texture.cpp +++ b/src/video_core/shader/decode/texture.cpp | |||
| @@ -134,13 +134,55 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) { | |||
| 134 | Node4 values; | 134 | Node4 values; |
| 135 | for (u32 element = 0; element < values.size(); ++element) { | 135 | for (u32 element = 0; element < values.size(); ++element) { |
| 136 | auto coords_copy = coords; | 136 | auto coords_copy = coords; |
| 137 | MetaTexture meta{sampler, {}, {}, {}, {}, {}, component, element}; | 137 | MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, component, element}; |
| 138 | values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy)); | 138 | values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy)); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | WriteTexsInstructionFloat(bb, instr, values, true); | 141 | WriteTexsInstructionFloat(bb, instr, values, true); |
| 142 | break; | 142 | break; |
| 143 | } | 143 | } |
| 144 | case OpCode::Id::TXD_B: | ||
| 145 | is_bindless = true; | ||
| 146 | [[fallthrough]]; | ||
| 147 | case OpCode::Id::TXD: { | ||
| 148 | UNIMPLEMENTED_IF_MSG(instr.txd.UsesMiscMode(TextureMiscMode::AOFFI), | ||
| 149 | "AOFFI is not implemented"); | ||
| 150 | const auto is_array = static_cast<bool>(instr.txd.is_array != 0); | ||
| 151 | UNIMPLEMENTED_IF_MSG(is_array, "TXD Array is not implemented"); | ||
| 152 | |||
| 153 | u64 base_reg = instr.gpr8.Value(); | ||
| 154 | const auto derivate_reg = instr.gpr20.Value(); | ||
| 155 | const auto texture_type = instr.txd.texture_type.Value(); | ||
| 156 | const auto coord_count = GetCoordCount(texture_type); | ||
| 157 | |||
| 158 | const auto& sampler = is_bindless | ||
| 159 | ? GetBindlessSampler(base_reg, {{texture_type, false, false}}) | ||
| 160 | : GetSampler(instr.sampler, {{texture_type, false, false}}); | ||
| 161 | if (is_bindless) { | ||
| 162 | base_reg++; | ||
| 163 | } | ||
| 164 | |||
| 165 | std::vector<Node> coords; | ||
| 166 | std::vector<Node> derivates; | ||
| 167 | for (std::size_t i = 0; i < coord_count; ++i) { | ||
| 168 | coords.push_back(GetRegister(base_reg + i)); | ||
| 169 | const std::size_t derivate = i * 2; | ||
| 170 | derivates.push_back(GetRegister(derivate_reg + derivate)); | ||
| 171 | derivates.push_back(GetRegister(derivate_reg + derivate + 1)); | ||
| 172 | } | ||
| 173 | |||
| 174 | Node4 values; | ||
| 175 | for (u32 element = 0; element < values.size(); ++element) { | ||
| 176 | auto coords_copy = coords; | ||
| 177 | MetaTexture meta{sampler, {}, {}, {}, derivates, {}, {}, {}, element}; | ||
| 178 | values[element] = | ||
| 179 | Operation(OperationCode::TextureGradient, meta, std::move(coords_copy)); | ||
| 180 | } | ||
| 181 | |||
| 182 | WriteTexInstructionFloat(bb, instr, values); | ||
| 183 | |||
| 184 | break; | ||
| 185 | } | ||
| 144 | case OpCode::Id::TXQ_B: | 186 | case OpCode::Id::TXQ_B: |
| 145 | is_bindless = true; | 187 | is_bindless = true; |
| 146 | [[fallthrough]]; | 188 | [[fallthrough]]; |
| @@ -158,7 +200,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) { | |||
| 158 | if (!instr.txq.IsComponentEnabled(element)) { | 200 | if (!instr.txq.IsComponentEnabled(element)) { |
| 159 | continue; | 201 | continue; |
| 160 | } | 202 | } |
| 161 | MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, element}; | 203 | MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, {}, element}; |
| 162 | const Node value = | 204 | const Node value = |
| 163 | Operation(OperationCode::TextureQueryDimensions, meta, | 205 | Operation(OperationCode::TextureQueryDimensions, meta, |
| 164 | GetRegister(instr.gpr8.Value() + (is_bindless ? 1 : 0))); | 206 | GetRegister(instr.gpr8.Value() + (is_bindless ? 1 : 0))); |
| @@ -213,7 +255,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) { | |||
| 213 | continue; | 255 | continue; |
| 214 | } | 256 | } |
| 215 | auto params = coords; | 257 | auto params = coords; |
| 216 | MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, element}; | 258 | MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, {}, element}; |
| 217 | const Node value = Operation(OperationCode::TextureQueryLod, meta, std::move(params)); | 259 | const Node value = Operation(OperationCode::TextureQueryLod, meta, std::move(params)); |
| 218 | SetTemporary(bb, indexer++, value); | 260 | SetTemporary(bb, indexer++, value); |
| 219 | } | 261 | } |
| @@ -461,7 +503,7 @@ Node4 ShaderIR::GetTextureCode(Instruction instr, TextureType texture_type, | |||
| 461 | Node4 values; | 503 | Node4 values; |
| 462 | for (u32 element = 0; element < values.size(); ++element) { | 504 | for (u32 element = 0; element < values.size(); ++element) { |
| 463 | auto copy_coords = coords; | 505 | auto copy_coords = coords; |
| 464 | MetaTexture meta{sampler, array, depth_compare, aoffi, bias, lod, {}, element}; | 506 | MetaTexture meta{sampler, array, depth_compare, aoffi, {}, bias, lod, {}, element}; |
| 465 | values[element] = Operation(read_method, meta, std::move(copy_coords)); | 507 | values[element] = Operation(read_method, meta, std::move(copy_coords)); |
| 466 | } | 508 | } |
| 467 | 509 | ||
| @@ -594,7 +636,7 @@ Node4 ShaderIR::GetTld4Code(Instruction instr, TextureType texture_type, bool de | |||
| 594 | Node4 values; | 636 | Node4 values; |
| 595 | for (u32 element = 0; element < values.size(); ++element) { | 637 | for (u32 element = 0; element < values.size(); ++element) { |
| 596 | auto coords_copy = coords; | 638 | auto coords_copy = coords; |
| 597 | MetaTexture meta{sampler, GetRegister(array_register), dc, aoffi, {}, {}, component, | 639 | MetaTexture meta{sampler, GetRegister(array_register), dc, aoffi, {}, {}, {}, component, |
| 598 | element}; | 640 | element}; |
| 599 | values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy)); | 641 | values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy)); |
| 600 | } | 642 | } |
| @@ -628,7 +670,7 @@ Node4 ShaderIR::GetTldCode(Tegra::Shader::Instruction instr) { | |||
| 628 | Node4 values; | 670 | Node4 values; |
| 629 | for (u32 element = 0; element < values.size(); ++element) { | 671 | for (u32 element = 0; element < values.size(); ++element) { |
| 630 | auto coords_copy = coords; | 672 | auto coords_copy = coords; |
| 631 | MetaTexture meta{sampler, array_register, {}, {}, {}, lod, {}, element}; | 673 | MetaTexture meta{sampler, array_register, {}, {}, {}, {}, lod, {}, element}; |
| 632 | values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy)); | 674 | values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy)); |
| 633 | } | 675 | } |
| 634 | 676 | ||
| @@ -664,7 +706,7 @@ Node4 ShaderIR::GetTldsCode(Instruction instr, TextureType texture_type, bool is | |||
| 664 | Node4 values; | 706 | Node4 values; |
| 665 | for (u32 element = 0; element < values.size(); ++element) { | 707 | for (u32 element = 0; element < values.size(); ++element) { |
| 666 | auto coords_copy = coords; | 708 | auto coords_copy = coords; |
| 667 | MetaTexture meta{sampler, array, {}, {}, {}, lod, {}, element}; | 709 | MetaTexture meta{sampler, array, {}, {}, {}, {}, lod, {}, element}; |
| 668 | values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy)); | 710 | values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy)); |
| 669 | } | 711 | } |
| 670 | return values; | 712 | return values; |