diff options
author | John Reck <jreck@google.com> | 2014-04-14 11:01:57 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2014-04-14 12:44:53 -0700 |
commit | fae904d63947fe1687d1d44be29234cc3d538f24 (patch) | |
tree | 57837539a3eb84bc5f42f971a041e99db31cfd39 /libs | |
parent | db8b130a19484cb6018667905e64d42ab793654f (diff) | |
download | frameworks_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.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 13 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 2 |
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); |