frontends/va: add support for A2RGB10/X2RGB10/A2BGR10/X2BGR10

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30101>
This commit is contained in:
nyanmisaka
2023-07-28 00:23:36 +08:00
committed by Marge Bot
parent 433a0422d5
commit eb05111bf7
7 changed files with 83 additions and 8 deletions

View File

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

View File

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

View File

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

View File

@@ -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) {

View File

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

View File

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

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 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');