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>
main
Rob Herring 2018-02-14 17:03:56 -06:00
parent 86c62e49c8
commit 009634e493
1 changed files with 14 additions and 16 deletions

View File

@ -84,28 +84,26 @@ static inline struct gralloc_handle_t *gralloc_handle(buffer_handle_t handle)
/** /**
* Create a buffer 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 height,
int32_t format, int32_t hal_format,
int32_t usage) int32_t usage)
{ {
struct alloc_handle_t handle = { struct gralloc_handle_t *handle;
.magic = GRALLOC_HANDLE_MAGIC,
.version = GRALLOC_HANDLE_VERSION };
native_handle_t *nhandle = native_handle_create(GRALLOC_HANDLE_NUM_FDS, native_handle_t *nhandle = native_handle_create(GRALLOC_HANDLE_NUM_FDS,
GRALLOC_HANDLE_NUM_INTS); GRALLOC_HANDLE_NUM_INTS);
handle.base = *nhandle;
native_handle_delete(nhandle);
handle.width = width; if (!nhandle)
handle.height = height; return NULL;
handle.format = format;
handle.usage = usage;
handle.prime_fd = -1;
handle->data_owner = getpid(); handle = gralloc_handle(nhandle);
handle->data = bo; 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; return handle;
} }