Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(718)

Unified Diff: src/gpu/GrInOrderDrawBuffer.cpp

Issue 845103005: GrBatchPrototype (Closed) Base URL: https://skia.googlesource.com/skia.git@lc2
Patch Set: cleanup Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/GrInOrderDrawBuffer.cpp
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
index 468045c6340a639feea92386dab66425df5eb2e2..363fcdf3ecee40cd5f746bb48d5f873239531887 100644
--- a/src/gpu/GrInOrderDrawBuffer.cpp
+++ b/src/gpu/GrInOrderDrawBuffer.cpp
@@ -266,6 +266,32 @@ void GrInOrderDrawBuffer::onDraw(const GrDrawState& ds,
this->recordTraceMarkersIfNecessary();
}
+void GrInOrderDrawBuffer::onBatchDraw(GrBatch* batch,
+ const GrDrawState& ds,
+ GrPrimitiveType type,
+ const GrScissorState& scissorState,
+ const GrDeviceCoordTexture* dstCopy) {
+ if (!this->recordStateAndShouldDraw(batch, ds, GrGpu::PrimTypeToDrawType(type), scissorState,
+ dstCopy)) {
+ return;
+ }
+
+ // Check if there is a Batch Draw we can batch with
+ if (kBatchDraw != strip_trace_bit(fCmdBuffer.back().fType)) {
+ GrNEW_APPEND_TO_RECORDER(fCmdBuffer, BatchDraw, (batch));
+ return;
+ }
+
+ BatchDraw* draw = static_cast<BatchDraw*>(&fCmdBuffer.back());
+ if (draw->fBatch->canMakeEqual(*batch)) {
bsalomon 2015/01/20 16:14:03 probably want to rename these... canMerge? canComb
+ draw->fBatch->makeEqual(batch);
+ return;
+ } else {
+ GrNEW_APPEND_TO_RECORDER(fCmdBuffer, BatchDraw, (batch));
+ }
+ this->recordTraceMarkersIfNecessary();
+}
+
void GrInOrderDrawBuffer::onStencilPath(const GrDrawState& ds,
const GrPathProcessor* pathProc,
const GrPath* path,
@@ -434,7 +460,10 @@ 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());
+ // Batch draws will finalize later. TODO remove this when we use batch everywhere
+ if (currentOptState->getPrimitiveProcessor()) {
+ currentOptState->finalize(this->getGpu());
+ }
} else {
iter->execute(this, currentOptState);
}
@@ -479,6 +508,14 @@ void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf,
fCount, fStencilSettings);
}
+void GrInOrderDrawBuffer::BatchDraw::execute(GrInOrderDrawBuffer* buf,
+ const GrOptDrawState* optState) {
+ SkASSERT(optState);
+ fBatch->generateGeometry(buf->getGpu(), buf->getVertexAllocPool(), buf->getIndexAllocPool(),
+ const_cast<GrOptDrawState*>(optState));
+ fBatch->draw(buf->getGpu(), const_cast<GrOptDrawState*>(optState));
+}
+
void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const GrOptDrawState*) {}
void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const GrOptDrawState*) {
@@ -520,6 +557,24 @@ bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrDrawState& ds,
SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState,
(ds, primProc, *this->getGpu()->caps(), scissor,
dstCopy, drawType));
+ return recordStateAndShouldDraw(ss);
+}
+
+bool GrInOrderDrawBuffer::recordStateAndShouldDraw(GrBatch* batch,
+ const GrDrawState& ds,
+ GrGpu::DrawType drawType,
+ 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, ds, *this->getGpu()->caps(), scissor,
+ dstCopy, drawType));
+ return recordStateAndShouldDraw(ss);
+}
+
+bool GrInOrderDrawBuffer::recordStateAndShouldDraw(SetState* ss) {
if (ss->fState.mustSkip()) {
fCmdBuffer.pop_back();
return false;

Powered by Google App Engine
This is Rietveld 408576698