OSDN Git Service

Fix ownership of ImportedBuffer in NativeSurface.
authorKalyan Kondapally <kalyan.kondapally@intel.com>
Fri, 28 Apr 2017 04:01:07 +0000 (21:01 -0700)
committerKalyan Kondapally <kalyan.kondapally@intel.com>
Fri, 28 Apr 2017 09:32:40 +0000 (02:32 -0700)
OverlayLayer takes ownership of the buffer when ImportedBuffer
assigned to a particular layer. However, we where still tracking
ImportedBuffer in NativeSurface and deleting it. This caused
double deletion issues.

Jira:IAHWC-70
Tests: Linux test multiplelayersnovideo_powermode doesn't crash.
Signed-off-by: Kalyan Kondapally <kalyan.kondapally@intel.com>
common/compositor/nativesurface.cpp
common/compositor/nativesurface.h

index 837caa7..02fd8ce 100644 (file)
@@ -35,8 +35,7 @@ NativeSurface::NativeSurface(uint32_t width, uint32_t height)
 NativeSurface::~NativeSurface() {
   // Ensure we close any framebuffers before
   // releasing buffer.
-  if (layer_.GetBuffer())
-    layer_.GetBuffer()->ReleaseFrameBuffer();
+  buffer_.release();
 
   if (buffer_handler_ && native_handle_) {
     buffer_handler_->DestroyBuffer(native_handle_);
@@ -98,12 +97,13 @@ void NativeSurface::InitializeLayer(OverlayBufferManager *buffer_manager,
   buffer_.reset(new OverlayBuffer());
   buffer_->InitializeFromNativeHandle(native_handle,
                                       buffer_manager->GetNativeBufferHandler());
-  imported_buffer_.reset(new ImportedBuffer(buffer_.get(), buffer_manager, -1));
+  ImportedBuffer* imported_buffer_ = new ImportedBuffer(buffer_.get(), buffer_manager, -1);
+  imported_buffer_->owned_buffer_ = false;
   width_ = buffer_->GetWidth();
   height_ = buffer_->GetHeight();
   layer_.SetBlending(HWCBlending::kBlendingPremult);
   layer_.SetTransform(0);
-  layer_.SetBuffer(imported_buffer_.get());
+  layer_.SetBuffer(imported_buffer_);
 }
 
 }  // namespace hwcomposer
index bfd02e0..2a6fbbd 100644 (file)
@@ -83,7 +83,6 @@ class NativeSurface {
   bool in_use_;
   uint32_t framebuffer_format_;
   NativeFence fd_;
-  std::unique_ptr<ImportedBuffer> imported_buffer_;
   std::unique_ptr<OverlayBuffer> buffer_;
 };