gl_shader_decompiler: Re-implement TLDS lod
This commit is contained in:
		@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user