summaryrefslogtreecommitdiffstats
path: root/libs/hwui
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2014-09-05 01:06:07 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-09-05 01:06:08 +0000
commit6dad93eff6cb62aded9d07bc3381cf1cbea468b9 (patch)
tree70bdff3ab45d42d81468fc4930a02f639043d6a5 /libs/hwui
parent46edee0994354e828bd6d0bffe60b6036b8c1388 (diff)
parent443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44 (diff)
downloadframeworks_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.cpp1
-rw-r--r--libs/hwui/Layer.h1
-rwxr-xr-xlibs/hwui/OpenGLRenderer.cpp6
-rwxr-xr-xlibs/hwui/OpenGLRenderer.h1
-rw-r--r--libs/hwui/RenderNode.cpp13
-rw-r--r--libs/hwui/RenderNode.h1
-rw-r--r--libs/hwui/RenderState.cpp13
-rw-r--r--libs/hwui/RenderState.h10
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp3
-rw-r--r--libs/hwui/renderthread/CanvasContext.h4
-rw-r--r--libs/hwui/renderthread/RenderThread.h1
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;