Merge pull request #2068 from ReinUsesLisp/shader-cleanup-textures

shader_ir: Clean texture management code
This commit is contained in:
bunnei 2019-02-12 10:20:15 -05:00 committed by GitHub
commit 27e5efd265
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 123 additions and 153 deletions

View file

@ -719,45 +719,51 @@ private:
constexpr std::array<const char*, 4> coord_constructors = {"float", "vec2", "vec3", "vec4"};
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
const auto count = static_cast<u32>(operation.GetOperandsCount());
ASSERT(meta);
const auto count = static_cast<u32>(operation.GetOperandsCount());
const bool has_array = meta->sampler.IsArray();
const bool has_shadow = meta->sampler.IsShadow();
std::string expr = func;
expr += '(';
expr += GetSampler(meta->sampler);
expr += ", ";
expr += coord_constructors[meta->coords_count - 1];
expr += coord_constructors.at(count + (has_array ? 1 : 0) + (has_shadow ? 1 : 0) - 1);
expr += '(';
for (u32 i = 0; i < count; ++i) {
const bool is_extra = i >= meta->coords_count;
const bool is_array = i == meta->array_index;
expr += Visit(operation[i]);
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 += ')';
}
if (i + 1 < count) {
const u32 next = i + 1;
if (next < count || has_array || has_shadow)
expr += ", ";
}
if (has_array) {
expr += "float(ftoi(" + Visit(meta->array) + "))";
}
if (has_shadow) {
if (has_array)
expr += ", ";
expr += Visit(meta->depth_compare);
}
expr += ')';
for (const Node extra : meta->extras) {
expr += ", ";
if (is_extra_int) {
if (const auto immediate = std::get_if<ImmediateNode>(extra)) {
// Inline the string as an immediate integer in GLSL (some extra arguments are
// required to be constant)
expr += std::to_string(static_cast<s32>(immediate->GetValue()));
} else {
expr += "ftoi(" + Visit(extra) + ')';
}
} else {
expr += Visit(extra);
}
}
expr += ')';
return expr;
}
@ -1134,7 +1140,7 @@ private:
Type::HalfFloat);
}
std::string F4Texture(Operation operation) {
std::string Texture(Operation operation) {
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
ASSERT(meta);
@ -1145,7 +1151,7 @@ private:
return expr + GetSwizzle(meta->element);
}
std::string F4TextureLod(Operation operation) {
std::string TextureLod(Operation operation) {
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
ASSERT(meta);
@ -1156,7 +1162,7 @@ private:
return expr + GetSwizzle(meta->element);
}
std::string F4TextureGather(Operation operation) {
std::string TextureGather(Operation operation) {
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
ASSERT(meta);
@ -1164,7 +1170,7 @@ private:
GetSwizzle(meta->element);
}
std::string F4TextureQueryDimensions(Operation operation) {
std::string TextureQueryDimensions(Operation operation) {
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
ASSERT(meta);
@ -1184,7 +1190,7 @@ private:
return "0";
}
std::string F4TextureQueryLod(Operation operation) {
std::string TextureQueryLod(Operation operation) {
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
ASSERT(meta);
@ -1195,29 +1201,32 @@ private:
return "0";
}
std::string F4TexelFetch(Operation operation) {
std::string TexelFetch(Operation operation) {
constexpr std::array<const char*, 4> constructors = {"int", "ivec2", "ivec3", "ivec4"};
const auto meta = std::get_if<MetaTexture>(&operation.GetMeta());
const auto count = static_cast<u32>(operation.GetOperandsCount());
ASSERT(meta);
UNIMPLEMENTED_IF(meta->sampler.IsArray());
UNIMPLEMENTED_IF(!meta->extras.empty());
const auto count = static_cast<u32>(operation.GetOperandsCount());
std::string expr = "texelFetch(";
expr += GetSampler(meta->sampler);
expr += ", ";
expr += constructors[meta->coords_count - 1];
expr += constructors.at(count - 1);
expr += '(';
for (u32 i = 0; i < count; ++i) {
expr += VisitOperand(operation, i, Type::Int);
if (i + 1 == meta->coords_count) {
const u32 next = i + 1;
if (next == count)
expr += ')';
}
if (i + 1 < count) {
if (next < count)
expr += ", ";
}
}
expr += ')';
return expr + GetSwizzle(meta->element);
}
@ -1454,12 +1463,12 @@ private:
&GLSLDecompiler::Logical2HNotEqual,
&GLSLDecompiler::Logical2HGreaterEqual,
&GLSLDecompiler::F4Texture,
&GLSLDecompiler::F4TextureLod,
&GLSLDecompiler::F4TextureGather,
&GLSLDecompiler::F4TextureQueryDimensions,
&GLSLDecompiler::F4TextureQueryLod,
&GLSLDecompiler::F4TexelFetch,
&GLSLDecompiler::Texture,
&GLSLDecompiler::TextureLod,
&GLSLDecompiler::TextureGather,
&GLSLDecompiler::TextureQueryDimensions,
&GLSLDecompiler::TextureQueryLod,
&GLSLDecompiler::TexelFetch,
&GLSLDecompiler::Branch,
&GLSLDecompiler::PushFlowStack,