diff options
author | Andrii Chepurnyi <andrii_chepurnyi@epam.com> | 2018-03-20 19:41:18 +0200 |
---|---|---|
committer | Andrii Chepurnyi <andrii_chepurnyi@epam.com> | 2018-05-17 19:24:04 +0300 |
commit | dc1278c078b1035e86085f568f2e8ff103d478a0 (patch) | |
tree | f29029ebbda1fd9f1515827ee27da30f4d345a10 | |
parent | 10d90f512891256b24cbe0f0145961b1819f6018 (diff) |
drm_hwcomposer: Use GraphicBufferMapper for copy buffer handle
Due to gralloc0/gralloc1 API incompatibility(register/unregister
vs retain/release) it is preferred to use generic
GraphicBufferMapper API for copy buffer handle. It will use
an appropriate adapter for the present version of gralloc.
For the reference: hardware/interfaces/graphics/mapper
Change-Id: Ia4740ed3b2ffd43fa3c107eb22d792eaabd4df40
Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
-rw-r--r-- | drmhwcomposer.h | 12 | ||||
-rw-r--r-- | drmhwctwo.cpp | 2 | ||||
-rw-r--r-- | hwcutils.cpp | 61 |
3 files changed, 19 insertions, 56 deletions
diff --git a/drmhwcomposer.h b/drmhwcomposer.h index cd631b2..1723fcb 100644 --- a/drmhwcomposer.h +++ b/drmhwcomposer.h @@ -81,13 +81,10 @@ class DrmHwcNativeHandle { public: DrmHwcNativeHandle() = default; - DrmHwcNativeHandle(const gralloc_module_t *gralloc, native_handle_t *handle) - : gralloc_(gralloc), handle_(handle) { + DrmHwcNativeHandle(native_handle_t *handle) : handle_(handle) { } DrmHwcNativeHandle(DrmHwcNativeHandle &&rhs) { - gralloc_ = rhs.gralloc_; - rhs.gralloc_ = NULL; handle_ = rhs.handle_; rhs.handle_ = NULL; } @@ -96,14 +93,12 @@ class DrmHwcNativeHandle { DrmHwcNativeHandle &operator=(DrmHwcNativeHandle &&rhs) { Clear(); - gralloc_ = rhs.gralloc_; - rhs.gralloc_ = NULL; handle_ = rhs.handle_; rhs.handle_ = NULL; return *this; } - int CopyBufferHandle(buffer_handle_t handle, const gralloc_module_t *gralloc); + int CopyBufferHandle(buffer_handle_t handle); void Clear(); @@ -112,7 +107,6 @@ class DrmHwcNativeHandle { } private: - const gralloc_module_t *gralloc_ = NULL; native_handle_t *handle_ = NULL; }; @@ -148,7 +142,7 @@ struct DrmHwcLayer { UniqueFd acquire_fence; OutputFd release_fence; - int ImportBuffer(Importer *importer, const gralloc_module_t *gralloc); + int ImportBuffer(Importer *importer); void SetTransform(int32_t sf_transform); void SetSourceCrop(hwc_frect_t const &crop); diff --git a/drmhwctwo.cpp b/drmhwctwo.cpp index 1940964..7ca3e62 100644 --- a/drmhwctwo.cpp +++ b/drmhwctwo.cpp @@ -514,7 +514,7 @@ HWC2::Error DrmHwcTwo::HwcDisplay::PresentDisplay(int32_t *retire_fence) { for (std::pair<const uint32_t, DrmHwcTwo::HwcLayer *> &l : z_map) { DrmHwcLayer layer; l.second->PopulateDrmLayer(&layer); - int ret = layer.ImportBuffer(importer_.get(), gralloc_); + int ret = layer.ImportBuffer(importer_.get()); if (ret) { ALOGE("Failed to import layer, ret=%d", ret); return HWC2::Error::NoResources; diff --git a/hwcutils.cpp b/hwcutils.cpp index c1685c7..7ba382a 100644 --- a/hwcutils.cpp +++ b/hwcutils.cpp @@ -21,6 +21,7 @@ #include "platform.h" #include <log/log.h> +#include <ui/GraphicBufferMapper.h> namespace android { @@ -58,51 +59,18 @@ int DrmHwcBuffer::ImportBuffer(buffer_handle_t handle, Importer *importer) { return 0; } -static native_handle_t *dup_buffer_handle(buffer_handle_t handle) { - native_handle_t *new_handle = - native_handle_create(handle->numFds, handle->numInts); - if (new_handle == NULL) - return NULL; - - const int *old_data = handle->data; - int *new_data = new_handle->data; - for (int i = 0; i < handle->numFds; i++) { - *new_data = dup(*old_data); - old_data++; - new_data++; - } - memcpy(new_data, old_data, sizeof(int) * handle->numInts); - - return new_handle; -} - -static void free_buffer_handle(native_handle_t *handle) { - int ret = native_handle_close(handle); - if (ret) - ALOGE("Failed to close native handle %d", ret); - ret = native_handle_delete(handle); - if (ret) - ALOGE("Failed to delete native handle %d", ret); -} - -int DrmHwcNativeHandle::CopyBufferHandle(buffer_handle_t handle, - const gralloc_module_t *gralloc) { - native_handle_t *handle_copy = dup_buffer_handle(handle); - if (handle_copy == NULL) { - ALOGE("Failed to duplicate handle"); - return -ENOMEM; - } - - int ret = gralloc->registerBuffer(gralloc, handle_copy); +int DrmHwcNativeHandle::CopyBufferHandle(buffer_handle_t handle) { + native_handle_t *handle_copy; + GraphicBufferMapper &gm(GraphicBufferMapper::get()); + int ret = + gm.importBuffer(handle, const_cast<buffer_handle_t *>(&handle_copy)); if (ret) { - ALOGE("Failed to register buffer handle %d", ret); - free_buffer_handle(handle_copy); + ALOGE("Failed to import buffer handle %d", ret); return ret; } Clear(); - gralloc_ = gralloc; handle_ = handle_copy; return 0; @@ -113,21 +81,22 @@ DrmHwcNativeHandle::~DrmHwcNativeHandle() { } void DrmHwcNativeHandle::Clear() { - if (gralloc_ != NULL && handle_ != NULL) { - gralloc_->unregisterBuffer(gralloc_, handle_); - free_buffer_handle(handle_); - gralloc_ = NULL; + if (handle_ != NULL) { + GraphicBufferMapper &gm(GraphicBufferMapper::get()); + int ret = gm.freeBuffer(handle_); + if (ret) { + ALOGE("Failed to free buffer handle %d", ret); + } handle_ = NULL; } } -int DrmHwcLayer::ImportBuffer(Importer *importer, - const gralloc_module_t *gralloc) { +int DrmHwcLayer::ImportBuffer(Importer *importer) { int ret = buffer.ImportBuffer(sf_handle, importer); if (ret) return ret; - ret = handle.CopyBufferHandle(sf_handle, gralloc); + ret = handle.CopyBufferHandle(sf_handle); if (ret) return ret; |