Merge "Add VNDK AHardwareBuffer_createFromHandle"
diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp
index ed292e7..2038162 100644
--- a/libs/nativewindow/AHardwareBuffer.cpp
+++ b/libs/nativewindow/AHardwareBuffer.cpp
@@ -279,6 +279,35 @@
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 802edcc..9b06475 100644
--- a/libs/nativewindow/include/vndk/hardware_buffer.h
+++ b/libs/nativewindow/include/vndk/hardware_buffer.h
@@ -26,6 +26,28 @@
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 105d01b..fd06ec4 100644
--- a/libs/nativewindow/libnativewindow.map.txt
+++ b/libs/nativewindow/libnativewindow.map.txt
@@ -2,6 +2,7 @@
global:
AHardwareBuffer_acquire;
AHardwareBuffer_allocate;
+ AHardwareBuffer_createFromHandle; # vndk
AHardwareBuffer_describe;
AHardwareBuffer_getNativeHandle; # vndk
AHardwareBuffer_lock;