From bd85a105ba7b3ee2008d20fb9281bfb47325ad0e Mon Sep 17 00:00:00 2001 From: Brian Salomon Date: Tue, 15 Nov 2016 19:09:52 -0500 Subject: Add support for image load to SkSL GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=4865 Change-Id: I4647e6b255946ced2b1b8cb05e62f0f5a8ad28b6 Reviewed-on: https://skia-review.googlesource.com/4865 Commit-Queue: Brian Salomon Reviewed-by: Ethan Nicholas --- src/sksl/ast/SkSLASTLayout.h | 69 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) (limited to 'src/sksl/ast') diff --git a/src/sksl/ast/SkSLASTLayout.h b/src/sksl/ast/SkSLASTLayout.h index 2aec31e4df..e7bfd12056 100644 --- a/src/sksl/ast/SkSLASTLayout.h +++ b/src/sksl/ast/SkSLASTLayout.h @@ -19,9 +19,68 @@ namespace SkSL { * layout (location = 0) int x; */ struct ASTLayout : public ASTNode { + // These are used by images in GLSL. We only support a subset of what GL supports. + enum class Format { + kUnspecified = -1, + kRGBA32F, + kR32F, + kRGBA16F, + kR16F, + kRGBA8, + kR8, + kRGBA8I, + kR8I, + }; + + static const char* FormatToStr(Format format) { + switch (format) { + case Format::kUnspecified: return ""; + case Format::kRGBA32F: return "rgba32f"; + case Format::kR32F: return "r32f"; + case Format::kRGBA16F: return "rgba16f"; + case Format::kR16F: return "r16f"; + case Format::kRGBA8: return "rgba8"; + case Format::kR8: return "r8"; + case Format::kRGBA8I: return "rgba8i"; + case Format::kR8I: return "r8i"; + } + SkFAIL("Unexpected format"); + return ""; + } + + static bool ReadFormat(std::string str, Format* format) { + if (str == "rgba32f") { + *format = Format::kRGBA32F; + return true; + } else if (str == "r32f") { + *format = Format::kR32F; + return true; + } else if (str == "rgba16f") { + *format = Format::kRGBA16F; + return true; + } else if (str == "r16f") { + *format = Format::kR16F; + return true; + } else if (str == "rgba8") { + *format = Format::kRGBA8; + return true; + } else if (str == "r8") { + *format = Format::kR8; + return true; + } else if (str == "rgba8i") { + *format = Format::kRGBA8I; + return true; + } else if (str == "r8i") { + *format = Format::kR8I; + return true; + } + return false; + } + // For int parameters, a -1 means no value ASTLayout(int location, int binding, int index, int set, int builtin, bool originUpperLeft, - bool overrideCoverage, bool blendSupportAllEquations, bool pushConstant) + bool overrideCoverage, bool blendSupportAllEquations, bool pushConstant, + Format format) : fLocation(location) , fBinding(binding) , fIndex(index) @@ -30,7 +89,8 @@ struct ASTLayout : public ASTNode { , fOriginUpperLeft(originUpperLeft) , fOverrideCoverage(overrideCoverage) , fBlendSupportAllEquations(blendSupportAllEquations) - , fPushConstant(pushConstant) {} + , fPushConstant(pushConstant) + , fFormat(format) {} std::string description() const { std::string result; @@ -71,6 +131,10 @@ struct ASTLayout : public ASTNode { result += separator + "push_constant"; separator = ", "; } + if (fFormat != Format::kUnspecified) { + result += separator + FormatToStr(fFormat); + separator = ", "; + } if (result.length() > 0) { result = "layout (" + result + ")"; } @@ -86,6 +150,7 @@ struct ASTLayout : public ASTNode { const bool fOverrideCoverage; const bool fBlendSupportAllEquations; const bool fPushConstant; + const Format fFormat; }; } // namespace -- cgit v1.2.3