Index: src/gpu/GrRectBatch.cpp |
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrRectBatch.cpp |
similarity index 50% |
copy from src/gpu/GrInOrderDrawBuffer.cpp |
copy to src/gpu/GrRectBatch.cpp |
index 1e8f3ae6593c92fd3b6ee28578c56f2d295f9874..ba63db1e0f38649d41058906fca1a17db2a95665 100644 |
--- a/src/gpu/GrInOrderDrawBuffer.cpp |
+++ b/src/gpu/GrRectBatch.cpp |
@@ -1,35 +1,18 @@ |
/* |
- * Copyright 2011 Google Inc. |
+ * Copyright 2015 Google Inc. |
* |
* Use of this source code is governed by a BSD-style license that can be |
* found in the LICENSE file. |
*/ |
-#include "GrInOrderDrawBuffer.h" |
+#include "GrRectBatch.h" |
+#include "GrBatch.h" |
+#include "GrBatchTarget.h" |
#include "GrDefaultGeoProcFactory.h" |
+#include "GrPrimitiveProcessor.h" |
#include "GrTemplates.h" |
-GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrContext* context, |
- GrVertexBufferAllocPool* vertexPool, |
- GrIndexBufferAllocPool* indexPool) |
- : INHERITED(context, vertexPool, indexPool) |
- , fCommands(SkNEW_ARGS(GrCommandBuilder, (context->getGpu(), vertexPool, indexPool))) |
- , fPathIndexBuffer(kPathIdxBufferMinReserve * sizeof(char)/4) |
- , fPathTransformBuffer(kPathXformBufferMinReserve * sizeof(float)/4) |
- , fPipelineBuffer(kPipelineBufferMinReserve) |
- , fDrawID(0) { |
- |
- SkASSERT(vertexPool); |
- SkASSERT(indexPool); |
-} |
- |
-GrInOrderDrawBuffer::~GrInOrderDrawBuffer() { |
- this->reset(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
- |
/** We always use per-vertex colors so that rects can be batched across color changes. Sometimes we |
have explicit local coords and sometimes not. We *could* always provide explicit local coords |
and just duplicate the positions when the caller hasn't provided a local coord rect, but we |
@@ -236,12 +219,13 @@ private: |
SkSTArray<1, Geometry, true> fGeoData; |
}; |
-void GrInOrderDrawBuffer::onDrawRect(GrPipelineBuilder* pipelineBuilder, |
- GrColor color, |
- const SkMatrix& viewMatrix, |
- const SkRect& rect, |
- const SkRect* localRect, |
- const SkMatrix* localMatrix) { |
+namespace GrRectBatch { |
+ |
+GrBatch* Create(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkRect& rect, |
+ const SkRect* localRect, |
+ const SkMatrix* localMatrix) { |
RectBatch::Geometry geometry; |
geometry.fColor = color; |
geometry.fViewMatrix = viewMatrix; |
@@ -261,181 +245,7 @@ void GrInOrderDrawBuffer::onDrawRect(GrPipelineBuilder* pipelineBuilder, |
geometry.fHasLocalMatrix = false; |
} |
- SkAutoTUnref<GrBatch> batch(RectBatch::Create(geometry)); |
- this->drawBatch(pipelineBuilder, batch); |
-} |
- |
-void GrInOrderDrawBuffer::onDrawBatch(GrBatch* batch, |
- const PipelineInfo& pipelineInfo) { |
- State* state = this->setupPipelineAndShouldDraw(batch, pipelineInfo); |
- if (!state) { |
- return; |
- } |
- |
- GrTargetCommands::Cmd* cmd = fCommands->recordDrawBatch(state, batch); |
- this->recordTraceMarkersIfNecessary(cmd); |
-} |
- |
-void GrInOrderDrawBuffer::onStencilPath(const GrPipelineBuilder& pipelineBuilder, |
- const GrPathProcessor* pathProc, |
- const GrPath* path, |
- const GrScissorState& scissorState, |
- const GrStencilSettings& stencilSettings) { |
- GrTargetCommands::Cmd* cmd = fCommands->recordStencilPath(pipelineBuilder, |
- pathProc, path, scissorState, |
- stencilSettings); |
- this->recordTraceMarkersIfNecessary(cmd); |
-} |
- |
-void GrInOrderDrawBuffer::onDrawPath(const GrPathProcessor* pathProc, |
- const GrPath* path, |
- const GrStencilSettings& stencilSettings, |
- const PipelineInfo& pipelineInfo) { |
- State* state = this->setupPipelineAndShouldDraw(pathProc, pipelineInfo); |
- if (!state) { |
- return; |
- } |
- GrTargetCommands::Cmd* cmd = fCommands->recordDrawPath(state, pathProc, path, stencilSettings); |
- this->recordTraceMarkersIfNecessary(cmd); |
+ return RectBatch::Create(geometry); |
} |
-void GrInOrderDrawBuffer::onDrawPaths(const GrPathProcessor* pathProc, |
- const GrPathRange* pathRange, |
- const void* indices, |
- PathIndexType indexType, |
- const float transformValues[], |
- PathTransformType transformType, |
- int count, |
- const GrStencilSettings& stencilSettings, |
- const PipelineInfo& pipelineInfo) { |
- State* state = this->setupPipelineAndShouldDraw(pathProc, pipelineInfo); |
- if (!state) { |
- return; |
- } |
- GrTargetCommands::Cmd* cmd = fCommands->recordDrawPaths(state, this, pathProc, pathRange, |
- indices, indexType, transformValues, |
- transformType, count, |
- stencilSettings, pipelineInfo); |
- this->recordTraceMarkersIfNecessary(cmd); |
-} |
- |
-void GrInOrderDrawBuffer::onClear(const SkIRect* rect, GrColor color, |
- bool canIgnoreRect, GrRenderTarget* renderTarget) { |
- GrTargetCommands::Cmd* cmd = fCommands->recordClear(rect, color, canIgnoreRect, renderTarget); |
- this->recordTraceMarkersIfNecessary(cmd); |
-} |
- |
-void GrInOrderDrawBuffer::clearStencilClip(const SkIRect& rect, |
- bool insideClip, |
- GrRenderTarget* renderTarget) { |
- GrTargetCommands::Cmd* cmd = fCommands->recordClearStencilClip(rect, insideClip, renderTarget); |
- this->recordTraceMarkersIfNecessary(cmd); |
-} |
- |
-void GrInOrderDrawBuffer::discard(GrRenderTarget* renderTarget) { |
- if (!this->caps()->discardRenderTargetSupport()) { |
- return; |
- } |
- |
- GrTargetCommands::Cmd* cmd = fCommands->recordDiscard(renderTarget); |
- this->recordTraceMarkersIfNecessary(cmd); |
-} |
- |
-void GrInOrderDrawBuffer::onReset() { |
- fCommands->reset(); |
- fPathIndexBuffer.rewind(); |
- fPathTransformBuffer.rewind(); |
- fGpuCmdMarkers.reset(); |
- |
- fPrevState.reset(NULL); |
- // Note, fPrevState points into fPipelineBuffer's allocation, so we have to reset first. |
- // Furthermore, we have to reset fCommands before fPipelineBuffer too. |
- if (fDrawID % kPipelineBufferHighWaterMark) { |
- fPipelineBuffer.rewind(); |
- } else { |
- fPipelineBuffer.reset(); |
- } |
-} |
- |
-void GrInOrderDrawBuffer::onFlush() { |
- fCommands->flush(this); |
- ++fDrawID; |
-} |
- |
-void GrInOrderDrawBuffer::onCopySurface(GrSurface* dst, |
- GrSurface* src, |
- const SkIRect& srcRect, |
- const SkIPoint& dstPoint) { |
- SkASSERT(this->getGpu()->canCopySurface(dst, src, srcRect, dstPoint)); |
- GrTargetCommands::Cmd* cmd = fCommands->recordCopySurface(dst, src, srcRect, dstPoint); |
- this->recordTraceMarkersIfNecessary(cmd); |
-} |
- |
-void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary(GrTargetCommands::Cmd* cmd) { |
- if (!cmd) { |
- return; |
- } |
- const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |
- if (activeTraceMarkers.count() > 0) { |
- if (cmd->isTraced()) { |
- fGpuCmdMarkers[cmd->markerID()].addSet(activeTraceMarkers); |
- } else { |
- cmd->setMarkerID(fGpuCmdMarkers.count()); |
- fGpuCmdMarkers.push_back(activeTraceMarkers); |
- } |
- } |
-} |
- |
-GrTargetCommands::State* |
-GrInOrderDrawBuffer::setupPipelineAndShouldDraw(const GrPrimitiveProcessor* primProc, |
- const GrDrawTarget::PipelineInfo& pipelineInfo) { |
- State* state = this->allocState(primProc); |
- this->setupPipeline(pipelineInfo, state->pipelineLocation()); |
- |
- if (state->getPipeline()->mustSkip()) { |
- this->unallocState(state); |
- return NULL; |
- } |
- |
- state->fPrimitiveProcessor->initBatchTracker(&state->fBatchTracker, |
- state->getPipeline()->getInitBatchTracker()); |
- |
- if (fPrevState && fPrevState->fPrimitiveProcessor.get() && |
- fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker, |
- *state->fPrimitiveProcessor, |
- state->fBatchTracker) && |
- fPrevState->getPipeline()->isEqual(*state->getPipeline())) { |
- this->unallocState(state); |
- } else { |
- fPrevState.reset(state); |
- } |
- |
- this->recordTraceMarkersIfNecessary( |
- fCommands->recordXferBarrierIfNecessary(*fPrevState->getPipeline(), *this->caps())); |
- return fPrevState; |
-} |
- |
-GrTargetCommands::State* |
-GrInOrderDrawBuffer::setupPipelineAndShouldDraw(GrBatch* batch, |
- const GrDrawTarget::PipelineInfo& pipelineInfo) { |
- State* state = this->allocState(); |
- this->setupPipeline(pipelineInfo, state->pipelineLocation()); |
- |
- if (state->getPipeline()->mustSkip()) { |
- this->unallocState(state); |
- return NULL; |
- } |
- |
- batch->initBatchTracker(state->getPipeline()->getInitBatchTracker()); |
- |
- if (fPrevState && !fPrevState->fPrimitiveProcessor.get() && |
- fPrevState->getPipeline()->isEqual(*state->getPipeline())) { |
- this->unallocState(state); |
- } else { |
- fPrevState.reset(state); |
- } |
- |
- this->recordTraceMarkersIfNecessary( |
- fCommands->recordXferBarrierIfNecessary(*fPrevState->getPipeline(), *this->caps())); |
- return fPrevState; |
-} |
+}; |