diff options
author | Rob Herring <robh@kernel.org> | 2018-02-14 17:03:56 -0600 |
---|---|---|
committer | Rob Herring <robh@kernel.org> | 2018-02-20 14:16:16 -0600 |
commit | 009634e493097afae95d190fc26cb04a1664648a (patch) | |
tree | 8e5468b77042927212373bcd45abcb458fc5e90a | |
parent | 86c62e49c81eb56200ec72936462a9a8629d7d1d (diff) | |
download | libdrm-009634e493097afae95d190fc26cb04a1664648a.tar.gz libdrm-009634e493097afae95d190fc26cb04a1664648a.tar.bz2 libdrm-009634e493097afae95d190fc26cb04a1664648a.zip |
android: fix gralloc_handle_create() problems
There's a number of problems with gralloc_handle_create starting with it
doesn't even compile. More importantly, it doesn't really create (i.e.
allocate) a handle. It allocates a native_handle_t, copies it to a
struct gralloc_handle_t on the stack and returns the struct (not a ptr).
So the caller still has to allocate a struct gralloc_handle_t to hold
the returned struct.
Rework gralloc_handle_create() to allocate a new handle and return the
pointer to the allocated handle. Callers should free the handle with
native_handle_close() and native_handle_delete(). In the interest of
making gralloc_handle_t opaque, return a native_handle_t ptr instead.
Reviewed-by: Robert Foss <robert.foss@collabora.com>
Signed-off-by: Rob Herring <robh@kernel.org>
-rw-r--r-- | android/gralloc_handle.h | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/android/gralloc_handle.h b/android/gralloc_handle.h index 43255ba5..9cb5a5d7 100644 --- a/android/gralloc_handle.h +++ b/android/gralloc_handle.h @@ -84,28 +84,26 @@ static inline struct gralloc_handle_t *gralloc_handle(buffer_handle_t handle) /** * Create a buffer handle. */ -static struct gralloc_handle_t gralloc_handle_create(int32_t width, +static inline native_handle_t *gralloc_handle_create(int32_t width, int32_t height, - int32_t format, + int32_t hal_format, int32_t usage) { - struct alloc_handle_t handle = { - .magic = GRALLOC_HANDLE_MAGIC, - .version = GRALLOC_HANDLE_VERSION }; - + struct gralloc_handle_t *handle; native_handle_t *nhandle = native_handle_create(GRALLOC_HANDLE_NUM_FDS, - GRALLOC_HANDLE_NUM_INTS); - handle.base = *nhandle; - native_handle_delete(nhandle); - - handle.width = width; - handle.height = height; - handle.format = format; - handle.usage = usage; - handle.prime_fd = -1; - - handle->data_owner = getpid(); - handle->data = bo; + GRALLOC_HANDLE_NUM_INTS); + + if (!nhandle) + return NULL; + + handle = gralloc_handle(nhandle); + handle->magic = GRALLOC_HANDLE_MAGIC; + handle->version = GRALLOC_HANDLE_VERSION; + handle->width = width; + handle->height = height; + handle->format = hal_format; + handle->usage = usage; + handle->prime_fd = -1; return handle; } |