diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-04-27 20:50:35 -0300 | 
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-06-20 21:36:12 -0300 | 
| commit | 4e81fc8296c6204645151bbaa23a7d80827a4293 (patch) | |
| tree | e826cbe2f9fd118a82d251854872eb7d300a6078 /src/video_core | |
| parent | d267948a73d2364949660a24d07833ea05c9fcc8 (diff) | |
shader: Implement texture buffers
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/engines/shader_bytecode.h | 16 | ||||
| -rw-r--r-- | src/video_core/shader/decode/texture.cpp | 44 | ||||
| -rw-r--r-- | src/video_core/shader/shader_ir.h | 2 | 
3 files changed, 62 insertions, 0 deletions
| diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index ffb3ec3e0..5b32e1249 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h @@ -1232,6 +1232,20 @@ union Instruction {      } texs;      union { +        BitField<28, 1, u64> is_array; +        BitField<29, 2, TextureType> texture_type; +        BitField<35, 1, u64> aoffi; +        BitField<49, 1, u64> nodep_flag; +        BitField<50, 1, u64> ms; // Multisample? +        BitField<54, 1, u64> cl; +        BitField<55, 1, u64> process_mode; + +        TextureProcessMode GetTextureProcessMode() const { +            return process_mode == 0 ? TextureProcessMode::LZ : TextureProcessMode::LL; +        } +    } tld; + +    union {          BitField<49, 1, u64> nodep_flag;          BitField<53, 4, u64> texture_info; @@ -1408,6 +1422,7 @@ public:          TXQ,    // Texture Query          TXQ_B,  // Texture Query Bindless          TEXS,   // Texture Fetch with scalar/non-vec4 source/destinations +        TLD,    // Texture Load          TLDS,   // Texture Load with scalar/non-vec4 source/destinations          TLD4,   // Texture Load 4          TLD4S,  // Texture Load 4 with scalar / non - vec4 source / destinations @@ -1682,6 +1697,7 @@ private:              INST("1101111101001---", Id::TXQ, Type::Texture, "TXQ"),              INST("1101111101010---", Id::TXQ_B, Type::Texture, "TXQ_B"),              INST("1101-00---------", Id::TEXS, Type::Texture, "TEXS"), +            INST("11011100--11----", Id::TLD, Type::Texture, "TLD"),              INST("1101101---------", Id::TLDS, Type::Texture, "TLDS"),              INST("110010----111---", Id::TLD4, Type::Texture, "TLD4"),              INST("1101111100------", Id::TLD4S, Type::Texture, "TLD4S"), diff --git a/src/video_core/shader/decode/texture.cpp b/src/video_core/shader/decode/texture.cpp index 4a356dbd4..b22831c64 100644 --- a/src/video_core/shader/decode/texture.cpp +++ b/src/video_core/shader/decode/texture.cpp @@ -245,6 +245,18 @@ u32 ShaderIR::DecodeTexture(NodeBlock& bb, u32 pc) {          }          break;      } +    case OpCode::Id::TLD: { +        UNIMPLEMENTED_IF_MSG(instr.tld.aoffi, "AOFFI is not implemented"); +        UNIMPLEMENTED_IF_MSG(instr.tld.ms, "MS is not implemented"); +        UNIMPLEMENTED_IF_MSG(instr.tld.cl, "CL is not implemented"); + +        if (instr.tld.nodep_flag) { +            LOG_WARNING(HW_GPU, "TLD.NODEP implementation is incomplete"); +        } + +        WriteTexInstructionFloat(bb, instr, GetTldCode(instr)); +        break; +    }      case OpCode::Id::TLDS: {          const Tegra::Shader::TextureType texture_type{instr.tlds.GetTextureType()};          const bool is_array{instr.tlds.IsArrayTexture()}; @@ -575,6 +587,38 @@ Node4 ShaderIR::GetTld4Code(Instruction instr, TextureType texture_type, bool de      return values;  } +Node4 ShaderIR::GetTldCode(Tegra::Shader::Instruction instr) { +    const auto texture_type{instr.tld.texture_type}; +    const bool is_array{instr.tld.is_array}; +    const bool lod_enabled{instr.tld.GetTextureProcessMode() == TextureProcessMode::LL}; +    const std::size_t coord_count{GetCoordCount(texture_type)}; + +    u64 gpr8_cursor{instr.gpr8.Value()}; +    const Node array_register{is_array ? GetRegister(gpr8_cursor++) : nullptr}; + +    std::vector<Node> coords; +    for (std::size_t i = 0; i < coord_count; ++i) { +        coords.push_back(GetRegister(gpr8_cursor++)); +    } + +    u64 gpr20_cursor{instr.gpr20.Value()}; +    // const Node bindless_register{is_bindless ? GetRegister(gpr20_cursor++) : nullptr}; +    const Node lod{lod_enabled ? GetRegister(gpr20_cursor++) : Immediate(0u)}; +    // const Node aoffi_register{is_aoffi ? GetRegister(gpr20_cursor++) : nullptr}; +    // const Node multisample{is_multisample ? GetRegister(gpr20_cursor++) : nullptr}; + +    const auto& sampler = GetSampler(instr.sampler, texture_type, is_array, false); + +    Node4 values; +    for (u32 element = 0; element < values.size(); ++element) { +        auto coords_copy = coords; +        MetaTexture meta{sampler, array_register, {}, {}, {}, lod, {}, element}; +        values[element] = Operation(OperationCode::TexelFetch, meta, std::move(coords_copy)); +    } + +    return values; +} +  Node4 ShaderIR::GetTldsCode(Instruction instr, TextureType texture_type, bool is_array) {      const std::size_t type_coord_count = GetCoordCount(texture_type);      const bool lod_enabled = instr.tlds.GetTextureProcessMode() == TextureProcessMode::LL; diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h index edcf2288e..1b84c0672 100644 --- a/src/video_core/shader/shader_ir.h +++ b/src/video_core/shader/shader_ir.h @@ -277,6 +277,8 @@ private:      Node4 GetTld4Code(Tegra::Shader::Instruction instr, Tegra::Shader::TextureType texture_type,                        bool depth_compare, bool is_array, bool is_aoffi); +    Node4 GetTldCode(Tegra::Shader::Instruction instr); +      Node4 GetTldsCode(Tegra::Shader::Instruction instr, Tegra::Shader::TextureType texture_type,                        bool is_array); | 
