Loading libs/nativewindow/AHardwareBuffer.cpp +29 −0 Original line number Diff line number Diff line Loading @@ -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<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 Loading libs/nativewindow/include/vndk/hardware_buffer.h +22 −0 Original line number Diff line number Diff line Loading @@ -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. Loading libs/nativewindow/libnativewindow.map.txt +1 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ LIBNATIVEWINDOW { global: AHardwareBuffer_acquire; AHardwareBuffer_allocate; AHardwareBuffer_createFromHandle; # vndk AHardwareBuffer_describe; AHardwareBuffer_getNativeHandle; # vndk AHardwareBuffer_lock; Loading Loading
libs/nativewindow/AHardwareBuffer.cpp +29 −0 Original line number Diff line number Diff line Loading @@ -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<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 Loading
libs/nativewindow/include/vndk/hardware_buffer.h +22 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
libs/nativewindow/libnativewindow.map.txt +1 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ LIBNATIVEWINDOW { global: AHardwareBuffer_acquire; AHardwareBuffer_allocate; AHardwareBuffer_createFromHandle; # vndk AHardwareBuffer_describe; AHardwareBuffer_getNativeHandle; # vndk AHardwareBuffer_lock; Loading