diff --git a/src/gallium/frontends/va/config.c b/src/gallium/frontends/va/config.c index 23f03cde3c7..cfffafbb44c 100644 --- a/src/gallium/frontends/va/config.c +++ b/src/gallium/frontends/va/config.c @@ -109,6 +109,66 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile profile, return VA_STATUS_SUCCESS; } +static unsigned int get_screen_supported_va_rt_formats(struct pipe_screen *pscreen, + enum pipe_video_profile profile, + enum pipe_video_entrypoint entrypoint) +{ + unsigned int supported_rt_formats = 0; + + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_NV12, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YV12, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_IYUV, + profile, + entrypoint)) + supported_rt_formats |= VA_RT_FORMAT_YUV420; + + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P010, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P016, + profile, + entrypoint)) + supported_rt_formats |= VA_RT_FORMAT_YUV420_10BPP; + + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_400_UNORM, + profile, + entrypoint)) + supported_rt_formats |= VA_RT_FORMAT_YUV400; + + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_U8_V8_444_UNORM, + profile, + entrypoint)) + supported_rt_formats |= VA_RT_FORMAT_YUV444; + + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_UYVY, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YUYV, + profile, + entrypoint)) + supported_rt_formats |= VA_RT_FORMAT_YUV422; + + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UNORM, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UINT, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UNORM, + profile, + entrypoint) || + pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UINT, + profile, + entrypoint)) + supported_rt_formats |= VA_RT_FORMAT_RGB32; + + return supported_rt_formats; +} + VAStatus vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint, VAConfigAttrib *attrib_list, int num_attribs) @@ -131,39 +191,9 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint en * Different gallium drivers will have different supported formats * If modifying this, please query the driver like below */ - value = 0; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_NV12, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_BITSTREAM) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YV12, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_BITSTREAM) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_IYUV, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_BITSTREAM)) - value |= VA_RT_FORMAT_YUV420; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P010, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_BITSTREAM) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P016, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_BITSTREAM)) - value |= VA_RT_FORMAT_YUV420_10BPP; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_400_UNORM, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_BITSTREAM)) - value |= VA_RT_FORMAT_YUV400; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_U8_V8_444_UNORM, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_BITSTREAM)) - value |= VA_RT_FORMAT_YUV444; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_UYVY, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_BITSTREAM) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YUYV, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_BITSTREAM)) - value |= VA_RT_FORMAT_YUV422; + value = get_screen_supported_va_rt_formats(pscreen, + ProfileToPipe(profile), + PIPE_VIDEO_ENTRYPOINT_BITSTREAM); break; default: value = VA_ATTRIB_NOT_SUPPORTED; @@ -173,28 +203,9 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint en (vl_codec_supported(pscreen, ProfileToPipe(profile), true))) { switch (attrib_list[i].type) { case VAConfigAttribRTFormat: - /* - * Different gallium drivers will have different supported formats - * If modifying this, please query the driver like below - */ - value = 0; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_NV12, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_ENCODE) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YV12, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_ENCODE) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_IYUV, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_ENCODE)) - value |= VA_RT_FORMAT_YUV420; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P010, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_ENCODE) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P016, - ProfileToPipe(profile), - PIPE_VIDEO_ENTRYPOINT_ENCODE)) - value |= VA_RT_FORMAT_YUV420_10BPP; + value = get_screen_supported_va_rt_formats(pscreen, + ProfileToPipe(profile), + PIPE_VIDEO_ENTRYPOINT_ENCODE); break; case VAConfigAttribRateControl: value = VA_RC_CQP | VA_RC_CBR | VA_RC_VBR; @@ -373,41 +384,9 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint en } else if (entrypoint == VAEntrypointVideoProc) { switch (attrib_list[i].type) { case VAConfigAttribRTFormat: - /* - * Different gallium drivers will have different supported formats - * If modifying this, please query the driver like below - */ - value = 0; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_NV12, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YV12, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_IYUV, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING)) - value |= VA_RT_FORMAT_YUV420; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P010, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P016, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING)) - value |= VA_RT_FORMAT_YUV420_10BPP; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UNORM, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UINT, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UNORM, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UINT, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING)) - value |= VA_RT_FORMAT_RGB32; + value = get_screen_supported_va_rt_formats(pscreen, + PIPE_VIDEO_PROFILE_UNKNOWN, + PIPE_VIDEO_ENTRYPOINT_PROCESSING); break; default: value = VA_ATTRIB_NOT_SUPPORTED; @@ -453,41 +432,9 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin config->entrypoint = PIPE_VIDEO_ENTRYPOINT_PROCESSING; config->profile = PIPE_VIDEO_PROFILE_UNKNOWN; - /* - * Different gallium drivers will have different supported formats - * If modifying this, please query the driver like below - */ - supported_rt_formats = 0; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_NV12, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YV12, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_IYUV, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING)) - supported_rt_formats |= VA_RT_FORMAT_YUV420; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P010, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P016, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING)) - supported_rt_formats |= VA_RT_FORMAT_YUV420_10BPP; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UNORM, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UINT, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UNORM, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UINT, - PIPE_VIDEO_PROFILE_UNKNOWN, - PIPE_VIDEO_ENTRYPOINT_PROCESSING)) - supported_rt_formats |= VA_RT_FORMAT_RGB32; + supported_rt_formats = get_screen_supported_va_rt_formats(pscreen, + config->profile, + config->entrypoint); for (int i = 0; i < num_attribs; i++) { if (attrib_list[i].type == VAConfigAttribRTFormat) { if (attrib_list[i].value & supported_rt_formats) { @@ -556,37 +503,9 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin } config->profile = p; - /* - * Different gallium drivers will have different supported formats - * If modifying this, please query the driver like below - */ - supported_rt_formats = 0; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_NV12, p, - config->entrypoint) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YV12, p, - config->entrypoint)|| - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_IYUV, p, - config->entrypoint)) - supported_rt_formats |= VA_RT_FORMAT_YUV420; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P010, p, - config->entrypoint) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P016, p, - config->entrypoint)) - supported_rt_formats |= VA_RT_FORMAT_YUV420_10BPP; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_400_UNORM, - ProfileToPipe(profile), - config->entrypoint)) - supported_rt_formats |= VA_RT_FORMAT_YUV400; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_U8_V8_444_UNORM, - ProfileToPipe(profile), - config->entrypoint)) - supported_rt_formats |= VA_RT_FORMAT_YUV444; - if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_UYVY, p, - config->entrypoint) || - pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YUYV, p, - config->entrypoint)) - supported_rt_formats |= VA_RT_FORMAT_YUV422; - + supported_rt_formats = get_screen_supported_va_rt_formats(pscreen, + config->profile, + config->entrypoint); for (int i = 0; i