From bdb7f36aa8ee4554550f13cf2801dd680fa849c2 Mon Sep 17 00:00:00 2001 From: Sathishkumar S Date: Wed, 29 Mar 2023 02:08:14 -0500 Subject: [PATCH] frontends/va: add support for RGBP rt_format check and enable RGBP rt_format and support VaImage creation for the RGBP/ARGB. Signed-off-by: Sathishkumar S Reviewed-by: Leo Liu Part-of: --- src/gallium/frontends/va/config.c | 5 +++++ src/gallium/frontends/va/image.c | 5 +++++ src/gallium/frontends/va/surface.c | 8 ++++++++ src/gallium/frontends/va/va_private.h | 10 +++++++++- 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/gallium/frontends/va/config.c b/src/gallium/frontends/va/config.c index cfffafbb44c..d7b31edfcad 100644 --- a/src/gallium/frontends/va/config.c +++ b/src/gallium/frontends/va/config.c @@ -165,6 +165,11 @@ 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_R8_G8_B8_UNORM, + profile, + entrypoint)) + supported_rt_formats |= VA_RT_FORMAT_RGBP; + return supported_rt_formats; } diff --git a/src/gallium/frontends/va/image.c b/src/gallium/frontends/va/image.c index fb5a38dc9f4..bd92415dac2 100644 --- a/src/gallium/frontends/va/image.c +++ b/src/gallium/frontends/va/image.c @@ -51,10 +51,13 @@ static const VAImageFormat formats[] = {VA_FOURCC('U','Y','V','Y')}, {VA_FOURCC('Y','8','0','0')}, {VA_FOURCC('4','4','4','P')}, + {VA_FOURCC('R','G','B','P')}, {.fourcc = VA_FOURCC('B','G','R','A'), .byte_order = VA_LSB_FIRST, 32, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000}, {.fourcc = VA_FOURCC('R','G','B','A'), .byte_order = VA_LSB_FIRST, 32, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000}, + {.fourcc = VA_FOURCC('A','R','G','B'), .byte_order = VA_LSB_FIRST, 32, 32, + 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000}, {.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, @@ -173,6 +176,7 @@ vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int heig case VA_FOURCC('B','G','R','A'): case VA_FOURCC('R','G','B','A'): + case VA_FOURCC('A','R','G','B'): case VA_FOURCC('B','G','R','X'): case VA_FOURCC('R','G','B','X'): img->num_planes = 1; @@ -189,6 +193,7 @@ vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int heig break; case VA_FOURCC('4','4','4', 'P'): + case VA_FOURCC('R','G','B', 'P'): img->num_planes = 3; img->offsets[0] = 0; img->offsets[1] = w * h; diff --git a/src/gallium/frontends/va/surface.c b/src/gallium/frontends/va/surface.c index 546f3a16246..fe0a1969dba 100644 --- a/src/gallium/frontends/va/surface.c +++ b/src/gallium/frontends/va/surface.c @@ -596,6 +596,13 @@ vlVaQuerySurfaceAttributes(VADriverContextP ctx, VAConfigID config_id, attribs[i].value.value.i = VA_FOURCC_444P; i++; } + if (config->rt_format & VA_RT_FORMAT_RGBP) { + attribs[i].type = VASurfaceAttribPixelFormat; + attribs[i].value.type = VAGenericValueTypeInteger; + attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE; + attribs[i].value.value.i = VA_FOURCC_RGBP; + i++; + } } attribs[i].type = VASurfaceAttribMemoryType; @@ -1117,6 +1124,7 @@ vlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format, VA_RT_FORMAT_YUV444 != format && VA_RT_FORMAT_YUV400 != format && VA_RT_FORMAT_YUV420_10BPP != format && + VA_RT_FORMAT_RGBP != format && VA_RT_FORMAT_RGB32 != format) { return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; } diff --git a/src/gallium/frontends/va/va_private.h b/src/gallium/frontends/va/va_private.h index b92d49477d5..2126447bda4 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 14 +#define VL_VA_MAX_IMAGE_FORMATS 16 #define VL_VA_ENC_GOP_COEFF 16 #define UINT_TO_PTR(x) ((void*)(uintptr_t)(x)) @@ -123,12 +123,16 @@ VaFourccToPipeFormat(unsigned format) return PIPE_FORMAT_UYVY; case VA_FOURCC('B','G','R','A'): return PIPE_FORMAT_B8G8R8A8_UNORM; + case VA_FOURCC('A','R','G','B'): + return PIPE_FORMAT_A8R8G8B8_UNORM; case VA_FOURCC('R','G','B','A'): return PIPE_FORMAT_R8G8B8A8_UNORM; case VA_FOURCC('B','G','R','X'): return PIPE_FORMAT_B8G8R8X8_UNORM; case VA_FOURCC('R','G','B','X'): return PIPE_FORMAT_R8G8B8X8_UNORM; + case VA_FOURCC('R','G','B','P'): + return PIPE_FORMAT_R8_G8_B8_UNORM; case VA_FOURCC('Y','8','0','0'): return PIPE_FORMAT_Y8_400_UNORM; case VA_FOURCC('4','4','4','P'): @@ -161,10 +165,14 @@ PipeFormatToVaFourcc(enum pipe_format p_format) return VA_FOURCC('B','G','R','A'); case PIPE_FORMAT_R8G8B8A8_UNORM: return VA_FOURCC('R','G','B','A'); + case PIPE_FORMAT_A8R8G8B8_UNORM: + return VA_FOURCC('A','R','G','B'); case PIPE_FORMAT_B8G8R8X8_UNORM: 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: + return VA_FOURCC('R','G','B','P'); case PIPE_FORMAT_Y8_400_UNORM: return VA_FOURCC('Y','8','0','0'); case PIPE_FORMAT_Y8_U8_V8_444_UNORM: