[Libva] [PATCH v2][libva-intel-driver 2/3] VPP: Simplify surface state setting for csc and scaling on IVB/HSW/BDW
Xiang, Haihao
haihao.xiang at intel.com
Mon May 26 21:08:58 PDT 2014
From: "Xiang, Haihao" <haihao.xiang at intel.com>
v2: bpp[] is in unit of bits
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
More information about the Libva
mailing list