From 43c99d3928b31e7b2b0fc25250b45fade83f8a06 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Tue, 11 Mar 2025 13:58:48 +0100 Subject: [PATCH] frontends/va: Don't filter supported formats according to config RT format This matches Intel driver. Chromium always sets RT format to YUV420 which would cause us to not report other formats as supported. Only check that the RT format is actually supported when creating config, but don't limit supported surface formats. Reviewed-by: Ruijing Dong Part-of: --- src/gallium/frontends/va/config.c | 20 +++------ src/gallium/frontends/va/surface.c | 65 +++++++++++++-------------- src/gallium/frontends/va/va_private.h | 1 - 3 files changed, 35 insertions(+), 51 deletions(-) diff --git a/src/gallium/frontends/va/config.c b/src/gallium/frontends/va/config.c index e05096b5df5..588b69bfaf2 100644 --- a/src/gallium/frontends/va/config.c +++ b/src/gallium/frontends/va/config.c @@ -640,9 +640,7 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin config->entrypoint); for (int i = 0; i < num_attribs; i++) { if (attrib_list[i].type == VAConfigAttribRTFormat) { - if (attrib_list[i].value & supported_rt_formats) { - config->rt_format = attrib_list[i].value; - } else { + if (!(attrib_list[i].value & supported_rt_formats)) { FREE(config); return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; } @@ -653,10 +651,6 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin } } - /* Default value if not specified in the input attributes. */ - if (!config->rt_format) - config->rt_format = supported_rt_formats; - mtx_lock(&drv->mutex); *config_id = handle_table_add(drv->htab, config); mtx_unlock(&drv->mutex); @@ -733,9 +727,7 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin } } if (attrib_list[i].type == VAConfigAttribRTFormat) { - if (attrib_list[i].value & supported_rt_formats) { - config->rt_format = attrib_list[i].value; - } else { + if (!(attrib_list[i].value & supported_rt_formats)) { FREE(config); return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; } @@ -756,10 +748,6 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin } } - /* Default value if not specified in the input attributes. */ - if (!config->rt_format) - config->rt_format = supported_rt_formats; - mtx_lock(&drv->mutex); *config_id = handle_table_add(drv->htab, config); mtx_unlock(&drv->mutex); @@ -836,7 +824,9 @@ vlVaQueryConfigAttributes(VADriverContextP ctx, VAConfigID config_id, VAProfile *num_attribs = 1; attrib_list[0].type = VAConfigAttribRTFormat; - attrib_list[0].value = config->rt_format; + attrib_list[0].value = get_screen_supported_va_rt_formats(drv->pipe->screen, + config->profile, + config->entrypoint); return VA_STATUS_SUCCESS; } diff --git a/src/gallium/frontends/va/surface.c b/src/gallium/frontends/va/surface.c index 27f3914d3ae..cfbc5845e36 100644 --- a/src/gallium/frontends/va/surface.c +++ b/src/gallium/frontends/va/surface.c @@ -540,49 +540,44 @@ vlVaQuerySurfaceAttributes(VADriverContextP ctx, VAConfigID config_id, i = 0; - if (config->rt_format & VA_RT_FORMAT_YUV420) { - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_NV12, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_YV12, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_IYUV, attribs, &i); - } + /* VA_RT_FORMAT_YUV420 */ + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_NV12, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_YV12, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_IYUV, attribs, &i); - if (config->rt_format & VA_RT_FORMAT_YUV420_10) { - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_P010, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_P016, attribs, &i); - } + /* VA_RT_FORMAT_YUV420_10 */ + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_P010, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_P016, attribs, &i); - if (config->rt_format & VA_RT_FORMAT_YUV420_12) - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_P012, attribs, &i); + /* VA_RT_FORMAT_YUV420_12 */ + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_P012, attribs, &i); - if (config->rt_format & VA_RT_FORMAT_YUV400) - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_Y8_400_UNORM, attribs, &i); + /* VA_RT_FORMAT_YUV400 */ + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_Y8_400_UNORM, attribs, &i); - if (config->rt_format & VA_RT_FORMAT_YUV422) { - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_UYVY, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_YUYV, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_Y8_U8_V8_440_UNORM, attribs, &i); - } + /* VA_RT_FORMAT_YUV422 */ + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_UYVY, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_YUYV, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_Y8_U8_V8_440_UNORM, attribs, &i); - if (config->rt_format & VA_RT_FORMAT_YUV444) - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_Y8_U8_V8_444_UNORM, attribs, &i); + /* VA_RT_FORMAT_YUV444 */ + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_Y8_U8_V8_444_UNORM, attribs, &i); - if (config->rt_format & VA_RT_FORMAT_RGBP) - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R8_G8_B8_UNORM, attribs, &i); + /* VA_RT_FORMAT_RGBP */ + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R8_G8_B8_UNORM, attribs, &i); - if (config->rt_format & VA_RT_FORMAT_RGB32) { - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R8G8B8A8_UNORM, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_B8G8R8A8_UNORM, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R8G8B8X8_UNORM, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_B8G8R8X8_UNORM, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_A8R8G8B8_UNORM, attribs, &i); - } + /* VA_RT_FORMAT_RGB32 */ + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R8G8B8A8_UNORM, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_B8G8R8A8_UNORM, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R8G8B8X8_UNORM, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_B8G8R8X8_UNORM, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_A8R8G8B8_UNORM, attribs, &i); - if (config->rt_format & VA_RT_FORMAT_RGB32_10) { - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R10G10B10A2_UNORM, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_B10G10R10A2_UNORM, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R10G10B10X2_UNORM, attribs, &i); - vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_B10G10R10X2_UNORM, attribs, &i); - } + /* VA_RT_FORMAT_RGB32_10 */ + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R10G10B10A2_UNORM, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_B10G10R10A2_UNORM, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_R10G10B10X2_UNORM, attribs, &i); + vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_B10G10R10X2_UNORM, attribs, &i); attribs[i].type = VASurfaceAttribMemoryType; attribs[i].value.type = VAGenericValueTypeInteger; diff --git a/src/gallium/frontends/va/va_private.h b/src/gallium/frontends/va/va_private.h index 81e04a23e0d..e1acc1843a1 100644 --- a/src/gallium/frontends/va/va_private.h +++ b/src/gallium/frontends/va/va_private.h @@ -447,7 +447,6 @@ typedef struct { enum pipe_video_profile profile; enum pipe_video_entrypoint entrypoint; enum pipe_h2645_enc_rate_control_method rc; - unsigned int rt_format; } vlVaConfig; typedef struct vlVaSurface {