From c764527c177e4274d983e48d11315205bca46f69 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Wed, 18 Jul 2018 15:07:42 +0200 Subject: Add support for QuerySurfaceAttributes Signed-off-by: Paul Kocialkowski --- src/request.c | 1 + src/surface.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/surface.h | 4 ++++ 3 files changed, 81 insertions(+) (limited to 'src') diff --git a/src/request.c b/src/request.c index 51923b6..a36a505 100644 --- a/src/request.c +++ b/src/request.c @@ -103,6 +103,7 @@ VAStatus VA_DRIVER_INIT_FUNC(VADriverContextP context) vtable->vaRenderPicture = RequestRenderPicture; vtable->vaEndPicture = RequestEndPicture; vtable->vaSyncSurface = RequestSyncSurface; + vtable->vaQuerySurfaceAttributes = RequestQuerySurfaceAttributes; vtable->vaQuerySurfaceStatus = RequestQuerySurfaceStatus; vtable->vaPutSurface = RequestPutSurface; vtable->vaQueryImageFormats = RequestQueryImageFormats; diff --git a/src/surface.c b/src/surface.c index ffcc6b7..3d0bda6 100644 --- a/src/surface.c +++ b/src/surface.c @@ -296,6 +296,82 @@ complete: return status; } +VAStatus RequestQuerySurfaceAttributes(VADriverContextP context, + VAConfigID config, + VASurfaceAttrib *attributes, + unsigned int *attributes_count) +{ + struct request_data *driver_data = context->pDriverData; + VASurfaceAttrib *attributes_list; + unsigned int attributes_list_size = V4L2_REQUEST_MAX_CONFIG_ATTRIBUTES * + sizeof(*attributes); + int memory_types; + unsigned int i = 0; + + attributes_list = malloc(attributes_list_size); + memset(attributes_list, 0, attributes_list_size); + + attributes_list[i].type = VASurfaceAttribPixelFormat; + attributes_list[i].flags = VA_SURFACE_ATTRIB_GETTABLE; + attributes_list[i].value.type = VAGenericValueTypeInteger; + attributes_list[i].value.value.i = VA_FOURCC_NV12; + i++; + + attributes_list[i].type = VASurfaceAttribMinWidth; + attributes_list[i].flags = VA_SURFACE_ATTRIB_GETTABLE; + attributes_list[i].value.type = VAGenericValueTypeInteger; + attributes_list[i].value.value.i = 32; + i++; + + attributes_list[i].type = VASurfaceAttribMaxWidth; + attributes_list[i].flags = VA_SURFACE_ATTRIB_GETTABLE; + attributes_list[i].value.type = VAGenericValueTypeInteger; + attributes_list[i].value.value.i = 2048; + i++; + + attributes_list[i].type = VASurfaceAttribMinHeight; + attributes_list[i].flags = VA_SURFACE_ATTRIB_GETTABLE; + attributes_list[i].value.type = VAGenericValueTypeInteger; + attributes_list[i].value.value.i = 32; + i++; + + attributes_list[i].type = VASurfaceAttribMaxHeight; + attributes_list[i].flags = VA_SURFACE_ATTRIB_GETTABLE; + attributes_list[i].value.type = VAGenericValueTypeInteger; + attributes_list[i].value.value.i = 2048; + i++; + + attributes_list[i].type = VASurfaceAttribMemoryType; + attributes_list[i].flags = VA_SURFACE_ATTRIB_GETTABLE | + VA_SURFACE_ATTRIB_SETTABLE; + attributes_list[i].value.type = VAGenericValueTypeInteger; + + memory_types = VA_SURFACE_ATTRIB_MEM_TYPE_VA | + VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2; + + /* + * First version of DRM prime export does not handle modifiers, + * that are required for supporting the tiled output format. + */ + + if (!driver_data->tiled_format) + memory_types |= VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME; + + attributes_list[i].value.value.i = memory_types; + i++; + + attributes_list_size = i * sizeof(*attributes); + + if (attributes != NULL) + memcpy(attributes, attributes_list, attributes_list_size); + + free(attributes_list); + + *attributes_count = i; + + return VA_STATUS_SUCCESS; +} + VAStatus RequestQuerySurfaceStatus(VADriverContextP context, VASurfaceID surface_id, VASurfaceStatus *status) diff --git a/src/surface.h b/src/surface.h index 99717b0..c5ae2f5 100644 --- a/src/surface.h +++ b/src/surface.h @@ -87,6 +87,10 @@ VAStatus RequestCreateSurfaces(VADriverContextP context, int width, int height, VAStatus RequestDestroySurfaces(VADriverContextP context, VASurfaceID *surfaces_ids, int surfaces_count); VAStatus RequestSyncSurface(VADriverContextP context, VASurfaceID surface_id); +VAStatus RequestQuerySurfaceAttributes(VADriverContextP context, + VAConfigID config, + VASurfaceAttrib *attributes, + unsigned int *attributes_count); VAStatus RequestQuerySurfaceStatus(VADriverContextP context, VASurfaceID surface_id, VASurfaceStatus *status); -- cgit v1.2.3