diff options
author | Robert Phillips <robertphillips@google.com> | 2018-07-16 13:33:53 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-07-17 11:38:10 +0000 |
commit | 94fee93c9b23bd1a32604753da8bef755d6c8a95 (patch) | |
tree | acad655e303bbf931f391ce76d5d034476d7b608 /src/gpu/GrOpList.cpp | |
parent | 9c98576bceffc721a71550ea9c0942d9a008da3b (diff) |
Reduce arbitrary opList splitting when sorting
Change-Id: I49a47672600f72dc46f27462a2c344e77a06a659
Reviewed-on: https://skia-review.googlesource.com/141243
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/gpu/GrOpList.cpp')
-rw-r--r-- | src/gpu/GrOpList.cpp | 71 |
1 files changed, 66 insertions, 5 deletions
diff --git a/src/gpu/GrOpList.cpp b/src/gpu/GrOpList.cpp index b9f425576e..12d15afe6a 100644 --- a/src/gpu/GrOpList.cpp +++ b/src/gpu/GrOpList.cpp @@ -96,6 +96,9 @@ void GrOpList::addDependency(GrOpList* dependedOn) { } fDependencies.push_back(dependedOn); + dependedOn->addDependent(this); + + SkDEBUGCODE(this->validate()); } // Convert from a GrSurface-based dependency to a GrOpList one @@ -106,11 +109,13 @@ void GrOpList::addDependency(GrSurfaceProxy* dependedOn, const GrCaps& caps) { GrOpList* opList = dependedOn->getLastOpList(); if (opList == this) { - // self-read - presumably for dst reads + // self-read - presumably for dst reads. We can't make it closed in the self-read case. } else { this->addDependency(opList); - // Can't make it closed in the self-read case + // We are closing 'opList' here bc the current contents of it are what 'this' opList + // depends on. We need a break in 'opList' so that the usage of that state has a + // chance to execute. opList->makeClosed(caps); } } @@ -122,22 +127,78 @@ void GrOpList::addDependency(GrSurfaceProxy* dependedOn, const GrCaps& caps) { } } +bool GrOpList::dependsOn(const GrOpList* dependedOn) const { + for (int i = 0; i < fDependencies.count(); ++i) { + if (fDependencies[i] == dependedOn) { + return true; + } + } + + return false; +} + +void GrOpList::addDependent(GrOpList* dependent) { + fDependents.push_back(dependent); +} + +#ifdef SK_DEBUG +bool GrOpList::isDependedent(const GrOpList* dependent) const { + for (int i = 0; i < fDependents.count(); ++i) { + if (fDependents[i] == dependent) { + return true; + } + } + + return false; +} + +void GrOpList::validate() const { + // TODO: check for loops and duplicates + + for (int i = 0; i < fDependencies.count(); ++i) { + SkASSERT(fDependencies[i]->isDependedent(this)); + } +} +#endif + +void GrOpList::closeThoseWhoDependOnMe(const GrCaps& caps) { + for (int i = 0; i < fDependents.count(); ++i) { + if (!fDependents[i]->isClosed()) { + fDependents[i]->makeClosed(caps); + } + } +} + bool GrOpList::isInstantiated() const { return fTarget.get()->priv().isInstantiated(); } #ifdef SK_DEBUG +static const char* op_to_name(GrLoadOp op) { + return GrLoadOp::kLoad == op ? "load" : GrLoadOp::kClear == op ? "clear" : "discard"; +} + void GrOpList::dump(bool printDependencies) const { SkDebugf("--------------------------------------------------------------\n"); - SkDebugf("opList: %d -> RT: %d\n", fUniqueID, fTarget.get() ? fTarget.get()->uniqueID().asUInt() - : -1); + SkDebugf("opListID: %d -> proxyID: %d\n", fUniqueID, + fTarget.get() ? fTarget.get()->uniqueID().asUInt() : -1); + SkDebugf("ColorLoadOp: %s %x StencilLoadOp: %s\n", + op_to_name(fColorLoadOp), + GrLoadOp::kClear == fColorLoadOp ? fLoadClearColor : 0x0, + op_to_name(fStencilLoadOp)); if (printDependencies) { - SkDebugf("relies On (%d): ", fDependencies.count()); + SkDebugf("I rely On (%d): ", fDependencies.count()); for (int i = 0; i < fDependencies.count(); ++i) { SkDebugf("%d, ", fDependencies[i]->fUniqueID); } SkDebugf("\n"); + + SkDebugf("(%d) Rely On Me: ", fDependents.count()); + for (int i = 0; i < fDependents.count(); ++i) { + SkDebugf("%d, ", fDependents[i]->fUniqueID); + } + SkDebugf("\n"); } } #endif |