diff --git a/src/gallium/frontends/va/image.c b/src/gallium/frontends/va/image.c index 76ecbedfba3..198da5d6bd6 100644 --- a/src/gallium/frontends/va/image.c +++ b/src/gallium/frontends/va/image.c @@ -49,6 +49,8 @@ static const VAImageFormat formats[] = {VA_FOURCC('Y','U','Y','V')}, {VA_FOURCC('Y','U','Y','2')}, {VA_FOURCC('U','Y','V','Y')}, + {VA_FOURCC('Y','8','0','0')}, + {VA_FOURCC('4','4','4','P')}, {.fourcc = VA_FOURCC('B','G','R','A'), .byte_order = VA_LSB_FIRST, 32, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000}, {.fourcc = VA_FOURCC('R','G','B','A'), .byte_order = VA_LSB_FIRST, 32, 32, @@ -179,6 +181,24 @@ vlVaCreateImage(VADriverContextP ctx, VAImageFormat *format, int width, int heig img->data_size = w * h * 4; break; + case VA_FOURCC('Y','8','0','0'): + img->num_planes = 1; + img->pitches[0] = w; + img->offsets[0] = 0; + img->data_size = w * h; + break; + + case VA_FOURCC('4','4','4', 'P'): + img->num_planes = 3; + img->offsets[0] = 0; + img->offsets[1] = w * h; + img->offsets[2] = w * h * 2; + img->pitches[0] = w; + img->pitches[1] = w; + img->pitches[2] = w; + img->data_size = w * h * 3; + break; + default: return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT; } diff --git a/src/gallium/frontends/va/surface.c b/src/gallium/frontends/va/surface.c index 8067c5fcf04..94e0a130835 100644 --- a/src/gallium/frontends/va/surface.c +++ b/src/gallium/frontends/va/surface.c @@ -506,6 +506,30 @@ vlVaQuerySurfaceAttributes(VADriverContextP ctx, VAConfigID config_id, i++; } + if (config->rt_format & VA_RT_FORMAT_YUV400) { + attribs[i].type = VASurfaceAttribPixelFormat; + attribs[i].value.type = VAGenericValueTypeInteger; + attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE; + attribs[i].value.value.i = VA_FOURCC_Y800; + i++; + } + + if (config->rt_format & VA_RT_FORMAT_YUV422) { + attribs[i].type = VASurfaceAttribPixelFormat; + attribs[i].value.type = VAGenericValueTypeInteger; + attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE; + attribs[i].value.value.i = VA_FOURCC_YUY2; + i++; + } + + if (config->rt_format & VA_RT_FORMAT_YUV444) { + attribs[i].type = VASurfaceAttribPixelFormat; + attribs[i].value.type = VAGenericValueTypeInteger; + attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE; + attribs[i].value.value.i = VA_FOURCC_444P; + i++; + } + attribs[i].type = VASurfaceAttribMemoryType; attribs[i].value.type = VAGenericValueTypeInteger; attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE; @@ -935,6 +959,7 @@ vlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format, if (VA_RT_FORMAT_YUV420 != format && VA_RT_FORMAT_YUV422 != format && VA_RT_FORMAT_YUV444 != format && + VA_RT_FORMAT_YUV400 != format && VA_RT_FORMAT_YUV420_10BPP != format && VA_RT_FORMAT_RGB32 != format) { return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT; diff --git a/src/gallium/frontends/va/va_private.h b/src/gallium/frontends/va/va_private.h index 6f3f8306c6c..2febd9407c9 100644 --- a/src/gallium/frontends/va/va_private.h +++ b/src/gallium/frontends/va/va_private.h @@ -53,7 +53,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 12 +#define VL_VA_MAX_IMAGE_FORMATS 14 #define VL_VA_ENC_GOP_COEFF 16 #define UINT_TO_PTR(x) ((void*)(uintptr_t)(x)) @@ -88,6 +88,8 @@ ChromaToPipe(int format) return PIPE_VIDEO_CHROMA_FORMAT_422; case VA_RT_FORMAT_YUV444: return PIPE_VIDEO_CHROMA_FORMAT_444; + case VA_RT_FORMAT_YUV400: + return PIPE_VIDEO_CHROMA_FORMAT_400; default: return PIPE_VIDEO_CHROMA_FORMAT_NONE; } @@ -120,6 +122,10 @@ VaFourccToPipeFormat(unsigned format) return PIPE_FORMAT_B8G8R8X8_UNORM; case VA_FOURCC('R','G','B','X'): return PIPE_FORMAT_R8G8B8X8_UNORM; + case VA_FOURCC('Y','8','0','0'): + return PIPE_FORMAT_Y8_400_UNORM; + case VA_FOURCC('4','4','4','P'): + return PIPE_FORMAT_Y8_U8_V8_444_UNORM; default: assert(0); return PIPE_FORMAT_NONE; @@ -152,6 +158,10 @@ 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_Y8_400_UNORM: + return VA_FOURCC('Y','8','0','0'); + case PIPE_FORMAT_Y8_U8_V8_444_UNORM: + return VA_FOURCC('4','4','4','P'); default: assert(0); return -1;