2016-10-25 18:20:06 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2016 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef GrOpList_DEFINED
|
|
|
|
#define GrOpList_DEFINED
|
|
|
|
|
|
|
|
#include "SkRefCnt.h"
|
|
|
|
#include "SkTDArray.h"
|
|
|
|
|
|
|
|
//#define ENABLE_MDB 1
|
|
|
|
|
2016-10-26 16:02:18 +00:00
|
|
|
class GrAuditTrail;
|
2016-12-07 22:06:19 +00:00
|
|
|
class GrOpFlushState;
|
2016-11-23 14:37:01 +00:00
|
|
|
class GrRenderTargetOpList;
|
2016-10-28 17:25:24 +00:00
|
|
|
class GrSurfaceProxy;
|
2016-11-23 14:37:01 +00:00
|
|
|
class GrTextureOpList;
|
2016-10-25 18:20:06 +00:00
|
|
|
|
|
|
|
class GrOpList : public SkRefCnt {
|
|
|
|
public:
|
2017-04-13 16:23:54 +00:00
|
|
|
GrOpList(sk_sp<GrSurfaceProxy> surfaceProxy, GrAuditTrail* auditTrail);
|
2016-10-25 18:20:06 +00:00
|
|
|
~GrOpList() override;
|
|
|
|
|
2016-11-11 17:38:40 +00:00
|
|
|
// These two methods are invoked as flush time
|
2016-12-07 22:06:19 +00:00
|
|
|
virtual void prepareOps(GrOpFlushState* flushState) = 0;
|
|
|
|
virtual bool executeOps(GrOpFlushState* flushState) = 0;
|
2016-10-25 18:20:06 +00:00
|
|
|
|
|
|
|
virtual void makeClosed() {
|
2017-04-24 16:27:17 +00:00
|
|
|
// We only close GrOpLists when MDB is enabled. When MDB is disabled there is only
|
|
|
|
// ever one GrOpLists and all calls will be funnelled into it.
|
|
|
|
#ifdef ENABLE_MDB
|
2016-10-25 18:20:06 +00:00
|
|
|
this->setFlag(kClosed_Flag);
|
2017-04-24 16:27:17 +00:00
|
|
|
#endif
|
2016-10-25 18:20:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: it seems a bit odd that GrOpList has nothing to clear on reset
|
|
|
|
virtual void reset() = 0;
|
|
|
|
|
|
|
|
// TODO: in an MDB world, where the OpLists don't allocate GPU resources, it seems like
|
|
|
|
// these could go away
|
|
|
|
virtual void abandonGpuResources() = 0;
|
|
|
|
virtual void freeGpuResources() = 0;
|
|
|
|
|
2017-04-24 16:27:17 +00:00
|
|
|
// TODO: this entry point is only needed in the non-MDB world. Remove when
|
|
|
|
// we make the switch to MDB
|
|
|
|
void clearTarget() { fTarget = nullptr; }
|
|
|
|
|
2016-10-25 18:20:06 +00:00
|
|
|
bool isClosed() const { return this->isSetFlag(kClosed_Flag); }
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Notify this GrOpList that it relies on the contents of 'dependedOn'
|
|
|
|
*/
|
2017-04-17 11:53:07 +00:00
|
|
|
void addDependency(GrSurfaceProxy* dependedOn);
|
2016-10-25 18:20:06 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Does this opList depend on 'dependedOn'?
|
|
|
|
*/
|
|
|
|
bool dependsOn(GrOpList* dependedOn) const {
|
|
|
|
return fDependencies.find(dependedOn) >= 0;
|
|
|
|
}
|
|
|
|
|
2016-11-23 14:37:01 +00:00
|
|
|
/*
|
|
|
|
* Safely cast this GrOpList to a GrTextureOpList (if possible).
|
|
|
|
*/
|
|
|
|
virtual GrTextureOpList* asTextureOpList() { return nullptr; }
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Safely case this GrOpList to a GrRenderTargetOpList (if possible).
|
|
|
|
*/
|
|
|
|
virtual GrRenderTargetOpList* asRenderTargetOpList() { return nullptr; }
|
|
|
|
|
2017-03-08 16:50:55 +00:00
|
|
|
int32_t uniqueID() const { return fUniqueID; }
|
|
|
|
|
2016-10-25 18:20:06 +00:00
|
|
|
/*
|
|
|
|
* Dump out the GrOpList dependency DAG
|
|
|
|
*/
|
|
|
|
SkDEBUGCODE(virtual void dump() const;)
|
|
|
|
|
2017-04-17 11:53:07 +00:00
|
|
|
SkDEBUGCODE(virtual void validateTargetsSingleRenderTarget() const = 0;)
|
|
|
|
|
2017-04-13 16:23:54 +00:00
|
|
|
protected:
|
2017-04-24 16:27:17 +00:00
|
|
|
GrSurfaceProxy* fTarget;
|
|
|
|
GrAuditTrail* fAuditTrail;
|
2017-04-13 16:23:54 +00:00
|
|
|
|
2016-10-25 18:20:06 +00:00
|
|
|
private:
|
|
|
|
friend class GrDrawingManager; // for resetFlag & TopoSortTraits
|
|
|
|
|
2017-03-08 16:50:55 +00:00
|
|
|
static uint32_t CreateUniqueID();
|
|
|
|
|
2016-10-25 18:20:06 +00:00
|
|
|
enum Flags {
|
2016-12-07 20:05:04 +00:00
|
|
|
kClosed_Flag = 0x01, //!< This GrOpList can't accept any more ops
|
2016-10-25 18:20:06 +00:00
|
|
|
|
|
|
|
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(GrOpList* dt, int /* index */) {
|
|
|
|
dt->setFlag(GrOpList::kWasOutput_Flag);
|
|
|
|
}
|
|
|
|
static bool WasOutput(const GrOpList* dt) {
|
|
|
|
return dt->isSetFlag(GrOpList::kWasOutput_Flag);
|
|
|
|
}
|
|
|
|
static void SetTempMark(GrOpList* dt) {
|
|
|
|
dt->setFlag(GrOpList::kTempMark_Flag);
|
|
|
|
}
|
|
|
|
static void ResetTempMark(GrOpList* dt) {
|
|
|
|
dt->resetFlag(GrOpList::kTempMark_Flag);
|
|
|
|
}
|
|
|
|
static bool IsTempMarked(const GrOpList* dt) {
|
|
|
|
return dt->isSetFlag(GrOpList::kTempMark_Flag);
|
|
|
|
}
|
|
|
|
static int NumDependencies(const GrOpList* dt) {
|
|
|
|
return dt->fDependencies.count();
|
|
|
|
}
|
|
|
|
static GrOpList* Dependency(GrOpList* dt, int index) {
|
|
|
|
return dt->fDependencies[index];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
void addDependency(GrOpList* dependedOn);
|
|
|
|
|
2017-04-24 16:27:17 +00:00
|
|
|
uint32_t fUniqueID;
|
|
|
|
uint32_t fFlags;
|
2016-10-25 18:20:06 +00:00
|
|
|
|
|
|
|
// 'this' GrOpList relies on the output of the GrOpLists in 'fDependencies'
|
2017-04-24 16:27:17 +00:00
|
|
|
SkTDArray<GrOpList*> fDependencies;
|
2016-10-25 18:20:06 +00:00
|
|
|
|
|
|
|
typedef SkRefCnt INHERITED;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|