From eb05111bf78be3aee0f6da4a1ae976431429c4cd Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Fri, 28 Jul 2023 00:23:36 +0800 Subject: [PATCH] frontends/va: add support for A2RGB10/X2RGB10/A2BGR10/X2BGR10 Signed-off-by: nyanmisaka Reviewed-by: Ruijing Dong Part-of: --- src/gallium/auxiliary/vl/vl_video_buffer.c | 4 ++++ src/gallium/frontends/va/config.c | 15 +++++++++++++++ src/gallium/frontends/va/image.c | 22 ++++++++++++++++++++-- src/gallium/frontends/va/picture.c | 4 ++++ src/gallium/frontends/va/postproc.c | 6 +++++- src/gallium/frontends/va/surface.c | 20 +++++++++++++++++--- src/gallium/frontends/va/va_private.h | 20 ++++++++++++++++++-- 7 files changed, 83 insertions(+), 8 deletions(-) diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c index 33b0f19dbbd..3c395fdb227 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.c +++ b/src/gallium/auxiliary/vl/vl_video_buffer.c @@ -84,6 +84,10 @@ vl_video_buffer_plane_order(enum pipe_format format) case PIPE_FORMAT_R8G8B8X8_UNORM: case PIPE_FORMAT_B8G8R8A8_UNORM: case PIPE_FORMAT_B8G8R8X8_UNORM: + case PIPE_FORMAT_R10G10B10A2_UNORM: + case PIPE_FORMAT_R10G10B10X2_UNORM: + case PIPE_FORMAT_B10G10R10A2_UNORM: + case PIPE_FORMAT_B10G10R10X2_UNORM: case PIPE_FORMAT_YUYV: case PIPE_FORMAT_UYVY: case PIPE_FORMAT_P010: diff --git a/src/gallium/frontends/va/config.c b/src/gallium/frontends/va/config.c index f27a36b2c3f..23edc5af6bc 100644 --- a/src/gallium/frontends/va/config.c +++ b/src/gallium/frontends/va/config.c @@ -172,6 +172,21 @@ static unsigned int get_screen_supported_va_rt_formats(struct pipe_screen *pscre profile, entrypoint)) supported_rt_formats |= VA_RT_FORMAT_RGB32; + + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R10G10B10A2_UNORM, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_B10G10R10A2_UNORM, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R10G10B10X2_UNORM, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_B10G10R10X2_UNORM, + profile, + entrypoint)) + supported_rt_formats |= VA_RT_FORMAT_RGB32_10; + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8_G8_B8_UNORM, profile, entrypoint)) diff --git a/src/gallium/frontends/va/image.c b/src/gallium/frontends/va/image.c index 5e2c90f7f7c..777283d4aac 100644 --- a/src/gallium/frontends/va/image.c +++ b/src/gallium/frontends/va/image.c @@ -62,7 +62,15 @@ static const VAImageFormat formats[] = {.fourcc = VA_FOURCC('B','G','R','X'), .byte_order = VA_LSB_FIRST, 32, 24, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000}, {.fourcc = VA_FOURCC('R','G','B','X'), .byte_order = VA_LSB_FIRST, 32, 24, - 0x000000ff, 0x0000ff00, 0x00ff0000, 0x00000000} + 0x000000ff, 0x0000ff00, 0x00ff0000, 0x00000000}, + {.fourcc = VA_FOURCC('A','R','3','0'), .byte_order = VA_LSB_FIRST, 32, 30, + 0x3ff00000, 0x000ffc00, 0x000003ff, 0x30000000}, + {.fourcc = VA_FOURCC('A','B','3','0'), .byte_order = VA_LSB_FIRST, 32, 30, + 0x000003ff, 0x000ffc00, 0x3ff00000, 0x30000000}, + {.fourcc = VA_FOURCC('X','R','3','0'), .byte_order = VA_LSB_FIRST, 32, 30, + 0x3ff00000, 0x000ffc00, 0x000003ff, 0x00000000}, + {.fourcc = VA_FOURCC('X','B','3','0'), .byte_order = VA_LSB_FIRST, 32, 30, + 0x000003ff, 0x000ffc00, 0x3ff00000, 0x00000000}, }; static void @@ -180,6 +188,10 @@ vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int heig case VA_FOURCC('A','R','G','B'): case VA_FOURCC('B','G','R','X'): case VA_FOURCC('R','G','B','X'): + case VA_FOURCC('A','R','3','0'): + case VA_FOURCC('A','B','3','0'): + case VA_FOURCC('X','R','3','0'): + case VA_FOURCC('X','B','3','0'): img->num_planes = 1; img->pitches[0] = w * 4; img->offsets[0] = 0; @@ -347,6 +359,10 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image) case VA_FOURCC('R','G','B','A'): case VA_FOURCC('B','G','R','X'): case VA_FOURCC('R','G','B','X'): + case VA_FOURCC('A','R','3','0'): + case VA_FOURCC('A','B','3','0'): + case VA_FOURCC('X','R','3','0'): + case VA_FOURCC('X','B','3','0'): img->pitches[0] = stride > 0 ? stride : w * 4; assert(img->pitches[0] >= (w * 4)); img->data_size = img->pitches[0] * h; @@ -701,7 +717,9 @@ vlVaPutImage(VADriverContextP ctx, VASurfaceID surface, VAImageID image, surf->templat.buffer_format = format; if (format == PIPE_FORMAT_YUYV || format == PIPE_FORMAT_UYVY || format == PIPE_FORMAT_B8G8R8A8_UNORM || format == PIPE_FORMAT_B8G8R8X8_UNORM || - format == PIPE_FORMAT_R8G8B8A8_UNORM || format == PIPE_FORMAT_R8G8B8X8_UNORM) + format == PIPE_FORMAT_R8G8B8A8_UNORM || format == PIPE_FORMAT_R8G8B8X8_UNORM || + format == PIPE_FORMAT_B10G10R10A2_UNORM || format == PIPE_FORMAT_B10G10R10X2_UNORM || + format == PIPE_FORMAT_R10G10B10A2_UNORM || format == PIPE_FORMAT_R10G10B10X2_UNORM) surf->templat.interlaced = false; tmp_buf = drv->pipe->create_video_buffer(drv->pipe, &surf->templat); diff --git a/src/gallium/frontends/va/picture.c b/src/gallium/frontends/va/picture.c index a67a49b3527..f816b7fb922 100644 --- a/src/gallium/frontends/va/picture.c +++ b/src/gallium/frontends/va/picture.c @@ -115,6 +115,10 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID context_id, VASurfaceID rende context->target->buffer_format != PIPE_FORMAT_R8G8B8A8_UNORM && context->target->buffer_format != PIPE_FORMAT_B8G8R8X8_UNORM && context->target->buffer_format != PIPE_FORMAT_R8G8B8X8_UNORM && + context->target->buffer_format != PIPE_FORMAT_B10G10R10A2_UNORM && + context->target->buffer_format != PIPE_FORMAT_R10G10B10A2_UNORM && + context->target->buffer_format != PIPE_FORMAT_B10G10R10X2_UNORM && + context->target->buffer_format != PIPE_FORMAT_R10G10B10X2_UNORM && context->target->buffer_format != PIPE_FORMAT_NV12 && context->target->buffer_format != PIPE_FORMAT_P010 && context->target->buffer_format != PIPE_FORMAT_P016) { diff --git a/src/gallium/frontends/va/postproc.c b/src/gallium/frontends/va/postproc.c index 47efbad8e70..fcb679cfba4 100644 --- a/src/gallium/frontends/va/postproc.c +++ b/src/gallium/frontends/va/postproc.c @@ -352,7 +352,11 @@ static VAStatus vlVaPostProcBlit(vlVaDriver *drv, vlVaContext *context, if ((src->buffer_format == PIPE_FORMAT_B8G8R8X8_UNORM || src->buffer_format == PIPE_FORMAT_B8G8R8A8_UNORM || src->buffer_format == PIPE_FORMAT_R8G8B8X8_UNORM || - src->buffer_format == PIPE_FORMAT_R8G8B8A8_UNORM) && + src->buffer_format == PIPE_FORMAT_R8G8B8A8_UNORM || + src->buffer_format == PIPE_FORMAT_B10G10R10X2_UNORM || + src->buffer_format == PIPE_FORMAT_B10G10R10A2_UNORM || + src->buffer_format == PIPE_FORMAT_R10G10B10X2_UNORM || + src->buffer_format == PIPE_FORMAT_R10G10B10A2_UNORM) && !src->interlaced) grab = true; diff --git a/src/gallium/frontends/va/surface.c b/src/gallium/frontends/va/surface.c index a46c264db72..48aeea503e3 100644 --- a/src/gallium/frontends/va/surface.c +++ b/src/gallium/frontends/va/surface.c @@ -54,7 +54,9 @@ static const enum pipe_format vpp_surface_formats[] = { PIPE_FORMAT_B8G8R8A8_UNORM, PIPE_FORMAT_R8G8B8A8_UNORM, - PIPE_FORMAT_B8G8R8X8_UNORM, PIPE_FORMAT_R8G8B8X8_UNORM + PIPE_FORMAT_B8G8R8X8_UNORM, PIPE_FORMAT_R8G8B8X8_UNORM, + PIPE_FORMAT_B10G10R10A2_UNORM, PIPE_FORMAT_R10G10B10A2_UNORM, + PIPE_FORMAT_B10G10R10X2_UNORM, PIPE_FORMAT_R10G10B10X2_UNORM }; VAStatus @@ -478,6 +480,8 @@ vlVaPutSurface(VADriverContextP ctx, VASurfaceID surface_id, void* draw, short s if (format == PIPE_FORMAT_B8G8R8A8_UNORM || format == PIPE_FORMAT_B8G8R8X8_UNORM || format == PIPE_FORMAT_R8G8B8A8_UNORM || format == PIPE_FORMAT_R8G8B8X8_UNORM || + format == PIPE_FORMAT_B10G10R10A2_UNORM || format == PIPE_FORMAT_B10G10R10X2_UNORM || + format == PIPE_FORMAT_R10G10B10A2_UNORM || format == PIPE_FORMAT_R10G10B10X2_UNORM || format == PIPE_FORMAT_L8_UNORM || format == PIPE_FORMAT_Y8_400_UNORM) { struct pipe_sampler_view **views; @@ -586,7 +590,8 @@ vlVaQuerySurfaceAttributes(VADriverContextP ctx, VAConfigID config_id, /* vlVaCreateConfig returns PIPE_VIDEO_PROFILE_UNKNOWN * only for VAEntrypointVideoProc. */ if (config->profile == PIPE_VIDEO_PROFILE_UNKNOWN) { - if (config->rt_format & VA_RT_FORMAT_RGB32) { + if (config->rt_format & VA_RT_FORMAT_RGB32 || + config->rt_format & VA_RT_FORMAT_RGB32_10) { for (j = 0; j < ARRAY_SIZE(vpp_surface_formats); ++j) { attribs[i].type = VASurfaceAttribPixelFormat; attribs[i].value.type = VAGenericValueTypeInteger; @@ -1192,7 +1197,8 @@ vlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format, VA_RT_FORMAT_YUV400 != format && VA_RT_FORMAT_YUV420_10BPP != format && VA_RT_FORMAT_RGBP != format && - VA_RT_FORMAT_RGB32 != format) { + VA_RT_FORMAT_RGB32 != format && + VA_RT_FORMAT_RGB32_10 != format) { return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; } @@ -1545,6 +1551,14 @@ static uint32_t pipe_format_to_drm_format(enum pipe_format format) return DRM_FORMAT_XRGB8888; case PIPE_FORMAT_R8G8B8X8_UNORM: return DRM_FORMAT_XBGR8888; + case PIPE_FORMAT_B10G10R10A2_UNORM: + return DRM_FORMAT_ARGB2101010; + case PIPE_FORMAT_R10G10B10A2_UNORM: + return DRM_FORMAT_ABGR2101010; + case PIPE_FORMAT_B10G10R10X2_UNORM: + return DRM_FORMAT_XRGB2101010; + case PIPE_FORMAT_R10G10B10X2_UNORM: + return DRM_FORMAT_XBGR2101010; case PIPE_FORMAT_NV12: return DRM_FORMAT_NV12; case PIPE_FORMAT_P010: diff --git a/src/gallium/frontends/va/va_private.h b/src/gallium/frontends/va/va_private.h index ffb9d6f8fc1..bebf981a05e 100644 --- a/src/gallium/frontends/va/va_private.h +++ b/src/gallium/frontends/va/va_private.h @@ -60,7 +60,7 @@ #define VL_VA_DRIVER(ctx) ((vlVaDriver *)ctx->pDriverData) #define VL_VA_PSCREEN(ctx) (VL_VA_DRIVER(ctx)->vscreen->pscreen) -#define VL_VA_MAX_IMAGE_FORMATS 17 +#define VL_VA_MAX_IMAGE_FORMATS 21 #define VL_VA_ENC_GOP_COEFF 16 #define UINT_TO_PTR(x) ((void*)(uintptr_t)(x)) @@ -134,6 +134,14 @@ VaFourccToPipeFormat(unsigned format) return PIPE_FORMAT_R8G8B8X8_UNORM; case VA_FOURCC('R','G','B','P'): return PIPE_FORMAT_R8_G8_B8_UNORM; + case VA_FOURCC('A','R','3','0'): + return PIPE_FORMAT_B10G10R10A2_UNORM; + case VA_FOURCC('A','B','3','0'): + return PIPE_FORMAT_R10G10B10A2_UNORM; + case VA_FOURCC('X','R','3','0'): + return PIPE_FORMAT_B10G10R10X2_UNORM; + case VA_FOURCC('X','B','3','0'): + return PIPE_FORMAT_R10G10B10X2_UNORM; case VA_FOURCC('Y','8','0','0'): return PIPE_FORMAT_Y8_400_UNORM; case VA_FOURCC('4','4','4','P'): @@ -174,7 +182,15 @@ PipeFormatToVaFourcc(enum pipe_format p_format) return VA_FOURCC('B','G','R','X'); case PIPE_FORMAT_R8G8B8X8_UNORM: return VA_FOURCC('R','G','B','X'); - case PIPE_FORMAT_R8_G8_B8_UNORM: + case PIPE_FORMAT_B10G10R10A2_UNORM: + return VA_FOURCC('A','R','3','0'); + case PIPE_FORMAT_R10G10B10A2_UNORM: + return VA_FOURCC('A','B','3','0'); + case PIPE_FORMAT_B10G10R10X2_UNORM: + return VA_FOURCC('X','R','3','0'); + case PIPE_FORMAT_R10G10B10X2_UNORM: + return VA_FOURCC('X','B','3','0'); + case PIPE_FORMAT_R8_G8_B8_UNORM: return VA_FOURCC('R','G','B','P'); case PIPE_FORMAT_Y8_400_UNORM: return VA_FOURCC('Y','8','0','0');