From 82bc7a772747fcf8a6fe7097f70bf2981429ffe9 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 3 Jan 2012 14:13:39 -0800 Subject: Properly restore the GL scissor after a GL draw functor Bug #5781254 Change-Id: I1dc4809563a793b6b579814951d4d73b4c34bf32 --- libs/hwui/OpenGLRenderer.cpp | 49 +++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 21 deletions(-) (limited to 'libs/hwui/OpenGLRenderer.cpp') diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 75c6d0aebf49..d1b469f257a6 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -206,6 +206,7 @@ void OpenGLRenderer::resume() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glEnable(GL_SCISSOR_TEST); + mCaches.resetScissor(); dirtyClip(); mCaches.activeTexture(0); @@ -2517,32 +2518,38 @@ void OpenGLRenderer::chooseBlending(bool blend, SkXfermode::Mode mode, ProgramDescription& description, bool swapSrcDst) { blend = blend || mode != SkXfermode::kSrcOver_Mode; if (blend) { - if (mode <= SkXfermode::kScreen_Mode) { - if (!mCaches.blend) { - glEnable(GL_BLEND); - } - - GLenum sourceMode = swapSrcDst ? gBlendsSwap[mode].src : gBlends[mode].src; - GLenum destMode = swapSrcDst ? gBlendsSwap[mode].dst : gBlends[mode].dst; - - if (sourceMode != mCaches.lastSrcMode || destMode != mCaches.lastDstMode) { - glBlendFunc(sourceMode, destMode); - mCaches.lastSrcMode = sourceMode; - mCaches.lastDstMode = destMode; - } - } else { - // These blend modes are not supported by OpenGL directly and have - // to be implemented using shaders. Since the shader will perform - // the blending, turn blending off here + // These blend modes are not supported by OpenGL directly and have + // to be implemented using shaders. Since the shader will perform + // the blending, turn blending off here + // If the blend mode cannot be implemented using shaders, fall + // back to the default SrcOver blend mode instead + if (mode > SkXfermode::kScreen_Mode) { if (mCaches.extensions.hasFramebufferFetch()) { description.framebufferMode = mode; description.swapSrcDst = swapSrcDst; - } - if (mCaches.blend) { - glDisable(GL_BLEND); + if (mCaches.blend) { + glDisable(GL_BLEND); + mCaches.blend = false; + } + + return; + } else { + mode = SkXfermode::kSrcOver_Mode; } - blend = false; + } + + if (!mCaches.blend) { + glEnable(GL_BLEND); + } + + GLenum sourceMode = swapSrcDst ? gBlendsSwap[mode].src : gBlends[mode].src; + GLenum destMode = swapSrcDst ? gBlendsSwap[mode].dst : gBlends[mode].dst; + + if (sourceMode != mCaches.lastSrcMode || destMode != mCaches.lastDstMode) { + glBlendFunc(sourceMode, destMode); + mCaches.lastSrcMode = sourceMode; + mCaches.lastDstMode = destMode; } } else if (mCaches.blend) { glDisable(GL_BLEND); -- cgit v1.2.3-59-g8ed1b