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);
     }
 
     {