diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-10-08 04:17:46 +0200 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-10-08 04:17:46 +0200 |
commit | dffaffaac1eb633d5907202df1ca0dbf338a6095 (patch) | |
tree | 29bf9c22b1a0e2092676d7ed14c6091e67f63203 | |
parent | Merge pull request #4731 from lat9nq/mingw-zstd-fix (diff) | |
download | yuzu-dffaffaac1eb633d5907202df1ca0dbf338a6095.tar yuzu-dffaffaac1eb633d5907202df1ca0dbf338a6095.tar.gz yuzu-dffaffaac1eb633d5907202df1ca0dbf338a6095.tar.bz2 yuzu-dffaffaac1eb633d5907202df1ca0dbf338a6095.tar.lz yuzu-dffaffaac1eb633d5907202df1ca0dbf338a6095.tar.xz yuzu-dffaffaac1eb633d5907202df1ca0dbf338a6095.tar.zst yuzu-dffaffaac1eb633d5907202df1ca0dbf338a6095.zip |
-rw-r--r-- | src/video_core/shader/decode/texture.cpp | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/src/video_core/shader/decode/texture.cpp b/src/video_core/shader/decode/texture.cpp index a03b50e39..4e932a4b6 100644 --- a/src/video_core/shader/decode/texture.cpp +++ b/src/video_core/shader/decode/texture.cpp @@ -292,33 +292,36 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) { break; } - std::vector<Node> coords; - - // TODO: Add coordinates for different samplers once other texture types are implemented. - switch (texture_type) { - case TextureType::Texture1D: - coords.push_back(GetRegister(instr.gpr8)); - break; - case TextureType::Texture2D: - coords.push_back(GetRegister(instr.gpr8.Value() + 0)); - coords.push_back(GetRegister(instr.gpr8.Value() + 1)); - break; - default: - UNIMPLEMENTED_MSG("Unhandled texture type {}", static_cast<int>(texture_type)); + const u64 base_index = is_array ? 1 : 0; + const u64 num_components = [texture_type] { + switch (texture_type) { + case TextureType::Texture1D: + return 1; + case TextureType::Texture2D: + return 2; + case TextureType::TextureCube: + return 3; + default: + UNIMPLEMENTED_MSG("Unhandled texture type {}", static_cast<int>(texture_type)); + return 2; + } + }(); + // TODO: What's the array component used for? - // Fallback to interpreting as a 2D texture for now - coords.push_back(GetRegister(instr.gpr8.Value() + 0)); - coords.push_back(GetRegister(instr.gpr8.Value() + 1)); + std::vector<Node> coords; + coords.reserve(num_components); + for (u64 component = 0; component < num_components; ++component) { + coords.push_back(GetRegister(instr.gpr8.Value() + base_index + component)); } + u32 indexer = 0; for (u32 element = 0; element < 2; ++element) { if (!instr.tmml.IsComponentEnabled(element)) { continue; } - auto params = coords; MetaTexture meta{*sampler, {}, {}, {}, {}, {}, {}, {}, {}, element, index_var}; - const Node value = Operation(OperationCode::TextureQueryLod, meta, std::move(params)); - SetTemporary(bb, indexer++, value); + Node value = Operation(OperationCode::TextureQueryLod, meta, coords); + SetTemporary(bb, indexer++, std::move(value)); } for (u32 i = 0; i < indexer; ++i) { SetRegister(bb, instr.gpr0.Value() + i, GetTemporary(i)); |