From fbe5835969f7afc42e714950a298c3247eef297b Mon Sep 17 00:00:00 2001 From: Jesse Hall Date: Sat, 14 Apr 2018 11:20:59 -0700 Subject: Add VNDK AHardwareBuffer_createFromHandle Test: build Bug: 110263459 Change-Id: Ibcd7a7797970dbba877f3ac0b792358fa8387c86 --- libs/nativewindow/AHardwareBuffer.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'libs/nativewindow/AHardwareBuffer.cpp') diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp index ed292e7bae..2038162841 100644 --- a/libs/nativewindow/AHardwareBuffer.cpp +++ b/libs/nativewindow/AHardwareBuffer.cpp @@ -279,6 +279,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(AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_REGISTER) == + static_cast(GraphicBuffer::TAKE_UNREGISTERED_HANDLE)); + static_assert(static_cast(AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_CLONE) == + static_cast(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(method); + sp 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 -- cgit v1.2.3-59-g8ed1b