frontend/va: Use get_resources in VaDeriveImage for media only devices without get_surfaces support

Reviewed-by: Thong Thai <thong.thai@amd.com>
Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27997>
This commit is contained in:
Sil Vilerino
2024-03-05 12:25:06 -05:00
committed by Marge Bot
parent bf6a415841
commit 0cd023bf6a

View File

@@ -227,7 +227,7 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
VAImage *img; VAImage *img;
VAStatus status; VAStatus status;
struct pipe_screen *screen; struct pipe_screen *screen;
struct pipe_surface **surfaces; struct pipe_resource *buf_resources[VL_NUM_COMPONENTS];
struct pipe_video_buffer *new_buffer = NULL; struct pipe_video_buffer *new_buffer = NULL;
int w; int w;
int h; int h;
@@ -283,8 +283,10 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
return VA_STATUS_ERROR_OPERATION_FAILED; return VA_STATUS_ERROR_OPERATION_FAILED;
} }
surfaces = surf->buffer->get_surfaces(surf->buffer); memset(buf_resources, 0, sizeof(buf_resources));
if (!surfaces || !surfaces[0]->texture) surf->buffer->get_resources(surf->buffer, buf_resources);
if (!buf_resources[0])
return VA_STATUS_ERROR_ALLOCATION_FAILED; return VA_STATUS_ERROR_ALLOCATION_FAILED;
img = CALLOC(1, sizeof(VAImage)); img = CALLOC(1, sizeof(VAImage));
@@ -311,7 +313,7 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
mtx_lock(&drv->mutex); mtx_lock(&drv->mutex);
if (screen->resource_get_info) { if (screen->resource_get_info) {
screen->resource_get_info(screen, surfaces[0]->texture, &stride, screen->resource_get_info(screen, buf_resources[0], &stride,
&offset); &offset);
if (!stride) if (!stride)
offset = 0; offset = 0;
@@ -344,14 +346,14 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
/* In some gallium platforms, the stride and offset are different*/ /* In some gallium platforms, the stride and offset are different*/
/* for the Y and UV planes, query them independently.*/ /* for the Y and UV planes, query them independently.*/
if (screen->resource_get_info) { if (screen->resource_get_info) {
/* resource_get_info is called above for surfaces[0]->texture and */ /* resource_get_info is called above for buf_resources[0] and */
/* saved results in stride, offset, reuse those values to avoid a new call to: */ /* saved results in stride, offset, reuse those values to avoid a new call to: */
/* screen->resource_get_info(screen, surfaces[0]->texture, &img->pitches[0],*/ /* screen->resource_get_info(screen, buf_resources[0], &img->pitches[0],*/
/* &img->offsets[0]);*/ /* &img->offsets[0]);*/
img->pitches[0] = stride; img->pitches[0] = stride;
img->offsets[0] = offset; img->offsets[0] = offset;
screen->resource_get_info(screen, surfaces[1]->texture, &img->pitches[1], screen->resource_get_info(screen, buf_resources[1], &img->pitches[1],
&img->offsets[1]); &img->offsets[1]);
if (!img->pitches[1]) if (!img->pitches[1])
img->offsets[1] = 0; img->offsets[1] = 0;
@@ -383,14 +385,15 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
VL_COMPOSITOR_WEAVE); VL_COMPOSITOR_WEAVE);
/* recalculate the values now that we have a new surface */ /* recalculate the values now that we have a new surface */
surfaces = surf->buffer->get_surfaces(new_buffer); memset(buf_resources, 0, sizeof(buf_resources));
new_buffer->get_resources(new_buffer, buf_resources);
if (screen->resource_get_info) { if (screen->resource_get_info) {
screen->resource_get_info(screen, surfaces[0]->texture, &img->pitches[0], screen->resource_get_info(screen, buf_resources[0], &img->pitches[0],
&img->offsets[0]); &img->offsets[0]);
if (!img->pitches[0]) if (!img->pitches[0])
img->offsets[0] = 0; img->offsets[0] = 0;
screen->resource_get_info(screen, surfaces[1]->texture, &img->pitches[1], screen->resource_get_info(screen, buf_resources[1], &img->pitches[1],
&img->offsets[1]); &img->offsets[1]);
if (!img->pitches[1]) if (!img->pitches[1])
img->offsets[1] = 0; img->offsets[1] = 0;
@@ -432,7 +435,7 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image)
img_buf->size = img->data_size; img_buf->size = img->data_size;
img_buf->num_elements = 1; img_buf->num_elements = 1;
pipe_resource_reference(&img_buf->derived_surface.resource, surfaces[0]->texture); pipe_resource_reference(&img_buf->derived_surface.resource, buf_resources[0]);
img_buf->derived_image_buffer = new_buffer; img_buf->derived_image_buffer = new_buffer;
if (surf->ctx) if (surf->ctx)