Index: src/gpu/gl/GrGpuGL.cpp |
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp |
index 75c9b3af3098a09ad1753509f26855130ccd2b63..7b892913c55b873d2848ca7b920f85295b131af6 100644 |
--- a/src/gpu/gl/GrGpuGL.cpp |
+++ b/src/gpu/gl/GrGpuGL.cpp |
@@ -1360,14 +1360,16 @@ GrIndexBuffer* GrGpuGL::onCreateIndexBuffer(size_t size, bool dynamic) { |
} |
} |
-void GrGpuGL::flushScissor(const GrGLIRect& rtViewport, GrSurfaceOrigin rtOrigin) { |
- if (fScissorState.fEnabled) { |
+void GrGpuGL::flushScissor(const ScissorState& scissorState, |
+ const GrGLIRect& rtViewport, |
+ GrSurfaceOrigin rtOrigin) { |
+ if (scissorState.fEnabled) { |
GrGLIRect scissor; |
scissor.setRelativeTo(rtViewport, |
- fScissorState.fRect.fLeft, |
- fScissorState.fRect.fTop, |
- fScissorState.fRect.width(), |
- fScissorState.fRect.height(), |
+ scissorState.fRect.fLeft, |
+ scissorState.fRect.fTop, |
+ scissorState.fRect.width(), |
+ scissorState.fRect.height(), |
rtOrigin); |
// if the scissor fully contains the viewport then we fall through and |
// disable the scissor test. |
@@ -1383,6 +1385,12 @@ void GrGpuGL::flushScissor(const GrGLIRect& rtViewport, GrSurfaceOrigin rtOrigin |
return; |
} |
} |
+ |
+ // See fall through note above |
+ this->disableScissor(); |
+} |
+ |
+void GrGpuGL::disableScissor() { |
if (kNo_TriState != fHWScissorSettings.fEnabled) { |
GL_CALL(Disable(GR_GL_SCISSOR_TEST)); |
fHWScissorSettings.fEnabled = kNo_TriState; |
@@ -1413,12 +1421,12 @@ void GrGpuGL::onClear(GrRenderTarget* target, const SkIRect* rect, GrColor color |
} |
this->flushRenderTarget(glRT, rect); |
- GrAutoTRestore<ScissorState> asr(&fScissorState); |
- fScissorState.fEnabled = SkToBool(rect); |
- if (fScissorState.fEnabled) { |
- fScissorState.fRect = *rect; |
+ ScissorState scissorState; |
+ scissorState.fEnabled = SkToBool(rect); |
+ if (scissorState.fEnabled) { |
+ scissorState.fRect = *rect; |
} |
- this->flushScissor(glRT->getViewport(), glRT->origin()); |
+ this->flushScissor(scissorState, glRT->getViewport(), glRT->origin()); |
GrGLfloat r, g, b, a; |
static const GrGLfloat scale255 = 1.f / 255.f; |
@@ -1496,9 +1504,7 @@ void GrGpuGL::clearStencil(GrRenderTarget* target) { |
GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); |
this->flushRenderTarget(glRT, &SkIRect::EmptyIRect()); |
- GrAutoTRestore<ScissorState> asr(&fScissorState); |
- fScissorState.fEnabled = false; |
- this->flushScissor(glRT->getViewport(), glRT->origin()); |
+ this->disableScissor(); |
GL_CALL(StencilMask(0xffffffff)); |
GL_CALL(ClearStencil(0)); |
@@ -1533,10 +1539,10 @@ void GrGpuGL::clearStencilClip(GrRenderTarget* target, const SkIRect& rect, bool |
GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); |
this->flushRenderTarget(glRT, &SkIRect::EmptyIRect()); |
- GrAutoTRestore<ScissorState> asr(&fScissorState); |
- fScissorState.fEnabled = true; |
- fScissorState.fRect = rect; |
- this->flushScissor(glRT->getViewport(), glRT->origin()); |
+ ScissorState scissorState; |
+ scissorState.fEnabled = true; |
+ scissorState.fRect = rect; |
+ this->flushScissor(scissorState, glRT->getViewport(), glRT->origin()); |
GL_CALL(StencilMask((uint32_t) clipStencilMask)); |
GL_CALL(ClearStencil(value)); |
@@ -1826,22 +1832,19 @@ void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) { |
r.setRelativeTo(vp, dirtyRect.fLeft, dirtyRect.fTop, |
dirtyRect.width(), dirtyRect.height(), target->origin()); |
- GrAutoTRestore<ScissorState> asr; |
if (GrGLCaps::kES_Apple_MSFBOType == this->glCaps().msFBOType()) { |
// Apple's extension uses the scissor as the blit bounds. |
- asr.reset(&fScissorState); |
- fScissorState.fEnabled = true; |
- fScissorState.fRect = dirtyRect; |
- this->flushScissor(rt->getViewport(), rt->origin()); |
+ ScissorState scissorState; |
+ scissorState.fEnabled = true; |
+ scissorState.fRect = dirtyRect; |
+ this->flushScissor(scissorState, rt->getViewport(), rt->origin()); |
GL_CALL(ResolveMultisampleFramebuffer()); |
} else { |
int right = r.fLeft + r.fWidth; |
int top = r.fBottom + r.fHeight; |
// BlitFrameBuffer respects the scissor, so disable it. |
- asr.reset(&fScissorState); |
- fScissorState.fEnabled = false; |
- this->flushScissor(rt->getViewport(), rt->origin()); |
+ this->disableScissor(); |
GL_CALL(BlitFramebuffer(r.fLeft, r.fBottom, right, top, |
r.fLeft, r.fBottom, right, top, |
GR_GL_COLOR_BUFFER_BIT, GR_GL_NEAREST)); |
@@ -2508,11 +2511,8 @@ bool GrGpuGL::onCopySurface(GrSurface* dst, |
dstRect.height(), |
dst->origin()); |
- GrAutoTRestore<ScissorState> asr; |
// BlitFrameBuffer respects the scissor, so disable it. |
- asr.reset(&fScissorState); |
- fScissorState.fEnabled = false; |
- this->flushScissor(dstGLRect, dst->origin()); |
+ this->disableScissor(); |
GrGLint srcY0; |
GrGLint srcY1; |