Index: src/gpu/GrTargetCommands.h |
diff --git a/src/gpu/GrTargetCommands.h b/src/gpu/GrTargetCommands.h |
index f9259c72b31ef404aba557495683a1bd5aac1ef1..4dfad2f409aa5befe85c517a9a11604679c59b8a 100644 |
--- a/src/gpu/GrTargetCommands.h |
+++ b/src/gpu/GrTargetCommands.h |
@@ -24,6 +24,7 @@ class GrVertexBufferAllocPool; |
class GrIndexBufferAllocPool; |
class GrTargetCommands : ::SkNoncopyable { |
+ struct State; |
struct SetState; |
public: |
@@ -31,7 +32,6 @@ public: |
GrVertexBufferAllocPool* vertexPool, |
GrIndexBufferAllocPool* indexPool) |
: fCmdBuffer(kCmdBufferInitialSizeInBytes) |
- , fPrevState(NULL) |
, fBatchTarget(gpu, vertexPool, indexPool) { |
} |
@@ -51,7 +51,7 @@ public: |
Cmd(CmdType type) : fMarkerID(-1), fType(type) {} |
virtual ~Cmd() {} |
- virtual void execute(GrGpu*, const SetState*) = 0; |
+ virtual void execute(GrGpu*) = 0; |
CmdType type() const { return fType; } |
@@ -68,32 +68,23 @@ public: |
void reset(); |
void flush(GrInOrderDrawBuffer*); |
- Cmd* recordClearStencilClip(GrInOrderDrawBuffer*, |
- const SkIRect& rect, |
+ Cmd* recordClearStencilClip(const SkIRect& rect, |
bool insideClip, |
GrRenderTarget* renderTarget); |
- Cmd* recordDiscard(GrInOrderDrawBuffer*, GrRenderTarget*); |
- |
- Cmd* recordDraw(GrInOrderDrawBuffer*, |
- const GrGeometryProcessor*, |
- const GrDrawTarget::DrawInfo&, |
- const GrDrawTarget::PipelineInfo&); |
- Cmd* recordDrawBatch(GrInOrderDrawBuffer*, |
- GrBatch*, |
- const GrDrawTarget::PipelineInfo&); |
- Cmd* recordStencilPath(GrInOrderDrawBuffer*, |
- const GrPipelineBuilder&, |
+ Cmd* recordDiscard(GrRenderTarget*); |
+ Cmd* recordDrawBatch(State*, GrBatch*); |
+ Cmd* recordStencilPath(const GrPipelineBuilder&, |
const GrPathProcessor*, |
const GrPath*, |
const GrScissorState&, |
const GrStencilSettings&); |
- Cmd* recordDrawPath(GrInOrderDrawBuffer*, |
+ Cmd* recordDrawPath(State*, |
const GrPathProcessor*, |
const GrPath*, |
- const GrStencilSettings&, |
- const GrDrawTarget::PipelineInfo&); |
- Cmd* recordDrawPaths(GrInOrderDrawBuffer*, |
+ const GrStencilSettings&); |
+ Cmd* recordDrawPaths(State*, |
+ GrInOrderDrawBuffer*, |
const GrPathProcessor*, |
const GrPathRange*, |
const void*, |
@@ -103,8 +94,7 @@ public: |
int, |
const GrStencilSettings&, |
const GrDrawTarget::PipelineInfo&); |
- Cmd* recordClear(GrInOrderDrawBuffer*, |
- const SkIRect* rect, |
+ Cmd* recordClear(const SkIRect* rect, |
GrColor, |
bool canIgnoreRect, |
GrRenderTarget*); |
@@ -118,18 +108,51 @@ private: |
typedef GrGpu::DrawArgs DrawArgs; |
- // Attempts to concat instances from info onto the previous draw. info must represent an |
- // instanced draw. The caller must have already recorded a new draw state and clip if necessary. |
- int concatInstancedDraw(GrInOrderDrawBuffer*, const GrDrawTarget::DrawInfo&); |
+ void recordXferBarrierIfNecessary(const GrPipeline&, GrInOrderDrawBuffer*); |
+ |
+ // TODO: This can be just a pipeline once paths are in batch, and it should live elsewhere |
+ struct State : public SkNVRefCnt<State> { |
+ // TODO get rid of the prim proc parameter when we use batch everywhere |
+ State(const GrPrimitiveProcessor* primProc = NULL) |
+ : fPrimitiveProcessor(primProc) |
+ , fCompiled(false) {} |
+ |
+ ~State() { reinterpret_cast<GrPipeline*>(fPipeline.get())->~GrPipeline(); } |
+ |
+ // This function is only for getting the location in memory where we will create our |
+ // pipeline object. |
+ GrPipeline* pipelineLocation() { return reinterpret_cast<GrPipeline*>(fPipeline.get()); } |
+ |
+ const GrPipeline* getPipeline() const { |
+ return reinterpret_cast<const GrPipeline*>(fPipeline.get()); |
+ } |
+ GrRenderTarget* getRenderTarget() const { |
+ return this->getPipeline()->getRenderTarget(); |
+ } |
+ const GrXferProcessor* getXferProcessor() const { |
+ return this->getPipeline()->getXferProcessor(); |
+ } |
+ |
+ void operator delete(void* p) {} |
+ void* operator new(size_t) { |
+ SkFAIL("All States are created by placement new."); |
+ return sk_malloc_throw(0); |
+ } |
- bool SK_WARN_UNUSED_RESULT setupPipelineAndShouldDraw(GrInOrderDrawBuffer*, |
- const GrPrimitiveProcessor*, |
- const GrDrawTarget::PipelineInfo&); |
- bool SK_WARN_UNUSED_RESULT setupPipelineAndShouldDraw(GrInOrderDrawBuffer*, |
- GrBatch*, |
- const GrDrawTarget::PipelineInfo&); |
+ void* operator new(size_t, void* p) { return p; } |
+ void operator delete(void* target, void* placement) { |
+ ::operator delete(target, placement); |
+ } |
- void recordXferBarrierIfNecessary(GrInOrderDrawBuffer*, const GrDrawTarget::PipelineInfo&); |
+ typedef GrPendingProgramElement<const GrPrimitiveProcessor> ProgramPrimitiveProcessor; |
+ ProgramPrimitiveProcessor fPrimitiveProcessor; |
+ SkAlignedSStorage<sizeof(GrPipeline)> fPipeline; |
+ GrProgramDesc fDesc; |
+ GrBatchTracker fBatchTracker; |
+ bool fCompiled; |
+ }; |
+ // TODO remove this when State is just a pipeline |
+ friend SkNVRefCnt<State>; |
struct StencilPath : public Cmd { |
StencilPath(const GrPath* path, GrRenderTarget* rt) |
@@ -139,7 +162,7 @@ private: |
const GrPath* path() const { return fPath.get(); } |
- void execute(GrGpu*, const SetState*) override; |
+ void execute(GrGpu*) override; |
SkMatrix fViewMatrix; |
bool fUseHWAA; |
@@ -151,25 +174,32 @@ private: |
}; |
struct DrawPath : public Cmd { |
- DrawPath(const GrPath* path) : Cmd(kDrawPath_CmdType), fPath(path) {} |
+ DrawPath(State* state, const GrPath* path) |
+ : Cmd(kDrawPath_CmdType) |
+ , fState(SkRef(state)) |
+ , fPath(path) {} |
const GrPath* path() const { return fPath.get(); } |
- void execute(GrGpu*, const SetState*) override; |
+ void execute(GrGpu*) override; |
+ SkAutoTUnref<State> fState; |
GrStencilSettings fStencilSettings; |
- |
private: |
GrPendingIOResource<const GrPath, kRead_GrIOType> fPath; |
}; |
struct DrawPaths : public Cmd { |
- DrawPaths(const GrPathRange* pathRange) : Cmd(kDrawPaths_CmdType), fPathRange(pathRange) {} |
+ DrawPaths(State* state, const GrPathRange* pathRange) |
+ : Cmd(kDrawPaths_CmdType) |
+ , fState(SkRef(state)) |
+ , fPathRange(pathRange) {} |
const GrPathRange* pathRange() const { return fPathRange.get(); } |
- void execute(GrGpu*, const SetState*) override; |
+ void execute(GrGpu*) override; |
+ SkAutoTUnref<State> fState; |
char* fIndices; |
GrDrawTarget::PathIndexType fIndexType; |
float* fTransforms; |
@@ -187,7 +217,7 @@ private: |
GrRenderTarget* renderTarget() const { return fRenderTarget.get(); } |
- void execute(GrGpu*, const SetState*) override; |
+ void execute(GrGpu*) override; |
SkIRect fRect; |
GrColor fColor; |
@@ -203,7 +233,7 @@ private: |
GrRenderTarget* renderTarget() const { return fRenderTarget.get(); } |
- void execute(GrGpu*, const SetState*) override; |
+ void execute(GrGpu*) override; |
SkIRect fRect; |
bool fInsideClip; |
@@ -222,7 +252,7 @@ private: |
GrSurface* dst() const { return fDst.get(); } |
GrSurface* src() const { return fSrc.get(); } |
- void execute(GrGpu*, const SetState*) override; |
+ void execute(GrGpu*) override; |
SkIPoint fDstPoint; |
SkIRect fSrcRect; |
@@ -232,49 +262,18 @@ private: |
GrPendingIOResource<GrSurface, kRead_GrIOType> fSrc; |
}; |
- // TODO: rename to SetPipeline once pp, batch tracker, and desc are removed |
- struct SetState : public Cmd { |
- // TODO get rid of the prim proc parameter when we use batch everywhere |
- SetState(const GrPrimitiveProcessor* primProc = NULL) |
- : Cmd(kSetState_CmdType) |
- , fPrimitiveProcessor(primProc) {} |
- |
- ~SetState() { reinterpret_cast<GrPipeline*>(fPipeline.get())->~GrPipeline(); } |
- |
- // This function is only for getting the location in memory where we will create our |
- // pipeline object. |
- GrPipeline* pipelineLocation() { return reinterpret_cast<GrPipeline*>(fPipeline.get()); } |
- |
- const GrPipeline* getPipeline() const { |
- return reinterpret_cast<const GrPipeline*>(fPipeline.get()); |
- } |
- GrRenderTarget* getRenderTarget() const { |
- return this->getPipeline()->getRenderTarget(); |
- } |
- const GrXferProcessor* getXferProcessor() const { |
- return this->getPipeline()->getXferProcessor(); |
- } |
- |
- void execute(GrGpu*, const SetState*) override; |
- |
- typedef GrPendingProgramElement<const GrPrimitiveProcessor> ProgramPrimitiveProcessor; |
- ProgramPrimitiveProcessor fPrimitiveProcessor; |
- SkAlignedSStorage<sizeof(GrPipeline)> fPipeline; |
- GrProgramDesc fDesc; |
- GrBatchTracker fBatchTracker; |
- }; |
- |
struct DrawBatch : public Cmd { |
- DrawBatch(GrBatch* batch, GrBatchTarget* batchTarget) |
+ DrawBatch(State* state, GrBatch* batch, GrBatchTarget* batchTarget) |
: Cmd(kDrawBatch_CmdType) |
+ , fState(SkRef(state)) |
, fBatch(SkRef(batch)) |
, fBatchTarget(batchTarget) { |
SkASSERT(!batch->isUsed()); |
} |
- void execute(GrGpu*, const SetState*) override; |
+ void execute(GrGpu*) override; |
- // TODO it wouldn't be too hard to let batches allocate in the cmd buffer |
+ SkAutoTUnref<State> fState; |
SkAutoTUnref<GrBatch> fBatch; |
private: |
@@ -284,19 +283,18 @@ private: |
struct XferBarrier : public Cmd { |
XferBarrier() : Cmd(kXferBarrier_CmdType) {} |
- void execute(GrGpu*, const SetState*) override; |
+ void execute(GrGpu*) override; |
GrXferBarrierType fBarrierType; |
}; |
- static const int kCmdBufferInitialSizeInBytes = 8 * 1024; |
+ static const int kCmdBufferInitialSizeInBytes = 8 * 1024; |
- typedef void* TCmdAlign; // This wouldn't be enough align if a command used long double. |
- typedef GrTRecorder<Cmd, TCmdAlign> CmdBuffer; |
+ typedef void* TCmdAlign; // This wouldn't be enough align if a command used long double. |
+ typedef GrTRecorder<Cmd, TCmdAlign> CmdBuffer; |
- CmdBuffer fCmdBuffer; |
- SetState* fPrevState; |
- GrBatchTarget fBatchTarget; |
+ CmdBuffer fCmdBuffer; |
+ GrBatchTarget fBatchTarget; |
}; |
#endif |