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/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp
index 1761acc..6e7d25d 100644
--- a/src/gpu/ops/GrAtlasTextOp.cpp
+++ b/src/gpu/ops/GrAtlasTextOp.cpp
@@ -305,6 +305,9 @@
auto fixedDynamicState = target->makeFixedDynamicState(kMaxTextures);
for (unsigned i = 0; i < numActiveProxies; ++i) {
fixedDynamicState->fPrimitiveProcessorTextures[i] = proxies[i].get();
+ // This op does not know its atlas proxies when it is added to a GrOpsTasks, so the proxies
+ // don't get added during the visitProxies call. Thus we add them here.
+ target->sampledProxyArray()->push_back(proxies[i].get());
}
FlushInfo flushInfo;
@@ -413,6 +416,9 @@
// Update the proxies used in the GP to match.
for (unsigned i = gp->numTextureSamplers(); i < numActiveProxies; ++i) {
flushInfo->fFixedDynamicState->fPrimitiveProcessorTextures[i] = proxies[i].get();
+ // This op does not know its atlas proxies when it is added to a GrOpsTasks, so the
+ // proxies don't get added during the visitProxies call. Thus we add them here.
+ target->sampledProxyArray()->push_back(proxies[i].get());
}
if (this->usesDistanceFields()) {
if (this->isLCD()) {
diff --git a/src/gpu/ops/GrMeshDrawOp.h b/src/gpu/ops/GrMeshDrawOp.h
index 2140b7d..5baf985 100644
--- a/src/gpu/ops/GrMeshDrawOp.h
+++ b/src/gpu/ops/GrMeshDrawOp.h
@@ -160,6 +160,11 @@
virtual GrStrikeCache* glyphCache() const = 0;
virtual GrAtlasManager* atlasManager() const = 0;
+ // This should be called during onPrepare of a GrOp. The caller should add any proxies to the
+ // array it will use that it did not access during a call to visitProxies. This is usually the
+ // case for atlases.
+ virtual SkTArray<GrTextureProxy*, true>* sampledProxyArray() = 0;
+
virtual const GrCaps& caps() const = 0;
virtual GrDeferredUploadTarget* deferredUploadTarget() = 0;
diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp
index f6a3705..bfabd47 100644
--- a/src/gpu/ops/GrSmallPathRenderer.cpp
+++ b/src/gpu/ops/GrSmallPathRenderer.cpp
@@ -326,7 +326,10 @@
int numActiveProxies = fAtlas->numActivePages();
const auto proxies = fAtlas->getProxies();
for (int i = 0; i < numActiveProxies; ++i) {
+ // This op does not know its atlas proxies when it is added to a GrOpsTasks, so the
+ // proxies don't get added during the visitProxies call. Thus we add them here.
flushInfo.fFixedDynamicState->fPrimitiveProcessorTextures[i] = proxies[i].get();
+ target->sampledProxyArray()->push_back(proxies[i].get());
}
// Setup GrGeometryProcessor
@@ -777,6 +780,9 @@
if (gp->numTextureSamplers() != numAtlasTextures) {
for (int i = gp->numTextureSamplers(); i < numAtlasTextures; ++i) {
flushInfo->fFixedDynamicState->fPrimitiveProcessorTextures[i] = proxies[i].get();
+ // This op does not know its atlas proxies when it is added to a GrOpsTasks, so the
+ // proxies don't get added during the visitProxies call. Thus we add them here.
+ target->sampledProxyArray()->push_back(proxies[i].get());
}
// During preparation the number of atlas pages has increased.
// Update the proxies used in the GP to match.