Track all sampled textures in GrOpsTask and pass them to GrOpsRenderPass.

In Vulkan we use this list to set the layout for these surface to be
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL at GrOpsRenderPass creation
instead of at submit. This gets us closer to being able to run with
primary or secondary command buffers.

Change-Id: I6e307485987e2c024ed9ecba3e41f588047c5f07
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/238444
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrOpsTask.cpp b/src/gpu/GrOpsTask.cpp
index 69f5780..86bcf9b 100644
--- a/src/gpu/GrOpsTask.cpp
+++ b/src/gpu/GrOpsTask.cpp
@@ -384,6 +384,7 @@
 
     fTarget.reset();
     fDeferredProxies.reset();
+    fSampledProxies.reset();
     fAuditTrail = nullptr;
 }
 
@@ -394,6 +395,7 @@
     TRACE_EVENT0("skia.gpu", TRACE_FUNC);
 #endif
 
+    flushState->setSampledProxyArray(&fSampledProxies);
     // Loop over the ops that haven't yet been prepared.
     for (const auto& chain : fOpChains) {
         if (chain.shouldExecute()) {
@@ -412,15 +414,13 @@
             flushState->setOpArgs(nullptr);
         }
     }
+    flushState->setSampledProxyArray(nullptr);
 }
 
-static GrOpsRenderPass* create_command_buffer(GrGpu* gpu,
-                                              GrRenderTarget* rt,
-                                              GrSurfaceOrigin origin,
-                                              const SkRect& bounds,
-                                              GrLoadOp colorLoadOp,
-                                              const SkPMColor4f& loadClearColor,
-                                              GrLoadOp stencilLoadOp) {
+static GrOpsRenderPass* create_command_buffer(
+        GrGpu* gpu, GrRenderTarget* rt, GrSurfaceOrigin origin, const SkRect& bounds,
+        GrLoadOp colorLoadOp, const SkPMColor4f& loadClearColor, GrLoadOp stencilLoadOp,
+        const SkTArray<GrTextureProxy*, true>& sampledProxies) {
     const GrOpsRenderPass::LoadAndStoreInfo kColorLoadStoreInfo {
         colorLoadOp,
         GrStoreOp::kStore,
@@ -437,7 +437,8 @@
         GrStoreOp::kStore,
     };
 
-    return gpu->getOpsRenderPass(rt, origin, bounds, kColorLoadStoreInfo, stencilLoadAndStoreInfo);
+    return gpu->getOpsRenderPass(rt, origin, bounds, kColorLoadStoreInfo, stencilLoadAndStoreInfo,
+                                 sampledProxies);
 }
 
 // TODO: this is where GrOp::renderTarget is used (which is fine since it
@@ -466,7 +467,8 @@
                                                     fTarget->getBoundsRect(),
                                                     fColorLoadOp,
                                                     fLoadClearColor,
-                                                    fStencilLoadOp);
+                                                    fStencilLoadOp,
+                                                    fSampledProxies);
     flushState->setOpsRenderPass(renderPass);
     renderPass->begin();
 
@@ -520,6 +522,7 @@
     if (CanDiscardPreviousOps::kYes == canDiscardPreviousOps || this->isEmpty()) {
         this->deleteOps();
         fDeferredProxies.reset();
+        fSampledProxies.reset();
 
         // If the opsTask is using a render target which wraps a vulkan command buffer, we can't do
         // a clear load since we cannot change the render pass that we are using. Thus we fall back