summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/engines/shader_bytecode.h4
-rw-r--r--src/video_core/shader/decode/memory.cpp15
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