Index: src/gpu/GrInOrderDrawBuffer.cpp |
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp |
index 468045c6340a639feea92386dab66425df5eb2e2..f504f093176c8c6cb69d00cbcecd6c8e603d2e13 100644 |
--- a/src/gpu/GrInOrderDrawBuffer.cpp |
+++ b/src/gpu/GrInOrderDrawBuffer.cpp |
@@ -419,7 +419,7 @@ void GrInOrderDrawBuffer::onFlush() { |
// Updated every time we find a set state cmd to reflect the current state in the playback |
// stream. |
- GrOptDrawState* currentOptState = NULL; |
+ SetState* currentState = NULL; |
while (iter.next()) { |
GrGpuTraceMarker newMarker("", -1); |
@@ -433,10 +433,14 @@ void GrInOrderDrawBuffer::onFlush() { |
if (kSetState_Cmd == strip_trace_bit(iter->fType)) { |
SetState* ss = reinterpret_cast<SetState*>(iter.get()); |
- currentOptState = &ss->fState; |
- currentOptState->finalize(this->getGpu()); |
+ |
+ this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProcessor, ss->fState, |
+ ss->fState.descInfo(), ss->fState.drawType(), |
+ ss->fBatchTracker); |
+ currentState = ss; |
+ |
} else { |
- iter->execute(this, currentOptState); |
+ iter->execute(this, currentState); |
} |
if (cmd_has_trace_marker(iter->fType)) { |
@@ -448,12 +452,14 @@ void GrInOrderDrawBuffer::onFlush() { |
++fDrawID; |
} |
-void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const GrOptDrawState* optState) { |
- SkASSERT(optState); |
- buf->getGpu()->draw(*optState, fInfo); |
+void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const SetState* state) { |
+ SkASSERT(state); |
+ DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDesc, |
+ &state->fBatchTracker); |
+ buf->getGpu()->draw(args, fInfo); |
} |
-void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, const GrOptDrawState*) { |
+void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, const SetState*) { |
GrGpu::StencilPathState state; |
state.fRenderTarget = fRenderTarget.get(); |
state.fScissor = &fScissor; |
@@ -464,24 +470,26 @@ void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, const G |
buf->getGpu()->stencilPath(this->path(), state); |
} |
-void GrInOrderDrawBuffer::DrawPath::execute(GrInOrderDrawBuffer* buf, |
- const GrOptDrawState* optState) { |
- SkASSERT(optState); |
- buf->getGpu()->drawPath(*optState, this->path(), fStencilSettings); |
+void GrInOrderDrawBuffer::DrawPath::execute(GrInOrderDrawBuffer* buf, const SetState* state) { |
+ SkASSERT(state); |
+ DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDesc, |
+ &state->fBatchTracker); |
+ buf->getGpu()->drawPath(args, this->path(), fStencilSettings); |
} |
-void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, |
- const GrOptDrawState* optState) { |
- SkASSERT(optState); |
- buf->getGpu()->drawPaths(*optState, this->pathRange(), |
+void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const SetState* state) { |
+ SkASSERT(state); |
+ DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDesc, |
+ &state->fBatchTracker); |
+ buf->getGpu()->drawPaths(args, this->pathRange(), |
&buf->fPathIndexBuffer[fIndicesLocation], fIndexType, |
&buf->fPathTransformBuffer[fTransformsLocation], fTransformType, |
fCount, fStencilSettings); |
} |
-void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const GrOptDrawState*) {} |
+void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState*) {} |
-void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const GrOptDrawState*) { |
+void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const SetState*) { |
if (GrColor_ILLEGAL == fColor) { |
buf->getGpu()->discard(this->renderTarget()); |
} else { |
@@ -489,12 +497,11 @@ void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const GrOptDr |
} |
} |
-void GrInOrderDrawBuffer::ClearStencilClip::execute(GrInOrderDrawBuffer* buf, |
- const GrOptDrawState*) { |
+void GrInOrderDrawBuffer::ClearStencilClip::execute(GrInOrderDrawBuffer* buf, const SetState*) { |
buf->getGpu()->clearStencilClip(fRect, fInsideClip, this->renderTarget()); |
} |
-void GrInOrderDrawBuffer::CopySurface::execute(GrInOrderDrawBuffer* buf, const GrOptDrawState*) { |
+void GrInOrderDrawBuffer::CopySurface::execute(GrInOrderDrawBuffer* buf, const SetState*) { |
buf->getGpu()->copySurface(this->dst(), this->src(), fSrcRect, fDstPoint); |
} |
@@ -524,10 +531,18 @@ bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrDrawState& ds, |
fCmdBuffer.pop_back(); |
return false; |
} |
- if (fPrevState && fPrevState->combineIfPossible(ss->fState)) { |
+ |
+ ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker, |
+ ss->fState.getInitBatchTracker()); |
+ |
+ if (fPrevState && |
+ fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker, |
+ *ss->fPrimitiveProcessor, |
+ ss->fBatchTracker) && |
+ fPrevState->fState.isEqual(ss->fState)) { |
fCmdBuffer.pop_back(); |
} else { |
- fPrevState = &ss->fState; |
+ fPrevState = ss; |
this->recordTraceMarkersIfNecessary(); |
} |
return true; |