diff options
author | joshualitt <joshualitt@google.com> | 2015-01-27 06:41:33 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-27 06:41:33 -0800 |
commit | ca0a1799ffdceb4ccd998468566f39abac2f0b55 (patch) | |
tree | 5524b2cd3024f8ddfd076d21d05237562518800e /src/gpu/GrInOrderDrawBuffer.cpp | |
parent | 7defaa6c4a7577742d1b42bc869a84bd9a96e5a7 (diff) |
Revert of GrBatchPrototype (patchset #30 id:570001 of https://codereview.chromium.org/845103005/)
Reason for revert:
creates large performance regression
Original issue's description:
> GrBatchPrototype
>
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/d15e4e45374275c045572b304c229237c4a82be4
TBR=bsalomon@google.com,joshualitt@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review URL: https://codereview.chromium.org/862823004
Diffstat (limited to 'src/gpu/GrInOrderDrawBuffer.cpp')
-rw-r--r-- | src/gpu/GrInOrderDrawBuffer.cpp | 96 |
1 files changed, 7 insertions, 89 deletions
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp index 1453276e49..70d61ecfff 100644 --- a/src/gpu/GrInOrderDrawBuffer.cpp +++ b/src/gpu/GrInOrderDrawBuffer.cpp @@ -20,8 +20,7 @@ GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu, : INHERITED(gpu, vertexPool, indexPool) , fCmdBuffer(kCmdBufferInitialSizeInBytes) , fPrevState(NULL) - , fDrawID(0) - , fBatchTarget(gpu, vertexPool, indexPool) { + , fDrawID(0) { SkASSERT(vertexPool); SkASSERT(indexPool); @@ -211,7 +210,6 @@ int GrInOrderDrawBuffer::concatInstancedDraw(const GrPipelineBuilder& pipelineBu Draw* draw = static_cast<Draw*>(&fCmdBuffer.back()); if (!draw->fInfo.isInstanced() || - draw->fInfo.primitiveType() != info.primitiveType() || draw->fInfo.verticesPerInstance() != info.verticesPerInstance() || draw->fInfo.indicesPerInstance() != info.indicesPerInstance() || draw->fInfo.vertexBuffer() != info.vertexBuffer() || @@ -268,29 +266,6 @@ void GrInOrderDrawBuffer::onDraw(const GrPipelineBuilder& pipelineBuilder, this->recordTraceMarkersIfNecessary(); } -void GrInOrderDrawBuffer::onDrawBatch(GrBatch* batch, - const GrPipelineBuilder& pipelineBuilder, - const GrScissorState& scissorState, - const GrDeviceCoordTexture* dstCopy) { - if (!this->recordStateAndShouldDraw(batch, pipelineBuilder, scissorState, dstCopy)) { - return; - } - - // Check if there is a Batch Draw we can batch with - if (kDrawBatch_Cmd != strip_trace_bit(fCmdBuffer.back().fType)) { - GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawBatch, (batch)); - return; - } - - DrawBatch* draw = static_cast<DrawBatch*>(&fCmdBuffer.back()); - if (draw->fBatch->combineIfPossible(batch)) { - return; - } else { - GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawBatch, (batch)); - } - this->recordTraceMarkersIfNecessary(); -} - void GrInOrderDrawBuffer::onStencilPath(const GrPipelineBuilder& pipelineBuilder, const GrPathProcessor* pathProc, const GrPath* path, @@ -435,6 +410,7 @@ void GrInOrderDrawBuffer::onFlush() { return; } + CmdBuffer::Iter iter(fCmdBuffer); int currCmdMarker = 0; @@ -443,10 +419,6 @@ void GrInOrderDrawBuffer::onFlush() { // stream. SetState* currentState = NULL; - // TODO to prevent flushing the batch buffer too much, we only flush when wasBatch && !isBatch - // In the long term we can delete this and just flush once at the end of all geometry generation - bool wasBatch = false; - while (iter.next()) { GrGpuTraceMarker newMarker("", -1); SkString traceString; @@ -457,30 +429,13 @@ void GrInOrderDrawBuffer::onFlush() { ++currCmdMarker; } - bool isSetState = kSetState_Cmd == strip_trace_bit(iter->fType); - - if (!isSetState && kDrawBatch_Cmd != strip_trace_bit(iter->fType)) { - // TODO see note above, this gets deleted once everyone uses batch drawing - if (wasBatch) { - wasBatch = false; - fBatchTarget.flush(); - } - } - - if (isSetState) { + if (kSetState_Cmd == strip_trace_bit(iter->fType)) { SetState* ss = reinterpret_cast<SetState*>(iter.get()); - // TODO sometimes we have a prim proc, othertimes we have a GrBatch. Eventually we will - // only have GrBatch and we can delete this - if (ss->fPrimitiveProcessor) { - this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProcessor, - ss->fPipeline, - ss->fPipeline.descInfo(), - ss->fBatchTracker); - } else { - wasBatch = true; - } + this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProcessor, ss->fPipeline, + ss->fPipeline.descInfo(), ss->fBatchTracker); currentState = ss; + } else { iter->execute(this, currentState); } @@ -490,11 +445,6 @@ void GrInOrderDrawBuffer::onFlush() { } } - // TODO see note above, one last catch - if (wasBatch) { - fBatchTarget.flush(); - } - SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); ++fDrawID; } @@ -534,11 +484,6 @@ void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const Set fCount, fStencilSettings); } -void GrInOrderDrawBuffer::DrawBatch::execute(GrInOrderDrawBuffer* buf, const SetState* state) { - SkASSERT(state); - fBatch->generateGeometry(buf->getBatchTarget(), &state->fPipeline); -} - void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState*) {} void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const SetState*) { @@ -586,7 +531,7 @@ bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrPipelineBuilder& pipe ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker, ss->fPipeline.getInitBatchTracker()); - if (fPrevState && fPrevState->fPrimitiveProcessor.get() && + if (fPrevState && fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker, *ss->fPrimitiveProcessor, ss->fBatchTracker) && @@ -599,33 +544,6 @@ bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrPipelineBuilder& pipe return true; } -bool GrInOrderDrawBuffer::recordStateAndShouldDraw(GrBatch* batch, - const GrPipelineBuilder& pipelineBuilder, - const GrScissorState& scissor, - const GrDeviceCoordTexture* dstCopy) { - // TODO this gets much simpler when we have batches everywhere. - // If the previous command is also a set state, then we check to see if it has a Batch. If so, - // and we can make the two batches equal, and we can combine the states, then we make them equal - SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, - (batch, pipelineBuilder, *this->getGpu()->caps(), scissor, - dstCopy)); - if (ss->fPipeline.mustSkip()) { - fCmdBuffer.pop_back(); - return false; - } - - batch->initBatchTracker(ss->fPipeline.getInitBatchTracker()); - - if (fPrevState && !fPrevState->fPrimitiveProcessor.get() && - fPrevState->fPipeline.isEqual(ss->fPipeline)) { - fCmdBuffer.pop_back(); - } else { - fPrevState = ss; - this->recordTraceMarkersIfNecessary(); - } - return true; -} - void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { SkASSERT(!fCmdBuffer.empty()); SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); |