Only perform unrolled-size check on valid code.
This analysis pass assumes we have a program with a valid structure--all
loops must be ES2-compliant, and all function-calls must reference real
functions that exist. If we detected an error during compilation, our
program might not meet these criteria.
Change-Id: I4c7aefb3221438643614f1e0cbc2bad40b94b161
Bug: skia:12396
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/444982
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index 3c90c4e..5ab501f 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -811,16 +811,15 @@
// FunctionReference or TypeReference expressions. Report these as errors.
Analysis::VerifyStaticTestsAndExpressions(program);
- // If we're in ES2 mode (runtime effects), do a pass to enforce Appendix A, Section 5 of the
- // GLSL ES 1.00 spec -- Indexing. Don't bother if we've already found errors - this logic
- // assumes that all loops meet the criteria of Section 4, and if they don't, could crash.
+ // Verify that the program conforms to ES2 limitations.
if (fContext->fConfig->strictES2Mode() && this->errorCount() == 0) {
+ // Enforce Appendix A, Section 5 of the GLSL ES 1.00 spec -- Indexing. This logic assumes
+ // that all loops meet the criteria of Section 4, and if they don't, could crash.
for (const auto& pe : program.ownedElements()) {
Analysis::ValidateIndexingForES2(*pe, this->errorReporter());
}
- }
-
- if (fContext->fConfig->strictES2Mode()) {
+ // Verify that the program size is reasonable after unrolling and inlining. This also
+ // issues errors for static recursion and overly-deep function-call chains.
Analysis::CheckProgramUnrolledSize(program);
}