From c6833dd1875e4ff209bee51808e781da4b423238 Mon Sep 17 00:00:00 2001 From: Kalyan Kondapally Date: Sun, 18 Jun 2017 18:59:01 -0700 Subject: [PATCH] Remove OverlayBufferManager. OverlayBuffer lifetime is owned by OverlayLayer. Overlaylayer now manager the lifetime of buffer and releases it. Jira: None. Test: No regressions on Android. Signed-off-by: Kalyan Kondapally --- Android.mk | 1 - Makefile.sources | 1 - common/compositor/compositor.cpp | 4 +- common/compositor/compositor.h | 4 +- common/compositor/nativesurface.cpp | 25 ++---- common/compositor/nativesurface.h | 8 +- common/compositor/renderstate.cpp | 1 + common/core/gpudevice.cpp | 15 ++-- common/core/overlaybuffer.h | 3 +- common/core/overlaybuffermanager.cpp | 138 --------------------------------- common/core/overlaybuffermanager.h | 108 -------------------------- common/core/overlaylayer.cpp | 29 +++++-- common/core/overlaylayer.h | 23 ++++-- common/display/display.cpp | 4 +- common/display/display.h | 4 +- common/display/displayplanemanager.cpp | 6 +- common/display/displayplanemanager.h | 8 +- common/display/displayqueue.cpp | 19 ++--- common/display/displayqueue.h | 6 +- common/display/headless.cpp | 2 +- common/display/headless.h | 2 +- common/display/virtualdisplay.cpp | 14 ++-- common/display/virtualdisplay.h | 6 +- public/nativedisplay.h | 4 +- 24 files changed, 94 insertions(+), 341 deletions(-) delete mode 100644 common/core/overlaybuffermanager.cpp delete mode 100644 common/core/overlaybuffermanager.h diff --git a/Android.mk b/Android.mk index 326af58..62c9825 100644 --- a/Android.mk +++ b/Android.mk @@ -50,7 +50,6 @@ LOCAL_SRC_FILES := \ common/core/hwclayer.cpp \ common/core/gpudevice.cpp \ common/core/overlaybuffer.cpp \ - common/core/overlaybuffermanager.cpp \ common/core/overlaylayer.cpp \ common/display/display.cpp \ common/display/displayplane.cpp \ diff --git a/Makefile.sources b/Makefile.sources index fec26de..5cbdaf6 100644 --- a/Makefile.sources +++ b/Makefile.sources @@ -6,7 +6,6 @@ common_SOURCES = \ common/core/gpudevice.cpp \ common/core/hwclayer.cpp \ common/core/overlaybuffer.cpp \ - common/core/overlaybuffermanager.cpp \ common/core/overlaylayer.cpp \ common/display/display.cpp \ common/display/displayqueue.cpp \ diff --git a/common/compositor/compositor.cpp b/common/compositor/compositor.cpp index fc39c1a..813a58f 100644 --- a/common/compositor/compositor.cpp +++ b/common/compositor/compositor.cpp @@ -113,7 +113,7 @@ bool Compositor::Draw(DisplayPlaneStateList &comp_planes, bool Compositor::DrawOffscreen(std::vector &layers, const std::vector> &display_frame, const std::vector &source_layers, - OverlayBufferManager *buffer_manager, + NativeBufferHandler *buffer_handler, uint32_t width, uint32_t height, HWCNativeHandle output_handle, int32_t *retire_fence) { @@ -143,7 +143,7 @@ bool Compositor::DrawOffscreen(std::vector &layers, } std::unique_ptr surface(CreateBackBuffer(width, height)); - surface->InitializeForOffScreenRendering(buffer_manager, output_handle); + surface->InitializeForOffScreenRendering(buffer_handler, output_handle); if (!Render(layers, surface.get(), comp_regions)) return false; diff --git a/common/compositor/compositor.h b/common/compositor/compositor.h index b321786..e498ae3 100644 --- a/common/compositor/compositor.h +++ b/common/compositor/compositor.h @@ -28,7 +28,7 @@ namespace hwcomposer { -class OverlayBufferManager; +class NativeBufferHandler; struct OverlayLayer; class Compositor { @@ -47,7 +47,7 @@ class Compositor { bool DrawOffscreen(std::vector &layers, const std::vector> &display_frame, const std::vector &source_layers, - OverlayBufferManager *buffer_manager, uint32_t width, + NativeBufferHandler *buffer_handler, uint32_t width, uint32_t height, HWCNativeHandle output_handle, int32_t *retire_fence); void InsertFence(uint64_t fence); diff --git a/common/compositor/nativesurface.cpp b/common/compositor/nativesurface.cpp index 61a8be4..c1a252e 100644 --- a/common/compositor/nativesurface.cpp +++ b/common/compositor/nativesurface.cpp @@ -19,7 +19,6 @@ #include "displayplane.h" #include "hwctrace.h" #include "nativebufferhandler.h" -#include "overlaybuffermanager.h" namespace hwcomposer { @@ -35,29 +34,29 @@ NativeSurface::NativeSurface(uint32_t width, uint32_t height) NativeSurface::~NativeSurface() { // Ensure we close any framebuffers before // releasing buffer. - buffer_.reset(nullptr); + layer_.ResetBuffer(); if (native_handle_) { buffer_handler_->DestroyHandle(native_handle_); } } -bool NativeSurface::Init(OverlayBufferManager *buffer_manager) { - buffer_handler_ = buffer_manager->GetNativeBufferHandler(); +bool NativeSurface::Init(NativeBufferHandler *buffer_handler) { + buffer_handler_ = buffer_handler; buffer_handler_->CreateBuffer(width_, height_, 0, &native_handle_); if (!native_handle_) { ETRACE("NativeSurface: Failed to create buffer."); return false; } - InitializeLayer(buffer_manager, native_handle_); + InitializeLayer(buffer_handler, native_handle_); return true; } bool NativeSurface::InitializeForOffScreenRendering( - OverlayBufferManager *buffer_manager, HWCNativeHandle native_handle) { - InitializeLayer(buffer_manager, native_handle); + NativeBufferHandler *buffer_handler, HWCNativeHandle native_handle) { + InitializeLayer(buffer_handler, native_handle); layer_.SetSourceCrop(HwcRect(0, 0, width_, height_)); layer_.SetDisplayFrame(HwcRect(0, 0, width_, height_)); @@ -92,19 +91,11 @@ void NativeSurface::SetPlaneTarget(DisplayPlaneState &plane, uint32_t gpu_fd) { layer_.GetBuffer()->CreateFrameBuffer(gpu_fd); } -void NativeSurface::InitializeLayer(OverlayBufferManager *buffer_manager, +void NativeSurface::InitializeLayer(NativeBufferHandler *buffer_handler, HWCNativeHandle native_handle) { - buffer_.reset(new OverlayBuffer()); - buffer_->InitializeFromNativeHandle(native_handle, - buffer_manager->GetNativeBufferHandler()); - ImportedBuffer *imported_buffer_ = - new ImportedBuffer(buffer_.get(), buffer_manager); - imported_buffer_->owned_buffer_ = false; - width_ = buffer_->GetWidth(); - height_ = buffer_->GetHeight(); layer_.SetBlending(HWCBlending::kBlendingPremult); layer_.SetTransform(0); - layer_.SetBuffer(imported_buffer_, -1); + layer_.SetBuffer(buffer_handler, native_handle, -1); } } // namespace hwcomposer diff --git a/common/compositor/nativesurface.h b/common/compositor/nativesurface.h index 2dcc6c6..261d081 100644 --- a/common/compositor/nativesurface.h +++ b/common/compositor/nativesurface.h @@ -26,7 +26,6 @@ namespace hwcomposer { class NativeBufferHandler; -class OverlayBufferManager; class NativeSurface { public: @@ -37,9 +36,9 @@ class NativeSurface { virtual ~NativeSurface(); - bool Init(OverlayBufferManager* buffer_manager); + bool Init(NativeBufferHandler* buffer_handler); - bool InitializeForOffScreenRendering(OverlayBufferManager* buffer_manager, + bool InitializeForOffScreenRendering(NativeBufferHandler* buffer_handler, HWCNativeHandle native_handle); virtual bool MakeCurrent() = 0; @@ -70,7 +69,7 @@ class NativeSurface { OverlayLayer layer_; private: - void InitializeLayer(OverlayBufferManager* buffer_manager, + void InitializeLayer(NativeBufferHandler* buffer_handler, HWCNativeHandle native_handle); HWCNativeHandle native_handle_; NativeBufferHandler* buffer_handler_; @@ -78,7 +77,6 @@ class NativeSurface { uint32_t height_; bool in_use_; uint32_t framebuffer_format_; - std::unique_ptr buffer_; }; } // namespace hwcomposer diff --git a/common/compositor/renderstate.cpp b/common/compositor/renderstate.cpp index 88381de..06ba36f 100644 --- a/common/compositor/renderstate.cpp +++ b/common/compositor/renderstate.cpp @@ -18,6 +18,7 @@ #include "compositionregion.h" #include "nativegpuresource.h" +#include "overlaybuffer.h" #include "overlaylayer.h" namespace hwcomposer { diff --git a/common/core/gpudevice.cpp b/common/core/gpudevice.cpp index 7a98df5..afe64c9 100644 --- a/common/core/gpudevice.cpp +++ b/common/core/gpudevice.cpp @@ -37,12 +37,13 @@ #include #include +#include + #include "display.h" #include "displayplanemanager.h" #include "drmscopedtypes.h" #include "headless.h" #include "hwcthread.h" -#include "overlaybuffermanager.h" #include "spinlock.h" #include "vblankeventhandler.h" #include "virtualdisplay.h" @@ -78,7 +79,7 @@ class GpuDevice::DisplayManager : public HWCThread { std::vector> displays_; std::vector connected_displays_; std::shared_ptr callback_ = NULL; - std::unique_ptr buffer_manager_; + std::unique_ptr buffer_handler_; int fd_ = -1; int hotplug_fd_; SpinLock spin_lock_; @@ -102,9 +103,9 @@ bool GpuDevice::DisplayManager::Init(uint32_t fd) { return false; } - buffer_manager_.reset(new OverlayBufferManager()); - if (!buffer_manager_->Initialize(fd_)) { - ETRACE("Failed to Initialize Buffer Manager."); + buffer_handler_.reset(NativeBufferHandler::CreateInstance(fd_)); + if (!buffer_handler_) { + ETRACE("Failed to create native buffer handler instance"); return false; } @@ -118,7 +119,7 @@ bool GpuDevice::DisplayManager::Init(uint32_t fd) { } std::unique_ptr display(new Display(fd_, i, c->crtc_id)); - if (!display->Initialize(buffer_manager_.get())) { + if (!display->Initialize(buffer_handler_.get())) { ETRACE("Failed to Initialize Display %d", c->crtc_id); return false; } @@ -126,7 +127,7 @@ bool GpuDevice::DisplayManager::Init(uint32_t fd) { displays_.emplace_back(std::move(display)); } - virtual_display_.reset(new VirtualDisplay(fd_, buffer_manager_.get(), 0, 0)); + virtual_display_.reset(new VirtualDisplay(fd_, buffer_handler_.get(), 0, 0)); if (!UpdateDisplayState()) { ETRACE("Failed to connect display."); diff --git a/common/core/overlaybuffer.h b/common/core/overlaybuffer.h index 7203238..daf9389 100644 --- a/common/core/overlaybuffer.h +++ b/common/core/overlaybuffer.h @@ -78,8 +78,7 @@ class OverlayBuffer { protected: OverlayBuffer() = default; - friend class OverlayBufferManager; - friend class NativeSurface; + friend struct OverlayLayer; private: uint32_t width_ = 0; diff --git a/common/core/overlaybuffermanager.cpp b/common/core/overlaybuffermanager.cpp deleted file mode 100644 index ab45d75..0000000 --- a/common/core/overlaybuffermanager.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* -// Copyright (c) 2017 Intel Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -*/ - -#include "overlaybuffermanager.h" - -#include "hwctrace.h" -#include "overlaylayer.h" - -namespace hwcomposer { - -ImportedBuffer::~ImportedBuffer() { - if (owned_buffer_) - buffer_manager_->UnRegisterBuffer(buffer_); - - if (acquire_fence_ > 0) { - close(acquire_fence_); - } -} - -OverlayBufferManager::~OverlayBufferManager() { -} - -bool OverlayBufferManager::Initialize(uint32_t gpu_fd) { - buffer_handler_.reset(NativeBufferHandler::CreateInstance(gpu_fd)); - if (!buffer_handler_) { - ETRACE("Failed to create native buffer handler instance"); - return false; - } - - return true; -} - -ImportedBuffer* OverlayBufferManager::CreateBuffer(const HwcBuffer& bo) { - buffers_.emplace_back(); - Buffer& buffer = buffers_.back(); - buffer.buffer_.reset(new OverlayBuffer()); - buffer.buffer_->Initialize(bo); - buffer.ref_count_ = 1; - - return new ImportedBuffer(buffer.buffer_.get(), this); -} - -ImportedBuffer* OverlayBufferManager::CreateBufferFromNativeHandle( - HWCNativeHandle handle) { - buffers_.emplace_back(); - Buffer& buffer = buffers_.back(); - buffer.buffer_.reset(new OverlayBuffer()); - buffer.buffer_->InitializeFromNativeHandle(handle, buffer_handler_.get()); - buffer.ref_count_ = 1; - - return new ImportedBuffer(buffer.buffer_.get(), this); -} - -void OverlayBufferManager::RegisterBuffer(const OverlayBuffer* const buffer) { - for (Buffer& overlay_buffer : buffers_) { - if (overlay_buffer.buffer_.get() != buffer) - continue; - - overlay_buffer.ref_count_++; - break; - } -} - -void OverlayBufferManager::RegisterBuffers( - const std::vector& buffers) { - for (const OverlayBuffer* const buffer : buffers) { - for (Buffer& overlay_buffer : buffers_) { - if (overlay_buffer.buffer_.get() != buffer) - continue; - - overlay_buffer.ref_count_++; - break; - } - } -} - -void OverlayBufferManager::UnRegisterBuffer(const OverlayBuffer* const buffer) { - int32_t index = -1; - for (Buffer& overlay_buffer : buffers_) { - index++; - if (overlay_buffer.buffer_.get() != buffer) - continue; - - overlay_buffer.ref_count_--; - if (overlay_buffer.ref_count_ > 0) { - index = -1; - } - - break; - } - - if (index >= 0 && index < buffers_.size()) { - buffers_.erase(buffers_.begin() + index); - } -} - -void OverlayBufferManager::UnRegisterLayerBuffers( - std::vector& layers) { - CTRACE(); - for (OverlayLayer& layer : layers) { - const OverlayBuffer* const buffer = layer.GetBuffer(); - if (!buffer) - continue; - int32_t index = -1; - for (Buffer& overlay_buffer : buffers_) { - index++; - if (overlay_buffer.buffer_.get() != buffer) - continue; - - overlay_buffer.ref_count_--; - layer.ReleaseBuffer(); - if (overlay_buffer.ref_count_ > 0) { - index = -1; - } - - break; - } - - if (index >= 0 && index < buffers_.size()) { - buffers_.erase(buffers_.begin() + index); - } - } -} - -} // namespace hwcomposer diff --git a/common/core/overlaybuffermanager.h b/common/core/overlaybuffermanager.h deleted file mode 100644 index 3827da7..0000000 --- a/common/core/overlaybuffermanager.h +++ /dev/null @@ -1,108 +0,0 @@ -/* -// Copyright (c) 2017 Intel Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -*/ -#ifndef COMMON_CORE_OVERLAYBUFFERMANAGER_H_ -#define COMMON_CORE_OVERLAYBUFFERMANAGER_H_ - -#include - -#include - -#include -#include - -#include "overlaybuffer.h" - -namespace hwcomposer { - -class NativeBufferHandler; -class OverlayBufferManager; -struct OverlayLayer; - -struct ImportedBuffer { - public: - ImportedBuffer(OverlayBuffer* const buffer, - OverlayBufferManager* buffer_manager) - : buffer_(buffer), buffer_manager_(buffer_manager) { - } - - ~ImportedBuffer(); - - OverlayBuffer* const buffer_; - bool owned_buffer_ = true; - int32_t acquire_fence_ = -1; - - private: - OverlayBufferManager* buffer_manager_; -}; - -class OverlayBufferManager { - public: - OverlayBufferManager() = default; - OverlayBufferManager(OverlayBufferManager&& rhs) = default; - OverlayBufferManager& operator=(OverlayBufferManager&& other) = default; - - ~OverlayBufferManager(); - - bool Initialize(uint32_t gpu_fd); - - // Creates new ImportedBuffer for bo. Also, creates - // a sync fence object associated for this buffer. - // Sync fence is automatically signalled when buffer - // is destroyed. RefCount of buffer is initialized to - // 1. - ImportedBuffer* CreateBuffer(const HwcBuffer& bo); - - // Creates new ImportedBuffer for handle. Also, creates - // a sync fence object associated for this buffer. - // Sync fence is automatically signalled when buffer - // is destroyed. RefCount of buffer is initialized to - // 1. - ImportedBuffer* CreateBufferFromNativeHandle(HWCNativeHandle handle); - - // Increments RefCount of buffer by 1. Buffer will not be released - // or associated fence object signalled until UnRegisterBuffer - // is called and RefCount decreases to zero. - void RegisterBuffer(const OverlayBuffer* const buffer); - - // Decreases RefCount of buffer by 1. Buffer will be released - // and associated fence object will be signalled if RefCount - // is equal to zero. - void UnRegisterBuffer(const OverlayBuffer* const buffer); - - // Convenient function to call together RegisterBuffer for - // OverlayBuffers. - void RegisterBuffers(const std::vector& buffers); - - // Convenient function to call together UnRegisterBuffers for - // layers. - void UnRegisterLayerBuffers(std::vector& layers); - - NativeBufferHandler* GetNativeBufferHandler() const { - return buffer_handler_.get(); - } - - private: - struct Buffer { - std::unique_ptr buffer_; - uint32_t ref_count_ = 0; - }; - - std::vector buffers_; - std::unique_ptr buffer_handler_; -}; - -} // namespace hwcomposer -#endif // COMMON_CORE_OVERLAYBUFFERMANAGER_H_ diff --git a/common/core/overlaylayer.cpp b/common/core/overlaylayer.cpp index 095e2c3..9ee56eb 100644 --- a/common/core/overlaylayer.cpp +++ b/common/core/overlaylayer.cpp @@ -22,9 +22,22 @@ #include "hwcutils.h" #include +#include namespace hwcomposer { +OverlayLayer::ImportedBuffer::~ImportedBuffer() { + if (acquire_fence_ > 0) { + close(acquire_fence_); + } +} + +OverlayLayer::ImportedBuffer::ImportedBuffer(OverlayBuffer* buffer, + int32_t acquire_fence) + : acquire_fence_(acquire_fence) { + buffer_.reset(buffer); +} + void OverlayLayer::SetAcquireFence(int32_t acquire_fence) { // Release any existing fence. if (imported_buffer_->acquire_fence_ > 0) { @@ -40,16 +53,18 @@ int32_t OverlayLayer::GetAcquireFence() const { } OverlayBuffer* OverlayLayer::GetBuffer() const { - return imported_buffer_->buffer_; + return imported_buffer_->buffer_.get(); } -void OverlayLayer::SetBuffer(ImportedBuffer* buffer, int32_t acquire_fence) { - imported_buffer_.reset(buffer); - imported_buffer_->acquire_fence_ = acquire_fence; +void OverlayLayer::SetBuffer(NativeBufferHandler* buffer_handler, + HWCNativeHandle handle, int32_t acquire_fence) { + OverlayBuffer* buffer = new OverlayBuffer(); + buffer->InitializeFromNativeHandle(handle, buffer_handler); + imported_buffer_.reset(new ImportedBuffer(buffer, acquire_fence)); } -void OverlayLayer::ReleaseBuffer() { - imported_buffer_->owned_buffer_ = false; +void OverlayLayer::ResetBuffer() { + imported_buffer_.reset(nullptr); } void OverlayLayer::SetIndex(uint32_t index) { @@ -97,7 +112,7 @@ void OverlayLayer::SetDisplayFrame(const HwcRect& display_frame) { void OverlayLayer::ValidatePreviousFrameState(const OverlayLayer& rhs, HwcLayer* layer) { - OverlayBuffer* buffer = imported_buffer_->buffer_; + OverlayBuffer* buffer = imported_buffer_->buffer_.get(); if (!prefer_separate_plane_) prefer_separate_plane_ = rhs.prefer_separate_plane_; diff --git a/common/core/overlaylayer.h b/common/core/overlaylayer.h index 91deb18..db6e768 100644 --- a/common/core/overlaylayer.h +++ b/common/core/overlaylayer.h @@ -22,11 +22,13 @@ #include -#include "overlaybuffermanager.h" +#include "overlaybuffer.h" namespace hwcomposer { struct HwcLayer; +class OverlayBuffer; +class NativeBufferHandler; struct OverlayLayer { void SetAcquireFence(int32_t acquire_fence); @@ -63,13 +65,9 @@ struct OverlayLayer { OverlayBuffer* GetBuffer() const; - void SetBuffer(ImportedBuffer* buffer, int32_t acquire_fence); - - // Only KMSFenceEventHandler should use this. - // KMSFenceEventHandler will call this API when - // the buffer associated with this layer is no - // longer owned by this layer. - void ReleaseBuffer(); + void SetBuffer(NativeBufferHandler* buffer_handler, HWCNativeHandle handle, + int32_t acquire_fence); + void ResetBuffer(); void SetSourceCrop(const HwcRect& source_crop); const HwcRect& GetSourceCrop() const { @@ -146,6 +144,15 @@ struct OverlayLayer { kLayerAcquireFenceSignalled = 1 << 3 }; + struct ImportedBuffer { + public: + ImportedBuffer(OverlayBuffer* buffer, int32_t acquire_fence); + ~ImportedBuffer(); + + std::unique_ptr buffer_; + int32_t acquire_fence_ = -1; + }; + uint32_t transform_; uint32_t rotation_; uint32_t index_; diff --git a/common/display/display.cpp b/common/display/display.cpp index 1ac9f77..bbcfce3 100644 --- a/common/display/display.cpp +++ b/common/display/display.cpp @@ -48,8 +48,8 @@ Display::~Display() { display_queue_->SetPowerMode(kOff); } -bool Display::Initialize(OverlayBufferManager *buffer_manager) { - display_queue_.reset(new DisplayQueue(gpu_fd_, crtc_id_, buffer_manager)); +bool Display::Initialize(NativeBufferHandler *buffer_handler) { + display_queue_.reset(new DisplayQueue(gpu_fd_, crtc_id_, buffer_handler)); return true; } diff --git a/common/display/display.h b/common/display/display.h index 8af452c..c03de6a 100644 --- a/common/display/display.h +++ b/common/display/display.h @@ -33,7 +33,7 @@ namespace hwcomposer { class DisplayPlaneState; class DisplayPlaneManager; class DisplayQueue; -class OverlayBufferManager; +class NativeBufferHandler; class GpuDevice; struct HwcLayer; @@ -42,7 +42,7 @@ class Display : public NativeDisplay { Display(uint32_t gpu_fd, uint32_t pipe_id, uint32_t crtc_id); ~Display() override; - bool Initialize(OverlayBufferManager *buffer_manager) override; + bool Initialize(NativeBufferHandler *buffer_handler) override; DisplayType Type() const override { return DisplayType::kInternal; diff --git a/common/display/displayplanemanager.cpp b/common/display/displayplanemanager.cpp index 202ece2..1360610 100644 --- a/common/display/displayplanemanager.cpp +++ b/common/display/displayplanemanager.cpp @@ -30,8 +30,8 @@ namespace hwcomposer { DisplayPlaneManager::DisplayPlaneManager(int gpu_fd, uint32_t crtc_id, - OverlayBufferManager *buffer_manager) - : buffer_manager_(buffer_manager), + NativeBufferHandler *buffer_handler) + : buffer_handler_(buffer_handler), width_(0), height_(0), crtc_id_(crtc_id), @@ -350,7 +350,7 @@ void DisplayPlaneManager::EnsureOffScreenTarget(DisplayPlaneState &plane) { if (!surface) { NativeSurface *new_surface = CreateBackBuffer(width_, height_); - new_surface->Init(buffer_manager_); + new_surface->Init(buffer_handler_); surfaces_.emplace_back(std::move(new_surface)); surface = surfaces_.back().get(); } diff --git a/common/display/displayplanemanager.h b/common/display/displayplanemanager.h index dc9bfcc..6a8f7aa 100644 --- a/common/display/displayplanemanager.h +++ b/common/display/displayplanemanager.h @@ -34,13 +34,13 @@ namespace hwcomposer { class DisplayPlane; class DisplayPlaneState; class GpuDevice; -class OverlayBufferManager; +class NativeBufferHandler; struct OverlayLayer; class DisplayPlaneManager { public: DisplayPlaneManager(int gpu_fd, uint32_t crtc_id, - OverlayBufferManager *buffer_manager); + NativeBufferHandler *buffer_handler); virtual ~DisplayPlaneManager(); @@ -79,9 +79,9 @@ class DisplayPlaneManager { const std::vector &commit_planes) const; void ValidateFinalLayers(DisplayPlaneStateList &list, - std::vector &layers); + std::vector &layers); - OverlayBufferManager *buffer_manager_; + NativeBufferHandler *buffer_handler_; std::vector> surfaces_; std::unique_ptr primary_plane_; std::unique_ptr cursor_plane_; diff --git a/common/display/displayqueue.cpp b/common/display/displayqueue.cpp index 71b1845..eabd76d 100644 --- a/common/display/displayqueue.cpp +++ b/common/display/displayqueue.cpp @@ -32,7 +32,7 @@ namespace hwcomposer { DisplayQueue::DisplayQueue(uint32_t gpu_fd, uint32_t crtc_id, - OverlayBufferManager* buffer_manager) + NativeBufferHandler* buffer_handler) : frame_(0), dpms_prop_(0), out_fence_ptr_prop_(0), @@ -49,7 +49,7 @@ DisplayQueue::DisplayQueue(uint32_t gpu_fd, uint32_t crtc_id, broadcastrgb_id_(0), broadcastrgb_full_(-1), broadcastrgb_automatic_(-1), - buffer_manager_(buffer_manager) { + buffer_handler_(buffer_handler) { compositor_.Init(); ScopedDrmObjectPropertyPtr crtc_props( drmModeObjectGetProperties(gpu_fd_, crtc_id_, DRM_MODE_OBJECT_CRTC)); @@ -62,7 +62,7 @@ DisplayQueue::DisplayQueue(uint32_t gpu_fd, uint32_t crtc_id, memset(&mode_, 0, sizeof(mode_)); display_plane_manager_.reset( - new DisplayPlaneManager(gpu_fd_, crtc_id_, buffer_manager_)); + new DisplayPlaneManager(gpu_fd_, crtc_id_, buffer_handler_)); vblank_handler_.reset(new VblankEventHandler(this)); @@ -295,10 +295,8 @@ bool DisplayQueue::QueueUpdate(std::vector& source_layers, overlay_layer.SetDisplayFrame(layer->GetDisplayFrame()); overlay_layer.SetIndex(layer_index); layers_rects.emplace_back(layer->GetDisplayFrame()); - ImportedBuffer* buffer = - buffer_manager_->CreateBufferFromNativeHandle(layer->GetNativeHandle()); - overlay_layer.SetBuffer(buffer, layer->GetAcquireFence()); - + overlay_layer.SetBuffer(buffer_handler_, layer->GetNativeHandle(), + layer->GetAcquireFence()); overlay_layer.ValidateForOverlayUsage(); if (frame_changed) { @@ -428,7 +426,6 @@ bool DisplayQueue::QueueUpdate(std::vector& source_layers, surface->SetInUse(false); } - buffer_manager_->UnRegisterLayerBuffers(previous_layers_); previous_layers_.swap(in_flight_layers_); in_flight_layers_.swap(layers); previous_plane_state_.swap(current_composition_planes); @@ -476,12 +473,6 @@ void DisplayQueue::HandleExit() { DRM_MODE_DPMS_OFF); compositor_.Reset(); vblank_handler_->SetPowerMode(kOff); - if (previous_layers_.size()) - buffer_manager_->UnRegisterLayerBuffers(previous_layers_); - - if (in_flight_layers_.size()) - buffer_manager_->UnRegisterLayerBuffers(in_flight_layers_); - std::vector().swap(previous_layers_); std::vector().swap(in_flight_layers_); previous_plane_state_.clear(); diff --git a/common/display/displayqueue.h b/common/display/displayqueue.h index 6fed137..bda56b8 100644 --- a/common/display/displayqueue.h +++ b/common/display/displayqueue.h @@ -42,12 +42,12 @@ struct gamma_colors { class DisplayPlaneManager; struct HwcLayer; -class OverlayBufferManager; +class NativeBufferHandler; class DisplayQueue { public: DisplayQueue(uint32_t gpu_fd, uint32_t crtc_id, - OverlayBufferManager* buffer_manager); + NativeBufferHandler* buffer_handler); ~DisplayQueue(); bool Initialize(float refresh, uint32_t width, uint32_t height, uint32_t pipe, @@ -199,7 +199,7 @@ class DisplayQueue { std::vector in_flight_layers_; std::vector previous_layers_; DisplayPlaneStateList previous_plane_state_; - OverlayBufferManager* buffer_manager_; + NativeBufferHandler* buffer_handler_; std::vector in_flight_surfaces_; std::vector previous_surfaces_; FrameStateTracker idle_tracker_; diff --git a/common/display/headless.cpp b/common/display/headless.cpp index 8892ce7..d065e62 100644 --- a/common/display/headless.cpp +++ b/common/display/headless.cpp @@ -31,7 +31,7 @@ Headless::Headless(uint32_t gpu_fd, uint32_t /*pipe_id*/, uint32_t /*crtc_id*/) Headless::~Headless() { } -bool Headless::Initialize(OverlayBufferManager * /*buffer_manager*/) { +bool Headless::Initialize(NativeBufferHandler * /*buffer_manager*/) { return true; } diff --git a/common/display/headless.h b/common/display/headless.h index 0dc32c1..6209ea5 100644 --- a/common/display/headless.h +++ b/common/display/headless.h @@ -29,7 +29,7 @@ class Headless : public NativeDisplay { Headless(uint32_t gpu_fd, uint32_t pipe_id, uint32_t crtc_id); ~Headless() override; - bool Initialize(OverlayBufferManager *buffer_manager) override; + bool Initialize(NativeBufferHandler *buffer_handler) override; DisplayType Type() const override { return DisplayType::kHeadless; diff --git a/common/display/virtualdisplay.cpp b/common/display/virtualdisplay.cpp index e616565..c8dd219 100644 --- a/common/display/virtualdisplay.cpp +++ b/common/display/virtualdisplay.cpp @@ -19,11 +19,11 @@ #include #include +#include #include #include "hwctrace.h" -#include "overlaybuffermanager.h" #include "overlaylayer.h" #include "hwcutils.h" @@ -31,12 +31,12 @@ namespace hwcomposer { VirtualDisplay::VirtualDisplay(uint32_t gpu_fd, - OverlayBufferManager *buffer_manager, + NativeBufferHandler *buffer_handler, uint32_t pipe_id, uint32_t crtc_id) : Headless(gpu_fd, pipe_id, crtc_id), output_handle_(0), acquire_fence_(-1), - buffer_manager_(buffer_manager), + buffer_handler_(buffer_handler), width_(0), height_(0) { } @@ -87,10 +87,8 @@ bool VirtualDisplay::Present(std::vector &source_layers, overlay_layer.SetIndex(layer_index); layers_rects.emplace_back(layer->GetDisplayFrame()); index.emplace_back(layer_index); - ImportedBuffer *buffer = - buffer_manager_->CreateBufferFromNativeHandle(layer->GetNativeHandle()); - - overlay_layer.SetBuffer(buffer, layer->GetAcquireFence()); + overlay_layer.SetBuffer(buffer_handler_, layer->GetNativeHandle(), + layer->GetAcquireFence()); } if (acquire_fence_ > 0) { @@ -105,7 +103,7 @@ bool VirtualDisplay::Present(std::vector &source_layers, } // Prepare for final composition. - if (!compositor_.DrawOffscreen(layers, layers_rects, index, buffer_manager_, + if (!compositor_.DrawOffscreen(layers, layers_rects, index, buffer_handler_, width_, height_, output_handle_, retire_fence)) { ETRACE("Failed to prepare for the frame composition ret=%d", ret); diff --git a/common/display/virtualdisplay.h b/common/display/virtualdisplay.h index 1627dff..d4b6dce 100644 --- a/common/display/virtualdisplay.h +++ b/common/display/virtualdisplay.h @@ -25,11 +25,11 @@ namespace hwcomposer { struct HwcLayer; -class OverlayBufferManager; +class NativeBufferHandler; class VirtualDisplay : public Headless { public: - VirtualDisplay(uint32_t gpu_fd, OverlayBufferManager *buffer_manager, + VirtualDisplay(uint32_t gpu_fd, NativeBufferHandler *buffer_handler, uint32_t pipe_id, uint32_t crtc_id); ~VirtualDisplay() override; @@ -47,7 +47,7 @@ class VirtualDisplay : public Headless { private: HWCNativeHandle output_handle_; int32_t acquire_fence_ = -1; - OverlayBufferManager *buffer_manager_; + NativeBufferHandler *buffer_handler_; Compositor compositor_; uint32_t width_; uint32_t height_; diff --git a/public/nativedisplay.h b/public/nativedisplay.h index 7816677..2a57846 100644 --- a/public/nativedisplay.h +++ b/public/nativedisplay.h @@ -31,7 +31,7 @@ typedef struct _drmModeModeInfo drmModeModeInfo; namespace hwcomposer { struct HwcLayer; class GpuDevice; -class OverlayBufferManager; +class NativeBufferHandler; class VsyncCallback { public: @@ -52,7 +52,7 @@ class NativeDisplay { virtual ~NativeDisplay() { } - virtual bool Initialize(OverlayBufferManager *buffer_manager) = 0; + virtual bool Initialize(NativeBufferHandler *buffer_handler) = 0; virtual DisplayType Type() const = 0; -- 2.11.0