forked from suyu/suyu
Merge pull request #2111 from ReinUsesLisp/fetch-fix
gl_shader_decompiler: Re-implement TLDS lod
This commit is contained in:
commit
a8fc5d6edd
2 changed files with 35 additions and 22 deletions
|
@ -616,17 +616,8 @@ private:
|
||||||
|
|
||||||
std::string VisitOperand(Operation operation, std::size_t operand_index, Type type) {
|
std::string VisitOperand(Operation operation, std::size_t operand_index, Type type) {
|
||||||
std::string value = VisitOperand(operation, operand_index);
|
std::string value = VisitOperand(operation, operand_index);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Type::Bool:
|
case Type::HalfFloat: {
|
||||||
case Type::Bool2:
|
|
||||||
case Type::Float:
|
|
||||||
return value;
|
|
||||||
case Type::Int:
|
|
||||||
return "ftoi(" + value + ')';
|
|
||||||
case Type::Uint:
|
|
||||||
return "ftou(" + value + ')';
|
|
||||||
case Type::HalfFloat:
|
|
||||||
const auto half_meta = std::get_if<MetaHalfArithmetic>(&operation.GetMeta());
|
const auto half_meta = std::get_if<MetaHalfArithmetic>(&operation.GetMeta());
|
||||||
if (!half_meta) {
|
if (!half_meta) {
|
||||||
value = "toHalf2(" + value + ')';
|
value = "toHalf2(" + value + ')';
|
||||||
|
@ -643,6 +634,26 @@ private:
|
||||||
return "vec2(toHalf2(" + value + ")[1])";
|
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();
|
UNREACHABLE();
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -650,6 +661,7 @@ private:
|
||||||
std::string BitwiseCastResult(std::string value, Type type, bool needs_parenthesis = false) {
|
std::string BitwiseCastResult(std::string value, Type type, bool needs_parenthesis = false) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Type::Bool:
|
case Type::Bool:
|
||||||
|
case Type::Bool2:
|
||||||
case Type::Float:
|
case Type::Float:
|
||||||
if (needs_parenthesis) {
|
if (needs_parenthesis) {
|
||||||
return '(' + value + ')';
|
return '(' + value + ')';
|
||||||
|
@ -721,7 +733,7 @@ private:
|
||||||
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
|
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
|
||||||
ASSERT(meta);
|
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_array = meta->sampler.IsArray();
|
||||||
const bool has_shadow = meta->sampler.IsShadow();
|
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 += coord_constructors.at(count + (has_array ? 1 : 0) + (has_shadow ? 1 : 0) - 1);
|
||||||
expr += '(';
|
expr += '(';
|
||||||
for (u32 i = 0; i < count; ++i) {
|
for (std::size_t i = 0; i < count; ++i) {
|
||||||
expr += Visit(operation[i]);
|
expr += Visit(operation[i]);
|
||||||
|
|
||||||
const u32 next = i + 1;
|
const std::size_t next = i + 1;
|
||||||
if (next < count || has_array || has_shadow)
|
if (next < count || has_array || has_shadow)
|
||||||
expr += ", ";
|
expr += ", ";
|
||||||
}
|
}
|
||||||
|
@ -1206,25 +1218,26 @@ private:
|
||||||
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
|
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
|
||||||
ASSERT(meta);
|
ASSERT(meta);
|
||||||
UNIMPLEMENTED_IF(meta->sampler.IsArray());
|
UNIMPLEMENTED_IF(meta->sampler.IsArray());
|
||||||
UNIMPLEMENTED_IF(!meta->extras.empty());
|
const std::size_t count = operation.GetOperandsCount();
|
||||||
|
|
||||||
const auto count = static_cast<u32>(operation.GetOperandsCount());
|
|
||||||
|
|
||||||
std::string expr = "texelFetch(";
|
std::string expr = "texelFetch(";
|
||||||
expr += GetSampler(meta->sampler);
|
expr += GetSampler(meta->sampler);
|
||||||
expr += ", ";
|
expr += ", ";
|
||||||
|
|
||||||
expr += constructors.at(count - 1);
|
expr += constructors.at(operation.GetOperandsCount() - 1);
|
||||||
expr += '(';
|
expr += '(';
|
||||||
for (u32 i = 0; i < count; ++i) {
|
for (std::size_t i = 0; i < count; ++i) {
|
||||||
expr += VisitOperand(operation, i, Type::Int);
|
expr += VisitOperand(operation, i, Type::Int);
|
||||||
|
const std::size_t next = i + 1;
|
||||||
const u32 next = i + 1;
|
|
||||||
if (next == count)
|
if (next == count)
|
||||||
expr += ')';
|
expr += ')';
|
||||||
if (next < count)
|
else if (next < count)
|
||||||
expr += ", ";
|
expr += ", ";
|
||||||
}
|
}
|
||||||
|
for (std::size_t i = 0; i < meta->extras.size(); ++i) {
|
||||||
|
expr += ", ";
|
||||||
|
expr += CastOperand(Visit(meta->extras.at(i)), Type::Int);
|
||||||
|
}
|
||||||
expr += ')';
|
expr += ')';
|
||||||
|
|
||||||
return expr + GetSwizzle(meta->element);
|
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");
|
UNIMPLEMENTED_IF_MSG(instr.tlds.UsesMiscMode(TextureMiscMode::MZ), "MZ is not implemented");
|
||||||
|
|
||||||
if (instr.tlds.UsesMiscMode(TextureMiscMode::NODEP)) {
|
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));
|
WriteTexsInstructionFloat(bb, instr, GetTldsCode(instr, texture_type, is_array));
|
||||||
|
|
Loading…
Reference in a new issue