Moved RTAdjust into ThreadContext
Change-Id: I3b53b710237a6866097442272f8f3380a9e7a868
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/458724
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index 7be396e..4049a03 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -21,6 +21,7 @@
#include "src/sksl/SkSLConstantFolder.h"
#include "src/sksl/SkSLIntrinsicMap.h"
#include "src/sksl/SkSLOperators.h"
+#include "src/sksl/SkSLThreadContext.h"
#include "src/sksl/SkSLUtil.h"
#include "src/sksl/ir/SkSLBinaryExpression.h"
#include "src/sksl/ir/SkSLBreakStatement.h"
@@ -71,7 +72,8 @@
using OwnerKind = SkSL::FieldAccess::OwnerKind;
// If this is a vertex program that uses RTAdjust, and this is main()...
- if ((fRTAdjust || fRTAdjustInterfaceBlock) && decl.isMain() &&
+ ThreadContext::RTAdjustData& rtAdjust = ThreadContext::RTAdjustState();
+ if ((rtAdjust.fVar || rtAdjust.fInterfaceBlock) && decl.isMain() &&
ProgramKind::kVertex == this->programKind()) {
// ... append a line to the end of the function body which fixes up sk_Position.
const Variable* skPerVertex = nullptr;
@@ -93,9 +95,9 @@
OwnerKind::kAnonymousInterfaceBlock));
};
auto Adjust = [&]() -> DSLExpression {
- return DSLExpression(fRTAdjustInterfaceBlock
- ? Field(fRTAdjustInterfaceBlock, fRTAdjustFieldIndex)
- : Ref(fRTAdjust));
+ return DSLExpression(rtAdjust.fInterfaceBlock
+ ? Field(rtAdjust.fInterfaceBlock, rtAdjust.fFieldIndex)
+ : Ref(rtAdjust.fVar));
};
auto fixupStmt = DSLStatement(
@@ -174,8 +176,9 @@
const Type::Field& f = fields[i];
if (f.fName == Compiler::RTADJUST_NAME) {
if (*f.fType == *fContext.fTypes.fFloat4) {
- fRTAdjustInterfaceBlock = &intf.variable();
- fRTAdjustFieldIndex = i;
+ ThreadContext::RTAdjustData& rtAdjust = ThreadContext::RTAdjustState();
+ rtAdjust.fInterfaceBlock = &intf.variable();
+ rtAdjust.fFieldIndex = i;
} else {
this->errorReporter().error(intf.fLine, "sk_RTAdjust must have type 'float4'");
}
@@ -243,8 +246,6 @@
fSymbolTable = base.fSymbols;
fInputs = {};
- fRTAdjust = nullptr;
- fRTAdjustInterfaceBlock = nullptr;
fDefinedStructs.clear();
SymbolTable::Push(&fSymbolTable, fContext.fConfig->fIsBuiltinCode);
diff --git a/src/sksl/SkSLIRGenerator.h b/src/sksl/SkSLIRGenerator.h
index 73e1ec9..865ad98 100644
--- a/src/sksl/SkSLIRGenerator.h
+++ b/src/sksl/SkSLIRGenerator.h
@@ -59,6 +59,10 @@
Program::Inputs fInputs;
};
+ void start(const ParsedModule& base,
+ std::vector<std::unique_ptr<ProgramElement>>* elements,
+ std::vector<const ProgramElement*>* sharedElements);
+
/**
* If externalFunctions is supplied, those 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.
@@ -89,18 +93,9 @@
std::unique_ptr<Expression> convertIdentifier(int line, skstd::string_view identifier);
- bool haveRTAdjustInterfaceBlock() { return fRTAdjustInterfaceBlock != nullptr; }
-
- int getRTAdjustFieldIndex() { return fRTAdjustFieldIndex; }
-
const Context& fContext;
- const Variable* fRTAdjust = nullptr;
private:
- void start(const ParsedModule& base,
- std::vector<std::unique_ptr<ProgramElement>>* elements,
- std::vector<const ProgramElement*>* sharedElements);
-
IRGenerator::IRBundle finish();
void scanInterfaceBlock(SkSL::InterfaceBlock& intf);
@@ -131,8 +126,6 @@
std::unordered_set<const Type*> fDefinedStructs;
std::vector<std::unique_ptr<ProgramElement>>* fProgramElements = nullptr;
std::vector<const ProgramElement*>* fSharedElements = nullptr;
- const Variable* fRTAdjustInterfaceBlock = nullptr;
- int fRTAdjustFieldIndex;
friend class AutoSymbolTable;
friend class AutoLoopLevel;
diff --git a/src/sksl/SkSLThreadContext.cpp b/src/sksl/SkSLThreadContext.cpp
index 5fe3023..8b95e32 100644
--- a/src/sksl/SkSLThreadContext.cpp
+++ b/src/sksl/SkSLThreadContext.cpp
@@ -90,6 +90,10 @@
return Context().fModifiersPool->add(modifiers);
}
+ThreadContext::RTAdjustData& ThreadContext::RTAdjustState() {
+ return Instance().fRTAdjust;
+}
+
#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU
void ThreadContext::StartFragmentProcessor(GrFragmentProcessor::ProgramImpl* processor,
GrFragmentProcessor::ProgramImpl::EmitArgs* emitArgs) {
diff --git a/src/sksl/SkSLThreadContext.h b/src/sksl/SkSLThreadContext.h
index 8959f15..e8c96af 100644
--- a/src/sksl/SkSLThreadContext.h
+++ b/src/sksl/SkSLThreadContext.h
@@ -115,6 +115,20 @@
*/
static const SkSL::Modifiers* Modifiers(const SkSL::Modifiers& modifiers);
+ struct RTAdjustData {
+ // Points to a standalone sk_RTAdjust variable, if one exists.
+ const Variable* fVar = nullptr;
+ // Points to the interface block containing an sk_RTAdjust field, if one exists.
+ const Variable* fInterfaceBlock = nullptr;
+ // If fInterfaceBlock is non-null, contains the index of the sk_RTAdjust field within it.
+ int fFieldIndex = -1;
+ };
+
+ /**
+ * Returns a struct containing information about the RTAdjust variable.
+ */
+ static RTAdjustData& RTAdjustState();
+
#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU
/**
* Returns the fragment processor for which DSL output is being generated for the current
@@ -195,6 +209,7 @@
ErrorReporter& fOldErrorReporter;
ProgramSettings fSettings;
Mangler fMangler;
+ RTAdjustData fRTAdjust;
#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU
struct StackFrame {
GrFragmentProcessor::ProgramImpl* fProcessor;
diff --git a/src/sksl/ir/SkSLVarDeclarations.cpp b/src/sksl/ir/SkSLVarDeclarations.cpp
index d63397a..5a74b77 100644
--- a/src/sksl/ir/SkSLVarDeclarations.cpp
+++ b/src/sksl/ir/SkSLVarDeclarations.cpp
@@ -179,7 +179,7 @@
var->storage() == Variable::Storage::kInterfaceBlock) &&
var->name() == Compiler::RTADJUST_NAME) {
// `sk_RTAdjust` is special, and makes the IR generator emit position-fixup expressions.
- if (ThreadContext::IRGenerator().fRTAdjust) {
+ if (ThreadContext::RTAdjustState().fVar || ThreadContext::RTAdjustState().fInterfaceBlock) {
context.fErrors->error(var->fLine, "duplicate definition of 'sk_RTAdjust'");
return nullptr;
}
@@ -187,7 +187,7 @@
context.fErrors->error(var->fLine, "sk_RTAdjust must have type 'float4'");
return nullptr;
}
- ThreadContext::IRGenerator().fRTAdjust = var.get();
+ ThreadContext::RTAdjustState().fVar = var.get();
}
if (addToSymbolTable) {
diff --git a/src/sksl/ir/SkSLVariable.h b/src/sksl/ir/SkSLVariable.h
index c2b4957..4e4cab9 100644
--- a/src/sksl/ir/SkSLVariable.h
+++ b/src/sksl/ir/SkSLVariable.h
@@ -58,6 +58,7 @@
static std::unique_ptr<Variable> Make(const Context& context, int line,
const Modifiers& modifiers, const Type* baseType, skstd::string_view name, bool isArray,
std::unique_ptr<Expression> arraySize, Variable::Storage storage);
+
/**
* Creates a local scratch variable and the associated VarDeclaration statement.
* Useful when doing IR rewrites, e.g. inlining a function call.
diff --git a/tests/SkSLDSLTest.cpp b/tests/SkSLDSLTest.cpp
index ec5cf1d..6d31185 100644
--- a/tests/SkSLDSLTest.cpp
+++ b/tests/SkSLDSLTest.cpp
@@ -2036,13 +2036,13 @@
{
AutoDSLContext context(ctxInfo.directContext()->priv().getGpu(), no_mark_vars_declared(),
SkSL::ProgramKind::kVertex);
- REPORTER_ASSERT(r, !SkSL::ThreadContext::IRGenerator().haveRTAdjustInterfaceBlock());
+ REPORTER_ASSERT(r, !SkSL::ThreadContext::RTAdjustState().fInterfaceBlock);
DSLGlobalVar intf = InterfaceBlock(kUniform_Modifier, "uniforms",
{ Field(kInt_Type, "unused"),
Field(kFloat4_Type, "sk_RTAdjust") });
- REPORTER_ASSERT(r, SkSL::ThreadContext::IRGenerator().haveRTAdjustInterfaceBlock());
- REPORTER_ASSERT(r, SkSL::ThreadContext::IRGenerator().getRTAdjustFieldIndex() == 1);
+ REPORTER_ASSERT(r, SkSL::ThreadContext::RTAdjustState().fInterfaceBlock);
+ REPORTER_ASSERT(r, SkSL::ThreadContext::RTAdjustState().fFieldIndex == 1);
}
{