Added AssertDSLObjectsReleased setting

Change-Id: Ia63f892305c2347e55560141880a0b6a124b84f6
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/429196
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
This commit is contained in:
Ethan Nicholas 2021-07-16 11:16:27 -04:00 committed by Skia Commit-Bot
parent b22b41d55a
commit 459777a1a4
7 changed files with 28 additions and 5 deletions

View File

@ -74,6 +74,8 @@ struct ProgramSettings {
bool fDSLMarkVarsDeclared = false;
// If true, the DSL should install a memory pool when possible.
bool fDSLUseMemoryPool = true;
// If true, DSL objects assert that they were used prior to destruction
bool fAssertDSLObjectsReleased = true;
// External functions available for use in runtime effects. These values are registered in the
// symbol table of the Program, but ownership is *not* transferred. It is up to the caller to
// keep them alive.

View File

@ -92,8 +92,9 @@ DSLExpression::~DSLExpression() {
return;
}
#endif
SkASSERTF(fExpression == nullptr,
"Expression destroyed without being incorporated into program");
SkASSERTF(!fExpression || !DSLWriter::Settings().fAssertDSLObjectsReleased,
"Expression destroyed without being incorporated into program (see "
"ProgramSettings::fAssertDSLObjectsReleased)");
}
void DSLExpression::swap(DSLExpression& other) {

View File

@ -25,7 +25,7 @@ void DSLFunction::init(DSLModifiers modifiers, const DSLType& returnType, skstd:
modifiers.fModifiers.fFlags |= Modifiers::kHasSideEffects_Flag;
}
if (DSLWriter::Context().fConfig->fSettings.fForceNoInline) {
if (DSLWriter::Settings().fForceNoInline) {
// Apply the `noinline` modifier to every function. This allows us to test Runtime
// Effects without any inlining, even when the code is later added to a paint.
modifiers.fModifiers.fFlags &= ~Modifiers::kInline_Flag;

View File

@ -64,7 +64,9 @@ DSLStatement::~DSLStatement() {
return;
}
#endif
SkASSERTF(!fStatement, "Statement destroyed without being incorporated into program");
SkASSERTF(!fStatement || !DSLWriter::Settings().fAssertDSLObjectsReleased,
"Statement destroyed without being incorporated into program (see "
"ProgramSettings::fAssertDSLObjectsReleased)");
}
DSLPossibleStatement::DSLPossibleStatement(std::unique_ptr<SkSL::Statement> statement)

View File

@ -79,7 +79,11 @@ SkSL::IRGenerator& DSLWriter::IRGenerator() {
}
const SkSL::Context& DSLWriter::Context() {
return IRGenerator().fContext;
return Compiler().context();
}
SkSL::ProgramSettings& DSLWriter::Settings() {
return Context().fConfig->fSettings;
}
const std::shared_ptr<SkSL::SymbolTable>& DSLWriter::SymbolTable() {

View File

@ -70,6 +70,11 @@ public:
*/
static const SkSL::Context& Context();
/**
* Returns the Settings used by DSL operations in the current thread.
*/
static SkSL::ProgramSettings& Settings();
/**
* Returns the collection to which DSL program elements in this thread should be appended.
*/

View File

@ -1986,3 +1986,12 @@ DEF_GPUTEST_FOR_MOCK_CONTEXT(DSLInlining, r, ctxInfo) {
"}");
REPORTER_ASSERT(r, *program->fSource == source);
}
DEF_GPUTEST_FOR_MOCK_CONTEXT(DSLReleaseUnused, r, ctxInfo) {
SkSL::ProgramSettings settings = default_settings();
settings.fAssertDSLObjectsReleased = false;
AutoDSLContext context(ctxInfo.directContext()->priv().getGpu(), settings);
If(Sqrt(1) > 0, Discard());
// Ensure that we can safely destroy statements and expressions despite being unused while
// settings.fAssertDSLObjectsReleased is disabled.
}