Fixed two bugs in SW-only clip mask generation
http://codereview.appspot.com/6306086/
git-svn-id: http://skia.googlecode.com/svn/trunk@4290 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrInOrderDrawBuffer.h b/src/gpu/GrInOrderDrawBuffer.h
index ed7d97d..9b5561a 100644
--- a/src/gpu/GrInOrderDrawBuffer.h
+++ b/src/gpu/GrInOrderDrawBuffer.h
@@ -81,8 +81,18 @@
* constraints and side-effects or playback() and reset apply().
*/
void flushTo(GrDrawTarget* target) {
+ if (fFlushing) {
+ // When creating SW-only clip masks, the GrClipMaskManager can
+ // cause a GrContext::flush (when copying the mask results back
+ // to the GPU). Without a guard this results in a recursive call
+ // to this method.
+ return;
+ }
+
+ fFlushing = true;
this->playback(target);
this->reset();
+ fFlushing = false;
}
/**
@@ -112,7 +122,9 @@
int* vertexCount,
int* indexCount) const SK_OVERRIDE;
- virtual void clear(const GrIRect* rect, GrColor color) SK_OVERRIDE;
+ virtual void clear(const GrIRect* rect,
+ GrColor color,
+ GrRenderTarget* renderTarget = NULL) SK_OVERRIDE;
protected:
virtual void willReserveVertexAndIndexSpace(GrVertexLayout vertexLayout,
@@ -133,9 +145,13 @@
};
struct Clear {
- int fBeforeDrawIdx;
- GrIRect fRect;
- GrColor fColor;
+ Clear() : fRenderTarget(NULL) {}
+ ~Clear() { GrSafeUnref(fRenderTarget); }
+
+ int fBeforeDrawIdx;
+ GrIRect fRect;
+ GrColor fColor;
+ GrRenderTarget* fRenderTarget;
};
// overrides from GrDrawTarget
@@ -226,6 +242,8 @@
};
SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> fGeoPoolStateStack;
+ bool fFlushing;
+
typedef GrDrawTarget INHERITED;
};