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