diff options
author | John Reck <jreck@google.com> | 2014-09-05 01:06:07 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-09-05 01:06:08 +0000 |
commit | 6dad93eff6cb62aded9d07bc3381cf1cbea468b9 (patch) | |
tree | 70bdff3ab45d42d81468fc4930a02f639043d6a5 /libs/hwui | |
parent | 46edee0994354e828bd6d0bffe60b6036b8c1388 (diff) | |
parent | 443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44 (diff) | |
download | frameworks_base-6dad93eff6cb62aded9d07bc3381cf1cbea468b9.zip frameworks_base-6dad93eff6cb62aded9d07bc3381cf1cbea468b9.tar.gz frameworks_base-6dad93eff6cb62aded9d07bc3381cf1cbea468b9.tar.bz2 |
Merge "Yet more layer tracking logging" into lmp-dev
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/Layer.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/Layer.h | 1 | ||||
-rwxr-xr-x | libs/hwui/OpenGLRenderer.cpp | 6 | ||||
-rwxr-xr-x | libs/hwui/OpenGLRenderer.h | 1 | ||||
-rw-r--r-- | libs/hwui/RenderNode.cpp | 13 | ||||
-rw-r--r-- | libs/hwui/RenderNode.h | 1 | ||||
-rw-r--r-- | libs/hwui/RenderState.cpp | 13 | ||||
-rw-r--r-- | libs/hwui/RenderState.h | 10 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 3 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 4 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderThread.h | 1 |
11 files changed, 54 insertions, 0 deletions
diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp index e6bc4db..25caae3 100644 --- a/libs/hwui/Layer.cpp +++ b/libs/hwui/Layer.cpp @@ -54,6 +54,7 @@ Layer::Layer(RenderState& renderState, const uint32_t layerWidth, const uint32_t convexMask = NULL; caches.resourceCache.incrementRefcount(this); rendererLightPosDirty = true; + wasBuildLayered = false; renderState.registerLayer(this); } diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index 38c29c7..911b99880 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -306,6 +306,7 @@ public: Rect dirtyRect; bool debugDrawUpdate; bool hasDrawnSinceUpdate; + bool wasBuildLayered; private: void requireRenderer(); diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 0f36c06..dbd273d 100755 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -605,6 +605,12 @@ void OpenGLRenderer::flushLayerUpdates() { AutoFence fence; } +void OpenGLRenderer::markLayersAsBuildLayers() { + for (size_t i = 0; i < mLayerUpdates.size(); i++) { + mLayerUpdates[i]->wasBuildLayered = true; + } +} + /////////////////////////////////////////////////////////////////////////////// // State management /////////////////////////////////////////////////////////////////////////////// diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index e9ca5d9..e295b1a 100755 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -150,6 +150,7 @@ public: void cancelLayerUpdate(Layer* layer); void clearLayerUpdates(); void flushLayerUpdates(); + void markLayersAsBuildLayers(); virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint, int flags) { diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 8fb1f64..a10e70f 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -58,6 +58,19 @@ void RenderNode::outputLogBuffer(int fd) { fflush(file); } +void RenderNode::debugDumpLayers(const char* prefix) { + if (mLayer) { + ALOGD("%sNode %p (%s) has layer %p (fbo = %u, wasBuildLayered = %s)", + prefix, this, getName(), mLayer, mLayer->getFbo(), + mLayer->wasBuildLayered ? "true" : "false"); + } + if (mDisplayListData) { + for (size_t i = 0; i < mDisplayListData->children().size(); i++) { + mDisplayListData->children()[i]->mRenderNode->debugDumpLayers(prefix); + } + } +} + RenderNode::RenderNode() : mDirtyPropertyFields(0) , mNeedsDisplayListDataSync(false) diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h index d897997..f329283 100644 --- a/libs/hwui/RenderNode.h +++ b/libs/hwui/RenderNode.h @@ -102,6 +102,7 @@ public: }; ANDROID_API static void outputLogBuffer(int fd); + void debugDumpLayers(const char* prefix); ANDROID_API void setStagingDisplayList(DisplayListData* newData); diff --git a/libs/hwui/RenderState.cpp b/libs/hwui/RenderState.cpp index 9948b44..a7c5e85 100644 --- a/libs/hwui/RenderState.cpp +++ b/libs/hwui/RenderState.cpp @@ -15,6 +15,8 @@ */ #include "RenderState.h" +#include "renderthread/CanvasContext.h" + namespace android { namespace uirenderer { @@ -38,6 +40,17 @@ void RenderState::onGLContextCreated() { void RenderState::onGLContextDestroyed() { if (CC_UNLIKELY(!mActiveLayers.empty())) { mCaches->dumpMemoryUsage(); + for (std::set<renderthread::CanvasContext*>::iterator cit = mRegisteredContexts.begin(); + cit != mRegisteredContexts.end(); cit++) { + renderthread::CanvasContext* context = *cit; + ALOGD("Context: %p (root = %p)", context, context->mRootRenderNode.get()); + ALOGD(" Prefeteched layers: %zu", context->mPrefetechedLayers.size()); + for (std::set<RenderNode*>::iterator pit = context->mPrefetechedLayers.begin(); + pit != context->mPrefetechedLayers.end(); pit++) { + (*pit)->debugDumpLayers(" "); + } + context->mRootRenderNode->debugDumpLayers(" "); + } LOG_ALWAYS_FATAL("layers have survived gl context destruction"); } } diff --git a/libs/hwui/RenderState.h b/libs/hwui/RenderState.h index 3915fb5..c7ab197 100644 --- a/libs/hwui/RenderState.h +++ b/libs/hwui/RenderState.h @@ -29,6 +29,7 @@ namespace android { namespace uirenderer { namespace renderthread { +class CanvasContext; class RenderThread; } @@ -57,6 +58,14 @@ public: mActiveLayers.erase(layer); } + void registerCanvasContext(renderthread::CanvasContext* context) { + mRegisteredContexts.insert(context); + } + + void unregisterCanvasContext(renderthread::CanvasContext* context) { + mRegisteredContexts.erase(context); + } + private: friend class renderthread::RenderThread; friend class Caches; @@ -69,6 +78,7 @@ private: Caches* mCaches; std::set<const Layer*> mActiveLayers; + std::set<renderthread::CanvasContext*> mRegisteredContexts; GLsizei mViewportWidth; GLsizei mViewportHeight; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 428e426..4129a89 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -48,11 +48,13 @@ CanvasContext::CanvasContext(RenderThread& thread, bool translucent, , mHaveNewSurface(false) , mRootRenderNode(rootRenderNode) { mAnimationContext = contextFactory->createAnimationContext(mRenderThread.timeLord()); + mRenderThread.renderState().registerCanvasContext(this); } CanvasContext::~CanvasContext() { destroy(); delete mAnimationContext; + mRenderThread.renderState().unregisterCanvasContext(this); } void CanvasContext::destroy() { @@ -299,6 +301,7 @@ void CanvasContext::buildLayer(RenderNode* node) { // purposes when the frame is actually drawn node->setPropertyFieldsDirty(RenderNode::GENERIC); + mCanvas->markLayersAsBuildLayers(); mCanvas->flushLayerUpdates(); node->incStrong(0); diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 5984fd0..2460f6b 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -42,6 +42,7 @@ class DeferredLayerUpdater; class OpenGLRenderer; class Rect; class Layer; +class RenderState; namespace renderthread { @@ -95,6 +96,9 @@ public: private: friend class RegisterFrameCallbackTask; + // TODO: Replace with something better for layer & other GL object + // lifecycle tracking + friend class android::uirenderer::RenderState; void setSurface(ANativeWindow* window); void swapBuffers(); diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h index 0b91e9d..c461f3a 100644 --- a/libs/hwui/renderthread/RenderThread.h +++ b/libs/hwui/renderthread/RenderThread.h @@ -40,6 +40,7 @@ class RenderState; namespace renderthread { +class CanvasContext; class DispatchFrameCallbacks; class EglManager; class RenderProxy; |