diff --git a/tests/OpChainTest.cpp b/tests/OpChainTest.cpp
index 14c2ab8..6aecafc 100644
--- a/tests/OpChainTest.cpp
+++ b/tests/OpChainTest.cpp
@@ -5,12 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "include/gpu/GrContext.h"
+#include "include/gpu/GrDirectContext.h"
 #include "src/gpu/GrContextPriv.h"
 #include "src/gpu/GrMemoryPool.h"
 #include "src/gpu/GrOpFlushState.h"
 #include "src/gpu/GrOpsTask.h"
 #include "src/gpu/GrProxyProvider.h"
+#include "src/gpu/GrRecordingContextPriv.h"
 #include "src/gpu/ops/GrOp.h"
 #include "tests/Test.h"
 
@@ -95,7 +96,7 @@
 public:
     DEFINE_OP_CLASS_ID
 
-    static std::unique_ptr<TestOp> Make(GrContext* context, int value, const Range& range,
+    static std::unique_ptr<TestOp> Make(GrRecordingContext* context, int value, const Range& range,
                                         int result[], const Combinable* combinable) {
         GrOpMemoryPool* pool = context->priv().opMemoryPool();
         return pool->allocate<TestOp>(value, range, result, combinable);
@@ -170,22 +171,22 @@
  * painter's order.
  */
 DEF_GPUTEST(OpChainTest, reporter, /*ctxInfo*/) {
-    sk_sp<GrDirectContext> context = GrDirectContext::MakeMock(nullptr);
-    SkASSERT(context);
+    sk_sp<GrDirectContext> dContext = GrDirectContext::MakeMock(nullptr);
+    SkASSERT(dContext);
+    const GrCaps* caps = dContext->priv().caps();
     static constexpr SkISize kDims = {kNumOps + 1, 1};
 
-    const GrBackendFormat format =
-        context->priv().caps()->getDefaultBackendFormat(GrColorType::kRGBA_8888,
-                                                        GrRenderable::kYes);
+    const GrBackendFormat format = caps->getDefaultBackendFormat(GrColorType::kRGBA_8888,
+                                                                 GrRenderable::kYes);
 
     static const GrSurfaceOrigin kOrigin = kTopLeft_GrSurfaceOrigin;
-    auto proxy = context->priv().proxyProvider()->createProxy(
+    auto proxy = dContext->priv().proxyProvider()->createProxy(
             format, kDims, GrRenderable::kYes, 1, GrMipMapped::kNo, SkBackingFit::kExact,
             SkBudgeted::kNo, GrProtected::kNo, GrInternalSurfaceFlags::kNone);
     SkASSERT(proxy);
-    proxy->instantiate(context->priv().resourceProvider());
+    proxy->instantiate(dContext->priv().resourceProvider());
 
-    GrSwizzle writeSwizzle = context->priv().caps()->getWriteSwizzle(format, GrColorType::kRGBA_8888);
+    GrSwizzle writeSwizzle = caps->getWriteSwizzle(format, GrColorType::kRGBA_8888);
 
     int result[result_width()];
     int validResult[result_width()];
@@ -202,7 +203,7 @@
     SkRandom random;
     bool repeat = false;
     Combinable combinable;
-    GrDrawingManager* drawingMgr = context->priv().drawingManager();
+    GrDrawingManager* drawingMgr = dContext->priv().drawingManager();
     for (int p = 0; p < kNumPermutations; ++p) {
         for (int i = 0; i < kNumOps - 2 && !repeat; ++i) {
             // The current implementation of nextULessThan() is biased. :(
@@ -214,13 +215,13 @@
             for (int c = 0; c < kNumCombinabilitiesPerGrouping; ++c) {
                 init_combinable(g, &combinable, &random);
                 GrTokenTracker tracker;
-                GrOpFlushState flushState(context->priv().getGpu(),
-                                          context->priv().resourceProvider(),
+                GrOpFlushState flushState(dContext->priv().getGpu(),
+                                          dContext->priv().resourceProvider(),
                                           &tracker);
                 GrOpsTask opsTask(drawingMgr,
-                                  context->priv().arenas(),
+                                  dContext->priv().arenas(),
                                   GrSurfaceProxyView(proxy, kOrigin, writeSwizzle),
-                                  context->priv().auditTrail());
+                                  dContext->priv().auditTrail());
                 // This assumes the particular values of kRanges.
                 std::fill_n(result, result_width(), -1);
                 std::fill_n(validResult, result_width(), -1);
@@ -232,13 +233,13 @@
                     int pos = j % kNumOpPositions;
                     Range range = kRanges[j / kNumOpPositions];
                     range.fOffset += pos;
-                    auto op = TestOp::Make(context.get(), value, range, result, &combinable);
+                    auto op = TestOp::Make(dContext.get(), value, range, result, &combinable);
                     op->writeResult(validResult);
                     opsTask.addOp(drawingMgr, std::move(op),
-                                  GrTextureResolveManager(context->priv().drawingManager()),
-                                  *context->priv().caps());
+                                  GrTextureResolveManager(dContext->priv().drawingManager()),
+                                  *caps);
                 }
-                opsTask.makeClosed(*context->priv().caps());
+                opsTask.makeClosed(*caps);
                 opsTask.prepare(&flushState);
                 opsTask.execute(&flushState);
                 opsTask.endFlush(drawingMgr);
