SkSL now supports uniform array types
Change-Id: I809e9c424ee92b05f0a87d75d1384c92849e1474
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/308498
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/src/sksl/SkSLCPPCodeGenerator.cpp b/src/sksl/SkSLCPPCodeGenerator.cpp
index c641fbd..21ac37a 100644
--- a/src/sksl/SkSLCPPCodeGenerator.cpp
+++ b/src/sksl/SkSLCPPCodeGenerator.cpp
@@ -168,6 +168,18 @@
const Layout& layout,
const String& cppCode,
std::vector<String>* formatArgs) {
+ if (type.kind() == Type::kArray_Kind) {
+ String result("[");
+ const char* separator = "";
+ for (int i = 0; i < type.columns(); i++) {
+ result += separator + this->formatRuntimeValue(type.componentType(), layout,
+ "(" + cppCode + ")[" + to_string(i) +
+ "]", formatArgs);
+ separator = ",";
+ }
+ result += "]";
+ return result;
+ }
if (type.isFloat()) {
formatArgs->push_back(cppCode);
return "%f";
@@ -678,11 +690,21 @@
if (var.fModifiers.fLayout.fWhen.fLength) {
this->writef(" if (%s) {\n ", String(var.fModifiers.fLayout.fWhen).c_str());
}
- const char* type = glsltype_string(fContext, var.fType);
String name(var.fName);
- this->writef(" %sVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,"
- " %s, \"%s\");\n", HCodeGenerator::FieldName(name.c_str()).c_str(), type,
- name.c_str());
+ if (var.fType.kind() != Type::kArray_Kind) {
+ this->writef(" %sVar = args.fUniformHandler->addUniform(&_outer, "
+ "kFragment_GrShaderFlag, %s, \"%s\");\n",
+ HCodeGenerator::FieldName(name.c_str()).c_str(),
+ glsltype_string(fContext, var.fType),
+ name.c_str());
+ } else {
+ this->writef(" %sVar = args.fUniformHandler->addUniformArray(&_outer, "
+ "kFragment_GrShaderFlag, %s, \"%s\", %d);\n",
+ HCodeGenerator::FieldName(name.c_str()).c_str(),
+ glsltype_string(fContext, var.fType.componentType()),
+ name.c_str(),
+ var.fType.columns());
+ }
if (var.fModifiers.fLayout.fWhen.fLength) {
this->write(" }\n");
}