Loading libs/hwui/Debug.h +3 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,9 @@ // Turn on to insert an event marker for each display list op #define DEBUG_DISPLAY_LIST_OPS_AS_EVENTS 0 // Turn on to insert detailed event markers #define DEBUG_DETAILED_EVENTS 0 // Turn on to highlight drawing batches and merged batches with different colors #define DEBUG_MERGE_BEHAVIOR 0 Loading libs/hwui/OpenGLRenderer.cpp +46 −8 Original line number Diff line number Diff line Loading @@ -45,6 +45,12 @@ #include "Vector.h" #include "VertexBuffer.h" #if DEBUG_DETAILED_EVENTS #define EVENT_LOGD(...) eventMarkDEBUG(__VA_ARGS__) #else #define EVENT_LOGD(...) #endif namespace android { namespace uirenderer { Loading Loading @@ -389,6 +395,21 @@ status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) { // Debug /////////////////////////////////////////////////////////////////////////////// void OpenGLRenderer::eventMarkDEBUG(const char* fmt, ...) const { #if DEBUG_DETAILED_EVENTS const int BUFFER_SIZE = 256; va_list ap; char buf[BUFFER_SIZE]; va_start(ap, fmt); vsnprintf(buf, BUFFER_SIZE, fmt, ap); va_end(ap); eventMark(buf); #endif } void OpenGLRenderer::eventMark(const char* name) const { mCaches.eventMark(0, name); } Loading Loading @@ -977,7 +998,13 @@ void OpenGLRenderer::drawTextureLayer(Layer* layer, const Rect& rect) { } void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) { if (!layer->isTextureLayer()) { if (layer->isTextureLayer()) { EVENT_LOGD("composeTextureLayerRect"); resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f); drawTextureLayer(layer, rect); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); } else { EVENT_LOGD("composeHardwareLayerRect"); const Rect& texCoords = layer->texCoords; resetDrawTextureTexCoords(texCoords.left, texCoords.top, texCoords.right, texCoords.bottom); Loading Loading @@ -1012,10 +1039,6 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) GL_TRIANGLE_STRIP, gMeshCount, swap, swap || simpleTransform); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); } else { resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f); drawTextureLayer(layer, rect); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); } } Loading Loading @@ -1115,6 +1138,7 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { return; } EVENT_LOGD("composeLayerRegion"); // standard Region based draw size_t count; const android::Rect* rects; Loading Loading @@ -1288,6 +1312,7 @@ void OpenGLRenderer::clearLayerRegions() { if (count == 0) return; if (!currentSnapshot()->isIgnored()) { EVENT_LOGD("clearLayerRegions"); // Doing several glScissor/glClear here can negatively impact // GPUs with a tiler architecture, instead we draw quads with // the Clear blending mode Loading Loading @@ -1465,6 +1490,8 @@ void OpenGLRenderer::attachStencilBufferToLayer(Layer* layer) { void OpenGLRenderer::setStencilFromClip() { if (!mCaches.debugOverdraw) { if (!currentSnapshot()->clipRegion->isEmpty()) { EVENT_LOGD("setStencilFromClip - enabling"); // NOTE: The order here is important, we must set dirtyClip to false // before any draw call to avoid calling back into this method mDirtyClip = false; Loading Loading @@ -1510,6 +1537,7 @@ void OpenGLRenderer::setStencilFromClip() { drawRegionRects(*(currentSnapshot()->clipRegion), paint); } } else { EVENT_LOGD("setStencilFromClip - disabling"); mCaches.stencil.disable(); } } Loading Loading @@ -1561,17 +1589,24 @@ void OpenGLRenderer::debugClip() { // Drawing commands /////////////////////////////////////////////////////////////////////////////// void OpenGLRenderer::setupDraw(bool clear) { void OpenGLRenderer::setupDraw(bool clearLayer) { // TODO: It would be best if we could do this before quickRejectSetupScissor() // changes the scissor test state if (clear) clearLayerRegions(); if (clearLayer) clearLayerRegions(); // Make sure setScissor & setStencil happen at the beginning of // this method if (mDirtyClip) { if (mCaches.scissorEnabled) { setScissorFromClip(); } if (clearLayer) { setStencilFromClip(); } else { // While clearing layer, force disable stencil buffer, since // it's invalid to stencil-clip *during* the layer clear mCaches.stencil.disable(); } } mDescription.reset(); Loading Loading @@ -2964,6 +2999,9 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y) { return DrawGlInfo::kStatusDone; } EVENT_LOGD("drawLayer," RECT_STRING ", clipRequired %d", x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight(), clipRequired); updateLayer(layer, true); mCaches.setScissorEnabled(mScissorOptimizationDisabled || clipRequired); Loading libs/hwui/OpenGLRenderer.h +5 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,11 @@ public: */ void eventMark(const char* name) const; /** * Inserts a formatted event marker in the stream of GL commands. */ void eventMarkDEBUG(const char *fmt, ...) const; /** * Inserts a named group marker in the stream of GL commands. This marker * can be used by tools to group commands into logical groups. A call to Loading libs/hwui/Rect.h +1 −1 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ namespace android { namespace uirenderer { #define RECT_STRING "%7.2f %7.2f %7.2f %7.2f" #define RECT_STRING "%5.2f %5.2f %5.2f %5.2f" #define RECT_ARGS(r) \ (r).left, (r).top, (r).right, (r).bottom #define SK_RECT_ARGS(r) \ Loading libs/hwui/StatefulBaseRenderer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,7 @@ bool StatefulBaseRenderer::clipPath(const SkPath* path, SkRegion::Op op) { SkRegion region; region.setPath(transformed, clip); // region is the transformed input path, masked by the previous clip mDirtyClip |= mSnapshot->clipRegionTransformed(region, op); return !mSnapshot->clipRect->isEmpty(); } Loading Loading
libs/hwui/Debug.h +3 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,9 @@ // Turn on to insert an event marker for each display list op #define DEBUG_DISPLAY_LIST_OPS_AS_EVENTS 0 // Turn on to insert detailed event markers #define DEBUG_DETAILED_EVENTS 0 // Turn on to highlight drawing batches and merged batches with different colors #define DEBUG_MERGE_BEHAVIOR 0 Loading
libs/hwui/OpenGLRenderer.cpp +46 −8 Original line number Diff line number Diff line Loading @@ -45,6 +45,12 @@ #include "Vector.h" #include "VertexBuffer.h" #if DEBUG_DETAILED_EVENTS #define EVENT_LOGD(...) eventMarkDEBUG(__VA_ARGS__) #else #define EVENT_LOGD(...) #endif namespace android { namespace uirenderer { Loading Loading @@ -389,6 +395,21 @@ status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) { // Debug /////////////////////////////////////////////////////////////////////////////// void OpenGLRenderer::eventMarkDEBUG(const char* fmt, ...) const { #if DEBUG_DETAILED_EVENTS const int BUFFER_SIZE = 256; va_list ap; char buf[BUFFER_SIZE]; va_start(ap, fmt); vsnprintf(buf, BUFFER_SIZE, fmt, ap); va_end(ap); eventMark(buf); #endif } void OpenGLRenderer::eventMark(const char* name) const { mCaches.eventMark(0, name); } Loading Loading @@ -977,7 +998,13 @@ void OpenGLRenderer::drawTextureLayer(Layer* layer, const Rect& rect) { } void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) { if (!layer->isTextureLayer()) { if (layer->isTextureLayer()) { EVENT_LOGD("composeTextureLayerRect"); resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f); drawTextureLayer(layer, rect); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); } else { EVENT_LOGD("composeHardwareLayerRect"); const Rect& texCoords = layer->texCoords; resetDrawTextureTexCoords(texCoords.left, texCoords.top, texCoords.right, texCoords.bottom); Loading Loading @@ -1012,10 +1039,6 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap) GL_TRIANGLE_STRIP, gMeshCount, swap, swap || simpleTransform); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); } else { resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f); drawTextureLayer(layer, rect); resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); } } Loading Loading @@ -1115,6 +1138,7 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { return; } EVENT_LOGD("composeLayerRegion"); // standard Region based draw size_t count; const android::Rect* rects; Loading Loading @@ -1288,6 +1312,7 @@ void OpenGLRenderer::clearLayerRegions() { if (count == 0) return; if (!currentSnapshot()->isIgnored()) { EVENT_LOGD("clearLayerRegions"); // Doing several glScissor/glClear here can negatively impact // GPUs with a tiler architecture, instead we draw quads with // the Clear blending mode Loading Loading @@ -1465,6 +1490,8 @@ void OpenGLRenderer::attachStencilBufferToLayer(Layer* layer) { void OpenGLRenderer::setStencilFromClip() { if (!mCaches.debugOverdraw) { if (!currentSnapshot()->clipRegion->isEmpty()) { EVENT_LOGD("setStencilFromClip - enabling"); // NOTE: The order here is important, we must set dirtyClip to false // before any draw call to avoid calling back into this method mDirtyClip = false; Loading Loading @@ -1510,6 +1537,7 @@ void OpenGLRenderer::setStencilFromClip() { drawRegionRects(*(currentSnapshot()->clipRegion), paint); } } else { EVENT_LOGD("setStencilFromClip - disabling"); mCaches.stencil.disable(); } } Loading Loading @@ -1561,17 +1589,24 @@ void OpenGLRenderer::debugClip() { // Drawing commands /////////////////////////////////////////////////////////////////////////////// void OpenGLRenderer::setupDraw(bool clear) { void OpenGLRenderer::setupDraw(bool clearLayer) { // TODO: It would be best if we could do this before quickRejectSetupScissor() // changes the scissor test state if (clear) clearLayerRegions(); if (clearLayer) clearLayerRegions(); // Make sure setScissor & setStencil happen at the beginning of // this method if (mDirtyClip) { if (mCaches.scissorEnabled) { setScissorFromClip(); } if (clearLayer) { setStencilFromClip(); } else { // While clearing layer, force disable stencil buffer, since // it's invalid to stencil-clip *during* the layer clear mCaches.stencil.disable(); } } mDescription.reset(); Loading Loading @@ -2964,6 +2999,9 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y) { return DrawGlInfo::kStatusDone; } EVENT_LOGD("drawLayer," RECT_STRING ", clipRequired %d", x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight(), clipRequired); updateLayer(layer, true); mCaches.setScissorEnabled(mScissorOptimizationDisabled || clipRequired); Loading
libs/hwui/OpenGLRenderer.h +5 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,11 @@ public: */ void eventMark(const char* name) const; /** * Inserts a formatted event marker in the stream of GL commands. */ void eventMarkDEBUG(const char *fmt, ...) const; /** * Inserts a named group marker in the stream of GL commands. This marker * can be used by tools to group commands into logical groups. A call to Loading
libs/hwui/Rect.h +1 −1 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ namespace android { namespace uirenderer { #define RECT_STRING "%7.2f %7.2f %7.2f %7.2f" #define RECT_STRING "%5.2f %5.2f %5.2f %5.2f" #define RECT_ARGS(r) \ (r).left, (r).top, (r).right, (r).bottom #define SK_RECT_ARGS(r) \ Loading
libs/hwui/StatefulBaseRenderer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,7 @@ bool StatefulBaseRenderer::clipPath(const SkPath* path, SkRegion::Op op) { SkRegion region; region.setPath(transformed, clip); // region is the transformed input path, masked by the previous clip mDirtyClip |= mSnapshot->clipRegionTransformed(region, op); return !mSnapshot->clipRect->isEmpty(); } Loading