Loading core/java/android/view/HardwareRenderer.java +17 −1 Original line number Diff line number Diff line Loading @@ -148,6 +148,17 @@ public abstract class HardwareRenderer { public static final String DEBUG_SHOW_LAYERS_UPDATES_PROPERTY = "debug.hwui.show_layers_updates"; /** * Turn on to show overdraw level. * * Possible values: * "true", to enable overdraw debugging * "false", to disable overdraw debugging * * @hide */ public static final String DEBUG_SHOW_OVERDRAW_PROPERTY = "debug.hwui.show_overdraw"; /** * A process can set this flag to false to prevent the use of hardware * rendering. Loading Loading @@ -649,6 +660,7 @@ public abstract class HardwareRenderer { int mProfileCurrentFrame = -PROFILE_FRAME_DATA_COUNT; final boolean mDebugDirtyRegions; final boolean mShowOverdraw; final int mGlVersion; final boolean mTranslucent; Loading Loading @@ -698,6 +710,9 @@ public abstract class HardwareRenderer { if (mDebugDirtyRegions) { Log.d(LOG_TAG, "Debugging dirty regions"); } mShowOverdraw = SystemProperties.getBoolean( HardwareRenderer.DEBUG_SHOW_OVERDRAW_PROPERTY, false); } @Override Loading Loading @@ -1414,7 +1429,8 @@ public abstract class HardwareRenderer { EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 0, EGL_STENCIL_SIZE, GLES20Canvas.getStencilSize(), // TODO: Find a better way to choose the stencil size EGL_STENCIL_SIZE, mShowOverdraw ? GLES20Canvas.getStencilSize() : 0, EGL_SURFACE_TYPE, EGL_WINDOW_BIT | (dirtyRegions ? EGL_SWAP_BEHAVIOR_PRESERVED_BIT : 0), EGL_NONE Loading libs/hwui/Caches.cpp +10 −1 Original line number Diff line number Diff line Loading @@ -131,6 +131,13 @@ void Caches::initProperties() { } else { debugLayersUpdates = false; } if (property_get(PROPERTY_DEBUG_OVERDRAW, property, NULL) > 0) { INIT_LOGD(" Overdraw debug enabled: %s", property); debugOverdraw = !strcmp(property, "true"); } else { debugOverdraw = false; } } void Caches::terminate() { Loading Loading @@ -429,7 +436,9 @@ void Caches::resetScissor() { void Caches::startTiling(GLuint x, GLuint y, GLuint width, GLuint height, bool opaque) { if (extensions.hasTiledRendering()) { glStartTilingQCOM(x, y, width, height, opaque ? GL_NONE : GL_COLOR_BUFFER_BIT0_QCOM); glStartTilingQCOM(x, y, width, height, (opaque ? GL_NONE : GL_COLOR_BUFFER_BIT0_QCOM) | (debugOverdraw ? GL_STENCIL_BUFFER_BIT0_QCOM : 0)); } } Loading libs/hwui/Caches.h +1 −0 Original line number Diff line number Diff line Loading @@ -242,6 +242,7 @@ public: // Misc GLint maxTextureSize; bool debugLayersUpdates; bool debugOverdraw; TextureCache textureCache; LayerCache layerCache; Loading libs/hwui/OpenGLRenderer.cpp +46 −1 Original line number Diff line number Diff line Loading @@ -194,6 +194,8 @@ int OpenGLRenderer::prepareDirty(float left, float top, float right, float botto mTilingSnapshot = mSnapshot; startTiling(mTilingSnapshot, true); debugOverdraw(true, true); if (!opaque) { mCaches.enableScissor(); mCaches.setScissor(left, mSnapshot->height - bottom, right - left, bottom - top); Loading Loading @@ -231,6 +233,7 @@ void OpenGLRenderer::endTiling() { } void OpenGLRenderer::finish() { renderOverdraw(); endTiling(); if (!suppressErrorChecks()) { Loading Loading @@ -265,6 +268,40 @@ void OpenGLRenderer::finish() { } } void OpenGLRenderer::debugOverdraw(bool enable, bool clear) { if (mCaches.debugOverdraw && getTargetFbo() == 0) { if (clear) { mCaches.disableScissor(); mCaches.stencil.clear(); } if (enable) { mCaches.stencil.enableDebugWrite(); } else { mCaches.stencil.disable(); } } } void OpenGLRenderer::renderOverdraw() { if (mCaches.debugOverdraw && getTargetFbo() == 0) { const Rect* clip = mTilingSnapshot->clipRect; mCaches.enableScissor(); mCaches.setScissor(clip->left, mTilingSnapshot->height - clip->bottom, clip->right - clip->left, clip->bottom - clip->top); mCaches.stencil.enableDebugTest(2); drawColor(0x2f0000ff, SkXfermode::kSrcOver_Mode); mCaches.stencil.enableDebugTest(3); drawColor(0x2f00ff00, SkXfermode::kSrcOver_Mode); mCaches.stencil.enableDebugTest(4); drawColor(0x3fff0000, SkXfermode::kSrcOver_Mode); mCaches.stencil.enableDebugTest(4, true); drawColor(0x7fff0000, SkXfermode::kSrcOver_Mode); mCaches.stencil.disable(); } } void OpenGLRenderer::interrupt() { if (mCaches.currentProgram) { if (mCaches.currentProgram->isInUse()) { Loading @@ -276,12 +313,14 @@ void OpenGLRenderer::interrupt() { mCaches.unbindIndicesBuffer(); mCaches.resetVertexPointers(); mCaches.disbaleTexCoordsVertexArray(); debugOverdraw(false, false); } void OpenGLRenderer::resume() { sp<Snapshot> snapshot = (mSnapshot != NULL) ? mSnapshot : mFirstSnapshot; glViewport(0, 0, snapshot->viewport.getWidth(), snapshot->viewport.getHeight()); glBindFramebuffer(GL_FRAMEBUFFER, snapshot->fbo); debugOverdraw(true, false); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); Loading @@ -302,6 +341,7 @@ void OpenGLRenderer::resumeAfterLayer() { sp<Snapshot> snapshot = (mSnapshot != NULL) ? mSnapshot : mFirstSnapshot; glViewport(0, 0, snapshot->viewport.getWidth(), snapshot->viewport.getHeight()); glBindFramebuffer(GL_FRAMEBUFFER, snapshot->fbo); debugOverdraw(true, false); mCaches.resetScissor(); dirtyClip(); Loading Loading @@ -407,7 +447,10 @@ bool OpenGLRenderer::updateLayer(Layer* layer, bool inFrame) { OpenGLRenderer* renderer = layer->renderer; Rect& dirty = layer->dirtyRect; if (inFrame) endTiling(); if (inFrame) { endTiling(); debugOverdraw(false, false); } renderer->setViewport(layer->layer.getWidth(), layer->layer.getHeight()); renderer->prepareDirty(dirty.left, dirty.top, dirty.right, dirty.bottom, !layer->isBlend()); Loading Loading @@ -724,6 +767,7 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLui mSnapshot->orthoMatrix.load(mOrthoMatrix); endTiling(); debugOverdraw(false, false); // Bind texture to FBO glBindFramebuffer(GL_FRAMEBUFFER, layer->getFbo()); layer->bindTexture(); Loading Loading @@ -772,6 +816,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); // Unbind current FBO and restore previous one glBindFramebuffer(GL_FRAMEBUFFER, previous->fbo); debugOverdraw(true, false); startTiling(previous); } Loading libs/hwui/OpenGLRenderer.h +3 −0 Original line number Diff line number Diff line Loading @@ -723,6 +723,9 @@ private: */ void drawRegionRects(const Region& region); void debugOverdraw(bool enable, bool clear); void renderOverdraw(); /** * Should be invoked every time the glScissor is modified. */ Loading Loading
core/java/android/view/HardwareRenderer.java +17 −1 Original line number Diff line number Diff line Loading @@ -148,6 +148,17 @@ public abstract class HardwareRenderer { public static final String DEBUG_SHOW_LAYERS_UPDATES_PROPERTY = "debug.hwui.show_layers_updates"; /** * Turn on to show overdraw level. * * Possible values: * "true", to enable overdraw debugging * "false", to disable overdraw debugging * * @hide */ public static final String DEBUG_SHOW_OVERDRAW_PROPERTY = "debug.hwui.show_overdraw"; /** * A process can set this flag to false to prevent the use of hardware * rendering. Loading Loading @@ -649,6 +660,7 @@ public abstract class HardwareRenderer { int mProfileCurrentFrame = -PROFILE_FRAME_DATA_COUNT; final boolean mDebugDirtyRegions; final boolean mShowOverdraw; final int mGlVersion; final boolean mTranslucent; Loading Loading @@ -698,6 +710,9 @@ public abstract class HardwareRenderer { if (mDebugDirtyRegions) { Log.d(LOG_TAG, "Debugging dirty regions"); } mShowOverdraw = SystemProperties.getBoolean( HardwareRenderer.DEBUG_SHOW_OVERDRAW_PROPERTY, false); } @Override Loading Loading @@ -1414,7 +1429,8 @@ public abstract class HardwareRenderer { EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 0, EGL_STENCIL_SIZE, GLES20Canvas.getStencilSize(), // TODO: Find a better way to choose the stencil size EGL_STENCIL_SIZE, mShowOverdraw ? GLES20Canvas.getStencilSize() : 0, EGL_SURFACE_TYPE, EGL_WINDOW_BIT | (dirtyRegions ? EGL_SWAP_BEHAVIOR_PRESERVED_BIT : 0), EGL_NONE Loading
libs/hwui/Caches.cpp +10 −1 Original line number Diff line number Diff line Loading @@ -131,6 +131,13 @@ void Caches::initProperties() { } else { debugLayersUpdates = false; } if (property_get(PROPERTY_DEBUG_OVERDRAW, property, NULL) > 0) { INIT_LOGD(" Overdraw debug enabled: %s", property); debugOverdraw = !strcmp(property, "true"); } else { debugOverdraw = false; } } void Caches::terminate() { Loading Loading @@ -429,7 +436,9 @@ void Caches::resetScissor() { void Caches::startTiling(GLuint x, GLuint y, GLuint width, GLuint height, bool opaque) { if (extensions.hasTiledRendering()) { glStartTilingQCOM(x, y, width, height, opaque ? GL_NONE : GL_COLOR_BUFFER_BIT0_QCOM); glStartTilingQCOM(x, y, width, height, (opaque ? GL_NONE : GL_COLOR_BUFFER_BIT0_QCOM) | (debugOverdraw ? GL_STENCIL_BUFFER_BIT0_QCOM : 0)); } } Loading
libs/hwui/Caches.h +1 −0 Original line number Diff line number Diff line Loading @@ -242,6 +242,7 @@ public: // Misc GLint maxTextureSize; bool debugLayersUpdates; bool debugOverdraw; TextureCache textureCache; LayerCache layerCache; Loading
libs/hwui/OpenGLRenderer.cpp +46 −1 Original line number Diff line number Diff line Loading @@ -194,6 +194,8 @@ int OpenGLRenderer::prepareDirty(float left, float top, float right, float botto mTilingSnapshot = mSnapshot; startTiling(mTilingSnapshot, true); debugOverdraw(true, true); if (!opaque) { mCaches.enableScissor(); mCaches.setScissor(left, mSnapshot->height - bottom, right - left, bottom - top); Loading Loading @@ -231,6 +233,7 @@ void OpenGLRenderer::endTiling() { } void OpenGLRenderer::finish() { renderOverdraw(); endTiling(); if (!suppressErrorChecks()) { Loading Loading @@ -265,6 +268,40 @@ void OpenGLRenderer::finish() { } } void OpenGLRenderer::debugOverdraw(bool enable, bool clear) { if (mCaches.debugOverdraw && getTargetFbo() == 0) { if (clear) { mCaches.disableScissor(); mCaches.stencil.clear(); } if (enable) { mCaches.stencil.enableDebugWrite(); } else { mCaches.stencil.disable(); } } } void OpenGLRenderer::renderOverdraw() { if (mCaches.debugOverdraw && getTargetFbo() == 0) { const Rect* clip = mTilingSnapshot->clipRect; mCaches.enableScissor(); mCaches.setScissor(clip->left, mTilingSnapshot->height - clip->bottom, clip->right - clip->left, clip->bottom - clip->top); mCaches.stencil.enableDebugTest(2); drawColor(0x2f0000ff, SkXfermode::kSrcOver_Mode); mCaches.stencil.enableDebugTest(3); drawColor(0x2f00ff00, SkXfermode::kSrcOver_Mode); mCaches.stencil.enableDebugTest(4); drawColor(0x3fff0000, SkXfermode::kSrcOver_Mode); mCaches.stencil.enableDebugTest(4, true); drawColor(0x7fff0000, SkXfermode::kSrcOver_Mode); mCaches.stencil.disable(); } } void OpenGLRenderer::interrupt() { if (mCaches.currentProgram) { if (mCaches.currentProgram->isInUse()) { Loading @@ -276,12 +313,14 @@ void OpenGLRenderer::interrupt() { mCaches.unbindIndicesBuffer(); mCaches.resetVertexPointers(); mCaches.disbaleTexCoordsVertexArray(); debugOverdraw(false, false); } void OpenGLRenderer::resume() { sp<Snapshot> snapshot = (mSnapshot != NULL) ? mSnapshot : mFirstSnapshot; glViewport(0, 0, snapshot->viewport.getWidth(), snapshot->viewport.getHeight()); glBindFramebuffer(GL_FRAMEBUFFER, snapshot->fbo); debugOverdraw(true, false); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); Loading @@ -302,6 +341,7 @@ void OpenGLRenderer::resumeAfterLayer() { sp<Snapshot> snapshot = (mSnapshot != NULL) ? mSnapshot : mFirstSnapshot; glViewport(0, 0, snapshot->viewport.getWidth(), snapshot->viewport.getHeight()); glBindFramebuffer(GL_FRAMEBUFFER, snapshot->fbo); debugOverdraw(true, false); mCaches.resetScissor(); dirtyClip(); Loading Loading @@ -407,7 +447,10 @@ bool OpenGLRenderer::updateLayer(Layer* layer, bool inFrame) { OpenGLRenderer* renderer = layer->renderer; Rect& dirty = layer->dirtyRect; if (inFrame) endTiling(); if (inFrame) { endTiling(); debugOverdraw(false, false); } renderer->setViewport(layer->layer.getWidth(), layer->layer.getHeight()); renderer->prepareDirty(dirty.left, dirty.top, dirty.right, dirty.bottom, !layer->isBlend()); Loading Loading @@ -724,6 +767,7 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLui mSnapshot->orthoMatrix.load(mOrthoMatrix); endTiling(); debugOverdraw(false, false); // Bind texture to FBO glBindFramebuffer(GL_FRAMEBUFFER, layer->getFbo()); layer->bindTexture(); Loading Loading @@ -772,6 +816,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); // Unbind current FBO and restore previous one glBindFramebuffer(GL_FRAMEBUFFER, previous->fbo); debugOverdraw(true, false); startTiling(previous); } Loading
libs/hwui/OpenGLRenderer.h +3 −0 Original line number Diff line number Diff line Loading @@ -723,6 +723,9 @@ private: */ void drawRegionRects(const Region& region); void debugOverdraw(bool enable, bool clear); void renderOverdraw(); /** * Should be invoked every time the glScissor is modified. */ Loading