Elevate the target list of Ganesh tasks to base class
A follow up CL will use the availability of this information - the full
list of targets of a GrRenderTask – to enable faster storage of the
lastRenderTask association for a given surface proxy in a given drawing
manager.
Bug: skia:10320
Change-Id: I3eb3276b483a7f09481774896a024172b73a4c84
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/296729
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Adlai Holler <adlai@google.com>
diff --git a/src/gpu/GrRenderTask.cpp b/src/gpu/GrRenderTask.cpp
index 1cf2efc..fece63f 100644
--- a/src/gpu/GrRenderTask.cpp
+++ b/src/gpu/GrRenderTask.cpp
@@ -26,29 +26,24 @@
, fFlags(0) {
}
-GrRenderTask::GrRenderTask(GrSurfaceProxyView targetView)
- : fTargetView(std::move(targetView))
- , fUniqueID(CreateUniqueID())
- , fFlags(0) {
-}
-
void GrRenderTask::disown(GrDrawingManager* drawingMgr) {
if (this->isSetFlag(kDisowned_Flag)) {
return;
}
this->setFlag(kDisowned_Flag);
- GrSurfaceProxy* proxy = fTargetView.proxy();
- if (proxy && this == drawingMgr->getLastRenderTask(proxy)) {
- // Ensure the drawing manager doesn't hold a dangling pointer.
- drawingMgr->setLastRenderTask(proxy, nullptr);
+
+ for (const GrSurfaceProxyView& target : fTargets) {
+ if (this == drawingMgr->getLastRenderTask(target.proxy())) {
+ drawingMgr->setLastRenderTask(target.proxy(), nullptr);
+ }
}
}
+#ifdef SK_DEBUG
GrRenderTask::~GrRenderTask() {
SkASSERT(this->isSetFlag(kDisowned_Flag));
}
-#ifdef SK_DEBUG
bool GrRenderTask::deferredProxiesAreInstantiated() const {
for (int i = 0; i < fDeferredProxies.count(); ++i) {
if (!fDeferredProxies[i]->isInstantiated()) {
@@ -67,13 +62,13 @@
SkIRect targetUpdateBounds;
if (ExpectedOutcome::kTargetDirty == this->onMakeClosed(caps, &targetUpdateBounds)) {
- GrSurfaceProxy* proxy = fTargetView.proxy();
+ GrSurfaceProxy* proxy = this->target(0).proxy();
if (proxy->requiresManualMSAAResolve()) {
- SkASSERT(fTargetView.asRenderTargetProxy());
- fTargetView.asRenderTargetProxy()->markMSAADirty(targetUpdateBounds,
- fTargetView.origin());
+ SkASSERT(this->target(0).asRenderTargetProxy());
+ this->target(0).asRenderTargetProxy()->markMSAADirty(targetUpdateBounds,
+ this->target(0).origin());
}
- GrTextureProxy* textureProxy = fTargetView.asTextureProxy();
+ GrTextureProxy* textureProxy = this->target(0).asTextureProxy();
if (textureProxy && GrMipMapped::kYes == textureProxy->mipMapped()) {
textureProxy->markMipMapsDirty();
}
@@ -259,11 +254,11 @@
}
bool GrRenderTask::isInstantiated() const {
- // Some renderTasks (e.g. GrTransferFromRenderTask) don't have a target.
- GrSurfaceProxy* proxy = fTargetView.proxy();
- if (!proxy) {
+ // Some renderTasks (e.g. GrTransferFromRenderTask) don't have any targets.
+ if (0 == this->numTargets()) {
return true;
}
+ GrSurfaceProxy* proxy = this->target(0).proxy();
if (!proxy->isInstantiated()) {
return false;
@@ -277,16 +272,29 @@
return true;
}
+void GrRenderTask::addTarget(GrDrawingManager* drawingMgr, GrSurfaceProxyView view) {
+ SkASSERT(view);
+ drawingMgr->setLastRenderTask(view.proxy(), this);
+ fTargets.push_back(std::move(view));
+}
+
#ifdef SK_DEBUG
void GrRenderTask::dump(bool printDependencies) const {
SkDebugf("--------------------------------------------------------------\n");
- GrSurfaceProxy* proxy = fTargetView.proxy();
- SkDebugf("%s - renderTaskID: %d - proxyID: %d - surfaceID: %d\n",
- this->name(), fUniqueID,
- proxy ? proxy->uniqueID().asUInt() : -1,
- proxy && proxy->peekSurface()
- ? proxy->peekSurface()->uniqueID().asUInt()
- : -1);
+ SkDebugf("%s - renderTaskID: %d\n", this->name(), fUniqueID);
+
+ if (!fTargets.empty()) {
+ SkDebugf("Targets: \n");
+ for (int i = 0; i < fTargets.count(); ++i) {
+ GrSurfaceProxy* proxy = fTargets[i].proxy();
+ SkDebugf("[%d]: proxyID: %d - surfaceID: %d\n",
+ i,
+ proxy ? proxy->uniqueID().asUInt() : -1,
+ proxy && proxy->peekSurface()
+ ? proxy->peekSurface()->uniqueID().asUInt()
+ : -1);
+ }
+ }
if (printDependencies) {
SkDebugf("I rely On (%d): ", fDependencies.count());