| Index: src/gpu/GrDrawTarget.h
|
| diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
|
| index db637d52b10add9e59421d726cb1bab2d44710a5..925c03e741080a5f7cdebc51a8c32587b26146c4 100644
|
| --- a/src/gpu/GrDrawTarget.h
|
| +++ b/src/gpu/GrDrawTarget.h
|
| @@ -53,10 +53,22 @@ public:
|
| // We only close drawTargets When MDB is enabled. When MDB is disabled there is only
|
| // ever one drawTarget and all calls will be funnelled into it.
|
| #ifdef ENABLE_MDB
|
| - fClosed = true;
|
| + this->setFlag(kClosed_Flag);
|
| #endif
|
| }
|
| - bool isClosed() const { return fClosed; }
|
| + bool isClosed() const { return this->isSetFlag(kClosed_Flag); }
|
| +
|
| + /*
|
| + * Notify this drawTarget that it relies on the contents of 'dependedOn'
|
| + */
|
| + void addDependency(GrSurface* dependedOn);
|
| +
|
| + /*
|
| + * Does this drawTarget depend on 'dependedOn'?
|
| + */
|
| + bool dependsOn(GrDrawTarget* dependedOn) const {
|
| + return fDependencies.find(dependedOn) >= 0;
|
| + }
|
|
|
| /**
|
| * Empties the draw buffer of any queued up draws.
|
| @@ -204,7 +216,53 @@ public:
|
|
|
| const CMMAccess cmmAccess() { return CMMAccess(this); }
|
|
|
| +
|
| private:
|
| + friend class GrDrawingManager; // for resetFlag & TopoSortTraits
|
| +
|
| + enum Flags {
|
| + kClosed_Flag = 0x01, //!< This drawTarget can't accept any more batches
|
| +
|
| + kWasOutput_Flag = 0x02, //!< Flag for topological sorting
|
| + kTempMark_Flag = 0x04, //!< Flag for topological sorting
|
| + };
|
| +
|
| + void setFlag(uint32_t flag) {
|
| + fFlags |= flag;
|
| + }
|
| +
|
| + void resetFlag(uint32_t flag) {
|
| + fFlags &= ~flag;
|
| + }
|
| +
|
| + bool isSetFlag(uint32_t flag) const {
|
| + return SkToBool(fFlags & flag);
|
| + }
|
| +
|
| + struct TopoSortTraits {
|
| + static void Output(GrDrawTarget* dt, int /* index */) {
|
| + dt->setFlag(GrDrawTarget::kWasOutput_Flag);
|
| + }
|
| + static bool WasOutput(const GrDrawTarget* dt) {
|
| + return dt->isSetFlag(GrDrawTarget::kWasOutput_Flag);
|
| + }
|
| + static void SetTempMark(GrDrawTarget* dt) {
|
| + dt->setFlag(GrDrawTarget::kTempMark_Flag);
|
| + }
|
| + static void ResetTempMark(GrDrawTarget* dt) {
|
| + dt->resetFlag(GrDrawTarget::kTempMark_Flag);
|
| + }
|
| + static bool IsTempMarked(const GrDrawTarget* dt) {
|
| + return dt->isSetFlag(GrDrawTarget::kTempMark_Flag);
|
| + }
|
| + static int NumDependencies(const GrDrawTarget* dt) {
|
| + return dt->fDependencies.count();
|
| + }
|
| + static GrDrawTarget* Dependency(GrDrawTarget* dt, int index) {
|
| + return dt->fDependencies[index];
|
| + }
|
| + };
|
| +
|
| void recordBatch(GrBatch*);
|
| bool installPipelineInDrawBatch(const GrPipelineBuilder* pipelineBuilder,
|
| const GrScissorState* scissor,
|
| @@ -231,6 +289,8 @@ private:
|
| GrScissorState*,
|
| const SkRect* devBounds);
|
|
|
| + void addDependency(GrDrawTarget* dependedOn);
|
| +
|
| // Used only by CMM.
|
| void clearStencilClip(const SkIRect&, bool insideClip, GrRenderTarget*);
|
|
|
| @@ -244,7 +304,10 @@ private:
|
| bool fFlushing;
|
| int fFirstUnpreparedBatch;
|
|
|
| - bool fClosed;
|
| + uint32_t fFlags;
|
| +
|
| + // 'this' drawTarget relies on the output of the drawTargets in 'fDependencies'
|
| + SkTDArray<GrDrawTarget*> fDependencies;
|
|
|
| typedef SkRefCnt INHERITED;
|
| };
|
|
|