summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-17 22:38:50 -0300
committerGravatar ReinUsesLisp2019-12-17 23:38:10 -0300
commit15a753b9a5b5cd08520c7ee78ea2a93d06f6b316 (patch)
treeced1451fd72c34aa1f3f8d1690b4dc03d4438208
parentMerge pull request #3173 from yuzu-emu/bunnei-spscqueue (diff)
downloadyuzu-15a753b9a5b5cd08520c7ee78ea2a93d06f6b316.tar.gz
yuzu-15a753b9a5b5cd08520c7ee78ea2a93d06f6b316.tar.xz
yuzu-15a753b9a5b5cd08520c7ee78ea2a93d06f6b316.zip
shader/texture: Properly shrink unused entries in size mismatches
When a image format mismatches we were inserting zeroes to the texture itself. This was not handling cases were the mismatch uses less coordinates than the guest shader code. Address that by resizing the vector.
-rw-r--r--src/video_core/shader/decode/texture.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/video_core/shader/decode/texture.cpp b/src/video_core/shader/decode/texture.cpp
index 994c05611..dff01a541 100644
--- a/src/video_core/shader/decode/texture.cpp
+++ b/src/video_core/shader/decode/texture.cpp
@@ -743,13 +743,18 @@ Node4 ShaderIR::GetTldsCode(Instruction instr, TextureType texture_type, bool is
743 // When lod is used always is in gpr20 743 // When lod is used always is in gpr20
744 const Node lod = lod_enabled ? GetRegister(instr.gpr20) : Immediate(0); 744 const Node lod = lod_enabled ? GetRegister(instr.gpr20) : Immediate(0);
745 745
746 // Fill empty entries from the guest sampler. 746 // Fill empty entries from the guest sampler
747 const std::size_t entry_coord_count = GetCoordCount(sampler.GetType()); 747 const std::size_t entry_coord_count = GetCoordCount(sampler.GetType());
748 if (type_coord_count != entry_coord_count) { 748 if (type_coord_count != entry_coord_count) {
749 LOG_WARNING(HW_GPU, "Bound and built texture types mismatch"); 749 LOG_WARNING(HW_GPU, "Bound and built texture types mismatch");
750 } 750
751 for (std::size_t i = type_coord_count; i < entry_coord_count; ++i) { 751 // When the size is higher we insert zeroes
752 coords.push_back(GetRegister(Register::ZeroIndex)); 752 for (std::size_t i = type_coord_count; i < entry_coord_count; ++i) {
753 coords.push_back(GetRegister(Register::ZeroIndex));
754 }
755
756 // Then we ensure the size matches the number of entries (dropping unused values)
757 coords.resize(entry_coord_count);
753 } 758 }
754 759
755 Node4 values; 760 Node4 values;