diff options
author | 2015-10-20 07:37:58 -0700 | |
---|---|---|
committer | 2015-10-20 07:37:58 -0700 | |
commit | 6a18665a7e831a2bd5521968825c0f990d97a4f6 (patch) | |
tree | 5d6e4b6428dc824f39ce23a55481ebf5b4529bf8 /src/gpu/GrDrawTarget.cpp | |
parent | c84ccb070258db2803a9e8f532bfe7239a737063 (diff) |
Add the machinery to GrDrawTarget to enable topological sorting
This relies on https://codereview.chromium.org/1414503003/ (Add SkTTopoSort) landing first.
BUG=skia:4094
Review URL: https://codereview.chromium.org/1414773002
Diffstat (limited to 'src/gpu/GrDrawTarget.cpp')
-rw-r--r-- | src/gpu/GrDrawTarget.cpp | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp index 323599dd70..7f84f8efd1 100644 --- a/src/gpu/GrDrawTarget.cpp +++ b/src/gpu/GrDrawTarget.cpp @@ -38,7 +38,7 @@ GrDrawTarget::GrDrawTarget(GrGpu* gpu, GrResourceProvider* resourceProvider) , fFlushState(fGpu, fResourceProvider, 0) , fFlushing(false) , fFirstUnpreparedBatch(0) - , fClosed(false) { + , fFlags(0) { // TODO: Stop extracting the context (currently needed by GrClipMaskManager) fContext = fGpu->getContext(); fClipMaskManager.reset(new GrClipMaskManager(this)); @@ -50,6 +50,35 @@ GrDrawTarget::~GrDrawTarget() { //////////////////////////////////////////////////////////////////////////////// +// Add a GrDrawTarget-based dependency +void GrDrawTarget::addDependency(GrDrawTarget* dependedOn) { + SkASSERT(!dependedOn->dependsOn(this)); // loops are bad + + if (this->dependsOn(dependedOn)) { + return; // don't add duplicate dependencies + } + + *fDependencies.push() = dependedOn; +} + +// Convert from a GrSurface-based dependency to a GrDrawTarget one +void GrDrawTarget::addDependency(GrSurface* dependedOn) { + if (dependedOn->asRenderTarget() && dependedOn->asRenderTarget()->getLastDrawTarget()) { + // If it is still receiving dependencies, this DT shouldn't be closed + SkASSERT(!this->isClosed()); + + GrDrawTarget* dt = dependedOn->asRenderTarget()->getLastDrawTarget(); + if (dt == this) { + // self-read - presumably for dst reads + } else { + this->addDependency(dt); + + // Can't make it closed in the self-read case + dt->makeClosed(); + } + } +} + bool GrDrawTarget::setupDstReadIfNecessary(const GrPipelineBuilder& pipelineBuilder, const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI, @@ -414,7 +443,7 @@ template <class Left, class Right> static bool intersect(const Left& a, const Ri void GrDrawTarget::recordBatch(GrBatch* batch) { // A closed drawTarget should never receive new/more batches - SkASSERT(!fClosed); + SkASSERT(!this->isClosed()); // Check if there is a Batch Draw we can batch with by linearly searching back until we either // 1) check every draw |