summaryrefslogtreecommitdiff
path: root/src/gen8_post_processing.c
diff options
context:
space:
mode:
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>2014-10-13 15:56:15 +0200
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2014-11-11 11:57:18 +0100
commit4f499df5c7d73d922f0bbfc21ac5ac9f28c6b65d (patch)
tree4f9d7e40e3b158b73606b7b03a5852be87c6de02 /src/gen8_post_processing.c
parentc93934d9dd195f79baf27075f8ec4765bf370375 (diff)
downloadlibva-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/gen8_post_processing.c')
-rw-r--r--src/gen8_post_processing.c101
1 files changed, 66 insertions, 35 deletions
diff --git a/src/gen8_post_processing.c b/src/gen8_post_processing.c
index eeae32f8..d36c0618 100644
--- a/src/gen8_post_processing.c
+++ b/src/gen8_post_processing.c
@@ -39,6 +39,7 @@
#include "i965_drv_video.h"
#include "i965_post_processing.h"
#include "i965_render.h"
+#include "i965_vpp_avs.h"
#include "intel_media.h"
#define SURFACE_STATE_PADDED_SIZE SURFACE_STATE_PADDED_SIZE_GEN8
@@ -739,6 +740,14 @@ static void gen7_update_src_surface_uv_offset(VADriverContextP ctx,
}
}
+static const AVSConfig gen8_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
gen8_pp_plx_avs_initialize(VADriverContextP ctx, struct i965_post_processing_context *pp_context,
const struct i965_surface *src_surface,
@@ -755,6 +764,8 @@ gen8_pp_plx_avs_initialize(VADriverContextP ctx, struct i965_post_processing_con
int width[3], height[3], pitch[3], offset[3];
int src_width, src_height;
unsigned char *cc_ptr;
+ AVSState avs;
+ float sx, sy;
memset(pp_static_parameter, 0, sizeof(struct gen7_pp_static_parameter));
@@ -868,55 +879,75 @@ gen8_pp_plx_avs_initialize(VADriverContextP ctx, struct i965_post_processing_con
sampler_8x8->dw15.s1u = 113; /* s1u = 0 */
sampler_8x8->dw15.s2u = 1203; /* s2u = 0 */
- for (i = 0; i < 17; i++) {
- struct gen8_sampler_8x8_avs_coefficients * const sampler_8x8_state =
- &sampler_8x8->coefficients[i];
-
- float coff;
- coff = i;
- coff = coff / 16;
+ avs_init_state(&avs, &gen8_avs_config);
- sampler_8x8_state->dw0.table_0x_filter_c0 = 0;
- sampler_8x8_state->dw0.table_0y_filter_c0 = 0;
- sampler_8x8_state->dw0.table_0x_filter_c1 = 0;
- sampler_8x8_state->dw0.table_0y_filter_c1 = 0;
+ sx = (float)dst_rect->width / src_rect->width;
+ sy = (float)dst_rect->height / src_rect->height;
+ avs_update_coefficients(&avs, sx, sy, 0);
- sampler_8x8_state->dw1.table_0x_filter_c2 = 0;
- sampler_8x8_state->dw1.table_0y_filter_c2 = 0;
+ assert(avs.config->num_phases == 16);
+ for (i = 0; i <= 16; i++) {
+ struct gen8_sampler_8x8_avs_coefficients * const sampler_8x8_state =
+ &sampler_8x8->coefficients[i];
+ const AVSCoeffs * const coeffs = &avs.coeffs[i];
+
+ sampler_8x8_state->dw0.table_0x_filter_c0 =
+ intel_format_convert(coeffs->y_k_h[0], 1, 6, 1);
+ sampler_8x8_state->dw0.table_0y_filter_c0 =
+ intel_format_convert(coeffs->y_k_v[0], 1, 6, 1);
+ sampler_8x8_state->dw0.table_0x_filter_c1 =
+ intel_format_convert(coeffs->y_k_h[1], 1, 6, 1);
+ sampler_8x8_state->dw0.table_0y_filter_c1 =
+ intel_format_convert(coeffs->y_k_v[1], 1, 6, 1);
+
+ sampler_8x8_state->dw1.table_0x_filter_c2 =
+ intel_format_convert(coeffs->y_k_h[2], 1, 6, 1);
+ sampler_8x8_state->dw1.table_0y_filter_c2 =
+ intel_format_convert(coeffs->y_k_v[2], 1, 6, 1);
sampler_8x8_state->dw1.table_0x_filter_c3 =
- intel_format_convert(1 - coff, 1, 6, 0);
+ intel_format_convert(coeffs->y_k_h[3], 1, 6, 1);
sampler_8x8_state->dw1.table_0y_filter_c3 =
- intel_format_convert(1 - coff, 1, 6, 0);
+ intel_format_convert(coeffs->y_k_v[3], 1, 6, 1);
sampler_8x8_state->dw2.table_0x_filter_c4 =
- intel_format_convert(coff, 1, 6, 0);
+ intel_format_convert(coeffs->y_k_h[4], 1, 6, 1);
sampler_8x8_state->dw2.table_0y_filter_c4 =
- intel_format_convert(coff, 1, 6, 0);
- sampler_8x8_state->dw2.table_0x_filter_c5 = 0;
- sampler_8x8_state->dw2.table_0y_filter_c5 = 0;
-
- sampler_8x8_state->dw3.table_0x_filter_c6 = 0;
- sampler_8x8_state->dw3.table_0y_filter_c6 = 0;
- sampler_8x8_state->dw3.table_0x_filter_c7 = 0;
- sampler_8x8_state->dw3.table_0y_filter_c7 = 0;
+ intel_format_convert(coeffs->y_k_v[4], 1, 6, 1);
+ sampler_8x8_state->dw2.table_0x_filter_c5 =
+ intel_format_convert(coeffs->y_k_h[5], 1, 6, 1);
+ sampler_8x8_state->dw2.table_0y_filter_c5 =
+ intel_format_convert(coeffs->y_k_v[5], 1, 6, 1);
+
+ sampler_8x8_state->dw3.table_0x_filter_c6 =
+ intel_format_convert(coeffs->y_k_h[6], 1, 6, 1);
+ sampler_8x8_state->dw3.table_0y_filter_c6 =
+ intel_format_convert(coeffs->y_k_v[6], 1, 6, 1);
+ sampler_8x8_state->dw3.table_0x_filter_c7 =
+ intel_format_convert(coeffs->y_k_h[7], 1, 6, 1);
+ sampler_8x8_state->dw3.table_0y_filter_c7 =
+ intel_format_convert(coeffs->y_k_v[7], 1, 6, 1);
sampler_8x8_state->dw4.pad0 = 0;
sampler_8x8_state->dw5.pad0 = 0;
- sampler_8x8_state->dw4.table_1x_filter_c2 = 0;
+ sampler_8x8_state->dw4.table_1x_filter_c2 =
+ intel_format_convert(coeffs->uv_k_h[0], 1, 6, 1);
sampler_8x8_state->dw4.table_1x_filter_c3 =
- intel_format_convert(1 - coff, 1, 6, 0);
+ intel_format_convert(coeffs->uv_k_h[1], 1, 6, 1);
sampler_8x8_state->dw5.table_1x_filter_c4 =
- intel_format_convert(coff, 1, 6, 0);
- sampler_8x8_state->dw5.table_1x_filter_c5 = 0;
-
- sampler_8x8_state->dw6.pad0 = 0;
- sampler_8x8_state->dw7.pad0 = 0;
- sampler_8x8_state->dw6.table_1y_filter_c2 = 0;
+ intel_format_convert(coeffs->uv_k_h[2], 1, 6, 1);
+ sampler_8x8_state->dw5.table_1x_filter_c5 =
+ intel_format_convert(coeffs->uv_k_h[3], 1, 6, 1);
+
+ sampler_8x8_state->dw6.pad0 =
+ sampler_8x8_state->dw7.pad0 =
+ sampler_8x8_state->dw6.table_1y_filter_c2 =
+ intel_format_convert(coeffs->uv_k_v[0], 1, 6, 1);
sampler_8x8_state->dw6.table_1y_filter_c3 =
- intel_format_convert(1 - coff, 1, 6, 0);
+ intel_format_convert(coeffs->uv_k_v[1], 1, 6, 1);
sampler_8x8_state->dw7.table_1y_filter_c4 =
- intel_format_convert(coff, 1, 6, 0);
- sampler_8x8_state->dw7.table_1y_filter_c5 = 0;
+ intel_format_convert(coeffs->uv_k_v[2], 1, 6, 1);
+ sampler_8x8_state->dw7.table_1y_filter_c5 =
+ intel_format_convert(coeffs->uv_k_v[3], 1, 6, 1);
}
sampler_8x8->dw152.default_sharpness_level = 0;