From 9266c558bf1d21ff647525ff99f7dadbca417309 Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Thu, 15 Jan 2009 16:12:10 -0800 Subject: auto import from //branches/cupcake/...@126645 --- libs/surfaceflinger/LayerBuffer.cpp | 38 ++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) (limited to 'libs/surfaceflinger/LayerBuffer.cpp') diff --git a/libs/surfaceflinger/LayerBuffer.cpp b/libs/surfaceflinger/LayerBuffer.cpp index 700e4f5e6f1b..c9cebf4c9164 100644 --- a/libs/surfaceflinger/LayerBuffer.cpp +++ b/libs/surfaceflinger/LayerBuffer.cpp @@ -95,10 +95,9 @@ void LayerBuffer::postBuffer(ssize_t offset) void LayerBuffer::unregisterBuffers() { - sp source(getSource()); + sp source(clearSource()); if (source != 0) source->unregisterBuffers(); - // XXX: clear mSource } uint32_t LayerBuffer::doTransaction(uint32_t flags) @@ -172,6 +171,14 @@ sp LayerBuffer::getSource() const { return mSource; } +sp LayerBuffer::clearSource() { + sp source; + Mutex::Autolock _l(mLock); + source = mSource; + mSource.clear(); + return source; +} + // ============================================================================ // LayerBuffer::SurfaceBuffer // ============================================================================ @@ -477,15 +484,16 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const LayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, sp* overlayRef, uint32_t w, uint32_t h, int32_t format) - : Source(layer), mVisibilityChanged(false), mOverlay(0), mOverlayHandle(0) + : Source(layer), mVisibilityChanged(false), + mOverlay(0), mOverlayHandle(0), mOverlayDevice(0) { overlay_control_device_t* overlay_dev = mLayer.mFlinger->getOverlayEngine(); - if (overlay_dev == NULL) { // overlays not supported return; } + mOverlayDevice = overlay_dev; overlay_t* overlay = overlay_dev->createOverlay(overlay_dev, w, h, format); if (overlay == NULL) { // couldn't create the overlay (no memory? no more overlays?) @@ -507,14 +515,18 @@ LayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer, // NOTE: here it's okay to acquire a reference to "this"m as long as // the reference is not released before we leave the ctor. - sp chanel = new OverlayChanel(this); + sp channel = new OverlayChannel(this); - *overlayRef = new OverlayRef(mOverlayHandle, chanel, + *overlayRef = new OverlayRef(mOverlayHandle, channel, mWidth, mHeight, mFormat, mWidthStride, mHeightStride); } LayerBuffer::OverlaySource::~OverlaySource() -{ +{ + if (mOverlay && mOverlayDevice) { + overlay_control_device_t* overlay_dev = mOverlayDevice; + overlay_dev->destroyOverlay(overlay_dev, mOverlay); + } } void LayerBuffer::OverlaySource::onTransaction(uint32_t flags) @@ -543,8 +555,7 @@ void LayerBuffer::OverlaySource::onVisibilityResolved( // we need a lock here to protect "destroy" Mutex::Autolock _l(mLock); if (mOverlay) { - overlay_control_device_t* overlay_dev = - mLayer.mFlinger->getOverlayEngine(); + overlay_control_device_t* overlay_dev = mOverlayDevice; overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h); overlay_dev->setParameter(overlay_dev, mOverlay, OVERLAY_TRANSFORM, mLayer.getOrientation()); @@ -554,12 +565,17 @@ void LayerBuffer::OverlaySource::onVisibilityResolved( } void LayerBuffer::OverlaySource::serverDestroy() +{ + mLayer.clearSource(); + destroyOverlay(); +} + +void LayerBuffer::OverlaySource::destroyOverlay() { // we need a lock here to protect "onVisibilityResolved" Mutex::Autolock _l(mLock); if (mOverlay) { - overlay_control_device_t* overlay_dev = - mLayer.mFlinger->getOverlayEngine(); + overlay_control_device_t* overlay_dev = mOverlayDevice; overlay_dev->destroyOverlay(overlay_dev, mOverlay); mOverlay = 0; } -- cgit v1.2.3-59-g8ed1b