diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2014-10-13 15:56:15 +0200 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2014-11-11 11:57:18 +0100 |
commit | 4f499df5c7d73d922f0bbfc21ac5ac9f28c6b65d (patch) | |
tree | 4f9d7e40e3b158b73606b7b03a5852be87c6de02 /src/i965_post_processing.c | |
parent | c93934d9dd195f79baf27075f8ec4765bf370375 (diff) | |
download | libva-intel-driver-4f499df5c7d73d922f0bbfc21ac5ac9f28c6b65d.tar.gz |
vpp: factor out calculation of AVS coefficients.
Split calculation of AVS coefficients into separate helper functions
in view to supporting alternate algorithms, but we stick to bilinear
interpolation for now.
Actually fix bilinear filtering coefficients if the sharp 8x8 filter
is used. This is still disabled by default though.
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
Diffstat (limited to 'src/i965_post_processing.c')
-rwxr-xr-x | src/i965_post_processing.c | 218 |
1 files changed, 145 insertions, 73 deletions
diff --git a/src/i965_post_processing.c b/src/i965_post_processing.c index 4d3c9b15..12cd1aec 100755 --- a/src/i965_post_processing.c +++ b/src/i965_post_processing.c @@ -38,6 +38,7 @@ #include "i965_drv_video.h" #include "i965_post_processing.h" #include "i965_render.h" +#include "i965_vpp_avs.h" #include "intel_media.h" extern VAStatus @@ -2363,6 +2364,22 @@ pp_avs_set_block_parameter(struct i965_post_processing_context *pp_context, int return 0; } +static const AVSConfig gen5_avs_config = { + .coeff_frac_bits = 6, + .coeff_epsilon = 1.0f / (1U << 6), + .num_phases = 16, + .num_luma_coeffs = 8, + .num_chroma_coeffs = 4, +}; + +static const AVSConfig gen6_avs_config = { + .coeff_frac_bits = 6, + .coeff_epsilon = 1.0f / (1U << 6), + .num_phases = 16, + .num_luma_coeffs = 8, + .num_chroma_coeffs = 4, +}; + static VAStatus pp_nv12_avs_initialize(VADriverContextP ctx, struct i965_post_processing_context *pp_context, const struct i965_surface *src_surface, @@ -2372,6 +2389,7 @@ pp_nv12_avs_initialize(VADriverContextP ctx, struct i965_post_processing_context void *filter_param, int nlas) { + struct i965_driver_data * const i965 = i965_driver_data(ctx); struct pp_avs_context *pp_avs_context = (struct pp_avs_context *)&pp_context->pp_avs_context; struct pp_inline_parameter *pp_inline_parameter = pp_context->pp_inline_parameter; struct pp_static_parameter *pp_static_parameter = pp_context->pp_static_parameter; @@ -2382,6 +2400,8 @@ pp_nv12_avs_initialize(VADriverContextP ctx, struct i965_post_processing_context int in_w, in_h, in_wpitch, in_hpitch; int out_w, out_h, out_wpitch, out_hpitch; int i; + AVSState avs; + float sx, sy; /* surface */ obj_surface = (struct object_surface *)src_surface->base; @@ -2433,41 +2453,68 @@ pp_nv12_avs_initialize(VADriverContextP ctx, struct i965_post_processing_context sampler_8x8_state = pp_context->sampler_state_table.bo_8x8->virtual; memset(sampler_8x8_state, 0, sizeof(*sampler_8x8_state)); - for (i = 0; i < 17; i++) { - /* for Y channel, currently ignore */ - sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c0 = 0x00; - sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c1 = 0x00; - sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c2 = 0x08; - sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c3 = 0x18; - sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c4 = 0x18; - sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c5 = 0x08; - sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c6 = 0x00; - sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c7 = 0x00; - sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c0 = 0x00; - sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c1 = 0x00; - sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c2 = 0x10; - sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c3 = 0x10; - sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c4 = 0x10; - sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c5 = 0x10; - sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c6 = 0x00; - sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c7 = 0x00; - /* for U/V channel, 0.25 */ - sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c0 = 0x0; - sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c1 = 0x0; - sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c2 = 0x10; - sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c3 = 0x10; - sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c4 = 0x10; - sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c5 = 0x10; - sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c6 = 0x0; - sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c7 = 0x0; - sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c0 = 0x0; - sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c1 = 0x0; - sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c2 = 0x10; - sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c3 = 0x10; - sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c4 = 0x10; - sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c5 = 0x10; - sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c6 = 0x0; - sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c7 = 0x0; + avs_init_state(&avs, IS_GEN6(i965->intel.device_info) ? &gen6_avs_config : + &gen5_avs_config); + + sx = (float)dst_rect->width / src_rect->width; + sy = (float)dst_rect->height / src_rect->height; + avs_update_coefficients(&avs, sx, sy, 0); + + assert(avs.config->num_phases == 16); + for (i = 0; i <= 16; i++) { + const AVSCoeffs * const coeffs = &avs.coeffs[i]; + + sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c0 = + intel_format_convert(coeffs->y_k_h[0], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c1 = + intel_format_convert(coeffs->y_k_h[1], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c2 = + intel_format_convert(coeffs->y_k_h[2], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c3 = + intel_format_convert(coeffs->y_k_h[3], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c4 = + intel_format_convert(coeffs->y_k_h[4], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c5 = + intel_format_convert(coeffs->y_k_h[5], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c6 = + intel_format_convert(coeffs->y_k_h[6], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c7 = + intel_format_convert(coeffs->y_k_h[7], 1, 6, 1); + + sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c2 = + intel_format_convert(coeffs->uv_k_h[0], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c3 = + intel_format_convert(coeffs->uv_k_h[1], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c4 = + intel_format_convert(coeffs->uv_k_h[2], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c5 = + intel_format_convert(coeffs->uv_k_h[3], 1, 6, 1); + + sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c0 = + intel_format_convert(coeffs->y_k_v[0], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c1 = + intel_format_convert(coeffs->y_k_v[1], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c2 = + intel_format_convert(coeffs->y_k_v[2], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c3 = + intel_format_convert(coeffs->y_k_v[3], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c4 = + intel_format_convert(coeffs->y_k_v[4], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c5 = + intel_format_convert(coeffs->y_k_v[5], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c6 = + intel_format_convert(coeffs->y_k_v[6], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c7 = + intel_format_convert(coeffs->y_k_v[7], 1, 6, 1); + + sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c2 = + intel_format_convert(coeffs->uv_k_v[0], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c3 = + intel_format_convert(coeffs->uv_k_v[1], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c4 = + intel_format_convert(coeffs->uv_k_v[2], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c5 = + intel_format_convert(coeffs->uv_k_v[3], 1, 6, 1); } /* Adaptive filter for all channels (DW4.15) */ @@ -2742,6 +2789,8 @@ gen7_pp_plx_avs_initialize(VADriverContextP ctx, struct i965_post_processing_con int index, i; int width[3], height[3], pitch[3], offset[3]; int src_width, src_height; + AVSState avs; + float sx, sy; /* source surface */ gen7_pp_set_media_rw_message_surface(ctx, pp_context, src_surface, 0, 0, @@ -2762,44 +2811,67 @@ gen7_pp_plx_avs_initialize(VADriverContextP ctx, struct i965_post_processing_con sampler_8x8_state = pp_context->sampler_state_table.bo_8x8->virtual; memset(sampler_8x8_state, 0, sizeof(*sampler_8x8_state)); - for (i = 0; i < 17; i++) { - float coff; - coff = i; - coff = coff / 16; - /* for Y channel, currently ignore */ - sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c0 = 0x0; - sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c1 = 0x0; - sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c2 = 0x0; - sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c3 = intel_format_convert(1 - coff, 1, 6,0); - sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c4 = intel_format_convert(coff, 1, 6, 0); - sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c5 = 0x0; - sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c6 = 0x0; - sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c7 = 0x0; - sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c0 = 0x0; - sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c1 = 0x0; - sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c2 = 0x0; - sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c3 = intel_format_convert(1 - coff, 1, 6, 0); - sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c4 = intel_format_convert(coff, 1, 6, 0); - sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c5 = 0x0; - sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c6 = 0x0; - sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c7 = 0x0; - /* for U/V channel, 0.25 */ - sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c0 = 0x0; - sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c1 = 0x0; - sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c2 = 0x0; - sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c3 = intel_format_convert(1 - coff, 1, 6, 0); - sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c4 = intel_format_convert(coff, 1, 6, 0); - sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c5 = 0; - sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c6 = 0x0; - sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c7 = 0x0; - sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c0 = 0x0; - sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c1 = 0x0; - sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c2 = 0x0; - sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c3 = intel_format_convert(1 - coff, 1, 6, 0); - sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c4 = intel_format_convert(coff, 1, 6, 0); - sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c5 = 0x0; - sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c6 = 0x0; - sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c7 = 0x0; + avs_init_state(&avs, &gen6_avs_config); + + sx = (float)dst_rect->width / src_rect->width; + sy = (float)dst_rect->height / src_rect->height; + avs_update_coefficients(&avs, sx, sy, 0); + + assert(avs.config->num_phases == 16); + for (i = 0; i <= 16; i++) { + const AVSCoeffs * const coeffs = &avs.coeffs[i]; + + sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c0 = + intel_format_convert(coeffs->y_k_h[0], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c1 = + intel_format_convert(coeffs->y_k_h[1], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c2 = + intel_format_convert(coeffs->y_k_h[2], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw0.table_0x_filter_c3 = + intel_format_convert(coeffs->y_k_h[3], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c4 = + intel_format_convert(coeffs->y_k_h[4], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c5 = + intel_format_convert(coeffs->y_k_h[5], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c6 = + intel_format_convert(coeffs->y_k_h[6], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw1.table_0x_filter_c7 = + intel_format_convert(coeffs->y_k_h[7], 1, 6, 1); + + sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c2 = + intel_format_convert(coeffs->uv_k_h[0], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw4.table_1x_filter_c3 = + intel_format_convert(coeffs->uv_k_h[1], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c4 = + intel_format_convert(coeffs->uv_k_h[2], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw5.table_1x_filter_c5 = + intel_format_convert(coeffs->uv_k_h[3], 1, 6, 1); + + sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c0 = + intel_format_convert(coeffs->y_k_v[0], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c1 = + intel_format_convert(coeffs->y_k_v[1], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c2 = + intel_format_convert(coeffs->y_k_v[2], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw2.table_0y_filter_c3 = + intel_format_convert(coeffs->y_k_v[3], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c4 = + intel_format_convert(coeffs->y_k_v[4], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c5 = + intel_format_convert(coeffs->y_k_v[5], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c6 = + intel_format_convert(coeffs->y_k_v[6], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw3.table_0y_filter_c7 = + intel_format_convert(coeffs->y_k_v[7], 1, 6, 1); + + sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c2 = + intel_format_convert(coeffs->uv_k_v[0], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw6.table_1y_filter_c3 = + intel_format_convert(coeffs->uv_k_v[1], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c4 = + intel_format_convert(coeffs->uv_k_v[2], 1, 6, 1); + sampler_8x8_state->coefficients[i].dw7.table_1y_filter_c5 = + intel_format_convert(coeffs->uv_k_v[3], 1, 6, 1); } sampler_8x8_state->dw136.default_sharpness_level = 0; |