[Libva] [PATCH v2][libva-intel-driver 2/3] VPP: Simplify surface state setting for csc and scaling on IVB/HSW/BDW
Zhao, Yakui
yakui.zhao at intel.com
Mon May 26 23:59:33 PDT 2014
On Mon, 2014-05-26 at 22:08 -0600, Xiang, Haihao wrote:
> From: "Xiang, Haihao" <haihao.xiang at intel.com>
>
> v2: bpp[] is in unit of bits
This looks good to me.
Add: Reviewed-by: Zhao, Yakui <yakui.zhao at intel.com>
Thanks.
Yakui
>
> Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
> ---
> src/gen8_post_processing.c | 180 ++++++++++++++++++++-------------------------
> src/i965_post_processing.c | 179 ++++++++++++++++++++------------------------
> 2 files changed, 162 insertions(+), 197 deletions(-)
>
> diff --git a/src/gen8_post_processing.c b/src/gen8_post_processing.c
> index 1abfd27..6c11c95 100644
> --- a/src/gen8_post_processing.c
> +++ b/src/gen8_post_processing.c
> @@ -489,18 +489,10 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> struct object_image *obj_image;
> dri_bo *bo;
> int fourcc = pp_get_surface_fourcc(ctx, surface);
> - const int U = (fourcc == VA_FOURCC_YV12 ||
> - fourcc == VA_FOURCC_YV16 ||
> - fourcc == VA_FOURCC_IMC1) ? 2 : 1;
> - const int V = (fourcc == VA_FOURCC_YV12 ||
> - fourcc == VA_FOURCC_YV16 ||
> - fourcc == VA_FOURCC_IMC1) ? 1 : 2;
> - int interleaved_uv = fourcc == VA_FOURCC_NV12;
> - int packed_yuv = (fourcc == VA_FOURCC_YUY2 || fourcc == VA_FOURCC_UYVY);
> - int rgbx_format = (fourcc == VA_FOURCC_RGBA ||
> - fourcc == VA_FOURCC_RGBX ||
> - fourcc == VA_FOURCC_BGRA ||
> - fourcc == VA_FOURCC_BGRX);
> + const i965_fourcc_info *fourcc_info = get_fourcc_info(fourcc);
> +
> + if (fourcc_info == NULL)
> + return;
>
> if (surface->type == I965_SURFACE_TYPE_SURFACE) {
> obj_surface = (struct object_surface *)surface->base;
> @@ -510,16 +502,8 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> pitch[0] = obj_surface->width;
> offset[0] = 0;
>
> - if (packed_yuv) {
> - if (is_target)
> - width[0] = obj_surface->orig_width * 2; /* surface format is R8, so double the width */
> - else
> - width[0] = obj_surface->orig_width; /* surface foramt is YCBCR, width is specified in units of pixels */
> -
> - } else if (rgbx_format) {
> - if (is_target)
> - width[0] = obj_surface->orig_width * 4; /* surface format is R8, so quad the width */
> - }
> + if (fourcc_info->num_planes == 1 && is_target)
> + width[0] = width[0] * (fourcc_info->bpp[0] / 8); /* surface format is R8 */
>
> width[1] = obj_surface->cb_cr_width;
> height[1] = obj_surface->cb_cr_height;
> @@ -531,6 +515,9 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> pitch[2] = obj_surface->cb_cr_pitch;
> offset[2] = obj_surface->y_cr_offset * obj_surface->width;
> } else {
> + int U = 0, V = 0;
> +
> + /* FIXME: add support for ARGB/ABGR image */
> obj_image = (struct object_image *)surface->base;
> bo = obj_image->bo;
> width[0] = obj_image->image.width;
> @@ -538,35 +525,30 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> pitch[0] = obj_image->image.pitches[0];
> offset[0] = obj_image->image.offsets[0];
>
> - if (rgbx_format) {
> - if (is_target)
> - width[0] = obj_image->image.width * 4; /* surface format is R8, so quad the width */
> - } else if (packed_yuv) {
> + if (fourcc_info->num_planes == 1) {
> if (is_target)
> - width[0] = obj_image->image.width * 2; /* surface format is R8, so double the width */
> - else
> - width[0] = obj_image->image.width; /* surface foramt is YCBCR, width is specified in units of pixels */
> - } else if (interleaved_uv) {
> - width[1] = obj_image->image.width / 2;
> - height[1] = obj_image->image.height / 2;
> - pitch[1] = obj_image->image.pitches[1];
> - offset[1] = obj_image->image.offsets[1];
> + width[0] = width[0] * (fourcc_info->bpp[0] / 8); /* surface format is R8 */
> + } else if (fourcc_info->num_planes == 2) {
> + U = 1, V = 1;
> } else {
> - width[1] = obj_image->image.width / 2;
> - height[1] = obj_image->image.height / 2;
> - pitch[1] = obj_image->image.pitches[U];
> - offset[1] = obj_image->image.offsets[U];
> - width[2] = obj_image->image.width / 2;
> - height[2] = obj_image->image.height / 2;
> - pitch[2] = obj_image->image.pitches[V];
> - offset[2] = obj_image->image.offsets[V];
> - if (fourcc == VA_FOURCC_YV16 || fourcc == VA_FOURCC_422H) {
> - width[1] = obj_image->image.width / 2;
> - height[1] = obj_image->image.height;
> - width[2] = obj_image->image.width / 2;
> - height[2] = obj_image->image.height;
> - }
> + assert(fourcc_info->num_components == 3);
> +
> + U = fourcc_info->components[1].plane;
> + V = fourcc_info->components[2].plane;
> + assert((U == 1 && V == 2) ||
> + (U == 2 && V == 1));
> }
> +
> + /* Always set width/height although they aren't used for fourcc_info->num_planes == 1 */
> + width[1] = obj_image->image.width / fourcc_info->hfactor;
> + height[1] = obj_image->image.height / fourcc_info->vfactor;
> + pitch[1] = obj_image->image.pitches[U];
> + offset[1] = obj_image->image.offsets[U];
> +
> + width[2] = obj_image->image.width / fourcc_info->hfactor;
> + height[2] = obj_image->image.height / fourcc_info->vfactor;
> + pitch[2] = obj_image->image.pitches[V];
> + offset[2] = obj_image->image.offsets[V];
> }
>
> if (is_target) {
> @@ -575,34 +557,34 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> width[0] / 4, height[0], pitch[0],
> I965_SURFACEFORMAT_R8_UINT,
> base_index, 1);
> - if (rgbx_format) {
> - struct gen7_pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter;
> - /* the format is MSB: X-B-G-R */
> - pp_static_parameter->grf2.save_avs_rgb_swap = 0;
> - if ((fourcc == VA_FOURCC_BGRA) ||
> - (fourcc == VA_FOURCC_BGRX)) {
> - /* It is stored as MSB: X-R-G-B */
> - pp_static_parameter->grf2.save_avs_rgb_swap = 1;
> - }
> - }
> - if (!packed_yuv && !rgbx_format) {
> - if (interleaved_uv) {
> - gen8_pp_set_surface_state(ctx, pp_context,
> - bo, offset[1],
> - width[1] / 2, height[1], pitch[1],
> - I965_SURFACEFORMAT_R8G8_SINT,
> - base_index + 1, 1);
> - } else {
> - gen8_pp_set_surface_state(ctx, pp_context,
> - bo, offset[1],
> - width[1] / 4, height[1], pitch[1],
> - I965_SURFACEFORMAT_R8_SINT,
> - base_index + 1, 1);
> - gen8_pp_set_surface_state(ctx, pp_context,
> - bo, offset[2],
> - width[2] / 4, height[2], pitch[2],
> - I965_SURFACEFORMAT_R8_SINT,
> - base_index + 2, 1);
> +
> + if (fourcc_info->num_planes == 2) {
> + gen8_pp_set_surface_state(ctx, pp_context,
> + bo, offset[1],
> + width[1] / 2, height[1], pitch[1],
> + I965_SURFACEFORMAT_R8G8_SINT,
> + base_index + 1, 1);
> + } else if (fourcc_info->num_planes == 3) {
> + gen8_pp_set_surface_state(ctx, pp_context,
> + bo, offset[1],
> + width[1] / 4, height[1], pitch[1],
> + I965_SURFACEFORMAT_R8_SINT,
> + base_index + 1, 1);
> + gen8_pp_set_surface_state(ctx, pp_context,
> + bo, offset[2],
> + width[2] / 4, height[2], pitch[2],
> + I965_SURFACEFORMAT_R8_SINT,
> + base_index + 2, 1);
> + }
> +
> + if (fourcc_info->format == I965_COLOR_RGB) {
> + struct gen7_pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter;
> + /* the format is MSB: X-B-G-R */
> + pp_static_parameter->grf2.save_avs_rgb_swap = 0;
> + if ((fourcc == VA_FOURCC_BGRA) ||
> + (fourcc == VA_FOURCC_BGRX)) {
> + /* It is stored as MSB: X-R-G-B */
> + pp_static_parameter->grf2.save_avs_rgb_swap = 1;
> }
> }
> } else {
> @@ -620,7 +602,8 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> default:
> break;
> }
> - if (rgbx_format) {
> +
> + if (fourcc_info->format == I965_COLOR_RGB) {
> struct gen7_pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter;
> /* Only R8G8B8A8_UNORM is supported for BGRX or RGBX */
> format0 = SURFACE_FORMAT_R8G8B8A8_UNORM;
> @@ -630,6 +613,7 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> pp_static_parameter->grf2.src_avs_rgb_swap = 1;
> }
> }
> +
> gen8_pp_set_surface2_state(ctx, pp_context,
> bo, offset[0],
> width[0], height[0], pitch[0],
> @@ -637,28 +621,26 @@ gen8_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> format0, 0,
> base_index);
>
> - if (!packed_yuv && !rgbx_format) {
> - if (interleaved_uv) {
> - gen8_pp_set_surface2_state(ctx, pp_context,
> - bo, offset[1],
> - width[1], height[1], pitch[1],
> - 0, 0,
> - SURFACE_FORMAT_R8B8_UNORM, 0,
> - base_index + 1);
> - } else {
> - gen8_pp_set_surface2_state(ctx, pp_context,
> - bo, offset[1],
> - width[1], height[1], pitch[1],
> - 0, 0,
> - SURFACE_FORMAT_R8_UNORM, 0,
> - base_index + 1);
> - gen8_pp_set_surface2_state(ctx, pp_context,
> - bo, offset[2],
> - width[2], height[2], pitch[2],
> - 0, 0,
> - SURFACE_FORMAT_R8_UNORM, 0,
> - base_index + 2);
> - }
> + if (fourcc_info->num_planes == 2) {
> + gen8_pp_set_surface2_state(ctx, pp_context,
> + bo, offset[1],
> + width[1], height[1], pitch[1],
> + 0, 0,
> + SURFACE_FORMAT_R8B8_UNORM, 0,
> + base_index + 1);
> + } else if (fourcc_info->num_planes == 3) {
> + gen8_pp_set_surface2_state(ctx, pp_context,
> + bo, offset[1],
> + width[1], height[1], pitch[1],
> + 0, 0,
> + SURFACE_FORMAT_R8_UNORM, 0,
> + base_index + 1);
> + gen8_pp_set_surface2_state(ctx, pp_context,
> + bo, offset[2],
> + width[2], height[2], pitch[2],
> + 0, 0,
> + SURFACE_FORMAT_R8_UNORM, 0,
> + base_index + 2);
> }
> }
> }
> diff --git a/src/i965_post_processing.c b/src/i965_post_processing.c
> index 5fe7289..d10e18f 100755
> --- a/src/i965_post_processing.c
> +++ b/src/i965_post_processing.c
> @@ -1885,18 +1885,10 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> struct object_image *obj_image;
> dri_bo *bo;
> int fourcc = pp_get_surface_fourcc(ctx, surface);
> - const int U = (fourcc == VA_FOURCC_YV12 ||
> - fourcc == VA_FOURCC_YV16 ||
> - fourcc == VA_FOURCC_IMC1) ? 2 : 1;
> - const int V = (fourcc == VA_FOURCC_YV12 ||
> - fourcc == VA_FOURCC_YV16 ||
> - fourcc == VA_FOURCC_IMC1) ? 1 : 2;
> - int interleaved_uv = fourcc == VA_FOURCC_NV12;
> - int packed_yuv = (fourcc == VA_FOURCC_YUY2 || fourcc == VA_FOURCC_UYVY);
> - int rgbx_format = (fourcc == VA_FOURCC_RGBA ||
> - fourcc == VA_FOURCC_RGBX ||
> - fourcc == VA_FOURCC_BGRA ||
> - fourcc == VA_FOURCC_BGRX);
> + const i965_fourcc_info *fourcc_info = get_fourcc_info(fourcc);
> +
> + if (fourcc_info == NULL)
> + return;
>
> if (surface->type == I965_SURFACE_TYPE_SURFACE) {
> obj_surface = (struct object_surface *)surface->base;
> @@ -1906,15 +1898,8 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> pitch[0] = obj_surface->width;
> offset[0] = 0;
>
> - if (packed_yuv) {
> - if (is_target)
> - width[0] = obj_surface->orig_width * 2; /* surface format is R8, so double the width */
> - else
> - width[0] = obj_surface->orig_width; /* surface foramt is YCBCR, width is specified in units of pixels */
> - } else if (rgbx_format) {
> - if (is_target)
> - width[0] = obj_surface->orig_width * 4; /* surface format is R8, so quad the width */
> - }
> + if (fourcc_info->num_planes == 1 && is_target)
> + width[0] = width[0] * (fourcc_info->bpp[0] / 8); /* surface format is R8 */
>
> width[1] = obj_surface->cb_cr_width;
> height[1] = obj_surface->cb_cr_height;
> @@ -1926,6 +1911,9 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> pitch[2] = obj_surface->cb_cr_pitch;
> offset[2] = obj_surface->y_cr_offset * obj_surface->width;
> } else {
> + int U = 0, V = 0;
> +
> + /* FIXME: add support for ARGB/ABGR image */
> obj_image = (struct object_image *)surface->base;
> bo = obj_image->bo;
> width[0] = obj_image->image.width;
> @@ -1933,35 +1921,30 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> pitch[0] = obj_image->image.pitches[0];
> offset[0] = obj_image->image.offsets[0];
>
> - if (rgbx_format) {
> - if (is_target)
> - width[0] = obj_image->image.width * 4; /* surface format is R8, so quad the width */
> - } else if (packed_yuv) {
> + if (fourcc_info->num_planes == 1) {
> if (is_target)
> - width[0] = obj_image->image.width * 2; /* surface format is R8, so double the width */
> - else
> - width[0] = obj_image->image.width; /* surface foramt is YCBCR, width is specified in units of pixels */
> - } else if (interleaved_uv) {
> - width[1] = obj_image->image.width / 2;
> - height[1] = obj_image->image.height / 2;
> - pitch[1] = obj_image->image.pitches[1];
> - offset[1] = obj_image->image.offsets[1];
> + width[0] = width[0] * (fourcc_info->bpp[0] / 8); /* surface format is R8 */
> + } else if (fourcc_info->num_planes == 2) {
> + U = 1, V = 1;
> } else {
> - width[1] = obj_image->image.width / 2;
> - height[1] = obj_image->image.height / 2;
> - pitch[1] = obj_image->image.pitches[U];
> - offset[1] = obj_image->image.offsets[U];
> - width[2] = obj_image->image.width / 2;
> - height[2] = obj_image->image.height / 2;
> - pitch[2] = obj_image->image.pitches[V];
> - offset[2] = obj_image->image.offsets[V];
> - if (fourcc == VA_FOURCC_YV16 || fourcc == VA_FOURCC_422H) {
> - width[1] = obj_image->image.width / 2;
> - height[1] = obj_image->image.height;
> - width[2] = obj_image->image.width / 2;
> - height[2] = obj_image->image.height;
> - }
> + assert(fourcc_info->num_components == 3);
> +
> + U = fourcc_info->components[1].plane;
> + V = fourcc_info->components[2].plane;
> + assert((U == 1 && V == 2) ||
> + (U == 2 && V == 1));
> }
> +
> + /* Always set width/height although they aren't used for fourcc_info->num_planes == 1 */
> + width[1] = obj_image->image.width / fourcc_info->hfactor;
> + height[1] = obj_image->image.height / fourcc_info->vfactor;
> + pitch[1] = obj_image->image.pitches[U];
> + offset[1] = obj_image->image.offsets[U];
> +
> + width[2] = obj_image->image.width / fourcc_info->hfactor;
> + height[2] = obj_image->image.height / fourcc_info->vfactor;
> + pitch[2] = obj_image->image.pitches[V];
> + offset[2] = obj_image->image.offsets[V];
> }
>
> if (is_target) {
> @@ -1970,34 +1953,34 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> width[0] / 4, height[0], pitch[0],
> I965_SURFACEFORMAT_R8_UINT,
> base_index, 1);
> - if (rgbx_format) {
> - struct gen7_pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter;
> - /* the format is MSB: X-B-G-R */
> - pp_static_parameter->grf2.save_avs_rgb_swap = 0;
> - if ((fourcc == VA_FOURCC_BGRA) ||
> - (fourcc == VA_FOURCC_BGRX)) {
> - /* It is stored as MSB: X-R-G-B */
> - pp_static_parameter->grf2.save_avs_rgb_swap = 1;
> - }
> - }
> - if (!packed_yuv && !rgbx_format) {
> - if (interleaved_uv) {
> - gen7_pp_set_surface_state(ctx, pp_context,
> - bo, offset[1],
> - width[1] / 2, height[1], pitch[1],
> - I965_SURFACEFORMAT_R8G8_SINT,
> - base_index + 1, 1);
> - } else {
> - gen7_pp_set_surface_state(ctx, pp_context,
> - bo, offset[1],
> - width[1] / 4, height[1], pitch[1],
> - I965_SURFACEFORMAT_R8_SINT,
> - base_index + 1, 1);
> - gen7_pp_set_surface_state(ctx, pp_context,
> - bo, offset[2],
> - width[2] / 4, height[2], pitch[2],
> - I965_SURFACEFORMAT_R8_SINT,
> - base_index + 2, 1);
> +
> + if (fourcc_info->num_planes == 2) {
> + gen7_pp_set_surface_state(ctx, pp_context,
> + bo, offset[1],
> + width[1] / 2, height[1], pitch[1],
> + I965_SURFACEFORMAT_R8G8_SINT,
> + base_index + 1, 1);
> + } else if (fourcc_info->num_planes == 3) {
> + gen7_pp_set_surface_state(ctx, pp_context,
> + bo, offset[1],
> + width[1] / 4, height[1], pitch[1],
> + I965_SURFACEFORMAT_R8_SINT,
> + base_index + 1, 1);
> + gen7_pp_set_surface_state(ctx, pp_context,
> + bo, offset[2],
> + width[2] / 4, height[2], pitch[2],
> + I965_SURFACEFORMAT_R8_SINT,
> + base_index + 2, 1);
> + }
> +
> + if (fourcc_info->format == I965_COLOR_RGB) {
> + struct gen7_pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter;
> + /* the format is MSB: X-B-G-R */
> + pp_static_parameter->grf2.save_avs_rgb_swap = 0;
> + if ((fourcc == VA_FOURCC_BGRA) ||
> + (fourcc == VA_FOURCC_BGRX)) {
> + /* It is stored as MSB: X-R-G-B */
> + pp_static_parameter->grf2.save_avs_rgb_swap = 1;
> }
> }
> } else {
> @@ -2015,7 +1998,8 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> default:
> break;
> }
> - if (rgbx_format) {
> +
> + if (fourcc_info->format == I965_COLOR_RGB) {
> struct gen7_pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter;
> /* Only R8G8B8A8_UNORM is supported for BGRX or RGBX */
> format0 = SURFACE_FORMAT_R8G8B8A8_UNORM;
> @@ -2025,6 +2009,7 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> pp_static_parameter->grf2.src_avs_rgb_swap = 1;
> }
> }
> +
> gen7_pp_set_surface2_state(ctx, pp_context,
> bo, offset[0],
> width[0], height[0], pitch[0],
> @@ -2032,28 +2017,26 @@ gen7_pp_set_media_rw_message_surface(VADriverContextP ctx, struct i965_post_proc
> format0, 0,
> base_index);
>
> - if (!packed_yuv && !rgbx_format) {
> - if (interleaved_uv) {
> - gen7_pp_set_surface2_state(ctx, pp_context,
> - bo, offset[1],
> - width[1], height[1], pitch[1],
> - 0, 0,
> - SURFACE_FORMAT_R8B8_UNORM, 0,
> - base_index + 1);
> - } else {
> - gen7_pp_set_surface2_state(ctx, pp_context,
> - bo, offset[1],
> - width[1], height[1], pitch[1],
> - 0, 0,
> - SURFACE_FORMAT_R8_UNORM, 0,
> - base_index + 1);
> - gen7_pp_set_surface2_state(ctx, pp_context,
> - bo, offset[2],
> - width[2], height[2], pitch[2],
> - 0, 0,
> - SURFACE_FORMAT_R8_UNORM, 0,
> - base_index + 2);
> - }
> + if (fourcc_info->num_planes == 2) {
> + gen7_pp_set_surface2_state(ctx, pp_context,
> + bo, offset[1],
> + width[1], height[1], pitch[1],
> + 0, 0,
> + SURFACE_FORMAT_R8B8_UNORM, 0,
> + base_index + 1);
> + } else if (fourcc_info->num_planes == 3) {
> + gen7_pp_set_surface2_state(ctx, pp_context,
> + bo, offset[1],
> + width[1], height[1], pitch[1],
> + 0, 0,
> + SURFACE_FORMAT_R8_UNORM, 0,
> + base_index + 1);
> + gen7_pp_set_surface2_state(ctx, pp_context,
> + bo, offset[2],
> + width[2], height[2], pitch[2],
> + 0, 0,
> + SURFACE_FORMAT_R8_UNORM, 0,
> + base_index + 2);
> }
> }
> }
> --
> 1.8.3.2
>
> _______________________________________________
> Libva mailing list
> Libva at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/libva
>
More information about the Libva
mailing list