Index: src/gpu/GrInOrderDrawBuffer.cpp |
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp |
index 0cab19ff04fd82eb61c5971ff1a0cc086c080302..6e447590b01720462a50224feafd723aa128888c 100644 |
--- a/src/gpu/GrInOrderDrawBuffer.cpp |
+++ b/src/gpu/GrInOrderDrawBuffer.cpp |
@@ -350,9 +350,7 @@ void GrInOrderDrawBuffer::onDraw(const DrawInfo& info) { |
if (this->needsNewClip()) { |
this->recordClip(); |
} |
- if (this->needsNewState()) { |
- this->recordState(); |
- } |
+ this->recordStateIfNecessary(); |
DrawRecord* draw; |
if (info.isInstanced()) { |
@@ -424,9 +422,7 @@ void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, SkPath::FillType fil |
this->recordClip(); |
} |
// Only compare the subset of GrDrawState relevant to path stenciling? |
- if (this->needsNewState()) { |
- this->recordState(); |
- } |
+ this->recordStateIfNecessary(); |
StencilPath* sp = this->recordStencilPath(); |
sp->fPath.reset(path); |
path->ref(); |
@@ -439,9 +435,7 @@ void GrInOrderDrawBuffer::onDrawPath(const GrPath* path, |
this->recordClip(); |
} |
// TODO: Only compare the subset of GrDrawState relevant to path covering? |
- if (this->needsNewState()) { |
- this->recordState(); |
- } |
+ this->recordStateIfNecessary(); |
DrawPath* cp = this->recordDrawPath(); |
cp->fPath.reset(path); |
path->ref(); |
@@ -462,9 +456,7 @@ void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange, |
if (this->needsNewClip()) { |
this->recordClip(); |
} |
- if (this->needsNewState()) { |
- this->recordState(); |
- } |
+ this->recordStateIfNecessary(); |
DrawPaths* dp = this->recordDrawPaths(); |
dp->fPathRange.reset(SkRef(pathRange)); |
dp->fIndices = SkNEW_ARRAY(uint32_t, count); // TODO: Accomplish this without a malloc |
@@ -919,8 +911,26 @@ void GrInOrderDrawBuffer::geometrySourceWillPop( |
} |
} |
-bool GrInOrderDrawBuffer::needsNewState() const { |
- return fStates.empty() || fStates.back() != this->getDrawState(); |
+void GrInOrderDrawBuffer::recordStateIfNecessary() { |
+ if (fStates.empty()) { |
+ fStates.push_back() = this->getDrawState(); |
+ this->addToCmdBuffer(kSetState_Cmd); |
+ return; |
+ } |
+ const GrDrawState& curr = this->getDrawState(); |
+ GrDrawState& prev = fStates.back(); |
+ switch (GrDrawState::CombineIfPossible(prev, curr)) { |
+ case GrDrawState::kIncompatible_CombinedState: |
+ fStates.push_back() = this->getDrawState(); |
+ this->addToCmdBuffer(kSetState_Cmd); |
+ break; |
+ case GrDrawState::kA_CombinedState: |
+ case GrDrawState::kAOrB_CombinedState: // Treat the same as kA. |
+ break; |
+ case GrDrawState::kB_CombinedState: |
+ prev = curr; |
+ break; |
+ } |
} |
bool GrInOrderDrawBuffer::needsNewClip() const { |
@@ -953,11 +963,6 @@ void GrInOrderDrawBuffer::recordClip() { |
this->addToCmdBuffer(kSetClip_Cmd); |
} |
-void GrInOrderDrawBuffer::recordState() { |
- fStates.push_back() = this->getDrawState(); |
- this->addToCmdBuffer(kSetState_Cmd); |
-} |
- |
GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo& info) { |
this->addToCmdBuffer(kDraw_Cmd); |
return &fDraws.push_back(info); |