summaryrefslogtreecommitdiff
path: root/libs/nativewindow/AHardwareBuffer.cpp
diff options
context:
space:
mode:
author Jesse Hall <jessehall@google.com> 2018-06-15 15:43:39 -0700
committer android-build-merger <android-build-merger@google.com> 2018-06-15 15:43:39 -0700
commit5d51a061ead239c49e9a7fef2159adb00dddad21 (patch)
tree3eafa2bf2ec5649a1cfbffe28ec07e4023e7e73b /libs/nativewindow/AHardwareBuffer.cpp
parent6ca3519c86bc27562a75e071163364f43257fb5b (diff)
parentb01d6dc978d8bbd0868d4503b7c20024b85b2224 (diff)
Merge "Add VNDK AHardwareBuffer_createFromHandle" am: a0cef47054 am: 154a9b3799
am: b01d6dc978 Change-Id: Idf2f12ee465e00916da96b21dcd1df4cb9635eac
Diffstat (limited to 'libs/nativewindow/AHardwareBuffer.cpp')
-rw-r--r--libs/nativewindow/AHardwareBuffer.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp
index 49ffc8f221..7e26b0b587 100644
--- a/libs/nativewindow/AHardwareBuffer.cpp
+++ b/libs/nativewindow/AHardwareBuffer.cpp
@@ -286,6 +286,35 @@ const native_handle_t* AHardwareBuffer_getNativeHandle(
return gbuffer->handle;
}
+int AHardwareBuffer_createFromHandle(const AHardwareBuffer_Desc* desc,
+ const native_handle_t* handle, int32_t method,
+ AHardwareBuffer** outBuffer) {
+ static_assert(static_cast<int32_t>(AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_REGISTER) ==
+ static_cast<int32_t>(GraphicBuffer::TAKE_UNREGISTERED_HANDLE));
+ static_assert(static_cast<int32_t>(AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_CLONE) ==
+ static_cast<int32_t>(GraphicBuffer::CLONE_HANDLE));
+
+ if (!desc || !handle || !outBuffer) return BAD_VALUE;
+ if (!(method == AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_REGISTER ||
+ method == AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_CLONE))
+ return BAD_VALUE;
+ if (desc->rfu0 != 0 || desc->rfu1 != 0) return BAD_VALUE;
+ if (desc->format == AHARDWAREBUFFER_FORMAT_BLOB && desc->height != 1) return BAD_VALUE;
+
+ const int format = AHardwareBuffer_convertToPixelFormat(desc->format);
+ const uint64_t usage = AHardwareBuffer_convertToGrallocUsageBits(desc->usage);
+ const auto wrapMethod = static_cast<GraphicBuffer::HandleWrapMethod>(method);
+ sp<GraphicBuffer> gbuffer(new GraphicBuffer(handle, wrapMethod, desc->width, desc->height,
+ format, desc->layers, usage, desc->stride));
+ status_t err = gbuffer->initCheck();
+ if (err != 0 || gbuffer->handle == 0) return err;
+
+ *outBuffer = AHardwareBuffer_from_GraphicBuffer(gbuffer.get());
+ // Ensure the buffer doesn't get destroyed when the sp<> goes away.
+ AHardwareBuffer_acquire(*outBuffer);
+
+ return NO_ERROR;
+}
// ----------------------------------------------------------------------------
// Helpers implementation