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:
@@ -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:
|
||||
|
@@ -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))
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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) {
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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:
|
||||
|
@@ -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');
|
||||
|
Reference in New Issue
Block a user