diff options
Diffstat (limited to 'src/gen9_post_processing.c')
-rw-r--r-- | src/gen9_post_processing.c | 1183 |
1 files changed, 0 insertions, 1183 deletions
diff --git a/src/gen9_post_processing.c b/src/gen9_post_processing.c deleted file mode 100644 index 88d092b..0000000 --- a/src/gen9_post_processing.c +++ /dev/null @@ -1,1183 +0,0 @@ -/* - * Copyright © 2014 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#include "intel_batchbuffer.h" -#include "intel_driver.h" -#include "i965_defines.h" -#include "i965_structs.h" -#include "i965_drv_video.h" -#include "i965_post_processing.h" -#include "i965_render.h" -#include "intel_media.h" - -#include "gen8_post_processing.h" -#include "gen75_picture_process.h" -#include "intel_gen_vppapi.h" -#include "intel_common_vpp_internal.h" - -static const uint32_t pp_null_gen9[][4] = { -}; - -static const uint32_t pp_nv12_load_save_nv12_gen9[][4] = { -#include "shaders/post_processing/gen9/pl2_to_pl2.g9b" -}; - -static const uint32_t pp_nv12_load_save_pl3_gen9[][4] = { -#include "shaders/post_processing/gen9/pl2_to_pl3.g9b" -}; - -static const uint32_t pp_pl3_load_save_nv12_gen9[][4] = { -#include "shaders/post_processing/gen9/pl3_to_pl2.g9b" -}; - -static const uint32_t pp_pl3_load_save_pl3_gen9[][4] = { -#include "shaders/post_processing/gen9/pl3_to_pl3.g9b" -}; - -static const uint32_t pp_nv12_scaling_gen9[][4] = { -#include "shaders/post_processing/gen9/pl2_to_pl2.g9b" -}; - -static const uint32_t pp_nv12_avs_gen9[][4] = { -#include "shaders/post_processing/gen9/pl2_to_pl2.g9b" -}; - -static const uint32_t pp_nv12_dndi_gen9[][4] = { -}; - -static const uint32_t pp_nv12_dn_gen9[][4] = { -}; - -static const uint32_t pp_nv12_load_save_pa_gen9[][4] = { -#include "shaders/post_processing/gen9/pl2_to_pa.g9b" -}; - -static const uint32_t pp_pl3_load_save_pa_gen9[][4] = { -#include "shaders/post_processing/gen9/pl3_to_pa.g9b" -}; - -static const uint32_t pp_pa_load_save_nv12_gen9[][4] = { -#include "shaders/post_processing/gen9/pa_to_pl2.g9b" -}; - -static const uint32_t pp_pa_load_save_pl3_gen9[][4] = { -#include "shaders/post_processing/gen9/pa_to_pl3.g9b" -}; - -static const uint32_t pp_pa_load_save_pa_gen9[][4] = { -#include "shaders/post_processing/gen9/pa_to_pa.g9b" -}; - -static const uint32_t pp_rgbx_load_save_nv12_gen9[][4] = { -#include "shaders/post_processing/gen9/rgbx_to_nv12.g9b" -}; - -static const uint32_t pp_nv12_load_save_rgbx_gen9[][4] = { -#include "shaders/post_processing/gen9/pl2_to_rgbx.g9b" -}; - -static const uint32_t pp_nv12_blending_gen9[][4] = { -}; - -#define MAX_SCALING_SURFACES 16 - -#define DEFAULT_MOCS 0x02 - -static const uint32_t pp_10bit_scaling_gen9[][4] = { -#include "shaders/post_processing/gen9/conv_p010.g9b" -}; - -static const uint32_t pp_yuv420p8_scaling_gen9[][4] = { -#include "shaders/post_processing/gen9/conv_nv12.g9b" -}; - -static struct pp_module pp_modules_gen9[] = { - { - { - "NULL module (for testing)", - PP_NULL, - pp_null_gen9, - sizeof(pp_null_gen9), - NULL, - }, - - pp_null_initialize, - }, - - { - { - "NV12_NV12", - PP_NV12_LOAD_SAVE_N12, - pp_nv12_load_save_nv12_gen9, - sizeof(pp_nv12_load_save_nv12_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "NV12_PL3", - PP_NV12_LOAD_SAVE_PL3, - pp_nv12_load_save_pl3_gen9, - sizeof(pp_nv12_load_save_pl3_gen9), - NULL, - }, - gen8_pp_plx_avs_initialize, - }, - - { - { - "PL3_NV12", - PP_PL3_LOAD_SAVE_N12, - pp_pl3_load_save_nv12_gen9, - sizeof(pp_pl3_load_save_nv12_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "PL3_PL3", - PP_PL3_LOAD_SAVE_PL3, - pp_pl3_load_save_pl3_gen9, - sizeof(pp_pl3_load_save_pl3_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "NV12 Scaling module", - PP_NV12_SCALING, - pp_nv12_scaling_gen9, - sizeof(pp_nv12_scaling_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "NV12 AVS module", - PP_NV12_AVS, - pp_nv12_avs_gen9, - sizeof(pp_nv12_avs_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "NV12 DNDI module", - PP_NV12_DNDI, - pp_nv12_dndi_gen9, - sizeof(pp_nv12_dndi_gen9), - NULL, - }, - - pp_null_initialize, - }, - - { - { - "NV12 DN module", - PP_NV12_DN, - pp_nv12_dn_gen9, - sizeof(pp_nv12_dn_gen9), - NULL, - }, - - pp_null_initialize, - }, - { - { - "NV12_PA module", - PP_NV12_LOAD_SAVE_PA, - pp_nv12_load_save_pa_gen9, - sizeof(pp_nv12_load_save_pa_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "PL3_PA module", - PP_PL3_LOAD_SAVE_PA, - pp_pl3_load_save_pa_gen9, - sizeof(pp_pl3_load_save_pa_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "PA_NV12 module", - PP_PA_LOAD_SAVE_NV12, - pp_pa_load_save_nv12_gen9, - sizeof(pp_pa_load_save_nv12_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "PA_PL3 module", - PP_PA_LOAD_SAVE_PL3, - pp_pa_load_save_pl3_gen9, - sizeof(pp_pa_load_save_pl3_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "PA_PA module", - PP_PA_LOAD_SAVE_PA, - pp_pa_load_save_pa_gen9, - sizeof(pp_pa_load_save_pa_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "RGBX_NV12 module", - PP_RGBX_LOAD_SAVE_NV12, - pp_rgbx_load_save_nv12_gen9, - sizeof(pp_rgbx_load_save_nv12_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, - - { - { - "NV12_RGBX module", - PP_NV12_LOAD_SAVE_RGBX, - pp_nv12_load_save_rgbx_gen9, - sizeof(pp_nv12_load_save_rgbx_gen9), - NULL, - }, - - gen8_pp_plx_avs_initialize, - }, -}; - -static const AVSConfig gen9_avs_config = { - .coeff_frac_bits = 6, - .coeff_epsilon = 1.0f / (1U << 6), - .num_phases = 31, - .num_luma_coeffs = 8, - .num_chroma_coeffs = 4, - - .coeff_range = { - .lower_bound = { - .y_k_h = { -2, -2, -2, -2, -2, -2, -2, -2 }, - .y_k_v = { -2, -2, -2, -2, -2, -2, -2, -2 }, - .uv_k_h = { -2, -2, -2, -2 }, - .uv_k_v = { -2, -2, -2, -2 }, - }, - .upper_bound = { - .y_k_h = { 2, 2, 2, 2, 2, 2, 2, 2 }, - .y_k_v = { 2, 2, 2, 2, 2, 2, 2, 2 }, - .uv_k_h = { 2, 2, 2, 2 }, - .uv_k_v = { 2, 2, 2, 2 }, - }, - }, -}; - -static void -gen9_pp_pipeline_select(VADriverContextP ctx, - struct i965_post_processing_context *pp_context) -{ - struct intel_batchbuffer *batch = pp_context->batch; - - BEGIN_BATCH(batch, 1); - OUT_BATCH(batch, - CMD_PIPELINE_SELECT | - PIPELINE_SELECT_MEDIA | - GEN9_FORCE_MEDIA_AWAKE_ON | - GEN9_MEDIA_DOP_GATE_OFF | - GEN9_PIPELINE_SELECTION_MASK | - GEN9_MEDIA_DOP_GATE_MASK | - GEN9_FORCE_MEDIA_AWAKE_MASK); - ADVANCE_BATCH(batch); -} - -static void -gen9_pp_state_base_address(VADriverContextP ctx, - struct i965_post_processing_context *pp_context) -{ - struct intel_batchbuffer *batch = pp_context->batch; - - BEGIN_BATCH(batch, 19); - OUT_BATCH(batch, CMD_STATE_BASE_ADDRESS | (19 - 2)); - /* DW1 Generate state address */ - OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); - OUT_BATCH(batch, 0); - OUT_BATCH(batch, 0); - /* DW4-5 Surface state address */ - OUT_RELOC64(batch, pp_context->surface_state_binding_table.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, BASE_ADDRESS_MODIFY); /* Surface state base address */ - /* DW6-7 Dynamic state address */ - OUT_RELOC64(batch, pp_context->dynamic_state.bo, I915_GEM_DOMAIN_RENDER | I915_GEM_DOMAIN_SAMPLER, - 0, 0 | BASE_ADDRESS_MODIFY); - - /* DW8. Indirect object address */ - OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); - OUT_BATCH(batch, 0); - - /* DW10-11 Instruction base address */ - OUT_RELOC64(batch, pp_context->instruction_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, BASE_ADDRESS_MODIFY); - - OUT_BATCH(batch, 0xFFFF0000 | BASE_ADDRESS_MODIFY); - OUT_BATCH(batch, 0xFFFF0000 | BASE_ADDRESS_MODIFY); - OUT_BATCH(batch, 0xFFFF0000 | BASE_ADDRESS_MODIFY); - OUT_BATCH(batch, 0xFFFF0000 | BASE_ADDRESS_MODIFY); - - /* Bindless surface state base address */ - OUT_BATCH(batch, 0 | BASE_ADDRESS_MODIFY); - OUT_BATCH(batch, 0); - OUT_BATCH(batch, 0xfffff000); - - ADVANCE_BATCH(batch); -} - -static void -gen9_pp_end_pipeline(VADriverContextP ctx, - struct i965_post_processing_context *pp_context) -{ - struct intel_batchbuffer *batch = pp_context->batch; - - BEGIN_BATCH(batch, 1); - OUT_BATCH(batch, - CMD_PIPELINE_SELECT | - PIPELINE_SELECT_MEDIA | - GEN9_FORCE_MEDIA_AWAKE_OFF | - GEN9_MEDIA_DOP_GATE_ON | - GEN9_PIPELINE_SELECTION_MASK | - GEN9_MEDIA_DOP_GATE_MASK | - GEN9_FORCE_MEDIA_AWAKE_MASK); - ADVANCE_BATCH(batch); -} - -static void -gen9_pp_pipeline_setup(VADriverContextP ctx, - struct i965_post_processing_context *pp_context) -{ - struct intel_batchbuffer *batch = pp_context->batch; - - intel_batchbuffer_start_atomic(batch, 0x1000); - intel_batchbuffer_emit_mi_flush(batch); - gen9_pp_pipeline_select(ctx, pp_context); - gen9_pp_state_base_address(ctx, pp_context); - gen8_pp_vfe_state(ctx, pp_context); - gen8_pp_curbe_load(ctx, pp_context); - gen8_interface_descriptor_load(ctx, pp_context); - gen8_pp_object_walker(ctx, pp_context); - gen9_pp_end_pipeline(ctx, pp_context); - intel_batchbuffer_end_atomic(batch); -} - -static VAStatus -gen9_post_processing(VADriverContextP ctx, - struct i965_post_processing_context *pp_context, - const struct i965_surface *src_surface, - const VARectangle *src_rect, - struct i965_surface *dst_surface, - const VARectangle *dst_rect, - int pp_index, - void * filter_param) -{ - VAStatus va_status; - - va_status = gen8_pp_initialize(ctx, pp_context, - src_surface, - src_rect, - dst_surface, - dst_rect, - pp_index, - filter_param); - - if (va_status == VA_STATUS_SUCCESS) { - gen8_pp_states_setup(ctx, pp_context); - gen9_pp_pipeline_setup(ctx, pp_context); - } - - return va_status; -} - -static void -gen9_vpp_scaling_sample_state(VADriverContextP ctx, - struct i965_gpe_context *gpe_context, - VARectangle *src_rect, - VARectangle *dst_rect) -{ - struct gen8_sampler_state *sampler_state; - - if (gpe_context == NULL || !src_rect || !dst_rect) - return; - dri_bo_map(gpe_context->sampler.bo, 1); - - if (gpe_context->sampler.bo->virtual == NULL) - return; - - assert(gpe_context->sampler.bo->virtual); - - sampler_state = (struct gen8_sampler_state *) - (gpe_context->sampler.bo->virtual + gpe_context->sampler.offset); - - memset(sampler_state, 0, sizeof(*sampler_state)); - - if ((src_rect->width == dst_rect->width) && - (src_rect->height == dst_rect->height)) { - sampler_state->ss0.min_filter = I965_MAPFILTER_NEAREST; - sampler_state->ss0.mag_filter = I965_MAPFILTER_NEAREST; - } else { - sampler_state->ss0.min_filter = I965_MAPFILTER_LINEAR; - sampler_state->ss0.mag_filter = I965_MAPFILTER_LINEAR; - } - - sampler_state->ss3.r_wrap_mode = I965_TEXCOORDMODE_CLAMP; - sampler_state->ss3.s_wrap_mode = I965_TEXCOORDMODE_CLAMP; - sampler_state->ss3.t_wrap_mode = I965_TEXCOORDMODE_CLAMP; - - dri_bo_unmap(gpe_context->sampler.bo); -} - -void -gen9_post_processing_context_init(VADriverContextP ctx, - void *data, - struct intel_batchbuffer *batch) -{ - struct i965_driver_data *i965 = i965_driver_data(ctx); - struct i965_post_processing_context *pp_context = data; - struct i965_gpe_context *gpe_context; - struct i965_kernel scaling_kernel; - - gen8_post_processing_context_common_init(ctx, data, pp_modules_gen9, ARRAY_ELEMS(pp_modules_gen9), batch); - avs_init_state(&pp_context->pp_avs_context.state, &gen9_avs_config); - - pp_context->intel_post_processing = gen9_post_processing; - - gpe_context = &pp_context->scaling_10bit_context; - memset(&scaling_kernel, 0, sizeof(scaling_kernel)); - scaling_kernel.bin = pp_10bit_scaling_gen9; - scaling_kernel.size = sizeof(pp_10bit_scaling_gen9); - gen8_gpe_load_kernels(ctx, gpe_context, &scaling_kernel, 1); - gpe_context->idrt.entry_size = ALIGN(sizeof(struct gen8_interface_descriptor_data), 64); - gpe_context->idrt.max_entries = 1; - gpe_context->sampler.entry_size = ALIGN(sizeof(struct gen8_sampler_state), 64); - gpe_context->sampler.max_entries = 1; - gpe_context->curbe.length = ALIGN(sizeof(struct scaling_input_parameter), 64); - - gpe_context->surface_state_binding_table.max_entries = MAX_SCALING_SURFACES; - gpe_context->surface_state_binding_table.binding_table_offset = 0; - gpe_context->surface_state_binding_table.surface_state_offset = ALIGN(MAX_SCALING_SURFACES * 4, 64); - gpe_context->surface_state_binding_table.length = ALIGN(MAX_SCALING_SURFACES * 4, 64) + ALIGN(MAX_SCALING_SURFACES * SURFACE_STATE_PADDED_SIZE_GEN9, 64); - - if (i965->intel.eu_total > 0) { - gpe_context->vfe_state.max_num_threads = i965->intel.eu_total * 6; - } else { - if (i965->intel.has_bsd2) - gpe_context->vfe_state.max_num_threads = 300; - else - gpe_context->vfe_state.max_num_threads = 60; - } - - gpe_context->vfe_state.curbe_allocation_size = 37; - gpe_context->vfe_state.urb_entry_size = 16; - gpe_context->vfe_state.num_urb_entries = 127; - gpe_context->vfe_state.gpgpu_mode = 0; - - gen8_gpe_context_init(ctx, gpe_context); - pp_context->scaling_context_initialized = 1; - - /* initialize the YUV420 8-Bit scaling context. The below is supported. - * NV12 ->NV12 - * NV12 ->I420 - * I420 ->I420 - * I420 ->NV12 - */ - gpe_context = &pp_context->scaling_yuv420p8_context; - memset(&scaling_kernel, 0, sizeof(scaling_kernel)); - scaling_kernel.bin = pp_yuv420p8_scaling_gen9; - scaling_kernel.size = sizeof(pp_yuv420p8_scaling_gen9); - gen8_gpe_load_kernels(ctx, gpe_context, &scaling_kernel, 1); - gpe_context->idrt.entry_size = ALIGN(sizeof(struct gen8_interface_descriptor_data), 64); - gpe_context->idrt.max_entries = 1; - gpe_context->sampler.entry_size = ALIGN(sizeof(struct gen8_sampler_state), 64); - gpe_context->sampler.max_entries = 1; - gpe_context->curbe.length = ALIGN(sizeof(struct scaling_input_parameter), 32); - - gpe_context->surface_state_binding_table.max_entries = MAX_SCALING_SURFACES; - gpe_context->surface_state_binding_table.binding_table_offset = 0; - gpe_context->surface_state_binding_table.surface_state_offset = ALIGN(MAX_SCALING_SURFACES * 4, 64); - gpe_context->surface_state_binding_table.length = ALIGN(MAX_SCALING_SURFACES * 4, 64) + ALIGN(MAX_SCALING_SURFACES * SURFACE_STATE_PADDED_SIZE_GEN9, 64); - - if (i965->intel.eu_total > 0) { - gpe_context->vfe_state.max_num_threads = i965->intel.eu_total * 6; - } else { - if (i965->intel.has_bsd2) - gpe_context->vfe_state.max_num_threads = 300; - else - gpe_context->vfe_state.max_num_threads = 60; - } - - gpe_context->vfe_state.curbe_allocation_size = 37; - gpe_context->vfe_state.urb_entry_size = 16; - gpe_context->vfe_state.num_urb_entries = 127; - gpe_context->vfe_state.gpgpu_mode = 0; - - gen8_gpe_context_init(ctx, gpe_context); - pp_context->scaling_8bit_initialized = VPPGPE_8BIT_420; - return; -} - -static void -gen9_add_dri_buffer_2d_gpe_surface(VADriverContextP ctx, - struct i965_gpe_context *gpe_context, - dri_bo *bo, - unsigned int bo_offset, - unsigned int width, - unsigned int height, - unsigned int pitch, - int is_media_block_rw, - unsigned int format, - int index, - int is_10bit) -{ - struct i965_gpe_resource gpe_resource; - struct i965_gpe_surface gpe_surface; - - i965_dri_object_to_2d_gpe_resource(&gpe_resource, bo, width, height, pitch); - memset(&gpe_surface, 0, sizeof(gpe_surface)); - gpe_surface.gpe_resource = &gpe_resource; - gpe_surface.is_2d_surface = 1; - gpe_surface.is_media_block_rw = !!is_media_block_rw; - gpe_surface.cacheability_control = DEFAULT_MOCS; - gpe_surface.format = format; - gpe_surface.is_override_offset = 1; - gpe_surface.offset = bo_offset; - gpe_surface.is_16bpp = is_10bit; - - gen9_gpe_context_add_surface(gpe_context, &gpe_surface, index); - - i965_free_gpe_resource(&gpe_resource); -} - -static void -gen9_run_kernel_media_object_walker(VADriverContextP ctx, - struct intel_batchbuffer *batch, - struct i965_gpe_context *gpe_context, - struct gpe_media_object_walker_parameter *param) -{ - if (!batch || !gpe_context || !param) - return; - - intel_batchbuffer_start_atomic(batch, 0x1000); - - intel_batchbuffer_emit_mi_flush(batch); - - gen9_gpe_pipeline_setup(ctx, gpe_context, batch); - gen8_gpe_media_object_walker(ctx, gpe_context, batch, param); - gen8_gpe_media_state_flush(ctx, gpe_context, batch); - - gen9_gpe_pipeline_end(ctx, gpe_context, batch); - - intel_batchbuffer_end_atomic(batch); - - intel_batchbuffer_flush(batch); - return; -} - -static unsigned int -pp_get_surface_fourcc(VADriverContextP ctx, struct i965_surface *surface) -{ - unsigned int fourcc; - - if (surface->type == I965_SURFACE_TYPE_IMAGE) { - struct object_image *obj_image = (struct object_image *)surface->base; - fourcc = obj_image->image.format.fourcc; - } else { - struct object_surface *obj_surface = (struct object_surface *)surface->base; - fourcc = obj_surface->fourcc; - } - - return fourcc; -} - -static void -gen9_gpe_context_p010_scaling_curbe(VADriverContextP ctx, - struct i965_gpe_context *gpe_context, - VARectangle *src_rect, - struct i965_surface *src_surface, - VARectangle *dst_rect, - struct i965_surface *dst_surface) -{ - struct scaling_input_parameter *scaling_curbe; - float src_width, src_height; - float coeff; - unsigned int fourcc; - - if ((gpe_context == NULL) || - (src_rect == NULL) || (src_surface == NULL) || - (dst_rect == NULL) || (dst_surface == NULL)) - return; - - scaling_curbe = i965_gpe_context_map_curbe(gpe_context); - - if (!scaling_curbe) - return; - - memset(scaling_curbe, 0, sizeof(struct scaling_input_parameter)); - - scaling_curbe->bti_input = BTI_SCALING_INPUT_Y; - scaling_curbe->bti_output = BTI_SCALING_OUTPUT_Y; - - /* As the src_rect/dst_rect is already checked, it is skipped.*/ - scaling_curbe->x_dst = dst_rect->x; - scaling_curbe->y_dst = dst_rect->y; - - src_width = src_rect->x + src_rect->width; - src_height = src_rect->y + src_rect->height; - - scaling_curbe->inv_width = 1 / src_width; - scaling_curbe->inv_height = 1 / src_height; - - coeff = (float) (src_rect->width) / dst_rect->width; - scaling_curbe->x_factor = coeff / src_width; - scaling_curbe->x_orig = (float)(src_rect->x) / src_width; - - coeff = (float) (src_rect->height) / dst_rect->height; - scaling_curbe->y_factor = coeff / src_height; - scaling_curbe->y_orig = (float)(src_rect->y) / src_height; - - fourcc = pp_get_surface_fourcc(ctx, src_surface); - if (fourcc == VA_FOURCC_P010) { - scaling_curbe->dw7.src_packed = 1; - scaling_curbe->dw7.src_msb = 1; - } - /* I010 will use LSB */ - - fourcc = pp_get_surface_fourcc(ctx, dst_surface); - - if (fourcc == VA_FOURCC_P010) { - scaling_curbe->dw7.dst_packed = 1; - scaling_curbe->dw7.dst_msb = 1; - } - /* I010 will use LSB */ - - i965_gpe_context_unmap_curbe(gpe_context); -} - -static bool -gen9_pp_context_get_surface_conf(VADriverContextP ctx, - struct i965_surface *surface, - VARectangle *rect, - int *width, - int *height, - int *pitch, - int *bo_offset) -{ - unsigned int fourcc; - if (!rect || !surface || !width || !height || !pitch || !bo_offset) - return false; - - if (surface->base == NULL) - return false; - - fourcc = pp_get_surface_fourcc(ctx, surface); - if (surface->type == I965_SURFACE_TYPE_SURFACE) { - struct object_surface *obj_surface; - - obj_surface = (struct object_surface *)surface->base; - width[0] = MIN(rect->x + rect->width, obj_surface->orig_width); - height[0] = MIN(rect->y + rect->height, obj_surface->orig_height); - pitch[0] = obj_surface->width; - bo_offset[0] = 0; - - if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) { - width[1] = width[0] / 2; - height[1] = height[0] / 2; - pitch[1] = obj_surface->cb_cr_pitch; - bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset; - } else { - /* I010/I420 format */ - width[1] = width[0] / 2; - height[1] = height[0] / 2; - pitch[1] = obj_surface->cb_cr_pitch; - bo_offset[1] = obj_surface->width * obj_surface->y_cb_offset; - width[2] = width[0] / 2; - height[2] = height[0] / 2; - pitch[2] = obj_surface->cb_cr_pitch; - bo_offset[2] = obj_surface->width * obj_surface->y_cr_offset; - } - - } else { - struct object_image *obj_image; - - obj_image = (struct object_image *)surface->base; - - width[0] = MIN(rect->x + rect->width, obj_image->image.width); - height[0] = MIN(rect->y + rect->height, obj_image->image.height); - pitch[0] = obj_image->image.pitches[0]; - bo_offset[0] = obj_image->image.offsets[0]; - - if (fourcc == VA_FOURCC_P010 || fourcc == VA_FOURCC_NV12) { - width[1] = width[0] / 2; - height[1] = height[0] / 2; - pitch[1] = obj_image->image.pitches[1]; - bo_offset[1] = obj_image->image.offsets[1]; - } else { - /* I010/I420 format */ - width[1] = width[0] / 2; - height[1] = height[0] / 2; - pitch[1] = obj_image->image.pitches[1]; - bo_offset[1] = obj_image->image.offsets[1]; - width[2] = width[0] / 2; - height[2] = height[0] / 2; - pitch[2] = obj_image->image.pitches[2]; - bo_offset[2] = obj_image->image.offsets[2]; - } - - } - - return true; -} - -static void -gen9_gpe_context_p010_scaling_surfaces(VADriverContextP ctx, - struct i965_gpe_context *gpe_context, - VARectangle *src_rect, - struct i965_surface *src_surface, - VARectangle *dst_rect, - struct i965_surface *dst_surface) -{ - unsigned int fourcc; - int width[3], height[3], pitch[3], bo_offset[3]; - dri_bo *bo; - struct object_surface *obj_surface; - struct object_image *obj_image; - int bti; - - if ((gpe_context == NULL) || - (src_rect == NULL) || (src_surface == NULL) || - (dst_rect == NULL) || (dst_surface == NULL)) - return; - - if (src_surface->base == NULL || dst_surface->base == NULL) - return; - - fourcc = pp_get_surface_fourcc(ctx, src_surface); - - if (src_surface->type == I965_SURFACE_TYPE_SURFACE) { - obj_surface = (struct object_surface *)src_surface->base; - bo = obj_surface->bo; - } else { - obj_image = (struct object_image *)src_surface->base; - bo = obj_image->bo; - } - - bti = 0; - if (gen9_pp_context_get_surface_conf(ctx, src_surface, src_rect, - width, height, pitch, - bo_offset)) { - bti = BTI_SCALING_INPUT_Y; - /* Input surface */ - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[0], - width[0], height[0], - pitch[0], 0, - I965_SURFACEFORMAT_R16_UNORM, - bti, 1); - if (fourcc == VA_FOURCC_P010) { - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[1], - width[1], height[1], - pitch[1], 0, - I965_SURFACEFORMAT_R16G16_UNORM, - bti + 1, 1); - } else { - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[1], - width[1], height[1], - pitch[1], 0, - I965_SURFACEFORMAT_R16_UNORM, - bti + 1, 1); - - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[2], - width[2], height[2], - pitch[2], 0, - I965_SURFACEFORMAT_R16_UNORM, - bti + 2, 1); - } - } - - fourcc = pp_get_surface_fourcc(ctx, dst_surface); - - if (dst_surface->type == I965_SURFACE_TYPE_SURFACE) { - obj_surface = (struct object_surface *)dst_surface->base; - bo = obj_surface->bo; - } else { - obj_image = (struct object_image *)dst_surface->base; - bo = obj_image->bo; - } - - if (gen9_pp_context_get_surface_conf(ctx, dst_surface, dst_rect, - width, height, pitch, - bo_offset)) { - bti = BTI_SCALING_OUTPUT_Y; - /* Input surface */ - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[0], - width[0], height[0], - pitch[0], 1, - I965_SURFACEFORMAT_R16_UINT, - bti, 1); - if (fourcc == VA_FOURCC_P010) { - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[1], - width[1] * 2, height[1], - pitch[1], 1, - I965_SURFACEFORMAT_R16_UINT, - bti + 1, 1); - } else { - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[1], - width[1], height[1], - pitch[1], 1, - I965_SURFACEFORMAT_R16_UINT, - bti + 1, 1); - - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[2], - width[2], height[2], - pitch[2], 1, - I965_SURFACEFORMAT_R16_UINT, - bti + 2, 1); - } - } - - return; -} - -VAStatus -gen9_p010_scaling_post_processing( - VADriverContextP ctx, - struct i965_post_processing_context *pp_context, - struct i965_surface *src_surface, - VARectangle *src_rect, - struct i965_surface *dst_surface, - VARectangle *dst_rect) -{ - struct i965_gpe_context *gpe_context; - struct gpe_media_object_walker_parameter media_object_walker_param; - struct intel_vpp_kernel_walker_parameter kernel_walker_param; - - if (!pp_context || !src_surface || !src_rect || !dst_surface || !dst_rect) - return VA_STATUS_ERROR_INVALID_PARAMETER; - - if (!pp_context->scaling_context_initialized) - return VA_STATUS_ERROR_UNIMPLEMENTED; - - gpe_context = &pp_context->scaling_10bit_context; - - gen8_gpe_context_init(ctx, gpe_context); - gen9_vpp_scaling_sample_state(ctx, gpe_context, src_rect, dst_rect); - gen9_gpe_reset_binding_table(ctx, gpe_context); - gen9_gpe_context_p010_scaling_curbe(ctx, gpe_context, - src_rect, src_surface, - dst_rect, dst_surface); - - gen9_gpe_context_p010_scaling_surfaces(ctx, gpe_context, - src_rect, src_surface, - dst_rect, dst_surface); - - gen8_gpe_setup_interface_data(ctx, gpe_context); - - memset(&kernel_walker_param, 0, sizeof(kernel_walker_param)); - kernel_walker_param.resolution_x = ALIGN(dst_rect->width, 16) >> 4; - kernel_walker_param.resolution_y = ALIGN(dst_rect->height, 16) >> 4; - kernel_walker_param.no_dependency = 1; - - intel_vpp_init_media_object_walker_parameter(&kernel_walker_param, &media_object_walker_param); - - gen9_run_kernel_media_object_walker(ctx, pp_context->batch, - gpe_context, - &media_object_walker_param); - - return VA_STATUS_SUCCESS; -} - -static void -gen9_gpe_context_yuv420p8_scaling_curbe(VADriverContextP ctx, - struct i965_gpe_context *gpe_context, - VARectangle *src_rect, - struct i965_surface *src_surface, - VARectangle *dst_rect, - struct i965_surface *dst_surface) -{ - struct scaling_input_parameter *scaling_curbe; - float src_width, src_height; - float coeff; - unsigned int fourcc; - - if ((gpe_context == NULL) || - (src_rect == NULL) || (src_surface == NULL) || - (dst_rect == NULL) || (dst_surface == NULL)) - return; - - scaling_curbe = i965_gpe_context_map_curbe(gpe_context); - - if (!scaling_curbe) - return; - - memset(scaling_curbe, 0, sizeof(struct scaling_input_parameter)); - - scaling_curbe->bti_input = BTI_SCALING_INPUT_Y; - scaling_curbe->bti_output = BTI_SCALING_OUTPUT_Y; - - /* As the src_rect/dst_rect is already checked, it is skipped.*/ - scaling_curbe->x_dst = dst_rect->x; - scaling_curbe->y_dst = dst_rect->y; - - src_width = src_rect->x + src_rect->width; - src_height = src_rect->y + src_rect->height; - - scaling_curbe->inv_width = 1 / src_width; - scaling_curbe->inv_height = 1 / src_height; - - coeff = (float) (src_rect->width) / dst_rect->width; - scaling_curbe->x_factor = coeff / src_width; - scaling_curbe->x_orig = (float)(src_rect->x) / src_width; - - coeff = (float) (src_rect->height) / dst_rect->height; - scaling_curbe->y_factor = coeff / src_height; - scaling_curbe->y_orig = (float)(src_rect->y) / src_height; - - fourcc = pp_get_surface_fourcc(ctx, src_surface); - if (fourcc == VA_FOURCC_NV12) { - scaling_curbe->dw7.src_packed = 1; - } - - fourcc = pp_get_surface_fourcc(ctx, dst_surface); - - if (fourcc == VA_FOURCC_NV12) { - scaling_curbe->dw7.dst_packed = 1; - } - - i965_gpe_context_unmap_curbe(gpe_context); -} - -static void -gen9_gpe_context_yuv420p8_scaling_surfaces(VADriverContextP ctx, - struct i965_gpe_context *gpe_context, - VARectangle *src_rect, - struct i965_surface *src_surface, - VARectangle *dst_rect, - struct i965_surface *dst_surface) -{ - unsigned int fourcc; - int width[3], height[3], pitch[3], bo_offset[3]; - dri_bo *bo; - struct object_surface *obj_surface; - struct object_image *obj_image; - int bti; - - if ((gpe_context == NULL) || - (src_rect == NULL) || (src_surface == NULL) || - (dst_rect == NULL) || (dst_surface == NULL)) - return; - - if (src_surface->base == NULL || dst_surface->base == NULL) - return; - - fourcc = pp_get_surface_fourcc(ctx, src_surface); - - if (src_surface->type == I965_SURFACE_TYPE_SURFACE) { - obj_surface = (struct object_surface *)src_surface->base; - bo = obj_surface->bo; - } else { - obj_image = (struct object_image *)src_surface->base; - bo = obj_image->bo; - } - - bti = 0; - if (gen9_pp_context_get_surface_conf(ctx, src_surface, src_rect, - width, height, pitch, - bo_offset)) { - bti = BTI_SCALING_INPUT_Y; - /* Input surface */ - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[0], - width[0], height[0], - pitch[0], 0, - I965_SURFACEFORMAT_R8_UNORM, - bti, 0); - if (fourcc == VA_FOURCC_NV12) { - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[1], - width[1], height[1], - pitch[1], 0, - I965_SURFACEFORMAT_R8G8_UNORM, - bti + 1, 0); - } else { - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[1], - width[1], height[1], - pitch[1], 0, - I965_SURFACEFORMAT_R8_UNORM, - bti + 1, 0); - - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[2], - width[2], height[2], - pitch[2], 0, - I965_SURFACEFORMAT_R8_UNORM, - bti + 2, 0); - } - } - - fourcc = pp_get_surface_fourcc(ctx, dst_surface); - - if (dst_surface->type == I965_SURFACE_TYPE_SURFACE) { - obj_surface = (struct object_surface *)dst_surface->base; - bo = obj_surface->bo; - } else { - obj_image = (struct object_image *)dst_surface->base; - bo = obj_image->bo; - } - - if (gen9_pp_context_get_surface_conf(ctx, dst_surface, dst_rect, - width, height, pitch, - bo_offset)) { - bti = BTI_SCALING_OUTPUT_Y; - /* Input surface */ - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[0], - width[0], height[0], - pitch[0], 1, - I965_SURFACEFORMAT_R8_UINT, - bti, 0); - if (fourcc == VA_FOURCC_NV12) { - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[1], - width[1] * 2, height[1], - pitch[1], 1, - I965_SURFACEFORMAT_R16_UINT, - bti + 1, 0); - } else { - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[1], - width[1], height[1], - pitch[1], 1, - I965_SURFACEFORMAT_R8_UINT, - bti + 1, 0); - - gen9_add_dri_buffer_2d_gpe_surface(ctx, gpe_context, bo, - bo_offset[2], - width[2], height[2], - pitch[2], 1, - I965_SURFACEFORMAT_R8_UINT, - bti + 2, 0); - } - } - - return; -} - -VAStatus -gen9_yuv420p8_scaling_post_processing( - VADriverContextP ctx, - struct i965_post_processing_context *pp_context, - struct i965_surface *src_surface, - VARectangle *src_rect, - struct i965_surface *dst_surface, - VARectangle *dst_rect) -{ - struct i965_gpe_context *gpe_context; - struct gpe_media_object_walker_parameter media_object_walker_param; - struct intel_vpp_kernel_walker_parameter kernel_walker_param; - - if (!pp_context || !src_surface || !src_rect || !dst_surface || !dst_rect) - return VA_STATUS_ERROR_INVALID_PARAMETER; - - if (!(pp_context->scaling_8bit_initialized & VPPGPE_8BIT_420)) - return VA_STATUS_ERROR_UNIMPLEMENTED; - - gpe_context = &pp_context->scaling_yuv420p8_context; - - gen8_gpe_context_init(ctx, gpe_context); - gen9_vpp_scaling_sample_state(ctx, gpe_context, src_rect, dst_rect); - gen9_gpe_reset_binding_table(ctx, gpe_context); - gen9_gpe_context_yuv420p8_scaling_curbe(ctx, gpe_context, - src_rect, src_surface, - dst_rect, dst_surface); - - gen9_gpe_context_yuv420p8_scaling_surfaces(ctx, gpe_context, - src_rect, src_surface, - dst_rect, dst_surface); - - gen8_gpe_setup_interface_data(ctx, gpe_context); - - memset(&kernel_walker_param, 0, sizeof(kernel_walker_param)); - kernel_walker_param.resolution_x = ALIGN(dst_rect->width, 16) >> 4; - kernel_walker_param.resolution_y = ALIGN(dst_rect->height, 16) >> 4; - kernel_walker_param.no_dependency = 1; - - intel_vpp_init_media_object_walker_parameter(&kernel_walker_param, &media_object_walker_param); - - gen9_run_kernel_media_object_walker(ctx, pp_context->batch, - gpe_context, - &media_object_walker_param); - - return VA_STATUS_SUCCESS; -} |