diff options
| author | bunnei <bunneidev@gmail.com> | 2019-02-14 21:42:34 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-14 21:42:34 -0500 | 
| commit | a8fc5d6edd9997a791b95f2b08cb1362a7a40555 (patch) | |
| tree | c3bfcb8cfc4f47b062922b5661e48c694800b865 | |
| parent | fcc3aa0bbf4a1343f90dfc7a93afc31e770c3a70 (diff) | |
| parent | e60d4d70bc10cf78ab607f26ea835bce6c79f186 (diff) | |
Merge pull request #2111 from ReinUsesLisp/fetch-fix
gl_shader_decompiler: Re-implement TLDS lod
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 55 | ||||
| -rw-r--r-- | src/video_core/shader/decode/memory.cpp | 2 | 
2 files changed, 35 insertions, 22 deletions
| diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index b39bb4843..db18f4dbe 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp @@ -616,17 +616,8 @@ private:      std::string VisitOperand(Operation operation, std::size_t operand_index, Type type) {          std::string value = VisitOperand(operation, operand_index); -          switch (type) { -        case Type::Bool: -        case Type::Bool2: -        case Type::Float: -            return value; -        case Type::Int: -            return "ftoi(" + value + ')'; -        case Type::Uint: -            return "ftou(" + value + ')'; -        case Type::HalfFloat: +        case Type::HalfFloat: {              const auto half_meta = std::get_if<MetaHalfArithmetic>(&operation.GetMeta());              if (!half_meta) {                  value = "toHalf2(" + value + ')'; @@ -643,6 +634,26 @@ private:                  return "vec2(toHalf2(" + value + ")[1])";              }          } +        default: +            return CastOperand(value, type); +        } +    } + +    std::string CastOperand(const std::string& value, Type type) const { +        switch (type) { +        case Type::Bool: +        case Type::Bool2: +        case Type::Float: +            return value; +        case Type::Int: +            return "ftoi(" + value + ')'; +        case Type::Uint: +            return "ftou(" + value + ')'; +        case Type::HalfFloat: +            // Can't be handled as a stand-alone value +            UNREACHABLE(); +            return value; +        }          UNREACHABLE();          return value;      } @@ -650,6 +661,7 @@ private:      std::string BitwiseCastResult(std::string value, Type type, bool needs_parenthesis = false) {          switch (type) {          case Type::Bool: +        case Type::Bool2:          case Type::Float:              if (needs_parenthesis) {                  return '(' + value + ')'; @@ -721,7 +733,7 @@ private:          const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());          ASSERT(meta); -        const auto count = static_cast<u32>(operation.GetOperandsCount()); +        const std::size_t count = operation.GetOperandsCount();          const bool has_array = meta->sampler.IsArray();          const bool has_shadow = meta->sampler.IsShadow(); @@ -732,10 +744,10 @@ private:          expr += coord_constructors.at(count + (has_array ? 1 : 0) + (has_shadow ? 1 : 0) - 1);          expr += '('; -        for (u32 i = 0; i < count; ++i) { +        for (std::size_t i = 0; i < count; ++i) {              expr += Visit(operation[i]); -            const u32 next = i + 1; +            const std::size_t next = i + 1;              if (next < count || has_array || has_shadow)                  expr += ", ";          } @@ -1206,25 +1218,26 @@ private:          const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());          ASSERT(meta);          UNIMPLEMENTED_IF(meta->sampler.IsArray()); -        UNIMPLEMENTED_IF(!meta->extras.empty()); - -        const auto count = static_cast<u32>(operation.GetOperandsCount()); +        const std::size_t count = operation.GetOperandsCount();          std::string expr = "texelFetch(";          expr += GetSampler(meta->sampler);          expr += ", "; -        expr += constructors.at(count - 1); +        expr += constructors.at(operation.GetOperandsCount() - 1);          expr += '('; -        for (u32 i = 0; i < count; ++i) { +        for (std::size_t i = 0; i < count; ++i) {              expr += VisitOperand(operation, i, Type::Int); - -            const u32 next = i + 1; +            const std::size_t next = i + 1;              if (next == count)                  expr += ')'; -            if (next < count) +            else if (next < count)                  expr += ", ";          } +        for (std::size_t i = 0; i < meta->extras.size(); ++i) { +            expr += ", "; +            expr += CastOperand(Visit(meta->extras.at(i)), Type::Int); +        }          expr += ')';          return expr + GetSwizzle(meta->element); diff --git a/src/video_core/shader/decode/memory.cpp b/src/video_core/shader/decode/memory.cpp index 523421794..55ec601ff 100644 --- a/src/video_core/shader/decode/memory.cpp +++ b/src/video_core/shader/decode/memory.cpp @@ -429,7 +429,7 @@ u32 ShaderIR::DecodeMemory(NodeBlock& bb, u32 pc) {          UNIMPLEMENTED_IF_MSG(instr.tlds.UsesMiscMode(TextureMiscMode::MZ), "MZ is not implemented");          if (instr.tlds.UsesMiscMode(TextureMiscMode::NODEP)) { -            LOG_WARNING(HW_GPU, "TMML.NODEP implementation is incomplete"); +            LOG_WARNING(HW_GPU, "TLDS.NODEP implementation is incomplete");          }          WriteTexsInstructionFloat(bb, instr, GetTldsCode(instr, texture_type, is_array)); | 
