Use a prioritized list of path renderers in Gr.
http://codereview.appspot.com/4867058
git-svn-id: http://skia.googlecode.com/svn/trunk@2143 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpu.cpp b/gpu/src/GrGpu.cpp
index cde851d..7744e6a 100644
--- a/gpu/src/GrGpu.cpp
+++ b/gpu/src/GrGpu.cpp
@@ -40,8 +40,7 @@
, fGeomPoolStateStack(&fGeoSrcStateStackStorage)
, fQuadIndexBuffer(NULL)
, fUnitSquareVertexBuffer(NULL)
- , fDefaultPathRenderer(NULL)
- , fClientPathRenderer(NULL)
+ , fPathRendererChain(NULL)
, fContextIsDirty(true)
, fResourceHead(NULL) {
@@ -62,8 +61,6 @@
GrGpu::~GrGpu() {
this->releaseResources();
- GrSafeUnref(fDefaultPathRenderer);
- GrSafeUnref(fClientPathRenderer);
}
void GrGpu::abandonResources() {
@@ -81,6 +78,8 @@
fVertexPool = NULL;
delete fIndexPool;
fIndexPool = NULL;
+ // in case path renderer has any GrResources, start from scratch
+ GrSafeSetNull(fPathRendererChain);
}
void GrGpu::releaseResources() {
@@ -98,6 +97,8 @@
fVertexPool = NULL;
delete fIndexPool;
fIndexPool = NULL;
+ // in case path renderer has any GrResources, start from scratch
+ GrSafeSetNull(fPathRendererChain);
}
void GrGpu::insertResource(GrResource* resource) {
@@ -521,6 +522,11 @@
fill = NonInvertedFill(fill);
clipPath = &clip.getPath(c);
pr = this->getClipPathRenderer(*clipPath, fill);
+ if (NULL == pr) {
+ fClipInStencil = false;
+ fClip = clip;
+ return false;
+ }
canRenderDirectToStencil =
!pr->requiresStencilPass(this, *clipPath, fill);
arp.set(pr, this, clipPath, fill, NULL);
@@ -602,18 +608,12 @@
GrPathRenderer* GrGpu::getClipPathRenderer(const GrPath& path,
GrPathFill fill) {
- if (NULL != fClientPathRenderer &&
- fClientPathRenderer->canDrawPath(path, fill)) {
- return fClientPathRenderer;
- } else {
- if (NULL == fDefaultPathRenderer) {
- fDefaultPathRenderer =
- new GrDefaultPathRenderer(this->supportsTwoSidedStencil(),
- this->supportsStencilWrapOps());
- }
- GrAssert(fDefaultPathRenderer->canDrawPath(path, fill));
- return fDefaultPathRenderer;
+ if (NULL == fPathRendererChain) {
+ fPathRendererChain =
+ new GrPathRendererChain(this->getContext(),
+ GrPathRendererChain::kNonAAOnly_UsageFlag);
}
+ return fPathRendererChain->getPathRenderer(this, path, fill);
}