diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-12-12 00:43:43 +0100 |
---|---|---|
committer | FernandoS27 <fsahmkow27@gmail.com> | 2019-12-12 00:53:17 +0100 |
commit | c0ee0aa1a8266b0f5c5568cf1af3cb6247156720 (patch) | |
tree | 05f7f369b89ae7793f539350104081aacfbd2f8e /src | |
parent | Shader_Ir: Correct TLD4S encoding and implement f16 flag. (diff) | |
download | yuzu-c0ee0aa1a8266b0f5c5568cf1af3cb6247156720.tar yuzu-c0ee0aa1a8266b0f5c5568cf1af3cb6247156720.tar.gz yuzu-c0ee0aa1a8266b0f5c5568cf1af3cb6247156720.tar.bz2 yuzu-c0ee0aa1a8266b0f5c5568cf1af3cb6247156720.tar.lz yuzu-c0ee0aa1a8266b0f5c5568cf1af3cb6247156720.tar.xz yuzu-c0ee0aa1a8266b0f5c5568cf1af3cb6247156720.tar.zst yuzu-c0ee0aa1a8266b0f5c5568cf1af3cb6247156720.zip |
Diffstat (limited to 'src')
-rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 8 | ||||
-rw-r--r-- | src/video_core/shader/decode/texture.cpp | 17 |
2 files changed, 16 insertions, 9 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 45c2d464f..d1ae4be6d 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp @@ -1091,7 +1091,8 @@ private: expr += "Offset"; } expr += '(' + GetSampler(meta->sampler) + ", "; - expr += coord_constructors.at(count + (has_array ? 1 : 0) + (has_shadow && !sepparate_dc ? 1 : 0) - 1); + expr += coord_constructors.at(count + (has_array ? 1 : 0) + + (has_shadow && !sepparate_dc ? 1 : 0) - 1); expr += '('; for (std::size_t i = 0; i < count; ++i) { expr += Visit(operation[i]).AsFloat(); @@ -1712,14 +1713,13 @@ private: const auto type = meta->sampler.IsShadow() ? Type::Float : Type::Int; if (meta->sampler.IsShadow()) { - return {GenerateTexture(operation, "Gather", - {TextureAoffi{}}, true) + + return {GenerateTexture(operation, "Gather", {TextureAoffi{}}, true) + GetSwizzle(meta->element), Type::Float}; } else { return {GenerateTexture(operation, "Gather", {TextureAoffi{}, TextureArgument{type, meta->component}}, - true) + + false) + GetSwizzle(meta->element), Type::Float}; } diff --git a/src/video_core/shader/decode/texture.cpp b/src/video_core/shader/decode/texture.cpp index 9aef5ddd5..994c05611 100644 --- a/src/video_core/shader/decode/texture.cpp +++ b/src/video_core/shader/decode/texture.cpp @@ -107,8 +107,8 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) { break; } case OpCode::Id::TLD4S: { - UNIMPLEMENTED_IF_MSG(instr.tld4s.UsesMiscMode(TextureMiscMode::AOFFI), - "AOFFI is not implemented"); + const bool uses_aoffi = instr.tld4s.UsesMiscMode(TextureMiscMode::AOFFI); + UNIMPLEMENTED_IF_MSG(uses_aoffi, "AOFFI is not implemented"); const bool depth_compare = instr.tld4s.UsesMiscMode(TextureMiscMode::DC); const Node op_a = GetRegister(instr.gpr8); @@ -116,15 +116,22 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) { // TODO(Subv): Figure out how the sampler type is encoded in the TLD4S instruction. std::vector<Node> coords; + Node dc_reg; if (depth_compare) { // Note: TLD4S coordinate encoding works just like TEXS's const Node op_y = GetRegister(instr.gpr8.Value() + 1); coords.push_back(op_a); coords.push_back(op_y); - coords.push_back(op_b); + dc_reg = uses_aoffi ? GetRegister(instr.gpr20.Value() + 1) : op_b; } else { coords.push_back(op_a); - coords.push_back(op_b); + if (uses_aoffi) { + const Node op_y = GetRegister(instr.gpr8.Value() + 1); + coords.push_back(op_y); + } else { + coords.push_back(op_b); + } + dc_reg = {}; } const Node component = Immediate(static_cast<u32>(instr.tld4s.component)); @@ -134,7 +141,7 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) { Node4 values; for (u32 element = 0; element < values.size(); ++element) { auto coords_copy = coords; - MetaTexture meta{sampler, {}, {}, {}, {}, {}, {}, component, element}; + MetaTexture meta{sampler, {}, dc_reg, {}, {}, {}, {}, component, element}; values[element] = Operation(OperationCode::TextureGather, meta, std::move(coords_copy)); } |