diff options
-rw-r--r-- | libs/nativewindow/AHardwareBuffer.cpp | 29 | ||||
-rw-r--r-- | libs/nativewindow/include/vndk/hardware_buffer.h | 22 | ||||
-rw-r--r-- | libs/nativewindow/libnativewindow.map.txt | 1 |
3 files changed, 52 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 diff --git a/libs/nativewindow/include/vndk/hardware_buffer.h b/libs/nativewindow/include/vndk/hardware_buffer.h index 7a4b31f513..6c9ec3498e 100644 --- a/libs/nativewindow/include/vndk/hardware_buffer.h +++ b/libs/nativewindow/include/vndk/hardware_buffer.h @@ -26,6 +26,28 @@ __BEGIN_DECLS const native_handle_t* AHardwareBuffer_getNativeHandle(const AHardwareBuffer* buffer); +enum CreateFromHandleMethod { + // enum values chosen to match internal GraphicBuffer::HandleWrapMethod + AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_REGISTER = 2, + AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_CLONE = 3, +}; + +/** + * Create a AHardwareBuffer from a native handle. + * + * This function wraps a native handle in a AHardwareBuffer suitable for use by applications or + * other parts of the system. The contents of desc will be returned by AHardwareBuffer_describe(). + * + * If method is AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_REGISTER, the handle is assumed to be + * unregistered, and it will be registered/imported before being wrapped in the AHardwareBuffer. + * If successful, the AHardwareBuffer will own the handle. + * + * If method is AHARDWAREBUFFER_CREATE_FROM_HANDLE_METHOD_CLONE, the handle will be cloned and the + * clone registered. The AHardwareBuffer will own the cloned handle but not the original. + */ +int AHardwareBuffer_createFromHandle(const AHardwareBuffer_Desc* desc, + const native_handle_t* handle, int32_t method, + AHardwareBuffer** outBuffer); /** * Buffer pixel formats. diff --git a/libs/nativewindow/libnativewindow.map.txt b/libs/nativewindow/libnativewindow.map.txt index d2ba971458..753954d97a 100644 --- a/libs/nativewindow/libnativewindow.map.txt +++ b/libs/nativewindow/libnativewindow.map.txt @@ -2,6 +2,7 @@ LIBNATIVEWINDOW { global: AHardwareBuffer_acquire; AHardwareBuffer_allocate; + AHardwareBuffer_createFromHandle; # vndk AHardwareBuffer_describe; AHardwareBuffer_getNativeHandle; # vndk AHardwareBuffer_lock; |