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 <sathishkumar.sundararaju@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22388>
This commit is contained in:
Sathishkumar S
2023-03-29 02:08:14 -05:00
committed by Marge Bot
parent 23580b09a3
commit bdb7f36aa8
4 changed files with 27 additions and 1 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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: