diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/shader_bytecode.h | 4 | ||||
| -rw-r--r-- | src/video_core/shader/decode/memory.cpp | 15 |
2 files changed, 13 insertions, 6 deletions
diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index 713b01c9f..8e915e2ae 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h | |||
| @@ -981,6 +981,10 @@ union Instruction { | |||
| 981 | } | 981 | } |
| 982 | return false; | 982 | return false; |
| 983 | } | 983 | } |
| 984 | |||
| 985 | bool IsComponentEnabled(std::size_t component) const { | ||
| 986 | return ((1ULL << component) & component_mask) != 0; | ||
| 987 | } | ||
| 984 | } txq; | 988 | } txq; |
| 985 | 989 | ||
| 986 | union { | 990 | union { |
diff --git a/src/video_core/shader/decode/memory.cpp b/src/video_core/shader/decode/memory.cpp index 4d075f088..1f418b4e6 100644 --- a/src/video_core/shader/decode/memory.cpp +++ b/src/video_core/shader/decode/memory.cpp | |||
| @@ -324,15 +324,18 @@ u32 ShaderIR::DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc) { | |||
| 324 | const auto& sampler = | 324 | const auto& sampler = |
| 325 | GetSampler(instr.sampler, Tegra::Shader::TextureType::Texture2D, false, false); | 325 | GetSampler(instr.sampler, Tegra::Shader::TextureType::Texture2D, false, false); |
| 326 | 326 | ||
| 327 | u32 indexer = 0; | ||
| 327 | switch (instr.txq.query_type) { | 328 | switch (instr.txq.query_type) { |
| 328 | case Tegra::Shader::TextureQueryType::Dimension: { | 329 | case Tegra::Shader::TextureQueryType::Dimension: { |
| 329 | for (u32 element = 0; element < 4; ++element) { | 330 | for (u32 element = 0; element < 4; ++element) { |
| 330 | MetaTexture meta{sampler, element}; | 331 | if (instr.txq.IsComponentEnabled(element)) { |
| 331 | const Node value = Operation(OperationCode::F4TextureQueryDimensions, | 332 | MetaTexture meta{sampler, element}; |
| 332 | std::move(meta), GetRegister(instr.gpr8)); | 333 | const Node value = Operation(OperationCode::F4TextureQueryDimensions, |
| 333 | SetTemporal(bb, element, value); | 334 | std::move(meta), GetRegister(instr.gpr8)); |
| 335 | SetTemporal(bb, indexer++, value); | ||
| 336 | } | ||
| 334 | } | 337 | } |
| 335 | for (u32 i = 0; i < 4; ++i) { | 338 | for (u32 i = 0; i < indexer; ++i) { |
| 336 | SetRegister(bb, instr.gpr0.Value() + i, GetTemporal(i)); | 339 | SetRegister(bb, instr.gpr0.Value() + i, GetTemporal(i)); |
| 337 | } | 340 | } |
| 338 | break; | 341 | break; |
| @@ -734,4 +737,4 @@ std::tuple<std::size_t, std::size_t> ShaderIR::ValidateAndGetCoordinateElement( | |||
| 734 | return {coord_count, total_coord_count}; | 737 | return {coord_count, total_coord_count}; |
| 735 | } | 738 | } |
| 736 | 739 | ||
| 737 | } // namespace VideoCommon::Shader \ No newline at end of file | 740 | } // namespace VideoCommon::Shader |