summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2014-04-14 11:01:57 -0700
committerJohn Reck <jreck@google.com>2014-04-14 12:44:53 -0700
commitfae904d63947fe1687d1d44be29234cc3d538f24 (patch)
tree57837539a3eb84bc5f42f971a041e99db31cfd39 /libs
parentdb8b130a19484cb6018667905e64d42ab793654f (diff)
downloadframeworks_base-fae904d63947fe1687d1d44be29234cc3d538f24.zip
frameworks_base-fae904d63947fe1687d1d44be29234cc3d538f24.tar.gz
frameworks_base-fae904d63947fe1687d1d44be29234cc3d538f24.tar.bz2
Fence on destruction
Bug: 14052927 destroyCanvasAndSurface() needs a fence as when it returns the underlying BufferQueue is going to be released from under the render thread. Change-Id: I0147a1d5ec5adf0239c761ef22f65cd8c8a137df
Diffstat (limited to 'libs')
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp4
-rw-r--r--libs/hwui/renderthread/CanvasContext.h2
-rw-r--r--libs/hwui/renderthread/RenderProxy.cpp13
-rw-r--r--libs/hwui/renderthread/RenderProxy.h2
4 files changed, 12 insertions, 9 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 3638184..65fed44 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -318,10 +318,10 @@ CanvasContext::CanvasContext(bool translucent)
}
CanvasContext::~CanvasContext() {
- destroyCanvas();
+ destroyCanvasAndSurface();
}
-void CanvasContext::destroyCanvas() {
+void CanvasContext::destroyCanvasAndSurface() {
if (mCanvas) {
delete mCanvas;
mCanvas = 0;
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index dcb5957..8d1a00a 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -56,7 +56,7 @@ public:
void setup(int width, int height);
void processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters, bool* hasFunctors);
void drawDisplayList(RenderNode* displayList, Rect* dirty);
- void destroyCanvas();
+ void destroyCanvasAndSurface();
bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index b233ae9..ce490f1 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -140,15 +140,18 @@ void RenderProxy::drawDisplayList(RenderNode* displayList,
mDrawFrameTask.drawFrame(&mRenderThread);
}
-CREATE_BRIDGE1(destroyCanvas, CanvasContext* context) {
- args->context->destroyCanvas();
+CREATE_BRIDGE1(destroyCanvasAndSurface, CanvasContext* context) {
+ args->context->destroyCanvasAndSurface();
return NULL;
}
-void RenderProxy::destroyCanvas() {
- SETUP_TASK(destroyCanvas);
+void RenderProxy::destroyCanvasAndSurface() {
+ SETUP_TASK(destroyCanvasAndSurface);
args->context = mContext;
- post(task);
+ // destroyCanvasAndSurface() needs a fence as when it returns the
+ // underlying BufferQueue is going to be released from under
+ // the render thread.
+ postAndWait(task);
}
CREATE_BRIDGE2(invokeFunctor, CanvasContext* context, Functor* functor) {
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index 3eb8ed8..a112493 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -65,7 +65,7 @@ public:
ANDROID_API void setup(int width, int height);
ANDROID_API void drawDisplayList(RenderNode* displayList,
int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom);
- ANDROID_API void destroyCanvas();
+ ANDROID_API void destroyCanvasAndSurface();
ANDROID_API void invokeFunctor(Functor* functor, bool waitForCompletion);