diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c index 23d01d1eda8..359a9dbe405 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.c +++ b/src/gallium/auxiliary/vl/vl_video_buffer.c @@ -91,6 +91,7 @@ vl_video_buffer_plane_order(enum pipe_format format) case PIPE_FORMAT_YUYV: case PIPE_FORMAT_UYVY: case PIPE_FORMAT_P010: + case PIPE_FORMAT_P012: case PIPE_FORMAT_P016: return const_resource_plane_order_YUV; diff --git a/src/gallium/frontends/va/config.c b/src/gallium/frontends/va/config.c index a3979a490b6..ceaee837569 100644 --- a/src/gallium/frontends/va/config.c +++ b/src/gallium/frontends/va/config.c @@ -141,6 +141,11 @@ static unsigned int get_screen_supported_va_rt_formats(struct pipe_screen *pscre entrypoint)) supported_rt_formats |= VA_RT_FORMAT_YUV420_10BPP; + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P012, + profile, + entrypoint)) + supported_rt_formats |= VA_RT_FORMAT_YUV420_12; + if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_400_UNORM, profile, entrypoint)) diff --git a/src/gallium/frontends/va/image.c b/src/gallium/frontends/va/image.c index ed46603282e..43df1ba8f0f 100644 --- a/src/gallium/frontends/va/image.c +++ b/src/gallium/frontends/va/image.c @@ -43,6 +43,7 @@ static const VAImageFormat formats[] = { {VA_FOURCC('N','V','1','2')}, {VA_FOURCC('P','0','1','0')}, + {VA_FOURCC('P','0','1','2')}, {VA_FOURCC('P','0','1','6')}, {VA_FOURCC('I','4','2','0')}, {VA_FOURCC('Y','V','1','2')}, @@ -153,6 +154,7 @@ vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int heig break; case VA_FOURCC('P','0','1','0'): + case VA_FOURCC('P','0','1','2'): case VA_FOURCC('P','0','1','6'): img->num_planes = 2; img->pitches[0] = w * 2; @@ -359,6 +361,7 @@ vlVaDeriveImage(VADriverContextP ctx, VASurfaceID surface, VAImage *image) case VA_FOURCC('N','V','1','2'): case VA_FOURCC('P','0','1','0'): + case VA_FOURCC('P','0','1','2'): case VA_FOURCC('P','0','1','6'): { /* In some gallium platforms, the stride and offset are different*/ diff --git a/src/gallium/frontends/va/surface.c b/src/gallium/frontends/va/surface.c index bcfd348d2ab..ee788507e7d 100644 --- a/src/gallium/frontends/va/surface.c +++ b/src/gallium/frontends/va/surface.c @@ -585,6 +585,9 @@ vlVaQuerySurfaceAttributes(VADriverContextP ctx, VAConfigID config_id, 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); + if (config->rt_format & VA_RT_FORMAT_YUV400) vlVaAddSurfaceFormat(pscreen, config, PIPE_FORMAT_Y8_400_UNORM, attribs, &i); @@ -1048,6 +1051,8 @@ rt_format_to_fourcc(uint32_t format) return VA_FOURCC_NV12; case VA_RT_FORMAT_YUV420_10: return VA_FOURCC_P010; + case VA_RT_FORMAT_YUV420_12: + return VA_FOURCC_P012; case VA_RT_FORMAT_YUV422: return VA_FOURCC_YUY2; case VA_RT_FORMAT_YUV444: @@ -1572,6 +1577,8 @@ static uint32_t pipe_format_to_drm_format(enum pipe_format format) return DRM_FORMAT_NV12; case PIPE_FORMAT_P010: return DRM_FORMAT_P010; + case PIPE_FORMAT_P012: + return DRM_FORMAT_P012; case PIPE_FORMAT_YUYV: case PIPE_FORMAT_R8G8_R8B8_UNORM: return DRM_FORMAT_YUYV; diff --git a/src/gallium/frontends/va/va_private.h b/src/gallium/frontends/va/va_private.h index 447c98914c6..b39e77d677a 100644 --- a/src/gallium/frontends/va/va_private.h +++ b/src/gallium/frontends/va/va_private.h @@ -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 21 +#define VL_VA_MAX_IMAGE_FORMATS 22 #define VL_VA_ENC_GOP_COEFF 16 #define UINT_TO_PTR(x) ((void*)(uintptr_t)(x)) @@ -126,6 +126,8 @@ VaFourccToPipeFormat(unsigned format) return PIPE_FORMAT_NV12; case VA_FOURCC('P','0','1','0'): return PIPE_FORMAT_P010; + case VA_FOURCC('P','0','1','2'): + return PIPE_FORMAT_P012; case VA_FOURCC('P','0','1','6'): return PIPE_FORMAT_P016; case VA_FOURCC('I','4','2','0'): @@ -177,6 +179,8 @@ PipeFormatToVaFourcc(enum pipe_format p_format) return VA_FOURCC('N','V','1','2'); case PIPE_FORMAT_P010: return VA_FOURCC('P','0','1','0'); + case PIPE_FORMAT_P012: + return VA_FOURCC('P','0','1','2'); case PIPE_FORMAT_P016: return VA_FOURCC('P','0','1','6'); case PIPE_FORMAT_IYUV: