2 * Copyright © 2017 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWAR OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 * Chen, Peng <chen.c.peng@intel.com>
37 #include "intel_batchbuffer.h"
38 #include "intel_driver.h"
40 #include "i965_defines.h"
41 #include "i965_drv_video.h"
42 #include "i965_encoder.h"
43 #include "i965_encoder_common.h"
44 #include "i965_encoder_utils.h"
45 #include "i965_encoder_api.h"
46 #include "gen9_hevc_enc_kernels.h"
47 #include "gen9_hevc_enc_kernels_binary.h"
48 #include "gen9_hevc_enc_utils.h"
49 #include "gen9_hevc_encoder.h"
50 #include "gen9_hevc_enc_const_def.h"
52 static void *hevc_enc_kernel_ptr = NULL;
53 static int hevc_enc_kernel_size = 0;
56 gen9_hevc_get_kernel_header_and_size(void *pvbinary,
58 GEN9_ENC_OPERATION operation,
60 struct i965_kernel *ret_kernel)
62 typedef uint32_t BIN_PTR[4];
65 gen9_hevc_enc_kernels_header_bxt *pkh_table = NULL;
66 gen9_hevc_enc_kernel_header *pcurr_header = NULL, *pinvalid_entry, *pnext_header;
69 if (!pvbinary || !ret_kernel)
72 bin_start = (char *)pvbinary;
73 pkh_table = (gen9_hevc_enc_kernels_header_bxt *)pvbinary;
74 pinvalid_entry = (gen9_hevc_enc_kernel_header *)(pkh_table + 1);
75 next_krnoffset = binary_size;
78 case GEN9_ENC_SCALING2X:
79 pcurr_header = &pkh_table->HEVC_ENC_I_2xDownSampling_Kernel;
81 case GEN9_ENC_SCALING4X:
82 pcurr_header = &pkh_table->HEVC_ENC_I_DS4HME;
86 pcurr_header = &pkh_table->HEVC_ENC_P_HME;
88 pcurr_header = &pkh_table->HEVC_ENC_B_HME;
91 switch (krnstate_idx) {
92 case GEN9_HEVC_ENC_BRC_COARSE_INTRA:
93 pcurr_header = &pkh_table->HEVC_ENC_I_COARSE;
95 case GEN9_HEVC_ENC_BRC_INIT:
96 pcurr_header = &pkh_table->HEVC_ENC_BRC_Init;
98 case GEN9_HEVC_ENC_BRC_RESET:
99 pcurr_header = &pkh_table->HEVC_ENC_BRC_Reset;
101 case GEN9_HEVC_ENC_BRC_FRAME_UPDATE:
102 pcurr_header = &pkh_table->HEVC_ENC_BRC_Update;
104 case GEN9_HEVC_ENC_BRC_LCU_UPDATE:
105 pcurr_header = &pkh_table->HEVC_ENC_BRC_LCU_Update;
112 switch (krnstate_idx) {
113 case GEN9_HEVC_ENC_MBENC_2xSCALING:
114 case GEN9_HEVC_ENC_MBENC_32x32MD:
115 case GEN9_HEVC_ENC_MBENC_16x16SAD:
116 case GEN9_HEVC_ENC_MBENC_16x16MD:
117 case GEN9_HEVC_ENC_MBENC_8x8PU:
118 case GEN9_HEVC_ENC_MBENC_8x8FMODE:
119 case GEN9_HEVC_ENC_MBENC_32x32INTRACHECK:
120 case GEN9_HEVC_ENC_MBENC_BENC:
121 pcurr_header = &pkh_table->HEVC_ENC_I_2xDownSampling_Kernel;
122 pcurr_header += krnstate_idx;
124 case GEN9_HEVC_ENC_MBENC_BPAK:
125 pcurr_header = &pkh_table->HEVC_ENC_PB_Pak;
127 case GEN9_HEVC_ENC_MBENC_WIDI:
128 pcurr_header = &pkh_table->HEVC_ENC_PB_Widi;
130 case GEN9_HEVC_MBENC_PENC:
131 pcurr_header = &pkh_table->HEVC_ENC_P_MB;
133 case GEN9_HEVC_MBENC_P_WIDI:
134 pcurr_header = &pkh_table->HEVC_ENC_P_Widi;
136 case GEN9_HEVC_ENC_MBENC_DS_COMBINED:
137 pcurr_header = &pkh_table->HEVC_ENC_DS_Combined;
148 ((pcurr_header->kernel_start_pointer << 6) >= binary_size))
151 ret_kernel->bin = (const BIN_PTR *)(bin_start + (pcurr_header->kernel_start_pointer << 6));
153 pnext_header = (pcurr_header + 1);
154 if (pnext_header < pinvalid_entry)
155 next_krnoffset = pnext_header->kernel_start_pointer << 6;
157 ret_kernel->size = next_krnoffset - (pcurr_header->kernel_start_pointer << 6);
163 gen9_hevc_store_reg_mem(VADriverContextP ctx,
164 struct intel_batchbuffer *batch,
167 unsigned int mmio_offset)
169 struct gpe_mi_store_register_mem_parameter mi_store_reg_mem_param;
171 memset((void *)&mi_store_reg_mem_param, 0,
172 sizeof(mi_store_reg_mem_param));
173 mi_store_reg_mem_param.bo = bo;
174 mi_store_reg_mem_param.offset = offset;
175 mi_store_reg_mem_param.mmio_offset = mmio_offset;
176 gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
180 gen9_hevc_load_reg_mem(VADriverContextP ctx,
181 struct intel_batchbuffer *batch,
184 unsigned int mmio_offset)
186 struct gpe_mi_load_register_mem_parameter mi_load_reg_mem_param;
188 memset((void *)&mi_load_reg_mem_param, 0,
189 sizeof(mi_load_reg_mem_param));
190 mi_load_reg_mem_param.bo = bo;
191 mi_load_reg_mem_param.offset = offset;
192 mi_load_reg_mem_param.mmio_offset = mmio_offset;
193 gen8_gpe_mi_load_register_mem(ctx, batch, &mi_load_reg_mem_param);
197 gen9_hevc_conditional_end(VADriverContextP ctx,
198 struct intel_batchbuffer *batch,
203 struct gpe_mi_conditional_batch_buffer_end_parameter mi_cond_end;
205 memset(&mi_cond_end, 0, sizeof(mi_cond_end));
206 mi_cond_end.offset = offset;
208 mi_cond_end.compare_data = data;
209 mi_cond_end.compare_mask_mode_disabled = 0;
210 gen9_gpe_mi_conditional_batch_buffer_end(ctx, batch,
215 gen9_hevc_ensure_surface(VADriverContextP ctx,
216 struct gen9_hevc_encoder_state *priv_state,
217 struct object_surface *obj_surface,
220 VAStatus va_status = VA_STATUS_SUCCESS;
222 unsigned int fourcc = VA_FOURCC_NV12;
225 va_status = VA_STATUS_ERROR_INVALID_PARAMETER;
230 if ((priv_state->bit_depth_luma_minus8 > 0)
231 || (priv_state->bit_depth_chroma_minus8 > 0)) {
232 if (obj_surface->fourcc != VA_FOURCC_P010) {
234 fourcc = VA_FOURCC_P010;
236 } else if (obj_surface->fourcc != VA_FOURCC_NV12) {
238 fourcc = VA_FOURCC_NV12;
241 /* (Re-)allocate the underlying surface buffer store, if necessary */
242 if (!obj_surface->bo || update) {
243 if (reallocate_flag) {
244 struct i965_driver_data * const i965 = i965_driver_data(ctx);
246 i965_destroy_surface_storage(obj_surface);
248 va_status = i965_check_alloc_surface_bo(ctx,
250 i965->codec_info->has_tiled_surface,
254 va_status = VA_STATUS_ERROR_INVALID_PARAMETER;
262 gen9_hevc_free_surface_private(void **data)
264 struct gen9_hevc_surface_priv *surface_priv = NULL;
267 surface_priv = (struct gen9_hevc_surface_priv *)(*data);
271 for (i = 0; i < HEVC_SCALED_SURFS_NUM; i++) {
272 if (surface_priv->scaled_surface_obj[i]) {
273 i965_DestroySurfaces(surface_priv->ctx, &surface_priv->scaled_surface_id[i], 1);
274 surface_priv->scaled_surface_id[i] = VA_INVALID_SURFACE;
275 surface_priv->scaled_surface_obj[i] = NULL;
279 if (surface_priv->surface_obj_nv12) {
280 i965_DestroySurfaces(surface_priv->ctx, &surface_priv->surface_id_nv12, 1);
281 surface_priv->surface_id_nv12 = VA_INVALID_SURFACE;
282 surface_priv->surface_obj_nv12 = NULL;
285 if (surface_priv->motion_vector_temporal_bo)
286 dri_bo_unreference(surface_priv->motion_vector_temporal_bo);
292 gen9_hevc_init_surface_private(VADriverContextP ctx,
293 struct generic_enc_codec_state *generic_state,
294 struct gen9_hevc_encoder_state *priv_state,
295 struct object_surface *obj_surface)
297 struct i965_driver_data *i965 = i965_driver_data(ctx);
298 struct gen9_hevc_surface_priv *surface_priv = NULL;
301 if (!obj_surface || !obj_surface->bo)
302 return VA_STATUS_ERROR_INVALID_SURFACE;
304 if (obj_surface->private_data &&
305 obj_surface->free_private_data != gen9_hevc_free_surface_private) {
306 obj_surface->free_private_data(&obj_surface->private_data);
307 obj_surface->private_data = NULL;
310 if (obj_surface->private_data) {
311 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
313 surface_priv->surface_nv12_valid = 0;
315 surface_priv = calloc(1, sizeof(*surface_priv));
317 return VA_STATUS_ERROR_ALLOCATION_FAILED;
319 surface_priv->ctx = ctx;
320 surface_priv->surface_reff = obj_surface;
322 obj_surface->private_data = (void *)surface_priv;
323 obj_surface->free_private_data = gen9_hevc_free_surface_private;
325 // alloc motion vector temporal buffer
326 size = MAX(((priv_state->picture_width + 63) >> 6) *
327 ((priv_state->picture_height + 15) >> 4),
328 ((priv_state->picture_width + 31) >> 5) *
329 ((priv_state->picture_height + 31) >> 5));
330 size = ALIGN(size, 2) * 64;
331 surface_priv->motion_vector_temporal_bo =
332 dri_bo_alloc(i965->intel.bufmgr,
333 "motion vector temporal buffer",
336 if (!surface_priv->motion_vector_temporal_bo)
337 return VA_STATUS_ERROR_ALLOCATION_FAILED;
340 i965_CreateSurfaces(ctx,
341 priv_state->frame_width_4x,
342 priv_state->frame_height_4x,
345 &surface_priv->scaled_surface_id[HEVC_SCALED_SURF_4X_ID]);
347 surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID] =
348 SURFACE(surface_priv->scaled_surface_id[HEVC_SCALED_SURF_4X_ID]);
350 if (!surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID])
351 return VA_STATUS_ERROR_ALLOCATION_FAILED;
353 i965_check_alloc_surface_bo(ctx, surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID], 1,
354 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
356 if (generic_state->b16xme_supported) {
357 i965_CreateSurfaces(ctx,
358 priv_state->frame_width_16x,
359 priv_state->frame_height_16x,
362 &surface_priv->scaled_surface_id[HEVC_SCALED_SURF_16X_ID]);
363 surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_16X_ID] =
364 SURFACE(surface_priv->scaled_surface_id[HEVC_SCALED_SURF_16X_ID]);
366 if (!surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_16X_ID])
367 return VA_STATUS_ERROR_ALLOCATION_FAILED;
369 i965_check_alloc_surface_bo(ctx, surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_16X_ID], 1,
370 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
373 if (generic_state->b32xme_supported) {
374 i965_CreateSurfaces(ctx,
375 priv_state->frame_width_32x,
376 priv_state->frame_height_32x,
379 &surface_priv->scaled_surface_id[HEVC_SCALED_SURF_32X_ID]);
380 surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_32X_ID] =
381 SURFACE(surface_priv->scaled_surface_id[HEVC_SCALED_SURF_32X_ID]);
383 if (!surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_32X_ID])
384 return VA_STATUS_ERROR_ALLOCATION_FAILED;
386 i965_check_alloc_surface_bo(ctx, surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_32X_ID], 1,
387 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
390 if (obj_surface->fourcc == VA_FOURCC_P010) {
391 i965_CreateSurfaces(ctx,
392 priv_state->frame_width_in_max_lcu,
393 priv_state->frame_height_in_max_lcu,
396 &surface_priv->surface_id_nv12);
397 surface_priv->surface_obj_nv12 = SURFACE(surface_priv->surface_id_nv12);
399 if (!surface_priv->surface_obj_nv12)
400 return VA_STATUS_ERROR_ALLOCATION_FAILED;
402 i965_check_alloc_surface_bo(ctx, surface_priv->surface_obj_nv12, 1,
403 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
407 return VA_STATUS_SUCCESS;
411 gen9_hevc_enc_free_resources(struct encoder_vme_mfc_context *vme_context)
413 struct gen9_hevc_encoder_context *priv_ctx = NULL;
415 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
420 i965_free_gpe_resource(&priv_ctx->res_brc_pic_states_write_buffer);
421 i965_free_gpe_resource(&priv_ctx->res_brc_history_buffer);
422 i965_free_gpe_resource(&priv_ctx->res_brc_intra_dist_buffer);
423 i965_free_gpe_resource(&priv_ctx->res_brc_pak_statistic_buffer);
424 i965_free_gpe_resource(&priv_ctx->res_brc_input_buffer_for_enc_kernels);
425 i965_free_gpe_resource(&priv_ctx->res_brc_constant_data_buffer);
427 i965_free_gpe_resource(&priv_ctx->res_mb_code_surface);
430 i965_free_gpe_resource(&priv_ctx->res_flatness_check_surface);
431 i965_free_gpe_resource(&priv_ctx->res_brc_me_dist_buffer);
432 i965_free_gpe_resource(&priv_ctx->s4x_memv_distortion_buffer);
433 i965_free_gpe_resource(&priv_ctx->s4x_memv_data_buffer);
434 i965_free_gpe_resource(&priv_ctx->s16x_memv_data_buffer);
435 i965_free_gpe_resource(&priv_ctx->s32x_memv_data_buffer);
436 i965_free_gpe_resource(&priv_ctx->res_32x32_pu_output_buffer);
437 i965_free_gpe_resource(&priv_ctx->res_simplest_intra_buffer);
438 i965_free_gpe_resource(&priv_ctx->res_kernel_debug);
439 i965_free_gpe_resource(&priv_ctx->res_sad_16x16_pu_buffer);
440 i965_free_gpe_resource(&priv_ctx->res_vme_8x8_mode_buffer);
441 i965_free_gpe_resource(&priv_ctx->res_intra_mode_buffer);
442 i965_free_gpe_resource(&priv_ctx->res_intra_distortion_buffer);
443 i965_free_gpe_resource(&priv_ctx->res_vme_uni_sic_buffer);
444 i965_free_gpe_resource(&priv_ctx->res_con_corrent_thread_buffer);
445 i965_free_gpe_resource(&priv_ctx->res_mv_index_buffer);
446 i965_free_gpe_resource(&priv_ctx->res_mvp_index_buffer);
447 i965_free_gpe_resource(&priv_ctx->res_roi_buffer);
448 i965_free_gpe_resource(&priv_ctx->res_mb_statistics_buffer);
450 if (priv_ctx->scaled_2x_surface_obj) {
451 i965_DestroySurfaces(priv_ctx->ctx, &priv_ctx->scaled_2x_surface_id, 1);
452 priv_ctx->scaled_2x_surface_obj = NULL;
456 i965_free_gpe_resource(&priv_ctx->deblocking_filter_line_buffer);
457 i965_free_gpe_resource(&priv_ctx->deblocking_filter_tile_line_buffer);
458 i965_free_gpe_resource(&priv_ctx->deblocking_filter_tile_column_buffer);
459 i965_free_gpe_resource(&priv_ctx->metadata_line_buffer);
460 i965_free_gpe_resource(&priv_ctx->metadata_tile_line_buffer);
461 i965_free_gpe_resource(&priv_ctx->metadata_tile_column_buffer);
462 i965_free_gpe_resource(&priv_ctx->sao_line_buffer);
463 i965_free_gpe_resource(&priv_ctx->sao_tile_line_buffer);
464 i965_free_gpe_resource(&priv_ctx->sao_tile_column_buffer);
466 priv_ctx->res_inited = 0;
469 #define ALLOC_GPE_RESOURCE(RES, NAME, SIZE) \
471 i965_free_gpe_resource(&priv_ctx->RES); \
472 if (!i965_allocate_gpe_resource(i965->intel.bufmgr, \
479 #define ALLOC_GPE_2D_RESOURCE(RES, NAME, W, H, P) \
481 i965_free_gpe_resource(&priv_ctx->RES); \
482 if (!i965_gpe_allocate_2d_resource(i965->intel.bufmgr, \
491 gen9_hevc_enc_alloc_resources(VADriverContextP ctx,
492 struct encode_state *encode_state,
493 struct intel_encoder_context *encoder_context)
495 struct i965_driver_data *i965 = i965_driver_data(ctx);
496 struct encoder_vme_mfc_context *vme_context = NULL;
497 struct gen9_hevc_encoder_context *priv_ctx = NULL;
498 struct generic_enc_codec_state *generic_state = NULL;
499 struct gen9_hevc_encoder_state *priv_state = NULL;
500 int res_size = 0, size_shift = 0;
501 int width = 0, height = 0;
503 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
504 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
505 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
506 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
508 if (priv_ctx->res_inited)
509 return VA_STATUS_SUCCESS;
511 res_size = priv_state->mb_code_size;
512 ALLOC_GPE_RESOURCE(res_mb_code_surface,
513 "Mb code surface", res_size);
515 res_size = priv_state->pic_state_size * generic_state->num_pak_passes;
516 ALLOC_GPE_RESOURCE(res_brc_pic_states_write_buffer,
517 "Brc pic status write buffer",
520 res_size = priv_state->pic_state_size * generic_state->num_pak_passes;
521 ALLOC_GPE_RESOURCE(res_brc_pic_states_read_buffer,
522 "Brc pic status read buffer",
525 res_size = GEN9_HEVC_ENC_BRC_HISTORY_BUFFER_SIZE;
526 ALLOC_GPE_RESOURCE(res_brc_history_buffer,
527 "Brc history buffer",
530 res_size = GEN9_HEVC_ENC_BRC_PAK_STATISTCS_SIZE;
531 ALLOC_GPE_RESOURCE(res_brc_pak_statistic_buffer,
532 "Brc pak statistic buffer",
536 ALLOC_GPE_RESOURCE(res_brc_input_buffer_for_enc_kernels,
537 "Brc input buffer for enc kernels buffer",
540 width = ALIGN(priv_state->downscaled_width_4x_in_mb * 8, 64);
541 height = ALIGN(priv_state->downscaled_height_4x_in_mb * 4, 8) * 2;
542 ALLOC_GPE_2D_RESOURCE(res_brc_intra_dist_buffer,
543 "Brc intra distortion buffer",
544 width, height, width);
546 width = ALIGN(GEN9_HEVC_ENC_BRC_CONSTANT_SURFACE_WIDTH, 64);
547 height = GEN9_HEVC_ENC_BRC_CONSTANT_SURFACE_HEIGHT;
548 ALLOC_GPE_2D_RESOURCE(res_brc_constant_data_buffer,
549 "Brc constant data buffer",
550 width, height, width);
552 width = ALIGN((priv_state->frame_width_4x * 4 + 31) >> 4, 64);
553 height = ALIGN((priv_state->frame_height_4x * 4 + 31) >> 5, 4);
554 ALLOC_GPE_2D_RESOURCE(res_brc_mb_qp_buffer,
556 width, height, width);
558 //HME scaling buffer allocation
559 width = ALIGN(priv_state->downscaled_width_4x_in_mb * 8, 64);
560 height = ALIGN(priv_state->downscaled_height_4x_in_mb * 4, 8);
561 ALLOC_GPE_2D_RESOURCE(res_brc_me_dist_buffer,
562 "Brc me distortion buffer",
563 width, height, width);
565 if (generic_state->hme_supported) {
566 width = ALIGN(priv_state->downscaled_width_4x_in_mb * 8, 64);
567 height = ALIGN(priv_state->downscaled_height_4x_in_mb * 4 * 10, 8) * 2;
568 ALLOC_GPE_2D_RESOURCE(s4x_memv_distortion_buffer,
569 "4x MEMV distortion buffer",
570 width, height, width);
572 width = ALIGN(priv_state->downscaled_width_4x_in_mb * 32, 64);
573 height = priv_state->downscaled_height_4x_in_mb * 4 * 10;
574 ALLOC_GPE_2D_RESOURCE(s4x_memv_data_buffer,
575 "4x MEMV data buffer",
576 width, height, width);
578 if (generic_state->b16xme_supported) {
579 width = ALIGN(priv_state->downscaled_width_16x_in_mb * 32, 64);
580 height = priv_state->downscaled_height_16x_in_mb * 2 * 4 * 10;
581 ALLOC_GPE_2D_RESOURCE(s16x_memv_data_buffer,
582 "16x MEMV data buffer",
583 width, height, width);
585 if (generic_state->b32xme_supported) {
586 width = ALIGN(priv_state->downscaled_width_32x_in_mb * 32, 64);
587 height = priv_state->downscaled_height_32x_in_mb * 2 * 4 * 10;
588 ALLOC_GPE_2D_RESOURCE(s32x_memv_data_buffer,
589 "32x MEMV data buffer",
590 width, height, width);
595 if (priv_state->flatness_check_supported) {
596 width = ALIGN(priv_state->width_in_mb * 4, 64);
597 height = priv_state->downscaled_height_4x_in_mb * 4;
598 ALLOC_GPE_2D_RESOURCE(res_flatness_check_surface,
599 "Flatness check buffer",
600 width, height, width);
603 if (priv_ctx->scaled_2x_surface_obj)
604 i965_DestroySurfaces(priv_ctx->ctx, &priv_ctx->scaled_2x_surface_id, 1);
606 width = priv_state->frame_width_in_max_lcu >> 1;
607 height = priv_state->frame_height_in_max_lcu >> 1;
608 if (priv_state->bit_depth_luma_minus8) {
609 width = ALIGN(width, 32);
610 height = ALIGN(height, 32);
613 i965_CreateSurfaces(ctx,
618 &priv_ctx->scaled_2x_surface_id);
619 priv_ctx->scaled_2x_surface_obj =
620 SURFACE(priv_ctx->scaled_2x_surface_id);
622 if (!priv_ctx->scaled_2x_surface_obj)
625 i965_check_alloc_surface_bo(ctx, priv_ctx->scaled_2x_surface_obj, 1,
626 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
628 res_size = (priv_state->frame_width_in_max_lcu >> 5) *
629 (priv_state->frame_height_in_max_lcu >> 5) *
631 ALLOC_GPE_RESOURCE(res_32x32_pu_output_buffer,
632 "32x32 pu output buffer",
635 width = priv_state->frame_width_in_max_lcu >> 3;
636 height = priv_state->frame_height_in_max_lcu >> 5;
637 ALLOC_GPE_2D_RESOURCE(res_slice_map_buffer,
639 width, height, width);
641 res_size = 8192 * 1024;
642 ALLOC_GPE_RESOURCE(res_kernel_debug,
646 width = priv_state->frame_width_in_max_lcu >> 3;
647 height = priv_state->frame_height_in_max_lcu >> 5;
648 ALLOC_GPE_2D_RESOURCE(res_simplest_intra_buffer,
649 "Simplest intra buffer",
650 width, height, width);
652 res_size = (priv_state->frame_width_in_max_lcu >> 4) *
653 (priv_state->frame_height_in_max_lcu >> 4) * 8 * 4;
654 ALLOC_GPE_RESOURCE(res_sad_16x16_pu_buffer,
658 res_size = (priv_state->frame_width_in_max_lcu >> 4) *
659 (priv_state->frame_height_in_max_lcu >> 4) * 32;
660 ALLOC_GPE_RESOURCE(res_vme_8x8_mode_buffer,
664 res_size = (priv_state->frame_width_in_max_lcu >> 3) *
665 (priv_state->frame_height_in_max_lcu >> 3) * 32;
666 ALLOC_GPE_RESOURCE(res_intra_mode_buffer,
670 res_size = (priv_state->frame_width_in_max_lcu >> 4) *
671 (priv_state->frame_height_in_max_lcu >> 4) * 16;
672 ALLOC_GPE_RESOURCE(res_intra_distortion_buffer,
676 width = priv_state->frame_width_in_max_lcu >> 1;
677 height = priv_state->frame_height_in_max_lcu >> 4;
678 ALLOC_GPE_2D_RESOURCE(res_min_distortion_buffer,
679 "Min distortion buffer",
680 width, height, width);
682 res_size = priv_state->frame_width_in_max_lcu *
683 priv_state->frame_height_in_max_lcu;
684 ALLOC_GPE_RESOURCE(res_vme_uni_sic_buffer,
685 "Vme uni sic buffer",
688 width = sizeof(gen9_hevc_mbenc_control_region);
689 height = GEN9_HEVC_ENC_CONCURRENT_SURFACE_HEIGHT;
690 ALLOC_GPE_2D_RESOURCE(res_con_corrent_thread_buffer,
691 "Con corrent thread buffer",
692 width, height, width);
694 res_size = priv_state->frame_width_in_max_lcu *
695 priv_state->frame_height_in_max_lcu / 4;
696 ALLOC_GPE_RESOURCE(res_mv_index_buffer,
700 res_size = priv_state->frame_width_in_max_lcu *
701 priv_state->frame_height_in_max_lcu / 2;
702 ALLOC_GPE_RESOURCE(res_mvp_index_buffer,
706 width = ALIGN(priv_state->width_in_mb * 4, 64);
707 height = ALIGN(priv_state->height_in_mb, 8);
708 ALLOC_GPE_2D_RESOURCE(res_roi_buffer,
710 width, height, width);
712 res_size = priv_state->width_in_mb *
713 priv_state->height_in_mb * 52;
714 ALLOC_GPE_RESOURCE(res_mb_statistics_buffer,
715 "MB statistics buffer",
718 // PAK pipe buffer allocation
719 size_shift = (priv_state->bit_depth_luma_minus8 ||
720 priv_state->bit_depth_chroma_minus8) ? 2 : 3;
722 res_size = ALIGN(priv_state->picture_width, 32) >> size_shift;
723 ALLOC_GPE_RESOURCE(deblocking_filter_line_buffer,
724 "Deblocking filter line buffer",
726 ALLOC_GPE_RESOURCE(deblocking_filter_tile_line_buffer,
727 "Deblocking filter tile line buffer",
730 res_size = ALIGN(priv_state->picture_height +
731 priv_state->height_in_lcu * 6, 32) >> size_shift;
732 ALLOC_GPE_RESOURCE(deblocking_filter_tile_column_buffer,
733 "Deblocking filter tile column buffer",
736 res_size = (((priv_state->picture_width + 15) >> 4) * 188 +
737 priv_state->width_in_lcu * 9 + 1023) >> 9;
738 ALLOC_GPE_RESOURCE(metadata_line_buffer,
739 "metadata line buffer",
742 res_size = (((priv_state->picture_width + 15) >> 4) * 172 +
743 priv_state->width_in_lcu * 9 + 1023) >> 9;
744 ALLOC_GPE_RESOURCE(metadata_tile_line_buffer,
745 "metadata tile line buffer",
748 res_size = (((priv_state->picture_height + 15) >> 4) * 176 +
749 priv_state->height_in_lcu * 89 + 1023) >> 9;
750 ALLOC_GPE_RESOURCE(metadata_tile_column_buffer,
751 "metadata tile column buffer",
754 res_size = ALIGN(((priv_state->picture_width >> 1) +
755 priv_state->width_in_lcu * 3), 16) >> size_shift;
756 ALLOC_GPE_RESOURCE(sao_line_buffer,
760 res_size = ALIGN(((priv_state->picture_width >> 1) +
761 priv_state->width_in_lcu * 6), 16) >> size_shift;
762 ALLOC_GPE_RESOURCE(sao_tile_line_buffer,
763 "sao tile line buffer",
766 res_size = ALIGN(((priv_state->picture_height >> 1) +
767 priv_state->height_in_lcu * 6), 16) >> size_shift;
768 ALLOC_GPE_RESOURCE(sao_tile_column_buffer,
769 "sao tile column buffer",
772 priv_ctx->res_inited = 1;
773 return VA_STATUS_SUCCESS;
776 gen9_hevc_enc_free_resources(vme_context);
777 return VA_STATUS_ERROR_ALLOCATION_FAILED;
780 #define VME_IMPLEMENTATION_START
783 gen9_hevc_set_gpe_1d_surface(VADriverContextP ctx,
784 struct gen9_hevc_encoder_context *priv_ctx,
785 struct i965_gpe_context *gpe_context,
786 enum GEN9_HEVC_ENC_SURFACE_TYPE surface_type,
791 struct i965_gpe_resource *gpe_buffer,
794 if (!gpe_buffer && !bo) {
795 gpe_buffer = priv_ctx->gpe_surfaces[surface_type].gpe_resource;
796 bo = priv_ctx->gpe_surfaces[surface_type].bo;
800 i965_add_buffer_gpe_surface(ctx, gpe_context,
801 gpe_buffer, is_raw_buffer,
802 size == 0 ? gpe_buffer->size - offset : size,
805 gen9_add_dri_buffer_gpe_surface(ctx, gpe_context,
807 size == 0 ? bo->size - offset : size,
812 gen9_hevc_set_gpe_2d_surface(VADriverContextP ctx,
813 struct gen9_hevc_encoder_context *priv_ctx,
814 struct i965_gpe_context *gpe_context,
815 enum GEN9_HEVC_ENC_SURFACE_TYPE surface_type,
818 int is_media_block_rw,
820 struct i965_gpe_resource *gpe_buffer,
821 struct object_surface *surface_object)
823 if (!gpe_buffer && !surface_object) {
824 gpe_buffer = priv_ctx->gpe_surfaces[surface_type].gpe_resource;
825 surface_object = priv_ctx->gpe_surfaces[surface_type].surface_object;
829 i965_add_buffer_2d_gpe_surface(ctx,
835 } else if (surface_object) {
836 i965_add_2d_gpe_surface(ctx, gpe_context,
838 0, is_media_block_rw, format,
842 i965_add_2d_gpe_surface(ctx, gpe_context,
844 1, is_media_block_rw, format,
850 gen9_hevc_set_gpe_adv_surface(VADriverContextP ctx,
851 struct gen9_hevc_encoder_context *priv_ctx,
852 struct i965_gpe_context *gpe_context,
853 enum GEN9_HEVC_ENC_SURFACE_TYPE surface_type,
855 struct object_surface *surface_object)
858 surface_object = priv_ctx->gpe_surfaces[surface_type].surface_object;
861 i965_add_adv_gpe_surface(ctx, gpe_context,
862 surface_object, bti_idx);
866 gen9_hevc_add_gpe_surface(struct gen9_hevc_encoder_context *priv_ctx,
867 enum GEN9_HEVC_ENC_SURFACE_TYPE surface_type,
868 struct i965_gpe_resource *gpe_buffer,
869 struct object_surface *surface_object)
871 if (gpe_buffer && gpe_buffer->bo)
872 priv_ctx->gpe_surfaces[surface_type].gpe_resource = gpe_buffer;
873 else if (surface_object)
874 priv_ctx->gpe_surfaces[surface_type].surface_object = surface_object;
878 gen9_hevc_init_gpe_surfaces_table(VADriverContextP ctx,
879 struct encode_state *encode_state,
880 struct intel_encoder_context *encoder_context)
882 struct encoder_vme_mfc_context *vme_context = NULL;
883 struct gen9_hevc_encoder_context *priv_ctx = NULL;
884 struct gen9_hevc_surface_priv *surface_priv = NULL;
886 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
887 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
889 if (encode_state->reconstructed_object->fourcc == VA_FOURCC_P010) {
890 surface_priv = (struct gen9_hevc_surface_priv *)encode_state->reconstructed_object->private_data;
892 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_Y, NULL,
893 surface_priv->surface_obj_nv12);
894 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_Y_UV, NULL,
895 surface_priv->surface_obj_nv12);
896 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_VME, NULL,
897 surface_priv->surface_obj_nv12);
899 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_Y, NULL,
900 encode_state->input_yuv_object);
901 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_Y_UV, NULL,
902 encode_state->input_yuv_object);
903 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_VME, NULL,
904 encode_state->input_yuv_object);
907 if (priv_ctx->scaled_2x_surface_obj) {
908 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_Y_2X, NULL,
909 priv_ctx->scaled_2x_surface_obj);
910 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_Y_2X_VME, NULL,
911 priv_ctx->scaled_2x_surface_obj);
914 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_BRC_HISTORY,
915 &priv_ctx->res_brc_history_buffer,
917 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_BRC_PAST_PAK_INFO,
918 &priv_ctx->res_brc_pak_statistic_buffer,
920 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_HCP_PAK,
921 &priv_ctx->res_mb_code_surface,
923 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_CU_RECORD,
924 &priv_ctx->res_mb_code_surface,
926 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_32x32_PU_OUTPUT,
927 &priv_ctx->res_32x32_pu_output_buffer,
929 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_SLICE_MAP,
930 &priv_ctx->res_slice_map_buffer,
932 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_BRC_INPUT,
933 &priv_ctx->res_brc_input_buffer_for_enc_kernels,
935 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_LCU_QP,
936 &priv_ctx->res_brc_mb_qp_buffer,
938 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_ROI,
939 &priv_ctx->res_roi_buffer,
941 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_MBSTAT,
942 &priv_ctx->res_mb_statistics_buffer,
944 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_BRC_DATA,
945 &priv_ctx->res_brc_constant_data_buffer,
947 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_KERNEL_DEBUG,
948 &priv_ctx->res_kernel_debug,
950 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_SIMPLIFIED_INTRA,
951 &priv_ctx->res_simplest_intra_buffer,
953 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_HME_MVP,
954 &priv_ctx->s4x_memv_data_buffer,
956 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_HME_DIST,
957 &priv_ctx->s4x_memv_distortion_buffer,
959 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_16x16PU_SAD,
960 &priv_ctx->res_sad_16x16_pu_buffer,
962 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_VME_8x8,
963 &priv_ctx->res_vme_8x8_mode_buffer,
965 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_INTRA_MODE,
966 &priv_ctx->res_intra_mode_buffer,
968 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_INTRA_DIST,
969 &priv_ctx->res_intra_distortion_buffer,
971 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_MIN_DIST,
972 &priv_ctx->res_min_distortion_buffer,
974 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_VME_UNI_SIC_DATA,
975 &priv_ctx->res_vme_uni_sic_buffer,
977 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_CONCURRENT_THREAD,
978 &priv_ctx->res_con_corrent_thread_buffer,
980 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_MB_MV_INDEX,
981 &priv_ctx->res_mv_index_buffer,
983 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_MVP_INDEX,
984 &priv_ctx->res_mvp_index_buffer,
989 gen9_hevc_enc_check_parameters(VADriverContextP ctx,
990 struct encode_state *encode_state,
991 struct intel_encoder_context *encoder_context)
993 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
994 VAEncPictureParameterBufferHEVC *pic_param = NULL;
995 VAEncSliceParameterBufferHEVC *slice_param = NULL;
998 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
999 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
1001 for (i = 0; i < encode_state->num_slice_params_ext; i++) {
1002 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[i]->buffer;
1004 if (slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag &&
1005 slice_param->slice_fields.bits.collocated_from_l0_flag &&
1006 (pic_param->collocated_ref_pic_index == 0xff ||
1007 pic_param->collocated_ref_pic_index > GEN9_MAX_REF_SURFACES))
1008 slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag = 0;
1010 if (slice_param->num_ref_idx_l0_active_minus1 > GEN9_HEVC_NUM_MAX_REF_L0 - 1 ||
1011 slice_param->num_ref_idx_l1_active_minus1 > GEN9_HEVC_NUM_MAX_REF_L1 - 1)
1012 return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1015 i = 1 << (seq_param->log2_diff_max_min_luma_coding_block_size +
1016 seq_param->log2_min_luma_coding_block_size_minus3 + 3);
1017 if (i < GEN9_HEVC_ENC_MIN_LCU_SIZE ||
1018 i > GEN9_HEVC_ENC_MAX_LCU_SIZE)
1019 return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1021 //The TU max size in SPS must be the same as the CU max size in SPS
1022 i = seq_param->log2_min_transform_block_size_minus2 +
1023 seq_param->log2_diff_max_min_transform_block_size + 2;
1024 j = seq_param->log2_min_luma_coding_block_size_minus3 +
1025 seq_param->log2_diff_max_min_luma_coding_block_size + 3;
1028 return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1030 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
1031 i = pic_param->pic_init_qp + slice_param->slice_qp_delta;
1032 j = -seq_param->seq_fields.bits.bit_depth_luma_minus8 * 6;
1033 if (i < j || i > 51)
1034 return VA_STATUS_ERROR_INVALID_PARAMETER;
1036 return VA_STATUS_SUCCESS;
1040 gen9_hevc_enc_init_seq_parameters(struct gen9_hevc_encoder_context *priv_ctx,
1041 struct generic_enc_codec_state *generic_state,
1042 struct gen9_hevc_encoder_state *priv_state,
1043 VAEncSequenceParameterBufferHEVC *seq_param)
1045 int new = 0, m = 0, n = 0;
1047 if (priv_state->picture_width != seq_param->pic_width_in_luma_samples ||
1048 priv_state->picture_height != seq_param->pic_height_in_luma_samples ||
1049 priv_state->bit_depth_luma_minus8 != seq_param->seq_fields.bits.bit_depth_luma_minus8 ||
1050 priv_state->bit_depth_chroma_minus8 != seq_param->seq_fields.bits.bit_depth_chroma_minus8)
1056 priv_state->bit_depth_luma_minus8 = seq_param->seq_fields.bits.bit_depth_luma_minus8;
1057 priv_state->bit_depth_chroma_minus8 = seq_param->seq_fields.bits.bit_depth_chroma_minus8;
1058 priv_state->cu_size = 1 << (seq_param->log2_min_luma_coding_block_size_minus3 + 3);
1059 priv_state->lcu_size = 1 << (seq_param->log2_diff_max_min_luma_coding_block_size +
1060 seq_param->log2_min_luma_coding_block_size_minus3 + 3);
1061 priv_state->picture_width = (seq_param->pic_width_in_luma_samples / priv_state->cu_size) * priv_state->cu_size;
1062 priv_state->picture_height = (seq_param->pic_height_in_luma_samples / priv_state->cu_size) * priv_state->cu_size;
1063 priv_state->width_in_lcu = ALIGN(priv_state->picture_width, priv_state->lcu_size) / priv_state->lcu_size;
1064 priv_state->height_in_lcu = ALIGN(priv_state->picture_height, priv_state->lcu_size) / priv_state->lcu_size;
1065 priv_state->width_in_cu = ALIGN(priv_state->picture_width, priv_state->cu_size) / priv_state->cu_size;
1066 priv_state->height_in_cu = ALIGN(priv_state->picture_height, priv_state->cu_size) / priv_state->cu_size;
1067 priv_state->width_in_mb = ALIGN(priv_state->picture_width, 16) / 16;
1068 priv_state->height_in_mb = ALIGN(priv_state->picture_height, 16) / 16;
1070 m = (priv_state->picture_width + GEN9_HEVC_ENC_MIN_LCU_SIZE - 1) / GEN9_HEVC_ENC_MIN_LCU_SIZE;
1071 n = (priv_state->picture_height + GEN9_HEVC_ENC_MIN_LCU_SIZE - 1) / GEN9_HEVC_ENC_MIN_LCU_SIZE;
1072 priv_state->mb_data_offset = ALIGN(m * n * priv_state->pak_obj_size, 0x1000);
1074 m = ALIGN(priv_state->picture_width, GEN9_HEVC_ENC_MAX_LCU_SIZE) / 8;
1075 n = ALIGN(priv_state->picture_height, GEN9_HEVC_ENC_MAX_LCU_SIZE) / 8;
1076 priv_state->mb_code_size = priv_state->mb_data_offset +
1077 ALIGN(m * n * priv_state->cu_record_size, 0x1000);
1079 priv_state->frame_width_in_max_lcu = ALIGN(priv_state->picture_width, 32);
1080 priv_state->frame_height_in_max_lcu = ALIGN(priv_state->picture_height, 32);
1081 priv_state->frame_width_4x = ALIGN(priv_state->picture_width / 4, 16);
1082 priv_state->frame_height_4x = ALIGN(priv_state->picture_height / 4, 16);
1083 priv_state->frame_width_16x = ALIGN(priv_state->picture_width / 16, 16);
1084 priv_state->frame_height_16x = ALIGN(priv_state->picture_height / 16, 16);
1085 priv_state->frame_width_32x = ALIGN(priv_state->picture_width / 32, 16);
1086 priv_state->frame_height_32x = ALIGN(priv_state->picture_height / 32, 16);
1088 priv_state->downscaled_width_4x_in_mb = priv_state->frame_width_4x / 16;
1089 if (priv_state->bit_depth_luma_minus8) {
1090 priv_state->downscaled_width_4x_in_mb = ALIGN(priv_state->downscaled_width_4x_in_mb * 16, 32) /
1092 priv_state->frame_width_4x = priv_state->downscaled_width_4x_in_mb * 16;
1095 priv_state->downscaled_height_4x_in_mb = priv_state->frame_height_4x / 16;
1096 priv_state->downscaled_width_16x_in_mb = priv_state->frame_width_16x / 16;
1097 priv_state->downscaled_height_16x_in_mb = priv_state->frame_height_16x / 16;
1098 priv_state->downscaled_width_32x_in_mb = priv_state->frame_width_32x / 16;
1099 priv_state->downscaled_height_32x_in_mb = priv_state->frame_height_32x / 16;
1100 priv_state->flatness_check_enable = priv_state->flatness_check_supported;
1101 priv_state->widi_first_intra_refresh = 1;
1103 generic_state->hme_supported = GEN9_HEVC_HME_SUPPORTED;
1104 generic_state->b16xme_supported = GEN9_HEVC_16XME_SUPPORTED;
1105 generic_state->b32xme_supported = GEN9_HEVC_32XME_SUPPORTED;
1106 if (generic_state->hme_supported &&
1107 (priv_state->frame_width_4x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE ||
1108 priv_state->frame_height_4x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE)) {
1109 generic_state->b16xme_supported = 0;
1110 generic_state->b32xme_supported = 0;
1112 if (priv_state->frame_width_4x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1113 priv_state->frame_width_4x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1114 priv_state->downscaled_width_4x_in_mb = priv_state->frame_width_4x / 16;
1117 if (priv_state->frame_height_4x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1118 priv_state->frame_height_4x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1119 priv_state->downscaled_height_4x_in_mb = priv_state->frame_height_4x / 16;
1121 } else if (generic_state->b16xme_supported &&
1122 (priv_state->frame_width_16x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE ||
1123 priv_state->frame_height_16x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE)) {
1124 generic_state->b32xme_supported = 0;
1126 if (priv_state->frame_width_16x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1127 priv_state->frame_width_16x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1128 priv_state->downscaled_width_16x_in_mb = priv_state->frame_width_16x / 16;
1131 if (priv_state->frame_height_16x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1132 priv_state->frame_height_16x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1133 priv_state->downscaled_height_16x_in_mb = priv_state->frame_height_16x / 16;
1135 } else if (generic_state->b32xme_supported &&
1136 (priv_state->frame_width_32x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE ||
1137 priv_state->frame_height_32x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE)) {
1138 if (priv_state->frame_width_32x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1139 priv_state->frame_width_32x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1140 priv_state->downscaled_width_32x_in_mb = priv_state->frame_width_32x / 16;
1143 if (priv_state->frame_height_32x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1144 priv_state->frame_height_32x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1145 priv_state->downscaled_height_32x_in_mb = priv_state->frame_height_32x / 16;
1149 priv_state->gop_ref_dist = seq_param->ip_period;
1150 priv_state->gop_size = seq_param->intra_period;
1151 priv_state->frame_number = 0;
1153 priv_ctx->res_inited = 0;
1157 gen9_hevc_enc_init_pic_parameters(struct generic_enc_codec_state *generic_state,
1158 struct gen9_hevc_encoder_state *priv_state,
1159 VAEncSequenceParameterBufferHEVC *seq_param,
1160 VAEncPictureParameterBufferHEVC *pic_param,
1161 VAEncSliceParameterBufferHEVC *slice_param)
1163 unsigned int log2_max_coding_block_size = 0, raw_ctu_bits = 0;
1165 priv_state->picture_coding_type = slice_param->slice_type;
1167 priv_state->ctu_max_bitsize_allowed = pic_param->ctu_max_bitsize_allowed;
1168 log2_max_coding_block_size = seq_param->log2_min_luma_coding_block_size_minus3 + 3 +
1169 seq_param->log2_diff_max_min_luma_coding_block_size;
1170 raw_ctu_bits = (1 << (2 * log2_max_coding_block_size + 3)) +
1171 (1 << (2 * log2_max_coding_block_size + 2));
1172 raw_ctu_bits = (5 * raw_ctu_bits / 3);
1174 if (priv_state->ctu_max_bitsize_allowed == 0 ||
1175 priv_state->ctu_max_bitsize_allowed > raw_ctu_bits)
1176 priv_state->ctu_max_bitsize_allowed = raw_ctu_bits;
1180 gen9_hevc_enc_init_slice_parameters(VADriverContextP ctx,
1181 struct encode_state *encode_state,
1182 struct intel_encoder_context *encoder_context)
1184 struct encoder_vme_mfc_context *vme_context = NULL;
1185 struct gen9_hevc_encoder_state *priv_state = NULL;
1186 VAEncPictureParameterBufferHEVC *pic_param = NULL;
1187 VAEncSliceParameterBufferHEVC *slice_param = NULL;
1190 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1191 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1192 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
1194 priv_state->low_delay = 1;
1195 priv_state->arbitrary_num_mb_in_slice = 0;
1197 for (i = 0; i < encode_state->num_slice_params_ext; i++) {
1198 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[i]->buffer;
1200 if (slice_param->slice_type == HEVC_SLICE_B && priv_state->low_delay) {
1201 for (j = 0; j <= slice_param->num_ref_idx_l0_active_minus1; j++) {
1202 if (pic_param->decoded_curr_pic.pic_order_cnt <
1203 slice_param->ref_pic_list0[j].pic_order_cnt)
1204 priv_state->low_delay = 0;
1207 for (j = 0; j <= slice_param->num_ref_idx_l1_active_minus1; j++) {
1208 if (pic_param->decoded_curr_pic.pic_order_cnt <
1209 slice_param->ref_pic_list1[j].pic_order_cnt)
1210 priv_state->low_delay = 0;
1214 if (!priv_state->arbitrary_num_mb_in_slice &&
1215 (slice_param->num_ctu_in_slice % priv_state->width_in_lcu))
1216 priv_state->arbitrary_num_mb_in_slice = 1;
1221 gen9_hevc_enc_init_parameters(VADriverContextP ctx,
1222 struct encode_state *encode_state,
1223 struct intel_encoder_context *encoder_context)
1225 struct i965_driver_data *i965 = i965_driver_data(ctx);
1226 struct encoder_vme_mfc_context *vme_context = NULL;
1227 struct generic_enc_codec_state *generic_state = NULL;
1228 struct gen9_hevc_encoder_context *priv_ctx = NULL;
1229 struct gen9_hevc_encoder_state *priv_state = NULL;
1230 VAEncPictureParameterBufferHEVC *pic_param = NULL;
1231 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
1232 VAEncSliceParameterBufferHEVC *slice_param = NULL;
1233 struct object_buffer *obj_buffer = NULL;
1234 VAStatus va_status = VA_STATUS_SUCCESS;
1236 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1237 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
1238 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
1239 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1240 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
1241 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
1242 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
1244 if (!pic_param || !seq_param || !slice_param)
1245 return VA_STATUS_ERROR_INVALID_PARAMETER;
1247 va_status = gen9_hevc_enc_check_parameters(ctx, encode_state, encoder_context);
1248 if (va_status |= VA_STATUS_SUCCESS)
1251 gen9_hevc_enc_init_seq_parameters(priv_ctx, generic_state, priv_state, seq_param);
1252 gen9_hevc_enc_init_pic_parameters(generic_state, priv_state, seq_param, pic_param, slice_param);
1253 gen9_hevc_enc_init_slice_parameters(ctx, encode_state, encoder_context);
1255 if (priv_state->picture_coding_type == HEVC_SLICE_I) {
1256 generic_state->hme_enabled = 0;
1257 generic_state->b16xme_enabled = 0;
1258 generic_state->b32xme_enabled = 0;
1260 generic_state->hme_enabled = generic_state->hme_supported;
1261 generic_state->b16xme_enabled = generic_state->b16xme_supported;
1262 generic_state->b32xme_enabled = generic_state->b32xme_supported;
1265 obj_buffer = BUFFER(pic_param->coded_buf);
1267 !obj_buffer->buffer_store ||
1268 !obj_buffer->buffer_store->bo) {
1269 va_status = VA_STATUS_ERROR_INVALID_PARAMETER;
1272 encode_state->coded_buf_object = obj_buffer;
1273 priv_state->status_buffer.bo = obj_buffer->buffer_store->bo;
1275 va_status = gen9_hevc_ensure_surface(ctx, priv_state,
1276 encode_state->input_yuv_object, 0);
1277 if (va_status != VA_STATUS_SUCCESS)
1280 va_status = gen9_hevc_ensure_surface(ctx, priv_state,
1281 encode_state->reconstructed_object, 1);
1282 if (va_status != VA_STATUS_SUCCESS)
1286 if (encode_state->input_yuv_object->orig_width > priv_state->picture_width)
1287 encode_state->input_yuv_object->orig_width = priv_state->picture_width;
1289 if (encode_state->input_yuv_object->orig_height > priv_state->picture_height)
1290 encode_state->input_yuv_object->orig_height = priv_state->picture_height;
1293 if (encode_state->reconstructed_object->orig_width > priv_state->picture_width)
1294 encode_state->reconstructed_object->orig_width = priv_state->picture_width;
1296 if (encode_state->reconstructed_object->orig_height > priv_state->picture_height)
1297 encode_state->reconstructed_object->orig_height = priv_state->picture_height;
1300 va_status = gen9_hevc_init_surface_private(ctx, generic_state, priv_state,
1301 encode_state->reconstructed_object);
1302 if (va_status != VA_STATUS_SUCCESS)
1306 struct gen9_hevc_surface_priv *surface_priv = NULL;
1308 surface_priv = (struct gen9_hevc_surface_priv *)encode_state->reconstructed_object->private_data;
1310 surface_priv->qp_value = pic_param->pic_init_qp + slice_param->slice_qp_delta;
1313 va_status = gen9_hevc_enc_alloc_resources(ctx, encode_state,
1315 if (va_status != VA_STATUS_SUCCESS)
1318 gen9_hevc_init_gpe_surfaces_table(ctx, encode_state,
1325 // VME&BRC implementation
1328 gen9_hevc_vme_init_gpe_context(VADriverContextP ctx,
1329 struct i965_gpe_context *gpe_context,
1330 unsigned int curbe_size,
1331 unsigned int inline_data_size)
1333 struct i965_driver_data *i965 = i965_driver_data(ctx);
1335 gpe_context->curbe.length = curbe_size;
1337 gpe_context->sampler.entry_size = 0;
1338 gpe_context->sampler.max_entries = 0;
1340 gpe_context->idrt.entry_size = ALIGN(sizeof(struct gen8_interface_descriptor_data), 64);
1341 gpe_context->idrt.max_entries = 1;
1343 gpe_context->surface_state_binding_table.max_entries = MAX_HEVC_KERNELS_ENCODER_SURFACES;
1344 gpe_context->surface_state_binding_table.binding_table_offset = 0;
1345 gpe_context->surface_state_binding_table.surface_state_offset = ALIGN(MAX_HEVC_KERNELS_ENCODER_SURFACES * 4, 64);
1346 gpe_context->surface_state_binding_table.length = ALIGN(MAX_HEVC_KERNELS_ENCODER_SURFACES * 4, 64) + ALIGN(MAX_HEVC_KERNELS_ENCODER_SURFACES * SURFACE_STATE_PADDED_SIZE_GEN9, 64);
1348 if (i965->intel.eu_total > 0)
1349 gpe_context->vfe_state.max_num_threads = 6 * i965->intel.eu_total;
1351 gpe_context->vfe_state.max_num_threads = 112;
1353 gpe_context->vfe_state.curbe_allocation_size = MAX(1, ALIGN(gpe_context->curbe.length, 32) >> 5);
1354 gpe_context->vfe_state.urb_entry_size = MAX(1, ALIGN(inline_data_size, 32) >> 5);
1355 gpe_context->vfe_state.num_urb_entries = (MAX_HEVC_KERNELS_URB_SIZE -
1356 gpe_context->vfe_state.curbe_allocation_size -
1357 ((gpe_context->idrt.entry_size >> 5) *
1358 gpe_context->idrt.max_entries)) /
1359 gpe_context->vfe_state.urb_entry_size;
1360 gpe_context->vfe_state.num_urb_entries = CLAMP(gpe_context->vfe_state.num_urb_entries, 1, 64);
1361 gpe_context->vfe_state.gpgpu_mode = 0;
1365 gen9_hevc_vme_init_scoreboard(struct i965_gpe_context *gpe_context,
1367 unsigned int enable,
1370 gpe_context->vfe_desc5.scoreboard0.mask = mask;
1371 gpe_context->vfe_desc5.scoreboard0.type = type;
1372 gpe_context->vfe_desc5.scoreboard0.enable = enable;
1374 gpe_context->vfe_desc6.scoreboard1.delta_x0 = 0xF;
1375 gpe_context->vfe_desc6.scoreboard1.delta_y0 = 0x0;
1377 gpe_context->vfe_desc6.scoreboard1.delta_x1 = 0x0;
1378 gpe_context->vfe_desc6.scoreboard1.delta_y1 = 0xF;
1380 gpe_context->vfe_desc6.scoreboard1.delta_x2 = 0x1;
1381 gpe_context->vfe_desc6.scoreboard1.delta_y2 = 0xF;
1383 gpe_context->vfe_desc6.scoreboard1.delta_x3 = 0xF;
1384 gpe_context->vfe_desc6.scoreboard1.delta_y3 = 0xF;
1386 gpe_context->vfe_desc7.scoreboard2.delta_x4 = 0xF;
1387 gpe_context->vfe_desc7.scoreboard2.delta_y4 = 0x1;
1389 gpe_context->vfe_desc7.scoreboard2.delta_x5 = 0x0;
1390 gpe_context->vfe_desc7.scoreboard2.delta_y5 = 0xE;
1392 gpe_context->vfe_desc7.scoreboard2.delta_x6 = 0x1;
1393 gpe_context->vfe_desc7.scoreboard2.delta_y6 = 0xE;
1395 gpe_context->vfe_desc7.scoreboard2.delta_x7 = 0xF;
1396 gpe_context->vfe_desc7.scoreboard2.delta_y7 = 0xE;
1400 gen9_hevc_vme_set_scoreboard_26z(struct i965_gpe_context *gpe_context,
1402 unsigned int enable,
1405 gpe_context->vfe_desc5.scoreboard0.mask = mask;
1406 gpe_context->vfe_desc5.scoreboard0.type = type;
1407 gpe_context->vfe_desc5.scoreboard0.enable = enable;
1409 gpe_context->vfe_desc6.scoreboard1.delta_x0 = -1;
1410 gpe_context->vfe_desc6.scoreboard1.delta_y0 = 3;
1412 gpe_context->vfe_desc6.scoreboard1.delta_x1 = -1;
1413 gpe_context->vfe_desc6.scoreboard1.delta_y1 = 1;
1415 gpe_context->vfe_desc6.scoreboard1.delta_x2 = -1;
1416 gpe_context->vfe_desc6.scoreboard1.delta_y2 = -1;
1418 gpe_context->vfe_desc6.scoreboard1.delta_x3 = 0;
1419 gpe_context->vfe_desc6.scoreboard1.delta_y3 = -1;
1421 gpe_context->vfe_desc7.scoreboard2.delta_x4 = 0;
1422 gpe_context->vfe_desc7.scoreboard2.delta_y4 = -2;
1424 gpe_context->vfe_desc7.scoreboard2.delta_x5 = 0;
1425 gpe_context->vfe_desc7.scoreboard2.delta_y5 = -3;
1427 gpe_context->vfe_desc7.scoreboard2.delta_x6 = 1;
1428 gpe_context->vfe_desc7.scoreboard2.delta_y6 = -2;
1430 gpe_context->vfe_desc7.scoreboard2.delta_x7 = 1;
1431 gpe_context->vfe_desc7.scoreboard2.delta_y7 = -3;
1435 gen9_hevc_vme_set_scoreboard_26(struct i965_gpe_context *gpe_context,
1437 unsigned int enable,
1440 gpe_context->vfe_desc5.scoreboard0.mask = mask;
1441 gpe_context->vfe_desc5.scoreboard0.type = type;
1442 gpe_context->vfe_desc5.scoreboard0.enable = enable;
1444 gpe_context->vfe_desc6.scoreboard1.delta_x0 = -1;
1445 gpe_context->vfe_desc6.scoreboard1.delta_y0 = 0;
1447 gpe_context->vfe_desc6.scoreboard1.delta_x1 = -1;
1448 gpe_context->vfe_desc6.scoreboard1.delta_y1 = -1;
1450 gpe_context->vfe_desc6.scoreboard1.delta_x2 = 0;
1451 gpe_context->vfe_desc6.scoreboard1.delta_y2 = -1;
1453 gpe_context->vfe_desc6.scoreboard1.delta_x3 = 1;
1454 gpe_context->vfe_desc6.scoreboard1.delta_y3 = -1;
1458 gen9_hevc_init_object_walker(struct hevc_enc_kernel_walker_parameter *hevc_walker_param,
1459 struct gpe_media_object_walker_parameter *gpe_param)
1461 memset(gpe_param, 0, sizeof(*gpe_param));
1463 gpe_param->use_scoreboard = hevc_walker_param->use_scoreboard;
1464 gpe_param->block_resolution.x = hevc_walker_param->resolution_x;
1465 gpe_param->block_resolution.y = hevc_walker_param->resolution_y;
1466 gpe_param->global_resolution.x = hevc_walker_param->resolution_x;
1467 gpe_param->global_resolution.y = hevc_walker_param->resolution_y;
1468 gpe_param->global_outer_loop_stride.x = hevc_walker_param->resolution_x;
1469 gpe_param->global_outer_loop_stride.y = 0;
1470 gpe_param->global_inner_loop_unit.x = 0;
1471 gpe_param->global_inner_loop_unit.y = hevc_walker_param->resolution_y;
1472 gpe_param->local_loop_exec_count = 0xFFFF;
1473 gpe_param->global_loop_exec_count = 0xFFFF;
1475 if (hevc_walker_param->no_dependency) {
1476 gpe_param->scoreboard_mask = 0;
1477 gpe_param->use_scoreboard = 0;
1478 gpe_param->local_outer_loop_stride.x = 0;
1479 gpe_param->local_outer_loop_stride.y = 1;
1480 gpe_param->local_inner_loop_unit.x = 1;
1481 gpe_param->local_inner_loop_unit.y = 0;
1482 gpe_param->local_end.x = hevc_walker_param->resolution_x - 1;
1483 gpe_param->local_end.y = 0;
1488 gen9_hevc_init_object_walker_26z(struct gen9_hevc_encoder_state *priv_state,
1489 struct i965_gpe_context *gpe_context,
1490 struct gpe_media_object_walker_parameter *gpe_param,
1492 unsigned int max_slight_height,
1493 int use_hw_scoreboard,
1494 int scoreboard_type)
1496 int width = priv_state->width_in_mb;
1497 int height = max_slight_height * 2;
1498 int ts_width = ((width + 3) & 0xfffc) >> 1;
1499 int lcu_width = (width + 1) >> 1;
1500 int lcu_height = (height + 1) >> 1;
1501 int tmp1 = ((lcu_width + 1) >> 1) + ((lcu_width + ((lcu_height - 1) << 1)) + (2 * split_count - 1)) /
1504 gpe_param->use_scoreboard = use_hw_scoreboard;
1505 gpe_param->scoreboard_mask = 0xFF;
1506 gpe_param->global_resolution.x = ts_width;
1507 gpe_param->global_resolution.y = 4 * tmp1;
1508 gpe_param->global_start.x = 0;
1509 gpe_param->global_start.y = 0;
1510 gpe_param->global_outer_loop_stride.x = ts_width;
1511 gpe_param->global_outer_loop_stride.y = 0;
1512 gpe_param->global_inner_loop_unit.x = 0;
1513 gpe_param->global_inner_loop_unit.y = 4 * tmp1;
1514 gpe_param->block_resolution.x = ts_width;
1515 gpe_param->block_resolution.y = 4 * tmp1;
1516 gpe_param->local_start.x = ts_width;
1517 gpe_param->local_start.y = 0;
1518 gpe_param->local_end.x = 0;
1519 gpe_param->local_end.y = 0;
1520 gpe_param->local_outer_loop_stride.x = 1;
1521 gpe_param->local_outer_loop_stride.y = 0;
1522 gpe_param->local_inner_loop_unit.x = -2;
1523 gpe_param->local_inner_loop_unit.y = 4;
1524 gpe_param->middle_loop_extra_steps = 3;
1525 gpe_param->mid_loop_unit_x = 0;
1526 gpe_param->mid_loop_unit_y = 1;
1527 gpe_param->global_loop_exec_count = 0;
1528 gpe_param->local_loop_exec_count = ((lcu_width + (lcu_height - 1) * 2 + 2 * split_count - 1) /
1529 (2 * split_count)) * 2 -
1532 gen9_hevc_vme_set_scoreboard_26z(gpe_context, 0xff, use_hw_scoreboard, scoreboard_type);
1536 gen9_hevc_init_object_walker_26(struct gen9_hevc_encoder_state *priv_state,
1537 struct i965_gpe_context *gpe_context,
1538 struct gpe_media_object_walker_parameter *gpe_param,
1540 unsigned int max_slight_height,
1541 int use_hw_scoreboard,
1542 int scoreboard_type)
1544 int width = priv_state->width_in_mb;
1545 int height = max_slight_height;
1546 int ts_width = (width + 1) & 0xfffe;
1547 int ts_height = (height + 1) & 0xfffe;
1548 int tmp1 = ((ts_width + 1) >> 1) +
1549 ((ts_width + ((ts_height - 1) << 1)) +
1550 (2 * split_count - 1)) / (2 * split_count);
1552 gpe_param->use_scoreboard = use_hw_scoreboard;
1553 gpe_param->scoreboard_mask = 0x0f;
1554 gpe_param->global_resolution.x = ts_width;
1555 gpe_param->global_resolution.y = tmp1;
1556 gpe_param->global_start.x = 0;
1557 gpe_param->global_start.y = 0;
1558 gpe_param->global_outer_loop_stride.x = ts_width;
1559 gpe_param->global_outer_loop_stride.y = 0;
1560 gpe_param->global_inner_loop_unit.x = 0;
1561 gpe_param->global_inner_loop_unit.y = tmp1;
1562 gpe_param->block_resolution.x = ts_width;
1563 gpe_param->block_resolution.y = tmp1;
1564 gpe_param->local_start.x = ts_width;
1565 gpe_param->local_start.y = 0;
1566 gpe_param->local_end.x = 0;
1567 gpe_param->local_end.y = 0;
1568 gpe_param->local_outer_loop_stride.x = 1;
1569 gpe_param->local_outer_loop_stride.y = 0;
1570 gpe_param->local_inner_loop_unit.x = -2;
1571 gpe_param->local_inner_loop_unit.y = 1;
1572 gpe_param->middle_loop_extra_steps = 0;
1573 gpe_param->mid_loop_unit_x = 0;
1574 gpe_param->mid_loop_unit_y = 0;
1575 gpe_param->global_loop_exec_count = 0;
1576 gpe_param->local_loop_exec_count = (width + (height - 1) * 2 + split_count - 1) /
1579 gen9_hevc_vme_set_scoreboard_26(gpe_context, 0xff, use_hw_scoreboard, scoreboard_type);
1583 gen9_hevc_run_object_walker(VADriverContextP ctx,
1584 struct intel_encoder_context *encoder_context,
1585 struct i965_gpe_context *gpe_context,
1586 struct gpe_media_object_walker_parameter *param,
1589 struct intel_batchbuffer *batch = encoder_context->base.batch;
1591 intel_batchbuffer_start_atomic(batch, 0x1000);
1593 intel_batchbuffer_emit_mi_flush(batch);
1595 gen9_gpe_pipeline_setup(ctx, gpe_context, batch);
1596 gen8_gpe_media_object_walker(ctx, gpe_context, batch, param);
1597 gen8_gpe_media_state_flush(ctx, gpe_context, batch);
1598 gen9_gpe_pipeline_end(ctx, gpe_context, batch);
1600 intel_batchbuffer_end_atomic(batch);
1602 intel_batchbuffer_flush(batch);
1606 gen9_hevc_run_object(VADriverContextP ctx,
1607 struct intel_encoder_context *encoder_context,
1608 struct i965_gpe_context *gpe_context,
1609 struct gpe_media_object_parameter *param,
1612 struct intel_batchbuffer *batch = encoder_context->base.batch;
1614 intel_batchbuffer_start_atomic(batch, 0x1000);
1616 intel_batchbuffer_emit_mi_flush(batch);
1618 gen9_gpe_pipeline_setup(ctx, gpe_context, batch);
1619 gen8_gpe_media_object(ctx, gpe_context, batch, param);
1620 gen8_gpe_media_state_flush(ctx, gpe_context, batch);
1622 gen9_gpe_pipeline_end(ctx, gpe_context, batch);
1624 intel_batchbuffer_end_atomic(batch);
1626 intel_batchbuffer_flush(batch);
1630 gen9_hevc_get_b_mbenc_default_curbe(enum HEVC_TU_MODE tu_mode,
1635 if (tu_mode == HEVC_TU_BEST_SPEED) {
1636 if (slice_type == HEVC_SLICE_I) {
1637 *curbe_size = sizeof(HEVC_ENC_ENCB_TU7_I_CURBE_DATA);
1638 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU7_I_CURBE_DATA;
1639 } else if (slice_type == HEVC_SLICE_P) {
1640 *curbe_size = sizeof(HEVC_ENC_ENCB_TU7_P_CURBE_DATA);
1641 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU7_P_CURBE_DATA;
1643 *curbe_size = sizeof(HEVC_ENC_ENCB_TU7_B_CURBE_DATA);
1644 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU7_B_CURBE_DATA;
1646 } else if (tu_mode == HEVC_TU_RT_SPEED) {
1647 if (slice_type == HEVC_SLICE_P) {
1648 *curbe_size = sizeof(HEVC_ENC_ENCB_TU4_P_CURBE_DATA);
1649 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU4_P_CURBE_DATA;
1651 *curbe_size = sizeof(HEVC_ENC_ENCB_TU4_B_CURBE_DATA);
1652 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU4_B_CURBE_DATA;
1655 if (slice_type == HEVC_SLICE_P) {
1656 *curbe_size = sizeof(HEVC_ENC_ENCB_TU1_P_CURBE_DATA);
1657 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU1_P_CURBE_DATA;
1659 *curbe_size = sizeof(HEVC_ENC_ENCB_TU1_B_CURBE_DATA);
1660 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU1_B_CURBE_DATA;
1668 gen9_hevc_configure_roi(struct encode_state *encode_state,
1669 struct intel_encoder_context *encoder_context)
1671 struct encoder_vme_mfc_context *vme_context = NULL;
1672 struct gen9_hevc_encoder_state *priv_state = NULL;
1675 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1676 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1678 priv_state->num_roi = MIN(encoder_context->brc.num_roi, I965_MAX_NUM_ROI_REGIONS);
1679 priv_state->roi_value_is_qp_delta = encoder_context->brc.roi_value_is_qp_delta;
1681 for (i = 0; i < priv_state->num_roi; i++) {
1682 priv_state->roi[i].left = encoder_context->brc.roi[i].left >> 4;
1683 priv_state->roi[i].right = encoder_context->brc.roi[i].right >> 4;
1684 priv_state->roi[i].top = encoder_context->brc.roi[i].top >> 4;
1685 priv_state->roi[i].bottom = encoder_context->brc.roi[i].bottom >> 4;
1686 priv_state->roi[i].value = encoder_context->brc.roi[i].value;
1691 gen9_hevc_brc_prepare(struct encode_state *encode_state,
1692 struct intel_encoder_context *encoder_context)
1694 struct encoder_vme_mfc_context *vme_context = NULL;
1695 struct generic_enc_codec_state *generic_state = NULL;
1696 struct gen9_hevc_encoder_state *priv_state = NULL;
1697 enum HEVC_BRC_METHOD brc_method = HEVC_BRC_CQP;
1698 int internal_tu_mode = encoder_context->quality_level;
1701 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1702 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
1703 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1705 if (encoder_context->rate_control_mode & VA_RC_CBR)
1706 brc_method = HEVC_BRC_CBR;
1707 else if (encoder_context->rate_control_mode & VA_RC_VBR)
1708 brc_method = HEVC_BRC_VBR;
1709 else if (encoder_context->rate_control_mode & VA_RC_VCM)
1710 brc_method = HEVC_BRC_VCM;
1712 if (internal_tu_mode >= HEVC_TU_RT_SPEED ||
1713 internal_tu_mode == 0)
1714 internal_tu_mode = internal_tu_mode >= HEVC_TU_BEST_SPEED ?
1715 HEVC_TU_BEST_SPEED : HEVC_TU_RT_SPEED;
1717 internal_tu_mode = HEVC_TU_BEST_QUALITY;
1719 brc_reset = priv_state->brc_method != brc_method ||
1720 priv_state->tu_mode != internal_tu_mode;
1722 if (!generic_state->brc_inited ||
1723 encoder_context->brc.need_reset ||
1725 priv_state->tu_mode = internal_tu_mode;
1726 if (priv_state->tu_mode == HEVC_TU_BEST_QUALITY)
1727 priv_state->num_regions_in_slice = 1;
1729 priv_state->num_regions_in_slice = 4;
1731 if (internal_tu_mode == HEVC_TU_BEST_SPEED)
1732 priv_state->walking_pattern_26 = 1;
1734 priv_state->walking_pattern_26 = 0;
1736 if (brc_method == HEVC_BRC_CQP) {
1737 generic_state->brc_enabled = 0;
1738 generic_state->num_pak_passes = 1;
1739 priv_state->lcu_brc_enabled = 0;
1741 generic_state->brc_enabled = 1;
1742 generic_state->num_pak_passes = 4;
1744 if (brc_method == HEVC_BRC_VCM ||
1745 encoder_context->brc.mb_rate_control[0] == 0)
1746 priv_state->lcu_brc_enabled = (priv_state->tu_mode == HEVC_TU_BEST_QUALITY);
1747 else if (brc_method == HEVC_BRC_ICQ ||
1748 encoder_context->brc.mb_rate_control[0] == 1)
1749 priv_state->lcu_brc_enabled = 1;
1751 priv_state->lcu_brc_enabled = 0;
1753 if (brc_method == HEVC_BRC_CBR) {
1754 priv_state->target_bit_rate_in_kbs =
1755 ALIGN(encoder_context->brc.bits_per_second[0], HEVC_BRC_KBPS) /
1757 priv_state->max_bit_rate_in_kbs = priv_state->target_bit_rate_in_kbs;
1758 priv_state->min_bit_rate_in_kbs = priv_state->target_bit_rate_in_kbs;
1760 if (encoder_context->brc.target_percentage[0] > HEVC_BRC_MIN_TARGET_PERCENTAGE) {
1761 priv_state->target_bit_rate_in_kbs =
1762 ALIGN(encoder_context->brc.bits_per_second[0], HEVC_BRC_KBPS) /
1764 priv_state->max_bit_rate_in_kbs = priv_state->target_bit_rate_in_kbs;
1765 priv_state->min_bit_rate_in_kbs = priv_state->target_bit_rate_in_kbs *
1766 (2 * encoder_context->brc.target_percentage[0] - 100) /
1768 priv_state->target_bit_rate_in_kbs = priv_state->max_bit_rate_in_kbs *
1769 encoder_context->brc.target_percentage[0] / 100;
1775 if (encoder_context->brc.framerate[0].den)
1776 priv_state->frames_per_100s = encoder_context->brc.framerate[0].num * 100 /
1777 encoder_context->brc.framerate[0].den;
1779 priv_state->init_vbv_buffer_fullness_in_bit =
1780 encoder_context->brc.hrd_initial_buffer_fullness;
1781 priv_state->vbv_buffer_size_in_bit =
1782 encoder_context->brc.hrd_buffer_size;
1785 priv_state->brc_method = brc_method;
1786 generic_state->brc_need_reset = brc_reset;
1787 encoder_context->brc.need_reset = 0;
1790 gen9_hevc_configure_roi(encode_state, encoder_context);
1794 gen9_hevc_brc_init_rest_set_curbe(VADriverContextP ctx,
1795 struct encode_state *encode_state,
1796 struct intel_encoder_context *encoder_context,
1797 struct i965_gpe_context *gpe_context,
1800 struct encoder_vme_mfc_context *vme_context = NULL;
1801 struct gen9_hevc_encoder_state *priv_state = NULL;
1802 gen9_hevc_brc_initreset_curbe_data *cmd = NULL;
1803 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
1804 double input_bits_per_frame = 0;
1805 double bps_ratio = 0;
1807 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1808 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1809 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
1811 cmd = i965_gpe_context_map_curbe(gpe_context);
1815 memcpy((void *)cmd, GEN9_HEVC_BRCINIT_CURBE_DATA, sizeof(GEN9_HEVC_BRCINIT_CURBE_DATA));
1817 cmd->dw0.profile_level_max_frame = gen9_hevc_get_profile_level_max_frame(seq_param,
1818 priv_state->user_max_frame_size,
1819 priv_state->frames_per_100s);
1820 cmd->dw1.init_buf_full = priv_state->init_vbv_buffer_fullness_in_bit;
1821 cmd->dw2.buf_size = priv_state->vbv_buffer_size_in_bit;
1822 cmd->dw3.targe_bit_rate = priv_state->target_bit_rate_in_kbs * HEVC_BRC_KBPS;
1823 cmd->dw4.maximum_bit_rate = priv_state->max_bit_rate_in_kbs * HEVC_BRC_KBPS;
1825 cmd->dw9.frame_width = priv_state->picture_width;
1826 cmd->dw10.frame_height = priv_state->picture_height;
1827 cmd->dw12.number_slice = encode_state->num_slice_params_ext;
1828 cmd->dw6.frame_rate_m = priv_state->frames_per_100s;
1829 cmd->dw7.frame_rate_d = 100;
1830 cmd->dw8.brc_flag = 0;
1831 cmd->dw8.brc_flag |= (priv_state->lcu_brc_enabled) ? 0 : HEVC_BRCINIT_DISABLE_MBBRC;
1832 cmd->dw25.acqp_buffer = 1;
1834 if (priv_state->brc_method == HEVC_BRC_CBR) {
1835 cmd->dw4.maximum_bit_rate = cmd->dw3.targe_bit_rate;
1836 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISCBR;
1837 } else if (priv_state->brc_method == HEVC_BRC_VBR) {
1838 if (cmd->dw4.maximum_bit_rate < cmd->dw3.targe_bit_rate)
1839 cmd->dw4.maximum_bit_rate = cmd->dw3.targe_bit_rate * 2;
1840 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISVBR;
1841 } else if (priv_state->brc_method == HEVC_BRC_AVBR) {
1842 cmd->dw4.maximum_bit_rate = priv_state->target_bit_rate_in_kbs * HEVC_BRC_KBPS;
1843 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISAVBR;
1844 } else if (priv_state->brc_method == HEVC_BRC_ICQ) {
1845 cmd->dw25.acqp_buffer = priv_state->crf_quality_factor;
1846 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISICQ;
1847 } else if (priv_state->brc_method == HEVC_BRC_VCM) {
1848 cmd->dw4.maximum_bit_rate = priv_state->target_bit_rate_in_kbs * HEVC_BRC_KBPS;
1849 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISVCM;
1852 if (priv_state->num_b_in_gop[1] ||
1853 priv_state->num_b_in_gop[2]) {
1854 cmd->dw8.brc_param_a = priv_state->gop_size / priv_state->gop_ref_dist;
1855 cmd->dw9.brc_param_b = cmd->dw8.brc_param_a;
1856 cmd->dw13.brc_param_c = cmd->dw8.brc_param_a * 2;
1857 cmd->dw14.brc_param_d = priv_state->gop_size - cmd->dw8.brc_param_a -
1858 cmd->dw9.brc_param_b - cmd->dw13.brc_param_c;
1860 if (!priv_state->num_b_in_gop[2])
1861 cmd->dw14.max_brc_level = 3;
1863 cmd->dw14.max_brc_level = 4;
1865 cmd->dw14.max_brc_level = 1;
1866 cmd->dw8.brc_param_a = priv_state->gop_ref_dist ? (priv_state->gop_size - 1) / priv_state->gop_ref_dist : 0;
1867 cmd->dw9.brc_param_b = priv_state->gop_size - 1 - cmd->dw8.brc_param_a;
1870 cmd->dw10.avbr_accuracy = GEN9_HEVC_AVBR_ACCURACY;
1871 cmd->dw11.avbr_convergence = GEN9_HEVC_AVBR_CONVERGENCE;
1873 input_bits_per_frame = (double)(cmd->dw4.maximum_bit_rate) *
1874 (double)(cmd->dw7.frame_rate_d) /
1875 (double)(cmd->dw6.frame_rate_m);
1876 if (cmd->dw2.buf_size < (unsigned int)input_bits_per_frame * 4)
1877 cmd->dw2.buf_size = (unsigned int)input_bits_per_frame * 4;
1879 if (cmd->dw1.init_buf_full == 0)
1880 cmd->dw1.init_buf_full = cmd->dw2.buf_size * 7 / 8;
1882 if (cmd->dw1.init_buf_full < (unsigned int)(input_bits_per_frame * 2))
1883 cmd->dw1.init_buf_full = (unsigned int)(input_bits_per_frame * 2);
1885 if (cmd->dw1.init_buf_full > cmd->dw2.buf_size)
1886 cmd->dw1.init_buf_full = cmd->dw2.buf_size;
1888 if (priv_state->brc_method == HEVC_BRC_AVBR) {
1889 cmd->dw2.buf_size = priv_state->target_bit_rate_in_kbs * 2 * HEVC_BRC_KBPS;
1890 cmd->dw1.init_buf_full = (unsigned int)(cmd->dw2.buf_size * 3 / 4);
1893 bps_ratio = input_bits_per_frame / (cmd->dw2.buf_size / 30);
1894 bps_ratio = (bps_ratio < 0.1) ? 0.1 : (bps_ratio > 3.5) ? 3.5 : bps_ratio;
1896 cmd->dw19.deviation_threshold0_pbframe = (unsigned int)(-50 * pow(0.90, bps_ratio));
1897 cmd->dw19.deviation_threshold1_pbframe = (unsigned int)(-50 * pow(0.66, bps_ratio));
1898 cmd->dw19.deviation_threshold2_pbframe = (unsigned int)(-50 * pow(0.46, bps_ratio));
1899 cmd->dw19.deviation_threshold3_pbframe = (unsigned int)(-50 * pow(0.3, bps_ratio));
1901 cmd->dw20.deviation_threshold4_pbframe = (unsigned int)(50 * pow(0.3, bps_ratio));
1902 cmd->dw20.deviation_threshold5_pbframe = (unsigned int)(50 * pow(0.46, bps_ratio));
1903 cmd->dw20.deviation_threshold6_pbframe = (unsigned int)(50 * pow(0.7, bps_ratio));
1904 cmd->dw20.deviation_threshold7_pbframe = (unsigned int)(50 * pow(0.9, bps_ratio));
1906 cmd->dw21.deviation_threshold0_vbr_control = (unsigned int)(-50 * pow(0.9, bps_ratio));
1907 cmd->dw21.deviation_threshold1_vbr_control = (unsigned int)(-50 * pow(0.7, bps_ratio));
1908 cmd->dw21.deviation_threshold2_vbr_control = (unsigned int)(-50 * pow(0.5, bps_ratio));
1909 cmd->dw21.deviation_threshold3_vbr_control = (unsigned int)(-50 * pow(0.3, bps_ratio));
1911 cmd->dw22.deviation_threshold4_vbr_control = (unsigned int)(100 * pow(0.4, bps_ratio));
1912 cmd->dw22.deviation_threshold5_vbr_control = (unsigned int)(100 * pow(0.5, bps_ratio));
1913 cmd->dw22.deviation_threshold6_vbr_control = (unsigned int)(100 * pow(0.75, bps_ratio));
1914 cmd->dw22.deviation_threshold7_vbr_control = (unsigned int)(100 * pow(0.9, bps_ratio));
1916 cmd->dw23.deviation_threshold0_iframe = (unsigned int)(-50 * pow(0.8, bps_ratio));
1917 cmd->dw23.deviation_threshold1_iframe = (unsigned int)(-50 * pow(0.6, bps_ratio));
1918 cmd->dw23.deviation_threshold2_iframe = (unsigned int)(-50 * pow(0.34, bps_ratio));
1919 cmd->dw23.deviation_threshold3_iframe = (unsigned int)(-50 * pow(0.2, bps_ratio));
1921 cmd->dw24.deviation_threshold4_iframe = (unsigned int)(50 * pow(0.2, bps_ratio));
1922 cmd->dw24.deviation_threshold5_iframe = (unsigned int)(50 * pow(0.4, bps_ratio));
1923 cmd->dw24.deviation_threshold6_iframe = (unsigned int)(50 * pow(0.66, bps_ratio));
1924 cmd->dw24.deviation_threshold7_iframe = (unsigned int)(50 * pow(0.9, bps_ratio));
1927 priv_state->brc_init_current_target_buf_full_in_bits = cmd->dw1.init_buf_full;
1929 priv_state->brc_init_reset_buf_size_in_bits = (double)cmd->dw2.buf_size;
1930 priv_state->brc_init_reset_input_bits_per_frame = input_bits_per_frame;
1932 i965_gpe_context_unmap_curbe(gpe_context);
1936 gen9_hevc_brc_init_rest_set_surfaces(VADriverContextP ctx,
1937 struct intel_encoder_context *encoder_context,
1938 struct i965_gpe_context *gpe_context)
1940 struct encoder_vme_mfc_context *vme_context = NULL;
1941 struct gen9_hevc_encoder_context *priv_ctx = NULL;
1944 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1945 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
1947 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
1948 HEVC_ENC_SURFACE_BRC_HISTORY, bti_idx++,
1949 0, 0, 0, NULL, NULL);
1951 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
1952 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
1953 0, 1, I965_SURFACEFORMAT_R8_UNORM,
1954 &priv_ctx->res_brc_me_dist_buffer, NULL);
1958 gen9_hevc_brc_init_reset(VADriverContextP ctx,
1959 struct encode_state *encode_state,
1960 struct intel_encoder_context *encoder_context,
1963 struct encoder_vme_mfc_context *vme_context = NULL;
1964 struct gen9_hevc_encoder_context *priv_ctx = NULL;
1966 struct i965_gpe_context *gpe_context = NULL;
1967 struct gpe_media_object_parameter param;
1968 int media_state = HEVC_ENC_MEDIA_STATE_BRC_INIT_RESET;
1969 int gpe_idx = reset ? HEVC_BRC_RESET_IDX : HEVC_BRC_INIT_IDX;
1971 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1972 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
1973 gpe_context = &priv_ctx->brc_context.gpe_contexts[gpe_idx];
1975 gen8_gpe_context_init(ctx, gpe_context);
1976 gen9_gpe_reset_binding_table(ctx, gpe_context);
1977 gen9_hevc_brc_init_rest_set_curbe(ctx, encode_state, encoder_context, gpe_context,
1979 gen9_hevc_brc_init_rest_set_surfaces(ctx, encoder_context, gpe_context);
1980 gen8_gpe_setup_interface_data(ctx, gpe_context);
1982 memset(¶m, 0, sizeof(param));
1983 gen9_hevc_run_object(ctx, encoder_context, gpe_context, ¶m,
1988 gen9_hevc_brc_intra_dist_set_curbe(VADriverContextP ctx,
1989 struct encode_state *encode_state,
1990 struct intel_encoder_context *encoder_context,
1991 struct i965_gpe_context *gpe_context)
1993 struct encoder_vme_mfc_context *vme_context = NULL;
1994 struct gen9_hevc_encoder_state *priv_state = NULL;
1995 gen9_hevc_brc_coarse_intra_curbe_data *cmd = NULL;
1998 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1999 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2001 cmd = i965_gpe_context_map_curbe(gpe_context);
2005 memset((void *)cmd, 0, sizeof(*cmd));
2007 cmd->dw0.picture_width_in_luma_samples = priv_state->frame_width_4x;
2008 cmd->dw0.picture_height_in_luma_samples = priv_state->frame_height_4x;
2010 cmd->dw1.inter_sad = 2;
2011 cmd->dw1.intra_sad = 2;
2013 cmd->dw8.bti_src_y4 = bti_idx++;
2014 cmd->dw9.bti_intra_dist = bti_idx++;
2015 cmd->dw10.bti_vme_intra = bti_idx++;
2017 i965_gpe_context_unmap_curbe(gpe_context);
2021 gen9_hevc_brc_intra_dist_set_surfaces(VADriverContextP ctx,
2022 struct encode_state *encode_state,
2023 struct intel_encoder_context *encoder_context,
2024 struct i965_gpe_context *gpe_context)
2026 struct encoder_vme_mfc_context *vme_context = NULL;
2027 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2028 struct object_surface *obj_surface;
2029 struct gen9_hevc_surface_priv *surface_priv;
2032 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2033 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2035 obj_surface = encode_state->reconstructed_object;
2036 surface_priv = (struct gen9_hevc_surface_priv *)(obj_surface->private_data);
2037 obj_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID];
2039 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2040 HEVC_ENC_SURFACE_Y_4X, bti_idx++,
2041 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2044 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2045 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
2046 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2047 &priv_ctx->res_brc_intra_dist_buffer, NULL);
2049 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
2050 HEVC_ENC_SURFACE_Y_4X_VME, bti_idx++,
2055 gen9_hevc_brc_intra_dist(VADriverContextP ctx,
2056 struct encode_state *encode_state,
2057 struct intel_encoder_context *encoder_context)
2059 struct encoder_vme_mfc_context *vme_context = NULL;
2060 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2061 struct gen9_hevc_encoder_state *priv_state = NULL;
2062 struct i965_gpe_context *gpe_context = NULL;
2063 struct gpe_media_object_walker_parameter param;
2064 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
2065 int media_state = HEVC_ENC_MEDIA_STATE_ENC_I_FRAME_DIST;
2066 int gpe_idx = HEVC_BRC_COARSE_INTRA_IDX;
2068 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2069 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2070 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2071 gpe_context = &priv_ctx->brc_context.gpe_contexts[gpe_idx];
2073 gen8_gpe_context_init(ctx, gpe_context);
2074 gen9_gpe_reset_binding_table(ctx, gpe_context);
2075 gen9_hevc_brc_intra_dist_set_curbe(ctx, encode_state, encoder_context, gpe_context);
2076 gen9_hevc_brc_intra_dist_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
2077 gen8_gpe_setup_interface_data(ctx, gpe_context);
2079 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
2080 hevc_walker_param.resolution_x = priv_state->downscaled_width_4x_in_mb;
2081 hevc_walker_param.resolution_y = priv_state->downscaled_height_4x_in_mb;
2082 hevc_walker_param.no_dependency = 1;
2083 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
2084 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
2088 static GEN9_HEVC_BRC_UPDATE_FRAME_TYPE gen9_hevc_get_brc_frame_type(unsigned int pic_type,
2091 if (pic_type == HEVC_SLICE_I)
2092 return HEVC_BRC_FTYPE_I;
2093 else if (pic_type == HEVC_SLICE_P)
2094 return HEVC_BRC_FTYPE_P_OR_LB;
2096 return low_delay ? HEVC_BRC_FTYPE_P_OR_LB : HEVC_BRC_FTYPE_B;
2100 gen9_hevc_brc_update_set_roi_curbe(VADriverContextP ctx,
2101 struct encode_state *encode_state,
2102 struct intel_encoder_context *encoder_context,
2103 gen9_hevc_brc_udpate_curbe_data *cmd)
2105 struct encoder_vme_mfc_context *vme_context = NULL;
2106 struct generic_enc_codec_state *generic_state = NULL;
2107 struct gen9_hevc_encoder_state *priv_state = NULL;
2108 struct intel_roi *roi_par = NULL;
2109 unsigned int roi_size = 0, roi_ratio = 0;
2112 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2113 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2114 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2116 cmd->dw6.cqp_value = 0;
2117 cmd->dw6.roi_flag = 1 | (generic_state->brc_enabled << 1) |
2118 (priv_state->video_surveillance_flag << 2);
2120 for (i = 0; i < priv_state->num_roi; i++) {
2121 roi_par = &priv_state->roi[i];
2122 roi_size += abs(roi_par->right - roi_par->left) *
2123 abs(roi_par->bottom - roi_par->top) * 256;
2127 roi_ratio = MIN(2 * (priv_state->width_in_mb * priv_state->height_in_mb * 256 / roi_size - 1),
2130 cmd->dw6.roi_ratio = roi_ratio;
2131 cmd->dw7.frame_width_in_lcu = priv_state->frame_width_in_max_lcu;
2133 if (!generic_state->brc_enabled) {
2134 VAEncPictureParameterBufferHEVC *pic_param = NULL;
2135 VAEncSliceParameterBufferHEVC *slice_param = NULL;
2137 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
2138 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
2140 cmd->dw1.frame_number = priv_state->frame_number;
2141 cmd->dw6.cqp_value = pic_param->pic_init_qp + slice_param->slice_qp_delta;
2142 cmd->dw5.curr_frame_type = gen9_hevc_get_brc_frame_type(priv_state->picture_coding_type,
2143 priv_state->low_delay);
2148 gen9_hevc_brc_update_lcu_based_set_roi_parameters(VADriverContextP ctx,
2149 struct encode_state *encode_state,
2150 struct intel_encoder_context *encoder_context,
2151 struct i965_gpe_context *gpe_context)
2153 struct encoder_vme_mfc_context *vme_context = NULL;
2154 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2155 struct generic_enc_codec_state *generic_state = NULL;
2156 struct gen9_hevc_encoder_state *priv_state = NULL;
2157 struct intel_roi *roi_par = NULL;
2158 unsigned int width_in_mb_aligned = 0;
2159 unsigned int roi_level, qp_delta;
2160 unsigned int mb_num = 0;
2161 unsigned int *pdata = NULL;
2162 unsigned int out_data = 0;
2165 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2166 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2167 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2168 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2170 width_in_mb_aligned = ALIGN(priv_state->width_in_mb * 4, 64);
2171 mb_num = priv_state->width_in_mb * priv_state->height_in_mb;
2173 pdata = i965_map_gpe_resource(&priv_ctx->res_roi_buffer);
2177 for (i = 0 ; i < mb_num; i++) {
2178 int cur_mb_y = i / priv_state->width_in_mb;
2179 int cur_mb_x = i - cur_mb_y * priv_state->width_in_mb;
2184 for (roi_idx = (priv_state->num_roi - 1); roi_idx >= 0; roi_idx--) {
2185 roi_par = &priv_state->roi[roi_idx];
2187 roi_level = qp_delta = 0;
2188 if (generic_state->brc_enabled && !priv_state->roi_value_is_qp_delta)
2189 roi_level = roi_par->value * 5;
2191 qp_delta = roi_par->value;
2193 if (roi_level == 0 && qp_delta == 0)
2196 if ((cur_mb_x >= roi_par->left) &&
2197 (cur_mb_x < roi_par->right) &&
2198 (cur_mb_y >= roi_par->top) &&
2199 (cur_mb_y < roi_par->bottom))
2200 out_data = 15 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
2201 else if ((cur_mb_x >= roi_par->left - 1) &&
2202 (cur_mb_x < roi_par->right + 1) &&
2203 (cur_mb_y >= roi_par->top - 1) &&
2204 (cur_mb_y < roi_par->bottom + 1))
2205 out_data = 14 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
2206 else if ((cur_mb_x >= roi_par->left - 2) &&
2207 (cur_mb_x < roi_par->right + 2) &&
2208 (cur_mb_y >= roi_par->top - 2) &&
2209 (cur_mb_y < roi_par->bottom + 2))
2210 out_data = 13 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
2211 else if ((cur_mb_x >= roi_par->left - 3) &&
2212 (cur_mb_x < roi_par->right + 3) &&
2213 (cur_mb_y >= roi_par->top - 3) &&
2214 (cur_mb_y < roi_par->bottom + 3)) {
2215 out_data = 12 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
2219 pdata[(cur_mb_y * (width_in_mb_aligned >> 2)) + cur_mb_x] = out_data;
2222 i965_unmap_gpe_resource(&priv_ctx->res_roi_buffer);
2226 gen9_hevc_brc_update_lcu_based_set_curbe(VADriverContextP ctx,
2227 struct encode_state *encode_state,
2228 struct intel_encoder_context *encoder_context,
2229 struct i965_gpe_context *gpe_context)
2231 struct encoder_vme_mfc_context *vme_context = NULL;
2232 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2233 struct generic_enc_codec_state *generic_state = NULL;
2234 struct gen9_hevc_encoder_state *priv_state = NULL;
2235 gen9_hevc_brc_udpate_curbe_data *cmd = NULL, *frame_cmd = NULL;
2237 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2238 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2239 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2240 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2242 cmd = i965_gpe_context_map_curbe(gpe_context);
2246 if (generic_state->brc_enabled) {
2247 frame_cmd = i965_gpe_context_map_curbe(&priv_ctx->brc_context.gpe_contexts[HEVC_BRC_FRAME_UPDATE_IDX]);
2252 memcpy((void *)cmd, (void *)frame_cmd, sizeof(*cmd));
2254 i965_gpe_context_unmap_curbe(&priv_ctx->brc_context.gpe_contexts[HEVC_BRC_FRAME_UPDATE_IDX]);
2256 memcpy((void *)cmd, GEN9_HEVC_BRCUPDATE_CURBE_DATA,
2257 sizeof(GEN9_HEVC_BRCUPDATE_CURBE_DATA));
2260 if (priv_state->num_roi)
2261 gen9_hevc_brc_update_set_roi_curbe(ctx, encode_state, encoder_context, cmd);
2263 i965_gpe_context_unmap_curbe(gpe_context);
2267 gen9_hevc_brc_update_lcu_based_set_surfaces(VADriverContextP ctx,
2268 struct encode_state *encode_state,
2269 struct intel_encoder_context *encoder_context,
2270 struct i965_gpe_context *gpe_context)
2272 struct encoder_vme_mfc_context *vme_context = NULL;
2273 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2274 struct gen9_hevc_encoder_state *priv_state = NULL;
2277 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2278 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2279 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2281 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2282 HEVC_ENC_SURFACE_BRC_HISTORY, bti_idx++,
2283 0, 0, 0, NULL, NULL);
2285 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2286 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
2287 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2288 priv_state->picture_coding_type == HEVC_SLICE_I ?
2289 &priv_ctx->res_brc_intra_dist_buffer :
2290 &priv_ctx->res_brc_me_dist_buffer,
2293 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2294 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
2295 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2296 &priv_ctx->res_brc_intra_dist_buffer, NULL);
2298 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2299 HEVC_ENC_SURFACE_HME_MVP, bti_idx++,
2300 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2303 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2304 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
2305 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2308 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2309 HEVC_ENC_SURFACE_ROI, bti_idx++,
2310 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2315 gen9_hevc_brc_update_lcu_based(VADriverContextP ctx,
2316 struct encode_state *encode_state,
2317 struct intel_encoder_context *encoder_context)
2319 struct encoder_vme_mfc_context *vme_context = NULL;
2320 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2321 struct gen9_hevc_encoder_state *priv_state = NULL;
2322 struct i965_gpe_context *gpe_context = NULL;
2323 struct gpe_media_object_walker_parameter param;
2324 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
2325 int media_state = HEVC_ENC_MEDIA_STATE_HEVC_BRC_LCU_UPDATE;
2326 int gpe_idx = HEVC_BRC_LCU_UPDATE_IDX;
2328 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2329 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2330 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2331 gpe_context = &priv_ctx->brc_context.gpe_contexts[gpe_idx];
2333 gen8_gpe_context_init(ctx, gpe_context);
2334 gen9_gpe_reset_binding_table(ctx, gpe_context);
2336 if (priv_state->num_roi)
2337 gen9_hevc_brc_update_lcu_based_set_roi_parameters(ctx, encode_state, encoder_context,
2340 gen9_hevc_brc_update_lcu_based_set_curbe(ctx, encode_state, encoder_context, gpe_context);
2341 gen9_hevc_brc_update_lcu_based_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
2342 gen8_gpe_setup_interface_data(ctx, gpe_context);
2344 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
2345 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 128) >> 7;
2346 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 128) >> 7;
2347 hevc_walker_param.no_dependency = 1;
2348 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
2349 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
2354 gen9_hevc_add_pic_state(VADriverContextP ctx,
2355 struct encode_state *encode_state,
2356 struct intel_encoder_context *encoder_context,
2357 struct i965_gpe_resource *pic_state_ptr,
2358 int pic_state_offset,
2361 struct i965_driver_data *i965 = i965_driver_data(ctx);
2362 struct encoder_vme_mfc_context *pak_context = NULL;
2363 struct gen9_hevc_encoder_state *priv_state = NULL;
2364 VAEncPictureParameterBufferHEVC *pic_param = NULL;
2365 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
2366 unsigned int tmp_data[31], *cmd_ptr = NULL;
2369 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2370 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
2372 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
2373 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
2376 cmd_size = (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 31 : 19;
2377 memset((void *)tmp_data, 0, 4 * cmd_size);
2379 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info))
2380 *cmd_ptr++ = HCP_PIC_STATE | (31 - 2);
2382 *cmd_ptr++ = HCP_PIC_STATE | (19 - 2);
2384 *cmd_ptr++ = (priv_state->height_in_cu - 1) << 16 |
2386 (priv_state->width_in_cu - 1);
2387 *cmd_ptr++ = (seq_param->log2_min_transform_block_size_minus2 +
2388 seq_param->log2_diff_max_min_transform_block_size) << 6 |
2389 seq_param->log2_min_transform_block_size_minus2 << 4 |
2390 (seq_param->log2_min_luma_coding_block_size_minus3 +
2391 seq_param->log2_diff_max_min_luma_coding_block_size) << 2 |
2392 seq_param->log2_min_luma_coding_block_size_minus3;
2394 *cmd_ptr++ = ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 1 : 0) << 27 |
2395 seq_param->seq_fields.bits.strong_intra_smoothing_enabled_flag << 26 |
2396 pic_param->pic_fields.bits.transquant_bypass_enabled_flag << 25 |
2397 ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 0 : priv_state->ctu_max_bitsize_allowed > 0) << 24 |
2398 seq_param->seq_fields.bits.amp_enabled_flag << 23 |
2399 pic_param->pic_fields.bits.transform_skip_enabled_flag << 22 |
2402 pic_param->pic_fields.bits.weighted_pred_flag << 19 |
2403 pic_param->pic_fields.bits.weighted_bipred_flag << 18 |
2405 pic_param->pic_fields.bits.entropy_coding_sync_enabled_flag << 16 |
2407 pic_param->pic_fields.bits.sign_data_hiding_enabled_flag << 13 |
2408 pic_param->log2_parallel_merge_level_minus2 << 10 |
2409 pic_param->pic_fields.bits.constrained_intra_pred_flag << 9 |
2410 seq_param->seq_fields.bits.pcm_loop_filter_disabled_flag << 8 |
2411 (pic_param->diff_cu_qp_delta_depth & 0x03) << 6 |
2412 pic_param->pic_fields.bits.cu_qp_delta_enabled_flag << 5 |
2414 seq_param->seq_fields.bits.sample_adaptive_offset_enabled_flag << 3 |
2416 *cmd_ptr++ = seq_param->seq_fields.bits.bit_depth_luma_minus8 << 27 |
2417 seq_param->seq_fields.bits.bit_depth_chroma_minus8 << 24 |
2418 ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 0 : 7) << 20 |
2419 ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 0 : 7) << 16 |
2420 seq_param->max_transform_hierarchy_depth_inter << 13 |
2421 seq_param->max_transform_hierarchy_depth_intra << 10 |
2422 (pic_param->pps_cr_qp_offset & 0x1f) << 5 |
2423 (pic_param->pps_cb_qp_offset & 0x1f);
2425 *cmd_ptr++ = 0 << 29 |
2426 priv_state->ctu_max_bitsize_allowed;
2428 *(cmd_ptr - 1) |= 0 << 31 |
2432 (pic_state_offset ? 1 : 0) << 16;
2434 *cmd_ptr++ = 0 << 31 |
2436 *cmd_ptr++ = 0 << 31 |
2438 *cmd_ptr++ = 0 << 16 |
2448 *cmd_ptr++ = 0 << 30 |
2451 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
2454 for (i = 0; i < 12; i++)
2458 if (pic_state_ptr) {
2459 char *pdata = i965_map_gpe_resource(pic_state_ptr);
2464 memcpy(pdata + pic_state_offset, tmp_data, cmd_size * 4);
2466 pdata += pic_state_offset + cmd_size * 4;
2468 *(unsigned int *)pdata++ = MI_BATCH_BUFFER_END;
2470 i965_unmap_gpe_resource(pic_state_ptr);
2472 struct intel_batchbuffer *batch = encoder_context->base.batch;
2474 BEGIN_BCS_BATCH(batch, cmd_size);
2476 intel_batchbuffer_data(batch, tmp_data, cmd_size * 4);
2478 ADVANCE_BCS_BATCH(batch);
2483 gen9_hevc_brc_update_set_pic_states(VADriverContextP ctx,
2484 struct encode_state *encode_state,
2485 struct intel_encoder_context *encoder_context)
2487 struct encoder_vme_mfc_context *vme_context = NULL;
2488 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2489 struct generic_enc_codec_state *generic_state = NULL;
2490 struct gen9_hevc_encoder_state *priv_state = NULL;
2491 int i = 0, offset = 0;
2493 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2494 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2495 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2496 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2498 for (i = 0; i < generic_state->num_pak_passes; i++) {
2499 gen9_hevc_add_pic_state(ctx, encode_state, encoder_context,
2500 &priv_ctx->res_brc_pic_states_read_buffer,
2503 offset += priv_state->pic_state_size;
2508 gen9_hevc_brc_update_set_constant(VADriverContextP ctx,
2509 struct encode_state *encode_state,
2510 struct intel_encoder_context *encoder_context)
2512 struct encoder_vme_mfc_context *vme_context = NULL;
2513 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2514 struct gen9_hevc_encoder_state *priv_state = NULL;
2515 unsigned int width, height, size;
2516 unsigned char *pdata = NULL;
2519 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2520 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2521 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2523 pdata = i965_map_gpe_resource(&priv_ctx->res_brc_constant_data_buffer);
2527 width = ALIGN(GEN9_HEVC_ENC_BRC_CONSTANT_SURFACE_WIDTH, 64);
2528 height = GEN9_HEVC_ENC_BRC_CONSTANT_SURFACE_HEIGHT;
2529 size = width * height;
2530 memset((void *)pdata, 0, size);
2532 memcpy((void *)pdata, GEN9_HEVC_BRCUPDATE_QP_ADJUST, GEN9_HEVC_BRCUPDATE_QP_ADJUST_SIZE);
2533 pdata += GEN9_HEVC_BRCUPDATE_QP_ADJUST_SIZE;
2535 if (priv_state->picture_coding_type == HEVC_SLICE_I)
2536 memset((void *)pdata, 0, GEN9_HEVC_ENC_SKIP_VAL_SIZE);
2538 gen9_hevc_mbenc_b_mb_enc_curbe_data *curbe_cmd = NULL;
2541 gen9_hevc_get_b_mbenc_default_curbe(priv_state->tu_mode,
2542 priv_state->picture_coding_type,
2543 (void **)&curbe_cmd,
2546 idx = curbe_cmd->dw3.block_based_skip_enable ? 1 : 0;
2547 memcpy((void *)pdata, GEN9_HEVC_ENC_SKIP_THREAD[idx], sizeof(GEN9_HEVC_ENC_SKIP_THREAD[idx]));
2549 pdata += GEN9_HEVC_ENC_SKIP_VAL_SIZE;
2551 memcpy((void *)pdata, GEN9_HEVC_ENC_BRC_LAMBDA_HAAR, sizeof(GEN9_HEVC_ENC_BRC_LAMBDA_HAAR));
2552 pdata += GEN9_HEVC_ENC_BRC_LAMBDA_TABLE_SIZE;
2554 idx = (priv_state->picture_coding_type == HEVC_SLICE_I) ? 0 :
2555 (priv_state->picture_coding_type == HEVC_SLICE_P) ? 1 : 2;
2556 memcpy((void *)pdata, GEN9_HEVC_ENC_BRC_MVCOST_HAAR[idx], sizeof(GEN9_HEVC_ENC_BRC_MVCOST_HAAR[idx]));
2558 i965_unmap_gpe_resource(&priv_ctx->res_brc_constant_data_buffer);
2562 unsigned int gen9_hevc_get_start_code_offset(unsigned char *ptr,
2565 unsigned int count = 0;
2567 while (count < size && *ptr != 0x01) {
2579 unsigned int gen9_hevc_get_emulation_num(unsigned char *ptr,
2582 unsigned int emulation_num = 0;
2583 unsigned int header_offset = 0;
2584 unsigned int zero_count = 0;
2587 header_offset = gen9_hevc_get_start_code_offset(ptr, size);
2588 ptr += header_offset;
2590 for (i = 0 ; i < (size - header_offset); i++, ptr++) {
2591 if (zero_count == 2 && !(*ptr & 0xFC)) {
2602 return emulation_num;
2605 #define HEVC_ENC_START_CODE_NAL_OFFSET (2)
2608 gen9_hevc_get_pic_header_size(struct encode_state *encode_state)
2610 VAEncPackedHeaderParameterBuffer *param = NULL;
2611 unsigned int header_begin = 0;
2612 unsigned int accum_size = 0;
2613 unsigned char *header_data = NULL;
2614 unsigned int length_in_bytes = 0;
2615 int packed_type = 0;
2616 int idx = 0, count = 0, idx_offset = 0;
2617 int i = 0, slice_idx = 0, start_index = 0;
2619 for (i = 0; i < 4; i++) {
2623 packed_type = VAEncPackedHeaderHEVC_VPS;
2626 packed_type = VAEncPackedHeaderHEVC_VPS;
2630 packed_type = VAEncPackedHeaderHEVC_PPS;
2633 packed_type = VAEncPackedHeaderHEVC_SEI;
2639 idx = va_enc_packed_type_to_idx(packed_type) + idx_offset;
2640 if (encode_state->packed_header_data[idx]) {
2641 param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
2642 header_data = (unsigned char *)encode_state->packed_header_data[idx]->buffer;
2643 length_in_bytes = (param->bit_length + 7) / 8;
2645 header_begin = gen9_hevc_get_start_code_offset(header_data, length_in_bytes) +
2646 HEVC_ENC_START_CODE_NAL_OFFSET;
2648 accum_size += length_in_bytes;
2649 if (!param->has_emulation_bytes)
2650 accum_size += gen9_hevc_get_emulation_num(header_data,
2655 for (slice_idx = 0; slice_idx < encode_state->num_slice_params_ext; slice_idx++) {
2656 count = encode_state->slice_rawdata_count[slice_idx];
2657 start_index = encode_state->slice_rawdata_index[slice_idx] &
2658 SLICE_PACKED_DATA_INDEX_MASK;
2660 for (i = 0; i < count; i++) {
2661 param = (VAEncPackedHeaderParameterBuffer *)
2662 (encode_state->packed_header_params_ext[start_index + i]->buffer);
2664 if (param->type == VAEncPackedHeaderSlice)
2667 header_data = (unsigned char *)encode_state->packed_header_data[start_index]->buffer;
2668 length_in_bytes = (param->bit_length + 7) / 8;
2670 accum_size += length_in_bytes;
2671 if (!param->has_emulation_bytes)
2672 accum_size += gen9_hevc_get_emulation_num(header_data,
2677 header_begin = MIN(header_begin, accum_size);
2679 return ((accum_size - header_begin) * 8);
2683 gen9_hevc_brc_update_set_curbe(VADriverContextP ctx,
2684 struct encode_state *encode_state,
2685 struct intel_encoder_context *encoder_context,
2686 struct i965_gpe_context *gpe_context)
2688 struct encoder_vme_mfc_context *vme_context = NULL;
2689 struct generic_enc_codec_state *generic_state = NULL;
2690 struct gen9_hevc_encoder_state *priv_state = NULL;
2691 gen9_hevc_brc_udpate_curbe_data *cmd = NULL;
2693 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2694 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2695 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2697 cmd = i965_gpe_context_map_curbe(gpe_context);
2701 memcpy((void *)cmd, GEN9_HEVC_BRCUPDATE_CURBE_DATA,
2702 sizeof(GEN9_HEVC_BRCUPDATE_CURBE_DATA));
2704 cmd->dw5.target_size_flag = 0;
2705 if (priv_state->brc_init_current_target_buf_full_in_bits >
2706 (double)priv_state->brc_init_reset_buf_size_in_bits) {
2707 priv_state->brc_init_current_target_buf_full_in_bits -=
2708 (double)priv_state->brc_init_reset_buf_size_in_bits;
2709 cmd->dw5.target_size_flag = 1;
2712 if (priv_state->num_skip_frames) {
2713 cmd->dw6.num_skipped_frames = priv_state->num_skip_frames;
2714 cmd->dw15.size_of_skipped_frames = priv_state->size_skip_frames;
2716 priv_state->brc_init_current_target_buf_full_in_bits +=
2717 priv_state->brc_init_reset_input_bits_per_frame * priv_state->num_skip_frames;
2720 cmd->dw0.target_size = (unsigned int)priv_state->brc_init_current_target_buf_full_in_bits;
2721 cmd->dw1.frame_number = priv_state->frame_number;
2722 cmd->dw2.picture_header_size = gen9_hevc_get_pic_header_size(encode_state);
2724 cmd->dw5.brc_flag = 0;
2725 cmd->dw5.curr_frame_type = gen9_hevc_get_brc_frame_type(priv_state->picture_coding_type,
2726 priv_state->low_delay);
2728 cmd->dw5.max_num_paks = generic_state->num_pak_passes;
2729 cmd->dw14.parallel_mode = priv_state->parallel_brc;
2731 priv_state->brc_init_current_target_buf_full_in_bits +=
2732 priv_state->brc_init_reset_input_bits_per_frame;
2734 if (priv_state->brc_method == HEVC_BRC_AVBR) {
2735 cmd->dw3.start_gadj_frame0 = (unsigned int)((10 * GEN9_HEVC_AVBR_CONVERGENCE) / (double)150);
2736 cmd->dw3.start_gadj_frame1 = (unsigned int)((50 * GEN9_HEVC_AVBR_CONVERGENCE) / (double)150);
2737 cmd->dw4.start_gadj_frame2 = (unsigned int)((100 * GEN9_HEVC_AVBR_CONVERGENCE) / (double)150);
2738 cmd->dw4.start_gadj_frame3 = (unsigned int)((150 * GEN9_HEVC_AVBR_CONVERGENCE) / (double)150);
2739 cmd->dw11.g_rate_ratio_threshold0 = (unsigned int)((100 - (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (100 - 40)));
2740 cmd->dw11.g_rate_ratio_threshold1 = (unsigned int)((100 - (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (100 - 75)));
2741 cmd->dw12.g_rate_ratio_threshold2 = (unsigned int)((100 - (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (100 - 97)));
2742 cmd->dw12.g_rate_ratio_threshold3 = (unsigned int)((100 + (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (103 - 100)));
2743 cmd->dw12.g_rate_ratio_threshold4 = (unsigned int)((100 + (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (125 - 100)));
2744 cmd->dw12.g_rate_ratio_threshold5 = (unsigned int)((100 + (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (160 - 100)));
2746 cmd->dw3.start_gadj_frame0 = 10;
2747 cmd->dw3.start_gadj_frame1 = 50;
2748 cmd->dw4.start_gadj_frame2 = 100;
2749 cmd->dw4.start_gadj_frame3 = 150;
2750 cmd->dw11.g_rate_ratio_threshold0 = 40;
2751 cmd->dw11.g_rate_ratio_threshold1 = 75;
2752 cmd->dw12.g_rate_ratio_threshold2 = 97;
2753 cmd->dw12.g_rate_ratio_threshold3 = 103;
2754 cmd->dw12.g_rate_ratio_threshold4 = 125;
2755 cmd->dw12.g_rate_ratio_threshold5 = 160;
2758 i965_gpe_context_unmap_curbe(gpe_context);
2762 gen9_hevc_brc_update_set_surfaces(VADriverContextP ctx,
2763 struct intel_encoder_context *encoder_context,
2764 struct i965_gpe_context *gpe_context)
2766 struct encoder_vme_mfc_context *vme_context = NULL;
2767 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2768 struct gen9_hevc_encoder_state *priv_state = NULL;
2771 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2772 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2773 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2775 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2776 HEVC_ENC_SURFACE_BRC_HISTORY, bti_idx++,
2777 0, 0, 0, NULL, NULL);
2779 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2780 HEVC_ENC_SURFACE_BRC_PAST_PAK_INFO, bti_idx++,
2781 0, 0, 0, NULL, NULL);
2783 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2784 HEVC_ENC_SURFACE_BRC_HCP_PIC_STATE, bti_idx++,
2785 0, 0, 0, &priv_ctx->res_brc_pic_states_read_buffer,
2788 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2789 HEVC_ENC_SURFACE_BRC_HCP_PIC_STATE, bti_idx++,
2790 0, 0, 0, &priv_ctx->res_brc_pic_states_write_buffer,
2793 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2794 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
2795 0, 0, 0, NULL, NULL);
2797 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2798 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
2799 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2800 priv_state->picture_coding_type == HEVC_SLICE_I ?
2801 &priv_ctx->res_brc_intra_dist_buffer :
2802 &priv_ctx->res_brc_me_dist_buffer,
2805 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2806 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
2807 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2812 gen9_hevc_brc_update(VADriverContextP ctx,
2813 struct encode_state *encode_state,
2814 struct intel_encoder_context *encoder_context)
2816 struct encoder_vme_mfc_context *vme_context = NULL;
2817 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2818 struct gen9_hevc_encoder_state *priv_state = NULL;
2819 struct i965_gpe_context *gpe_context = NULL;
2820 struct gpe_media_object_parameter param;
2821 int media_state = HEVC_ENC_MEDIA_STATE_BRC_UPDATE;
2822 int gpe_idx = HEVC_BRC_FRAME_UPDATE_IDX;
2824 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2825 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2826 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2827 gpe_context = &priv_ctx->brc_context.gpe_contexts[gpe_idx];
2829 gen8_gpe_context_init(ctx, gpe_context);
2830 gen9_gpe_reset_binding_table(ctx, gpe_context);
2832 gen9_hevc_brc_update_set_pic_states(ctx, encode_state, encoder_context);
2833 gen9_hevc_brc_update_set_constant(ctx, encode_state, encoder_context);
2834 gen9_hevc_brc_update_set_curbe(ctx, encode_state, encoder_context, gpe_context);
2835 gen9_hevc_brc_update_set_surfaces(ctx, encoder_context, gpe_context);
2837 gen8_gpe_setup_interface_data(ctx, gpe_context);
2839 memset(¶m, 0, sizeof(param));
2840 gen9_hevc_run_object(ctx, encoder_context, gpe_context, ¶m,
2843 if (priv_state->lcu_brc_enabled ||
2844 priv_state->num_roi)
2845 gen9_hevc_brc_update_lcu_based(ctx, encode_state, encoder_context);
2848 // Depth converstion for 10bits
2851 gen9_hevc_frame_depth_conversion_set_curbe(VADriverContextP ctx,
2852 struct encode_state *encode_state,
2853 struct intel_encoder_context *encoder_context,
2854 struct i965_gpe_context *gpe_context,
2855 GEN9_HEVC_DOWNSCALE_STAGE scale_stage)
2857 struct encoder_vme_mfc_context *vme_context = NULL;
2858 struct gen9_hevc_encoder_state *priv_state = NULL;
2859 gen95_hevc_mbenc_ds_combined_curbe_data *cmd = NULL;
2862 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2863 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2865 cmd = i965_gpe_context_map_curbe(gpe_context);
2869 memset((void *)cmd, 0, sizeof(*cmd));
2871 cmd->dw0.pak_bitdepth_chroma = 10;
2872 cmd->dw0.pak_bitdepth_luma = 10;
2873 cmd->dw0.enc_bitdepth_chroma = 8;
2874 cmd->dw0.enc_bitdepth_luma = 8;
2875 cmd->dw0.rounding_value = 1;
2876 cmd->dw1.pic_format = 0;
2877 cmd->dw1.pic_convert_flag = 1;
2878 cmd->dw1.pic_down_scale = scale_stage;
2879 cmd->dw1.pic_mb_stat_output_cntrl = 0;
2880 cmd->dw2.orig_pic_width = priv_state->picture_width;
2881 cmd->dw2.orig_pic_height = priv_state->picture_height;
2883 cmd->dw3.bti_surface_p010 = bti_idx++;
2885 cmd->dw4.bti_surface_nv12 = bti_idx++;
2887 cmd->dw5.bti_src_y_4xdownscaled = bti_idx++;
2888 cmd->dw6.bti_surf_mbstate = bti_idx++;
2889 cmd->dw7.bit_src_y_2xdownscaled = bti_idx++;
2891 i965_gpe_context_unmap_curbe(gpe_context);
2895 gen9_hevc_frame_depth_conversion_set_surfaces(VADriverContextP ctx,
2896 struct encode_state *encode_state,
2897 struct intel_encoder_context *encoder_context,
2898 struct i965_gpe_context *gpe_context,
2899 struct object_surface *src_surface,
2900 struct object_surface *dst_surface)
2902 struct encoder_vme_mfc_context *vme_context = NULL;
2903 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2904 struct gen9_hevc_surface_priv *surface_priv = NULL;
2907 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2908 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2909 surface_priv = (struct gen9_hevc_surface_priv *)dst_surface->private_data;
2911 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2912 HEVC_ENC_SURFACE_RAW_10bit_Y_UV, bti_idx++,
2913 1, 1, I965_SURFACEFORMAT_R8_UNORM,
2917 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2918 HEVC_ENC_SURFACE_RAW_FC_8bit_Y_UV, bti_idx++,
2919 1, 1, I965_SURFACEFORMAT_R8_UNORM,
2921 surface_priv->surface_obj_nv12);
2924 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2925 HEVC_ENC_SURFACE_Y_4X, bti_idx++,
2926 0, 1, I965_SURFACEFORMAT_R32_UNORM,
2928 surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID]);
2930 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2931 HEVC_ENC_SURFACE_RAW_MBSTAT, bti_idx++,
2932 0, 0, 0, NULL, NULL);
2934 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2935 HEVC_ENC_SURFACE_Y_2X, bti_idx++,
2936 0, 1, I965_SURFACEFORMAT_R32_UNORM,
2941 gen9_hevc_frame_depth_conversion(VADriverContextP ctx,
2942 struct encode_state *encode_state,
2943 struct intel_encoder_context *encoder_context,
2944 struct object_surface *src_surface,
2945 struct object_surface *dst_surface,
2946 GEN9_HEVC_DOWNSCALE_STAGE scale_stage)
2948 struct encoder_vme_mfc_context *vme_context = NULL;
2949 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2950 struct gen9_hevc_encoder_state *priv_state = NULL;
2951 struct gpe_media_object_walker_parameter param;
2952 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
2953 struct i965_gpe_context *gpe_context = NULL;
2954 int media_state = HEVC_ENC_MEDIA_STATE_DS_COMBINED;
2956 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2957 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2958 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2960 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_DS_COMBINED_IDX];
2962 gen8_gpe_context_init(ctx, gpe_context);
2963 gen9_gpe_reset_binding_table(ctx, gpe_context);
2964 gen9_hevc_frame_depth_conversion_set_curbe(ctx, encode_state, encoder_context, gpe_context,
2966 gen9_hevc_frame_depth_conversion_set_surfaces(ctx, encode_state, encoder_context, gpe_context,
2967 src_surface, dst_surface);
2968 gen8_gpe_setup_interface_data(ctx, gpe_context);
2970 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
2971 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width >> 2, 32) >> 3;
2972 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height >> 2, 32) >> 3;
2973 hevc_walker_param.no_dependency = 1;
2974 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
2975 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
2980 gen9_hevc_ref_frame_depth_conversion(VADriverContextP ctx,
2981 struct encode_state *encode_state,
2982 struct intel_encoder_context *encoder_context)
2984 struct i965_driver_data *i965 = i965_driver_data(ctx);
2985 struct gen9_hevc_surface_priv *surface_priv = NULL;
2986 VAEncSliceParameterBufferHEVC *slice_param = NULL;
2987 struct object_surface *obj_surface = NULL;
2990 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
2992 for (i = 0; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++) {
2993 obj_surface = SURFACE(slice_param->ref_pic_list0[i].picture_id);
2995 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
2997 if (!surface_priv->surface_nv12_valid) {
2998 gen9_hevc_frame_depth_conversion(ctx, encode_state, encoder_context,
2999 obj_surface, obj_surface,
3000 HEVC_ENC_DS_DISABLED);
3002 surface_priv->surface_reff = surface_priv->surface_obj_nv12;
3003 surface_priv->surface_nv12_valid = 1;
3008 for (i = 0; i < slice_param->num_ref_idx_l1_active_minus1 + 1; i++) {
3009 obj_surface = SURFACE(slice_param->ref_pic_list1[i].picture_id);
3011 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
3013 if (!surface_priv->surface_nv12_valid) {
3014 gen9_hevc_frame_depth_conversion(ctx, encode_state, encoder_context,
3015 obj_surface, obj_surface,
3016 HEVC_ENC_DS_DISABLED);
3018 surface_priv->surface_reff = surface_priv->surface_obj_nv12;
3019 surface_priv->surface_nv12_valid = 1;
3025 // Scaling implementation
3028 gen9_hevc_scaling_set_curbe_2x(struct i965_gpe_context *gpe_context,
3029 struct gen9_hevc_scaling_parameter *scaling_param)
3031 gen9_hevc_scaling2x_curbe_data *cmd;
3033 cmd = i965_gpe_context_map_curbe(gpe_context);
3037 memset((void *)cmd, 0, sizeof(*cmd));
3039 cmd->dw0.input_picture_width = scaling_param->input_frame_width;
3040 cmd->dw0.input_picture_height = scaling_param->input_frame_height;
3042 cmd->dw8.input_y_bti = GEN9_HEVC_SCALING_FRAME_SRC_Y_INDEX;
3043 cmd->dw9.output_y_bti = GEN9_HEVC_SCALING_FRAME_DST_Y_INDEX;
3045 i965_gpe_context_unmap_curbe(gpe_context);
3049 gen9_hevc_scaling_set_curbe_4x(struct i965_gpe_context *gpe_context,
3050 struct gen9_hevc_scaling_parameter *scaling_param)
3052 gen9_hevc_scaling4x_curbe_data *cmd;
3054 cmd = i965_gpe_context_map_curbe(gpe_context);
3058 memset((void *)cmd, 0, sizeof(*cmd));
3060 cmd->dw0.input_picture_width = scaling_param->input_frame_width;
3061 cmd->dw0.input_picture_height = scaling_param->input_frame_height;
3063 cmd->dw1.input_y_bti = GEN9_HEVC_SCALING_FRAME_SRC_Y_INDEX;
3064 cmd->dw2.output_y_bti = GEN9_HEVC_SCALING_FRAME_DST_Y_INDEX;
3066 cmd->dw5.flatness_threshold = 0;
3067 cmd->dw6.enable_mb_flatness_check = scaling_param->enable_mb_flatness_check;
3068 cmd->dw7.enable_mb_variance_output = scaling_param->enable_mb_variance_output;
3069 cmd->dw8.enable_mb_pixel_average_output = scaling_param->enable_mb_pixel_average_output;
3071 if (cmd->dw6.enable_mb_flatness_check ||
3072 cmd->dw7.enable_mb_variance_output ||
3073 cmd->dw8.enable_mb_pixel_average_output)
3074 cmd->dw10.mbv_proc_stat_bti = GEN9_HEVC_SCALING_FRAME_MBVPROCSTATS_DST_INDEX;
3076 i965_gpe_context_unmap_curbe(gpe_context);
3080 gen9_hevc_scaling_set_curbe(struct gen9_hevc_scaling_parameter *scaling_param,
3081 struct i965_gpe_context *gpe_context)
3083 if (scaling_param->use_32x_scaling)
3084 gen9_hevc_scaling_set_curbe_2x(gpe_context, scaling_param);
3086 gen9_hevc_scaling_set_curbe_4x(gpe_context, scaling_param);
3090 gen9_hevc_scaling_set_surfaces(VADriverContextP ctx,
3091 struct encode_state *encode_state,
3092 struct intel_encoder_context *encoder_context,
3093 struct gen9_hevc_scaling_parameter *scaling_param,
3094 struct i965_gpe_context *gpe_context)
3096 unsigned int surface_format;
3098 if (scaling_param->scaling_out_use_32unorm_surf_fmt)
3099 surface_format = I965_SURFACEFORMAT_R32_UNORM;
3100 else if (scaling_param->scaling_out_use_16unorm_surf_fmt)
3101 surface_format = I965_SURFACEFORMAT_R16_UNORM;
3103 surface_format = I965_SURFACEFORMAT_R8_UNORM;
3105 i965_add_2d_gpe_surface(ctx, gpe_context,
3106 scaling_param->input_surface,
3107 0, 1, surface_format,
3108 GEN9_HEVC_SCALING_FRAME_SRC_Y_INDEX);
3110 i965_add_2d_gpe_surface(ctx, gpe_context,
3111 scaling_param->output_surface,
3112 0, 1, surface_format,
3113 GEN9_HEVC_SCALING_FRAME_DST_Y_INDEX);
3115 if ((scaling_param->enable_mb_flatness_check ||
3116 scaling_param->enable_mb_variance_output ||
3117 scaling_param->enable_mb_pixel_average_output) &&
3118 scaling_param->use_4x_scaling) {
3119 i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
3120 scaling_param->pres_mbv_proc_stat_buffer,
3122 I965_SURFACEFORMAT_R8_UNORM,
3123 GEN9_HEVC_SCALING_FRAME_MBVPROCSTATS_DST_INDEX);
3128 gen9_hevc_kernel_scaling(VADriverContextP ctx,
3129 struct encode_state *encode_state,
3130 struct intel_encoder_context *encoder_context,
3131 enum HEVC_HME_TYPE hme_type)
3133 struct encoder_vme_mfc_context *vme_context = NULL;
3134 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3135 struct gen9_hevc_encoder_state *priv_state = NULL;
3136 struct gen9_hevc_surface_priv *surface_priv = NULL;
3137 struct gen9_hevc_scaling_parameter scaling_param;
3138 struct gpe_media_object_walker_parameter param;
3139 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
3140 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
3141 struct i965_gpe_context *gpe_context = NULL;
3142 int gpe_idx = 0, media_state = 0;;
3144 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3145 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3146 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3148 surface_priv = (struct gen9_hevc_surface_priv *)encode_state->reconstructed_object->private_data;
3150 memset((void *)&scaling_param, 0, sizeof(scaling_param));
3153 media_state = HEVC_ENC_MEDIA_STATE_4X_SCALING;
3154 gpe_idx = HEVC_ENC_SCALING_4X;
3155 downscaled_width_in_mb = priv_state->downscaled_width_4x_in_mb;
3156 downscaled_height_in_mb = priv_state->downscaled_height_4x_in_mb;
3158 scaling_param.input_surface = encode_state->input_yuv_object;
3159 scaling_param.input_frame_width = priv_state->picture_width;
3160 scaling_param.input_frame_height = priv_state->picture_height;
3162 scaling_param.output_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID];
3163 scaling_param.output_frame_width = priv_state->frame_width_4x;
3164 scaling_param.output_frame_height = priv_state->frame_height_4x;
3166 scaling_param.enable_mb_flatness_check = priv_state->flatness_check_enable;
3167 scaling_param.enable_mb_variance_output = 0;
3168 scaling_param.enable_mb_pixel_average_output = 0;
3169 scaling_param.pres_mbv_proc_stat_buffer = &(priv_ctx->res_flatness_check_surface);
3171 scaling_param.blk8x8_stat_enabled = 0;
3172 scaling_param.use_4x_scaling = 1;
3173 scaling_param.use_16x_scaling = 0;
3174 scaling_param.use_32x_scaling = 0;
3177 media_state = HEVC_ENC_MEDIA_STATE_16X_SCALING;
3178 gpe_idx = HEVC_ENC_SCALING_16X;
3179 downscaled_width_in_mb = priv_state->downscaled_width_16x_in_mb;
3180 downscaled_height_in_mb = priv_state->downscaled_height_16x_in_mb;
3182 scaling_param.input_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID];
3183 scaling_param.input_frame_width = priv_state->frame_width_4x;
3184 scaling_param.input_frame_height = priv_state->frame_height_4x;
3186 scaling_param.output_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_16X_ID];
3187 scaling_param.output_frame_width = priv_state->frame_width_16x;
3188 scaling_param.output_frame_height = priv_state->frame_height_16x;
3190 scaling_param.enable_mb_flatness_check = 0;
3191 scaling_param.enable_mb_variance_output = 0;
3192 scaling_param.enable_mb_pixel_average_output = 0;
3194 scaling_param.blk8x8_stat_enabled = 0;
3195 scaling_param.use_4x_scaling = 0;
3196 scaling_param.use_16x_scaling = 1;
3197 scaling_param.use_32x_scaling = 0;
3200 media_state = HEVC_ENC_MEDIA_STATE_32X_SCALING;
3201 gpe_idx = HEVC_ENC_SCALING_32X;
3202 downscaled_width_in_mb = priv_state->downscaled_width_32x_in_mb;
3203 downscaled_height_in_mb = priv_state->downscaled_height_32x_in_mb;
3205 scaling_param.input_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_16X_ID];
3206 scaling_param.input_frame_width = priv_state->frame_width_16x;
3207 scaling_param.input_frame_height = priv_state->frame_height_16x;
3209 scaling_param.output_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_32X_ID];
3210 scaling_param.output_frame_width = priv_state->frame_width_32x;
3211 scaling_param.output_frame_height = priv_state->frame_height_32x;
3213 scaling_param.enable_mb_flatness_check = 0;
3214 scaling_param.enable_mb_variance_output = 0;
3215 scaling_param.enable_mb_pixel_average_output = 0;
3217 scaling_param.blk8x8_stat_enabled = 0;
3218 scaling_param.use_4x_scaling = 0;
3219 scaling_param.use_16x_scaling = 0;
3220 scaling_param.use_32x_scaling = 1;
3226 gpe_context = &priv_ctx->scaling_context.gpe_contexts[gpe_idx];
3227 gen8_gpe_context_init(ctx, gpe_context);
3228 gen9_gpe_reset_binding_table(ctx, gpe_context);
3229 gen9_hevc_scaling_set_curbe(&scaling_param, gpe_context);
3231 if (hme_type == HEVC_HME_32X) {
3232 scaling_param.scaling_out_use_16unorm_surf_fmt = 1;
3233 scaling_param.scaling_out_use_32unorm_surf_fmt = 0;
3235 scaling_param.scaling_out_use_16unorm_surf_fmt = 0;
3236 scaling_param.scaling_out_use_32unorm_surf_fmt = 1;
3239 gen9_hevc_scaling_set_surfaces(ctx, encode_state, encoder_context, &scaling_param,
3241 gen8_gpe_setup_interface_data(ctx, gpe_context);
3243 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
3244 if (hme_type == HEVC_HME_32X) {
3245 hevc_walker_param.resolution_x = downscaled_width_in_mb;
3246 hevc_walker_param.resolution_y = downscaled_height_in_mb;
3248 hevc_walker_param.resolution_x = downscaled_width_in_mb * 2;
3249 hevc_walker_param.resolution_y = downscaled_height_in_mb * 2;
3251 hevc_walker_param.no_dependency = 1;
3252 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
3253 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
3258 gen9_hevc_hme_scaling(VADriverContextP ctx,
3259 struct encode_state *encode_state,
3260 struct intel_encoder_context *encoder_context)
3262 struct encoder_vme_mfc_context *vme_context = NULL;
3263 struct generic_enc_codec_state *generic_state = NULL;
3264 struct gen9_hevc_encoder_state *priv_state = NULL;
3266 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3267 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3268 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3270 if (priv_state->bit_depth_luma_minus8)
3271 gen9_hevc_frame_depth_conversion(ctx, encode_state, encoder_context,
3272 encode_state->input_yuv_object,
3273 encode_state->reconstructed_object,
3274 HEVC_ENC_2xDS_4xDS_STAGE);
3276 gen9_hevc_kernel_scaling(ctx, encode_state, encoder_context, HEVC_HME_4X);
3278 if (generic_state->b16xme_supported) {
3279 gen9_hevc_kernel_scaling(ctx, encode_state, encoder_context, HEVC_HME_16X);
3281 if (generic_state->b32xme_supported)
3282 gen9_hevc_kernel_scaling(ctx, encode_state, encoder_context, HEVC_HME_32X);
3286 // ME implementation
3289 gen9_hevc_me_set_curbe(VADriverContextP ctx,
3290 struct encode_state *encode_state,
3291 struct intel_encoder_context *encoder_context,
3292 enum HEVC_HME_TYPE hme_type,
3293 struct i965_gpe_context *gpe_context)
3295 struct encoder_vme_mfc_context *vme_context = NULL;
3296 struct generic_enc_codec_state *generic_state = NULL;
3297 struct gen9_hevc_encoder_state *priv_state = NULL;
3298 gen9_hevc_me_curbe_data *cmd = NULL;
3299 VAEncPictureParameterBufferHEVC *pic_param = NULL;
3300 VAEncSliceParameterBufferHEVC *slice_param = NULL;
3301 unsigned int use_mv_from_prev_step = 0;
3302 unsigned int write_distortions = 0;
3303 unsigned int slice_qp = 0;
3304 unsigned int me_method = 0;
3305 unsigned int mv_shift_factor = 0, prev_mv_read_pos_factor = 0;
3306 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
3308 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3309 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3310 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3311 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
3312 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
3316 use_mv_from_prev_step = (generic_state->b16xme_enabled) ? 1 : 0;;
3317 write_distortions = 1;
3318 mv_shift_factor = 2;
3319 prev_mv_read_pos_factor = 0;
3320 downscaled_width_in_mb = ALIGN(priv_state->picture_width / 4, 16) / 16;
3321 downscaled_height_in_mb = ALIGN(priv_state->picture_height / 4, 16) / 16;
3324 use_mv_from_prev_step = (generic_state->b32xme_enabled) ? 1 : 0;
3325 write_distortions = 0;
3326 mv_shift_factor = 2;
3327 prev_mv_read_pos_factor = 1;
3328 downscaled_width_in_mb = ALIGN(priv_state->picture_width / 16, 16) / 16;
3329 downscaled_height_in_mb = ALIGN(priv_state->picture_height / 16, 16) / 16;
3332 use_mv_from_prev_step = 0;
3333 write_distortions = 0;
3334 mv_shift_factor = 1;
3335 prev_mv_read_pos_factor = 0;
3336 downscaled_width_in_mb = ALIGN(priv_state->picture_width / 32, 16) / 16;
3337 downscaled_height_in_mb = ALIGN(priv_state->picture_height / 32, 16) / 16;
3343 me_method = GEN9_HEVC_ME_METHOD[priv_state->tu_mode];
3344 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
3346 cmd = i965_gpe_context_map_curbe(gpe_context);
3350 memcpy((void *)cmd, GEN9_HEVC_ME_INIT_CURBE_DATA, sizeof(gen9_hevc_me_curbe_data));
3352 cmd->dw3.sub_pel_mode = 3;
3353 cmd->dw4.picture_height_minus1 = downscaled_height_in_mb - 1;
3354 cmd->dw4.picture_width = downscaled_width_in_mb;
3355 cmd->dw5.qp_prime_y = slice_qp;
3356 cmd->dw6.use_mv_from_prev_step = use_mv_from_prev_step;
3357 cmd->dw6.write_distortions = write_distortions;
3358 cmd->dw6.super_combine_dist = GEN9_HEVC_SUPER_COMBINE_DIST[priv_state->tu_mode];
3359 cmd->dw6.max_vmvr = 512;
3361 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
3362 cmd->dw13.num_ref_idx_l0_minus1 = slice_param->num_ref_idx_l0_active_minus1;
3363 if (priv_state->picture_coding_type == HEVC_SLICE_B) {
3364 cmd->dw1.bi_weight = 32;
3365 cmd->dw13.num_ref_idx_l1_minus1 = slice_param->num_ref_idx_l1_active_minus1;
3369 cmd->dw15.prev_mv_read_pos_factor = prev_mv_read_pos_factor;
3370 cmd->dw15.mv_shift_factor = mv_shift_factor;
3372 memcpy(&cmd->dw16, table_enc_search_path[GEN9_HEVC_ENC_MEMETHOD_TABLE][me_method], 14 * sizeof(unsigned int));
3374 cmd->dw32._4x_memv_output_data_surf_index = GEN9_HEVC_ME_MV_DATA_SURFACE_INDEX;
3375 cmd->dw33._16x_32x_memv_input_data_surf_index = (hme_type == HEVC_HME_32X) ?
3376 GEN9_HEVC_ME_32X_MV_DATA_SURFACE_INDEX : GEN9_HEVC_ME_16X_MV_DATA_SURFACE_INDEX;
3377 cmd->dw34._4x_me_output_dist_surf_index = GEN9_HEVC_ME_DISTORTION_SURFACE_INDEX;
3378 cmd->dw35._4x_me_output_brc_dist_surf_index = GEN9_HEVC_ME_BRC_DISTORTION_INDEX;
3379 cmd->dw36.vme_fwd_inter_pred_surf_index = GEN9_HEVC_ME_CURR_FOR_FWD_REF_INDEX;
3380 cmd->dw37.vme_bdw_inter_pred_surf_index = GEN9_HEVC_ME_CURR_FOR_BWD_REF_INDEX;
3382 i965_gpe_context_unmap_curbe(gpe_context);
3386 gen9_hevc_me_set_surfaces(VADriverContextP ctx,
3387 struct encode_state *encode_state,
3388 struct intel_encoder_context *encoder_context,
3389 enum HEVC_HME_TYPE hme_type,
3390 struct i965_gpe_context *gpe_context)
3392 struct i965_driver_data *i965 = i965_driver_data(ctx);
3393 struct encoder_vme_mfc_context *vme_context = NULL;
3394 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3395 struct generic_enc_codec_state *generic_state = NULL;
3396 VAEncSliceParameterBufferHEVC *slice_param = NULL;
3397 struct gen9_hevc_surface_priv *surface_priv = NULL;
3398 struct object_surface *obj_surface = NULL;
3399 int scaled_surf_id = VA_INVALID_SURFACE, surface_id = VA_INVALID_SURFACE;
3402 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3403 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3404 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3405 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
3409 scaled_surf_id = HEVC_SCALED_SURF_4X_ID;
3410 i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
3411 &priv_ctx->s4x_memv_data_buffer,
3413 I965_SURFACEFORMAT_R8_UNORM,
3414 GEN9_HEVC_ME_MV_DATA_SURFACE_INDEX);
3416 if (generic_state->b16xme_enabled)
3417 i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
3418 &priv_ctx->s16x_memv_data_buffer,
3420 I965_SURFACEFORMAT_R8_UNORM,
3421 GEN9_HEVC_ME_16X_MV_DATA_SURFACE_INDEX);
3423 i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
3424 &priv_ctx->res_brc_me_dist_buffer,
3426 I965_SURFACEFORMAT_R8_UNORM,
3427 GEN9_HEVC_ME_BRC_DISTORTION_INDEX);
3429 i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
3430 &priv_ctx->s4x_memv_distortion_buffer,
3432 I965_SURFACEFORMAT_R8_UNORM,
3433 GEN9_HEVC_ME_DISTORTION_SURFACE_INDEX);
3436 scaled_surf_id = HEVC_SCALED_SURF_16X_ID;
3438 i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
3439 &priv_ctx->s16x_memv_data_buffer,
3441 I965_SURFACEFORMAT_R8_UNORM,
3442 GEN9_HEVC_ME_MV_DATA_SURFACE_INDEX);
3444 if (generic_state->b32xme_enabled)
3445 i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
3446 &priv_ctx->s32x_memv_data_buffer,
3448 I965_SURFACEFORMAT_R8_UNORM,
3449 GEN9_HEVC_ME_32X_MV_DATA_SURFACE_INDEX);
3451 i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
3452 &priv_ctx->s16x_memv_data_buffer,
3454 I965_SURFACEFORMAT_R8_UNORM,
3455 GEN9_HEVC_ME_16X_MV_DATA_SURFACE_INDEX);
3458 scaled_surf_id = HEVC_SCALED_SURF_32X_ID;
3459 i965_add_buffer_2d_gpe_surface(ctx, gpe_context,
3460 &priv_ctx->s32x_memv_data_buffer,
3462 I965_SURFACEFORMAT_R8_UNORM,
3463 GEN9_HEVC_ME_MV_DATA_SURFACE_INDEX);
3469 obj_surface = encode_state->reconstructed_object;
3470 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
3471 i965_add_adv_gpe_surface(ctx, gpe_context,
3472 surface_priv->scaled_surface_obj[scaled_surf_id],
3473 GEN9_HEVC_ME_CURR_FOR_FWD_REF_INDEX);
3475 for (i = 0; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++) {
3476 surface_id = slice_param->ref_pic_list0[i].picture_id;
3477 obj_surface = SURFACE(surface_id);
3478 if (!obj_surface || !obj_surface->private_data)
3481 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
3482 i965_add_adv_gpe_surface(ctx, gpe_context,
3483 surface_priv->scaled_surface_obj[scaled_surf_id],
3484 GEN9_HEVC_ME_CURR_FOR_FWD_REF_INDEX + i * 2 + 1);
3487 obj_surface = encode_state->reconstructed_object;
3488 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
3489 i965_add_adv_gpe_surface(ctx, gpe_context,
3490 surface_priv->scaled_surface_obj[scaled_surf_id],
3491 GEN9_HEVC_ME_CURR_FOR_BWD_REF_INDEX);
3493 for (i = 0; i < slice_param->num_ref_idx_l1_active_minus1 + 1; i++) {
3494 surface_id = slice_param->ref_pic_list1[i].picture_id;
3495 obj_surface = SURFACE(surface_id);
3496 if (!obj_surface || !obj_surface->private_data)
3499 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
3500 i965_add_adv_gpe_surface(ctx, gpe_context,
3501 surface_priv->scaled_surface_obj[scaled_surf_id],
3502 GEN9_HEVC_ME_CURR_FOR_BWD_REF_INDEX + i * 2 + 1);
3507 gen9_hevc_kernel_me(VADriverContextP ctx,
3508 struct encode_state *encode_state,
3509 struct intel_encoder_context *encoder_context,
3510 enum HEVC_HME_TYPE hme_type)
3512 struct encoder_vme_mfc_context *vme_context = NULL;
3513 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3514 struct gen9_hevc_encoder_state *priv_state = NULL;
3515 struct gpe_media_object_walker_parameter param;
3516 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
3517 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
3518 struct i965_gpe_context *gpe_context;
3519 int media_state = 0;
3521 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3522 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3523 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3527 media_state = HEVC_ENC_MEDIA_STATE_4X_ME;
3528 downscaled_width_in_mb = priv_state->downscaled_width_4x_in_mb;
3529 downscaled_height_in_mb = priv_state->downscaled_height_4x_in_mb;
3532 media_state = HEVC_ENC_MEDIA_STATE_16X_ME;
3533 downscaled_width_in_mb = priv_state->downscaled_width_16x_in_mb;
3534 downscaled_height_in_mb = priv_state->downscaled_height_16x_in_mb;
3537 media_state = HEVC_ENC_MEDIA_STATE_32X_ME;
3538 downscaled_width_in_mb = priv_state->downscaled_width_32x_in_mb;
3539 downscaled_height_in_mb = priv_state->downscaled_height_32x_in_mb;
3545 if (priv_state->picture_coding_type == HEVC_SLICE_P)
3546 gpe_context = &priv_ctx->me_context.gpe_context[hme_type][HEVC_ENC_ME_P];
3548 gpe_context = &priv_ctx->me_context.gpe_context[hme_type][HEVC_ENC_ME_B];
3550 gen8_gpe_context_init(ctx, gpe_context);
3551 gen9_gpe_reset_binding_table(ctx, gpe_context);
3552 gen9_hevc_me_set_curbe(ctx, encode_state, encoder_context, hme_type, gpe_context);
3553 gen9_hevc_me_set_surfaces(ctx, encode_state, encoder_context, hme_type, gpe_context);
3554 gen8_gpe_setup_interface_data(ctx, gpe_context);
3556 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
3557 hevc_walker_param.resolution_x = downscaled_width_in_mb;
3558 hevc_walker_param.resolution_y = downscaled_height_in_mb;
3559 hevc_walker_param.no_dependency = 1;
3560 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
3562 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
3567 gen9_hevc_hme_encode_me(VADriverContextP ctx,
3568 struct encode_state *encode_state,
3569 struct intel_encoder_context *encoder_context)
3571 struct encoder_vme_mfc_context *vme_context = NULL;
3572 struct generic_enc_codec_state *generic_state = NULL;
3574 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3575 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3577 if (generic_state->b16xme_enabled) {
3578 if (generic_state->b32xme_enabled)
3579 gen9_hevc_kernel_me(ctx, encode_state, encoder_context, HEVC_HME_32X);
3581 gen9_hevc_kernel_me(ctx, encode_state, encoder_context, HEVC_HME_16X);
3584 gen9_hevc_kernel_me(ctx, encode_state, encoder_context, HEVC_HME_4X);
3587 // MBENC kernels setting start
3589 static unsigned char
3590 map_44_lut_value(unsigned int value,
3593 unsigned int max_cost = 0;
3595 unsigned char ret = 0;
3600 max_cost = ((max & 15) << (max >> 4));
3601 if (value >= max_cost)
3604 data = (int)(log((double)value) / log(2.)) - 3;
3608 ret = (unsigned char)((data << 4) +
3609 (int)((value + (data == 0 ? 0 : (1 << (data - 1)))) >> data));
3610 ret = (ret & 0xf) == 0 ? (ret | 8) : ret;
3616 gen9_hevc_mbenc_set_costs(struct gen9_hevc_encoder_context *priv_ctx,
3618 int intra_trans_type,
3619 unsigned int slice_qp,
3620 unsigned char *mode_cost,
3621 unsigned char *mv_cost,
3622 unsigned char *mode_cost_sp,
3623 unsigned int *simplest_intra_inter_threshold)
3625 float had_bias = intra_trans_type == HEVC_ENC_INTRA_TRANS_HADAMARD ?
3627 double lambda_md, lambda_me;
3629 lambda_md = priv_ctx->lambda_md_table[slice_type][slice_qp];
3630 lambda_me = priv_ctx->lambda_md_table[slice_type][slice_qp];
3633 mode_cost[0] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][0] * had_bias), 0x6f);
3634 mode_cost[1] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][1] * had_bias), 0x8f);
3635 mode_cost[2] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][2] * had_bias), 0x8f);
3636 mode_cost[3] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][3] * had_bias), 0x8f);
3637 mode_cost[4] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][4] * had_bias), 0x8f);
3638 mode_cost[5] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][5] * had_bias), 0x6f);
3639 mode_cost[6] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][6] * had_bias), 0x6f);
3640 mode_cost[7] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][7] * had_bias), 0x6f);
3641 mode_cost[8] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][8] * had_bias), 0x8f);
3642 mode_cost[9] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][9] * had_bias), 0x6f);
3643 mode_cost[10] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][10] * had_bias), 0x6f);
3644 mode_cost[11] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][11] * had_bias), 0x6f);
3648 mv_cost[0] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][0] * had_bias), 0x6f);
3649 mv_cost[1] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][1] * had_bias), 0x6f);
3650 mv_cost[2] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][2] * had_bias), 0x6f);
3651 mv_cost[3] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][3] * had_bias), 0x6f);
3652 mv_cost[4] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][4] * had_bias), 0x6f);
3653 mv_cost[5] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][5] * had_bias), 0x6f);
3654 mv_cost[6] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][6] * had_bias), 0x6f);
3655 mv_cost[7] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][7] * had_bias), 0x6f);
3659 *mode_cost_sp = map_44_lut_value((unsigned int)(lambda_md * 45 * had_bias), 0x8f);
3661 if (simplest_intra_inter_threshold) {
3662 lambda_md *= had_bias;
3663 *simplest_intra_inter_threshold = 0;
3664 if (GEN9_HEVC_ENC_Mode_COST[slice_type][1] < GEN9_HEVC_ENC_Mode_COST[slice_type][3])
3665 *simplest_intra_inter_threshold = (unsigned int)(lambda_md *
3666 (GEN9_HEVC_ENC_Mode_COST[slice_type][3] - GEN9_HEVC_ENC_Mode_COST[slice_type][1]) + 0.5);
3671 gen9_hevc_set_lambda_tables(struct gen9_hevc_encoder_context *priv_ctx,
3673 int intra_trans_type)
3675 if (slice_type != HEVC_SLICE_I) {
3676 if (priv_ctx->lambda_table_inited)
3679 memcpy((void *)&priv_ctx->lambda_me_table[slice_type], &GEN9_HEVC_ENC_QP_LAMBDA_ME[slice_type],
3680 sizeof(GEN9_HEVC_ENC_QP_LAMBDA_ME[slice_type]));
3681 memcpy((void *)&priv_ctx->lambda_md_table[slice_type], &GEN9_HEVC_ENC_QP_LAMBDA_ME[slice_type],
3682 sizeof(GEN9_HEVC_ENC_QP_LAMBDA_ME[slice_type]));
3683 } else if (intra_trans_type != priv_ctx->lambda_intra_trans_type ||
3684 !priv_ctx->lambda_table_inited) {
3686 double lambda = 0.0;
3689 for (qp = 0; qp < 52; qp++) {
3690 temp = (double)qp - 12;
3691 lambda = 0.85 * pow(2.0, temp / 3.0);
3693 if ((intra_trans_type != HEVC_ENC_INTRA_TRANS_HAAR) &&
3694 (intra_trans_type != HEVC_ENC_INTRA_TRANS_HADAMARD))
3697 priv_ctx->lambda_md_table[slice_type][qp] =
3698 priv_ctx->lambda_me_table[slice_type][qp] = sqrt(lambda);
3701 priv_ctx->lambda_intra_trans_type = intra_trans_type;
3706 gen9_hevc_lambda_tables_init(struct gen9_hevc_encoder_context *priv_ctx)
3708 gen9_hevc_set_lambda_tables(priv_ctx, HEVC_SLICE_B, HEVC_ENC_INTRA_TRANS_HAAR);
3709 gen9_hevc_set_lambda_tables(priv_ctx, HEVC_SLICE_P, HEVC_ENC_INTRA_TRANS_HAAR);
3710 gen9_hevc_set_lambda_tables(priv_ctx, HEVC_SLICE_I, HEVC_ENC_INTRA_TRANS_HAAR);
3712 priv_ctx->lambda_table_inited = 1;
3716 gen9_hevc_8x8_b_pak_set_curbe(VADriverContextP ctx,
3717 struct encode_state *encode_state,
3718 struct intel_encoder_context *encoder_context,
3719 struct i965_gpe_context *gpe_context)
3721 struct i965_driver_data *i965 = i965_driver_data(ctx);
3722 struct encoder_vme_mfc_context *vme_context = NULL;
3723 struct generic_enc_codec_state *generic_state = NULL;
3724 struct gen9_hevc_encoder_state *priv_state = NULL;
3725 gen9_hevc_mbenc_b_pak_curbe_data *cmd = NULL;
3726 VAEncPictureParameterBufferHEVC *pic_param = NULL;
3727 VAEncSliceParameterBufferHEVC *slice_param = NULL;
3728 unsigned int slice_qp = 0;
3731 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3732 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3733 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3734 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
3735 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
3737 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
3738 cmd = i965_gpe_context_map_curbe(gpe_context);
3742 memset((void *)cmd, 0, sizeof(*cmd));
3744 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
3745 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
3746 cmd->dw1.max_vmvr = 511 * 4;
3747 cmd->dw1.qp = slice_qp;
3748 cmd->dw2.brc_enable = generic_state->brc_enabled;
3749 cmd->dw2.lcu_brc_enable = priv_state->lcu_brc_enabled;
3750 cmd->dw2.screen_content = !!pic_param->pic_fields.bits.screen_content_flag;
3751 cmd->dw2.slice_type = priv_state->picture_coding_type;
3752 cmd->dw2.roi_enable = (priv_state->num_roi > 0);
3753 cmd->dw2.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
3754 0 : priv_state->video_surveillance_flag;
3755 cmd->dw2.kbl_control_flag = (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info));
3756 cmd->dw2.enable_rolling_intra = priv_state->rolling_intra_refresh;
3757 cmd->dw2.simplest_intra_enable = (priv_state->tu_mode == HEVC_TU_BEST_SPEED);
3758 cmd->dw3.widi_intra_refresh_qp_delta = priv_state->widi_intra_refresh_qp_delta;
3759 cmd->dw3.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
3760 cmd->dw3.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
3762 cmd->dw16.bti_cu_record = bti_idx++;
3763 cmd->dw17.bti_pak_obj = bti_idx++;
3764 cmd->dw18.bti_slice_map = bti_idx++;
3765 cmd->dw19.bti_brc_input = bti_idx++;
3766 cmd->dw20.bti_lcu_qp = bti_idx++;
3767 cmd->dw21.bti_brc_data = bti_idx++;
3768 cmd->dw22.bti_mb_data = bti_idx++;
3769 cmd->dw23.bti_mvp_surface = bti_idx++;
3770 cmd->dw24.bti_debug = bti_idx++;
3772 i965_gpe_context_unmap_curbe(gpe_context);
3776 gen9_hevc_8x8_b_pak_set_surfaces(VADriverContextP ctx,
3777 struct encode_state *encode_state,
3778 struct intel_encoder_context *encoder_context,
3779 struct i965_gpe_context *gpe_context)
3781 struct encoder_vme_mfc_context *vme_context = NULL;
3782 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3783 struct gen9_hevc_encoder_state *priv_state = NULL;
3787 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3788 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3789 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3791 size = priv_state->width_in_cu * priv_state->height_in_cu *
3792 priv_state->cu_record_size;
3793 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3794 HEVC_ENC_SURFACE_CU_RECORD, bti_idx++,
3795 0, size, priv_state->mb_data_offset, NULL, NULL);
3797 size = priv_state->mb_data_offset;
3798 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3799 HEVC_ENC_SURFACE_HCP_PAK, bti_idx++,
3800 0, size, 0, NULL, NULL);
3802 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
3803 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
3804 0, 1, I965_SURFACEFORMAT_R8_UNORM,
3807 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3808 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
3809 0, 0, 0, NULL, NULL);
3811 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
3812 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
3813 0, 1, I965_SURFACEFORMAT_R8_UNORM,
3816 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
3817 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
3818 0, 1, I965_SURFACEFORMAT_R8_UNORM,
3821 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3822 HEVC_ENC_SURFACE_MB_MV_INDEX, bti_idx++,
3823 0, 0, 0, NULL, NULL);
3825 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3826 HEVC_ENC_SURFACE_MVP_INDEX, bti_idx++,
3827 0, 0, 0, NULL, NULL);
3829 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3830 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
3831 0, 0, 0, NULL, NULL);
3835 gen9_hevc_8x8_b_pak(VADriverContextP ctx,
3836 struct encode_state *encode_state,
3837 struct intel_encoder_context *encoder_context)
3839 struct encoder_vme_mfc_context *vme_context = NULL;
3840 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3841 struct gen9_hevc_encoder_state *priv_state = NULL;
3842 struct gpe_media_object_walker_parameter param;
3843 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
3844 struct i965_gpe_context *gpe_context = NULL;
3845 int media_state = HEVC_ENC_MEDIA_STATE_HEVC_B_PAK;
3847 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3848 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3849 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3851 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_BPAK_IDX];
3853 gen8_gpe_context_init(ctx, gpe_context);
3854 gen9_gpe_reset_binding_table(ctx, gpe_context);
3855 gen9_hevc_8x8_b_pak_set_curbe(ctx, encode_state, encoder_context, gpe_context);
3856 gen9_hevc_8x8_b_pak_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
3857 gen8_gpe_setup_interface_data(ctx, gpe_context);
3859 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
3860 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
3861 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
3862 hevc_walker_param.no_dependency = 1;
3863 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
3864 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
3868 static const unsigned char ftq_25i[27] = {
3878 gen9_hevc_set_forward_coeff_thd(unsigned char *pcoeff,
3881 int idx = (qp + 1) >> 1;
3883 memset((void *)pcoeff, ftq_25i[idx], 7);
3887 gen9_hevc_get_qp_from_ref_list(VADriverContextP ctx,
3888 VAEncSliceParameterBufferHEVC *slice_param,
3892 struct i965_driver_data *i965 = i965_driver_data(ctx);
3893 struct gen9_hevc_surface_priv *hevc_priv_surface = NULL;
3894 struct object_surface *obj_surface = NULL;
3895 VASurfaceID surface_id;
3897 if (list_idx == 0) {
3898 if (ref_frame_idx < slice_param->num_ref_idx_l0_active_minus1 + 1)
3899 surface_id = slice_param->ref_pic_list0[ref_frame_idx].picture_id;
3903 if (ref_frame_idx < slice_param->num_ref_idx_l1_active_minus1 + 1)
3904 surface_id = slice_param->ref_pic_list1[ref_frame_idx].picture_id;
3909 obj_surface = SURFACE(surface_id);
3910 if (obj_surface && obj_surface->private_data) {
3911 hevc_priv_surface = obj_surface->private_data;
3912 return hevc_priv_surface->qp_value;
3920 gen9_hevc_get_poc_diff_from_ref_list(VAEncPictureParameterBufferHEVC *pic_param,
3921 VAEncSliceParameterBufferHEVC *slice_param,
3927 if (list_idx == 0 &&
3928 ref_frame_idx < slice_param->num_ref_idx_l0_active_minus1 + 1)
3929 poc_diff = pic_param->decoded_curr_pic.pic_order_cnt -
3930 slice_param->ref_pic_list0[ref_frame_idx].pic_order_cnt;
3931 else if (list_idx == 1 &&
3932 ref_frame_idx < slice_param->num_ref_idx_l1_active_minus1 + 1)
3933 poc_diff = pic_param->decoded_curr_pic.pic_order_cnt -
3934 slice_param->ref_pic_list1[ref_frame_idx].pic_order_cnt;
3936 return CLAMP(-128, 127, poc_diff);
3940 gen9_hevc_set_control_region(VADriverContextP ctx,
3941 struct encode_state *encode_state,
3942 struct intel_encoder_context *encoder_context,
3943 struct i965_gpe_context *gpe_context,
3944 struct gen9_hevc_walking_pattern_parameter *param)
3946 struct encoder_vme_mfc_context *vme_context = NULL;
3947 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3948 struct gen9_hevc_encoder_state *priv_state = NULL;
3949 VAEncSliceParameterBufferHEVC *slice_param = NULL;
3950 gen9_hevc_mbenc_control_region *p_region = NULL;
3951 unsigned int slice, num_regions, height, num_slices, num_units_in_region;
3952 unsigned int frame_width_in_units, frame_height_in_units;
3953 unsigned short region_start_table[64];
3954 unsigned int offset_to_the_region_start[16];
3955 unsigned short temp_data[32][32];
3956 int is_arbitrary_slices = 0;
3957 int slice_start_y[I965_MAX_NUM_SLICE + 1];
3961 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3962 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3963 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3965 memset(slice_start_y, 0, sizeof(int) * (I965_MAX_NUM_SLICE + 1));
3966 memset(region_start_table, 0, sizeof(region_start_table));
3967 memset(temp_data, 0, sizeof(temp_data));
3968 memset(offset_to_the_region_start, 0, sizeof(offset_to_the_region_start));
3970 if (priv_state->num_regions_in_slice < 1)
3971 priv_state->num_regions_in_slice = 1;
3973 if (priv_state->num_regions_in_slice > 16)
3974 priv_state->num_regions_in_slice = 16;
3976 if (priv_state->walking_pattern_26) {
3977 frame_width_in_units = ALIGN(priv_state->picture_width, 16) / 16;
3978 frame_height_in_units = ALIGN(priv_state->picture_height, 16) / 16;
3980 frame_width_in_units = ALIGN(priv_state->picture_width, 32) / 32;
3981 frame_height_in_units = ALIGN(priv_state->picture_height, 32) / 32;
3984 for (slice = 0; slice < encode_state->num_slice_params_ext; slice++) {
3985 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice]->buffer;
3986 if (slice_param->slice_segment_address %
3987 ALIGN(priv_state->picture_width, 32)) {
3988 is_arbitrary_slices = 1;
3990 slice_start_y[slice] = slice_param->slice_segment_address /
3991 ALIGN(priv_state->picture_width, 32);
3993 if (priv_state->walking_pattern_26) {
3994 slice_start_y[slice] *= 2;
3999 slice_start_y[encode_state->num_slice_params_ext] = frame_height_in_units;
4001 region_start_table[0] = 0;
4002 region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + 0] = 0;
4005 if (is_arbitrary_slices) {
4006 height = frame_height_in_units;
4008 max_height = height;
4009 if (priv_state->num_regions_in_slice > 1) {
4010 num_units_in_region =
4011 (frame_width_in_units + 2 * (frame_height_in_units - 1) + priv_state->num_regions_in_slice - 1) / priv_state->num_regions_in_slice;
4013 num_regions = priv_state->num_regions_in_slice;
4015 for (i = 1; i < priv_state->num_regions_in_slice; i++) {
4016 unsigned int front = i * num_units_in_region;
4018 if (front < frame_width_in_units)
4019 region_start_table[i] = (unsigned int)front;
4020 else if (((front - frame_width_in_units + 1) & 1) == 0)
4021 region_start_table[i] = (unsigned int)frame_width_in_units - 1;
4023 region_start_table[i] = (unsigned int)frame_width_in_units - 2;
4025 region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + i] = (unsigned int)((front - region_start_table[i]) >> 1);
4030 int slice_is_merged = 0;
4033 num_slices = encode_state->num_slice_params_ext;
4035 for (slice = 0; slice < num_slices; slice++) {
4036 int sliceHeight = slice_start_y[slice + 1] - slice_start_y[slice];
4038 if (sliceHeight > max_height)
4039 max_height = sliceHeight;
4042 while (!slice_is_merged) {
4043 int newNumSlices = 1;
4047 for (slice = 1; slice < num_slices; slice++) {
4048 if ((slice_start_y[slice + 1] - start_y) <= max_height)
4049 slice_start_y[slice] = -1;
4051 start_y = slice_start_y[slice];
4054 for (slice = 1; slice < num_slices; slice++) {
4055 if (slice_start_y[slice] > 0) {
4056 slice_start_y[newNumSlices] = slice_start_y[slice];
4061 num_slices = newNumSlices;
4062 slice_start_y[num_slices] = frame_height_in_units;
4064 if (num_slices * priv_state->num_regions_in_slice <= GEN9_HEVC_MEDIA_WALKER_MAX_COLORS)
4065 slice_is_merged = 1;
4069 max_height = frame_height_in_units;
4071 for (slice = 0; slice < num_slices - 1; slice++) {
4072 if ((slice_start_y[slice + 2] - slice_start_y[slice]) <= max_height) {
4073 max_height = slice_start_y[slice + 2] - slice_start_y[slice];
4078 for (slice = num; slice < num_slices; slice++)
4079 slice_start_y[slice] = slice_start_y[slice + 1];
4085 num_units_in_region = (frame_width_in_units + 2 * (max_height - 1) + priv_state->num_regions_in_slice - 1) /
4086 priv_state->num_regions_in_slice;
4087 num_regions = num_slices * priv_state->num_regions_in_slice;
4089 for (slice = 0; slice < num_slices; slice++) {
4090 region_start_table[slice * priv_state->num_regions_in_slice] = 0;
4091 region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (slice * priv_state->num_regions_in_slice)] = (unsigned int)slice_start_y[slice];
4093 for (i = 1; i < priv_state->num_regions_in_slice; i++) {
4094 int front = i * num_units_in_region;
4096 if ((unsigned int)front < frame_width_in_units)
4097 region_start_table[slice * priv_state->num_regions_in_slice + i] = (unsigned int)front;
4098 else if (((front - frame_width_in_units + 1) & 1) == 0)
4099 region_start_table[slice * priv_state->num_regions_in_slice + i] = (unsigned int)frame_width_in_units - 1;
4101 region_start_table[slice * priv_state->num_regions_in_slice + i] = (unsigned int)frame_width_in_units - 2;
4103 region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (slice * priv_state->num_regions_in_slice + i)] = (unsigned int)slice_start_y[slice] +
4104 ((front - region_start_table[i]) >> 1);
4107 height = max_height;
4110 for (k = 0; k < num_slices; k++) {
4112 int nearest_reg = 0;
4113 int min_delta = priv_state->picture_height;
4115 if (priv_state->walking_pattern_26) {
4116 int cur_lcu_pel_y = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (k * priv_state->num_regions_in_slice)] << 4;
4117 int ts_width = priv_state->picture_width >> 4;
4118 int ts_height = height;
4119 int offset_y = -((ts_width + 1) >> 1);
4120 int offset_delta = ((ts_width + ((ts_height - 1) << 1)) + (priv_state->num_regions_in_slice - 1)) / (priv_state->num_regions_in_slice);
4122 for (i = 0; i < (int)num_regions; i++) {
4123 if (region_start_table[i] == 0) {
4124 int delta = cur_lcu_pel_y - (region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + i] << 4);
4127 if (delta < min_delta) {
4134 offset_to_the_region_start[k] = 2 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg];
4137 for (i = 0; i < priv_state->num_regions_in_slice; i++) {
4138 int tmp_y = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (nearest_reg + priv_state->num_regions_in_slice)];
4140 temp_data[k * priv_state->num_regions_in_slice + i][0] = region_start_table[nearest_reg + i];
4141 temp_data[k * priv_state->num_regions_in_slice + i][1] = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (nearest_reg + i)];
4142 temp_data[k * priv_state->num_regions_in_slice + i][2] = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg];
4143 temp_data[k * priv_state->num_regions_in_slice + i][3] = (unsigned int)((tmp_y != 0) ? tmp_y : (priv_state->picture_height) >> 4);
4144 temp_data[k * priv_state->num_regions_in_slice + i][4] = offset_to_the_region_start[k] & 0x0FFFF;
4145 temp_data[k * priv_state->num_regions_in_slice + i][5] = 0;
4146 temp_data[k * priv_state->num_regions_in_slice + i][6] = 0;
4147 temp_data[k * priv_state->num_regions_in_slice + i][7] = (unsigned int)(offset_y + region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg] + ((i * offset_delta) >> 1));
4150 int cur_lcu_pel_y = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET +
4151 (k * priv_state->num_regions_in_slice)] << 5;
4152 int ts_width = (priv_state->picture_width + 16) >> 5;
4153 int ts_height = height;
4154 int offset_y = -4 * ((ts_width + 1) >> 1);
4155 int offset_delta = ((ts_width + ((ts_height - 1) << 1)) + (priv_state->num_regions_in_slice - 1)) / (priv_state->num_regions_in_slice);
4157 for (i = 0; i < (int)num_regions; i++) {
4158 if (region_start_table[i] == 0) {
4159 int delta = cur_lcu_pel_y - (region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + i] << 5);
4162 if (delta < min_delta) {
4169 offset_to_the_region_start[k] = 2 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg];
4172 for (i = 0; i < priv_state->num_regions_in_slice; i++) {
4173 int tmp_y = 2 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (nearest_reg + priv_state->num_regions_in_slice)];
4175 temp_data[k * priv_state->num_regions_in_slice + i][0] = region_start_table[nearest_reg + i];
4176 temp_data[k * priv_state->num_regions_in_slice + i][1] = 2 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (nearest_reg + i)];
4177 temp_data[k * priv_state->num_regions_in_slice + i][2] = 2 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg];
4178 temp_data[k * priv_state->num_regions_in_slice + i][3] = (unsigned int)((tmp_y != 0) ? tmp_y : (priv_state->picture_height) >> 4);
4179 temp_data[k * priv_state->num_regions_in_slice + i][4] = offset_to_the_region_start[k] & 0x0FFFF;
4180 temp_data[k * priv_state->num_regions_in_slice + i][5] = 0;
4181 temp_data[k * priv_state->num_regions_in_slice + i][6] = 0;
4182 temp_data[k * priv_state->num_regions_in_slice + i][7] = (unsigned int)(offset_y + 4 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg] + (4 * ((i * offset_delta) >> 1)));
4187 if (priv_state->walking_pattern_26)
4188 gen9_hevc_init_object_walker_26(priv_state, gpe_context, ¶m->gpe_param,
4189 priv_state->num_regions_in_slice, max_height,
4190 priv_state->use_hw_scoreboard,
4191 priv_state->use_hw_non_stalling_scoreborad);
4193 gen9_hevc_init_object_walker_26z(priv_state, gpe_context, ¶m->gpe_param,
4194 priv_state->num_regions_in_slice, max_height,
4195 priv_state->use_hw_scoreboard,
4196 priv_state->use_hw_non_stalling_scoreborad);
4198 p_region = (gen9_hevc_mbenc_control_region *)i965_map_gpe_resource(&priv_ctx->res_con_corrent_thread_buffer);
4202 memset((void *)p_region, 0, sizeof(*p_region) * GEN9_HEVC_ENC_CONCURRENT_SURFACE_HEIGHT);
4204 for (i = 0; i < 1024 ; i += 64)
4205 memcpy(((unsigned char *)p_region) + i, (unsigned char *)temp_data[i / 64], 32);
4207 param->max_height_in_region = priv_state->walking_pattern_26 ? max_height : max_height * 2;;
4208 param->num_region = num_regions;
4209 param->num_units_in_region = (frame_width_in_units + 2 * (max_height - 1) + priv_state->num_regions_in_slice - 1) /
4210 priv_state->num_regions_in_slice;
4212 i965_unmap_gpe_resource(&priv_ctx->res_con_corrent_thread_buffer);
4215 static const char hevc_qpc_table[22] = {
4216 29, 30, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 39
4220 gen9_hevc_8x8_b_mbenc_set_curbe(VADriverContextP ctx,
4221 struct encode_state *encode_state,
4222 struct intel_encoder_context *encoder_context,
4223 struct i965_gpe_context *gpe_context,
4224 struct gen9_hevc_walking_pattern_parameter *param)
4226 struct encoder_vme_mfc_context *vme_context = NULL;
4227 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4228 struct generic_enc_codec_state *generic_state = NULL;
4229 struct gen9_hevc_encoder_state *priv_state = NULL;
4230 gen9_hevc_mbenc_b_mb_enc_curbe_data *cmd = NULL;
4231 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
4232 VAEncPictureParameterBufferHEVC *pic_param = NULL;
4233 VAEncSliceParameterBufferHEVC *slice_param = NULL;
4234 unsigned int slice_qp = 0, slice_type = HEVC_SLICE_I;
4235 unsigned char mode_cost[12], mv_cost[8], mode_cost_sp;
4236 unsigned char forward_trans_thd[7];
4237 unsigned int simplest_intra_inter_threshold;
4238 int transform_8x8_mode_flag = 1;
4239 int qp_bd_offset_c, q_pi, qp_c;
4240 void *default_curbe_ptr = NULL;
4241 int default_curbe_size = 0;
4242 int max_sp_len = 57;
4245 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4246 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4247 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
4248 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4249 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
4250 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
4251 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
4253 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
4254 slice_type = priv_state->picture_coding_type;
4256 if (priv_state->tu_mode == HEVC_TU_BEST_SPEED) {
4257 gen9_hevc_set_lambda_tables(priv_ctx, slice_type,
4258 HEVC_ENC_INTRA_TRANS_HAAR);
4263 gen9_hevc_mbenc_set_costs(priv_ctx, slice_type, HEVC_ENC_INTRA_TRANS_REGULAR, slice_qp,
4264 mode_cost, mv_cost, &mode_cost_sp,
4265 &simplest_intra_inter_threshold);
4267 gen9_hevc_set_forward_coeff_thd(forward_trans_thd, slice_qp);
4269 gen9_hevc_get_b_mbenc_default_curbe(priv_state->tu_mode,
4270 slice_type, &default_curbe_ptr,
4271 &default_curbe_size);
4273 cmd = i965_gpe_context_map_curbe(gpe_context);
4277 memcpy((void *)cmd, default_curbe_ptr, default_curbe_size);
4279 cmd->dw0.adaptive_en = 1;
4280 cmd->dw0.t_8x8_flag_for_inter_en = transform_8x8_mode_flag;
4281 cmd->dw2.pic_width = priv_state->width_in_mb;
4282 cmd->dw2.len_sp = max_sp_len;
4283 cmd->dw3.src_access = 0;
4284 cmd->dw3.ref_access = 0;
4285 cmd->dw3.ft_enable = (HEVC_ENC_FTQ_BASED_SKIP[priv_state->tu_mode] >> 1) & 0x01;
4286 cmd->dw4.pic_height_minus1 = priv_state->height_in_mb - 1;
4287 cmd->dw4.hme_enable = !!generic_state->hme_enabled;
4288 cmd->dw4.slice_type = slice_type;
4289 cmd->dw4.use_actual_ref_qp_value = 0;
4290 cmd->dw6.frame_width = priv_state->width_in_mb * 16;
4291 cmd->dw6.frame_height = priv_state->height_in_mb * 16;
4292 cmd->dw7.intra_part_mask = 3;
4293 cmd->dw8.mode0_cost = mode_cost[0];
4294 cmd->dw8.mode1_cost = mode_cost[1];
4295 cmd->dw8.mode2_cost = mode_cost[2];
4296 cmd->dw8.mode3_cost = mode_cost[3];
4297 cmd->dw9.mode4_cost = mode_cost[4];
4298 cmd->dw9.mode5_cost = mode_cost[5];
4299 cmd->dw9.mode6_cost = mode_cost[6];
4300 cmd->dw9.mode7_cost = mode_cost[7];
4301 cmd->dw10.mode8_cost = mode_cost[8];
4302 cmd->dw10.mode9_cost = mode_cost[9];
4303 cmd->dw10.ref_id_cost = mode_cost[10];
4304 cmd->dw10.chroma_intra_mode_cost = mode_cost[11];
4305 cmd->dw11.mv0_cost = mv_cost[0];
4306 cmd->dw11.mv1_cost = mv_cost[1];
4307 cmd->dw11.mv2_cost = mv_cost[2];
4308 cmd->dw11.mv3_cost = mv_cost[3];
4309 cmd->dw12.mv4_cost = mv_cost[4];
4310 cmd->dw12.mv5_cost = mv_cost[5];
4311 cmd->dw12.mv6_cost = mv_cost[6];
4312 cmd->dw12.mv7_cost = mv_cost[7];
4314 cmd->dw13.qp_prime_y = slice_qp;
4315 qp_bd_offset_c = 6 * priv_state->bit_depth_chroma_minus8;
4316 q_pi = CLAMP(-qp_bd_offset_c, 51, slice_qp + pic_param->pps_cb_qp_offset);
4317 qp_c = (q_pi < 30) ? q_pi : hevc_qpc_table[q_pi - 30];
4318 cmd->dw13.qp_prime_cb = qp_c;
4319 q_pi = CLAMP(-qp_bd_offset_c, 51, slice_qp + pic_param->pps_cr_qp_offset);
4320 qp_c = (q_pi < 30) ? q_pi : hevc_qpc_table[q_pi - 30];
4321 cmd->dw13.qp_prime_cr = qp_c;
4323 cmd->dw14.sic_fwd_trans_coeff_thread_0 = forward_trans_thd[0];
4324 cmd->dw14.sic_fwd_trans_coeff_thread_1 = forward_trans_thd[1];
4325 cmd->dw14.sic_fwd_trans_coeff_thread_2 = forward_trans_thd[2];
4326 cmd->dw15.sic_fwd_trans_coeff_thread_3 = forward_trans_thd[3];
4327 cmd->dw15.sic_fwd_trans_coeff_thread_4 = forward_trans_thd[4];
4328 cmd->dw15.sic_fwd_trans_coeff_thread_5 = forward_trans_thd[5];
4329 cmd->dw15.sic_fwd_trans_coeff_thread_6 = forward_trans_thd[6];
4330 cmd->dw32.skip_val =
4331 HEVC_ENC_SKIPVAL_B[cmd->dw3.block_based_skip_enable][transform_8x8_mode_flag][slice_qp];
4333 if (priv_state->picture_coding_type == HEVC_SLICE_I)
4334 *(float *)&cmd->dw34.lambda_me = 0.0;
4336 *(float *)&cmd->dw34.lambda_me = (float)priv_ctx->lambda_me_table[slice_type][slice_qp];
4338 cmd->dw35.mode_cost_sp = mode_cost_sp;
4339 cmd->dw35.simp_intra_inter_threashold = simplest_intra_inter_threshold;
4340 cmd->dw36.num_refidx_l0_minus_one = slice_param->num_ref_idx_l0_active_minus1;
4341 cmd->dw36.num_refidx_l1_minus_one = slice_param->num_ref_idx_l1_active_minus1;
4342 cmd->dw36.brc_enable = !!generic_state->brc_enabled;
4343 cmd->dw36.lcu_brc_enable = !!priv_state->lcu_brc_enabled;
4344 cmd->dw36.power_saving = priv_state->power_saving;
4345 cmd->dw36.roi_enable = (priv_state->num_roi > 0);
4346 cmd->dw36.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
4347 0 : priv_state->video_surveillance_flag;
4349 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
4350 cmd->dw37.actual_qp_refid0_list0 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 0, 0);
4351 cmd->dw37.actual_qp_refid1_list0 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 0, 1);
4352 cmd->dw37.actual_qp_refid2_list0 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 0, 2);
4353 cmd->dw37.actual_qp_refid3_list0 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 0, 3);
4355 if (priv_state->picture_coding_type == HEVC_SLICE_B) {
4356 cmd->dw39.actual_qp_refid0_list1 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 1, 0);
4357 cmd->dw39.actual_qp_refid1_list1 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 1, 1);
4361 cmd->dw44.max_vmvr = 511 * 4;
4362 cmd->dw44.max_num_merge_candidates = slice_param->max_num_merge_cand;
4364 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
4365 cmd->dw44.max_num_ref_list0 = cmd->dw36.num_refidx_l0_minus_one + 1;
4366 cmd->dw44.max_num_ref_list1 = cmd->dw36.num_refidx_l1_minus_one + 1;
4367 cmd->dw45.temporal_mvp_enable_flag = slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag;
4368 cmd->dw45.hme_combine_len_pslice = 8;
4369 if (priv_state->picture_coding_type == HEVC_SLICE_B)
4370 cmd->dw45.hme_combine_len_bslice = 8;
4373 cmd->dw45.log2_parallel_merge_level = pic_param->log2_parallel_merge_level_minus2 + 2;
4374 cmd->dw46.log2_min_tu_size = seq_param->log2_min_transform_block_size_minus2 + 2;
4375 cmd->dw46.log2_max_tu_size = cmd->dw46.log2_min_tu_size + seq_param->log2_diff_max_min_transform_block_size;
4376 cmd->dw46.log2_min_cu_size = seq_param->log2_min_luma_coding_block_size_minus3 + 3;
4377 cmd->dw46.log2_max_cu_size = cmd->dw46.log2_min_cu_size + seq_param->log2_diff_max_min_luma_coding_block_size;
4378 cmd->dw47.num_regions_in_slice = priv_state->num_regions_in_slice;
4379 cmd->dw47.type_of_walking_pattern = priv_state->walking_pattern_26;
4380 cmd->dw47.chroma_flatness_check_flag = (priv_state->tu_mode == HEVC_TU_BEST_SPEED) ? 0 : 1;
4381 cmd->dw47.enable_intra_early_exit = (priv_state->tu_mode == HEVC_TU_RT_SPEED);
4382 cmd->dw47.skip_intra_krn_flag = (priv_state->tu_mode == HEVC_TU_BEST_SPEED);
4383 cmd->dw47.collocated_from_l0_flag = slice_param->slice_fields.bits.collocated_from_l0_flag;
4384 cmd->dw47.is_low_delay = priv_state->low_delay;
4385 cmd->dw47.screen_content_flag = !!pic_param->pic_fields.bits.screen_content_flag;
4386 cmd->dw47.multi_slice_flag = (encode_state->num_slice_params_ext > 1);
4387 cmd->dw47.arbitary_slice_flag = priv_state->arbitrary_num_mb_in_slice;
4388 cmd->dw47.num_region_minus1 = param->num_region - 1;
4390 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
4391 cmd->dw48.current_td_l0_0 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 0, 0);
4392 cmd->dw48.current_td_l0_1 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 0, 1);
4393 cmd->dw49.current_td_l0_2 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 0, 2);
4394 cmd->dw49.current_td_l0_3 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 0, 3);
4396 if (priv_state->picture_coding_type == HEVC_SLICE_B) {
4397 cmd->dw50.current_td_l1_0 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 1, 0);
4398 cmd->dw50.current_td_l1_1 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 1, 1);
4402 cmd->dw52.num_of_units_in_region = param->num_units_in_region;
4403 cmd->dw52.max_height_in_region = param->max_height_in_region;
4405 if (priv_state->rolling_intra_refresh) {
4406 cmd->dw35.widi_intra_refresh_en = 1;
4407 cmd->dw35.widi_first_intra_refresh = priv_state->widi_first_intra_refresh;
4408 cmd->dw35.half_update_mixed_lcu = 0;
4409 cmd->dw35.enable_rolling_intra = 1;
4410 cmd->dw38.widi_num_frame_in_gob = priv_state->widi_frame_num_in_gob;
4411 cmd->dw38.widi_num_intra_refresh_off_frames = priv_state->widi_frame_num_without_intra_refresh;
4412 cmd->dw51.widi_intra_refresh_qp_delta = priv_state->widi_intra_refresh_qp_delta;
4413 cmd->dw51.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
4414 cmd->dw51.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
4415 cmd->dw53.widi_intra_refresh_ref_height = 40;
4416 cmd->dw53.widi_intra_refresh_ref_width = 48;
4418 priv_state->widi_first_intra_refresh = 0;
4419 priv_state->widi_frame_num_without_intra_refresh = 0;
4420 } else if (priv_state->picture_coding_type != HEVC_SLICE_I)
4421 priv_state->widi_frame_num_without_intra_refresh++;
4423 cmd->dw56.bti_cu_record = bti_idx++;
4424 cmd->dw57.bti_pak_cmd = bti_idx++;
4425 cmd->dw58.bti_src_y = bti_idx++;
4427 cmd->dw59.bti_intra_dist = bti_idx++;
4428 cmd->dw60.bti_min_dist = bti_idx++;
4429 cmd->dw61.bti_hme_mv_pred_fwd_bwd_surf_index = bti_idx++;
4430 cmd->dw62.bti_hme_dist_surf_index = bti_idx++;
4431 cmd->dw63.bti_slice_map = bti_idx++;
4432 cmd->dw64.bti_vme_saved_uni_sic = bti_idx++;
4433 cmd->dw65.bti_simplest_intra = bti_idx++;
4434 cmd->dw66.bti_collocated_refframe = bti_idx++;
4435 cmd->dw67.bti_reserved = bti_idx++;
4436 cmd->dw68.bti_brc_input = bti_idx++;
4437 cmd->dw69.bti_lcu_qp = bti_idx++;
4438 cmd->dw70.bti_brc_data = bti_idx++;
4439 cmd->dw71.bti_vme_inter_prediction_surf_index = bti_idx++;
4442 if (priv_state->picture_coding_type == HEVC_SLICE_P) {
4443 cmd->dw72.bti_concurrent_thread_map = bti_idx++;
4444 cmd->dw73.bti_mb_data_cur_frame = bti_idx++;
4445 cmd->dw74.bti_mvp_cur_frame = bti_idx++;
4446 cmd->dw75.bti_debug = bti_idx++;
4448 cmd->dw72.bti_vme_inter_prediction_b_surf_index = bti_idx++;
4451 cmd->dw73.bti_concurrent_thread_map = bti_idx++;
4452 cmd->dw74.bti_mb_data_cur_frame = bti_idx++;
4453 cmd->dw75.bti_mvp_cur_frame = bti_idx++;
4454 cmd->dw76.bti_debug = bti_idx++;
4457 i965_gpe_context_unmap_curbe(gpe_context);
4461 gen9_hevc_8x8_b_mbenc_set_surfaces(VADriverContextP ctx,
4462 struct encode_state *encode_state,
4463 struct intel_encoder_context *encoder_context,
4464 struct i965_gpe_context *gpe_context)
4466 struct i965_driver_data *i965 = i965_driver_data(ctx);
4467 struct encoder_vme_mfc_context *vme_context = NULL;
4468 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4469 struct gen9_hevc_encoder_state *priv_state = NULL;
4470 VAEncSliceParameterBufferHEVC *slice_param = NULL;
4471 VAEncPictureParameterBufferHEVC *pic_param = NULL;
4472 struct gen9_hevc_surface_priv *surface_priv = NULL;
4473 struct object_surface *obj_surface = NULL;
4474 dri_bo *collocated_mv_temporal_bo = NULL;
4479 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4480 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4481 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4482 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
4483 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
4485 if (priv_state->picture_coding_type != HEVC_SLICE_I &&
4486 slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag &&
4487 slice_param->slice_fields.bits.collocated_from_l0_flag) {
4488 if (pic_param->collocated_ref_pic_index != 0xff &&
4489 pic_param->collocated_ref_pic_index < GEN9_MAX_REF_SURFACES) {
4490 VASurfaceID idx = VA_INVALID_SURFACE;
4492 idx = pic_param->reference_frames[pic_param->collocated_ref_pic_index].picture_id;
4493 obj_surface = SURFACE(idx);
4495 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
4497 collocated_mv_temporal_bo = surface_priv->motion_vector_temporal_bo;
4502 size = priv_state->width_in_cu * priv_state->height_in_cu *
4503 priv_state->cu_record_size;
4504 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4505 HEVC_ENC_SURFACE_CU_RECORD, bti_idx++,
4506 0, size, priv_state->mb_data_offset, NULL, NULL);
4508 size = priv_state->mb_data_offset;
4509 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4510 HEVC_ENC_SURFACE_HCP_PAK, bti_idx++,
4511 0, size, 0, NULL, NULL);
4513 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4514 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
4515 1, 1, I965_SURFACEFORMAT_R8_UNORM,
4519 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4520 HEVC_ENC_SURFACE_INTRA_DIST, bti_idx++,
4521 0, 0, 0, NULL, NULL);
4523 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4524 HEVC_ENC_SURFACE_MIN_DIST, bti_idx++,
4525 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4528 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4529 HEVC_ENC_SURFACE_HME_MVP, bti_idx++,
4530 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4533 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4534 HEVC_ENC_SURFACE_HME_DIST, bti_idx++,
4535 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4538 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4539 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
4540 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4543 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4544 HEVC_ENC_SURFACE_VME_UNI_SIC_DATA, bti_idx++,
4545 0, 0, 0, NULL, NULL);
4547 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4548 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
4549 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4552 if (collocated_mv_temporal_bo)
4553 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4554 HEVC_ENC_SURFACE_COL_MB_MV, bti_idx++,
4555 0, 0, 0, NULL, collocated_mv_temporal_bo);
4561 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4562 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
4563 0, 0, 0, NULL, NULL);
4565 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4566 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
4567 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4570 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4571 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
4572 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4575 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4576 HEVC_ENC_SURFACE_RAW_VME, bti_idx++,
4579 for (i = 0; i < 8; i++) {
4580 if (i <= slice_param->num_ref_idx_l0_active_minus1)
4581 obj_surface = SURFACE(slice_param->ref_pic_list0[i].picture_id);
4586 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
4588 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4589 HEVC_ENC_SURFACE_REF_FRAME_VME, bti_idx++,
4590 surface_priv->surface_reff);
4594 if (i <= slice_param->num_ref_idx_l1_active_minus1)
4595 obj_surface = SURFACE(slice_param->ref_pic_list1[i].picture_id);
4600 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
4602 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4603 HEVC_ENC_SURFACE_REF_FRAME_VME, bti_idx++,
4604 surface_priv->surface_reff);
4609 if (priv_state->picture_coding_type != HEVC_SLICE_P) {
4610 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4611 HEVC_ENC_SURFACE_RAW_VME, bti_idx++,
4614 for (i = 0; i < 4; i++) {
4615 if (i <= slice_param->num_ref_idx_l1_active_minus1)
4616 obj_surface = SURFACE(slice_param->ref_pic_list1[i].picture_id);
4621 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
4623 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4624 HEVC_ENC_SURFACE_REF_FRAME_VME, bti_idx++,
4625 surface_priv->surface_reff);
4633 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4634 HEVC_ENC_SURFACE_CONCURRENT_THREAD, bti_idx++,
4635 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4638 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4639 HEVC_ENC_SURFACE_MB_MV_INDEX, bti_idx++,
4640 0, 0, 0, NULL, NULL);
4642 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4643 HEVC_ENC_SURFACE_MVP_INDEX, bti_idx++,
4644 0, 0, 0, NULL, NULL);
4646 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4647 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
4648 0, 0, 0, NULL, NULL);
4652 gen9_hevc_8x8_b_mbenc(VADriverContextP ctx,
4653 struct encode_state *encode_state,
4654 struct intel_encoder_context *encoder_context)
4656 struct encoder_vme_mfc_context *vme_context = NULL;
4657 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4658 struct gen9_hevc_encoder_state *priv_state = NULL;
4659 struct gen9_hevc_walking_pattern_parameter param;
4660 struct i965_gpe_context *gpe_context = NULL;
4661 int media_state = HEVC_ENC_MEDIA_STATE_HEVC_B_MBENC;
4662 int gpe_idx = HEVC_MBENC_BENC_IDX;
4664 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4665 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4666 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4668 if (priv_state->picture_coding_type == HEVC_SLICE_P)
4669 gpe_idx = priv_state->rolling_intra_refresh ? HEVC_MBENC_P_WIDI_IDX : HEVC_MBENC_PENC_IDX;
4670 else if (priv_state->picture_coding_type != HEVC_SLICE_I)
4671 gpe_idx = priv_state->rolling_intra_refresh ? HEVC_MBENC_MBENC_WIDI_IDX : HEVC_MBENC_BENC_IDX;
4673 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[gpe_idx];
4675 gen8_gpe_context_init(ctx, gpe_context);
4676 gen9_gpe_reset_binding_table(ctx, gpe_context);
4678 memset((void *)¶m, 0, sizeof(param));
4679 gen9_hevc_set_control_region(ctx, encode_state, encoder_context, gpe_context, ¶m);
4681 gen9_hevc_8x8_b_mbenc_set_curbe(ctx, encode_state, encoder_context, gpe_context, ¶m);
4682 gen9_hevc_8x8_b_mbenc_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
4683 gen8_gpe_setup_interface_data(ctx, gpe_context);
4685 param.gpe_param.color_count_minus1 = param.num_region - 1;
4686 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m.gpe_param,
4691 gen9_hevc_8x8_pu_fmode_set_curbe(VADriverContextP ctx,
4692 struct encode_state *encode_state,
4693 struct intel_encoder_context *encoder_context,
4694 struct i965_gpe_context *gpe_context)
4696 struct i965_driver_data *i965 = i965_driver_data(ctx);
4697 struct encoder_vme_mfc_context *vme_context = NULL;
4698 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4699 struct generic_enc_codec_state *generic_state = NULL;
4700 struct gen9_hevc_encoder_state *priv_state = NULL;
4701 gen9_hevc_mbenc_8x8_pu_fmode_curbe_data *cmd = NULL;
4702 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
4703 VAEncPictureParameterBufferHEVC *pic_param = NULL;
4704 VAEncSliceParameterBufferHEVC *slice_param = NULL;
4705 unsigned int slice_qp = 0;
4708 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4709 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4710 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
4711 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4712 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
4713 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
4714 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
4716 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
4718 cmd = i965_gpe_context_map_curbe(gpe_context);
4722 memset((void *)cmd, 0, sizeof(*cmd));
4724 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
4725 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
4726 cmd->dw1.slice_type = priv_state->picture_coding_type;
4727 cmd->dw1.pu_type = 2;
4728 cmd->dw1.pak_reording_flag = priv_state->picture_coding_type == HEVC_SLICE_I ? 1 : 0;
4730 if (seq_param->log2_min_luma_coding_block_size_minus3 + 3 +
4731 seq_param->log2_diff_max_min_luma_coding_block_size == 6)
4732 cmd->dw1.lcu_type = 0;
4734 cmd->dw1.lcu_type = 1;
4736 cmd->dw1.screen_content_flag = !!pic_param->pic_fields.bits.screen_content_flag;
4737 cmd->dw1.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ?
4738 (priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1) : 0;
4739 cmd->dw1.enable_debug_dump = 0;
4740 cmd->dw1.brc_enable = generic_state->brc_enabled;
4741 cmd->dw1.lcu_brc_enable = priv_state->lcu_brc_enabled;
4742 cmd->dw1.roi_enable = (priv_state->num_roi > 0);
4743 cmd->dw1.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
4744 0 : priv_state->video_surveillance_flag;
4745 cmd->dw1.enable_rolling_intra = priv_state->rolling_intra_refresh;
4746 cmd->dw1.widi_intra_refresh_en = priv_state->rolling_intra_refresh;
4747 cmd->dw1.half_update_mixed_lcu = 0;
4748 cmd->dw2.luma_lambda = priv_state->fixed_point_lambda_for_luma;
4750 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
4752 float had_bias = 2.0f;
4754 lambda_md = priv_ctx->lambda_md_table[cmd->dw1.slice_type][slice_qp];
4755 lambda_md = lambda_md * had_bias;
4756 cmd->dw3.lambda_for_dist_calculation = (unsigned int)(lambda_md * (1 << 10));
4759 cmd->dw4.mode_cost_for_8x8_pu_tu8 = 0;
4760 cmd->dw5.mode_cost_for_8x8_pu_tu4 = 0;
4761 cmd->dw6.satd_16x16_pu_threshold = MAX(200 * ((int)slice_qp - 12), 0);
4762 cmd->dw6.bias_factor_toward_8x8 = pic_param->pic_fields.bits.screen_content_flag ? 1024 : 1126 + 102;
4763 cmd->dw7.qp = slice_qp;
4764 cmd->dw7.qp_for_inter = 0;
4765 cmd->dw8.simplified_flag_for_inter = 0;
4766 cmd->dw8.kbl_control_flag = (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info));
4767 cmd->dw9.widi_intra_refresh_qp_delta = priv_state->widi_intra_refresh_qp_delta;
4768 cmd->dw9.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
4769 cmd->dw9.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
4771 cmd->dw16.bti_pak_object = bti_idx++;
4772 cmd->dw17.bti_vme_8x8_mode = bti_idx++;
4773 cmd->dw18.bti_intra_mode = bti_idx++;
4774 cmd->dw19.bti_pak_command = bti_idx++;
4775 cmd->dw20.bti_slice_map = bti_idx++;
4776 cmd->dw21.bti_intra_dist = bti_idx++;
4777 cmd->dw22.bti_brc_input = bti_idx++;
4778 cmd->dw23.bti_simplest_intra = bti_idx++;
4779 cmd->dw24.bti_lcu_qp_surface = bti_idx++;
4780 cmd->dw25.bti_brc_data = bti_idx++;
4781 cmd->dw26.bti_debug = bti_idx++;
4783 i965_gpe_context_unmap_curbe(gpe_context);
4787 gen9_hevc_8x8_pu_fmode_set_surfaces(VADriverContextP ctx,
4788 struct encode_state *encode_state,
4789 struct intel_encoder_context *encoder_context,
4790 struct i965_gpe_context *gpe_context)
4792 struct encoder_vme_mfc_context *vme_context = NULL;
4793 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4794 struct gen9_hevc_encoder_state *priv_state = NULL;
4798 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4799 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4800 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4802 size = priv_state->width_in_cu * priv_state->height_in_cu *
4803 priv_state->cu_record_size;
4804 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4805 HEVC_ENC_SURFACE_CU_RECORD, bti_idx++,
4806 0, size, priv_state->mb_data_offset, NULL, NULL);
4808 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4809 HEVC_ENC_SURFACE_VME_8x8, bti_idx++,
4810 0, 0, 0, NULL, NULL);
4812 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4813 HEVC_ENC_SURFACE_INTRA_MODE, bti_idx++,
4814 0, 0, 0, NULL, NULL);
4816 size = priv_state->mb_data_offset;
4817 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4818 HEVC_ENC_SURFACE_HCP_PAK, bti_idx++,
4819 0, size, 0, NULL, NULL);
4821 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4822 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
4823 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4826 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4827 HEVC_ENC_SURFACE_INTRA_DIST, bti_idx++,
4828 0, 0, 0, NULL, NULL);
4830 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4831 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
4832 0, 0, 0, NULL, NULL);
4834 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4835 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
4836 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4839 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4840 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
4841 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4844 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4845 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
4846 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4849 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4850 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
4851 0, 0, 0, NULL, NULL);
4855 gen9_hevc_8x8_pu_fmode(VADriverContextP ctx,
4856 struct encode_state *encode_state,
4857 struct intel_encoder_context *encoder_context)
4859 struct encoder_vme_mfc_context *vme_context = NULL;
4860 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4861 struct gen9_hevc_encoder_state *priv_state = NULL;
4862 struct gpe_media_object_walker_parameter param;
4863 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
4864 struct i965_gpe_context *gpe_context = NULL;
4865 int media_state = HEVC_ENC_MEDIA_STATE_8x8_PU_FMODE;
4867 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4868 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4869 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4871 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_8x8FMODE_IDX];
4873 gen8_gpe_context_init(ctx, gpe_context);
4874 gen9_gpe_reset_binding_table(ctx, gpe_context);
4875 gen9_hevc_8x8_pu_fmode_set_curbe(ctx, encode_state, encoder_context, gpe_context);
4876 gen9_hevc_8x8_pu_fmode_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
4877 gen8_gpe_setup_interface_data(ctx, gpe_context);
4879 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
4880 hevc_walker_param.resolution_x = priv_state->width_in_lcu;
4881 hevc_walker_param.resolution_y = priv_state->height_in_lcu;
4882 hevc_walker_param.no_dependency = 1;
4883 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
4884 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
4889 gen9_hevc_8x8_pu_mode_set_curbe(VADriverContextP ctx,
4890 struct encode_state *encode_state,
4891 struct intel_encoder_context *encoder_context,
4892 struct i965_gpe_context *gpe_context)
4894 struct encoder_vme_mfc_context *vme_context = NULL;
4895 struct generic_enc_codec_state *generic_state = NULL;
4896 struct gen9_hevc_encoder_state *priv_state = NULL;
4897 gen9_hevc_mbenc_8x8_pu_curbe_data *cmd = NULL;
4898 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
4899 VAEncPictureParameterBufferHEVC *pic_param = NULL;
4900 VAEncSliceParameterBufferHEVC *slice_param = NULL;
4903 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4904 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
4905 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4906 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
4907 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
4908 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
4910 cmd = i965_gpe_context_map_curbe(gpe_context);
4914 memset((void *)cmd, 0, sizeof(*cmd));
4916 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
4917 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
4918 cmd->dw1.slice_type = priv_state->picture_coding_type;
4919 cmd->dw1.pu_type = 2;
4920 cmd->dw1.dc_filter_flag = 1;
4921 cmd->dw1.angle_refine_flag = 1;
4922 if (seq_param->log2_min_luma_coding_block_size_minus3 + 3 +
4923 seq_param->log2_diff_max_min_luma_coding_block_size == 6)
4924 cmd->dw1.lcu_type = 0;
4926 cmd->dw1.lcu_type = 1;
4927 cmd->dw1.screen_content_flag = !!pic_param->pic_fields.bits.screen_content_flag;
4928 cmd->dw1.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ?
4929 (priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1) : 0;
4930 cmd->dw1.enable_debug_dump = 0;
4931 cmd->dw1.brc_enable = generic_state->brc_enabled;
4932 cmd->dw1.lcu_brc_enable = priv_state->lcu_brc_enabled;
4933 cmd->dw1.roi_enable = (priv_state->num_roi > 0);
4934 cmd->dw1.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
4935 0 : priv_state->video_surveillance_flag;
4936 if (priv_state->rolling_intra_refresh) {
4937 cmd->dw1.enable_rolling_intra = 1;
4938 cmd->dw1.widi_intra_refresh_en = 1;
4939 cmd->dw1.half_update_mixed_lcu = 0;
4941 cmd->dw5.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
4942 cmd->dw5.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
4943 cmd->dw5.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
4945 cmd->dw1.qp_value = pic_param->pic_init_qp + slice_param->slice_qp_delta;
4948 cmd->dw2.luma_lambda = priv_state->fixed_point_lambda_for_luma;
4949 cmd->dw3.chroma_lambda = priv_state->fixed_point_lambda_for_chroma;
4950 cmd->dw4.simplified_flag_for_inter = 0;
4951 cmd->dw4.harr_trans_form_flag = priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1;
4953 cmd->dw8.bti_src_y = bti_idx++;
4955 cmd->dw9.bti_slice_map = bti_idx++;
4956 cmd->dw10.bti_vme_8x8_mode = bti_idx++;
4957 cmd->dw11.bti_intra_mode = bti_idx++;
4958 cmd->dw12.bti_brc_input = bti_idx++;
4959 cmd->dw13.bti_simplest_intra = bti_idx++;
4960 cmd->dw14.bti_lcu_qp_surface = bti_idx++;
4961 cmd->dw15.bti_brc_data = bti_idx++;
4962 cmd->dw16.bti_debug = bti_idx++;
4964 i965_gpe_context_unmap_curbe(gpe_context);
4968 gen9_hevc_8x8_pu_mode_set_surfaces(VADriverContextP ctx,
4969 struct encode_state *encode_state,
4970 struct intel_encoder_context *encoder_context,
4971 struct i965_gpe_context *gpe_context)
4973 struct encoder_vme_mfc_context *vme_context = NULL;
4974 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4977 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4978 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4980 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4981 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
4982 1, 1, I965_SURFACEFORMAT_R8_UNORM,
4986 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4987 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
4988 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4991 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4992 HEVC_ENC_SURFACE_VME_8x8, bti_idx++,
4993 0, 0, 0, NULL, NULL);
4995 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4996 HEVC_ENC_SURFACE_INTRA_MODE, bti_idx++,
4997 0, 0, 0, NULL, NULL);
4999 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5000 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
5001 0, 0, 0, NULL, NULL);
5003 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5004 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
5005 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5008 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5009 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
5010 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5013 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5014 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
5015 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5018 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5019 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
5020 0, 0, 0, NULL, NULL);
5024 gen9_hevc_8x8_pu_mode(VADriverContextP ctx,
5025 struct encode_state *encode_state,
5026 struct intel_encoder_context *encoder_context)
5028 struct encoder_vme_mfc_context *vme_context = NULL;
5029 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5030 struct gen9_hevc_encoder_state *priv_state = NULL;
5031 struct gpe_media_object_walker_parameter param;
5032 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5033 struct i965_gpe_context *gpe_context = NULL;
5034 int media_state = HEVC_ENC_MEDIA_STATE_8x8_PU;
5036 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5037 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5038 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5040 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_8x8PU_IDX];
5042 gen8_gpe_context_init(ctx, gpe_context);
5043 gen9_gpe_reset_binding_table(ctx, gpe_context);
5044 gen9_hevc_8x8_pu_mode_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5045 gen9_hevc_8x8_pu_mode_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5046 gen8_gpe_setup_interface_data(ctx, gpe_context);
5048 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5049 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 16) >> 3;
5050 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 16) >> 3;
5051 hevc_walker_param.no_dependency = 1;
5052 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5053 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5058 gen9_hevc_16x16_pu_mode_set_curbe(VADriverContextP ctx,
5059 struct encode_state *encode_state,
5060 struct intel_encoder_context *encoder_context,
5061 struct i965_gpe_context *gpe_context)
5063 struct encoder_vme_mfc_context *vme_context = NULL;
5064 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5065 struct generic_enc_codec_state *generic_state = NULL;
5066 struct gen9_hevc_encoder_state *priv_state = NULL;
5067 gen9_hevc_enc_16x16_pu_curbe_data *cmd = NULL;
5068 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
5069 VAEncPictureParameterBufferHEVC *pic_param = NULL;
5070 VAEncSliceParameterBufferHEVC *slice_param = NULL;
5071 double squred_lambda, qp_lambda, lambda_scaling_factor;
5072 unsigned int slice_qp = 0, slice_type = HEVC_SLICE_I;
5073 unsigned int new_point_lambda_for_luma;
5074 unsigned char mode_cost[12];
5077 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5078 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5079 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
5080 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5081 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
5082 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
5083 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
5085 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
5086 slice_type = priv_state->picture_coding_type;
5088 lambda_scaling_factor = 0.46 + slice_qp - 22;
5089 if (lambda_scaling_factor < 0)
5090 lambda_scaling_factor = 0.46;
5091 else if (lambda_scaling_factor > 15)
5092 lambda_scaling_factor = 15;
5094 squred_lambda = lambda_scaling_factor * pow(2.0, ((double)slice_qp - 12.0) / 6);
5095 priv_state->fixed_point_lambda_for_luma = (unsigned int)(squred_lambda * (1 << 10));
5097 lambda_scaling_factor = 1.0;
5098 qp_lambda = priv_ctx->lambda_md_table[slice_type][slice_qp];
5099 squred_lambda = qp_lambda * qp_lambda;
5100 priv_state->fixed_point_lambda_for_chroma = (unsigned int)(lambda_scaling_factor * squred_lambda * (1 << 10));
5102 qp_lambda = sqrt(0.57 * pow(2.0, ((double)slice_qp - 12.0) / 3));
5103 squred_lambda = qp_lambda * qp_lambda;
5104 new_point_lambda_for_luma = (unsigned int)(squred_lambda * (1 << 10));
5106 gen9_hevc_mbenc_set_costs(priv_ctx, slice_type, HEVC_ENC_INTRA_TRANS_HAAR, slice_qp,
5107 mode_cost, NULL, NULL, NULL);
5109 cmd = i965_gpe_context_map_curbe(gpe_context);
5113 memset((void *)cmd, 0, sizeof(*cmd));
5115 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
5116 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
5117 cmd->dw1.log2_min_cu_size = seq_param->log2_min_luma_coding_block_size_minus3 + 3;
5118 cmd->dw1.log2_max_cu_size = cmd->dw1.log2_min_cu_size + seq_param->log2_diff_max_min_luma_coding_block_size;
5119 cmd->dw1.log2_min_tu_size = seq_param->log2_min_transform_block_size_minus2 + 2;
5120 cmd->dw1.slice_qp = slice_qp;
5121 cmd->dw2.fixed_point_lambda_pred_mode = priv_state->fixed_point_lambda_for_chroma;
5122 cmd->dw3.lambda_scaling_factor = 1;
5123 cmd->dw3.slice_type = slice_type;
5124 cmd->dw3.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ?
5125 (priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1) : 0;
5126 cmd->dw3.brc_enable = !!generic_state->brc_enabled;
5127 cmd->dw3.lcu_brc_enable = !!priv_state->lcu_brc_enabled;
5128 cmd->dw3.roi_enable = (priv_state->num_roi > 0);
5129 cmd->dw3.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
5130 0 : priv_state->video_surveillance_flag;
5131 cmd->dw3.enable_rolling_intra = priv_state->rolling_intra_refresh;
5132 cmd->dw3.widi_intra_refresh_en = priv_state->rolling_intra_refresh;
5133 cmd->dw3.half_update_mixed_lcu = 0;
5134 cmd->dw4.penalty_for_intra_8x8_non_dc_pred_mode = 0;
5135 cmd->dw4.intra_compute_type = 1;
5136 cmd->dw4.avc_intra_8x8_mask = 0;
5137 cmd->dw4.intra_sad_adjust = 2;
5138 cmd->dw5.fixed_point_lambda_cu_mode_for_cost_calculation = new_point_lambda_for_luma;
5139 cmd->dw6.screen_content_flag = !!pic_param->pic_fields.bits.screen_content_flag;
5140 cmd->dw7.mode_cost_intra_non_pred = mode_cost[0];
5141 cmd->dw7.mode_cost_intra_16x16 = mode_cost[1];
5142 cmd->dw7.mode_cost_intra_8x8 = mode_cost[2];
5143 cmd->dw7.mode_cost_intra_4x4 = mode_cost[3];
5144 cmd->dw8.fixed_point_lambda_cu_mode_for_luma = priv_state->fixed_point_lambda_for_luma;
5146 if (priv_state->rolling_intra_refresh) {
5147 cmd->dw9.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
5148 cmd->dw9.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
5149 cmd->dw9.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
5152 cmd->dw10.simplified_flag_for_inter = 0;
5153 cmd->dw10.haar_transform_mode = priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1;
5155 cmd->dw16.bti_src_y = bti_idx++;
5157 cmd->dw17.bti_sad_16x16_pu = bti_idx++;
5158 cmd->dw18.bti_pak_object = bti_idx++;
5159 cmd->dw19.bti_sad_32x32_pu_mode = bti_idx++;
5160 cmd->dw20.bti_vme_mode_8x8 = bti_idx++;
5161 cmd->dw21.bti_slice_map = bti_idx++;
5162 cmd->dw22.bti_vme_src = bti_idx++;
5163 cmd->dw23.bti_brc_input = bti_idx++;
5164 cmd->dw24.bti_simplest_intra = bti_idx++;
5165 cmd->dw25.bti_lcu_qp_surface = bti_idx++;
5166 cmd->dw26.bti_brc_data = bti_idx++;
5167 cmd->dw27.bti_debug = bti_idx++;
5169 i965_gpe_context_unmap_curbe(gpe_context);
5173 gen9_hevc_16x16_pu_mode_set_surfaces(VADriverContextP ctx,
5174 struct encode_state *encode_state,
5175 struct intel_encoder_context *encoder_context,
5176 struct i965_gpe_context *gpe_context)
5178 struct encoder_vme_mfc_context *vme_context = NULL;
5179 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5180 struct gen9_hevc_encoder_state *priv_state = NULL;
5184 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5185 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5186 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5188 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5189 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
5190 1, 1, I965_SURFACEFORMAT_R8_UNORM,
5194 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5195 HEVC_ENC_SURFACE_16x16PU_SAD, bti_idx++,
5196 0, 0, 0, NULL, NULL);
5198 size = priv_state->width_in_cu * priv_state->height_in_cu *
5199 priv_state->cu_record_size;
5200 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5201 HEVC_ENC_SURFACE_CU_RECORD, bti_idx++,
5202 0, size, priv_state->mb_data_offset, NULL, NULL);
5204 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5205 HEVC_ENC_SURFACE_32x32_PU_OUTPUT, bti_idx++,
5206 0, 0, 0, NULL, NULL);
5208 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5209 HEVC_ENC_SURFACE_VME_8x8, bti_idx++,
5210 0, 0, 0, NULL, NULL);
5212 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5213 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
5214 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5217 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
5218 HEVC_ENC_SURFACE_RAW_VME, bti_idx++,
5221 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5222 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
5223 0, 0, 0, NULL, NULL);
5225 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5226 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
5227 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5230 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5231 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
5232 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5235 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5236 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
5237 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5240 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5241 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
5242 0, 0, 0, NULL, NULL);
5246 gen9_hevc_16x16_pu_mode(VADriverContextP ctx,
5247 struct encode_state *encode_state,
5248 struct intel_encoder_context *encoder_context)
5250 struct encoder_vme_mfc_context *vme_context = NULL;
5251 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5252 struct gen9_hevc_encoder_state *priv_state = NULL;
5253 struct gpe_media_object_walker_parameter param;
5254 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5255 struct i965_gpe_context *gpe_context = NULL;
5256 int media_state = HEVC_ENC_MEDIA_STATE_16x16_PU_MODE_DECISION;
5258 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5259 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5260 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5262 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_16x16MD_IDX];
5264 gen8_gpe_context_init(ctx, gpe_context);
5265 gen9_gpe_reset_binding_table(ctx, gpe_context);
5266 gen9_hevc_16x16_pu_mode_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5267 gen9_hevc_16x16_pu_mode_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5268 gen8_gpe_setup_interface_data(ctx, gpe_context);
5270 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5271 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
5272 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
5273 hevc_walker_param.no_dependency = 1;
5274 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5275 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5280 gen9_hevc_16x16_sad_pu_comp_set_curbe(VADriverContextP ctx,
5281 struct encode_state *encode_state,
5282 struct intel_encoder_context *encoder_context,
5283 struct i965_gpe_context *gpe_context)
5285 struct encoder_vme_mfc_context *vme_context = NULL;
5286 struct gen9_hevc_encoder_state *priv_state = NULL;
5287 gen9_hevc_mbenc_16x16_sad_curbe_data *cmd = NULL;
5288 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
5291 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5292 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5293 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
5295 cmd = i965_gpe_context_map_curbe(gpe_context);
5299 memset((void *)cmd, 0, sizeof(*cmd));
5301 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
5302 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
5303 cmd->dw1.log2_min_cu_size = seq_param->log2_min_luma_coding_block_size_minus3 + 3;
5304 cmd->dw1.log2_max_cu_size = cmd->dw1.log2_min_cu_size + seq_param->log2_diff_max_min_luma_coding_block_size;
5305 cmd->dw1.log2_min_tu_size = seq_param->log2_min_transform_block_size_minus2 + 2;
5306 cmd->dw1.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ?
5307 (priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1) : 0;
5308 cmd->dw2.sim_flag_for_inter = 0;
5309 cmd->dw2.slice_type = priv_state->picture_coding_type;
5310 cmd->dw2.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
5311 0 : priv_state->video_surveillance_flag;
5313 cmd->dw8.bti_src_y = bti_idx++;
5315 cmd->dw9.bti_sad_16x16_pu_output = bti_idx++;
5316 cmd->dw10.bti_32x32_pu_mode_decision = bti_idx++;
5317 cmd->dw11.bti_slice_map = bti_idx++;
5318 cmd->dw12.bti_simplest_intra = bti_idx++;
5319 cmd->dw13.bti_debug = bti_idx++;
5321 i965_gpe_context_unmap_curbe(gpe_context);
5325 gen9_hevc_16x16_sad_pu_comp_set_surfaces(VADriverContextP ctx,
5326 struct encode_state *encode_state,
5327 struct intel_encoder_context *encoder_context,
5328 struct i965_gpe_context *gpe_context)
5330 struct encoder_vme_mfc_context *vme_context = NULL;
5331 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5334 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5335 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5337 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5338 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
5339 1, 1, I965_SURFACEFORMAT_R8_UNORM,
5343 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5344 HEVC_ENC_SURFACE_16x16PU_SAD, bti_idx++,
5345 0, 0, 0, NULL, NULL);
5347 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5348 HEVC_ENC_SURFACE_32x32_PU_OUTPUT, bti_idx++,
5349 0, 0, 0, NULL, NULL);
5351 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5352 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
5353 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5356 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5357 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
5358 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5361 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5362 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
5363 0, 0, 0, NULL, NULL);
5367 gen9_hevc_16x16_sad_pu_computation(VADriverContextP ctx,
5368 struct encode_state *encode_state,
5369 struct intel_encoder_context *encoder_context)
5371 struct encoder_vme_mfc_context *vme_context = NULL;
5372 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5373 struct gen9_hevc_encoder_state *priv_state = NULL;
5374 struct gpe_media_object_walker_parameter param;
5375 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5376 struct i965_gpe_context *gpe_context = NULL;
5377 int media_state = HEVC_ENC_MEDIA_STATE_16x16_PU_SAD;
5379 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5380 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5381 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5383 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_16x16SAD_IDX];
5385 gen8_gpe_context_init(ctx, gpe_context);
5386 gen9_gpe_reset_binding_table(ctx, gpe_context);
5387 gen9_hevc_16x16_sad_pu_comp_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5388 gen9_hevc_16x16_sad_pu_comp_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5389 gen8_gpe_setup_interface_data(ctx, gpe_context);
5391 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5392 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 16) >> 4;
5393 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 16) >> 4;
5394 hevc_walker_param.no_dependency = 1;
5395 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5396 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5401 gen9_hevc_32x32_b_intra_set_curbe(VADriverContextP ctx,
5402 struct encode_state *encode_state,
5403 struct intel_encoder_context *encoder_context,
5404 struct i965_gpe_context *gpe_context)
5406 struct encoder_vme_mfc_context *vme_context = NULL;
5407 struct generic_enc_codec_state *generic_state = NULL;
5408 struct gen9_hevc_encoder_state *priv_state = NULL;
5409 gen9_hevc_mbenc_b_32x32_pu_intra_curbe_data *cmd = NULL;
5410 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
5413 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5414 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
5415 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5416 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
5418 cmd = i965_gpe_context_map_curbe(gpe_context);
5422 memset((void *)cmd, 0, sizeof(*cmd));
5424 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
5425 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
5426 cmd->dw1.enable_debug_dump = 0;
5427 cmd->dw1.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ? 1 : 0;
5429 cmd->dw1.log2_min_tu_size = seq_param->log2_min_transform_block_size_minus2 + 2;
5430 cmd->dw1.slice_type = priv_state->picture_coding_type;
5431 cmd->dw1.hme_enable = generic_state->hme_enabled;
5432 cmd->dw1.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
5433 0 : priv_state->video_surveillance_flag;
5435 cmd->dw2.qp_multiplier = 100;
5436 cmd->dw2.qp_value = 0;
5438 cmd->dw8.bti_per_32x32_pu_intra_checck = bti_idx++;
5439 cmd->dw9.bti_src_y = bti_idx++;
5441 cmd->dw10.bti_src_y2x = bti_idx++;
5442 cmd->dw11.bti_slice_map = bti_idx++;
5443 cmd->dw12.bti_vme_y2x = bti_idx++;
5444 cmd->dw13.bti_simplest_intra = bti_idx++;
5445 cmd->dw14.bti_hme_mv_pred = bti_idx++;
5446 cmd->dw15.bti_hme_dist = bti_idx++;
5447 cmd->dw16.bti_lcu_skip = bti_idx++;
5448 cmd->dw17.bti_debug = bti_idx++;
5450 i965_gpe_context_unmap_curbe(gpe_context);
5454 gen9_hevc_32x32_b_intra_set_surfaces(VADriverContextP ctx,
5455 struct encode_state *encode_state,
5456 struct intel_encoder_context *encoder_context,
5457 struct i965_gpe_context *gpe_context)
5459 struct encoder_vme_mfc_context *vme_context = NULL;
5460 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5463 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5464 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5466 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5467 HEVC_ENC_SURFACE_32x32_PU_OUTPUT, bti_idx++,
5468 0, 0, 0, NULL, NULL);
5470 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5471 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
5472 1, 1, I965_SURFACEFORMAT_R8_UNORM,
5476 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5477 HEVC_ENC_SURFACE_Y_2X, bti_idx++,
5478 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5481 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5482 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
5483 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5486 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
5487 HEVC_ENC_SURFACE_Y_2X_VME, bti_idx++,
5490 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5491 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
5492 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5495 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5496 HEVC_ENC_SURFACE_HME_MVP, bti_idx++,
5497 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5500 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5501 HEVC_ENC_SURFACE_HME_DIST, bti_idx++,
5502 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5505 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5506 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
5507 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5510 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5511 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx,
5512 0, 0, 0, NULL, NULL);
5516 gen9_hevc_32x32_b_intra(VADriverContextP ctx,
5517 struct encode_state *encode_state,
5518 struct intel_encoder_context *encoder_context)
5520 struct encoder_vme_mfc_context *vme_context = NULL;
5521 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5522 struct gen9_hevc_encoder_state *priv_state = NULL;
5523 struct gpe_media_object_walker_parameter param;
5524 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5525 struct i965_gpe_context *gpe_context = NULL;
5526 int media_state = HEVC_ENC_MEDIA_STATE_32x32_B_INTRA_CHECK;
5528 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5529 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5530 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5532 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_32x32INTRACHECK_IDX];
5534 gen8_gpe_context_init(ctx, gpe_context);
5535 gen9_gpe_reset_binding_table(ctx, gpe_context);
5536 gen9_hevc_32x32_b_intra_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5537 gen9_hevc_32x32_b_intra_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5538 gen8_gpe_setup_interface_data(ctx, gpe_context);
5540 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5541 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
5542 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
5543 hevc_walker_param.no_dependency = 1;
5544 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5545 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5550 gen9_hevc_32x32_pu_mode_set_curbe(VADriverContextP ctx,
5551 struct encode_state *encode_state,
5552 struct intel_encoder_context *encoder_context,
5553 struct i965_gpe_context *gpe_context)
5555 struct encoder_vme_mfc_context *vme_context = NULL;
5556 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5557 struct generic_enc_codec_state *generic_state = NULL;
5558 struct gen9_hevc_encoder_state *priv_state = NULL;
5559 VAEncPictureParameterBufferHEVC *pic_param = NULL;
5560 VAEncSliceParameterBufferHEVC *slice_param = NULL;
5561 gen9_hevc_mbenc_32x32_pu_mode_curbe_data *cmd = NULL;
5562 double lambda_scaling_factor = 1.0, qp_lambda = 0.0, squared_qp_lambda = 0.0;
5563 unsigned int slice_qp = 0, fixed_point_lambda = 0;
5566 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5567 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5568 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
5569 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5570 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
5571 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
5573 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
5574 gen9_hevc_set_lambda_tables(priv_ctx, HEVC_SLICE_I, HEVC_ENC_INTRA_TRANS_HAAR);
5575 lambda_scaling_factor = 1.0;
5576 qp_lambda = priv_ctx->lambda_md_table[HEVC_SLICE_I][slice_qp];
5577 squared_qp_lambda = qp_lambda * qp_lambda;
5578 fixed_point_lambda = (unsigned int)(lambda_scaling_factor * squared_qp_lambda * (1 << 10));
5580 cmd = i965_gpe_context_map_curbe(gpe_context);
5584 memset((void *)cmd, 0, sizeof(*cmd));
5586 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
5587 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
5588 cmd->dw1.enable_debug_dump = 0;
5589 cmd->dw1.lcu_type = priv_state->lcu_size == 64 ? 0 : 1;
5590 cmd->dw1.pu_type = 0;
5591 cmd->dw1.brc_enable = !!generic_state->brc_enabled;
5592 cmd->dw1.lcu_brc_enable = priv_state->lcu_brc_enabled;
5593 cmd->dw1.slice_type = priv_state->picture_coding_type;
5594 cmd->dw1.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
5595 0 : priv_state->video_surveillance_flag;
5596 cmd->dw1.roi_enable = (priv_state->num_roi > 0);
5598 cmd->dw2.lambda = fixed_point_lambda;
5599 cmd->dw3.mode_cost_32x32 = 0;
5600 cmd->dw4.early_exit = (unsigned int) - 1;
5602 cmd->dw8.bti_32x32_pu_output = bti_idx++;
5603 cmd->dw9.bti_src_y = bti_idx++;
5605 cmd->dw10.bti_src_y2x = bti_idx++;
5606 cmd->dw11.bti_slice_map = bti_idx++;
5607 cmd->dw12.bti_src_y2x_vme = bti_idx++;
5608 cmd->dw13.bti_brc_input = bti_idx++;
5609 cmd->dw14.bti_lcu_qp_surface = bti_idx++;
5610 cmd->dw15.bti_brc_data = bti_idx++;
5611 cmd->dw16.bti_kernel_debug = bti_idx++;
5613 i965_gpe_context_unmap_curbe(gpe_context);
5617 gen9_hevc_32x32_pu_mode_set_surfaces(VADriverContextP ctx,
5618 struct encode_state *encode_state,
5619 struct intel_encoder_context *encoder_context,
5620 struct i965_gpe_context *gpe_context)
5622 struct encoder_vme_mfc_context *vme_context = NULL;
5623 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5626 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5627 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5629 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5630 HEVC_ENC_SURFACE_32x32_PU_OUTPUT, bti_idx++,
5631 0, 0, 0, NULL, NULL);
5633 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5634 HEVC_ENC_SURFACE_RAW_Y, bti_idx++,
5635 1, 1, I965_SURFACEFORMAT_R8_UNORM,
5639 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5640 HEVC_ENC_SURFACE_Y_2X, bti_idx++,
5641 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5644 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5645 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
5646 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5649 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
5650 HEVC_ENC_SURFACE_Y_2X_VME, bti_idx++,
5653 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5654 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
5655 0, 0, 0, NULL, NULL);
5657 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5658 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
5659 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5662 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5663 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
5664 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5667 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5668 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx,
5669 0, 0, 0, NULL, NULL);
5673 gen9_hevc_32x32_pu_mode(VADriverContextP ctx,
5674 struct encode_state *encode_state,
5675 struct intel_encoder_context *encoder_context)
5677 struct encoder_vme_mfc_context *vme_context = NULL;
5678 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5679 struct gen9_hevc_encoder_state *priv_state = NULL;
5680 struct gpe_media_object_walker_parameter param;
5681 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5682 struct i965_gpe_context *gpe_context = NULL;
5683 int media_state = HEVC_ENC_MEDIA_STATE_32x32_PU_MODE_DECISION;
5685 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5686 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5687 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5689 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_32x32MD_IDX];
5691 gen8_gpe_context_init(ctx, gpe_context);
5692 gen9_gpe_reset_binding_table(ctx, gpe_context);
5693 gen9_hevc_32x32_pu_mode_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5694 gen9_hevc_32x32_pu_mode_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5695 gen8_gpe_setup_interface_data(ctx, gpe_context);
5697 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5698 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
5699 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
5700 hevc_walker_param.no_dependency = 1;
5701 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5702 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5707 gen9_hevc_2x_scaling_set_curbe(VADriverContextP ctx,
5708 struct encode_state *encode_state,
5709 struct intel_encoder_context *encoder_context,
5710 struct i965_gpe_context *gpe_context)
5712 struct encoder_vme_mfc_context *vme_context = NULL;
5713 struct gen9_hevc_encoder_state *priv_state = NULL;
5714 gen9_hevc_mbenc_downscaling2x_curbe_data *cmd = NULL;
5717 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5718 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5720 cmd = i965_gpe_context_map_curbe(gpe_context);
5724 memset((void *)cmd, 0, sizeof(gen9_hevc_mbenc_downscaling2x_curbe_data));
5726 cmd->dw0.pic_width = ALIGN(priv_state->picture_width, 16);
5727 cmd->dw0.pic_height = ALIGN(priv_state->picture_height, 16);
5729 cmd->dw8.bti_src_y = bti_idx++;
5730 cmd->dw9.bit_dst_y = bti_idx;
5732 i965_gpe_context_unmap_curbe(gpe_context);
5736 gen9_hevc_2x_scaling_set_surfaces(VADriverContextP ctx,
5737 struct encode_state *encode_state,
5738 struct intel_encoder_context *encoder_context,
5739 struct i965_gpe_context *gpe_context)
5741 struct encoder_vme_mfc_context *vme_context = NULL;
5742 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5745 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5746 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5748 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5749 HEVC_ENC_SURFACE_RAW_Y, bti_idx++,
5750 0, 1, I965_SURFACEFORMAT_R16_UNORM,
5753 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5754 HEVC_ENC_SURFACE_Y_2X, bti_idx,
5755 0, 1, I965_SURFACEFORMAT_R16_UNORM,
5760 gen9_hevc_2x_scaling(VADriverContextP ctx,
5761 struct encode_state *encode_state,
5762 struct intel_encoder_context *encoder_context)
5764 struct encoder_vme_mfc_context *vme_context = NULL;
5765 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5766 struct gen9_hevc_encoder_state *priv_state = NULL;
5767 struct gpe_media_object_walker_parameter param;
5768 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5769 struct i965_gpe_context *gpe_context = NULL;
5770 int media_state = HEVC_ENC_MEDIA_STATE_2X_SCALING;
5772 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5773 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5774 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5776 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_2xSCALING_IDX];
5778 gen8_gpe_context_init(ctx, gpe_context);
5779 gen9_gpe_reset_binding_table(ctx, gpe_context);
5780 gen9_hevc_2x_scaling_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5781 gen9_hevc_2x_scaling_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5782 gen8_gpe_setup_interface_data(ctx, gpe_context);
5784 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5785 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
5786 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
5787 hevc_walker_param.no_dependency = 1;
5788 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5790 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5795 gen9_hevc_mbenc(VADriverContextP ctx,
5796 struct encode_state *encode_state,
5797 struct intel_encoder_context *encoder_context)
5799 struct encoder_vme_mfc_context *vme_context = NULL;
5800 struct gen9_hevc_encoder_state *priv_state = NULL;
5801 int fast_encoding = 0;
5803 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5804 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5805 fast_encoding = (priv_state->tu_mode == HEVC_TU_BEST_SPEED);
5807 if (!fast_encoding) {
5808 if (!priv_state->bit_depth_luma_minus8)
5809 gen9_hevc_2x_scaling(ctx, encode_state, encoder_context);
5811 if (priv_state->picture_coding_type == HEVC_SLICE_I)
5812 gen9_hevc_32x32_pu_mode(ctx, encode_state, encoder_context);
5814 gen9_hevc_32x32_b_intra(ctx, encode_state, encoder_context);
5816 gen9_hevc_16x16_sad_pu_computation(ctx, encode_state, encoder_context);
5817 gen9_hevc_16x16_pu_mode(ctx, encode_state, encoder_context);
5818 gen9_hevc_8x8_pu_mode(ctx, encode_state, encoder_context);
5819 gen9_hevc_8x8_pu_fmode(ctx, encode_state, encoder_context);
5822 if (priv_state->picture_coding_type != HEVC_SLICE_I ||
5824 gen9_hevc_8x8_b_mbenc(ctx, encode_state, encoder_context);
5825 gen9_hevc_8x8_b_pak(ctx, encode_state, encoder_context);
5830 gen9_hevc_vme_gpe_init(VADriverContextP ctx,
5831 struct encode_state *encode_state,
5832 struct intel_encoder_context *encoder_context)
5834 struct encoder_vme_mfc_context *vme_context = NULL;
5835 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5836 struct gen9_hevc_encoder_state *priv_state = NULL;
5837 VAEncSliceParameterBufferHEVC *slice_param = NULL;
5840 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5841 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5842 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5844 i965_zero_gpe_resource(&priv_ctx->res_mb_code_surface);
5846 i965_zero_gpe_resource(&priv_ctx->res_slice_map_buffer);
5847 if (encode_state->num_slice_params_ext > 1) {
5848 struct gen9_hevc_slice_map *pslice_map = NULL;
5849 int width = priv_state->width_in_lcu;
5850 int pitch = ALIGN(priv_state->frame_width_in_max_lcu >> 3, 64);
5851 void *ptr_start = NULL;
5854 ptr_start = (void *)i965_map_gpe_resource(&priv_ctx->res_slice_map_buffer);
5857 return VA_STATUS_ERROR_UNKNOWN;
5859 pslice_map = (struct gen9_hevc_slice_map *)ptr_start;
5860 for (i = 0; i < encode_state->num_slice_params_ext; i++) {
5861 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[i]->buffer;
5863 for (j = 0; j < slice_param->num_ctu_in_slice; j++) {
5864 pslice_map[lcu_count++].slice_id = i;
5866 if (lcu_count >= width) {
5870 pslice_map = (struct gen9_hevc_slice_map *)ptr_start;
5875 i965_unmap_gpe_resource(&priv_ctx->res_slice_map_buffer);
5878 return VA_STATUS_SUCCESS;
5882 gen9_hevc_vme_gpe_run(VADriverContextP ctx,
5883 struct encode_state *encode_state,
5884 struct intel_encoder_context *encoder_context)
5886 struct encoder_vme_mfc_context *vme_context = NULL;
5887 struct generic_enc_codec_state *generic_state = NULL;
5888 struct gen9_hevc_encoder_state *priv_state = NULL;
5890 vme_context = encoder_context->vme_context;
5891 generic_state = vme_context->generic_enc_state;
5892 priv_state = vme_context->private_enc_state;
5894 if (generic_state->brc_enabled &&
5895 (generic_state->brc_need_reset || !generic_state->brc_inited)) {
5896 gen9_hevc_brc_init_reset(ctx, encode_state, encoder_context,
5897 generic_state->brc_inited ? 1 : 0);
5898 generic_state->brc_need_reset = 0;
5899 generic_state->brc_inited = 1;
5902 if (generic_state->hme_supported || generic_state->brc_enabled) {
5903 gen9_hevc_hme_scaling(ctx, encode_state, encoder_context);
5905 if (generic_state->brc_enabled)
5906 gen9_hevc_brc_intra_dist(ctx, encode_state, encoder_context);
5908 if (generic_state->hme_enabled)
5909 gen9_hevc_hme_encode_me(ctx, encode_state, encoder_context);
5911 if (generic_state->brc_enabled)
5912 gen9_hevc_brc_update(ctx, encode_state, encoder_context);
5915 if (priv_state->num_roi && !generic_state->brc_enabled)
5916 gen9_hevc_brc_update_lcu_based(ctx, encode_state, encoder_context);
5918 if (priv_state->bit_depth_luma_minus8)
5919 gen9_hevc_ref_frame_depth_conversion(ctx, encode_state, encoder_context);
5921 gen9_hevc_mbenc(ctx, encode_state, encoder_context);
5923 return VA_STATUS_SUCCESS;
5927 gen9_hevc_vme_pipeline(VADriverContextP ctx,
5929 struct encode_state *encode_state,
5930 struct intel_encoder_context *encoder_context)
5932 VAStatus va_status = VA_STATUS_SUCCESS;
5934 va_status = gen9_hevc_enc_init_parameters(ctx, encode_state, encoder_context);
5935 if (va_status != VA_STATUS_SUCCESS)
5938 va_status = gen9_hevc_vme_gpe_init(ctx, encode_state, encoder_context);
5939 if (va_status != VA_STATUS_SUCCESS)
5942 va_status = gen9_hevc_vme_gpe_run(ctx, encode_state, encoder_context);
5949 gen9_hevc_vme_scaling_context_init(VADriverContextP ctx,
5950 struct intel_encoder_context *encoder_context)
5952 struct encoder_vme_mfc_context *vme_context = NULL;
5953 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5954 struct gen9_hevc_encoder_state *priv_state = NULL;
5955 struct i965_gpe_context *gpe_context = NULL;
5956 struct i965_kernel kernel_info;
5957 struct gen9_hevc_scaling_context *scaling_ctx = NULL;
5958 GEN9_ENC_OPERATION kernel_idx;
5962 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5963 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5964 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5966 scaling_ctx = &priv_ctx->scaling_context;
5968 for (i = 0; i < NUM_HEVC_ENC_SCALING; i++) {
5969 if (i == HEVC_ENC_SCALING_4X ||
5970 i == HEVC_ENC_SCALING_16X) {
5971 curbe_size = sizeof(gen9_hevc_scaling4x_curbe_data);
5972 kernel_idx = GEN9_ENC_SCALING4X;
5973 } else if (i == HEVC_ENC_SCALING_32X) {
5974 curbe_size = sizeof(gen9_hevc_scaling2x_curbe_data);
5975 kernel_idx = GEN9_ENC_SCALING2X;
5978 gpe_context = &scaling_ctx->gpe_contexts[i];
5980 gen9_hevc_vme_init_gpe_context(ctx, gpe_context,
5983 gen9_hevc_vme_init_scoreboard(gpe_context,
5985 priv_state->use_hw_scoreboard,
5986 priv_state->use_hw_non_stalling_scoreborad);
5988 memset(&kernel_info, 0, sizeof(kernel_info));
5989 gen9_hevc_get_kernel_header_and_size((void *)hevc_enc_kernel_ptr,
5990 hevc_enc_kernel_size,
5994 gen8_gpe_load_kernels(ctx,
6002 gen9_hevc_vme_me_context_init(VADriverContextP ctx,
6003 struct intel_encoder_context *encoder_context)
6005 struct encoder_vme_mfc_context *vme_context = NULL;
6006 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6007 struct gen9_hevc_encoder_state *priv_state = NULL;
6008 struct i965_gpe_context *gpe_context = NULL;
6009 struct i965_kernel kernel_info;
6010 struct gen9_hevc_me_context *me_ctx = NULL;
6013 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6014 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
6015 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
6017 me_ctx = &priv_ctx->me_context;
6019 for (i = 0; i < NUM_HEVC_ENC_ME; i++) {
6020 for (j = 0; j < NUM_HEVC_ENC_ME_TYPES; j++) {
6021 gpe_context = &me_ctx->gpe_context[j][i];
6023 gen9_hevc_vme_init_gpe_context(ctx, gpe_context,
6024 sizeof(gen9_hevc_me_curbe_data),
6026 gen9_hevc_vme_init_scoreboard(gpe_context,
6028 priv_state->use_hw_scoreboard,
6029 priv_state->use_hw_non_stalling_scoreborad);
6031 memset(&kernel_info, 0, sizeof(kernel_info));
6032 gen9_hevc_get_kernel_header_and_size((void *)hevc_enc_kernel_ptr,
6033 hevc_enc_kernel_size,
6037 gen8_gpe_load_kernels(ctx,
6046 gen9_hevc_vme_mbenc_context_init(VADriverContextP ctx,
6047 struct intel_encoder_context *encoder_context)
6049 struct encoder_vme_mfc_context *vme_context = NULL;
6050 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6051 struct gen9_hevc_encoder_state *priv_state = NULL;
6052 struct i965_gpe_context *gpe_context = NULL;
6053 struct i965_kernel kernel_info;
6054 struct gen9_hevc_mbenc_context *mbenc_ctx = NULL;
6057 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6058 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
6059 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
6061 mbenc_ctx = &priv_ctx->mbenc_context;
6063 mbenc_ctx->kernel_num = GEN8_HEVC_ENC_MBENC_TOTAL_NUM;
6065 for (i = 0; i < mbenc_ctx->kernel_num; i++) {
6066 gpe_context = &mbenc_ctx->gpe_contexts[i];
6068 gen9_hevc_vme_init_gpe_context(ctx, gpe_context,
6069 hevc_mbenc_curbe_size[i],
6071 gen9_hevc_vme_init_scoreboard(gpe_context,
6073 priv_state->use_hw_scoreboard,
6074 priv_state->use_hw_non_stalling_scoreborad);
6076 memset(&kernel_info, 0, sizeof(kernel_info));
6077 gen9_hevc_get_kernel_header_and_size((void *)hevc_enc_kernel_ptr,
6078 hevc_enc_kernel_size,
6082 gen8_gpe_load_kernels(ctx,
6090 gen9_hevc_vme_brc_context_init(VADriverContextP ctx,
6091 struct intel_encoder_context *encoder_context)
6093 struct encoder_vme_mfc_context *vme_context = NULL;
6094 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6095 struct gen9_hevc_encoder_state *priv_state = NULL;
6096 struct i965_gpe_context *gpe_context = NULL;
6097 struct i965_kernel kernel_info;
6098 struct gen9_hevc_brc_context *brc_ctx = NULL;
6101 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6102 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
6103 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
6105 brc_ctx = &priv_ctx->brc_context;
6107 for (i = 0; i < GEN9_HEVC_ENC_BRC_NUM; i++) {
6108 gpe_context = &brc_ctx->gpe_contexts[i];
6110 gen9_hevc_vme_init_gpe_context(ctx, gpe_context,
6111 hevc_brc_curbe_size[i],
6113 gen9_hevc_vme_init_scoreboard(gpe_context,
6115 priv_state->use_hw_scoreboard,
6116 priv_state->use_hw_non_stalling_scoreborad);
6118 memset(&kernel_info, 0, sizeof(kernel_info));
6119 gen9_hevc_get_kernel_header_and_size((void *)hevc_enc_kernel_ptr,
6120 hevc_enc_kernel_size,
6124 gen8_gpe_load_kernels(ctx,
6132 gen9_hevc_vme_scaling_context_destroy(struct gen9_hevc_scaling_context *scaling_context)
6136 for (i = 0; i < NUM_HEVC_ENC_SCALING; i++)
6137 gen8_gpe_context_destroy(&scaling_context->gpe_contexts[i]);
6141 gen9_hevc_vme_me_context_destroy(struct gen9_hevc_me_context *me_context)
6145 for (i = 0; i < NUM_HEVC_ENC_ME; i++)
6146 for (j = 0; j < NUM_HEVC_ENC_ME_TYPES; j++)
6147 gen8_gpe_context_destroy(&me_context->gpe_context[j][i]);
6151 gen9_hevc_vme_mbenc_context_destroy(struct gen9_hevc_mbenc_context *mbenc_context)
6155 for (i = 0; i < mbenc_context->kernel_num; i++)
6156 gen8_gpe_context_destroy(&mbenc_context->gpe_contexts[i]);
6160 gen9_hevc_vme_brc_context_destroy(struct gen9_hevc_brc_context *brc_context)
6164 for (i = 0; i < GEN9_HEVC_ENC_BRC_NUM; i++)
6165 gen8_gpe_context_destroy(&brc_context->gpe_contexts[i]);
6169 gen9_hevc_vme_kernels_context_init(VADriverContextP ctx,
6170 struct intel_encoder_context *encoder_context)
6172 gen9_hevc_vme_scaling_context_init(ctx, encoder_context);
6173 gen9_hevc_vme_me_context_init(ctx, encoder_context);
6174 gen9_hevc_vme_mbenc_context_init(ctx, encoder_context);
6175 gen9_hevc_vme_brc_context_init(ctx, encoder_context);
6179 gen9_hevc_vme_kernels_context_destroy(struct encoder_vme_mfc_context *vme_context)
6181 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6183 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
6185 gen9_hevc_vme_scaling_context_destroy(&priv_ctx->scaling_context);
6186 gen9_hevc_vme_me_context_destroy(&priv_ctx->me_context);
6187 gen9_hevc_vme_mbenc_context_destroy(&priv_ctx->mbenc_context);
6188 gen9_hevc_vme_brc_context_destroy(&priv_ctx->brc_context);
6192 gen9_hevc_vme_context_destroy(void *context)
6194 struct encoder_vme_mfc_context *vme_context = (struct encoder_vme_mfc_context *)context;
6199 gen9_hevc_enc_free_resources(vme_context);
6201 gen9_hevc_vme_kernels_context_destroy(vme_context);
6203 if (vme_context->private_enc_ctx) free(vme_context->private_enc_ctx);
6204 if (vme_context->generic_enc_state) free(vme_context->generic_enc_state);
6205 if (vme_context->private_enc_state) free(vme_context->private_enc_state);
6210 #define PAK_IMPLEMENTATION_START
6213 gen9_hevc_pak_pipe_mode_select(VADriverContextP ctx,
6214 struct encode_state *encode_state,
6215 struct intel_encoder_context *encoder_context)
6217 struct intel_batchbuffer *batch = encoder_context->base.batch;
6219 BEGIN_BCS_BATCH(batch, 6);
6221 OUT_BCS_BATCH(batch, HCP_PIPE_MODE_SELECT | (6 - 2));
6222 OUT_BCS_BATCH(batch,
6225 HCP_CODEC_SELECT_ENCODE);
6226 OUT_BCS_BATCH(batch, 0);
6227 OUT_BCS_BATCH(batch, 0);
6228 OUT_BCS_BATCH(batch, 0);
6229 OUT_BCS_BATCH(batch, 0);
6231 ADVANCE_BCS_BATCH(batch);
6235 gen9_hevc_pak_add_surface_state(VADriverContextP ctx,
6236 struct encode_state *encode_state,
6237 struct intel_encoder_context *encoder_context,
6238 struct object_surface *obj_surface,
6239 enum GEN9_HEVC_ENC_SURFACE_TYPE type)
6241 struct intel_batchbuffer *batch = encoder_context->base.batch;
6243 BEGIN_BCS_BATCH(batch, 3);
6245 OUT_BCS_BATCH(batch, HCP_SURFACE_STATE | (3 - 2));
6246 OUT_BCS_BATCH(batch,
6248 (obj_surface->width - 1));
6249 OUT_BCS_BATCH(batch,
6250 (((obj_surface->fourcc == VA_FOURCC_P010) ?
6251 SURFACE_FORMAT_P010 :
6252 SURFACE_FORMAT_PLANAR_420_8) << 28) |
6253 (obj_surface->y_cb_offset));
6255 ADVANCE_BCS_BATCH(batch);
6258 #define OUT_BUFFER(buf_bo, is_target, ma) \
6261 OUT_RELOC64(batch, \
6263 I915_GEM_DOMAIN_RENDER, \
6264 is_target ? I915_GEM_DOMAIN_RENDER : 0, \
6267 OUT_BCS_BATCH(batch, 0); \
6268 OUT_BCS_BATCH(batch, 0); \
6271 OUT_BCS_BATCH(batch, priv_ctx->mocs); \
6274 #define OUT_BUFFER_MA_TARGET(buf_bo) OUT_BUFFER(buf_bo, 1, 1)
6275 #define OUT_BUFFER_MA_REFERENCE(buf_bo) OUT_BUFFER(buf_bo, 0, 1)
6276 #define OUT_BUFFER_NMA_REFERENCE(buf_bo) OUT_BUFFER(buf_bo, 0, 0)
6279 gen9_hevc_pak_add_pipe_buf_addr_state(VADriverContextP ctx,
6280 struct encode_state *encode_state,
6281 struct intel_encoder_context *encoder_context)
6283 struct i965_driver_data *i965 = i965_driver_data(ctx);
6284 struct intel_batchbuffer *batch = encoder_context->base.batch;
6285 struct encoder_vme_mfc_context *pak_context = NULL;
6286 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6290 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6291 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6293 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
6294 BEGIN_BCS_BATCH(batch, 104);
6296 OUT_BCS_BATCH(batch, HCP_PIPE_BUF_ADDR_STATE | (104 - 2));
6298 BEGIN_BCS_BATCH(batch, 95);
6300 OUT_BCS_BATCH(batch, HCP_PIPE_BUF_ADDR_STATE | (95 - 2));
6303 OUT_BUFFER_MA_TARGET(priv_ctx->reconstructed_object.obj_surface->bo);
6304 OUT_BUFFER_MA_TARGET(priv_ctx->deblocking_filter_line_buffer.bo);
6305 OUT_BUFFER_MA_TARGET(priv_ctx->deblocking_filter_tile_line_buffer.bo);
6306 OUT_BUFFER_MA_TARGET(priv_ctx->deblocking_filter_tile_column_buffer.bo);
6307 OUT_BUFFER_MA_TARGET(priv_ctx->metadata_line_buffer.bo);
6308 OUT_BUFFER_MA_TARGET(priv_ctx->metadata_tile_line_buffer.bo);
6309 OUT_BUFFER_MA_TARGET(priv_ctx->metadata_tile_column_buffer.bo);
6310 OUT_BUFFER_MA_TARGET(priv_ctx->sao_line_buffer.bo);
6311 OUT_BUFFER_MA_TARGET(priv_ctx->sao_tile_line_buffer.bo);
6312 OUT_BUFFER_MA_TARGET(priv_ctx->sao_tile_column_buffer.bo);
6313 OUT_BUFFER_MA_TARGET(priv_ctx->
6314 mv_temporal_buffer[GEN9_MAX_MV_TEMPORAL_BUFFERS - 1].bo);
6315 OUT_BUFFER_MA_TARGET(NULL);
6317 for (i = 0; i < GEN9_MAX_REF_SURFACES; i++) {
6318 if (priv_ctx->reference_surfaces[i].obj_surface &&
6319 priv_ctx->reference_surfaces[i].obj_surface->bo) {
6320 bo = priv_ctx->reference_surfaces[i].obj_surface->bo;
6322 OUT_BUFFER_NMA_REFERENCE(bo);
6324 OUT_BUFFER_NMA_REFERENCE(NULL);
6326 OUT_BCS_BATCH(batch, priv_ctx->mocs);
6328 OUT_BUFFER_MA_TARGET(priv_ctx->
6329 uncompressed_picture_source.obj_surface->bo);
6330 OUT_BUFFER_MA_TARGET(NULL);
6331 OUT_BUFFER_MA_TARGET(NULL);
6332 OUT_BUFFER_MA_TARGET(NULL);
6334 for (i = 0; i < GEN9_MAX_MV_TEMPORAL_BUFFERS - 1; i++) {
6335 bo = priv_ctx->mv_temporal_buffer[i].bo;
6338 OUT_BUFFER_NMA_REFERENCE(bo);
6340 OUT_BUFFER_NMA_REFERENCE(NULL);
6342 OUT_BCS_BATCH(batch, priv_ctx->mocs);
6344 OUT_BUFFER_MA_TARGET(NULL);
6345 OUT_BUFFER_MA_TARGET(NULL);
6346 OUT_BUFFER_MA_TARGET(NULL);
6347 OUT_BUFFER_MA_TARGET(NULL);
6349 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
6350 for (i = 0; i < 9; i++)
6351 OUT_BCS_BATCH(batch, 0);
6354 ADVANCE_BCS_BATCH(batch);
6358 gen9_hevc_pak_add_ind_obj_base_addr_state(VADriverContextP ctx,
6359 struct encode_state *encode_state,
6360 struct intel_encoder_context *encoder_context)
6362 struct intel_batchbuffer *batch = encoder_context->base.batch;
6363 struct encoder_vme_mfc_context *pak_context = NULL;
6364 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6365 struct gen9_hevc_encoder_state *priv_state = NULL;
6367 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6368 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6369 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
6371 BEGIN_BCS_BATCH(batch, 14);
6373 OUT_BCS_BATCH(batch, HCP_IND_OBJ_BASE_ADDR_STATE | (14 - 2));
6374 OUT_BUFFER_MA_REFERENCE(NULL);
6375 OUT_BUFFER_NMA_REFERENCE(NULL);
6378 priv_ctx->res_mb_code_surface.bo,
6379 I915_GEM_DOMAIN_INSTRUCTION, 0,
6380 priv_state->mb_data_offset);
6381 OUT_BCS_BATCH(batch, priv_ctx->mocs);
6384 priv_ctx->indirect_pak_bse_object.bo,
6385 I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
6386 priv_ctx->indirect_pak_bse_object.offset);
6387 OUT_BCS_BATCH(batch, priv_ctx->mocs);
6390 priv_ctx->indirect_pak_bse_object.bo,
6391 I915_GEM_DOMAIN_RENDER, 0,
6392 priv_ctx->indirect_pak_bse_object.end_offset);
6394 ADVANCE_BCS_BATCH(batch);
6398 gen9_hevc_pak_set_qm(VADriverContextP ctx,
6400 int color_component,
6405 struct intel_encoder_context *encoder_context)
6407 struct intel_batchbuffer *batch = encoder_context->base.batch;
6408 unsigned int qm_buffer[16];
6410 memset(qm_buffer, 0, sizeof(qm_buffer));
6411 memcpy(qm_buffer, qm, qm_length * 4);
6413 BEGIN_BCS_BATCH(batch, 18);
6415 OUT_BCS_BATCH(batch, HCP_QM_STATE | (18 - 2));
6416 OUT_BCS_BATCH(batch,
6418 color_component << 3 |
6421 intel_batchbuffer_data(batch, qm_buffer, 16 * 4);
6423 ADVANCE_BCS_BATCH(batch);
6426 static unsigned int qm_default[16] = {
6427 0x10101010, 0x10101010, 0x10101010, 0x10101010,
6428 0x10101010, 0x10101010, 0x10101010, 0x10101010,
6429 0x10101010, 0x10101010, 0x10101010, 0x10101010,
6430 0x10101010, 0x10101010, 0x10101010, 0x10101010
6434 gen9_hevc_pak_add_qm_state(VADriverContextP ctx,
6435 struct encode_state *encode_state,
6436 struct intel_encoder_context *encoder_context)
6440 for (i = 0; i < 6; i++)
6441 gen9_hevc_pak_set_qm(ctx,
6446 for (i = 0; i < 6; i++)
6447 gen9_hevc_pak_set_qm(ctx,
6452 for (i = 0; i < 6; i++)
6453 gen9_hevc_pak_set_qm(ctx,
6454 2, i % 3, i / 3, 16,
6458 for (i = 0; i < 2; i++)
6459 gen9_hevc_pak_set_qm(ctx,
6466 gen9_hevc_pak_set_fqm(VADriverContextP ctx,
6468 int color_component,
6473 struct intel_encoder_context *encoder_context)
6475 struct intel_batchbuffer *batch = encoder_context->base.batch;
6476 unsigned int fqm_buffer[32];
6478 memset(fqm_buffer, 0, sizeof(fqm_buffer));
6479 memcpy(fqm_buffer, fqm, fqm_length * 4);
6481 BEGIN_BCS_BATCH(batch, 34);
6483 OUT_BCS_BATCH(batch, HCP_FQM_STATE | (34 - 2));
6484 OUT_BCS_BATCH(batch,
6486 color_component << 3 |
6489 intel_batchbuffer_data(batch, fqm_buffer, 32 * 4);
6491 ADVANCE_BCS_BATCH(batch);
6494 static unsigned int fm_default[32] = {
6495 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6496 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6497 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6498 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6499 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6500 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6501 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6502 0x10001000, 0x10001000, 0x10001000, 0x10001000
6506 gen9_hevc_pak_add_fm_state(VADriverContextP ctx,
6507 struct encode_state *encode_state,
6508 struct intel_encoder_context *encoder_context)
6510 gen9_hevc_pak_set_fqm(ctx,
6514 gen9_hevc_pak_set_fqm(ctx,
6518 gen9_hevc_pak_set_fqm(ctx,
6522 gen9_hevc_pak_set_fqm(ctx,
6526 gen9_hevc_pak_set_fqm(ctx,
6530 gen9_hevc_pak_set_fqm(ctx,
6534 gen9_hevc_pak_set_fqm(ctx,
6538 gen9_hevc_pak_set_fqm(ctx,
6545 gen9_hevc_set_reflist(VADriverContextP ctx,
6546 struct gen9_hevc_encoder_context *priv_ctx,
6547 VAEncPictureParameterBufferHEVC *pic_param,
6548 VAEncSliceParameterBufferHEVC *slice_param,
6550 struct intel_batchbuffer *batch)
6552 struct i965_driver_data *i965 = i965_driver_data(ctx);
6553 int num_ref_minus1 = (list_idx ?
6554 slice_param->num_ref_idx_l1_active_minus1 :
6555 slice_param->num_ref_idx_l0_active_minus1);
6556 VAPictureHEVC *ref_list = (list_idx ?
6557 slice_param->ref_pic_list1 :
6558 slice_param->ref_pic_list0);
6559 VAPictureHEVC *curr_pic = &pic_param->decoded_curr_pic;
6560 struct object_surface *obj_surface = NULL;
6564 BEGIN_BCS_BATCH(batch, 18);
6566 OUT_BCS_BATCH(batch, HCP_REF_IDX_STATE | (18 - 2));
6567 OUT_BCS_BATCH(batch,
6568 num_ref_minus1 << 1 |
6571 for (i = 0; i < 16; i++) {
6573 obj_surface = SURFACE(ref_list[i].picture_id);
6574 if (i < MIN((num_ref_minus1 + 1), GEN9_MAX_REF_SURFACES) && obj_surface) {
6575 for (j = 0; j < GEN9_MAX_REF_SURFACES; j++) {
6576 if (obj_surface == priv_ctx->reference_surfaces[j].obj_surface) {
6583 if (i < MIN((num_ref_minus1 + 1), GEN9_MAX_REF_SURFACES) &&
6585 OUT_BCS_BATCH(batch,
6588 !!(ref_list[i].flags & VA_PICTURE_HEVC_LONG_TERM_REFERENCE) << 13 |
6592 (CLAMP(-128, 127, curr_pic->pic_order_cnt -
6593 ref_list[i].pic_order_cnt) & 0xff));
6595 OUT_BCS_BATCH(batch, 0);
6599 ADVANCE_BCS_BATCH(batch);
6603 gen9_hevc_pak_add_slice_state(VADriverContextP ctx,
6604 struct encode_state *encode_state,
6605 struct intel_encoder_context *encoder_context,
6607 struct intel_batchbuffer *batch)
6609 struct i965_driver_data *i965 = i965_driver_data(ctx);
6610 struct encoder_vme_mfc_context *pak_context = NULL;
6611 struct gen9_hevc_encoder_state *priv_state = NULL;
6612 VAEncPictureParameterBufferHEVC *pic_param = NULL;
6613 VAEncSliceParameterBufferHEVC *slice_param = NULL;
6614 int slice_hor_pos, slice_ver_pos, next_slice_hor_pos, next_slice_ver_pos;
6615 int slice_type = 0, slice_end = 0, last_slice = 0;
6616 int collocated_ref_idx = 0;
6618 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6619 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
6620 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
6621 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice_idx]->buffer;
6623 slice_type = slice_param->slice_type;
6624 slice_end = slice_param->slice_segment_address + slice_param->num_ctu_in_slice;
6625 slice_hor_pos = slice_param->slice_segment_address % priv_state->width_in_lcu;
6626 slice_ver_pos = slice_param->slice_segment_address / priv_state->width_in_lcu;
6627 next_slice_hor_pos = slice_end % priv_state->width_in_lcu;
6628 next_slice_ver_pos = slice_end / priv_state->width_in_lcu;
6630 if (slice_end >= priv_state->width_in_lcu * priv_state->height_in_lcu ||
6631 slice_idx == encode_state->num_slice_params_ext - 1)
6634 if (priv_state->picture_coding_type != HEVC_SLICE_I &&
6635 slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag &&
6636 slice_param->slice_fields.bits.collocated_from_l0_flag)
6637 collocated_ref_idx = pic_param->collocated_ref_pic_index;
6639 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
6640 BEGIN_BCS_BATCH(batch, 11);
6642 OUT_BCS_BATCH(batch, HCP_SLICE_STATE | (11 - 2));
6644 BEGIN_BCS_BATCH(batch, 9);
6646 OUT_BCS_BATCH(batch, HCP_SLICE_STATE | (9 - 2));
6649 OUT_BCS_BATCH(batch,
6650 slice_ver_pos << 16 |
6652 OUT_BCS_BATCH(batch,
6653 next_slice_ver_pos << 16 |
6654 next_slice_hor_pos);
6655 OUT_BCS_BATCH(batch,
6656 (slice_param->slice_cr_qp_offset & 0x1f) << 17 |
6657 (slice_param->slice_cb_qp_offset & 0x1f) << 12 |
6658 (pic_param->pic_init_qp + slice_param->slice_qp_delta) << 6 |
6659 slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag << 5 |
6660 slice_param->slice_fields.bits.dependent_slice_segment_flag << 4 |
6663 OUT_BCS_BATCH(batch,
6664 collocated_ref_idx << 26 |
6665 (slice_param->max_num_merge_cand - 1) << 23 |
6666 slice_param->slice_fields.bits.cabac_init_flag << 22 |
6667 slice_param->luma_log2_weight_denom << 19 |
6668 (slice_param->luma_log2_weight_denom + slice_param->delta_chroma_log2_weight_denom) << 16 |
6669 slice_param->slice_fields.bits.collocated_from_l0_flag << 15 |
6670 priv_state->low_delay << 14 |
6671 slice_param->slice_fields.bits.mvd_l1_zero_flag << 13 |
6672 slice_param->slice_fields.bits.slice_sao_luma_flag << 12 |
6673 slice_param->slice_fields.bits.slice_sao_chroma_flag << 11 |
6674 slice_param->slice_fields.bits.slice_loop_filter_across_slices_enabled_flag << 10 |
6675 (slice_param->slice_beta_offset_div2 & 0xf) << 5 |
6676 (slice_param->slice_tc_offset_div2 & 0xf) << 1 |
6677 slice_param->slice_fields.bits.slice_deblocking_filter_disabled_flag);
6678 OUT_BCS_BATCH(batch, 0);
6680 if (!pic_param->pic_fields.bits.reference_pic_flag &&
6681 priv_state->picture_coding_type != HEVC_SLICE_I)
6682 OUT_BCS_BATCH(batch, 0 << 26 |
6685 OUT_BCS_BATCH(batch, 5 << 26 |
6688 OUT_BCS_BATCH(batch,
6694 OUT_BCS_BATCH(batch, 0);
6696 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
6697 OUT_BCS_BATCH(batch, 0);
6698 OUT_BCS_BATCH(batch, 0);
6701 ADVANCE_BCS_BATCH(batch);
6705 gen9_hevc_find_skipemulcnt(unsigned char *buf, unsigned int bits_length)
6707 int skip_cnt = 0, i = 0;
6709 if ((bits_length >> 3) < 6)
6712 for (i = 0; i < 3; i++)
6725 gen9_hevc_pak_insert_object(unsigned int *data_buffer,
6726 unsigned int data_size,
6727 unsigned char emulation_flag,
6729 int is_end_of_slice,
6730 int skip_emul_byte_cnt,
6731 struct intel_batchbuffer *batch)
6733 int length_in_dws = ALIGN(data_size, 32) >> 5;
6734 int data_bits_in_last_dw = data_size & 0x1f;
6735 int skip_cnt = skip_emul_byte_cnt;
6737 if (data_bits_in_last_dw == 0)
6738 data_bits_in_last_dw = 32;
6740 if (emulation_flag) {
6742 skip_cnt = gen9_hevc_find_skipemulcnt((unsigned char *)data_buffer,
6746 BEGIN_BCS_BATCH(batch, length_in_dws + 2);
6748 OUT_BCS_BATCH(batch, HCP_INSERT_PAK_OBJECT | (length_in_dws + 2 - 2));
6749 OUT_BCS_BATCH(batch,
6753 (data_bits_in_last_dw << 8) |
6755 ((!!emulation_flag) << 3) |
6756 ((!!is_last_header) << 2) |
6757 ((!!is_end_of_slice) << 1) |
6759 intel_batchbuffer_data(batch, data_buffer, length_in_dws * 4);
6761 ADVANCE_BCS_BATCH(batch);
6765 gen9_hevc_pak_add_refs(VADriverContextP ctx,
6766 struct encode_state *encode_state,
6767 struct intel_encoder_context *encoder_context,
6769 struct intel_batchbuffer *batch)
6771 struct encoder_vme_mfc_context *pak_context = NULL;
6772 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6773 VAEncPictureParameterBufferHEVC *pic_param = NULL;
6774 VAEncSliceParameterBufferHEVC *slice_param = NULL;
6776 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6777 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6778 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
6779 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice_idx]->buffer;
6781 if (slice_param->slice_type == HEVC_SLICE_I)
6784 gen9_hevc_set_reflist(ctx, priv_ctx, pic_param, slice_param, 0, batch);
6786 if (slice_param->slice_type == HEVC_SLICE_P)
6789 gen9_hevc_set_reflist(ctx, priv_ctx, pic_param, slice_param, 1, batch);
6793 gen9_hevc_pak_insert_packed_data(VADriverContextP ctx,
6794 struct encode_state *encode_state,
6795 struct intel_encoder_context *encoder_context,
6797 struct intel_batchbuffer *batch)
6799 VAEncPackedHeaderParameterBuffer *param = NULL;
6800 unsigned int *header_data = NULL;
6801 unsigned int length_in_bits = 0;
6802 int packed_type = 0;
6803 int idx = 0, idx_offset = 0;
6806 for (i = 0; i < 4; i++) {
6810 packed_type = VAEncPackedHeaderHEVC_VPS;
6813 packed_type = VAEncPackedHeaderHEVC_VPS;
6817 packed_type = VAEncPackedHeaderHEVC_PPS;
6820 packed_type = VAEncPackedHeaderHEVC_SEI;
6826 idx = va_enc_packed_type_to_idx(packed_type) + idx_offset;
6827 if (encode_state->packed_header_data[idx]) {
6828 param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
6829 header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
6830 length_in_bits = param->bit_length;
6832 gen9_hevc_pak_insert_object(header_data, length_in_bits,
6833 !param->has_emulation_bytes, 0, 0, 0,
6840 gen9_hevc_pak_insert_slice_header(VADriverContextP ctx,
6841 struct encode_state *encode_state,
6842 struct intel_encoder_context *encoder_context,
6844 struct intel_batchbuffer *batch)
6846 VAEncPackedHeaderParameterBuffer *param = NULL;
6847 unsigned int *header_data = NULL;
6848 unsigned int length_in_bits = 0;
6849 int count = 0, start_index = -1;
6852 count = encode_state->slice_rawdata_count[slice_idx];
6853 start_index = encode_state->slice_rawdata_index[slice_idx] &
6854 SLICE_PACKED_DATA_INDEX_MASK;
6856 for (i = 0; i < count; i++) {
6857 param = (VAEncPackedHeaderParameterBuffer *)
6858 (encode_state->packed_header_params_ext[start_index + i]->buffer);
6860 if (param->type == VAEncPackedHeaderSlice)
6863 header_data = (unsigned int *)encode_state->packed_header_data_ext[start_index]->buffer;
6864 length_in_bits = param->bit_length;
6865 gen9_hevc_pak_insert_object(header_data, length_in_bits,
6866 !param->has_emulation_bytes, 0, 0, 0,
6871 if (encode_state->slice_header_index[slice_idx] & SLICE_PACKED_DATA_INDEX_TYPE)
6872 start_index = encode_state->slice_header_index[slice_idx] &
6873 SLICE_PACKED_DATA_INDEX_MASK;
6874 if (start_index == -1) {
6875 VAEncSequenceParameterBufferHEVC *seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
6876 VAEncPictureParameterBufferHEVC *pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
6877 VAEncSliceParameterBufferHEVC *slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice_idx]->buffer;
6878 unsigned char *slice_header = NULL;
6879 int slice_header_bits = 0;
6881 slice_header_bits = build_hevc_slice_header(seq_param,
6887 gen9_hevc_pak_insert_object((unsigned int *)slice_header, slice_header_bits,
6893 param = (VAEncPackedHeaderParameterBuffer *)
6894 (encode_state->packed_header_params_ext[start_index]->buffer);
6895 header_data = (unsigned int *)encode_state->packed_header_data_ext[start_index]->buffer;
6896 length_in_bits = param->bit_length;
6898 gen9_hevc_pak_insert_object(header_data, length_in_bits,
6899 !param->has_emulation_bytes, 1, 0, 0,
6905 gen9_hevc_pak_slice_level(VADriverContextP ctx,
6906 struct encode_state *encode_state,
6907 struct intel_encoder_context *encoder_context,
6910 struct intel_batchbuffer *batch = encoder_context->base.batch;
6911 struct encoder_vme_mfc_context *pak_context = NULL;
6912 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6913 struct generic_enc_codec_state *generic_state = NULL;
6914 struct gen9_hevc_encoder_state *priv_state = NULL;
6915 VAEncSliceParameterBufferHEVC *slice_param = NULL;
6916 struct intel_batchbuffer *slice_batch = NULL;
6917 struct gpe_mi_batch_buffer_start_parameter second_level_batch;
6918 VAStatus va_status = VA_STATUS_SUCCESS;
6919 int slice_offset = 0;
6921 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6922 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6923 generic_state = (struct generic_enc_codec_state *)pak_context->generic_enc_state;
6924 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
6925 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice_idx]->buffer;
6927 slice_batch = priv_ctx->res_pak_slice_batch_buffer;
6929 if (generic_state->curr_pak_pass == 0) {
6930 slice_offset = intel_batchbuffer_used_size(slice_batch);
6931 priv_state->slice_batch_offset[slice_idx] = slice_offset;
6933 if (slice_idx < encode_state->num_slice_params_ext - 1)
6934 priv_state->slice_start_lcu[slice_idx + 1] =
6935 priv_state->slice_start_lcu[slice_idx] +
6936 slice_param->num_ctu_in_slice;
6938 gen9_hevc_pak_add_refs(ctx, encode_state, encoder_context,
6939 slice_idx, slice_batch);
6940 gen9_hevc_pak_add_slice_state(ctx, encode_state, encoder_context,
6941 slice_idx, slice_batch);
6944 gen9_hevc_pak_insert_packed_data(ctx, encode_state, encoder_context,
6945 slice_idx, slice_batch);
6947 gen9_hevc_pak_insert_slice_header(ctx, encode_state, encoder_context,
6948 slice_idx, slice_batch);
6950 BEGIN_BCS_BATCH(slice_batch, 2);
6951 OUT_BCS_BATCH(slice_batch, 0);
6952 OUT_BCS_BATCH(slice_batch, MI_BATCH_BUFFER_END);
6953 ADVANCE_BCS_BATCH(slice_batch);
6955 slice_offset = priv_state->slice_batch_offset[slice_idx];
6957 memset(&second_level_batch, 0, sizeof(second_level_batch));
6958 second_level_batch.offset = slice_offset;
6959 second_level_batch.is_second_level = 1;
6960 second_level_batch.bo = slice_batch->buffer;
6961 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
6963 memset(&second_level_batch, 0, sizeof(second_level_batch));
6964 second_level_batch.offset = priv_state->slice_start_lcu[slice_idx] *
6965 priv_state->pak_obj_size;
6966 second_level_batch.is_second_level = 1;
6967 second_level_batch.bo = priv_ctx->res_mb_code_surface.bo;
6968 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
6974 gen9_hevc_pak_pipeline_prepare(VADriverContextP ctx,
6975 struct encode_state *encode_state,
6976 struct intel_encoder_context *encoder_context)
6978 struct i965_driver_data *i965 = i965_driver_data(ctx);
6979 struct encoder_vme_mfc_context *pak_context = NULL;
6980 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6981 struct gen9_hevc_encoder_state *priv_state = NULL;
6982 struct gen9_hevc_surface_priv *surface_priv;
6983 VAEncPictureParameterBufferHEVC *pic_param = NULL;
6984 struct i965_coded_buffer_segment *coded_buffer_segment = NULL;
6985 struct object_surface *obj_surface = NULL;
6986 struct object_buffer *obj_buffer = NULL;
6990 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6991 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6992 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
6993 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
6995 if (priv_ctx->uncompressed_picture_source.obj_surface &&
6996 priv_ctx->uncompressed_picture_source.obj_surface->bo)
6997 dri_bo_unreference(priv_ctx->uncompressed_picture_source.obj_surface->bo);
6998 priv_ctx->uncompressed_picture_source.obj_surface = encode_state->input_yuv_object;
6999 priv_ctx->uncompressed_picture_source.surface_id = encoder_context->input_yuv_surface;
7000 dri_bo_reference(priv_ctx->uncompressed_picture_source.obj_surface->bo);
7002 if (priv_ctx->reconstructed_object.obj_surface &&
7003 priv_ctx->reconstructed_object.obj_surface->bo)
7004 dri_bo_unreference(priv_ctx->reconstructed_object.obj_surface->bo);
7005 priv_ctx->reconstructed_object.obj_surface = encode_state->reconstructed_object;
7006 priv_ctx->reconstructed_object.surface_id = pic_param->decoded_curr_pic.picture_id;
7007 dri_bo_reference(priv_ctx->reconstructed_object.obj_surface->bo);
7009 surface_priv = (struct gen9_hevc_surface_priv *)encode_state->reconstructed_object->private_data;
7011 if (priv_ctx->mv_temporal_buffer[GEN9_MAX_MV_TEMPORAL_BUFFERS - 1].bo)
7012 dri_bo_unreference(priv_ctx->mv_temporal_buffer[GEN9_MAX_MV_TEMPORAL_BUFFERS - 1].bo);
7013 priv_ctx->mv_temporal_buffer[GEN9_MAX_MV_TEMPORAL_BUFFERS - 1].bo =
7014 surface_priv->motion_vector_temporal_bo;
7015 dri_bo_reference(surface_priv->motion_vector_temporal_bo);
7018 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
7019 for (i = 0; i < GEN9_MAX_REF_SURFACES; i++) {
7020 obj_surface = encode_state->reference_objects[i];
7021 if (obj_surface && obj_surface->bo) {
7022 if (priv_ctx->reference_surfaces[i].obj_surface &&
7023 priv_ctx->reference_surfaces[i].obj_surface->bo)
7024 dri_bo_unreference(priv_ctx->reference_surfaces[i].obj_surface->bo);
7025 priv_ctx->reference_surfaces[i].obj_surface = obj_surface;
7026 priv_ctx->reference_surfaces[i].surface_id = pic_param->reference_frames[i].picture_id;
7027 dri_bo_reference(obj_surface->bo);
7029 surface_priv = (struct gen9_hevc_surface_priv *) obj_surface->private_data;
7031 if (priv_ctx->mv_temporal_buffer[i].bo)
7032 dri_bo_unreference(priv_ctx->mv_temporal_buffer[i].bo);
7033 priv_ctx->mv_temporal_buffer[i].bo = surface_priv->motion_vector_temporal_bo;
7034 dri_bo_reference(surface_priv->motion_vector_temporal_bo);
7042 obj_buffer = encode_state->coded_buf_object;
7043 bo = obj_buffer->buffer_store->bo;
7045 if (priv_ctx->indirect_pak_bse_object.bo)
7046 dri_bo_unreference(priv_ctx->indirect_pak_bse_object.bo);
7047 priv_ctx->indirect_pak_bse_object.offset = I965_CODEDBUFFER_HEADER_SIZE;
7048 priv_ctx->indirect_pak_bse_object.end_offset = ALIGN((obj_buffer->size_element - 0x1000), 0x1000);
7049 priv_ctx->indirect_pak_bse_object.bo = bo;
7050 dri_bo_reference(priv_ctx->indirect_pak_bse_object.bo);
7055 return VA_STATUS_ERROR_INVALID_VALUE;
7057 coded_buffer_segment = (struct i965_coded_buffer_segment *)bo->virtual;
7058 coded_buffer_segment->mapped = 0;
7059 coded_buffer_segment->codec = encoder_context->codec;
7060 coded_buffer_segment->status_support = 1;
7064 if (priv_ctx->res_pak_slice_batch_buffer)
7065 intel_batchbuffer_free(priv_ctx->res_pak_slice_batch_buffer);
7067 priv_ctx->res_pak_slice_batch_buffer =
7068 intel_batchbuffer_new(&i965->intel, I915_EXEC_BSD,
7069 GEN9_HEVC_ENC_PAK_SLICE_STATE_SIZE *
7070 encode_state->num_slice_params_ext);
7071 if (!priv_ctx->res_pak_slice_batch_buffer)
7072 return VA_STATUS_ERROR_ALLOCATION_FAILED;
7074 for (i = 0; i < I965_MAX_NUM_SLICE; i++) {
7075 priv_state->slice_batch_offset[i] = 0;
7076 priv_state->slice_start_lcu[i] = 0;
7079 return VA_STATUS_SUCCESS;
7083 gen9_hevc_pak_picture_level(VADriverContextP ctx,
7084 struct encode_state *encode_state,
7085 struct intel_encoder_context *encoder_context)
7087 struct intel_batchbuffer *batch = encoder_context->base.batch;
7088 struct encoder_vme_mfc_context *pak_context = NULL;
7089 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7090 struct generic_enc_codec_state *generic_state = NULL;
7091 struct gen9_hevc_encoder_state *priv_state = NULL;
7092 struct gpe_mi_batch_buffer_start_parameter second_level_batch;
7093 struct hevc_encode_status_buffer *status_buffer = NULL;
7094 VAStatus va_status = VA_STATUS_SUCCESS;
7097 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
7098 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
7099 generic_state = (struct generic_enc_codec_state *)pak_context->generic_enc_state;
7100 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
7101 status_buffer = &priv_state->status_buffer;
7103 if (generic_state->brc_enabled &&
7104 generic_state->curr_pak_pass) {
7105 gen9_hevc_conditional_end(ctx,
7106 batch, status_buffer->bo,
7107 status_buffer->status_image_mask_offset,
7110 gen9_hevc_load_reg_mem(ctx,
7111 batch, status_buffer->bo,
7112 status_buffer->status_image_ctrl_offset,
7113 status_buffer->mmio_image_ctrl_offset);
7115 gen9_hevc_store_reg_mem(ctx, batch, priv_ctx->res_brc_pak_statistic_buffer.bo,
7116 offsetof(GEN9_HEVC_PAK_STATES, HEVC_ENC_IMAGE_STATUS_CONTROL_FOR_LAST_PASS),
7117 status_buffer->mmio_image_ctrl_offset);
7119 gen9_hevc_store_reg_mem(ctx, batch, status_buffer->bo,
7120 status_buffer->status_image_ctrl_last_pass_offset,
7121 status_buffer->mmio_image_ctrl_offset);
7124 gen9_hevc_pak_pipe_mode_select(ctx, encode_state, encoder_context);
7125 gen9_hevc_pak_add_surface_state(ctx, encode_state, encoder_context,
7126 encode_state->input_yuv_object,
7127 GEN9_HEVC_ENC_SURFACE_SOURCE);
7128 gen9_hevc_pak_add_surface_state(ctx, encode_state, encoder_context,
7129 encode_state->reconstructed_object,
7130 GEN9_HEVC_ENC_SURFACE_RECON);
7131 gen9_hevc_pak_add_pipe_buf_addr_state(ctx, encode_state, encoder_context);
7132 gen9_hevc_pak_add_ind_obj_base_addr_state(ctx, encode_state, encoder_context);
7133 gen9_hevc_pak_add_qm_state(ctx, encode_state, encoder_context);
7134 gen9_hevc_pak_add_fm_state(ctx, encode_state, encoder_context);
7136 if (generic_state->brc_enabled) {
7137 memset(&second_level_batch, 0, sizeof(second_level_batch));
7139 second_level_batch.offset = generic_state->curr_pak_pass * priv_state->pic_state_size;
7140 second_level_batch.bo = priv_ctx->res_brc_pic_states_write_buffer.bo;
7141 second_level_batch.is_second_level = 1;
7142 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
7144 gen9_hevc_add_pic_state(ctx, encode_state, encoder_context, NULL, 0, 0);
7146 for (i = 0; i < encode_state->num_slice_params_ext; i++) {
7147 va_status = gen9_hevc_pak_slice_level(ctx, encode_state, encoder_context, i);
7148 if (va_status != VA_STATUS_SUCCESS)
7157 gen9_hevc_pak_read_status(VADriverContextP ctx,
7158 struct intel_encoder_context *encoder_context)
7160 struct intel_batchbuffer *batch = encoder_context->base.batch;
7161 struct encoder_vme_mfc_context *pak_context = NULL;
7162 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7163 struct generic_enc_codec_state *generic_state = NULL;
7164 struct gen9_hevc_encoder_state *priv_state = NULL;
7165 struct gpe_mi_flush_dw_parameter mi_flush_dw_param;
7166 struct hevc_encode_status_buffer *status_buffer = NULL;
7168 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
7169 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
7170 generic_state = (struct generic_enc_codec_state *)pak_context->generic_enc_state;
7171 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
7173 status_buffer = &priv_state->status_buffer;
7175 memset(&mi_flush_dw_param, 0, sizeof(mi_flush_dw_param));
7176 gen8_gpe_mi_flush_dw(ctx, batch, &mi_flush_dw_param);
7178 gen9_hevc_store_reg_mem(ctx, batch, status_buffer->bo,
7179 status_buffer->status_bs_byte_count_offset,
7180 status_buffer->mmio_bs_frame_offset);
7182 gen9_hevc_store_reg_mem(ctx, batch, status_buffer->bo,
7183 status_buffer->status_image_mask_offset,
7184 status_buffer->mmio_image_mask_offset);
7186 gen9_hevc_store_reg_mem(ctx, batch, status_buffer->bo,
7187 status_buffer->status_image_ctrl_offset,
7188 status_buffer->mmio_image_ctrl_offset);
7190 if (generic_state->brc_enabled) {
7191 gen9_hevc_store_reg_mem(ctx, batch, priv_ctx->res_brc_pak_statistic_buffer.bo,
7192 offsetof(GEN9_HEVC_PAK_STATES, HEVC_ENC_BYTECOUNT_FRAME),
7193 status_buffer->mmio_bs_frame_offset);
7194 gen9_hevc_store_reg_mem(ctx, batch, priv_ctx->res_brc_pak_statistic_buffer.bo,
7195 offsetof(GEN9_HEVC_PAK_STATES, HEVC_ENC_BYTECOUNT_FRAME_NOHEADER),
7196 status_buffer->mmio_bs_frame_no_header_offset);
7197 gen9_hevc_store_reg_mem(ctx, batch, priv_ctx->res_brc_pak_statistic_buffer.bo,
7198 offsetof(GEN9_HEVC_PAK_STATES, HEVC_ENC_IMAGE_STATUS_CONTROL),
7199 status_buffer->mmio_image_ctrl_offset);
7202 gen8_gpe_mi_flush_dw(ctx, batch, &mi_flush_dw_param);
7206 gen9_hevc_pak_pipeline(VADriverContextP ctx,
7208 struct encode_state *encode_state,
7209 struct intel_encoder_context *encoder_context)
7211 struct i965_driver_data *i965 = i965_driver_data(ctx);
7212 struct intel_batchbuffer *batch = encoder_context->base.batch;
7213 struct encoder_vme_mfc_context *pak_context = encoder_context->vme_context;
7214 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7215 struct generic_enc_codec_state *generic_state = NULL;
7216 struct gen9_hevc_encoder_state *priv_state = NULL;
7217 VAStatus va_status = VA_STATUS_SUCCESS;
7219 if (!pak_context || !pak_context->generic_enc_state || !batch) {
7220 va_status = VA_STATUS_ERROR_INVALID_CONTEXT;
7224 va_status = gen9_hevc_pak_pipeline_prepare(ctx, encode_state, encoder_context);
7225 if (va_status != VA_STATUS_SUCCESS)
7228 if (i965->intel.has_bsd2)
7229 intel_batchbuffer_start_atomic_bcs_override(batch, 0x1000, BSD_RING0);
7231 intel_batchbuffer_start_atomic_bcs(batch, 0x1000);
7233 intel_batchbuffer_emit_mi_flush(batch);
7235 generic_state = (struct generic_enc_codec_state *)pak_context->generic_enc_state;
7236 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
7237 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
7239 for (generic_state->curr_pak_pass = 0;
7240 generic_state->curr_pak_pass < generic_state->num_pak_passes;
7241 generic_state->curr_pak_pass++) {
7242 va_status = gen9_hevc_pak_picture_level(ctx, encode_state, encoder_context);
7243 if (va_status != VA_STATUS_SUCCESS)
7246 gen9_hevc_pak_read_status(ctx, encoder_context);
7249 if (priv_ctx->res_pak_slice_batch_buffer) {
7250 intel_batchbuffer_free(priv_ctx->res_pak_slice_batch_buffer);
7252 priv_ctx->res_pak_slice_batch_buffer = NULL;
7255 intel_batchbuffer_end_atomic(batch);
7257 intel_batchbuffer_flush(batch);
7259 priv_state->frame_number++;
7266 gen9_hevc_pak_context_destroy(void *context)
7268 struct encoder_vme_mfc_context *pak_context = (struct encoder_vme_mfc_context *)context;
7269 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7272 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
7274 if (priv_ctx->res_pak_slice_batch_buffer) {
7275 intel_batchbuffer_free(priv_ctx->res_pak_slice_batch_buffer);
7276 priv_ctx->res_pak_slice_batch_buffer = NULL;
7279 dri_bo_unreference(priv_ctx->indirect_pak_bse_object.bo);
7280 priv_ctx->indirect_pak_bse_object.bo = NULL;
7282 if (priv_ctx->uncompressed_picture_source.obj_surface &&
7283 priv_ctx->uncompressed_picture_source.obj_surface->bo)
7284 i965_destroy_surface_storage(priv_ctx->uncompressed_picture_source.obj_surface);
7286 if (priv_ctx->reconstructed_object.obj_surface &&
7287 priv_ctx->reconstructed_object.obj_surface->bo)
7288 i965_destroy_surface_storage(priv_ctx->reconstructed_object.obj_surface);
7290 for (i = 0; i < GEN9_MAX_REF_SURFACES; i++)
7291 if (priv_ctx->reference_surfaces[i].obj_surface &&
7292 priv_ctx->reference_surfaces[i].obj_surface->bo)
7293 i965_destroy_surface_storage(priv_ctx->reference_surfaces[i].obj_surface);
7296 #define STATUS_IMPLEMENTATION_START
7299 gen9_hevc_status_buffer_init(struct hevc_encode_status_buffer *status_buffer)
7301 uint32_t base_offset = offsetof(struct i965_coded_buffer_segment, codec_private_data);
7303 status_buffer->mmio_bs_frame_offset = MMIO_HCP_ENC_BITSTREAM_BYTECOUNT_FRAME_OFFSET;
7304 status_buffer->mmio_bs_frame_no_header_offset = MMIO_HCP_ENC_BITSTREAM_BYTECOUNT_FRAME_NO_HEADER_OFFSET;
7305 status_buffer->mmio_image_mask_offset = MMIO_HCP_ENC_IMAGE_STATUS_MASK_OFFSET;
7306 status_buffer->mmio_image_ctrl_offset = MMIO_HCP_ENC_IMAGE_STATUS_CTRL_OFFSET;
7308 status_buffer->status_image_mask_offset = base_offset +
7309 offsetof(struct hevc_encode_status, image_status_mask);
7310 status_buffer->status_image_ctrl_offset = base_offset +
7311 offsetof(struct hevc_encode_status, image_status_ctrl);
7312 status_buffer->status_image_ctrl_last_pass_offset = base_offset +
7313 offsetof(struct hevc_encode_status, image_status_ctrl_last_pass);
7314 status_buffer->status_bs_byte_count_offset = base_offset +
7315 offsetof(struct hevc_encode_status, bs_byte_count);
7316 status_buffer->status_media_state_offset = base_offset +
7317 offsetof(struct hevc_encode_status, media_state);
7318 status_buffer->status_pass_num_offset = base_offset +
7319 offsetof(struct hevc_encode_status, pass_num);
7323 gen9_hevc_get_coded_status(VADriverContextP ctx,
7324 struct intel_encoder_context *encoder_context,
7325 struct i965_coded_buffer_segment *coded_buf_seg)
7327 struct hevc_encode_status *encode_status;
7328 struct hevc_enc_image_status_ctrl *image_status_ctrl, *image_status_ctrl_last_pass;
7330 if (!encoder_context || !coded_buf_seg)
7331 return VA_STATUS_ERROR_INVALID_BUFFER;
7333 encode_status = (struct hevc_encode_status *)coded_buf_seg->codec_private_data;
7335 coded_buf_seg->base.size = encode_status->bs_byte_count;
7337 image_status_ctrl = (struct hevc_enc_image_status_ctrl *)&encode_status->image_status_ctrl;
7338 image_status_ctrl_last_pass = (struct hevc_enc_image_status_ctrl *)&encode_status->image_status_ctrl_last_pass;
7340 if (image_status_ctrl->total_pass && image_status_ctrl->cumulative_frame_delta_qp == 0)
7341 image_status_ctrl->cumulative_frame_delta_qp = image_status_ctrl_last_pass->cumulative_frame_delta_qp;
7343 image_status_ctrl_last_pass->cumulative_frame_delta_qp = 0;
7345 return VA_STATUS_SUCCESS;
7348 // External initial APIs
7351 gen9_hevc_vme_context_init(VADriverContextP ctx,
7352 struct intel_encoder_context *encoder_context)
7354 struct i965_driver_data *i965 = i965_driver_data(ctx);
7355 struct encoder_vme_mfc_context *vme_context = NULL;
7356 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7357 struct generic_enc_codec_state *generic_state = NULL;
7358 struct gen9_hevc_encoder_state *priv_state = NULL;
7360 hevc_enc_kernel_ptr = (void *)gen9_hevc_encoder_kernels;
7361 hevc_enc_kernel_size = sizeof(gen9_hevc_encoder_kernels);
7363 vme_context = calloc(1, sizeof(*vme_context));
7364 priv_ctx = calloc(1, sizeof(*priv_ctx));
7365 generic_state = calloc(1, sizeof(*generic_state));
7366 priv_state = calloc(1, sizeof(*priv_state));
7368 if (!vme_context || !generic_state ||
7369 !priv_ctx || !priv_state) {
7370 if (vme_context) free(vme_context);
7371 if (generic_state) free(generic_state);
7372 if (priv_ctx) free(priv_ctx);
7373 if (priv_state) free(priv_state);
7378 encoder_context->vme_context = (void *)vme_context;
7379 vme_context->private_enc_ctx = (void *)priv_ctx;
7380 vme_context->generic_enc_state = (void *)generic_state;
7381 vme_context->private_enc_state = (void *)priv_state;
7383 priv_ctx->ctx = ctx;
7384 priv_ctx->mocs = i965->intel.mocs_state;
7386 generic_state->num_pak_passes = 1;
7387 generic_state->brc_enabled = 0;
7389 priv_state->tu_mode = HEVC_TU_RT_SPEED;
7390 priv_state->use_hw_scoreboard = 1;
7391 priv_state->use_hw_non_stalling_scoreborad = 1;
7392 priv_state->rolling_intra_refresh = 0;
7393 priv_state->flatness_check_supported = 0;
7394 priv_state->walking_pattern_26 = 0;
7395 priv_state->num_regions_in_slice = 4;
7396 priv_state->frames_per_100s = 30000;
7397 priv_state->user_max_frame_size = 0;
7398 priv_state->brc_method = HEVC_BRC_CQP;
7399 priv_state->lcu_brc_enabled = 0;
7400 priv_state->parallel_brc = 0;
7401 priv_state->pak_obj_size = ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ?
7402 GEN95_HEVC_ENC_PAK_OBJ_SIZE :
7403 GEN9_HEVC_ENC_PAK_OBJ_SIZE) *
7405 priv_state->cu_record_size = GEN9_HEVC_ENC_PAK_CU_RECORD_SIZE * 4;
7406 priv_state->pic_state_size = GEN9_HEVC_ENC_BRC_PIC_STATE_SIZE;
7408 gen9_hevc_status_buffer_init(&priv_state->status_buffer);
7409 gen9_hevc_vme_kernels_context_init(ctx, encoder_context);
7410 gen9_hevc_lambda_tables_init(priv_ctx);
7412 encoder_context->vme_pipeline = gen9_hevc_vme_pipeline;
7413 encoder_context->vme_context_destroy = gen9_hevc_vme_context_destroy;
7418 gen9_hevc_pak_context_init(VADriverContextP ctx,
7419 struct intel_encoder_context *encoder_context)
7421 struct encoder_vme_mfc_context *pak_context = encoder_context->vme_context;
7426 encoder_context->mfc_context = pak_context;
7427 encoder_context->mfc_context_destroy = gen9_hevc_pak_context_destroy;
7428 encoder_context->mfc_pipeline = gen9_hevc_pak_pipeline;
7429 encoder_context->mfc_brc_prepare = gen9_hevc_brc_prepare;
7430 encoder_context->get_status = gen9_hevc_get_coded_status;