diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-05-27 17:14:24 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-05-27 17:14:24 +0000 |
commit | 5e242c23f24ecc790b621a5ff5dce80d55b97c77 (patch) | |
tree | 484a1a970bd17c8924c004b2ec56984015b6372f | |
parent | 9dd8bd79f236432daa2ff83735c31e2b1b838513 (diff) | |
parent | 95aeee81c7ec355f1829f20f073a51e32185d480 (diff) | |
download | skia-5e242c23f24ecc790b621a5ff5dce80d55b97c77.tar.gz |
Merge cherrypicks of ['googleplex-android-review.googlesource.com/22896125'] into tm-qpr3-release.android-13.0.0_r83android-13.0.0_r79android-13.0.0_r78android-13.0.0_r77android-13.0.0_r76android-13.0.0_r75android-13.0.0_r71android-13.0.0_r70android-13.0.0_r69android-13.0.0_r68android-13.0.0_r67android-13.0.0_r63android-13.0.0_r62android-13.0.0_r61android13-qpr3-s9-releaseandroid13-qpr3-s8-releaseandroid13-qpr3-s7-releaseandroid13-qpr3-s6-releaseandroid13-qpr3-s5-releaseandroid13-qpr3-s4-releaseandroid13-qpr3-s14-releaseandroid13-qpr3-s13-releaseandroid13-qpr3-s12-releaseandroid13-qpr3-s11-releaseandroid13-qpr3-s10-releaseandroid13-qpr3-release
Change-Id: I1e0eedc7d3d06d3988681fbe64c54a275e103a54
-rw-r--r-- | gn/sksl_tests.gni | 1 | ||||
-rw-r--r-- | resources/sksl/errors/ProgramTooLarge_Parameters.rts | 14 | ||||
-rw-r--r-- | src/sksl/ir/SkSLFunctionDefinition.cpp | 41 | ||||
-rw-r--r-- | tests/sksl/errors/ProgramTooLarge_Parameters.glsl | 6 |
4 files changed, 46 insertions, 16 deletions
diff --git a/gn/sksl_tests.gni b/gn/sksl_tests.gni index d4c4ad4958..fdb0b91aee 100644 --- a/gn/sksl_tests.gni +++ b/gn/sksl_tests.gni @@ -146,6 +146,7 @@ sksl_error_tests = [ "/sksl/errors/PrivateTypes.rts", "/sksl/errors/PrivateVariables.rts", "/sksl/errors/ProgramTooLarge_Globals.rts", + "/sksl/errors/ProgramTooLarge_Parameters.rts", "/sksl/errors/ProgramTooLarge_Stack.rts", "/sksl/errors/PrototypeInFuncBody.rts", "/sksl/errors/RedeclareBasicType.rts", diff --git a/resources/sksl/errors/ProgramTooLarge_Parameters.rts b/resources/sksl/errors/ProgramTooLarge_Parameters.rts new file mode 100644 index 0000000000..cced977be4 --- /dev/null +++ b/resources/sksl/errors/ProgramTooLarge_Parameters.rts @@ -0,0 +1,14 @@ +struct S { + half4 ah4[1]; + half ah[99999]; + half4 h4; + half h; +}; + +void func(int small, + S big_chungus, + S no_report /*we don't need to report overflows past the first*/) {} + +/*%%* +variable 'big_chungus' exceeds the stack size limit +*%%*/ diff --git a/src/sksl/ir/SkSLFunctionDefinition.cpp b/src/sksl/ir/SkSLFunctionDefinition.cpp index 3c7c3d182e..5daee59cc0 100644 --- a/src/sksl/ir/SkSLFunctionDefinition.cpp +++ b/src/sksl/ir/SkSLFunctionDefinition.cpp @@ -21,6 +21,8 @@ #include "src/sksl/transform/SkSLProgramWriter.h" #include <forward_list> +#include <string_view> +#include <vector> namespace SkSL { @@ -80,7 +82,27 @@ std::unique_ptr<FunctionDefinition> FunctionDefinition::Convert(const Context& c FunctionSet* referencedBuiltinFunctions) : fContext(context) , fFunction(function) - , fReferencedBuiltinFunctions(referencedBuiltinFunctions) {} + , fReferencedBuiltinFunctions(referencedBuiltinFunctions) { + // Function parameters count as local variables. + for (const Variable* var : function.parameters()) { + this->addLocalVariable(var, function.fLine); + } + } + + void addLocalVariable(const Variable* var, int line) { + // We count the number of slots used, but don't consider the precision of the base type. + // In practice, this reflects what GPUs actually do pretty well. (i.e., RelaxedPrecision + // math doesn't mean your variable takes less space.) We also don't attempt to reclaim + // slots at the end of a Block. + size_t prevSlotsUsed = fSlotsUsed; + fSlotsUsed = SkSafeMath::Add(fSlotsUsed, var->type().slotCount()); + // To avoid overzealous error reporting, only trigger the error at the first + // place where the stack limit is exceeded. + if (prevSlotsUsed < kVariableSlotLimit && fSlotsUsed >= kVariableSlotLimit) { + fContext.fErrors->error(line, "variable '" + std::string(var->name()) + + "' exceeds the stack size limit"); + } + } ~Finalizer() override { SkASSERT(fBreakableLevel == 0); @@ -144,21 +166,8 @@ std::unique_ptr<FunctionDefinition> FunctionDefinition::Convert(const Context& c bool visitStatement(Statement& stmt) override { switch (stmt.kind()) { case Statement::Kind::kVarDeclaration: { - // We count the number of slots used, but don't consider the precision of the - // base type. In practice, this reflects what GPUs really do pretty well. - // (i.e., RelaxedPrecision math doesn't mean your variable takes less space.) - // We also don't attempt to reclaim slots at the end of a Block. - size_t prevSlotsUsed = fSlotsUsed; - fSlotsUsed = SkSafeMath::Add( - fSlotsUsed, stmt.as<VarDeclaration>().var().type().slotCount()); - // To avoid overzealous error reporting, only trigger the error at the first - // place where the stack limit is exceeded. - if (prevSlotsUsed < kVariableSlotLimit && fSlotsUsed >= kVariableSlotLimit) { - fContext.fErrors->error( - stmt.fLine, - "variable '" + std::string(stmt.as<VarDeclaration>().var().name()) + - "' exceeds the stack size limit"); - } + const Variable* var = &stmt.as<VarDeclaration>().var(); + this->addLocalVariable(var, stmt.fLine); break; } case Statement::Kind::kReturn: { diff --git a/tests/sksl/errors/ProgramTooLarge_Parameters.glsl b/tests/sksl/errors/ProgramTooLarge_Parameters.glsl new file mode 100644 index 0000000000..d92c3256e8 --- /dev/null +++ b/tests/sksl/errors/ProgramTooLarge_Parameters.glsl @@ -0,0 +1,6 @@ +### Compilation failed: + +error: 10: variable 'big_chungus' exceeds the stack size limit + S no_report /*we don't need to report overflows past the first*/) {} + ^^ +1 error |