summaryrefslogtreecommitdiff
path: root/hwcutils.cpp
diff options
context:
space:
mode:
authorAndrii Chepurnyi <andrii_chepurnyi@epam.com>2018-03-20 19:41:18 +0200
committerAndrii Chepurnyi <andrii_chepurnyi@epam.com>2018-05-17 19:24:04 +0300
commitdc1278c078b1035e86085f568f2e8ff103d478a0 (patch)
treef29029ebbda1fd9f1515827ee27da30f4d345a10 /hwcutils.cpp
parent10d90f512891256b24cbe0f0145961b1819f6018 (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>
Diffstat (limited to 'hwcutils.cpp')
-rw-r--r--hwcutils.cpp61
1 files changed, 15 insertions, 46 deletions
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;