|
|
|
@ -689,7 +689,7 @@ private: |
|
|
|
} |
|
|
|
|
|
|
|
std::string GenerateTexture(Operation operation, const std::string& func, |
|
|
|
std::string extra_cast(std::string) = nullptr) { |
|
|
|
bool is_extra_int = false) { |
|
|
|
constexpr std::array<const char*, 4> coord_constructors = {"float", "vec2", "vec3", "vec4"}; |
|
|
|
|
|
|
|
const auto& meta = std::get<MetaTexture>(operation.GetMeta()); |
|
|
|
@ -706,15 +706,24 @@ private: |
|
|
|
const bool is_extra = i >= meta.coords_count; |
|
|
|
const bool is_array = i == meta.array_index; |
|
|
|
|
|
|
|
std::string operand = Visit(operation[i]); |
|
|
|
if (is_extra && extra_cast != nullptr) { |
|
|
|
operand = extra_cast(operand); |
|
|
|
} |
|
|
|
std::string operand = [&]() { |
|
|
|
if (is_extra && is_extra_int) { |
|
|
|
if (const auto immediate = std::get_if<ImmediateNode>(operation[i])) { |
|
|
|
return std::to_string(static_cast<s32>(immediate->GetValue())); |
|
|
|
} else { |
|
|
|
return "ftoi(" + Visit(operation[i]) + ')'; |
|
|
|
} |
|
|
|
} else { |
|
|
|
return Visit(operation[i]); |
|
|
|
} |
|
|
|
}(); |
|
|
|
if (is_array) { |
|
|
|
ASSERT(!is_extra); |
|
|
|
operand = "float(ftoi(" + operand + "))"; |
|
|
|
} |
|
|
|
|
|
|
|
expr += operand; |
|
|
|
|
|
|
|
if (i + 1 == meta.coords_count) { |
|
|
|
expr += ')'; |
|
|
|
} |
|
|
|
@ -1118,16 +1127,8 @@ private: |
|
|
|
|
|
|
|
std::string F4TextureGather(Operation operation) { |
|
|
|
const auto meta = std::get<MetaTexture>(operation.GetMeta()); |
|
|
|
|
|
|
|
std::string expr; |
|
|
|
if (meta.sampler.IsShadow()) { |
|
|
|
expr = GenerateTexture(operation, "textureGather", |
|
|
|
[](std::string ref_z) { return ref_z; }); |
|
|
|
} else { |
|
|
|
expr = GenerateTexture(operation, "textureGather", |
|
|
|
[](std::string comp) { return "ftoi(" + comp + ')'; }); |
|
|
|
} |
|
|
|
return expr + GetSwizzle(meta.element); |
|
|
|
return GenerateTexture(operation, "textureGather", !meta.sampler.IsShadow()) + |
|
|
|
GetSwizzle(meta.element); |
|
|
|
} |
|
|
|
|
|
|
|
std::string F4TextureQueryDimensions(Operation operation) { |
|
|
|
|