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;
417 i965_free_gpe_resource(&priv_ctx->res_brc_pic_states_write_buffer);
418 i965_free_gpe_resource(&priv_ctx->res_brc_history_buffer);
419 i965_free_gpe_resource(&priv_ctx->res_brc_intra_dist_buffer);
420 i965_free_gpe_resource(&priv_ctx->res_brc_pak_statistic_buffer);
421 i965_free_gpe_resource(&priv_ctx->res_brc_input_buffer_for_enc_kernels);
422 i965_free_gpe_resource(&priv_ctx->res_brc_constant_data_buffer);
424 i965_free_gpe_resource(&priv_ctx->res_mb_code_surface);
427 i965_free_gpe_resource(&priv_ctx->res_flatness_check_surface);
428 i965_free_gpe_resource(&priv_ctx->res_brc_me_dist_buffer);
429 i965_free_gpe_resource(&priv_ctx->s4x_memv_distortion_buffer);
430 i965_free_gpe_resource(&priv_ctx->s4x_memv_data_buffer);
431 i965_free_gpe_resource(&priv_ctx->s16x_memv_data_buffer);
432 i965_free_gpe_resource(&priv_ctx->s32x_memv_data_buffer);
433 i965_free_gpe_resource(&priv_ctx->res_32x32_pu_output_buffer);
434 i965_free_gpe_resource(&priv_ctx->res_simplest_intra_buffer);
435 i965_free_gpe_resource(&priv_ctx->res_kernel_debug);
436 i965_free_gpe_resource(&priv_ctx->res_sad_16x16_pu_buffer);
437 i965_free_gpe_resource(&priv_ctx->res_vme_8x8_mode_buffer);
438 i965_free_gpe_resource(&priv_ctx->res_intra_mode_buffer);
439 i965_free_gpe_resource(&priv_ctx->res_intra_distortion_buffer);
440 i965_free_gpe_resource(&priv_ctx->res_vme_uni_sic_buffer);
441 i965_free_gpe_resource(&priv_ctx->res_con_corrent_thread_buffer);
442 i965_free_gpe_resource(&priv_ctx->res_mv_index_buffer);
443 i965_free_gpe_resource(&priv_ctx->res_mvp_index_buffer);
444 i965_free_gpe_resource(&priv_ctx->res_roi_buffer);
445 i965_free_gpe_resource(&priv_ctx->res_mb_statistics_buffer);
447 if (priv_ctx->scaled_2x_surface_obj) {
448 i965_DestroySurfaces(priv_ctx->ctx, &priv_ctx->scaled_2x_surface_id, 1);
449 priv_ctx->scaled_2x_surface_obj = NULL;
453 i965_free_gpe_resource(&priv_ctx->deblocking_filter_line_buffer);
454 i965_free_gpe_resource(&priv_ctx->deblocking_filter_tile_line_buffer);
455 i965_free_gpe_resource(&priv_ctx->deblocking_filter_tile_column_buffer);
456 i965_free_gpe_resource(&priv_ctx->metadata_line_buffer);
457 i965_free_gpe_resource(&priv_ctx->metadata_tile_line_buffer);
458 i965_free_gpe_resource(&priv_ctx->metadata_tile_column_buffer);
459 i965_free_gpe_resource(&priv_ctx->sao_line_buffer);
460 i965_free_gpe_resource(&priv_ctx->sao_tile_line_buffer);
461 i965_free_gpe_resource(&priv_ctx->sao_tile_column_buffer);
463 priv_ctx->res_inited = 0;
466 #define ALLOC_GPE_RESOURCE(RES, NAME, SIZE) \
468 i965_free_gpe_resource(&priv_ctx->RES); \
469 if (!i965_allocate_gpe_resource(i965->intel.bufmgr, \
476 #define ALLOC_GPE_2D_RESOURCE(RES, NAME, W, H, P) \
478 i965_free_gpe_resource(&priv_ctx->RES); \
479 if (!i965_gpe_allocate_2d_resource(i965->intel.bufmgr, \
488 gen9_hevc_enc_alloc_resources(VADriverContextP ctx,
489 struct encode_state *encode_state,
490 struct intel_encoder_context *encoder_context)
492 struct i965_driver_data *i965 = i965_driver_data(ctx);
493 struct encoder_vme_mfc_context *vme_context = NULL;
494 struct gen9_hevc_encoder_context *priv_ctx = NULL;
495 struct generic_enc_codec_state *generic_state = NULL;
496 struct gen9_hevc_encoder_state *priv_state = NULL;
497 int res_size = 0, size_shift = 0;
498 int width = 0, height = 0;
500 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
501 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
502 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
503 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
505 if (priv_ctx->res_inited)
506 return VA_STATUS_SUCCESS;
508 res_size = priv_state->mb_code_size;
509 ALLOC_GPE_RESOURCE(res_mb_code_surface,
510 "Mb code surface", res_size);
512 res_size = priv_state->pic_state_size * generic_state->num_pak_passes;
513 ALLOC_GPE_RESOURCE(res_brc_pic_states_write_buffer,
514 "Brc pic status write buffer",
517 res_size = priv_state->pic_state_size * generic_state->num_pak_passes;
518 ALLOC_GPE_RESOURCE(res_brc_pic_states_read_buffer,
519 "Brc pic status read buffer",
522 res_size = GEN9_HEVC_ENC_BRC_HISTORY_BUFFER_SIZE;
523 ALLOC_GPE_RESOURCE(res_brc_history_buffer,
524 "Brc history buffer",
527 res_size = GEN9_HEVC_ENC_BRC_PAK_STATISTCS_SIZE;
528 ALLOC_GPE_RESOURCE(res_brc_pak_statistic_buffer,
529 "Brc pak statistic buffer",
533 ALLOC_GPE_RESOURCE(res_brc_input_buffer_for_enc_kernels,
534 "Brc input buffer for enc kernels buffer",
537 width = ALIGN(priv_state->downscaled_width_4x_in_mb * 8, 64);
538 height = ALIGN(priv_state->downscaled_height_4x_in_mb * 4, 8) * 2;
539 ALLOC_GPE_2D_RESOURCE(res_brc_intra_dist_buffer,
540 "Brc intra distortion buffer",
541 width, height, width);
543 width = ALIGN(GEN9_HEVC_ENC_BRC_CONSTANT_SURFACE_WIDTH, 64);
544 height = GEN9_HEVC_ENC_BRC_CONSTANT_SURFACE_HEIGHT;
545 ALLOC_GPE_2D_RESOURCE(res_brc_constant_data_buffer,
546 "Brc constant data buffer",
547 width, height, width);
549 width = ALIGN((priv_state->frame_width_4x * 4 + 31) >> 4, 64);
550 height = ALIGN((priv_state->frame_height_4x * 4 + 31) >> 5, 4);
551 ALLOC_GPE_2D_RESOURCE(res_brc_mb_qp_buffer,
553 width, height, width);
555 //HME scaling buffer allocation
556 width = ALIGN(priv_state->downscaled_width_4x_in_mb * 8, 64);
557 height = ALIGN(priv_state->downscaled_height_4x_in_mb * 4, 8);
558 ALLOC_GPE_2D_RESOURCE(res_brc_me_dist_buffer,
559 "Brc me distortion buffer",
560 width, height, width);
562 if (generic_state->hme_supported) {
563 width = ALIGN(priv_state->downscaled_width_4x_in_mb * 8, 64);
564 height = ALIGN(priv_state->downscaled_height_4x_in_mb * 4 * 10, 8) * 2;
565 ALLOC_GPE_2D_RESOURCE(s4x_memv_distortion_buffer,
566 "4x MEMV distortion buffer",
567 width, height, width);
569 width = ALIGN(priv_state->downscaled_width_4x_in_mb * 32, 64);
570 height = priv_state->downscaled_height_4x_in_mb * 4 * 10;
571 ALLOC_GPE_2D_RESOURCE(s4x_memv_data_buffer,
572 "4x MEMV data buffer",
573 width, height, width);
575 if (generic_state->b16xme_supported) {
576 width = ALIGN(priv_state->downscaled_width_16x_in_mb * 32, 64);
577 height = priv_state->downscaled_height_16x_in_mb * 2 * 4 * 10;
578 ALLOC_GPE_2D_RESOURCE(s16x_memv_data_buffer,
579 "16x MEMV data buffer",
580 width, height, width);
582 if (generic_state->b32xme_supported) {
583 width = ALIGN(priv_state->downscaled_width_32x_in_mb * 32, 64);
584 height = priv_state->downscaled_height_32x_in_mb * 2 * 4 * 10;
585 ALLOC_GPE_2D_RESOURCE(s32x_memv_data_buffer,
586 "32x MEMV data buffer",
587 width, height, width);
592 if (priv_state->flatness_check_supported) {
593 width = ALIGN(priv_state->width_in_mb * 4, 64);
594 height = priv_state->downscaled_height_4x_in_mb * 4;
595 ALLOC_GPE_2D_RESOURCE(res_flatness_check_surface,
596 "Flatness check buffer",
597 width, height, width);
600 if (priv_ctx->scaled_2x_surface_obj)
601 i965_DestroySurfaces(priv_ctx->ctx, &priv_ctx->scaled_2x_surface_id, 1);
603 width = priv_state->frame_width_in_max_lcu >> 1;
604 height = priv_state->frame_height_in_max_lcu >> 1;
605 if (priv_state->bit_depth_luma_minus8) {
606 width = ALIGN(width, 32);
607 height = ALIGN(height, 32);
610 i965_CreateSurfaces(ctx,
615 &priv_ctx->scaled_2x_surface_id);
616 priv_ctx->scaled_2x_surface_obj =
617 SURFACE(priv_ctx->scaled_2x_surface_id);
619 if (!priv_ctx->scaled_2x_surface_obj)
622 i965_check_alloc_surface_bo(ctx, priv_ctx->scaled_2x_surface_obj, 1,
623 VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
625 res_size = (priv_state->frame_width_in_max_lcu >> 5) *
626 (priv_state->frame_height_in_max_lcu >> 5) *
628 ALLOC_GPE_RESOURCE(res_32x32_pu_output_buffer,
629 "32x32 pu output buffer",
632 width = priv_state->frame_width_in_max_lcu >> 3;
633 height = priv_state->frame_height_in_max_lcu >> 5;
634 ALLOC_GPE_2D_RESOURCE(res_slice_map_buffer,
636 width, height, width);
638 res_size = 8192 * 1024;
639 ALLOC_GPE_RESOURCE(res_kernel_debug,
643 width = priv_state->frame_width_in_max_lcu >> 3;
644 height = priv_state->frame_height_in_max_lcu >> 5;
645 ALLOC_GPE_2D_RESOURCE(res_simplest_intra_buffer,
646 "Simplest intra buffer",
647 width, height, width);
649 res_size = (priv_state->frame_width_in_max_lcu >> 4) *
650 (priv_state->frame_height_in_max_lcu >> 4) * 8 * 4;
651 ALLOC_GPE_RESOURCE(res_sad_16x16_pu_buffer,
655 res_size = (priv_state->frame_width_in_max_lcu >> 4) *
656 (priv_state->frame_height_in_max_lcu >> 4) * 32;
657 ALLOC_GPE_RESOURCE(res_vme_8x8_mode_buffer,
661 res_size = (priv_state->frame_width_in_max_lcu >> 3) *
662 (priv_state->frame_height_in_max_lcu >> 3) * 32;
663 ALLOC_GPE_RESOURCE(res_intra_mode_buffer,
667 res_size = (priv_state->frame_width_in_max_lcu >> 4) *
668 (priv_state->frame_height_in_max_lcu >> 4) * 16;
669 ALLOC_GPE_RESOURCE(res_intra_distortion_buffer,
673 width = priv_state->frame_width_in_max_lcu >> 1;
674 height = priv_state->frame_height_in_max_lcu >> 4;
675 ALLOC_GPE_2D_RESOURCE(res_min_distortion_buffer,
676 "Min distortion buffer",
677 width, height, width);
679 res_size = priv_state->frame_width_in_max_lcu *
680 priv_state->frame_height_in_max_lcu;
681 ALLOC_GPE_RESOURCE(res_vme_uni_sic_buffer,
682 "Vme uni sic buffer",
685 width = sizeof(gen9_hevc_mbenc_control_region);
686 height = GEN9_HEVC_ENC_CONCURRENT_SURFACE_HEIGHT;
687 ALLOC_GPE_2D_RESOURCE(res_con_corrent_thread_buffer,
688 "Con corrent thread buffer",
689 width, height, width);
691 res_size = priv_state->frame_width_in_max_lcu *
692 priv_state->frame_height_in_max_lcu / 4;
693 ALLOC_GPE_RESOURCE(res_mv_index_buffer,
697 res_size = priv_state->frame_width_in_max_lcu *
698 priv_state->frame_height_in_max_lcu / 2;
699 ALLOC_GPE_RESOURCE(res_mvp_index_buffer,
703 width = ALIGN(priv_state->width_in_mb * 4, 64);
704 height = ALIGN(priv_state->height_in_mb, 8);
705 ALLOC_GPE_2D_RESOURCE(res_roi_buffer,
707 width, height, width);
709 res_size = priv_state->width_in_mb *
710 priv_state->height_in_mb * 52;
711 ALLOC_GPE_RESOURCE(res_mb_statistics_buffer,
712 "MB statistics buffer",
715 // PAK pipe buffer allocation
716 size_shift = (priv_state->bit_depth_luma_minus8 ||
717 priv_state->bit_depth_chroma_minus8) ? 2 : 3;
719 res_size = ALIGN(priv_state->picture_width, 32) >> size_shift;
720 ALLOC_GPE_RESOURCE(deblocking_filter_line_buffer,
721 "Deblocking filter line buffer",
723 ALLOC_GPE_RESOURCE(deblocking_filter_tile_line_buffer,
724 "Deblocking filter tile line buffer",
727 res_size = ALIGN(priv_state->picture_height +
728 priv_state->height_in_lcu * 6, 32) >> size_shift;
729 ALLOC_GPE_RESOURCE(deblocking_filter_tile_column_buffer,
730 "Deblocking filter tile column buffer",
733 res_size = (((priv_state->picture_width + 15) >> 4) * 188 +
734 priv_state->width_in_lcu * 9 + 1023) >> 9;
735 ALLOC_GPE_RESOURCE(metadata_line_buffer,
736 "metadata line buffer",
739 res_size = (((priv_state->picture_width + 15) >> 4) * 172 +
740 priv_state->width_in_lcu * 9 + 1023) >> 9;
741 ALLOC_GPE_RESOURCE(metadata_tile_line_buffer,
742 "metadata tile line buffer",
745 res_size = (((priv_state->picture_height + 15) >> 4) * 176 +
746 priv_state->height_in_lcu * 89 + 1023) >> 9;
747 ALLOC_GPE_RESOURCE(metadata_tile_column_buffer,
748 "metadata tile column buffer",
751 res_size = ALIGN(((priv_state->picture_width >> 1) +
752 priv_state->width_in_lcu * 3), 16) >> size_shift;
753 ALLOC_GPE_RESOURCE(sao_line_buffer,
757 res_size = ALIGN(((priv_state->picture_width >> 1) +
758 priv_state->width_in_lcu * 6), 16) >> size_shift;
759 ALLOC_GPE_RESOURCE(sao_tile_line_buffer,
760 "sao tile line buffer",
763 res_size = ALIGN(((priv_state->picture_height >> 1) +
764 priv_state->height_in_lcu * 6), 16) >> size_shift;
765 ALLOC_GPE_RESOURCE(sao_tile_column_buffer,
766 "sao tile column buffer",
769 priv_ctx->res_inited = 1;
770 return VA_STATUS_SUCCESS;
773 gen9_hevc_enc_free_resources(vme_context);
774 return VA_STATUS_ERROR_ALLOCATION_FAILED;
777 #define VME_IMPLEMENTATION_START
780 gen9_hevc_set_gpe_1d_surface(VADriverContextP ctx,
781 struct gen9_hevc_encoder_context *priv_ctx,
782 struct i965_gpe_context *gpe_context,
783 enum GEN9_HEVC_ENC_SURFACE_TYPE surface_type,
788 struct i965_gpe_resource *gpe_buffer,
791 if (!gpe_buffer && !bo) {
792 gpe_buffer = priv_ctx->gpe_surfaces[surface_type].gpe_resource;
793 bo = priv_ctx->gpe_surfaces[surface_type].bo;
797 gen9_add_buffer_gpe_surface(ctx, gpe_context,
798 gpe_buffer, is_raw_buffer,
799 size == 0 ? gpe_buffer->size - offset : size,
802 gen9_add_dri_buffer_gpe_surface(ctx, gpe_context,
804 size == 0 ? bo->size - offset : size,
809 gen9_hevc_set_gpe_2d_surface(VADriverContextP ctx,
810 struct gen9_hevc_encoder_context *priv_ctx,
811 struct i965_gpe_context *gpe_context,
812 enum GEN9_HEVC_ENC_SURFACE_TYPE surface_type,
815 int is_media_block_rw,
817 struct i965_gpe_resource *gpe_buffer,
818 struct object_surface *surface_object)
820 if (!gpe_buffer && !surface_object) {
821 gpe_buffer = priv_ctx->gpe_surfaces[surface_type].gpe_resource;
822 surface_object = priv_ctx->gpe_surfaces[surface_type].surface_object;
826 gen9_add_buffer_2d_gpe_surface(ctx,
832 } else if (surface_object) {
833 gen9_add_2d_gpe_surface(ctx, gpe_context,
835 0, is_media_block_rw, format,
839 gen9_add_2d_gpe_surface(ctx, gpe_context,
841 1, is_media_block_rw, format,
847 gen9_hevc_set_gpe_adv_surface(VADriverContextP ctx,
848 struct gen9_hevc_encoder_context *priv_ctx,
849 struct i965_gpe_context *gpe_context,
850 enum GEN9_HEVC_ENC_SURFACE_TYPE surface_type,
852 struct object_surface *surface_object)
855 surface_object = priv_ctx->gpe_surfaces[surface_type].surface_object;
858 gen9_add_adv_gpe_surface(ctx, gpe_context,
859 surface_object, bti_idx);
863 gen9_hevc_add_gpe_surface(struct gen9_hevc_encoder_context *priv_ctx,
864 enum GEN9_HEVC_ENC_SURFACE_TYPE surface_type,
865 struct i965_gpe_resource *gpe_buffer,
866 struct object_surface *surface_object)
868 if (gpe_buffer && gpe_buffer->bo)
869 priv_ctx->gpe_surfaces[surface_type].gpe_resource = gpe_buffer;
870 else if (surface_object)
871 priv_ctx->gpe_surfaces[surface_type].surface_object = surface_object;
875 gen9_hevc_init_gpe_surfaces_table(VADriverContextP ctx,
876 struct encode_state *encode_state,
877 struct intel_encoder_context *encoder_context)
879 struct encoder_vme_mfc_context *vme_context = NULL;
880 struct gen9_hevc_encoder_context *priv_ctx = NULL;
882 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
883 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
885 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_Y, NULL,
886 encode_state->input_yuv_object);
887 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_Y_UV, NULL,
888 encode_state->input_yuv_object);
889 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_VME, NULL,
890 encode_state->input_yuv_object);
892 if (priv_ctx->scaled_2x_surface_obj) {
893 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_Y_2X, NULL,
894 priv_ctx->scaled_2x_surface_obj);
895 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_Y_2X_VME, NULL,
896 priv_ctx->scaled_2x_surface_obj);
899 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_BRC_HISTORY,
900 &priv_ctx->res_brc_history_buffer,
902 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_BRC_PAST_PAK_INFO,
903 &priv_ctx->res_brc_pak_statistic_buffer,
905 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_HCP_PAK,
906 &priv_ctx->res_mb_code_surface,
908 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_CU_RECORD,
909 &priv_ctx->res_mb_code_surface,
911 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_32x32_PU_OUTPUT,
912 &priv_ctx->res_32x32_pu_output_buffer,
914 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_SLICE_MAP,
915 &priv_ctx->res_slice_map_buffer,
917 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_BRC_INPUT,
918 &priv_ctx->res_brc_input_buffer_for_enc_kernels,
920 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_LCU_QP,
921 &priv_ctx->res_brc_mb_qp_buffer,
923 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_ROI,
924 &priv_ctx->res_roi_buffer,
926 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_RAW_MBSTAT,
927 &priv_ctx->res_mb_statistics_buffer,
929 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_BRC_DATA,
930 &priv_ctx->res_brc_constant_data_buffer,
932 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_KERNEL_DEBUG,
933 &priv_ctx->res_kernel_debug,
935 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_SIMPLIFIED_INTRA,
936 &priv_ctx->res_simplest_intra_buffer,
938 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_HME_MVP,
939 &priv_ctx->s4x_memv_data_buffer,
941 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_HME_DIST,
942 &priv_ctx->s4x_memv_distortion_buffer,
944 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_16x16PU_SAD,
945 &priv_ctx->res_sad_16x16_pu_buffer,
947 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_VME_8x8,
948 &priv_ctx->res_vme_8x8_mode_buffer,
950 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_INTRA_MODE,
951 &priv_ctx->res_intra_mode_buffer,
953 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_INTRA_DIST,
954 &priv_ctx->res_intra_distortion_buffer,
956 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_MIN_DIST,
957 &priv_ctx->res_min_distortion_buffer,
959 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_VME_UNI_SIC_DATA,
960 &priv_ctx->res_vme_uni_sic_buffer,
962 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_CONCURRENT_THREAD,
963 &priv_ctx->res_con_corrent_thread_buffer,
965 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_MB_MV_INDEX,
966 &priv_ctx->res_mv_index_buffer,
968 gen9_hevc_add_gpe_surface(priv_ctx, HEVC_ENC_SURFACE_MVP_INDEX,
969 &priv_ctx->res_mvp_index_buffer,
974 gen9_hevc_enc_check_parameters(VADriverContextP ctx,
975 struct encode_state *encode_state,
976 struct intel_encoder_context *encoder_context)
978 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
979 VAEncPictureParameterBufferHEVC *pic_param = NULL;
980 VAEncSliceParameterBufferHEVC *slice_param = NULL;
983 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
984 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
986 for (i = 0; i < encode_state->num_slice_params_ext; i++) {
987 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[i]->buffer;
989 if (slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag &&
990 slice_param->slice_fields.bits.collocated_from_l0_flag &&
991 (pic_param->collocated_ref_pic_index == 0xff ||
992 pic_param->collocated_ref_pic_index > GEN9_MAX_REF_SURFACES))
993 slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag = 0;
996 i = 1 << (seq_param->log2_diff_max_min_luma_coding_block_size +
997 seq_param->log2_min_luma_coding_block_size_minus3 + 3);
998 if (i < GEN9_HEVC_ENC_MIN_LCU_SIZE ||
999 i > GEN9_HEVC_ENC_MAX_LCU_SIZE)
1000 return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1002 //The TU max size in SPS must be the same as the CU max size in SPS
1003 i = seq_param->log2_min_transform_block_size_minus2 +
1004 seq_param->log2_diff_max_min_transform_block_size + 2;
1005 j = seq_param->log2_min_luma_coding_block_size_minus3 +
1006 seq_param->log2_diff_max_min_luma_coding_block_size + 3;
1009 return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1011 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
1012 i = pic_param->pic_init_qp + slice_param->slice_qp_delta;
1013 j = -seq_param->seq_fields.bits.bit_depth_luma_minus8 * 6;
1014 if (i < j || i > 51)
1015 return VA_STATUS_ERROR_INVALID_PARAMETER;
1017 return VA_STATUS_SUCCESS;
1021 gen9_hevc_enc_init_seq_parameters(struct gen9_hevc_encoder_context *priv_ctx,
1022 struct generic_enc_codec_state *generic_state,
1023 struct gen9_hevc_encoder_state *priv_state,
1024 VAEncSequenceParameterBufferHEVC *seq_param)
1026 int new = 0, m = 0, n = 0;
1028 if (priv_state->picture_width != seq_param->pic_width_in_luma_samples ||
1029 priv_state->picture_height != seq_param->pic_height_in_luma_samples ||
1030 priv_state->bit_depth_luma_minus8 != seq_param->seq_fields.bits.bit_depth_luma_minus8 ||
1031 priv_state->bit_depth_chroma_minus8 != seq_param->seq_fields.bits.bit_depth_chroma_minus8)
1037 priv_state->bit_depth_luma_minus8 = seq_param->seq_fields.bits.bit_depth_luma_minus8;
1038 priv_state->bit_depth_chroma_minus8 = seq_param->seq_fields.bits.bit_depth_chroma_minus8;
1039 priv_state->cu_size = 1 << (seq_param->log2_min_luma_coding_block_size_minus3 + 3);
1040 priv_state->lcu_size = 1 << (seq_param->log2_diff_max_min_luma_coding_block_size +
1041 seq_param->log2_min_luma_coding_block_size_minus3 + 3);
1042 priv_state->picture_width = (seq_param->pic_width_in_luma_samples / priv_state->cu_size) * priv_state->cu_size;
1043 priv_state->picture_height = (seq_param->pic_height_in_luma_samples / priv_state->cu_size) * priv_state->cu_size;
1044 priv_state->width_in_lcu = ALIGN(priv_state->picture_width, priv_state->lcu_size) / priv_state->lcu_size;
1045 priv_state->height_in_lcu = ALIGN(priv_state->picture_height, priv_state->lcu_size) / priv_state->lcu_size;
1046 priv_state->width_in_cu = ALIGN(priv_state->picture_width, priv_state->cu_size) / priv_state->cu_size;
1047 priv_state->height_in_cu = ALIGN(priv_state->picture_height, priv_state->cu_size) / priv_state->cu_size;
1048 priv_state->width_in_mb = ALIGN(priv_state->picture_width, 16) / 16;
1049 priv_state->height_in_mb = ALIGN(priv_state->picture_height, 16) / 16;
1051 m = (priv_state->picture_width + GEN9_HEVC_ENC_MIN_LCU_SIZE - 1) / GEN9_HEVC_ENC_MIN_LCU_SIZE;
1052 n = (priv_state->picture_height + GEN9_HEVC_ENC_MIN_LCU_SIZE - 1) / GEN9_HEVC_ENC_MIN_LCU_SIZE;
1053 priv_state->mb_data_offset = ALIGN(m * n * priv_state->pak_obj_size, 0x1000);
1055 m = ALIGN(priv_state->picture_width, GEN9_HEVC_ENC_MAX_LCU_SIZE) / 8;
1056 n = ALIGN(priv_state->picture_height, GEN9_HEVC_ENC_MAX_LCU_SIZE) / 8;
1057 priv_state->mb_code_size = priv_state->mb_data_offset +
1058 ALIGN(m * n * priv_state->cu_record_size, 0x1000);
1060 priv_state->frame_width_in_max_lcu = ALIGN(priv_state->picture_width, 32);
1061 priv_state->frame_height_in_max_lcu = ALIGN(priv_state->picture_height, 32);
1062 priv_state->frame_width_4x = ALIGN(priv_state->picture_width / 4, 16);
1063 priv_state->frame_height_4x = ALIGN(priv_state->picture_height / 4, 16);
1064 priv_state->frame_width_16x = ALIGN(priv_state->picture_width / 16, 16);
1065 priv_state->frame_height_16x = ALIGN(priv_state->picture_height / 16, 16);
1066 priv_state->frame_width_32x = ALIGN(priv_state->picture_width / 32, 16);
1067 priv_state->frame_height_32x = ALIGN(priv_state->picture_height / 32, 16);
1069 priv_state->downscaled_width_4x_in_mb = priv_state->frame_width_4x / 16;
1070 if (priv_state->bit_depth_luma_minus8) {
1071 priv_state->downscaled_width_4x_in_mb = ALIGN(priv_state->downscaled_width_4x_in_mb * 16, 32) /
1073 priv_state->frame_width_4x = priv_state->downscaled_width_4x_in_mb * 16;
1076 priv_state->downscaled_height_4x_in_mb = priv_state->frame_height_4x / 16;
1077 priv_state->downscaled_width_16x_in_mb = priv_state->frame_width_16x / 16;
1078 priv_state->downscaled_height_16x_in_mb = priv_state->frame_height_16x / 16;
1079 priv_state->downscaled_width_32x_in_mb = priv_state->frame_width_32x / 16;
1080 priv_state->downscaled_height_32x_in_mb = priv_state->frame_height_32x / 16;
1081 priv_state->flatness_check_enable = priv_state->flatness_check_supported;
1082 priv_state->widi_first_intra_refresh = 1;
1084 generic_state->hme_supported = GEN9_HEVC_HME_SUPPORTED;
1085 generic_state->b16xme_supported = GEN9_HEVC_16XME_SUPPORTED;
1086 generic_state->b32xme_supported = GEN9_HEVC_32XME_SUPPORTED;
1087 if (generic_state->hme_supported &&
1088 (priv_state->frame_width_4x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE ||
1089 priv_state->frame_height_4x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE)) {
1090 generic_state->b16xme_supported = 0;
1091 generic_state->b32xme_supported = 0;
1093 if (priv_state->frame_width_4x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1094 priv_state->frame_width_4x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1095 priv_state->downscaled_width_4x_in_mb = priv_state->frame_width_4x / 16;
1098 if (priv_state->frame_height_4x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1099 priv_state->frame_height_4x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1100 priv_state->downscaled_height_4x_in_mb = priv_state->frame_height_4x / 16;
1102 } else if (generic_state->b16xme_supported &&
1103 (priv_state->frame_width_16x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE ||
1104 priv_state->frame_height_16x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE)) {
1105 generic_state->b32xme_supported = 0;
1107 if (priv_state->frame_width_16x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1108 priv_state->frame_width_16x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1109 priv_state->downscaled_width_16x_in_mb = priv_state->frame_width_16x / 16;
1112 if (priv_state->frame_height_16x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1113 priv_state->frame_height_16x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1114 priv_state->downscaled_height_16x_in_mb = priv_state->frame_height_16x / 16;
1116 } else if (generic_state->b32xme_supported &&
1117 (priv_state->frame_width_32x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE ||
1118 priv_state->frame_height_32x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE)) {
1119 if (priv_state->frame_width_32x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1120 priv_state->frame_width_32x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1121 priv_state->downscaled_width_32x_in_mb = priv_state->frame_width_32x / 16;
1124 if (priv_state->frame_height_32x < GEN9_HEVC_VME_MIN_ALLOWED_SIZE) {
1125 priv_state->frame_height_32x = GEN9_HEVC_VME_MIN_ALLOWED_SIZE;
1126 priv_state->downscaled_height_32x_in_mb = priv_state->frame_height_32x / 16;
1130 priv_state->gop_ref_dist = seq_param->ip_period;
1131 priv_state->gop_size = seq_param->intra_period;
1132 priv_state->frame_number = 0;
1134 priv_ctx->res_inited = 0;
1138 gen9_hevc_enc_init_pic_parameters(struct generic_enc_codec_state *generic_state,
1139 struct gen9_hevc_encoder_state *priv_state,
1140 VAEncSequenceParameterBufferHEVC *seq_param,
1141 VAEncPictureParameterBufferHEVC *pic_param,
1142 VAEncSliceParameterBufferHEVC *slice_param)
1144 unsigned int log2_max_coding_block_size = 0, raw_ctu_bits = 0;
1146 priv_state->picture_coding_type = slice_param->slice_type;
1148 priv_state->ctu_max_bitsize_allowed = pic_param->ctu_max_bitsize_allowed;
1149 log2_max_coding_block_size = seq_param->log2_min_luma_coding_block_size_minus3 + 3 +
1150 seq_param->log2_diff_max_min_luma_coding_block_size;
1151 raw_ctu_bits = (1 << (2 * log2_max_coding_block_size + 3)) +
1152 (1 << (2 * log2_max_coding_block_size + 2));
1153 raw_ctu_bits = (5 * raw_ctu_bits / 3);
1155 if (priv_state->ctu_max_bitsize_allowed == 0 ||
1156 priv_state->ctu_max_bitsize_allowed > raw_ctu_bits)
1157 priv_state->ctu_max_bitsize_allowed = raw_ctu_bits;
1161 gen9_hevc_enc_init_slice_parameters(VADriverContextP ctx,
1162 struct encode_state *encode_state,
1163 struct intel_encoder_context *encoder_context)
1165 struct encoder_vme_mfc_context *vme_context = NULL;
1166 struct gen9_hevc_encoder_state *priv_state = NULL;
1167 VAEncPictureParameterBufferHEVC *pic_param = NULL;
1168 VAEncSliceParameterBufferHEVC *slice_param = NULL;
1171 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1172 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1173 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
1175 priv_state->low_delay = 1;
1176 priv_state->arbitrary_num_mb_in_slice = 0;
1178 for (i = 0; i < encode_state->num_slice_params_ext; i++) {
1179 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[i]->buffer;
1181 if (slice_param->slice_type == HEVC_SLICE_B && priv_state->low_delay) {
1182 for (j = 0; j <= slice_param->num_ref_idx_l0_active_minus1; j++) {
1183 if (pic_param->decoded_curr_pic.pic_order_cnt <
1184 slice_param->ref_pic_list0[j].pic_order_cnt)
1185 priv_state->low_delay = 0;
1188 for (j = 0; j <= slice_param->num_ref_idx_l1_active_minus1; j++) {
1189 if (pic_param->decoded_curr_pic.pic_order_cnt <
1190 slice_param->ref_pic_list1[j].pic_order_cnt)
1191 priv_state->low_delay = 0;
1195 if (!priv_state->arbitrary_num_mb_in_slice &&
1196 (slice_param->num_ctu_in_slice % priv_state->width_in_lcu))
1197 priv_state->arbitrary_num_mb_in_slice = 1;
1202 gen9_hevc_enc_init_parameters(VADriverContextP ctx,
1203 struct encode_state *encode_state,
1204 struct intel_encoder_context *encoder_context)
1206 struct i965_driver_data *i965 = i965_driver_data(ctx);
1207 struct encoder_vme_mfc_context *vme_context = NULL;
1208 struct generic_enc_codec_state *generic_state = NULL;
1209 struct gen9_hevc_encoder_context *priv_ctx = NULL;
1210 struct gen9_hevc_encoder_state *priv_state = NULL;
1211 VAEncPictureParameterBufferHEVC *pic_param = NULL;
1212 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
1213 VAEncSliceParameterBufferHEVC *slice_param = NULL;
1214 struct object_buffer *obj_buffer = NULL;
1215 VAStatus va_status = VA_STATUS_SUCCESS;
1217 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1218 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
1219 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
1220 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1221 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
1222 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
1223 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
1225 if (!pic_param || !seq_param || !slice_param)
1226 return VA_STATUS_ERROR_INVALID_PARAMETER;
1228 va_status = gen9_hevc_enc_check_parameters(ctx, encode_state, encoder_context);
1229 if (va_status |= VA_STATUS_SUCCESS)
1232 gen9_hevc_enc_init_seq_parameters(priv_ctx, generic_state, priv_state, seq_param);
1233 gen9_hevc_enc_init_pic_parameters(generic_state, priv_state, seq_param, pic_param, slice_param);
1234 gen9_hevc_enc_init_slice_parameters(ctx, encode_state, encoder_context);
1236 if (priv_state->picture_coding_type == HEVC_SLICE_I) {
1237 generic_state->hme_enabled = 0;
1238 generic_state->b16xme_enabled = 0;
1239 generic_state->b32xme_enabled = 0;
1241 generic_state->hme_enabled = generic_state->hme_supported;
1242 generic_state->b16xme_enabled = generic_state->b16xme_supported;
1243 generic_state->b32xme_enabled = generic_state->b32xme_supported;
1246 obj_buffer = BUFFER(pic_param->coded_buf);
1248 !obj_buffer->buffer_store ||
1249 !obj_buffer->buffer_store->bo) {
1250 va_status = VA_STATUS_ERROR_INVALID_PARAMETER;
1253 encode_state->coded_buf_object = obj_buffer;
1254 priv_state->status_buffer.bo = obj_buffer->buffer_store->bo;
1256 va_status = gen9_hevc_ensure_surface(ctx, priv_state,
1257 encode_state->input_yuv_object, 0);
1258 if (va_status != VA_STATUS_SUCCESS)
1261 va_status = gen9_hevc_ensure_surface(ctx, priv_state,
1262 encode_state->reconstructed_object, 1);
1263 if (va_status != VA_STATUS_SUCCESS)
1267 if (encode_state->input_yuv_object->orig_width > priv_state->picture_width)
1268 encode_state->input_yuv_object->orig_width = priv_state->picture_width;
1270 if (encode_state->input_yuv_object->orig_height > priv_state->picture_height)
1271 encode_state->input_yuv_object->orig_height = priv_state->picture_height;
1274 if (encode_state->reconstructed_object->orig_width > priv_state->picture_width)
1275 encode_state->reconstructed_object->orig_width = priv_state->picture_width;
1277 if (encode_state->reconstructed_object->orig_height > priv_state->picture_height)
1278 encode_state->reconstructed_object->orig_height = priv_state->picture_height;
1281 va_status = gen9_hevc_init_surface_private(ctx, generic_state, priv_state,
1282 encode_state->reconstructed_object);
1283 if (va_status != VA_STATUS_SUCCESS)
1287 struct gen9_hevc_surface_priv *surface_priv = NULL;
1289 surface_priv = (struct gen9_hevc_surface_priv *)encode_state->reconstructed_object->private_data;
1291 surface_priv->qp_value = pic_param->pic_init_qp + slice_param->slice_qp_delta;
1294 va_status = gen9_hevc_enc_alloc_resources(ctx, encode_state,
1296 if (va_status != VA_STATUS_SUCCESS)
1299 gen9_hevc_init_gpe_surfaces_table(ctx, encode_state,
1306 // VME&BRC implementation
1309 gen9_hevc_vme_init_gpe_context(VADriverContextP ctx,
1310 struct i965_gpe_context *gpe_context,
1311 unsigned int curbe_size,
1312 unsigned int inline_data_size)
1314 struct i965_driver_data *i965 = i965_driver_data(ctx);
1316 gpe_context->curbe.length = curbe_size;
1318 gpe_context->sampler.entry_size = 0;
1319 gpe_context->sampler.max_entries = 0;
1321 gpe_context->idrt.entry_size = ALIGN(sizeof(struct gen8_interface_descriptor_data), 64);
1322 gpe_context->idrt.max_entries = 1;
1324 gpe_context->surface_state_binding_table.max_entries = MAX_HEVC_KERNELS_ENCODER_SURFACES;
1325 gpe_context->surface_state_binding_table.binding_table_offset = 0;
1326 gpe_context->surface_state_binding_table.surface_state_offset = ALIGN(MAX_HEVC_KERNELS_ENCODER_SURFACES * 4, 64);
1327 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);
1329 if (i965->intel.eu_total > 0)
1330 gpe_context->vfe_state.max_num_threads = 6 * i965->intel.eu_total;
1332 gpe_context->vfe_state.max_num_threads = 112;
1334 gpe_context->vfe_state.curbe_allocation_size = MAX(1, ALIGN(gpe_context->curbe.length, 32) >> 5);
1335 gpe_context->vfe_state.urb_entry_size = MAX(1, ALIGN(inline_data_size, 32) >> 5);
1336 gpe_context->vfe_state.num_urb_entries = (MAX_HEVC_KERNELS_URB_SIZE -
1337 gpe_context->vfe_state.curbe_allocation_size -
1338 ((gpe_context->idrt.entry_size >> 5) *
1339 gpe_context->idrt.max_entries)) /
1340 gpe_context->vfe_state.urb_entry_size;
1341 gpe_context->vfe_state.num_urb_entries = CLAMP(gpe_context->vfe_state.num_urb_entries, 1, 64);
1342 gpe_context->vfe_state.gpgpu_mode = 0;
1346 gen9_hevc_vme_init_scoreboard(struct i965_gpe_context *gpe_context,
1348 unsigned int enable,
1351 gpe_context->vfe_desc5.scoreboard0.mask = mask;
1352 gpe_context->vfe_desc5.scoreboard0.type = type;
1353 gpe_context->vfe_desc5.scoreboard0.enable = enable;
1355 gpe_context->vfe_desc6.scoreboard1.delta_x0 = 0xF;
1356 gpe_context->vfe_desc6.scoreboard1.delta_y0 = 0x0;
1358 gpe_context->vfe_desc6.scoreboard1.delta_x1 = 0x0;
1359 gpe_context->vfe_desc6.scoreboard1.delta_y1 = 0xF;
1361 gpe_context->vfe_desc6.scoreboard1.delta_x2 = 0x1;
1362 gpe_context->vfe_desc6.scoreboard1.delta_y2 = 0xF;
1364 gpe_context->vfe_desc6.scoreboard1.delta_x3 = 0xF;
1365 gpe_context->vfe_desc6.scoreboard1.delta_y3 = 0xF;
1367 gpe_context->vfe_desc7.scoreboard2.delta_x4 = 0xF;
1368 gpe_context->vfe_desc7.scoreboard2.delta_y4 = 0x1;
1370 gpe_context->vfe_desc7.scoreboard2.delta_x5 = 0x0;
1371 gpe_context->vfe_desc7.scoreboard2.delta_y5 = 0xE;
1373 gpe_context->vfe_desc7.scoreboard2.delta_x6 = 0x1;
1374 gpe_context->vfe_desc7.scoreboard2.delta_y6 = 0xE;
1376 gpe_context->vfe_desc7.scoreboard2.delta_x7 = 0xF;
1377 gpe_context->vfe_desc7.scoreboard2.delta_y7 = 0xE;
1381 gen9_hevc_vme_set_scoreboard_26z(struct i965_gpe_context *gpe_context,
1383 unsigned int enable,
1386 gpe_context->vfe_desc5.scoreboard0.mask = mask;
1387 gpe_context->vfe_desc5.scoreboard0.type = type;
1388 gpe_context->vfe_desc5.scoreboard0.enable = enable;
1390 gpe_context->vfe_desc6.scoreboard1.delta_x0 = -1;
1391 gpe_context->vfe_desc6.scoreboard1.delta_y0 = 3;
1393 gpe_context->vfe_desc6.scoreboard1.delta_x1 = -1;
1394 gpe_context->vfe_desc6.scoreboard1.delta_y1 = 1;
1396 gpe_context->vfe_desc6.scoreboard1.delta_x2 = -1;
1397 gpe_context->vfe_desc6.scoreboard1.delta_y2 = -1;
1399 gpe_context->vfe_desc6.scoreboard1.delta_x3 = 0;
1400 gpe_context->vfe_desc6.scoreboard1.delta_y3 = -1;
1402 gpe_context->vfe_desc7.scoreboard2.delta_x4 = 0;
1403 gpe_context->vfe_desc7.scoreboard2.delta_y4 = -2;
1405 gpe_context->vfe_desc7.scoreboard2.delta_x5 = 0;
1406 gpe_context->vfe_desc7.scoreboard2.delta_y5 = -3;
1408 gpe_context->vfe_desc7.scoreboard2.delta_x6 = 1;
1409 gpe_context->vfe_desc7.scoreboard2.delta_y6 = -2;
1411 gpe_context->vfe_desc7.scoreboard2.delta_x7 = 1;
1412 gpe_context->vfe_desc7.scoreboard2.delta_y7 = -3;
1416 gen9_hevc_vme_set_scoreboard_26(struct i965_gpe_context *gpe_context,
1418 unsigned int enable,
1421 gpe_context->vfe_desc5.scoreboard0.mask = mask;
1422 gpe_context->vfe_desc5.scoreboard0.type = type;
1423 gpe_context->vfe_desc5.scoreboard0.enable = enable;
1425 gpe_context->vfe_desc6.scoreboard1.delta_x0 = -1;
1426 gpe_context->vfe_desc6.scoreboard1.delta_y0 = 0;
1428 gpe_context->vfe_desc6.scoreboard1.delta_x1 = -1;
1429 gpe_context->vfe_desc6.scoreboard1.delta_y1 = -1;
1431 gpe_context->vfe_desc6.scoreboard1.delta_x2 = 0;
1432 gpe_context->vfe_desc6.scoreboard1.delta_y2 = -1;
1434 gpe_context->vfe_desc6.scoreboard1.delta_x3 = 1;
1435 gpe_context->vfe_desc6.scoreboard1.delta_y3 = -1;
1439 gen9_hevc_init_object_walker(struct hevc_enc_kernel_walker_parameter *hevc_walker_param,
1440 struct gpe_media_object_walker_parameter *gpe_param)
1442 memset(gpe_param, 0, sizeof(*gpe_param));
1444 gpe_param->use_scoreboard = hevc_walker_param->use_scoreboard;
1445 gpe_param->block_resolution.x = hevc_walker_param->resolution_x;
1446 gpe_param->block_resolution.y = hevc_walker_param->resolution_y;
1447 gpe_param->global_resolution.x = hevc_walker_param->resolution_x;
1448 gpe_param->global_resolution.y = hevc_walker_param->resolution_y;
1449 gpe_param->global_outer_loop_stride.x = hevc_walker_param->resolution_x;
1450 gpe_param->global_outer_loop_stride.y = 0;
1451 gpe_param->global_inner_loop_unit.x = 0;
1452 gpe_param->global_inner_loop_unit.y = hevc_walker_param->resolution_y;
1453 gpe_param->local_loop_exec_count = 0xFFFF;
1454 gpe_param->global_loop_exec_count = 0xFFFF;
1456 if (hevc_walker_param->no_dependency) {
1457 gpe_param->scoreboard_mask = 0;
1458 gpe_param->use_scoreboard = 0;
1459 gpe_param->local_outer_loop_stride.x = 0;
1460 gpe_param->local_outer_loop_stride.y = 1;
1461 gpe_param->local_inner_loop_unit.x = 1;
1462 gpe_param->local_inner_loop_unit.y = 0;
1463 gpe_param->local_end.x = hevc_walker_param->resolution_x - 1;
1464 gpe_param->local_end.y = 0;
1469 gen9_hevc_init_object_walker_26z(struct gen9_hevc_encoder_state *priv_state,
1470 struct i965_gpe_context *gpe_context,
1471 struct gpe_media_object_walker_parameter *gpe_param,
1473 unsigned int max_slight_height,
1474 int use_hw_scoreboard,
1475 int scoreboard_type)
1477 int width = priv_state->width_in_mb;
1478 int height = max_slight_height * 2;
1479 int ts_width = ((width + 3) & 0xfffc) >> 1;
1480 int lcu_width = (width + 1) >> 1;
1481 int lcu_height = (height + 1) >> 1;
1482 int tmp1 = ((lcu_width + 1) >> 1) + ((lcu_width + ((lcu_height - 1) << 1)) + (2 * split_count - 1)) /
1485 gpe_param->use_scoreboard = use_hw_scoreboard;
1486 gpe_param->scoreboard_mask = 0xFF;
1487 gpe_param->global_resolution.x = ts_width;
1488 gpe_param->global_resolution.y = 4 * tmp1;
1489 gpe_param->global_start.x = 0;
1490 gpe_param->global_start.y = 0;
1491 gpe_param->global_outer_loop_stride.x = ts_width;
1492 gpe_param->global_outer_loop_stride.y = 0;
1493 gpe_param->global_inner_loop_unit.x = 0;
1494 gpe_param->global_inner_loop_unit.y = 4 * tmp1;
1495 gpe_param->block_resolution.x = ts_width;
1496 gpe_param->block_resolution.y = 4 * tmp1;
1497 gpe_param->local_start.x = ts_width;
1498 gpe_param->local_start.y = 0;
1499 gpe_param->local_end.x = 0;
1500 gpe_param->local_end.y = 0;
1501 gpe_param->local_outer_loop_stride.x = 1;
1502 gpe_param->local_outer_loop_stride.y = 0;
1503 gpe_param->local_inner_loop_unit.x = -2;
1504 gpe_param->local_inner_loop_unit.y = 4;
1505 gpe_param->middle_loop_extra_steps = 3;
1506 gpe_param->mid_loop_unit_x = 0;
1507 gpe_param->mid_loop_unit_y = 1;
1508 gpe_param->global_loop_exec_count = 0;
1509 gpe_param->local_loop_exec_count = ((lcu_width + (lcu_height - 1) * 2 + 2 * split_count - 1) /
1510 (2 * split_count)) * 2 -
1513 gen9_hevc_vme_set_scoreboard_26z(gpe_context, 0xff, use_hw_scoreboard, scoreboard_type);
1517 gen9_hevc_init_object_walker_26(struct gen9_hevc_encoder_state *priv_state,
1518 struct i965_gpe_context *gpe_context,
1519 struct gpe_media_object_walker_parameter *gpe_param,
1521 unsigned int max_slight_height,
1522 int use_hw_scoreboard,
1523 int scoreboard_type)
1525 int width = priv_state->width_in_mb;
1526 int height = max_slight_height;
1527 int ts_width = (width + 1) & 0xfffe;
1528 int ts_height = (height + 1) & 0xfffe;
1529 int tmp1 = ((ts_width + 1) >> 1) +
1530 ((ts_width + ((ts_height - 1) << 1)) +
1531 (2 * split_count - 1)) / (2 * split_count);
1533 gpe_param->use_scoreboard = use_hw_scoreboard;
1534 gpe_param->scoreboard_mask = 0x0f;
1535 gpe_param->global_resolution.x = ts_width;
1536 gpe_param->global_resolution.y = tmp1;
1537 gpe_param->global_start.x = 0;
1538 gpe_param->global_start.y = 0;
1539 gpe_param->global_outer_loop_stride.x = ts_width;
1540 gpe_param->global_outer_loop_stride.y = 0;
1541 gpe_param->global_inner_loop_unit.x = 0;
1542 gpe_param->global_inner_loop_unit.y = tmp1;
1543 gpe_param->block_resolution.x = ts_width;
1544 gpe_param->block_resolution.y = tmp1;
1545 gpe_param->local_start.x = ts_width;
1546 gpe_param->local_start.y = 0;
1547 gpe_param->local_end.x = 0;
1548 gpe_param->local_end.y = 0;
1549 gpe_param->local_outer_loop_stride.x = 1;
1550 gpe_param->local_outer_loop_stride.y = 0;
1551 gpe_param->local_inner_loop_unit.x = -2;
1552 gpe_param->local_inner_loop_unit.y = 1;
1553 gpe_param->middle_loop_extra_steps = 0;
1554 gpe_param->mid_loop_unit_x = 0;
1555 gpe_param->mid_loop_unit_y = 0;
1556 gpe_param->global_loop_exec_count = 0;
1557 gpe_param->local_loop_exec_count = (width + (height - 1) * 2 + split_count - 1) /
1560 gen9_hevc_vme_set_scoreboard_26(gpe_context, 0xff, use_hw_scoreboard, scoreboard_type);
1564 gen9_hevc_run_object_walker(VADriverContextP ctx,
1565 struct intel_encoder_context *encoder_context,
1566 struct i965_gpe_context *gpe_context,
1567 struct gpe_media_object_walker_parameter *param,
1570 struct intel_batchbuffer *batch = encoder_context->base.batch;
1572 intel_batchbuffer_start_atomic(batch, 0x1000);
1574 intel_batchbuffer_emit_mi_flush(batch);
1576 gen9_gpe_pipeline_setup(ctx, gpe_context, batch);
1577 gen8_gpe_media_object_walker(ctx, gpe_context, batch, param);
1578 gen8_gpe_media_state_flush(ctx, gpe_context, batch);
1579 gen9_gpe_pipeline_end(ctx, gpe_context, batch);
1581 intel_batchbuffer_end_atomic(batch);
1583 intel_batchbuffer_flush(batch);
1587 gen9_hevc_run_object(VADriverContextP ctx,
1588 struct intel_encoder_context *encoder_context,
1589 struct i965_gpe_context *gpe_context,
1590 struct gpe_media_object_parameter *param,
1593 struct intel_batchbuffer *batch = encoder_context->base.batch;
1595 intel_batchbuffer_start_atomic(batch, 0x1000);
1597 intel_batchbuffer_emit_mi_flush(batch);
1599 gen9_gpe_pipeline_setup(ctx, gpe_context, batch);
1600 gen8_gpe_media_object(ctx, gpe_context, batch, param);
1601 gen8_gpe_media_state_flush(ctx, gpe_context, batch);
1603 gen9_gpe_pipeline_end(ctx, gpe_context, batch);
1605 intel_batchbuffer_end_atomic(batch);
1607 intel_batchbuffer_flush(batch);
1611 gen9_hevc_get_b_mbenc_default_curbe(enum HEVC_TU_MODE tu_mode,
1616 if (tu_mode == HEVC_TU_BEST_SPEED) {
1617 if (slice_type == HEVC_SLICE_I) {
1618 *curbe_size = sizeof(HEVC_ENC_ENCB_TU7_I_CURBE_DATA);
1619 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU7_I_CURBE_DATA;
1620 } else if (slice_type == HEVC_SLICE_P) {
1621 *curbe_size = sizeof(HEVC_ENC_ENCB_TU7_P_CURBE_DATA);
1622 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU7_P_CURBE_DATA;
1624 *curbe_size = sizeof(HEVC_ENC_ENCB_TU7_B_CURBE_DATA);
1625 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU7_B_CURBE_DATA;
1627 } else if (tu_mode == HEVC_TU_RT_SPEED) {
1628 if (slice_type == HEVC_SLICE_P) {
1629 *curbe_size = sizeof(HEVC_ENC_ENCB_TU4_P_CURBE_DATA);
1630 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU4_P_CURBE_DATA;
1632 *curbe_size = sizeof(HEVC_ENC_ENCB_TU4_B_CURBE_DATA);
1633 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU4_B_CURBE_DATA;
1636 if (slice_type == HEVC_SLICE_P) {
1637 *curbe_size = sizeof(HEVC_ENC_ENCB_TU1_P_CURBE_DATA);
1638 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU1_P_CURBE_DATA;
1640 *curbe_size = sizeof(HEVC_ENC_ENCB_TU1_B_CURBE_DATA);
1641 *curbe_ptr = (void *)HEVC_ENC_ENCB_TU1_B_CURBE_DATA;
1649 gen9_hevc_brc_prepare(struct encode_state *encode_state,
1650 struct intel_encoder_context *encoder_context)
1652 struct encoder_vme_mfc_context *vme_context = NULL;
1653 struct generic_enc_codec_state *generic_state = NULL;
1654 struct gen9_hevc_encoder_state *priv_state = NULL;
1655 enum HEVC_BRC_METHOD brc_method = HEVC_BRC_CQP;
1656 int internal_tu_mode = encoder_context->quality_level;
1659 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1660 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
1661 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1663 if (encoder_context->rate_control_mode & VA_RC_CBR)
1664 brc_method = HEVC_BRC_CBR;
1665 else if (encoder_context->rate_control_mode & VA_RC_VBR)
1666 brc_method = HEVC_BRC_VBR;
1667 else if (encoder_context->rate_control_mode & VA_RC_VCM)
1668 brc_method = HEVC_BRC_VCM;
1670 if (internal_tu_mode >= HEVC_TU_RT_SPEED ||
1671 internal_tu_mode == 0)
1672 internal_tu_mode = internal_tu_mode >= HEVC_TU_BEST_SPEED ?
1673 HEVC_TU_BEST_SPEED : HEVC_TU_RT_SPEED;
1675 internal_tu_mode = HEVC_TU_BEST_QUALITY;
1677 brc_reset = priv_state->brc_method != brc_method ||
1678 priv_state->tu_mode != internal_tu_mode;
1680 if (!generic_state->brc_inited ||
1681 encoder_context->brc.need_reset ||
1683 priv_state->tu_mode = internal_tu_mode;
1684 if (priv_state->tu_mode == HEVC_TU_BEST_QUALITY)
1685 priv_state->num_regions_in_slice = 1;
1687 priv_state->num_regions_in_slice = 4;
1689 if (brc_method == HEVC_BRC_CQP) {
1690 generic_state->brc_enabled = 0;
1691 generic_state->num_pak_passes = 1;
1692 priv_state->lcu_brc_enabled = 0;
1694 generic_state->brc_enabled = 1;
1695 generic_state->num_pak_passes = 4;
1697 if (brc_method == HEVC_BRC_VCM ||
1698 encoder_context->brc.mb_rate_control[0] == 0)
1699 priv_state->lcu_brc_enabled = (priv_state->tu_mode == HEVC_TU_BEST_QUALITY);
1700 else if (brc_method == HEVC_BRC_ICQ ||
1701 encoder_context->brc.mb_rate_control[0] == 1)
1702 priv_state->lcu_brc_enabled = 1;
1704 priv_state->lcu_brc_enabled = 0;
1706 if (brc_method == HEVC_BRC_CBR) {
1707 priv_state->target_bit_rate_in_kbs =
1708 ALIGN(encoder_context->brc.bits_per_second[0], HEVC_BRC_KBPS) /
1710 priv_state->max_bit_rate_in_kbs = priv_state->target_bit_rate_in_kbs;
1711 priv_state->min_bit_rate_in_kbs = priv_state->target_bit_rate_in_kbs;
1713 if (encoder_context->brc.target_percentage[0] > HEVC_BRC_MIN_TARGET_PERCENTAGE) {
1714 priv_state->target_bit_rate_in_kbs =
1715 ALIGN(encoder_context->brc.bits_per_second[0], HEVC_BRC_KBPS) /
1717 priv_state->max_bit_rate_in_kbs = priv_state->target_bit_rate_in_kbs;
1718 priv_state->min_bit_rate_in_kbs = priv_state->target_bit_rate_in_kbs *
1719 (2 * encoder_context->brc.target_percentage[0] - 100) /
1721 priv_state->target_bit_rate_in_kbs = priv_state->max_bit_rate_in_kbs *
1722 encoder_context->brc.target_percentage[0] / 100;
1728 if (encoder_context->brc.framerate[0].den)
1729 priv_state->frames_per_100s = encoder_context->brc.framerate[0].num * 100 /
1730 encoder_context->brc.framerate[0].den;
1732 priv_state->init_vbv_buffer_fullness_in_bit =
1733 encoder_context->brc.hrd_initial_buffer_fullness;
1734 priv_state->vbv_buffer_size_in_bit =
1735 encoder_context->brc.hrd_buffer_size;
1738 priv_state->brc_method = brc_method;
1739 generic_state->brc_need_reset = brc_reset;
1740 encoder_context->brc.need_reset = 0;
1745 gen9_hevc_brc_init_rest_set_curbe(VADriverContextP ctx,
1746 struct encode_state *encode_state,
1747 struct intel_encoder_context *encoder_context,
1748 struct i965_gpe_context *gpe_context,
1751 struct encoder_vme_mfc_context *vme_context = NULL;
1752 struct gen9_hevc_encoder_state *priv_state = NULL;
1753 gen9_hevc_brc_initreset_curbe_data *cmd = NULL;
1754 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
1755 double input_bits_per_frame = 0;
1756 double bps_ratio = 0;
1758 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1759 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1760 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
1762 cmd = i965_gpe_context_map_curbe(gpe_context);
1766 memcpy((void *)cmd, GEN9_HEVC_BRCINIT_CURBE_DATA, sizeof(GEN9_HEVC_BRCINIT_CURBE_DATA));
1768 cmd->dw0.profile_level_max_frame = gen9_hevc_get_profile_level_max_frame(seq_param,
1769 priv_state->user_max_frame_size,
1770 priv_state->frames_per_100s);
1771 cmd->dw1.init_buf_full = priv_state->init_vbv_buffer_fullness_in_bit;
1772 cmd->dw2.buf_size = priv_state->vbv_buffer_size_in_bit;
1773 cmd->dw3.targe_bit_rate = priv_state->target_bit_rate_in_kbs * HEVC_BRC_KBPS;
1774 cmd->dw4.maximum_bit_rate = priv_state->max_bit_rate_in_kbs * HEVC_BRC_KBPS;
1776 cmd->dw9.frame_width = priv_state->picture_width;
1777 cmd->dw10.frame_height = priv_state->picture_height;
1778 cmd->dw12.number_slice = encode_state->num_slice_params_ext;
1779 cmd->dw6.frame_rate_m = priv_state->frames_per_100s;
1780 cmd->dw7.frame_rate_d = 100;
1781 cmd->dw8.brc_flag = 0;
1782 cmd->dw8.brc_flag |= (priv_state->lcu_brc_enabled) ? 0 : HEVC_BRCINIT_DISABLE_MBBRC;
1783 cmd->dw25.acqp_buffer = 1;
1785 if (priv_state->brc_method == HEVC_BRC_CBR) {
1786 cmd->dw4.maximum_bit_rate = cmd->dw3.targe_bit_rate;
1787 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISCBR;
1788 } else if (priv_state->brc_method == HEVC_BRC_VBR) {
1789 if (cmd->dw4.maximum_bit_rate < cmd->dw3.targe_bit_rate)
1790 cmd->dw4.maximum_bit_rate = cmd->dw3.targe_bit_rate * 2;
1791 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISVBR;
1792 } else if (priv_state->brc_method == HEVC_BRC_AVBR) {
1793 cmd->dw4.maximum_bit_rate = priv_state->target_bit_rate_in_kbs * HEVC_BRC_KBPS;
1794 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISAVBR;
1795 } else if (priv_state->brc_method == HEVC_BRC_ICQ) {
1796 cmd->dw25.acqp_buffer = priv_state->crf_quality_factor;
1797 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISICQ;
1798 } else if (priv_state->brc_method == HEVC_BRC_VCM) {
1799 cmd->dw4.maximum_bit_rate = priv_state->target_bit_rate_in_kbs * HEVC_BRC_KBPS;
1800 cmd->dw8.brc_flag |= HEVC_BRCINIT_ISVCM;
1803 if (priv_state->num_b_in_gop[1] ||
1804 priv_state->num_b_in_gop[2]) {
1805 cmd->dw8.brc_param_a = priv_state->gop_size / priv_state->gop_ref_dist;
1806 cmd->dw9.brc_param_b = cmd->dw8.brc_param_a;
1807 cmd->dw13.brc_param_c = cmd->dw8.brc_param_a * 2;
1808 cmd->dw14.brc_param_d = priv_state->gop_size - cmd->dw8.brc_param_a -
1809 cmd->dw9.brc_param_b - cmd->dw13.brc_param_c;
1811 if (!priv_state->num_b_in_gop[2])
1812 cmd->dw14.max_brc_level = 3;
1814 cmd->dw14.max_brc_level = 4;
1816 cmd->dw14.max_brc_level = 1;
1817 cmd->dw8.brc_param_a = priv_state->gop_ref_dist ? (priv_state->gop_size - 1) / priv_state->gop_ref_dist : 0;
1818 cmd->dw9.brc_param_b = priv_state->gop_size - 1 - cmd->dw8.brc_param_a;
1821 cmd->dw10.avbr_accuracy = GEN9_HEVC_AVBR_ACCURACY;
1822 cmd->dw11.avbr_convergence = GEN9_HEVC_AVBR_CONVERGENCE;
1824 input_bits_per_frame = (double)(cmd->dw4.maximum_bit_rate) *
1825 (double)(cmd->dw7.frame_rate_d) /
1826 (double)(cmd->dw6.frame_rate_m);
1827 if (cmd->dw2.buf_size < (unsigned int)input_bits_per_frame * 4)
1828 cmd->dw2.buf_size = (unsigned int)input_bits_per_frame * 4;
1830 if (cmd->dw1.init_buf_full == 0)
1831 cmd->dw1.init_buf_full = cmd->dw2.buf_size * 7 / 8;
1833 if (cmd->dw1.init_buf_full < (unsigned int)(input_bits_per_frame * 2))
1834 cmd->dw1.init_buf_full = (unsigned int)(input_bits_per_frame * 2);
1836 if (cmd->dw1.init_buf_full > cmd->dw2.buf_size)
1837 cmd->dw1.init_buf_full = cmd->dw2.buf_size;
1839 if (priv_state->brc_method == HEVC_BRC_AVBR) {
1840 cmd->dw2.buf_size = priv_state->target_bit_rate_in_kbs * 2 * HEVC_BRC_KBPS;
1841 cmd->dw1.init_buf_full = (unsigned int)(cmd->dw2.buf_size * 3 / 4);
1844 bps_ratio = input_bits_per_frame / (cmd->dw2.buf_size / 30);
1845 bps_ratio = (bps_ratio < 0.1) ? 0.1 : (bps_ratio > 3.5) ? 3.5 : bps_ratio;
1847 cmd->dw19.deviation_threshold0_pbframe = (unsigned int)(-50 * pow(0.90, bps_ratio));
1848 cmd->dw19.deviation_threshold1_pbframe = (unsigned int)(-50 * pow(0.66, bps_ratio));
1849 cmd->dw19.deviation_threshold2_pbframe = (unsigned int)(-50 * pow(0.46, bps_ratio));
1850 cmd->dw19.deviation_threshold3_pbframe = (unsigned int)(-50 * pow(0.3, bps_ratio));
1852 cmd->dw20.deviation_threshold4_pbframe = (unsigned int)(50 * pow(0.3, bps_ratio));
1853 cmd->dw20.deviation_threshold5_pbframe = (unsigned int)(50 * pow(0.46, bps_ratio));
1854 cmd->dw20.deviation_threshold6_pbframe = (unsigned int)(50 * pow(0.7, bps_ratio));
1855 cmd->dw20.deviation_threshold7_pbframe = (unsigned int)(50 * pow(0.9, bps_ratio));
1857 cmd->dw21.deviation_threshold0_vbr_control = (unsigned int)(-50 * pow(0.9, bps_ratio));
1858 cmd->dw21.deviation_threshold1_vbr_control = (unsigned int)(-50 * pow(0.7, bps_ratio));
1859 cmd->dw21.deviation_threshold2_vbr_control = (unsigned int)(-50 * pow(0.5, bps_ratio));
1860 cmd->dw21.deviation_threshold3_vbr_control = (unsigned int)(-50 * pow(0.3, bps_ratio));
1862 cmd->dw22.deviation_threshold4_vbr_control = (unsigned int)(100 * pow(0.4, bps_ratio));
1863 cmd->dw22.deviation_threshold5_vbr_control = (unsigned int)(100 * pow(0.5, bps_ratio));
1864 cmd->dw22.deviation_threshold6_vbr_control = (unsigned int)(100 * pow(0.75, bps_ratio));
1865 cmd->dw22.deviation_threshold7_vbr_control = (unsigned int)(100 * pow(0.9, bps_ratio));
1867 cmd->dw23.deviation_threshold0_iframe = (unsigned int)(-50 * pow(0.8, bps_ratio));
1868 cmd->dw23.deviation_threshold1_iframe = (unsigned int)(-50 * pow(0.6, bps_ratio));
1869 cmd->dw23.deviation_threshold2_iframe = (unsigned int)(-50 * pow(0.34, bps_ratio));
1870 cmd->dw23.deviation_threshold3_iframe = (unsigned int)(-50 * pow(0.2, bps_ratio));
1872 cmd->dw24.deviation_threshold4_iframe = (unsigned int)(50 * pow(0.2, bps_ratio));
1873 cmd->dw24.deviation_threshold5_iframe = (unsigned int)(50 * pow(0.4, bps_ratio));
1874 cmd->dw24.deviation_threshold6_iframe = (unsigned int)(50 * pow(0.66, bps_ratio));
1875 cmd->dw24.deviation_threshold7_iframe = (unsigned int)(50 * pow(0.9, bps_ratio));
1878 priv_state->brc_init_current_target_buf_full_in_bits = cmd->dw1.init_buf_full;
1880 priv_state->brc_init_reset_buf_size_in_bits = (double)cmd->dw2.buf_size;
1881 priv_state->brc_init_reset_input_bits_per_frame = input_bits_per_frame;
1883 i965_gpe_context_unmap_curbe(gpe_context);
1887 gen9_hevc_brc_init_rest_set_surfaces(VADriverContextP ctx,
1888 struct intel_encoder_context *encoder_context,
1889 struct i965_gpe_context *gpe_context)
1891 struct encoder_vme_mfc_context *vme_context = NULL;
1892 struct gen9_hevc_encoder_context *priv_ctx = NULL;
1895 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1896 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
1898 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
1899 HEVC_ENC_SURFACE_BRC_HISTORY, bti_idx++,
1900 0, 0, 0, NULL, NULL);
1902 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
1903 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
1904 0, 1, I965_SURFACEFORMAT_R8_UNORM,
1905 &priv_ctx->res_brc_me_dist_buffer, NULL);
1909 gen9_hevc_brc_init_reset(VADriverContextP ctx,
1910 struct encode_state *encode_state,
1911 struct intel_encoder_context *encoder_context,
1914 struct encoder_vme_mfc_context *vme_context = NULL;
1915 struct gen9_hevc_encoder_context *priv_ctx = NULL;
1917 struct i965_gpe_context *gpe_context = NULL;
1918 struct gpe_media_object_parameter param;
1919 int media_state = HEVC_ENC_MEDIA_STATE_BRC_INIT_RESET;
1920 int gpe_idx = reset ? HEVC_BRC_RESET_IDX : HEVC_BRC_INIT_IDX;
1922 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1923 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
1924 gpe_context = &priv_ctx->brc_context.gpe_contexts[gpe_idx];
1926 gen8_gpe_context_init(ctx, gpe_context);
1927 gen9_gpe_reset_binding_table(ctx, gpe_context);
1928 gen9_hevc_brc_init_rest_set_curbe(ctx, encode_state, encoder_context, gpe_context,
1930 gen9_hevc_brc_init_rest_set_surfaces(ctx, encoder_context, gpe_context);
1931 gen8_gpe_setup_interface_data(ctx, gpe_context);
1933 memset(¶m, 0, sizeof(param));
1934 gen9_hevc_run_object(ctx, encoder_context, gpe_context, ¶m,
1939 gen9_hevc_brc_intra_dist_set_curbe(VADriverContextP ctx,
1940 struct encode_state *encode_state,
1941 struct intel_encoder_context *encoder_context,
1942 struct i965_gpe_context *gpe_context)
1944 struct encoder_vme_mfc_context *vme_context = NULL;
1945 struct gen9_hevc_encoder_state *priv_state = NULL;
1946 gen9_hevc_brc_coarse_intra_curbe_data *cmd = NULL;
1949 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1950 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
1952 cmd = i965_gpe_context_map_curbe(gpe_context);
1956 memset((void *)cmd, 0, sizeof(*cmd));
1958 cmd->dw0.picture_width_in_luma_samples = priv_state->frame_width_4x;
1959 cmd->dw0.picture_height_in_luma_samples = priv_state->frame_height_4x;
1961 cmd->dw1.inter_sad = 2;
1962 cmd->dw1.intra_sad = 2;
1964 cmd->dw8.bti_src_y4 = bti_idx++;
1965 cmd->dw9.bti_intra_dist = bti_idx++;
1966 cmd->dw10.bti_vme_intra = bti_idx++;
1968 i965_gpe_context_unmap_curbe(gpe_context);
1972 gen9_hevc_brc_intra_dist_set_surfaces(VADriverContextP ctx,
1973 struct encode_state *encode_state,
1974 struct intel_encoder_context *encoder_context,
1975 struct i965_gpe_context *gpe_context)
1977 struct encoder_vme_mfc_context *vme_context = NULL;
1978 struct gen9_hevc_encoder_context *priv_ctx = NULL;
1979 struct object_surface *obj_surface;
1980 struct gen9_hevc_surface_priv *surface_priv;
1983 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
1984 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
1986 obj_surface = encode_state->reconstructed_object;
1987 surface_priv = (struct gen9_hevc_surface_priv *)(obj_surface->private_data);
1988 obj_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID];
1990 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
1991 HEVC_ENC_SURFACE_Y_4X, bti_idx++,
1992 0, 1, I965_SURFACEFORMAT_R8_UNORM,
1995 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
1996 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
1997 0, 1, I965_SURFACEFORMAT_R8_UNORM,
1998 &priv_ctx->res_brc_intra_dist_buffer, NULL);
2000 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
2001 HEVC_ENC_SURFACE_Y_4X_VME, bti_idx++,
2006 gen9_hevc_brc_intra_dist(VADriverContextP ctx,
2007 struct encode_state *encode_state,
2008 struct intel_encoder_context *encoder_context)
2010 struct encoder_vme_mfc_context *vme_context = NULL;
2011 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2012 struct gen9_hevc_encoder_state *priv_state = NULL;
2013 struct i965_gpe_context *gpe_context = NULL;
2014 struct gpe_media_object_walker_parameter param;
2015 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
2016 int media_state = HEVC_ENC_MEDIA_STATE_ENC_I_FRAME_DIST;
2017 int gpe_idx = HEVC_BRC_COARSE_INTRA_IDX;
2019 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2020 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2021 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2022 gpe_context = &priv_ctx->brc_context.gpe_contexts[gpe_idx];
2024 gen8_gpe_context_init(ctx, gpe_context);
2025 gen9_gpe_reset_binding_table(ctx, gpe_context);
2026 gen9_hevc_brc_intra_dist_set_curbe(ctx, encode_state, encoder_context, gpe_context);
2027 gen9_hevc_brc_intra_dist_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
2028 gen8_gpe_setup_interface_data(ctx, gpe_context);
2030 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
2031 hevc_walker_param.resolution_x = priv_state->downscaled_width_4x_in_mb;
2032 hevc_walker_param.resolution_y = priv_state->downscaled_height_4x_in_mb;
2033 hevc_walker_param.no_dependency = 1;
2034 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
2035 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
2039 static GEN9_HEVC_BRC_UPDATE_FRAME_TYPE gen9_hevc_get_brc_frame_type(unsigned int pic_type,
2042 if (pic_type == HEVC_SLICE_I)
2043 return HEVC_BRC_FTYPE_I;
2044 else if (pic_type == HEVC_SLICE_P)
2045 return HEVC_BRC_FTYPE_P_OR_LB;
2047 return low_delay ? HEVC_BRC_FTYPE_P_OR_LB : HEVC_BRC_FTYPE_B;
2051 gen9_hevc_brc_update_set_roi_curbe(VADriverContextP ctx,
2052 struct encode_state *encode_state,
2053 struct intel_encoder_context *encoder_context,
2054 gen9_hevc_brc_udpate_curbe_data *cmd)
2056 struct encoder_vme_mfc_context *vme_context = NULL;
2057 struct generic_enc_codec_state *generic_state = NULL;
2058 struct gen9_hevc_encoder_state *priv_state = NULL;
2059 struct intel_roi *roi_par = NULL;
2060 unsigned int roi_size = 0, roi_ratio = 0;
2063 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2064 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2065 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2067 cmd->dw6.cqp_value = 0;
2068 cmd->dw6.roi_flag = 1 | (generic_state->brc_enabled << 1) |
2069 (priv_state->video_surveillance_flag << 2);
2071 for (i = 0; i < priv_state->num_roi; i++) {
2072 roi_par = &priv_state->roi[i];
2073 roi_size += abs(roi_par->right - roi_par->left) *
2074 abs(roi_par->bottom - roi_par->top) * 256;
2078 roi_ratio = MIN(2 * (priv_state->width_in_mb * priv_state->height_in_mb * 256 / roi_size - 1),
2081 cmd->dw6.roi_ratio = roi_ratio;
2082 cmd->dw7.frame_width_in_lcu = priv_state->frame_width_in_max_lcu;
2084 if (!generic_state->brc_enabled) {
2085 VAEncPictureParameterBufferHEVC *pic_param = NULL;
2086 VAEncSliceParameterBufferHEVC *slice_param = NULL;
2088 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
2089 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
2091 cmd->dw1.frame_number = priv_state->frame_number;
2092 cmd->dw6.cqp_value = pic_param->pic_init_qp + slice_param->slice_qp_delta;
2093 cmd->dw5.curr_frame_type = gen9_hevc_get_brc_frame_type(priv_state->picture_coding_type,
2094 priv_state->low_delay);
2099 gen9_hevc_brc_update_lcu_based_set_roi_parameters(VADriverContextP ctx,
2100 struct encode_state *encode_state,
2101 struct intel_encoder_context *encoder_context,
2102 struct i965_gpe_context *gpe_context)
2104 struct encoder_vme_mfc_context *vme_context = NULL;
2105 struct gen9_hevc_encoder_context *priv_ctx = 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 width_in_mb_aligned = 0;
2110 unsigned int roi_level, qp_delta;
2111 unsigned int mb_num = 0;
2112 unsigned int *pdata = NULL;
2113 unsigned int out_data = 0;
2116 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2117 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2118 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2119 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2121 width_in_mb_aligned = ALIGN(priv_state->width_in_mb * 4, 64);
2122 mb_num = priv_state->width_in_mb * priv_state->height_in_mb;
2124 pdata = i965_map_gpe_resource(&priv_ctx->res_roi_buffer);
2128 for (i = 0 ; i < mb_num; i++) {
2129 int cur_mb_y = i / priv_state->width_in_mb;
2130 int cur_mb_x = i - cur_mb_y * priv_state->width_in_mb;
2133 if (cur_mb_x > 1 && cur_mb_x < (priv_state->width_in_mb - 2) &&
2134 cur_mb_y > 1 && cur_mb_y < (priv_state->width_in_mb - 2)) {
2137 for (roi_idx = (priv_state->num_roi - 1); roi_idx >= 0; roi_idx--) {
2138 roi_par = &priv_state->roi[roi_idx];
2140 roi_level = qp_delta = 0;
2141 if (generic_state->brc_enabled)
2142 roi_level = roi_par->value * 5;
2144 qp_delta = roi_par->value;
2151 if ((cur_mb_x >= roi_par->left) &&
2152 (cur_mb_x < roi_par->right) &&
2153 (cur_mb_y >= roi_par->top) &&
2154 (cur_mb_y < roi_par->bottom))
2155 out_data = 15 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
2156 else if ((cur_mb_x >= roi_par->left - 1) &&
2157 (cur_mb_x < roi_par->right + 1) &&
2158 (cur_mb_y >= roi_par->top - 1) &&
2159 (cur_mb_y < roi_par->top + 1))
2160 out_data = 14 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
2161 else if ((cur_mb_x >= roi_par->left - 2) &&
2162 (cur_mb_x < roi_par->right + 2) &&
2163 (cur_mb_y >= roi_par->top - 2) &&
2164 (cur_mb_y < roi_par->top + 2))
2165 out_data = 13 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
2166 else if ((cur_mb_x >= roi_par->left - 3) &&
2167 (cur_mb_x < roi_par->right + 3) &&
2168 (cur_mb_y >= roi_par->top - 3) &&
2169 (cur_mb_y < roi_par->top + 3)) {
2171 out_data = 12 | (((roi_level) & 0xFF) << 8) | ((qp_delta & 0xFF) << 16);
2174 pdata[(cur_mb_y * (width_in_mb_aligned >> 2)) + cur_mb_x] = out_data;
2178 i965_unmap_gpe_resource(&priv_ctx->res_roi_buffer);
2182 gen9_hevc_brc_update_lcu_based_set_curbe(VADriverContextP ctx,
2183 struct encode_state *encode_state,
2184 struct intel_encoder_context *encoder_context,
2185 struct i965_gpe_context *gpe_context)
2187 struct encoder_vme_mfc_context *vme_context = NULL;
2188 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2189 struct generic_enc_codec_state *generic_state = NULL;
2190 struct gen9_hevc_encoder_state *priv_state = NULL;
2191 gen9_hevc_brc_udpate_curbe_data *cmd = NULL, *frame_cmd = NULL;
2193 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2194 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2195 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2196 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2198 cmd = i965_gpe_context_map_curbe(gpe_context);
2202 if (generic_state->brc_enabled) {
2203 frame_cmd = i965_gpe_context_map_curbe(&priv_ctx->brc_context.gpe_contexts[HEVC_BRC_FRAME_UPDATE_IDX]);
2208 memcpy((void *)cmd, (void *)frame_cmd, sizeof(*cmd));
2210 i965_gpe_context_unmap_curbe(&priv_ctx->brc_context.gpe_contexts[HEVC_BRC_FRAME_UPDATE_IDX]);
2212 memcpy((void *)cmd, GEN9_HEVC_BRCUPDATE_CURBE_DATA,
2213 sizeof(GEN9_HEVC_BRCUPDATE_CURBE_DATA));
2215 if (priv_state->num_roi)
2216 gen9_hevc_brc_update_set_roi_curbe(ctx, encode_state, encoder_context, cmd);
2219 i965_gpe_context_unmap_curbe(gpe_context);
2223 gen9_hevc_brc_update_lcu_based_set_surfaces(VADriverContextP ctx,
2224 struct encode_state *encode_state,
2225 struct intel_encoder_context *encoder_context,
2226 struct i965_gpe_context *gpe_context)
2228 struct encoder_vme_mfc_context *vme_context = NULL;
2229 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2230 struct gen9_hevc_encoder_state *priv_state = NULL;
2233 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2234 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2235 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2237 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2238 HEVC_ENC_SURFACE_BRC_HISTORY, bti_idx++,
2239 0, 0, 0, NULL, NULL);
2241 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2242 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
2243 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2244 priv_state->picture_coding_type == HEVC_SLICE_I ?
2245 &priv_ctx->res_brc_intra_dist_buffer :
2246 &priv_ctx->res_brc_me_dist_buffer,
2249 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2250 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
2251 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2252 &priv_ctx->res_brc_intra_dist_buffer, NULL);
2254 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2255 HEVC_ENC_SURFACE_HME_MVP, bti_idx++,
2256 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2259 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2260 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
2261 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2264 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2265 HEVC_ENC_SURFACE_ROI, bti_idx++,
2266 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2271 gen9_hevc_brc_update_lcu_based(VADriverContextP ctx,
2272 struct encode_state *encode_state,
2273 struct intel_encoder_context *encoder_context)
2275 struct encoder_vme_mfc_context *vme_context = NULL;
2276 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2277 struct gen9_hevc_encoder_state *priv_state = NULL;
2278 struct i965_gpe_context *gpe_context = NULL;
2279 struct gpe_media_object_walker_parameter param;
2280 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
2281 int media_state = HEVC_ENC_MEDIA_STATE_HEVC_BRC_LCU_UPDATE;
2282 int gpe_idx = HEVC_BRC_LCU_UPDATE_IDX;
2284 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2285 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2286 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2287 gpe_context = &priv_ctx->brc_context.gpe_contexts[gpe_idx];
2289 gen8_gpe_context_init(ctx, gpe_context);
2290 gen9_gpe_reset_binding_table(ctx, gpe_context);
2292 if (priv_state->num_roi)
2293 gen9_hevc_brc_update_lcu_based_set_roi_parameters(ctx, encode_state, encoder_context,
2296 gen9_hevc_brc_update_lcu_based_set_curbe(ctx, encode_state, encoder_context, gpe_context);
2297 gen9_hevc_brc_update_lcu_based_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
2298 gen8_gpe_setup_interface_data(ctx, gpe_context);
2300 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
2301 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 128) >> 7;
2302 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 128) >> 7;
2303 hevc_walker_param.no_dependency = 1;
2304 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
2305 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
2310 gen9_hevc_add_pic_state(VADriverContextP ctx,
2311 struct encode_state *encode_state,
2312 struct intel_encoder_context *encoder_context,
2313 struct i965_gpe_resource *pic_state_ptr,
2314 int pic_state_offset,
2317 struct i965_driver_data *i965 = i965_driver_data(ctx);
2318 struct encoder_vme_mfc_context *pak_context = NULL;
2319 struct gen9_hevc_encoder_state *priv_state = NULL;
2320 VAEncPictureParameterBufferHEVC *pic_param = NULL;
2321 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
2322 unsigned int tmp_data[31], *cmd_ptr = NULL;
2325 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2326 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
2328 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
2329 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
2332 cmd_size = (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 31 : 19;
2333 memset((void *)tmp_data, 0, 4 * cmd_size);
2335 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info))
2336 *cmd_ptr++ = HCP_PIC_STATE | (31 - 2);
2338 *cmd_ptr++ = HCP_PIC_STATE | (19 - 2);
2340 *cmd_ptr++ = (priv_state->height_in_cu - 1) << 16 |
2342 (priv_state->width_in_cu - 1);
2343 *cmd_ptr++ = (seq_param->log2_min_transform_block_size_minus2 +
2344 seq_param->log2_diff_max_min_transform_block_size) << 6 |
2345 seq_param->log2_min_transform_block_size_minus2 << 4 |
2346 (seq_param->log2_min_luma_coding_block_size_minus3 +
2347 seq_param->log2_diff_max_min_luma_coding_block_size) << 2 |
2348 seq_param->log2_min_luma_coding_block_size_minus3;
2350 *cmd_ptr++ = ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 1 : 0) << 27 |
2351 seq_param->seq_fields.bits.strong_intra_smoothing_enabled_flag << 26 |
2352 pic_param->pic_fields.bits.transquant_bypass_enabled_flag << 25 |
2353 ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 0 : priv_state->ctu_max_bitsize_allowed > 0) << 24 |
2354 seq_param->seq_fields.bits.amp_enabled_flag << 23 |
2355 pic_param->pic_fields.bits.transform_skip_enabled_flag << 22 |
2358 pic_param->pic_fields.bits.weighted_pred_flag << 19 |
2359 pic_param->pic_fields.bits.weighted_bipred_flag << 18 |
2361 pic_param->pic_fields.bits.entropy_coding_sync_enabled_flag << 16 |
2363 pic_param->pic_fields.bits.sign_data_hiding_enabled_flag << 13 |
2364 pic_param->log2_parallel_merge_level_minus2 << 10 |
2365 pic_param->pic_fields.bits.constrained_intra_pred_flag << 9 |
2366 seq_param->seq_fields.bits.pcm_loop_filter_disabled_flag << 8 |
2367 (pic_param->diff_cu_qp_delta_depth & 0x03) << 6 |
2368 pic_param->pic_fields.bits.cu_qp_delta_enabled_flag << 5 |
2370 seq_param->seq_fields.bits.sample_adaptive_offset_enabled_flag << 3 |
2372 *cmd_ptr++ = seq_param->seq_fields.bits.bit_depth_luma_minus8 << 27 |
2373 seq_param->seq_fields.bits.bit_depth_chroma_minus8 << 24 |
2374 ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 0 : 7) << 20 |
2375 ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ? 0 : 7) << 16 |
2376 seq_param->max_transform_hierarchy_depth_inter << 13 |
2377 seq_param->max_transform_hierarchy_depth_intra << 10 |
2378 (pic_param->pps_cr_qp_offset & 0x1f) << 5 |
2379 (pic_param->pps_cb_qp_offset & 0x1f);
2381 *cmd_ptr++ = 0 << 29 |
2382 priv_state->ctu_max_bitsize_allowed;
2384 *(cmd_ptr - 1) |= 0 << 31 |
2388 (pic_state_offset ? 1 : 0) << 16;
2390 *cmd_ptr++ = 0 << 31 |
2392 *cmd_ptr++ = 0 << 31 |
2394 *cmd_ptr++ = 0 << 16 |
2404 *cmd_ptr++ = 0 << 30 |
2407 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
2410 for (i = 0; i < 12; i++)
2414 if (pic_state_ptr) {
2415 char *pdata = i965_map_gpe_resource(pic_state_ptr);
2420 memcpy(pdata + pic_state_offset, tmp_data, cmd_size * 4);
2422 pdata += pic_state_offset + cmd_size * 4;
2424 *(unsigned int *)pdata++ = MI_BATCH_BUFFER_END;
2426 i965_unmap_gpe_resource(pic_state_ptr);
2428 struct intel_batchbuffer *batch = encoder_context->base.batch;
2430 BEGIN_BCS_BATCH(batch, cmd_size);
2432 intel_batchbuffer_data(batch, tmp_data, cmd_size * 4);
2434 ADVANCE_BCS_BATCH(batch);
2439 gen9_hevc_brc_update_set_pic_states(VADriverContextP ctx,
2440 struct encode_state *encode_state,
2441 struct intel_encoder_context *encoder_context)
2443 struct encoder_vme_mfc_context *vme_context = NULL;
2444 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2445 struct generic_enc_codec_state *generic_state = NULL;
2446 struct gen9_hevc_encoder_state *priv_state = NULL;
2447 int i = 0, offset = 0;
2449 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2450 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2451 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2452 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2454 for (i = 0; i < generic_state->num_pak_passes; i++) {
2455 gen9_hevc_add_pic_state(ctx, encode_state, encoder_context,
2456 &priv_ctx->res_brc_pic_states_read_buffer,
2459 offset += priv_state->pic_state_size;
2464 gen9_hevc_brc_update_set_constant(VADriverContextP ctx,
2465 struct encode_state *encode_state,
2466 struct intel_encoder_context *encoder_context)
2468 struct encoder_vme_mfc_context *vme_context = NULL;
2469 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2470 struct gen9_hevc_encoder_state *priv_state = NULL;
2471 unsigned int width, height, size;
2472 unsigned char *pdata = NULL;
2475 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2476 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2477 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2479 pdata = i965_map_gpe_resource(&priv_ctx->res_brc_constant_data_buffer);
2483 width = ALIGN(GEN9_HEVC_ENC_BRC_CONSTANT_SURFACE_WIDTH, 64);
2484 height = GEN9_HEVC_ENC_BRC_CONSTANT_SURFACE_HEIGHT;
2485 size = width * height;
2486 memset((void *)pdata, 0, size);
2488 memcpy((void *)pdata, GEN9_HEVC_BRCUPDATE_QP_ADJUST, GEN9_HEVC_BRCUPDATE_QP_ADJUST_SIZE);
2489 pdata += GEN9_HEVC_BRCUPDATE_QP_ADJUST_SIZE;
2491 if (priv_state->picture_coding_type == HEVC_SLICE_I)
2492 memset((void *)pdata, 0, GEN9_HEVC_ENC_SKIP_VAL_SIZE);
2494 gen9_hevc_mbenc_b_mb_enc_curbe_data *curbe_cmd = NULL;
2497 gen9_hevc_get_b_mbenc_default_curbe(priv_state->tu_mode,
2498 priv_state->picture_coding_type,
2499 (void **)&curbe_cmd,
2502 idx = curbe_cmd->dw3.block_based_skip_enable ? 1 : 0;
2503 memcpy((void *)pdata, GEN9_HEVC_ENC_SKIP_THREAD[idx], sizeof(GEN9_HEVC_ENC_SKIP_THREAD[idx]));
2505 pdata += GEN9_HEVC_ENC_SKIP_VAL_SIZE;
2507 memcpy((void *)pdata, GEN9_HEVC_ENC_BRC_LAMBDA_HAAR, sizeof(GEN9_HEVC_ENC_BRC_LAMBDA_HAAR));
2508 pdata += GEN9_HEVC_ENC_BRC_LAMBDA_TABLE_SIZE;
2510 idx = (priv_state->picture_coding_type == HEVC_SLICE_I) ? 0 :
2511 (priv_state->picture_coding_type == HEVC_SLICE_P) ? 1 : 2;
2512 memcpy((void *)pdata, GEN9_HEVC_ENC_BRC_MVCOST_HAAR[idx], sizeof(GEN9_HEVC_ENC_BRC_MVCOST_HAAR[idx]));
2514 i965_unmap_gpe_resource(&priv_ctx->res_brc_constant_data_buffer);
2518 unsigned int gen9_hevc_get_start_code_offset(unsigned char *ptr,
2521 unsigned int count = 0;
2523 while (count < size && *ptr != 0x01) {
2535 unsigned int gen9_hevc_get_emulation_num(unsigned char *ptr,
2538 unsigned int emulation_num = 0;
2539 unsigned int header_offset = 0;
2540 unsigned int zero_count = 0;
2543 header_offset = gen9_hevc_get_start_code_offset(ptr, size);
2544 ptr += header_offset;
2546 for (i = 0 ; i < (size - header_offset); i++, ptr++) {
2547 if (zero_count == 2 && !(*ptr & 0xFC)) {
2558 return emulation_num;
2561 #define HEVC_ENC_START_CODE_NAL_OFFSET (2)
2564 gen9_hevc_get_pic_header_size(struct encode_state *encode_state)
2566 VAEncPackedHeaderParameterBuffer *param = NULL;
2567 unsigned int header_begin = 0;
2568 unsigned int accum_size = 0;
2569 unsigned char *header_data = NULL;
2570 unsigned int length_in_bytes = 0;
2571 int packed_type = 0;
2572 int idx = 0, count = 0, idx_offset = 0;
2573 int i = 0, slice_idx = 0, start_index = 0;
2575 for (i = 0; i < 4; i++) {
2579 packed_type = VAEncPackedHeaderHEVC_VPS;
2582 packed_type = VAEncPackedHeaderHEVC_VPS;
2586 packed_type = VAEncPackedHeaderHEVC_PPS;
2589 packed_type = VAEncPackedHeaderHEVC_SEI;
2595 idx = va_enc_packed_type_to_idx(packed_type) + idx_offset;
2596 if (encode_state->packed_header_data[idx]) {
2597 param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
2598 header_data = (unsigned char *)encode_state->packed_header_data[idx]->buffer;
2599 length_in_bytes = (param->bit_length + 7) / 8;
2601 header_begin = gen9_hevc_get_start_code_offset(header_data, length_in_bytes) +
2602 HEVC_ENC_START_CODE_NAL_OFFSET;
2604 accum_size += length_in_bytes;
2605 if (!param->has_emulation_bytes)
2606 accum_size += gen9_hevc_get_emulation_num(header_data,
2611 for (slice_idx = 0; slice_idx < encode_state->num_slice_params_ext; slice_idx++) {
2612 count = encode_state->slice_rawdata_count[slice_idx];
2613 start_index = encode_state->slice_rawdata_index[slice_idx] &
2614 SLICE_PACKED_DATA_INDEX_MASK;
2616 for (i = 0; i < count; i++) {
2617 param = (VAEncPackedHeaderParameterBuffer *)
2618 (encode_state->packed_header_params_ext[start_index + i]->buffer);
2620 if (param->type == VAEncPackedHeaderSlice)
2623 header_data = (unsigned char *)encode_state->packed_header_data[start_index]->buffer;
2624 length_in_bytes = (param->bit_length + 7) / 8;
2626 accum_size += length_in_bytes;
2627 if (!param->has_emulation_bytes)
2628 accum_size += gen9_hevc_get_emulation_num(header_data,
2633 header_begin = MIN(header_begin, accum_size);
2635 return ((accum_size - header_begin) * 8);
2639 gen9_hevc_brc_update_set_curbe(VADriverContextP ctx,
2640 struct encode_state *encode_state,
2641 struct intel_encoder_context *encoder_context,
2642 struct i965_gpe_context *gpe_context)
2644 struct encoder_vme_mfc_context *vme_context = NULL;
2645 struct generic_enc_codec_state *generic_state = NULL;
2646 struct gen9_hevc_encoder_state *priv_state = NULL;
2647 gen9_hevc_brc_udpate_curbe_data *cmd = NULL;
2649 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2650 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
2651 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2653 cmd = i965_gpe_context_map_curbe(gpe_context);
2657 memcpy((void *)cmd, GEN9_HEVC_BRCUPDATE_CURBE_DATA,
2658 sizeof(GEN9_HEVC_BRCUPDATE_CURBE_DATA));
2660 cmd->dw5.target_size_flag = 0;
2661 if (priv_state->brc_init_current_target_buf_full_in_bits >
2662 (double)priv_state->brc_init_reset_buf_size_in_bits) {
2663 priv_state->brc_init_current_target_buf_full_in_bits -=
2664 (double)priv_state->brc_init_reset_buf_size_in_bits;
2665 cmd->dw5.target_size_flag = 1;
2668 if (priv_state->num_skip_frames) {
2669 cmd->dw6.num_skipped_frames = priv_state->num_skip_frames;
2670 cmd->dw15.size_of_skipped_frames = priv_state->size_skip_frames;
2672 priv_state->brc_init_current_target_buf_full_in_bits +=
2673 priv_state->brc_init_reset_input_bits_per_frame * priv_state->num_skip_frames;
2676 cmd->dw0.target_size = (unsigned int)priv_state->brc_init_current_target_buf_full_in_bits;
2677 cmd->dw1.frame_number = priv_state->frame_number;
2678 cmd->dw2.picture_header_size = gen9_hevc_get_pic_header_size(encode_state);
2680 cmd->dw5.brc_flag = 0;
2681 cmd->dw5.curr_frame_type = gen9_hevc_get_brc_frame_type(priv_state->picture_coding_type,
2682 priv_state->low_delay);
2684 cmd->dw5.max_num_paks = generic_state->num_pak_passes;
2685 cmd->dw14.parallel_mode = priv_state->parallel_brc;
2687 priv_state->brc_init_current_target_buf_full_in_bits +=
2688 priv_state->brc_init_reset_input_bits_per_frame;
2690 if (priv_state->brc_method == HEVC_BRC_AVBR) {
2691 cmd->dw3.start_gadj_frame0 = (unsigned int)((10 * GEN9_HEVC_AVBR_CONVERGENCE) / (double)150);
2692 cmd->dw3.start_gadj_frame1 = (unsigned int)((50 * GEN9_HEVC_AVBR_CONVERGENCE) / (double)150);
2693 cmd->dw4.start_gadj_frame2 = (unsigned int)((100 * GEN9_HEVC_AVBR_CONVERGENCE) / (double)150);
2694 cmd->dw4.start_gadj_frame3 = (unsigned int)((150 * GEN9_HEVC_AVBR_CONVERGENCE) / (double)150);
2695 cmd->dw11.g_rate_ratio_threshold0 = (unsigned int)((100 - (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (100 - 40)));
2696 cmd->dw11.g_rate_ratio_threshold1 = (unsigned int)((100 - (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (100 - 75)));
2697 cmd->dw12.g_rate_ratio_threshold2 = (unsigned int)((100 - (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (100 - 97)));
2698 cmd->dw12.g_rate_ratio_threshold3 = (unsigned int)((100 + (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (103 - 100)));
2699 cmd->dw12.g_rate_ratio_threshold4 = (unsigned int)((100 + (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (125 - 100)));
2700 cmd->dw12.g_rate_ratio_threshold5 = (unsigned int)((100 + (GEN9_HEVC_AVBR_ACCURACY / (double)30) * (160 - 100)));
2702 cmd->dw3.start_gadj_frame0 = 10;
2703 cmd->dw3.start_gadj_frame1 = 50;
2704 cmd->dw4.start_gadj_frame2 = 100;
2705 cmd->dw4.start_gadj_frame3 = 150;
2706 cmd->dw11.g_rate_ratio_threshold0 = 40;
2707 cmd->dw11.g_rate_ratio_threshold1 = 75;
2708 cmd->dw12.g_rate_ratio_threshold2 = 97;
2709 cmd->dw12.g_rate_ratio_threshold3 = 103;
2710 cmd->dw12.g_rate_ratio_threshold4 = 125;
2711 cmd->dw12.g_rate_ratio_threshold5 = 160;
2714 i965_gpe_context_unmap_curbe(gpe_context);
2718 gen9_hevc_brc_update_set_surfaces(VADriverContextP ctx,
2719 struct intel_encoder_context *encoder_context,
2720 struct i965_gpe_context *gpe_context)
2722 struct encoder_vme_mfc_context *vme_context = NULL;
2723 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2724 struct gen9_hevc_encoder_state *priv_state = NULL;
2727 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2728 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2729 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2731 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2732 HEVC_ENC_SURFACE_BRC_HISTORY, bti_idx++,
2733 0, 0, 0, NULL, NULL);
2735 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2736 HEVC_ENC_SURFACE_BRC_PAST_PAK_INFO, bti_idx++,
2737 0, 0, 0, NULL, NULL);
2739 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2740 HEVC_ENC_SURFACE_BRC_HCP_PIC_STATE, bti_idx++,
2741 0, 0, 0, &priv_ctx->res_brc_pic_states_read_buffer,
2744 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2745 HEVC_ENC_SURFACE_BRC_HCP_PIC_STATE, bti_idx++,
2746 0, 0, 0, &priv_ctx->res_brc_pic_states_write_buffer,
2749 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2750 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
2751 0, 0, 0, NULL, NULL);
2753 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2754 HEVC_ENC_SURFACE_BRC_ME_DIST, bti_idx++,
2755 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2756 priv_state->picture_coding_type == HEVC_SLICE_I ?
2757 &priv_ctx->res_brc_intra_dist_buffer :
2758 &priv_ctx->res_brc_me_dist_buffer,
2761 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2762 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
2763 0, 1, I965_SURFACEFORMAT_R8_UNORM,
2768 gen9_hevc_brc_update(VADriverContextP ctx,
2769 struct encode_state *encode_state,
2770 struct intel_encoder_context *encoder_context)
2772 struct encoder_vme_mfc_context *vme_context = NULL;
2773 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2774 struct gen9_hevc_encoder_state *priv_state = NULL;
2775 struct i965_gpe_context *gpe_context = NULL;
2776 struct gpe_media_object_parameter param;
2777 int media_state = HEVC_ENC_MEDIA_STATE_BRC_UPDATE;
2778 int gpe_idx = HEVC_BRC_FRAME_UPDATE_IDX;
2780 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2781 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2782 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2783 gpe_context = &priv_ctx->brc_context.gpe_contexts[gpe_idx];
2785 gen8_gpe_context_init(ctx, gpe_context);
2786 gen9_gpe_reset_binding_table(ctx, gpe_context);
2788 gen9_hevc_brc_update_set_pic_states(ctx, encode_state, encoder_context);
2789 gen9_hevc_brc_update_set_constant(ctx, encode_state, encoder_context);
2790 gen9_hevc_brc_update_set_curbe(ctx, encode_state, encoder_context, gpe_context);
2791 gen9_hevc_brc_update_set_surfaces(ctx, encoder_context, gpe_context);
2793 gen8_gpe_setup_interface_data(ctx, gpe_context);
2795 memset(¶m, 0, sizeof(param));
2796 gen9_hevc_run_object(ctx, encoder_context, gpe_context, ¶m,
2799 if (priv_state->lcu_brc_enabled ||
2800 priv_state->num_roi)
2801 gen9_hevc_brc_update_lcu_based(ctx, encode_state, encoder_context);
2804 // Depth converstion for 10bits
2807 gen9_hevc_frame_depth_conversion_set_curbe(VADriverContextP ctx,
2808 struct encode_state *encode_state,
2809 struct intel_encoder_context *encoder_context,
2810 struct i965_gpe_context *gpe_context,
2811 GEN9_HEVC_DOWNSCALE_STAGE scale_stage)
2813 struct encoder_vme_mfc_context *vme_context = NULL;
2814 struct gen9_hevc_encoder_state *priv_state = NULL;
2815 gen95_hevc_mbenc_ds_combined_curbe_data *cmd = NULL;
2818 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2819 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2821 cmd = i965_gpe_context_map_curbe(gpe_context);
2825 memset((void *)cmd, 0, sizeof(*cmd));
2827 cmd->dw0.pak_bitdepth_chroma = 10;
2828 cmd->dw0.pak_bitdepth_luma = 10;
2829 cmd->dw0.enc_bitdepth_chroma = 8;
2830 cmd->dw0.enc_bitdepth_luma = 8;
2831 cmd->dw0.rounding_value = 1;
2832 cmd->dw1.pic_format = 0;
2833 cmd->dw1.pic_convert_flag = 1;
2834 cmd->dw1.pic_down_scale = scale_stage;
2835 cmd->dw1.pic_mb_stat_output_cntrl = 0;
2836 cmd->dw2.orig_pic_width = priv_state->picture_width;
2837 cmd->dw2.orig_pic_height = priv_state->picture_height;
2839 cmd->dw3.bti_surface_p010 = bti_idx++;
2841 cmd->dw4.bti_surface_nv12 = bti_idx++;
2843 cmd->dw5.bti_src_y_4xdownscaled = bti_idx++;
2844 cmd->dw6.bti_surf_mbstate = bti_idx++;
2845 cmd->dw7.bit_src_y_2xdownscaled = bti_idx++;
2847 i965_gpe_context_unmap_curbe(gpe_context);
2851 gen9_hevc_frame_depth_conversion_set_surfaces(VADriverContextP ctx,
2852 struct encode_state *encode_state,
2853 struct intel_encoder_context *encoder_context,
2854 struct i965_gpe_context *gpe_context,
2855 struct object_surface *src_surface,
2856 struct object_surface *dst_surface)
2858 struct encoder_vme_mfc_context *vme_context = NULL;
2859 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2860 struct gen9_hevc_surface_priv *surface_priv = NULL;
2863 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2864 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2865 surface_priv = (struct gen9_hevc_surface_priv *)dst_surface->private_data;
2867 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2868 HEVC_ENC_SURFACE_RAW_10bit_Y_UV, bti_idx++,
2869 1, 1, I965_SURFACEFORMAT_R8_UNORM,
2873 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2874 HEVC_ENC_SURFACE_RAW_FC_8bit_Y_UV, bti_idx++,
2875 1, 1, I965_SURFACEFORMAT_R8_UNORM,
2877 surface_priv->surface_obj_nv12);
2880 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2881 HEVC_ENC_SURFACE_Y_4X, bti_idx++,
2882 0, 1, I965_SURFACEFORMAT_R32_UNORM,
2884 surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID]);
2886 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
2887 HEVC_ENC_SURFACE_RAW_MBSTAT, bti_idx++,
2888 0, 0, 0, NULL, NULL);
2890 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
2891 HEVC_ENC_SURFACE_Y_2X, bti_idx++,
2892 0, 1, I965_SURFACEFORMAT_R32_UNORM,
2897 gen9_hevc_frame_depth_conversion(VADriverContextP ctx,
2898 struct encode_state *encode_state,
2899 struct intel_encoder_context *encoder_context,
2900 struct object_surface *src_surface,
2901 struct object_surface *dst_surface,
2902 GEN9_HEVC_DOWNSCALE_STAGE scale_stage)
2904 struct encoder_vme_mfc_context *vme_context = NULL;
2905 struct gen9_hevc_encoder_context *priv_ctx = NULL;
2906 struct gen9_hevc_encoder_state *priv_state = NULL;
2907 struct gpe_media_object_walker_parameter param;
2908 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
2909 struct i965_gpe_context *gpe_context = NULL;
2910 int media_state = HEVC_ENC_MEDIA_STATE_DS_COMBINED;
2912 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
2913 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
2914 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
2916 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_DS_COMBINED_IDX];
2918 gen8_gpe_context_init(ctx, gpe_context);
2919 gen9_gpe_reset_binding_table(ctx, gpe_context);
2920 gen9_hevc_frame_depth_conversion_set_curbe(ctx, encode_state, encoder_context, gpe_context,
2922 gen9_hevc_frame_depth_conversion_set_surfaces(ctx, encode_state, encoder_context, gpe_context,
2923 src_surface, dst_surface);
2924 gen8_gpe_setup_interface_data(ctx, gpe_context);
2926 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
2927 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width >> 2, 32) >> 3;
2928 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height >> 2, 32) >> 3;
2929 hevc_walker_param.no_dependency = 1;
2930 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
2931 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
2936 gen9_hevc_ref_frame_depth_conversion(VADriverContextP ctx,
2937 struct encode_state *encode_state,
2938 struct intel_encoder_context *encoder_context)
2940 struct i965_driver_data *i965 = i965_driver_data(ctx);
2941 struct gen9_hevc_surface_priv *surface_priv = NULL;
2942 VAEncSliceParameterBufferHEVC *slice_param = NULL;
2943 struct object_surface *obj_surface = NULL;
2946 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
2948 for (i = 0; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++) {
2949 obj_surface = SURFACE(slice_param->ref_pic_list0[i].picture_id);
2951 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
2953 if (!surface_priv->surface_nv12_valid) {
2954 gen9_hevc_frame_depth_conversion(ctx, encode_state, encoder_context,
2955 obj_surface, obj_surface,
2956 HEVC_ENC_DS_DISABLED);
2958 surface_priv->surface_reff = surface_priv->surface_obj_nv12;
2959 surface_priv->surface_nv12_valid = 1;
2964 for (i = 0; i < slice_param->num_ref_idx_l1_active_minus1 + 1; i++) {
2965 obj_surface = SURFACE(slice_param->ref_pic_list1[i].picture_id);
2967 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
2969 if (!surface_priv->surface_nv12_valid) {
2970 gen9_hevc_frame_depth_conversion(ctx, encode_state, encoder_context,
2971 obj_surface, obj_surface,
2972 HEVC_ENC_DS_DISABLED);
2974 surface_priv->surface_reff = surface_priv->surface_obj_nv12;
2975 surface_priv->surface_nv12_valid = 1;
2981 // Scaling implementation
2984 gen9_hevc_scaling_set_curbe_2x(struct i965_gpe_context *gpe_context,
2985 struct gen9_hevc_scaling_parameter *scaling_param)
2987 gen9_hevc_scaling2x_curbe_data *cmd;
2989 cmd = i965_gpe_context_map_curbe(gpe_context);
2993 memset((void *)cmd, 0, sizeof(*cmd));
2995 cmd->dw0.input_picture_width = scaling_param->input_frame_width;
2996 cmd->dw0.input_picture_height = scaling_param->input_frame_height;
2998 cmd->dw8.input_y_bti = GEN9_HEVC_SCALING_FRAME_SRC_Y_INDEX;
2999 cmd->dw9.output_y_bti = GEN9_HEVC_SCALING_FRAME_DST_Y_INDEX;
3001 i965_gpe_context_unmap_curbe(gpe_context);
3005 gen9_hevc_scaling_set_curbe_4x(struct i965_gpe_context *gpe_context,
3006 struct gen9_hevc_scaling_parameter *scaling_param)
3008 gen9_hevc_scaling4x_curbe_data *cmd;
3010 cmd = i965_gpe_context_map_curbe(gpe_context);
3014 memset((void *)cmd, 0, sizeof(*cmd));
3016 cmd->dw0.input_picture_width = scaling_param->input_frame_width;
3017 cmd->dw0.input_picture_height = scaling_param->input_frame_height;
3019 cmd->dw1.input_y_bti = GEN9_HEVC_SCALING_FRAME_SRC_Y_INDEX;
3020 cmd->dw2.output_y_bti = GEN9_HEVC_SCALING_FRAME_DST_Y_INDEX;
3022 cmd->dw5.flatness_threshold = 0;
3023 cmd->dw6.enable_mb_flatness_check = scaling_param->enable_mb_flatness_check;
3024 cmd->dw7.enable_mb_variance_output = scaling_param->enable_mb_variance_output;
3025 cmd->dw8.enable_mb_pixel_average_output = scaling_param->enable_mb_pixel_average_output;
3027 if (cmd->dw6.enable_mb_flatness_check ||
3028 cmd->dw7.enable_mb_variance_output ||
3029 cmd->dw8.enable_mb_pixel_average_output)
3030 cmd->dw10.mbv_proc_stat_bti = GEN9_HEVC_SCALING_FRAME_MBVPROCSTATS_DST_INDEX;
3032 i965_gpe_context_unmap_curbe(gpe_context);
3036 gen9_hevc_scaling_set_curbe(struct gen9_hevc_scaling_parameter *scaling_param,
3037 struct i965_gpe_context *gpe_context)
3039 if (scaling_param->use_32x_scaling)
3040 gen9_hevc_scaling_set_curbe_2x(gpe_context, scaling_param);
3042 gen9_hevc_scaling_set_curbe_4x(gpe_context, scaling_param);
3046 gen9_hevc_scaling_set_surfaces(VADriverContextP ctx,
3047 struct encode_state *encode_state,
3048 struct intel_encoder_context *encoder_context,
3049 struct gen9_hevc_scaling_parameter *scaling_param,
3050 struct i965_gpe_context *gpe_context)
3052 unsigned int surface_format;
3054 if (scaling_param->scaling_out_use_32unorm_surf_fmt)
3055 surface_format = I965_SURFACEFORMAT_R32_UNORM;
3056 else if (scaling_param->scaling_out_use_16unorm_surf_fmt)
3057 surface_format = I965_SURFACEFORMAT_R16_UNORM;
3059 surface_format = I965_SURFACEFORMAT_R8_UNORM;
3061 gen9_add_2d_gpe_surface(ctx, gpe_context,
3062 scaling_param->input_surface,
3063 0, 1, surface_format,
3064 GEN9_HEVC_SCALING_FRAME_SRC_Y_INDEX);
3066 gen9_add_2d_gpe_surface(ctx, gpe_context,
3067 scaling_param->output_surface,
3068 0, 1, surface_format,
3069 GEN9_HEVC_SCALING_FRAME_DST_Y_INDEX);
3071 if ((scaling_param->enable_mb_flatness_check ||
3072 scaling_param->enable_mb_variance_output ||
3073 scaling_param->enable_mb_pixel_average_output) &&
3074 scaling_param->use_4x_scaling) {
3075 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3076 scaling_param->pres_mbv_proc_stat_buffer,
3078 I965_SURFACEFORMAT_R8_UNORM,
3079 GEN9_HEVC_SCALING_FRAME_MBVPROCSTATS_DST_INDEX);
3084 gen9_hevc_kernel_scaling(VADriverContextP ctx,
3085 struct encode_state *encode_state,
3086 struct intel_encoder_context *encoder_context,
3087 enum HEVC_HME_TYPE hme_type)
3089 struct encoder_vme_mfc_context *vme_context = NULL;
3090 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3091 struct gen9_hevc_encoder_state *priv_state = NULL;
3092 struct gen9_hevc_surface_priv *surface_priv = NULL;
3093 struct gen9_hevc_scaling_parameter scaling_param;
3094 struct gpe_media_object_walker_parameter param;
3095 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
3096 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
3097 struct i965_gpe_context *gpe_context = NULL;
3098 int gpe_idx = 0, media_state = 0;;
3100 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3101 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3102 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3104 surface_priv = (struct gen9_hevc_surface_priv *)encode_state->reconstructed_object->private_data;
3106 memset((void *)&scaling_param, 0, sizeof(scaling_param));
3109 media_state = HEVC_ENC_MEDIA_STATE_4X_SCALING;
3110 gpe_idx = HEVC_ENC_SCALING_4X;
3111 downscaled_width_in_mb = priv_state->downscaled_width_4x_in_mb;
3112 downscaled_height_in_mb = priv_state->downscaled_height_4x_in_mb;
3114 scaling_param.input_surface = encode_state->input_yuv_object;
3115 scaling_param.input_frame_width = priv_state->picture_width;
3116 scaling_param.input_frame_height = priv_state->picture_height;
3118 scaling_param.output_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID];
3119 scaling_param.output_frame_width = priv_state->frame_width_4x;
3120 scaling_param.output_frame_height = priv_state->frame_height_4x;
3122 scaling_param.enable_mb_flatness_check = priv_state->flatness_check_enable;
3123 scaling_param.enable_mb_variance_output = 0;
3124 scaling_param.enable_mb_pixel_average_output = 0;
3125 scaling_param.pres_mbv_proc_stat_buffer = &(priv_ctx->res_flatness_check_surface);
3127 scaling_param.blk8x8_stat_enabled = 0;
3128 scaling_param.use_4x_scaling = 1;
3129 scaling_param.use_16x_scaling = 0;
3130 scaling_param.use_32x_scaling = 0;
3133 media_state = HEVC_ENC_MEDIA_STATE_16X_SCALING;
3134 gpe_idx = HEVC_ENC_SCALING_16X;
3135 downscaled_width_in_mb = priv_state->downscaled_width_16x_in_mb;
3136 downscaled_height_in_mb = priv_state->downscaled_height_16x_in_mb;
3138 scaling_param.input_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_4X_ID];
3139 scaling_param.input_frame_width = priv_state->frame_width_4x;
3140 scaling_param.input_frame_height = priv_state->frame_height_4x;
3142 scaling_param.output_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_16X_ID];
3143 scaling_param.output_frame_width = priv_state->frame_width_16x;
3144 scaling_param.output_frame_height = priv_state->frame_height_16x;
3146 scaling_param.enable_mb_flatness_check = 0;
3147 scaling_param.enable_mb_variance_output = 0;
3148 scaling_param.enable_mb_pixel_average_output = 0;
3150 scaling_param.blk8x8_stat_enabled = 0;
3151 scaling_param.use_4x_scaling = 0;
3152 scaling_param.use_16x_scaling = 1;
3153 scaling_param.use_32x_scaling = 0;
3156 media_state = HEVC_ENC_MEDIA_STATE_32X_SCALING;
3157 gpe_idx = HEVC_ENC_SCALING_32X;
3158 downscaled_width_in_mb = priv_state->downscaled_width_32x_in_mb;
3159 downscaled_height_in_mb = priv_state->downscaled_height_32x_in_mb;
3161 scaling_param.input_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_16X_ID];
3162 scaling_param.input_frame_width = priv_state->frame_width_16x;
3163 scaling_param.input_frame_height = priv_state->frame_height_16x;
3165 scaling_param.output_surface = surface_priv->scaled_surface_obj[HEVC_SCALED_SURF_32X_ID];
3166 scaling_param.output_frame_width = priv_state->frame_width_32x;
3167 scaling_param.output_frame_height = priv_state->frame_height_32x;
3169 scaling_param.enable_mb_flatness_check = 0;
3170 scaling_param.enable_mb_variance_output = 0;
3171 scaling_param.enable_mb_pixel_average_output = 0;
3173 scaling_param.blk8x8_stat_enabled = 0;
3174 scaling_param.use_4x_scaling = 0;
3175 scaling_param.use_16x_scaling = 0;
3176 scaling_param.use_32x_scaling = 1;
3182 gpe_context = &priv_ctx->scaling_context.gpe_contexts[gpe_idx];
3183 gen8_gpe_context_init(ctx, gpe_context);
3184 gen9_gpe_reset_binding_table(ctx, gpe_context);
3185 gen9_hevc_scaling_set_curbe(&scaling_param, gpe_context);
3187 if (hme_type == HEVC_HME_32X) {
3188 scaling_param.scaling_out_use_16unorm_surf_fmt = 1;
3189 scaling_param.scaling_out_use_32unorm_surf_fmt = 0;
3191 scaling_param.scaling_out_use_16unorm_surf_fmt = 0;
3192 scaling_param.scaling_out_use_32unorm_surf_fmt = 1;
3195 gen9_hevc_scaling_set_surfaces(ctx, encode_state, encoder_context, &scaling_param,
3197 gen8_gpe_setup_interface_data(ctx, gpe_context);
3199 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
3200 if (hme_type == HEVC_HME_32X) {
3201 hevc_walker_param.resolution_x = downscaled_width_in_mb;
3202 hevc_walker_param.resolution_y = downscaled_height_in_mb;
3204 hevc_walker_param.resolution_x = downscaled_width_in_mb * 2;
3205 hevc_walker_param.resolution_y = downscaled_height_in_mb * 2;
3207 hevc_walker_param.no_dependency = 1;
3208 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
3209 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
3214 gen9_hevc_hme_scaling(VADriverContextP ctx,
3215 struct encode_state *encode_state,
3216 struct intel_encoder_context *encoder_context)
3218 struct encoder_vme_mfc_context *vme_context = NULL;
3219 struct generic_enc_codec_state *generic_state = NULL;
3220 struct gen9_hevc_encoder_state *priv_state = NULL;
3222 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3223 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3224 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3226 if (priv_state->bit_depth_luma_minus8)
3227 gen9_hevc_frame_depth_conversion(ctx, encode_state, encoder_context,
3228 encode_state->input_yuv_object,
3229 encode_state->reconstructed_object,
3230 HEVC_ENC_2xDS_4xDS_STAGE);
3232 gen9_hevc_kernel_scaling(ctx, encode_state, encoder_context, HEVC_HME_4X);
3234 if (generic_state->b16xme_supported) {
3235 gen9_hevc_kernel_scaling(ctx, encode_state, encoder_context, HEVC_HME_16X);
3237 if (generic_state->b32xme_supported)
3238 gen9_hevc_kernel_scaling(ctx, encode_state, encoder_context, HEVC_HME_32X);
3242 // ME implementation
3245 gen9_hevc_me_set_curbe(VADriverContextP ctx,
3246 struct encode_state *encode_state,
3247 struct intel_encoder_context *encoder_context,
3248 enum HEVC_HME_TYPE hme_type,
3249 struct i965_gpe_context *gpe_context)
3251 struct encoder_vme_mfc_context *vme_context = NULL;
3252 struct generic_enc_codec_state *generic_state = NULL;
3253 struct gen9_hevc_encoder_state *priv_state = NULL;
3254 gen9_hevc_me_curbe_data *cmd = NULL;
3255 VAEncPictureParameterBufferHEVC *pic_param = NULL;
3256 VAEncSliceParameterBufferHEVC *slice_param = NULL;
3257 unsigned int use_mv_from_prev_step = 0;
3258 unsigned int write_distortions = 0;
3259 unsigned int slice_qp = 0;
3260 unsigned int me_method = 0;
3261 unsigned int mv_shift_factor = 0, prev_mv_read_pos_factor = 0;
3262 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
3264 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3265 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3266 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3267 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
3268 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
3272 use_mv_from_prev_step = (generic_state->b16xme_enabled) ? 1 : 0;;
3273 write_distortions = 1;
3274 mv_shift_factor = 2;
3275 prev_mv_read_pos_factor = 0;
3276 downscaled_width_in_mb = ALIGN(priv_state->picture_width / 4, 16) / 16;
3277 downscaled_height_in_mb = ALIGN(priv_state->picture_height / 4, 16) / 16;
3280 use_mv_from_prev_step = (generic_state->b32xme_enabled) ? 1 : 0;
3281 write_distortions = 0;
3282 mv_shift_factor = 2;
3283 prev_mv_read_pos_factor = 1;
3284 downscaled_width_in_mb = ALIGN(priv_state->picture_width / 16, 16) / 16;
3285 downscaled_height_in_mb = ALIGN(priv_state->picture_height / 16, 16) / 16;
3288 use_mv_from_prev_step = 0;
3289 write_distortions = 0;
3290 mv_shift_factor = 1;
3291 prev_mv_read_pos_factor = 0;
3292 downscaled_width_in_mb = ALIGN(priv_state->picture_width / 32, 16) / 16;
3293 downscaled_height_in_mb = ALIGN(priv_state->picture_height / 32, 16) / 16;
3299 me_method = GEN9_HEVC_ME_METHOD[priv_state->tu_mode];
3300 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
3302 cmd = i965_gpe_context_map_curbe(gpe_context);
3306 memcpy((void *)cmd, GEN9_HEVC_ME_INIT_CURBE_DATA, sizeof(gen9_hevc_me_curbe_data));
3308 cmd->dw3.sub_pel_mode = 3;
3309 cmd->dw4.picture_height_minus1 = downscaled_height_in_mb - 1;
3310 cmd->dw4.picture_width = downscaled_width_in_mb;
3311 cmd->dw5.qp_prime_y = slice_qp;
3312 cmd->dw6.use_mv_from_prev_step = use_mv_from_prev_step;
3313 cmd->dw6.write_distortions = write_distortions;
3314 cmd->dw6.super_combine_dist = GEN9_HEVC_SUPER_COMBINE_DIST[priv_state->tu_mode];
3315 cmd->dw6.max_vmvr = 512;
3317 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
3318 cmd->dw13.num_ref_idx_l0_minus1 = slice_param->num_ref_idx_l0_active_minus1;
3319 if (priv_state->picture_coding_type == HEVC_SLICE_B) {
3320 cmd->dw1.bi_weight = 32;
3321 cmd->dw13.num_ref_idx_l1_minus1 = slice_param->num_ref_idx_l1_active_minus1;
3325 cmd->dw15.prev_mv_read_pos_factor = prev_mv_read_pos_factor;
3326 cmd->dw15.mv_shift_factor = mv_shift_factor;
3328 memcpy(&cmd->dw16, table_enc_search_path[GEN9_HEVC_ENC_MEMETHOD_TABLE][me_method], 14 * sizeof(unsigned int));
3330 cmd->dw32._4x_memv_output_data_surf_index = GEN9_HEVC_ME_MV_DATA_SURFACE_INDEX;
3331 cmd->dw33._16x_32x_memv_input_data_surf_index = (hme_type == HEVC_HME_32X) ?
3332 GEN9_HEVC_ME_32X_MV_DATA_SURFACE_INDEX : GEN9_HEVC_ME_16X_MV_DATA_SURFACE_INDEX;
3333 cmd->dw34._4x_me_output_dist_surf_index = GEN9_HEVC_ME_DISTORTION_SURFACE_INDEX;
3334 cmd->dw35._4x_me_output_brc_dist_surf_index = GEN9_HEVC_ME_BRC_DISTORTION_INDEX;
3335 cmd->dw36.vme_fwd_inter_pred_surf_index = GEN9_HEVC_ME_CURR_FOR_FWD_REF_INDEX;
3336 cmd->dw37.vme_bdw_inter_pred_surf_index = GEN9_HEVC_ME_CURR_FOR_BWD_REF_INDEX;
3338 i965_gpe_context_unmap_curbe(gpe_context);
3342 gen9_hevc_me_set_surfaces(VADriverContextP ctx,
3343 struct encode_state *encode_state,
3344 struct intel_encoder_context *encoder_context,
3345 enum HEVC_HME_TYPE hme_type,
3346 struct i965_gpe_context *gpe_context)
3348 struct i965_driver_data *i965 = i965_driver_data(ctx);
3349 struct encoder_vme_mfc_context *vme_context = NULL;
3350 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3351 struct generic_enc_codec_state *generic_state = NULL;
3352 VAEncSliceParameterBufferHEVC *slice_param = NULL;
3353 struct gen9_hevc_surface_priv *surface_priv = NULL;
3354 struct object_surface *obj_surface = NULL;
3355 int scaled_surf_id = VA_INVALID_SURFACE, surface_id = VA_INVALID_SURFACE;
3358 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3359 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3360 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3361 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
3365 scaled_surf_id = HEVC_SCALED_SURF_4X_ID;
3366 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3367 &priv_ctx->s4x_memv_data_buffer,
3369 I965_SURFACEFORMAT_R8_UNORM,
3370 GEN9_HEVC_ME_MV_DATA_SURFACE_INDEX);
3372 if (generic_state->b16xme_enabled)
3373 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3374 &priv_ctx->s16x_memv_data_buffer,
3376 I965_SURFACEFORMAT_R8_UNORM,
3377 GEN9_HEVC_ME_16X_MV_DATA_SURFACE_INDEX);
3379 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3380 &priv_ctx->res_brc_me_dist_buffer,
3382 I965_SURFACEFORMAT_R8_UNORM,
3383 GEN9_HEVC_ME_BRC_DISTORTION_INDEX);
3385 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3386 &priv_ctx->s4x_memv_distortion_buffer,
3388 I965_SURFACEFORMAT_R8_UNORM,
3389 GEN9_HEVC_ME_DISTORTION_SURFACE_INDEX);
3392 scaled_surf_id = HEVC_SCALED_SURF_16X_ID;
3394 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3395 &priv_ctx->s16x_memv_data_buffer,
3397 I965_SURFACEFORMAT_R8_UNORM,
3398 GEN9_HEVC_ME_MV_DATA_SURFACE_INDEX);
3400 if (generic_state->b32xme_enabled)
3401 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3402 &priv_ctx->s32x_memv_data_buffer,
3404 I965_SURFACEFORMAT_R8_UNORM,
3405 GEN9_HEVC_ME_32X_MV_DATA_SURFACE_INDEX);
3407 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3408 &priv_ctx->s16x_memv_data_buffer,
3410 I965_SURFACEFORMAT_R8_UNORM,
3411 GEN9_HEVC_ME_16X_MV_DATA_SURFACE_INDEX);
3414 scaled_surf_id = HEVC_SCALED_SURF_32X_ID;
3415 gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
3416 &priv_ctx->s32x_memv_data_buffer,
3418 I965_SURFACEFORMAT_R8_UNORM,
3419 GEN9_HEVC_ME_MV_DATA_SURFACE_INDEX);
3425 obj_surface = encode_state->reconstructed_object;
3426 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
3427 gen9_add_adv_gpe_surface(ctx, gpe_context,
3428 surface_priv->scaled_surface_obj[scaled_surf_id],
3429 GEN9_HEVC_ME_CURR_FOR_FWD_REF_INDEX);
3431 for (i = 0; i < slice_param->num_ref_idx_l0_active_minus1 + 1; i++) {
3432 surface_id = slice_param->ref_pic_list0[i].picture_id;
3433 obj_surface = SURFACE(surface_id);
3434 if (!obj_surface || !obj_surface->private_data)
3437 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
3438 gen9_add_adv_gpe_surface(ctx, gpe_context,
3439 surface_priv->scaled_surface_obj[scaled_surf_id],
3440 GEN9_HEVC_ME_CURR_FOR_FWD_REF_INDEX + i * 2 + 1);
3443 obj_surface = encode_state->reconstructed_object;
3444 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
3445 gen9_add_adv_gpe_surface(ctx, gpe_context,
3446 surface_priv->scaled_surface_obj[scaled_surf_id],
3447 GEN9_HEVC_ME_CURR_FOR_BWD_REF_INDEX);
3449 for (i = 0; i < slice_param->num_ref_idx_l1_active_minus1 + 1; i++) {
3450 surface_id = slice_param->ref_pic_list1[i].picture_id;
3451 obj_surface = SURFACE(surface_id);
3452 if (!obj_surface || !obj_surface->private_data)
3455 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
3456 gen9_add_adv_gpe_surface(ctx, gpe_context,
3457 surface_priv->scaled_surface_obj[scaled_surf_id],
3458 GEN9_HEVC_ME_CURR_FOR_BWD_REF_INDEX + i * 2 + 1);
3463 gen9_hevc_kernel_me(VADriverContextP ctx,
3464 struct encode_state *encode_state,
3465 struct intel_encoder_context *encoder_context,
3466 enum HEVC_HME_TYPE hme_type)
3468 struct encoder_vme_mfc_context *vme_context = NULL;
3469 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3470 struct gen9_hevc_encoder_state *priv_state = NULL;
3471 struct gpe_media_object_walker_parameter param;
3472 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
3473 unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
3474 struct i965_gpe_context *gpe_context;
3475 int media_state = 0;
3477 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3478 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3479 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3483 media_state = HEVC_ENC_MEDIA_STATE_4X_ME;
3484 downscaled_width_in_mb = priv_state->downscaled_width_4x_in_mb;
3485 downscaled_height_in_mb = priv_state->downscaled_height_4x_in_mb;
3488 media_state = HEVC_ENC_MEDIA_STATE_16X_ME;
3489 downscaled_width_in_mb = priv_state->downscaled_width_16x_in_mb;
3490 downscaled_height_in_mb = priv_state->downscaled_height_16x_in_mb;
3493 media_state = HEVC_ENC_MEDIA_STATE_32X_ME;
3494 downscaled_width_in_mb = priv_state->downscaled_width_32x_in_mb;
3495 downscaled_height_in_mb = priv_state->downscaled_height_32x_in_mb;
3501 if (priv_state->picture_coding_type == HEVC_SLICE_P)
3502 gpe_context = &priv_ctx->me_context.gpe_context[hme_type][HEVC_ENC_ME_P];
3504 gpe_context = &priv_ctx->me_context.gpe_context[hme_type][HEVC_ENC_ME_B];
3506 gen8_gpe_context_init(ctx, gpe_context);
3507 gen9_gpe_reset_binding_table(ctx, gpe_context);
3508 gen9_hevc_me_set_curbe(ctx, encode_state, encoder_context, hme_type, gpe_context);
3509 gen9_hevc_me_set_surfaces(ctx, encode_state, encoder_context, hme_type, gpe_context);
3510 gen8_gpe_setup_interface_data(ctx, gpe_context);
3512 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
3513 hevc_walker_param.resolution_x = downscaled_width_in_mb;
3514 hevc_walker_param.resolution_y = downscaled_height_in_mb;
3515 hevc_walker_param.no_dependency = 1;
3516 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
3518 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
3523 gen9_hevc_hme_encode_me(VADriverContextP ctx,
3524 struct encode_state *encode_state,
3525 struct intel_encoder_context *encoder_context)
3527 struct encoder_vme_mfc_context *vme_context = NULL;
3528 struct generic_enc_codec_state *generic_state = NULL;
3530 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3531 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3533 if (generic_state->b16xme_enabled) {
3534 if (generic_state->b32xme_enabled)
3535 gen9_hevc_kernel_me(ctx, encode_state, encoder_context, HEVC_HME_32X);
3537 gen9_hevc_kernel_me(ctx, encode_state, encoder_context, HEVC_HME_16X);
3540 gen9_hevc_kernel_me(ctx, encode_state, encoder_context, HEVC_HME_4X);
3543 // MBENC kernels setting start
3545 static unsigned char
3546 map_44_lut_value(unsigned int value,
3549 unsigned int max_cost = 0;
3551 unsigned char ret = 0;
3556 max_cost = ((max & 15) << (max >> 4));
3557 if (value >= max_cost)
3560 data = (int)(log((double)value) / log(2.)) - 3;
3564 ret = (unsigned char)((data << 4) +
3565 (int)((value + (data == 0 ? 0 : (1 << (data - 1)))) >> data));
3566 ret = (ret & 0xf) == 0 ? (ret | 8) : ret;
3572 gen9_hevc_mbenc_set_costs(struct gen9_hevc_encoder_context *priv_ctx,
3574 int intra_trans_type,
3575 unsigned int slice_qp,
3576 unsigned char *mode_cost,
3577 unsigned char *mv_cost,
3578 unsigned char *mode_cost_sp,
3579 unsigned int *simplest_intra_inter_threshold)
3581 float had_bias = intra_trans_type == HEVC_ENC_INTRA_TRANS_HADAMARD ?
3583 double lambda_md, lambda_me;
3585 lambda_md = priv_ctx->lambda_md_table[slice_type][slice_qp];
3586 lambda_me = priv_ctx->lambda_md_table[slice_type][slice_qp];
3589 mode_cost[0] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][0] * had_bias), 0x6f);
3590 mode_cost[1] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][1] * had_bias), 0x8f);
3591 mode_cost[2] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][2] * had_bias), 0x8f);
3592 mode_cost[3] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][3] * had_bias), 0x8f);
3593 mode_cost[4] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][4] * had_bias), 0x8f);
3594 mode_cost[5] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][5] * had_bias), 0x6f);
3595 mode_cost[6] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][6] * had_bias), 0x6f);
3596 mode_cost[7] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][7] * had_bias), 0x6f);
3597 mode_cost[8] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][8] * had_bias), 0x8f);
3598 mode_cost[9] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][9] * had_bias), 0x6f);
3599 mode_cost[10] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][10] * had_bias), 0x6f);
3600 mode_cost[11] = map_44_lut_value((unsigned int)(lambda_md * GEN9_HEVC_ENC_Mode_COST[slice_type][11] * had_bias), 0x6f);
3604 mv_cost[0] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][0] * had_bias), 0x6f);
3605 mv_cost[1] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][1] * had_bias), 0x6f);
3606 mv_cost[2] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][2] * had_bias), 0x6f);
3607 mv_cost[3] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][3] * had_bias), 0x6f);
3608 mv_cost[4] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][4] * had_bias), 0x6f);
3609 mv_cost[5] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][5] * had_bias), 0x6f);
3610 mv_cost[6] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][6] * had_bias), 0x6f);
3611 mv_cost[7] = map_44_lut_value((unsigned int)(lambda_me * GEN9_HEVC_ENC_MV_COST[slice_type][7] * had_bias), 0x6f);
3615 *mode_cost_sp = map_44_lut_value((unsigned int)(lambda_md * 45 * had_bias), 0x8f);
3617 if (simplest_intra_inter_threshold) {
3618 lambda_md *= had_bias;
3619 *simplest_intra_inter_threshold = 0;
3620 if (GEN9_HEVC_ENC_Mode_COST[slice_type][1] < GEN9_HEVC_ENC_Mode_COST[slice_type][3])
3621 *simplest_intra_inter_threshold = (unsigned int)(lambda_md *
3622 (GEN9_HEVC_ENC_Mode_COST[slice_type][3] - GEN9_HEVC_ENC_Mode_COST[slice_type][1]) + 0.5);
3627 gen9_hevc_set_lambda_tables(struct gen9_hevc_encoder_context *priv_ctx,
3629 int intra_trans_type)
3631 if (slice_type != HEVC_SLICE_I) {
3632 if (priv_ctx->lambda_table_inited)
3635 memcpy((void *)&priv_ctx->lambda_me_table[slice_type], &GEN9_HEVC_ENC_QP_LAMBDA_ME[slice_type],
3636 sizeof(GEN9_HEVC_ENC_QP_LAMBDA_ME[slice_type]));
3637 memcpy((void *)&priv_ctx->lambda_md_table[slice_type], &GEN9_HEVC_ENC_QP_LAMBDA_ME[slice_type],
3638 sizeof(GEN9_HEVC_ENC_QP_LAMBDA_ME[slice_type]));
3639 } else if (intra_trans_type != priv_ctx->lambda_intra_trans_type ||
3640 !priv_ctx->lambda_table_inited) {
3642 double lambda = 0.0;
3645 for (qp = 0; qp < 52; qp++) {
3646 temp = (double)qp - 12;
3647 lambda = 0.85 * pow(2.0, temp / 3.0);
3649 if ((intra_trans_type != HEVC_ENC_INTRA_TRANS_HAAR) &&
3650 (intra_trans_type != HEVC_ENC_INTRA_TRANS_HADAMARD))
3653 priv_ctx->lambda_md_table[slice_type][qp] =
3654 priv_ctx->lambda_me_table[slice_type][qp] = sqrt(lambda);
3657 priv_ctx->lambda_intra_trans_type = intra_trans_type;
3662 gen9_hevc_lambda_tables_init(struct gen9_hevc_encoder_context *priv_ctx)
3664 gen9_hevc_set_lambda_tables(priv_ctx, HEVC_SLICE_B, HEVC_ENC_INTRA_TRANS_HAAR);
3665 gen9_hevc_set_lambda_tables(priv_ctx, HEVC_SLICE_P, HEVC_ENC_INTRA_TRANS_HAAR);
3666 gen9_hevc_set_lambda_tables(priv_ctx, HEVC_SLICE_I, HEVC_ENC_INTRA_TRANS_HAAR);
3668 priv_ctx->lambda_table_inited = 1;
3672 gen9_hevc_8x8_b_pak_set_curbe(VADriverContextP ctx,
3673 struct encode_state *encode_state,
3674 struct intel_encoder_context *encoder_context,
3675 struct i965_gpe_context *gpe_context)
3677 struct i965_driver_data *i965 = i965_driver_data(ctx);
3678 struct encoder_vme_mfc_context *vme_context = NULL;
3679 struct generic_enc_codec_state *generic_state = NULL;
3680 struct gen9_hevc_encoder_state *priv_state = NULL;
3681 gen9_hevc_mbenc_b_pak_curbe_data *cmd = NULL;
3682 VAEncPictureParameterBufferHEVC *pic_param = NULL;
3683 VAEncSliceParameterBufferHEVC *slice_param = NULL;
3684 unsigned int slice_qp = 0;
3687 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3688 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
3689 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3690 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
3691 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
3693 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
3694 cmd = i965_gpe_context_map_curbe(gpe_context);
3698 memset((void *)cmd, 0, sizeof(*cmd));
3700 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
3701 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
3702 cmd->dw1.max_vmvr = 511 * 4;
3703 cmd->dw1.qp = slice_qp;
3704 cmd->dw2.brc_enable = generic_state->brc_enabled;
3705 cmd->dw2.lcu_brc_enable = priv_state->lcu_brc_enabled;
3706 cmd->dw2.screen_content = !!pic_param->pic_fields.bits.screen_content_flag;
3707 cmd->dw2.slice_type = priv_state->picture_coding_type;
3708 cmd->dw2.roi_enable = (priv_state->num_roi > 0);
3709 cmd->dw2.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
3710 0 : priv_state->video_surveillance_flag;
3711 cmd->dw2.kbl_control_flag = (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info));
3712 cmd->dw2.enable_rolling_intra = priv_state->rolling_intra_refresh;
3713 cmd->dw3.widi_intra_refresh_qp_delta = priv_state->widi_intra_refresh_qp_delta;
3714 cmd->dw3.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
3715 cmd->dw3.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
3717 cmd->dw16.bti_cu_record = bti_idx++;
3718 cmd->dw17.bti_pak_obj = bti_idx++;
3719 cmd->dw18.bti_slice_map = bti_idx++;
3720 cmd->dw19.bti_brc_input = bti_idx++;
3721 cmd->dw20.bti_lcu_qp = bti_idx++;
3722 cmd->dw21.bti_brc_data = bti_idx++;
3723 cmd->dw22.bti_mb_data = bti_idx++;
3724 cmd->dw23.bti_mvp_surface = bti_idx++;
3725 cmd->dw24.bti_debug = bti_idx++;
3727 i965_gpe_context_unmap_curbe(gpe_context);
3731 gen9_hevc_8x8_b_pak_set_surfaces(VADriverContextP ctx,
3732 struct encode_state *encode_state,
3733 struct intel_encoder_context *encoder_context,
3734 struct i965_gpe_context *gpe_context)
3736 struct encoder_vme_mfc_context *vme_context = NULL;
3737 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3738 struct gen9_hevc_encoder_state *priv_state = NULL;
3742 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3743 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3744 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3746 size = priv_state->width_in_cu * priv_state->height_in_cu *
3747 priv_state->cu_record_size;
3748 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3749 HEVC_ENC_SURFACE_CU_RECORD, bti_idx++,
3750 0, size, priv_state->mb_data_offset, NULL, NULL);
3752 size = priv_state->mb_data_offset;
3753 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3754 HEVC_ENC_SURFACE_HCP_PAK, bti_idx++,
3755 0, size, 0, NULL, NULL);
3757 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
3758 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
3759 0, 1, I965_SURFACEFORMAT_R8_UNORM,
3762 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3763 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
3764 0, 0, 0, NULL, NULL);
3766 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
3767 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
3768 0, 1, I965_SURFACEFORMAT_R8_UNORM,
3771 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
3772 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
3773 0, 1, I965_SURFACEFORMAT_R8_UNORM,
3776 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3777 HEVC_ENC_SURFACE_MB_MV_INDEX, bti_idx++,
3778 0, 0, 0, NULL, NULL);
3780 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3781 HEVC_ENC_SURFACE_MVP_INDEX, bti_idx++,
3782 0, 0, 0, NULL, NULL);
3784 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
3785 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
3786 0, 0, 0, NULL, NULL);
3790 gen9_hevc_8x8_b_pak(VADriverContextP ctx,
3791 struct encode_state *encode_state,
3792 struct intel_encoder_context *encoder_context)
3794 struct encoder_vme_mfc_context *vme_context = NULL;
3795 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3796 struct gen9_hevc_encoder_state *priv_state = NULL;
3797 struct gpe_media_object_walker_parameter param;
3798 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
3799 struct i965_gpe_context *gpe_context = NULL;
3800 int media_state = HEVC_ENC_MEDIA_STATE_HEVC_B_PAK;
3802 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3803 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3804 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3806 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_BPAK_IDX];
3808 gen8_gpe_context_init(ctx, gpe_context);
3809 gen9_gpe_reset_binding_table(ctx, gpe_context);
3810 gen9_hevc_8x8_b_pak_set_curbe(ctx, encode_state, encoder_context, gpe_context);
3811 gen9_hevc_8x8_b_pak_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
3812 gen8_gpe_setup_interface_data(ctx, gpe_context);
3814 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
3815 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
3816 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
3817 hevc_walker_param.no_dependency = 1;
3818 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
3819 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
3823 static const unsigned char ftq_25i[27] = {
3833 gen9_hevc_set_forward_coeff_thd(unsigned char *pcoeff,
3836 int idx = (qp + 1) >> 1;
3838 memset((void *)pcoeff, ftq_25i[idx], 7);
3842 gen9_hevc_get_qp_from_ref_list(VADriverContextP ctx,
3843 VAEncSliceParameterBufferHEVC *slice_param,
3847 struct i965_driver_data *i965 = i965_driver_data(ctx);
3848 struct gen9_hevc_surface_priv *hevc_priv_surface = NULL;
3849 struct object_surface *obj_surface = NULL;
3850 VASurfaceID surface_id;
3852 if (list_idx == 0) {
3853 if (ref_frame_idx < slice_param->num_ref_idx_l0_active_minus1 + 1)
3854 surface_id = slice_param->ref_pic_list0[ref_frame_idx].picture_id;
3858 if (ref_frame_idx < slice_param->num_ref_idx_l1_active_minus1 + 1)
3859 surface_id = slice_param->ref_pic_list1[ref_frame_idx].picture_id;
3864 obj_surface = SURFACE(surface_id);
3865 if (obj_surface && obj_surface->private_data) {
3866 hevc_priv_surface = obj_surface->private_data;
3867 return hevc_priv_surface->qp_value;
3875 gen9_hevc_get_poc_diff_from_ref_list(VAEncPictureParameterBufferHEVC *pic_param,
3876 VAEncSliceParameterBufferHEVC *slice_param,
3882 if (list_idx == 0 &&
3883 ref_frame_idx < slice_param->num_ref_idx_l0_active_minus1 + 1)
3884 poc_diff = pic_param->decoded_curr_pic.pic_order_cnt -
3885 slice_param->ref_pic_list0[ref_frame_idx].pic_order_cnt;
3886 else if (list_idx == 1 &&
3887 ref_frame_idx < slice_param->num_ref_idx_l1_active_minus1 + 1)
3888 poc_diff = pic_param->decoded_curr_pic.pic_order_cnt -
3889 slice_param->ref_pic_list1[ref_frame_idx].pic_order_cnt;
3891 return CLAMP(-128, 127, poc_diff);
3895 gen9_hevc_set_control_region(VADriverContextP ctx,
3896 struct encode_state *encode_state,
3897 struct intel_encoder_context *encoder_context,
3898 struct i965_gpe_context *gpe_context,
3899 struct gen9_hevc_walking_pattern_parameter *param)
3901 struct encoder_vme_mfc_context *vme_context = NULL;
3902 struct gen9_hevc_encoder_context *priv_ctx = NULL;
3903 struct gen9_hevc_encoder_state *priv_state = NULL;
3904 VAEncSliceParameterBufferHEVC *slice_param = NULL;
3905 gen9_hevc_mbenc_control_region *p_region = NULL;
3906 unsigned int slice, num_regions, height, num_slices, num_units_in_region;
3907 unsigned int frame_width_in_units, frame_height_in_units;
3908 unsigned short region_start_table[64];
3909 unsigned int offset_to_the_region_start[16];
3910 unsigned short temp_data[32][32];
3911 int is_arbitrary_slices = 0;
3912 int slice_start_y[NUM_SLICES + 1];
3916 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
3917 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
3918 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
3920 memset(slice_start_y, 0, sizeof(int) * (NUM_SLICES + 1));
3921 memset(region_start_table, 0, sizeof(region_start_table));
3922 memset(temp_data, 0, sizeof(temp_data));
3923 memset(offset_to_the_region_start, 0, sizeof(offset_to_the_region_start));
3925 if (priv_state->num_regions_in_slice < 1)
3926 priv_state->num_regions_in_slice = 1;
3928 if (priv_state->num_regions_in_slice > 16)
3929 priv_state->num_regions_in_slice = 16;
3931 if (priv_state->walking_pattern_26) {
3932 frame_width_in_units = ALIGN(priv_state->picture_width, 16) / 16;
3933 frame_height_in_units = ALIGN(priv_state->picture_height, 16) / 16;
3935 frame_width_in_units = ALIGN(priv_state->picture_width, 32) / 32;
3936 frame_height_in_units = ALIGN(priv_state->picture_height, 32) / 32;
3939 for (slice = 0; slice < encode_state->num_slice_params_ext; slice++) {
3940 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice]->buffer;
3941 if (slice_param->slice_segment_address %
3942 ALIGN(priv_state->picture_width, 32)) {
3943 is_arbitrary_slices = 1;
3945 slice_start_y[slice] = slice_param->slice_segment_address /
3946 ALIGN(priv_state->picture_width, 32);
3948 if (priv_state->walking_pattern_26) {
3949 slice_start_y[slice] *= 2;
3954 slice_start_y[encode_state->num_slice_params_ext] = frame_height_in_units;
3956 region_start_table[0] = 0;
3957 region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + 0] = 0;
3960 if (is_arbitrary_slices) {
3961 height = frame_height_in_units;
3963 max_height = height;
3964 if (priv_state->num_regions_in_slice > 1) {
3965 num_units_in_region =
3966 (frame_width_in_units + 2 * (frame_height_in_units - 1) + priv_state->num_regions_in_slice - 1) / priv_state->num_regions_in_slice;
3968 num_regions = priv_state->num_regions_in_slice;
3970 for (i = 1; i < priv_state->num_regions_in_slice; i++) {
3971 unsigned int front = i * num_units_in_region;
3973 if (front < frame_width_in_units)
3974 region_start_table[i] = (unsigned int)front;
3975 else if (((front - frame_width_in_units + 1) & 1) == 0)
3976 region_start_table[i] = (unsigned int)frame_width_in_units - 1;
3978 region_start_table[i] = (unsigned int)frame_width_in_units - 2;
3980 region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + i] = (unsigned int)((front - region_start_table[i]) >> 1);
3985 int slice_is_merged = 0;
3988 num_slices = encode_state->num_slice_params_ext;
3990 for (slice = 0; slice < num_slices; slice++) {
3991 int sliceHeight = slice_start_y[slice + 1] - slice_start_y[slice];
3993 if (sliceHeight > max_height)
3994 max_height = sliceHeight;
3997 while (!slice_is_merged) {
3998 int newNumSlices = 1;
4002 for (slice = 1; slice < num_slices; slice++) {
4003 if ((slice_start_y[slice + 1] - start_y) <= max_height)
4004 slice_start_y[slice] = -1;
4006 start_y = slice_start_y[slice];
4009 for (slice = 1; slice < num_slices; slice++) {
4010 if (slice_start_y[slice] > 0) {
4011 slice_start_y[newNumSlices] = slice_start_y[slice];
4016 num_slices = newNumSlices;
4017 slice_start_y[num_slices] = frame_height_in_units;
4019 if (num_slices * priv_state->num_regions_in_slice <= GEN9_HEVC_MEDIA_WALKER_MAX_COLORS)
4020 slice_is_merged = 1;
4024 max_height = frame_height_in_units;
4026 for (slice = 0; slice < num_slices - 1; slice++) {
4027 if ((slice_start_y[slice + 2] - slice_start_y[slice]) <= max_height) {
4028 max_height = slice_start_y[slice + 2] - slice_start_y[slice];
4033 for (slice = num; slice < num_slices; slice++)
4034 slice_start_y[slice] = slice_start_y[slice + 1];
4040 num_units_in_region = (frame_width_in_units + 2 * (max_height - 1) + priv_state->num_regions_in_slice - 1) /
4041 priv_state->num_regions_in_slice;
4042 num_regions = num_slices * priv_state->num_regions_in_slice;
4044 for (slice = 0; slice < num_slices; slice++) {
4045 region_start_table[slice * priv_state->num_regions_in_slice] = 0;
4046 region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (slice * priv_state->num_regions_in_slice)] = (unsigned int)slice_start_y[slice];
4048 for (i = 1; i < priv_state->num_regions_in_slice; i++) {
4049 int front = i * num_units_in_region;
4051 if ((unsigned int)front < frame_width_in_units)
4052 region_start_table[slice * priv_state->num_regions_in_slice + i] = (unsigned int)front;
4053 else if (((front - frame_width_in_units + 1) & 1) == 0)
4054 region_start_table[slice * priv_state->num_regions_in_slice + i] = (unsigned int)frame_width_in_units - 1;
4056 region_start_table[slice * priv_state->num_regions_in_slice + i] = (unsigned int)frame_width_in_units - 2;
4058 region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (slice * priv_state->num_regions_in_slice + i)] = (unsigned int)slice_start_y[slice] +
4059 ((front - region_start_table[i]) >> 1);
4062 height = max_height;
4065 for (k = 0; k < num_slices; k++) {
4067 int nearest_reg = 0;
4068 int min_delta = priv_state->picture_height;
4070 if (priv_state->walking_pattern_26) {
4071 int cur_lcu_pel_y = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (k * priv_state->num_regions_in_slice)] << 4;
4072 int ts_width = priv_state->picture_width >> 4;
4073 int ts_height = height;
4074 int offset_y = -((ts_width + 1) >> 1);
4075 int offset_delta = ((ts_width + ((ts_height - 1) << 1)) + (priv_state->num_regions_in_slice - 1)) / (priv_state->num_regions_in_slice);
4077 for (i = 0; i < (int)num_regions; i++) {
4078 if (region_start_table[i] == 0) {
4079 int delta = cur_lcu_pel_y - (region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + i] << 4);
4082 if (delta < min_delta) {
4089 offset_to_the_region_start[k] = 2 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg];
4092 for (i = 0; i < priv_state->num_regions_in_slice; i++) {
4093 int tmp_y = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (nearest_reg + priv_state->num_regions_in_slice)];
4095 temp_data[k * priv_state->num_regions_in_slice + i][0] = region_start_table[nearest_reg + i];
4096 temp_data[k * priv_state->num_regions_in_slice + i][1] = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (nearest_reg + i)];
4097 temp_data[k * priv_state->num_regions_in_slice + i][2] = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg];
4098 temp_data[k * priv_state->num_regions_in_slice + i][3] = (unsigned int)((tmp_y != 0) ? tmp_y : (priv_state->picture_height) >> 4);
4099 temp_data[k * priv_state->num_regions_in_slice + i][4] = offset_to_the_region_start[k] & 0x0FFFF;
4100 temp_data[k * priv_state->num_regions_in_slice + i][5] = 0;
4101 temp_data[k * priv_state->num_regions_in_slice + i][6] = 0;
4102 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));
4105 int cur_lcu_pel_y = region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (k * priv_state->num_regions_in_slice)] << 5;
4106 int ts_width = (priv_state->picture_width + 16) >> 5;
4107 int ts_height = height;
4108 int offset_y = -4 * ((ts_width + 1) >> 1);
4109 int offset_delta = ((ts_width + ((ts_height - 1) << 1)) + (priv_state->num_regions_in_slice - 1)) / (priv_state->num_regions_in_slice);
4111 for (i = 0; i < (int)num_regions; i++) {
4112 if (region_start_table[i] == 0) {
4113 int delta = cur_lcu_pel_y - (region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + i] << 5);
4116 if (delta < min_delta) {
4123 offset_to_the_region_start[k] = 2 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg];
4126 for (i = 0; i < priv_state->num_regions_in_slice; i++) {
4127 int tmp_y = 2 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + (nearest_reg + priv_state->num_regions_in_slice)];
4129 temp_data[k * priv_state->num_regions_in_slice + i][0] = region_start_table[nearest_reg + i];
4130 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)];
4131 temp_data[k * priv_state->num_regions_in_slice + i][2] = 2 * region_start_table[GEN9_HEVC_ENC_REGION_START_Y_OFFSET + nearest_reg];
4132 temp_data[k * priv_state->num_regions_in_slice + i][3] = (unsigned int)((tmp_y != 0) ? tmp_y : (priv_state->picture_height) >> 4);
4133 temp_data[k * priv_state->num_regions_in_slice + i][4] = offset_to_the_region_start[k] & 0x0FFFF;
4134 temp_data[k * priv_state->num_regions_in_slice + i][5] = 0;
4135 temp_data[k * priv_state->num_regions_in_slice + i][6] = 0;
4136 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)));
4141 if (priv_state->walking_pattern_26)
4142 gen9_hevc_init_object_walker_26(priv_state, gpe_context, ¶m->gpe_param,
4143 priv_state->num_regions_in_slice, max_height,
4144 priv_state->use_hw_scoreboard,
4145 priv_state->use_hw_non_stalling_scoreborad);
4147 gen9_hevc_init_object_walker_26z(priv_state, gpe_context, ¶m->gpe_param,
4148 priv_state->num_regions_in_slice, max_height,
4149 priv_state->use_hw_scoreboard,
4150 priv_state->use_hw_non_stalling_scoreborad);
4152 p_region = (gen9_hevc_mbenc_control_region *)i965_map_gpe_resource(&priv_ctx->res_con_corrent_thread_buffer);
4156 memset((void *)p_region, 0, sizeof(*p_region) * GEN9_HEVC_ENC_CONCURRENT_SURFACE_HEIGHT);
4158 for (i = 0; i < 1024 ; i += 64)
4159 memcpy(((unsigned char *)p_region) + i, (unsigned char *)temp_data[i / 64], 32);
4161 param->max_height_in_region = priv_state->walking_pattern_26 ? max_height : max_height * 2;;
4162 param->num_region = num_regions;
4163 param->num_units_in_region = (frame_width_in_units + 2 * (max_height - 1) + priv_state->num_regions_in_slice - 1) /
4164 priv_state->num_regions_in_slice;
4166 i965_unmap_gpe_resource(&priv_ctx->res_con_corrent_thread_buffer);
4169 static const char hevc_qpc_table[22] = {
4170 29, 30, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 39
4174 gen9_hevc_8x8_b_mbenc_set_curbe(VADriverContextP ctx,
4175 struct encode_state *encode_state,
4176 struct intel_encoder_context *encoder_context,
4177 struct i965_gpe_context *gpe_context,
4178 struct gen9_hevc_walking_pattern_parameter *param)
4180 struct encoder_vme_mfc_context *vme_context = NULL;
4181 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4182 struct generic_enc_codec_state *generic_state = NULL;
4183 struct gen9_hevc_encoder_state *priv_state = NULL;
4184 gen9_hevc_mbenc_b_mb_enc_curbe_data *cmd = NULL;
4185 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
4186 VAEncPictureParameterBufferHEVC *pic_param = NULL;
4187 VAEncSliceParameterBufferHEVC *slice_param = NULL;
4188 unsigned int slice_qp = 0, slice_type = HEVC_SLICE_I;
4189 unsigned char mode_cost[12], mv_cost[8], mode_cost_sp;
4190 unsigned char forward_trans_thd[7];
4191 unsigned int simplest_intra_inter_threshold;
4192 int transform_8x8_mode_flag = 1;
4193 int qp_bd_offset_c, q_pi, qp_c;
4194 void *default_curbe_ptr = NULL;
4195 int default_curbe_size = 0;
4196 int max_sp_len = 57;
4199 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4200 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4201 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
4202 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4203 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
4204 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
4205 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
4207 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
4208 slice_type = priv_state->picture_coding_type;
4210 if (priv_state->tu_mode == HEVC_TU_BEST_SPEED) {
4211 gen9_hevc_set_lambda_tables(priv_ctx, slice_type,
4212 HEVC_ENC_INTRA_TRANS_HAAR);
4217 gen9_hevc_mbenc_set_costs(priv_ctx, slice_type, HEVC_ENC_INTRA_TRANS_REGULAR, slice_qp,
4218 mode_cost, mv_cost, &mode_cost_sp,
4219 &simplest_intra_inter_threshold);
4221 gen9_hevc_set_forward_coeff_thd(forward_trans_thd, slice_qp);
4223 gen9_hevc_get_b_mbenc_default_curbe(priv_state->tu_mode,
4224 slice_type, &default_curbe_ptr,
4225 &default_curbe_size);
4227 cmd = i965_gpe_context_map_curbe(gpe_context);
4231 memcpy((void *)cmd, default_curbe_ptr, default_curbe_size);
4233 cmd->dw0.adaptive_en = 1;
4234 cmd->dw0.t_8x8_flag_for_inter_en = transform_8x8_mode_flag;
4235 cmd->dw2.pic_width = priv_state->width_in_mb;
4236 cmd->dw2.len_sp = max_sp_len;
4237 cmd->dw3.src_access = 0;
4238 cmd->dw3.ref_access = 0;
4239 cmd->dw3.ft_enable = (HEVC_ENC_FTQ_BASED_SKIP[priv_state->tu_mode] >> 1) & 0x01;
4240 cmd->dw4.pic_height_minus1 = priv_state->height_in_mb - 1;
4241 cmd->dw4.hme_enable = !!generic_state->hme_enabled;
4242 cmd->dw4.slice_type = slice_type;
4243 cmd->dw4.use_actual_ref_qp_value = 0;
4244 cmd->dw6.frame_width = priv_state->width_in_mb * 16;
4245 cmd->dw6.frame_height = priv_state->height_in_mb * 16;
4246 cmd->dw7.intra_part_mask = 3;
4247 cmd->dw8.mode0_cost = mode_cost[0];
4248 cmd->dw8.mode1_cost = mode_cost[1];
4249 cmd->dw8.mode2_cost = mode_cost[2];
4250 cmd->dw8.mode3_cost = mode_cost[3];
4251 cmd->dw9.mode4_cost = mode_cost[4];
4252 cmd->dw9.mode5_cost = mode_cost[5];
4253 cmd->dw9.mode6_cost = mode_cost[6];
4254 cmd->dw9.mode7_cost = mode_cost[7];
4255 cmd->dw10.mode8_cost = mode_cost[8];
4256 cmd->dw10.mode9_cost = mode_cost[9];
4257 cmd->dw10.ref_id_cost = mode_cost[10];
4258 cmd->dw10.chroma_intra_mode_cost = mode_cost[11];
4259 cmd->dw11.mv0_cost = mv_cost[0];
4260 cmd->dw11.mv1_cost = mv_cost[1];
4261 cmd->dw11.mv2_cost = mv_cost[2];
4262 cmd->dw11.mv3_cost = mv_cost[3];
4263 cmd->dw12.mv4_cost = mv_cost[4];
4264 cmd->dw12.mv5_cost = mv_cost[5];
4265 cmd->dw12.mv6_cost = mv_cost[6];
4266 cmd->dw12.mv7_cost = mv_cost[7];
4268 cmd->dw13.qp_prime_y = slice_qp;
4269 qp_bd_offset_c = 6 * priv_state->bit_depth_chroma_minus8;
4270 q_pi = CLAMP(-qp_bd_offset_c, 51, slice_qp + pic_param->pps_cb_qp_offset);
4271 qp_c = (q_pi < 30) ? q_pi : hevc_qpc_table[q_pi - 30];
4272 cmd->dw13.qp_prime_cb = qp_c;
4273 q_pi = CLAMP(-qp_bd_offset_c, 51, slice_qp + pic_param->pps_cr_qp_offset);
4274 qp_c = (q_pi < 30) ? q_pi : hevc_qpc_table[q_pi - 30];
4275 cmd->dw13.qp_prime_cr = qp_c;
4277 cmd->dw14.sic_fwd_trans_coeff_thread_0 = forward_trans_thd[0];
4278 cmd->dw14.sic_fwd_trans_coeff_thread_1 = forward_trans_thd[1];
4279 cmd->dw14.sic_fwd_trans_coeff_thread_2 = forward_trans_thd[2];
4280 cmd->dw15.sic_fwd_trans_coeff_thread_3 = forward_trans_thd[3];
4281 cmd->dw15.sic_fwd_trans_coeff_thread_4 = forward_trans_thd[4];
4282 cmd->dw15.sic_fwd_trans_coeff_thread_5 = forward_trans_thd[5];
4283 cmd->dw15.sic_fwd_trans_coeff_thread_6 = forward_trans_thd[6];
4284 cmd->dw32.skip_val =
4285 HEVC_ENC_SKIPVAL_B[cmd->dw3.block_based_skip_enable][transform_8x8_mode_flag][slice_qp];
4287 if (priv_state->picture_coding_type == HEVC_SLICE_I)
4288 *(float *)&cmd->dw34.lambda_me = 0.0;
4290 *(float *)&cmd->dw34.lambda_me = (float)priv_ctx->lambda_me_table[slice_type][slice_qp];
4292 cmd->dw35.mode_cost_sp = mode_cost_sp;
4293 cmd->dw35.simp_intra_inter_threashold = simplest_intra_inter_threshold;
4294 cmd->dw36.num_refidx_l0_minus_one = slice_param->num_ref_idx_l0_active_minus1;
4295 cmd->dw36.num_refidx_l1_minus_one = slice_param->num_ref_idx_l1_active_minus1;
4296 cmd->dw36.brc_enable = !!generic_state->brc_enabled;
4297 cmd->dw36.lcu_brc_enable = !!priv_state->lcu_brc_enabled;
4298 cmd->dw36.power_saving = priv_state->power_saving;
4299 cmd->dw36.roi_enable = (priv_state->num_roi > 0);
4300 cmd->dw36.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
4301 0 : priv_state->video_surveillance_flag;
4303 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
4304 cmd->dw37.actual_qp_refid0_list0 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 0, 0);
4305 cmd->dw37.actual_qp_refid1_list0 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 0, 1);
4306 cmd->dw37.actual_qp_refid2_list0 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 0, 2);
4307 cmd->dw37.actual_qp_refid3_list0 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 0, 3);
4309 if (priv_state->picture_coding_type == HEVC_SLICE_B) {
4310 cmd->dw39.actual_qp_refid0_list1 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 1, 0);
4311 cmd->dw39.actual_qp_refid1_list1 = gen9_hevc_get_qp_from_ref_list(ctx, slice_param, 1, 1);
4315 cmd->dw44.max_vmvr = 511 * 4;
4316 cmd->dw44.max_num_merge_candidates = slice_param->max_num_merge_cand;
4318 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
4319 cmd->dw44.max_num_ref_list0 = cmd->dw36.num_refidx_l0_minus_one + 1;
4320 cmd->dw44.max_num_ref_list1 = cmd->dw36.num_refidx_l1_minus_one + 1;
4321 cmd->dw45.temporal_mvp_enable_flag = slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag;
4322 cmd->dw45.hme_combine_len_pslice = 8;
4323 if (priv_state->picture_coding_type == HEVC_SLICE_B)
4324 cmd->dw45.hme_combine_len_bslice = 8;
4327 cmd->dw45.log2_parallel_merge_level = pic_param->log2_parallel_merge_level_minus2 + 2;
4328 cmd->dw46.log2_min_tu_size = seq_param->log2_min_transform_block_size_minus2 + 2;
4329 cmd->dw46.log2_max_tu_size = cmd->dw46.log2_min_tu_size + seq_param->log2_diff_max_min_transform_block_size;
4330 cmd->dw46.log2_min_cu_size = seq_param->log2_min_luma_coding_block_size_minus3 + 3;
4331 cmd->dw46.log2_max_cu_size = cmd->dw46.log2_min_cu_size + seq_param->log2_diff_max_min_luma_coding_block_size;
4332 cmd->dw47.num_regions_in_slice = priv_state->num_regions_in_slice;
4333 cmd->dw47.type_of_walking_pattern = priv_state->walking_pattern_26;
4334 cmd->dw47.chroma_flatness_check_flag = (priv_state->tu_mode == HEVC_TU_BEST_SPEED) ? 0 : 1;
4335 cmd->dw47.enable_intra_early_exit = (priv_state->tu_mode == HEVC_TU_RT_SPEED);
4336 cmd->dw47.skip_intra_krn_flag = (priv_state->tu_mode == HEVC_TU_BEST_SPEED);
4337 cmd->dw47.collocated_from_l0_flag = slice_param->slice_fields.bits.collocated_from_l0_flag;
4338 cmd->dw47.is_low_delay = priv_state->low_delay;
4339 cmd->dw47.screen_content_flag = !!pic_param->pic_fields.bits.screen_content_flag;
4340 cmd->dw47.multi_slice_flag = (encode_state->num_slice_params_ext > 1);
4341 cmd->dw47.arbitary_slice_flag = priv_state->arbitrary_num_mb_in_slice;
4342 cmd->dw47.num_region_minus1 = param->num_region - 1;
4344 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
4345 cmd->dw48.current_td_l0_0 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 0, 0);
4346 cmd->dw48.current_td_l0_1 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 0, 1);
4347 cmd->dw49.current_td_l0_2 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 0, 2);
4348 cmd->dw49.current_td_l0_3 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 0, 3);
4350 if (priv_state->picture_coding_type == HEVC_SLICE_B) {
4351 cmd->dw50.current_td_l1_0 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 1, 0);
4352 cmd->dw50.current_td_l1_1 = gen9_hevc_get_poc_diff_from_ref_list(pic_param, slice_param, 1, 1);
4356 cmd->dw52.num_of_units_in_region = param->num_units_in_region;
4357 cmd->dw52.max_height_in_region = param->max_height_in_region;
4359 if (priv_state->rolling_intra_refresh) {
4360 cmd->dw35.widi_intra_refresh_en = 1;
4361 cmd->dw35.widi_first_intra_refresh = priv_state->widi_first_intra_refresh;
4362 cmd->dw35.half_update_mixed_lcu = 0;
4363 cmd->dw35.enable_rolling_intra = 1;
4364 cmd->dw38.widi_num_frame_in_gob = priv_state->widi_frame_num_in_gob;
4365 cmd->dw38.widi_num_intra_refresh_off_frames = priv_state->widi_frame_num_without_intra_refresh;
4366 cmd->dw51.widi_intra_refresh_qp_delta = priv_state->widi_intra_refresh_qp_delta;
4367 cmd->dw51.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
4368 cmd->dw51.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
4369 cmd->dw53.widi_intra_refresh_ref_height = 40;
4370 cmd->dw53.widi_intra_refresh_ref_width = 48;
4372 priv_state->widi_first_intra_refresh = 0;
4373 priv_state->widi_frame_num_without_intra_refresh = 0;
4374 } else if (priv_state->picture_coding_type != HEVC_SLICE_I)
4375 priv_state->widi_frame_num_without_intra_refresh++;
4377 cmd->dw56.bti_cu_record = bti_idx++;
4378 cmd->dw57.bti_pak_cmd = bti_idx++;
4379 cmd->dw58.bti_src_y = bti_idx++;
4381 cmd->dw59.bti_intra_dist = bti_idx++;
4382 cmd->dw60.bti_min_dist = bti_idx++;
4383 cmd->dw61.bti_hme_mv_pred_fwd_bwd_surf_index = bti_idx++;
4384 cmd->dw62.bti_hme_dist_surf_index = bti_idx++;
4385 cmd->dw63.bti_slice_map = bti_idx++;
4386 cmd->dw64.bti_vme_saved_uni_sic = bti_idx++;
4387 cmd->dw65.bti_simplest_intra = bti_idx++;
4388 cmd->dw66.bti_collocated_refframe = bti_idx++;
4389 cmd->dw67.bti_reserved = bti_idx++;
4390 cmd->dw68.bti_brc_input = bti_idx++;
4391 cmd->dw69.bti_lcu_qp = bti_idx++;
4392 cmd->dw70.bti_brc_data = bti_idx++;
4393 cmd->dw71.bti_vme_inter_prediction_surf_index = bti_idx++;
4396 if (priv_state->picture_coding_type == HEVC_SLICE_P) {
4397 cmd->dw72.bti_concurrent_thread_map = bti_idx++;
4398 cmd->dw73.bti_mb_data_cur_frame = bti_idx++;
4399 cmd->dw74.bti_mvp_cur_frame = bti_idx++;
4400 cmd->dw75.bti_debug = bti_idx++;
4402 cmd->dw72.bti_vme_inter_prediction_b_surf_index = bti_idx++;
4405 cmd->dw73.bti_concurrent_thread_map = bti_idx++;
4406 cmd->dw74.bti_mb_data_cur_frame = bti_idx++;
4407 cmd->dw75.bti_mvp_cur_frame = bti_idx++;
4408 cmd->dw76.bti_debug = bti_idx++;
4411 i965_gpe_context_unmap_curbe(gpe_context);
4415 gen9_hevc_8x8_b_mbenc_set_surfaces(VADriverContextP ctx,
4416 struct encode_state *encode_state,
4417 struct intel_encoder_context *encoder_context,
4418 struct i965_gpe_context *gpe_context)
4420 struct i965_driver_data *i965 = i965_driver_data(ctx);
4421 struct encoder_vme_mfc_context *vme_context = NULL;
4422 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4423 struct gen9_hevc_encoder_state *priv_state = NULL;
4424 VAEncSliceParameterBufferHEVC *slice_param = NULL;
4425 VAEncPictureParameterBufferHEVC *pic_param = NULL;
4426 struct gen9_hevc_surface_priv *surface_priv = NULL;
4427 struct object_surface *obj_surface = NULL;
4428 dri_bo *collocated_mv_temporal_bo = NULL;
4433 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4434 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4435 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4436 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
4437 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
4439 if (priv_state->picture_coding_type != HEVC_SLICE_I &&
4440 slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag &&
4441 slice_param->slice_fields.bits.collocated_from_l0_flag) {
4442 if (pic_param->collocated_ref_pic_index != 0xff &&
4443 pic_param->collocated_ref_pic_index < GEN9_MAX_REF_SURFACES) {
4444 VASurfaceID idx = VA_INVALID_SURFACE;
4446 idx = pic_param->reference_frames[pic_param->collocated_ref_pic_index].picture_id;
4447 obj_surface = SURFACE(idx);
4449 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
4451 collocated_mv_temporal_bo = surface_priv->motion_vector_temporal_bo;
4456 size = priv_state->width_in_cu * priv_state->height_in_cu *
4457 priv_state->cu_record_size;
4458 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4459 HEVC_ENC_SURFACE_CU_RECORD, bti_idx++,
4460 0, size, priv_state->mb_data_offset, NULL, NULL);
4462 size = priv_state->mb_data_offset;
4463 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4464 HEVC_ENC_SURFACE_HCP_PAK, bti_idx++,
4465 0, size, 0, NULL, NULL);
4467 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4468 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
4469 1, 1, I965_SURFACEFORMAT_R8_UNORM,
4473 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4474 HEVC_ENC_SURFACE_INTRA_DIST, bti_idx++,
4475 0, 0, 0, NULL, NULL);
4477 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4478 HEVC_ENC_SURFACE_MIN_DIST, bti_idx++,
4479 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4482 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4483 HEVC_ENC_SURFACE_HME_MVP, bti_idx++,
4484 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4487 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4488 HEVC_ENC_SURFACE_HME_DIST, bti_idx++,
4489 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4492 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4493 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
4494 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4497 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4498 HEVC_ENC_SURFACE_VME_UNI_SIC_DATA, bti_idx++,
4499 0, 0, 0, NULL, NULL);
4501 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4502 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
4503 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4506 if (collocated_mv_temporal_bo)
4507 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4508 HEVC_ENC_SURFACE_COL_MB_MV, bti_idx++,
4509 0, 0, 0, NULL, collocated_mv_temporal_bo);
4515 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4516 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
4517 0, 0, 0, NULL, NULL);
4519 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4520 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
4521 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4524 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4525 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
4526 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4529 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4530 HEVC_ENC_SURFACE_RAW_VME, bti_idx++,
4533 for (i = 0; i < 8; i++) {
4534 if (i <= slice_param->num_ref_idx_l0_active_minus1)
4535 obj_surface = SURFACE(slice_param->ref_pic_list0[i].picture_id);
4540 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
4542 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4543 HEVC_ENC_SURFACE_REF_FRAME_VME, bti_idx++,
4544 surface_priv->surface_reff);
4548 if (i <= slice_param->num_ref_idx_l1_active_minus1)
4549 obj_surface = SURFACE(slice_param->ref_pic_list1[i].picture_id);
4554 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
4556 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4557 HEVC_ENC_SURFACE_REF_FRAME_VME, bti_idx++,
4558 surface_priv->surface_reff);
4563 if (priv_state->picture_coding_type == HEVC_SLICE_B) {
4564 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4565 HEVC_ENC_SURFACE_RAW_VME, bti_idx++,
4568 for (i = 0; i < 4; i++) {
4569 if (i <= slice_param->num_ref_idx_l1_active_minus1)
4570 obj_surface = SURFACE(slice_param->ref_pic_list1[i].picture_id);
4575 surface_priv = (struct gen9_hevc_surface_priv *)obj_surface->private_data;
4577 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
4578 HEVC_ENC_SURFACE_REF_FRAME_VME, bti_idx++,
4579 surface_priv->surface_reff);
4587 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4588 HEVC_ENC_SURFACE_CONCURRENT_THREAD, bti_idx++,
4589 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4592 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4593 HEVC_ENC_SURFACE_MB_MV_INDEX, bti_idx++,
4594 0, 0, 0, NULL, NULL);
4596 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4597 HEVC_ENC_SURFACE_MVP_INDEX, bti_idx++,
4598 0, 0, 0, NULL, NULL);
4600 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4601 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
4602 0, 0, 0, NULL, NULL);
4606 gen9_hevc_8x8_b_mbenc(VADriverContextP ctx,
4607 struct encode_state *encode_state,
4608 struct intel_encoder_context *encoder_context)
4610 struct encoder_vme_mfc_context *vme_context = NULL;
4611 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4612 struct gen9_hevc_encoder_state *priv_state = NULL;
4613 struct gen9_hevc_walking_pattern_parameter param;
4614 struct i965_gpe_context *gpe_context = NULL;
4615 int media_state = HEVC_ENC_MEDIA_STATE_HEVC_B_MBENC;
4618 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4619 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4620 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4622 if (priv_state->picture_coding_type == HEVC_SLICE_P)
4623 gpe_idx = priv_state->rolling_intra_refresh ? HEVC_MBENC_P_WIDI_IDX : HEVC_MBENC_PENC_IDX;
4625 gpe_idx = priv_state->rolling_intra_refresh ? HEVC_MBENC_BENC_IDX : HEVC_MBENC_MBENC_WIDI_IDX;
4627 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[gpe_idx];
4629 gen8_gpe_context_init(ctx, gpe_context);
4630 gen9_gpe_reset_binding_table(ctx, gpe_context);
4632 memset((void *)¶m, 0, sizeof(param));
4633 gen9_hevc_set_control_region(ctx, encode_state, encoder_context, gpe_context, ¶m);
4635 gen9_hevc_8x8_b_mbenc_set_curbe(ctx, encode_state, encoder_context, gpe_context, ¶m);
4636 gen9_hevc_8x8_b_mbenc_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
4637 gen8_gpe_setup_interface_data(ctx, gpe_context);
4639 param.gpe_param.color_count_minus1 = param.num_region - 1;
4640 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m.gpe_param,
4645 gen9_hevc_8x8_pu_fmode_set_curbe(VADriverContextP ctx,
4646 struct encode_state *encode_state,
4647 struct intel_encoder_context *encoder_context,
4648 struct i965_gpe_context *gpe_context)
4650 struct i965_driver_data *i965 = i965_driver_data(ctx);
4651 struct encoder_vme_mfc_context *vme_context = NULL;
4652 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4653 struct generic_enc_codec_state *generic_state = NULL;
4654 struct gen9_hevc_encoder_state *priv_state = NULL;
4655 gen9_hevc_mbenc_8x8_pu_fmode_curbe_data *cmd = NULL;
4656 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
4657 VAEncPictureParameterBufferHEVC *pic_param = NULL;
4658 VAEncSliceParameterBufferHEVC *slice_param = NULL;
4659 unsigned int slice_qp = 0;
4662 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4663 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4664 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
4665 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4666 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
4667 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
4668 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
4670 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
4672 cmd = i965_gpe_context_map_curbe(gpe_context);
4676 memset((void *)cmd, 0, sizeof(*cmd));
4678 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
4679 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
4680 cmd->dw1.slice_type = priv_state->picture_coding_type;
4681 cmd->dw1.pu_type = 2;
4682 cmd->dw1.pak_reording_flag = priv_state->picture_coding_type == HEVC_SLICE_I ? 1 : 0;
4684 if (seq_param->log2_min_luma_coding_block_size_minus3 + 3 +
4685 seq_param->log2_diff_max_min_luma_coding_block_size == 6)
4686 cmd->dw1.lcu_type = 0;
4688 cmd->dw1.lcu_type = 1;
4690 cmd->dw1.screen_content_flag = !!pic_param->pic_fields.bits.screen_content_flag;
4691 cmd->dw1.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ?
4692 (priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1) : 0;
4693 cmd->dw1.enable_debug_dump = 0;
4694 cmd->dw1.brc_enable = generic_state->brc_enabled;
4695 cmd->dw1.lcu_brc_enable = priv_state->lcu_brc_enabled;
4696 cmd->dw1.roi_enable = (priv_state->num_roi > 0);
4697 cmd->dw1.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
4698 0 : priv_state->video_surveillance_flag;
4699 cmd->dw1.enable_rolling_intra = priv_state->rolling_intra_refresh;
4700 cmd->dw1.widi_intra_refresh_en = priv_state->rolling_intra_refresh;
4701 cmd->dw1.half_update_mixed_lcu = 0;
4702 cmd->dw2.luma_lambda = priv_state->fixed_point_lambda_for_luma;
4704 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
4706 float had_bias = 2.0f;
4708 lambda_md = priv_ctx->lambda_md_table[cmd->dw1.slice_type][slice_qp];
4709 lambda_md = lambda_md * had_bias;
4710 cmd->dw3.lambda_for_dist_calculation = (unsigned int)(lambda_md * (1 << 10));
4713 cmd->dw4.mode_cost_for_8x8_pu_tu8 = 0;
4714 cmd->dw5.mode_cost_for_8x8_pu_tu4 = 0;
4715 cmd->dw6.satd_16x16_pu_threshold = MAX(200 * ((int)slice_qp - 12), 0);
4716 cmd->dw6.bias_factor_toward_8x8 = pic_param->pic_fields.bits.screen_content_flag ? 1024 : 1126 + 102;
4717 cmd->dw7.qp = slice_qp;
4718 cmd->dw7.qp_for_inter = 0;
4719 cmd->dw8.simplified_flag_for_inter = 0;
4720 cmd->dw8.kbl_control_flag = (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info));
4721 cmd->dw9.widi_intra_refresh_qp_delta = priv_state->widi_intra_refresh_qp_delta;
4722 cmd->dw9.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
4723 cmd->dw9.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
4725 cmd->dw16.bti_pak_object = bti_idx++;
4726 cmd->dw17.bti_vme_8x8_mode = bti_idx++;
4727 cmd->dw18.bti_intra_mode = bti_idx++;
4728 cmd->dw19.bti_pak_command = bti_idx++;
4729 cmd->dw20.bti_slice_map = bti_idx++;
4730 cmd->dw21.bti_intra_dist = bti_idx++;
4731 cmd->dw22.bti_brc_input = bti_idx++;
4732 cmd->dw23.bti_simplest_intra = bti_idx++;
4733 cmd->dw24.bti_lcu_qp_surface = bti_idx++;
4734 cmd->dw25.bti_brc_data = bti_idx++;
4735 cmd->dw26.bti_debug = bti_idx++;
4737 i965_gpe_context_unmap_curbe(gpe_context);
4741 gen9_hevc_8x8_pu_fmode_set_surfaces(VADriverContextP ctx,
4742 struct encode_state *encode_state,
4743 struct intel_encoder_context *encoder_context,
4744 struct i965_gpe_context *gpe_context)
4746 struct encoder_vme_mfc_context *vme_context = NULL;
4747 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4748 struct gen9_hevc_encoder_state *priv_state = NULL;
4752 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4753 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4754 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4756 size = priv_state->width_in_cu * priv_state->height_in_cu *
4757 priv_state->cu_record_size;
4758 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4759 HEVC_ENC_SURFACE_CU_RECORD, bti_idx++,
4760 0, size, priv_state->mb_data_offset, NULL, NULL);
4762 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4763 HEVC_ENC_SURFACE_VME_8x8, bti_idx++,
4764 0, 0, 0, NULL, NULL);
4766 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4767 HEVC_ENC_SURFACE_INTRA_MODE, bti_idx++,
4768 0, 0, 0, NULL, NULL);
4770 size = priv_state->mb_data_offset;
4771 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4772 HEVC_ENC_SURFACE_HCP_PAK, bti_idx++,
4773 0, size, 0, NULL, NULL);
4775 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4776 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
4777 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4780 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4781 HEVC_ENC_SURFACE_INTRA_DIST, bti_idx++,
4782 0, 0, 0, NULL, NULL);
4784 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4785 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
4786 0, 0, 0, NULL, NULL);
4788 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4789 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
4790 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4793 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4794 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
4795 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4798 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4799 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
4800 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4803 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4804 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
4805 0, 0, 0, NULL, NULL);
4809 gen9_hevc_8x8_pu_fmode(VADriverContextP ctx,
4810 struct encode_state *encode_state,
4811 struct intel_encoder_context *encoder_context)
4813 struct encoder_vme_mfc_context *vme_context = NULL;
4814 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4815 struct gen9_hevc_encoder_state *priv_state = NULL;
4816 struct gpe_media_object_walker_parameter param;
4817 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
4818 struct i965_gpe_context *gpe_context = NULL;
4819 int media_state = HEVC_ENC_MEDIA_STATE_8x8_PU_FMODE;
4821 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4822 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4823 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4825 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_8x8FMODE_IDX];
4827 gen8_gpe_context_init(ctx, gpe_context);
4828 gen9_gpe_reset_binding_table(ctx, gpe_context);
4829 gen9_hevc_8x8_pu_fmode_set_curbe(ctx, encode_state, encoder_context, gpe_context);
4830 gen9_hevc_8x8_pu_fmode_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
4831 gen8_gpe_setup_interface_data(ctx, gpe_context);
4833 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
4834 hevc_walker_param.resolution_x = priv_state->width_in_lcu;
4835 hevc_walker_param.resolution_y = priv_state->height_in_lcu;
4836 hevc_walker_param.no_dependency = 1;
4837 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
4838 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
4843 gen9_hevc_8x8_pu_mode_set_curbe(VADriverContextP ctx,
4844 struct encode_state *encode_state,
4845 struct intel_encoder_context *encoder_context,
4846 struct i965_gpe_context *gpe_context)
4848 struct encoder_vme_mfc_context *vme_context = NULL;
4849 struct generic_enc_codec_state *generic_state = NULL;
4850 struct gen9_hevc_encoder_state *priv_state = NULL;
4851 gen9_hevc_mbenc_8x8_pu_curbe_data *cmd = NULL;
4852 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
4853 VAEncPictureParameterBufferHEVC *pic_param = NULL;
4854 VAEncSliceParameterBufferHEVC *slice_param = NULL;
4857 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4858 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
4859 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4860 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
4861 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
4862 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
4864 cmd = i965_gpe_context_map_curbe(gpe_context);
4868 memset((void *)cmd, 0, sizeof(*cmd));
4870 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
4871 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
4872 cmd->dw1.slice_type = priv_state->picture_coding_type;
4873 cmd->dw1.pu_type = 2;
4874 cmd->dw1.dc_filter_flag = 1;
4875 cmd->dw1.angle_refine_flag = 1;
4876 if (seq_param->log2_min_luma_coding_block_size_minus3 + 3 +
4877 seq_param->log2_diff_max_min_luma_coding_block_size == 6)
4878 cmd->dw1.lcu_type = 0;
4880 cmd->dw1.lcu_type = 1;
4881 cmd->dw1.screen_content_flag = !!pic_param->pic_fields.bits.screen_content_flag;
4882 cmd->dw1.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ?
4883 (priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1) : 0;
4884 cmd->dw1.enable_debug_dump = 0;
4885 cmd->dw1.brc_enable = generic_state->brc_enabled;
4886 cmd->dw1.lcu_brc_enable = priv_state->lcu_brc_enabled;
4887 cmd->dw1.roi_enable = (priv_state->num_roi > 0);
4888 cmd->dw1.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
4889 0 : priv_state->video_surveillance_flag;
4890 if (priv_state->rolling_intra_refresh) {
4891 cmd->dw1.enable_rolling_intra = 1;
4892 cmd->dw1.widi_intra_refresh_en = 1;
4893 cmd->dw1.half_update_mixed_lcu = 0;
4895 cmd->dw5.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
4896 cmd->dw5.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
4897 cmd->dw5.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
4899 cmd->dw1.qp_value = pic_param->pic_init_qp + slice_param->slice_qp_delta;
4902 cmd->dw2.luma_lambda = priv_state->fixed_point_lambda_for_luma;
4903 cmd->dw3.chroma_lambda = priv_state->fixed_point_lambda_for_chroma;
4904 cmd->dw4.simplified_flag_for_inter = 0;
4905 cmd->dw4.harr_trans_form_flag = priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1;
4907 cmd->dw8.bti_src_y = bti_idx++;
4909 cmd->dw9.bti_slice_map = bti_idx++;
4910 cmd->dw10.bti_vme_8x8_mode = bti_idx++;
4911 cmd->dw11.bti_intra_mode = bti_idx++;
4912 cmd->dw12.bti_brc_input = bti_idx++;
4913 cmd->dw13.bti_simplest_intra = bti_idx++;
4914 cmd->dw14.bti_lcu_qp_surface = bti_idx++;
4915 cmd->dw15.bti_brc_data = bti_idx++;
4916 cmd->dw16.bti_debug = bti_idx++;
4918 i965_gpe_context_unmap_curbe(gpe_context);
4922 gen9_hevc_8x8_pu_mode_set_surfaces(VADriverContextP ctx,
4923 struct encode_state *encode_state,
4924 struct intel_encoder_context *encoder_context,
4925 struct i965_gpe_context *gpe_context)
4927 struct encoder_vme_mfc_context *vme_context = NULL;
4928 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4931 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4932 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4934 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4935 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
4936 1, 1, I965_SURFACEFORMAT_R8_UNORM,
4940 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4941 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
4942 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4945 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4946 HEVC_ENC_SURFACE_VME_8x8, bti_idx++,
4947 0, 0, 0, NULL, NULL);
4949 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4950 HEVC_ENC_SURFACE_INTRA_MODE, bti_idx++,
4951 0, 0, 0, NULL, NULL);
4953 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4954 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
4955 0, 0, 0, NULL, NULL);
4957 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4958 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
4959 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4962 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4963 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
4964 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4967 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
4968 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
4969 0, 1, I965_SURFACEFORMAT_R8_UNORM,
4972 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
4973 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
4974 0, 0, 0, NULL, NULL);
4978 gen9_hevc_8x8_pu_mode(VADriverContextP ctx,
4979 struct encode_state *encode_state,
4980 struct intel_encoder_context *encoder_context)
4982 struct encoder_vme_mfc_context *vme_context = NULL;
4983 struct gen9_hevc_encoder_context *priv_ctx = NULL;
4984 struct gen9_hevc_encoder_state *priv_state = NULL;
4985 struct gpe_media_object_walker_parameter param;
4986 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
4987 struct i965_gpe_context *gpe_context = NULL;
4988 int media_state = HEVC_ENC_MEDIA_STATE_8x8_PU;
4990 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
4991 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
4992 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
4994 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_8x8PU_IDX];
4996 gen8_gpe_context_init(ctx, gpe_context);
4997 gen9_gpe_reset_binding_table(ctx, gpe_context);
4998 gen9_hevc_8x8_pu_mode_set_curbe(ctx, encode_state, encoder_context, gpe_context);
4999 gen9_hevc_8x8_pu_mode_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5000 gen8_gpe_setup_interface_data(ctx, gpe_context);
5002 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5003 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 16) >> 3;
5004 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 16) >> 3;
5005 hevc_walker_param.no_dependency = 1;
5006 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5007 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5012 gen9_hevc_16x16_pu_mode_set_curbe(VADriverContextP ctx,
5013 struct encode_state *encode_state,
5014 struct intel_encoder_context *encoder_context,
5015 struct i965_gpe_context *gpe_context)
5017 struct encoder_vme_mfc_context *vme_context = NULL;
5018 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5019 struct generic_enc_codec_state *generic_state = NULL;
5020 struct gen9_hevc_encoder_state *priv_state = NULL;
5021 gen9_hevc_enc_16x16_pu_curbe_data *cmd = NULL;
5022 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
5023 VAEncPictureParameterBufferHEVC *pic_param = NULL;
5024 VAEncSliceParameterBufferHEVC *slice_param = NULL;
5025 double squred_lambda, qp_lambda, lambda_scaling_factor;
5026 unsigned int slice_qp = 0, slice_type = HEVC_SLICE_I;
5027 unsigned int new_point_lambda_for_luma;
5028 unsigned char mode_cost[12];
5031 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5032 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5033 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
5034 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5035 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
5036 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
5037 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
5039 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
5040 slice_type = priv_state->picture_coding_type;
5042 lambda_scaling_factor = 0.46 + slice_qp - 22;
5043 if (lambda_scaling_factor < 0)
5044 lambda_scaling_factor = 0.46;
5045 else if (lambda_scaling_factor > 15)
5046 lambda_scaling_factor = 15;
5048 squred_lambda = lambda_scaling_factor * pow(2.0, ((double)slice_qp - 12.0) / 6);
5049 priv_state->fixed_point_lambda_for_luma = (unsigned int)(squred_lambda * (1 << 10));
5051 lambda_scaling_factor = 1.0;
5052 qp_lambda = priv_ctx->lambda_md_table[slice_type][slice_qp];
5053 squred_lambda = qp_lambda * qp_lambda;
5054 priv_state->fixed_point_lambda_for_chroma = (unsigned int)(lambda_scaling_factor * squred_lambda * (1 << 10));
5056 qp_lambda = sqrt(0.57 * pow(2.0, ((double)slice_qp - 12.0) / 3));
5057 squred_lambda = qp_lambda * qp_lambda;
5058 new_point_lambda_for_luma = (unsigned int)(squred_lambda * (1 << 10));
5060 gen9_hevc_mbenc_set_costs(priv_ctx, slice_type, HEVC_ENC_INTRA_TRANS_HAAR, slice_qp,
5061 mode_cost, NULL, NULL, NULL);
5063 cmd = i965_gpe_context_map_curbe(gpe_context);
5067 memset((void *)cmd, 0, sizeof(*cmd));
5069 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
5070 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
5071 cmd->dw1.log2_min_cu_size = seq_param->log2_min_luma_coding_block_size_minus3 + 3;
5072 cmd->dw1.log2_max_cu_size = cmd->dw1.log2_min_cu_size + seq_param->log2_diff_max_min_luma_coding_block_size;
5073 cmd->dw1.log2_min_tu_size = seq_param->log2_min_transform_block_size_minus2 + 2;
5074 cmd->dw1.slice_qp = slice_qp;
5075 cmd->dw2.fixed_point_lambda_pred_mode = priv_state->fixed_point_lambda_for_chroma;
5076 cmd->dw3.lambda_scaling_factor = 1;
5077 cmd->dw3.slice_type = slice_type;
5078 cmd->dw3.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ?
5079 (priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1) : 0;
5080 cmd->dw3.brc_enable = !!generic_state->brc_enabled;
5081 cmd->dw3.lcu_brc_enable = !!priv_state->lcu_brc_enabled;
5082 cmd->dw3.roi_enable = (priv_state->num_roi > 0);
5083 cmd->dw3.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
5084 0 : priv_state->video_surveillance_flag;
5085 cmd->dw3.enable_rolling_intra = priv_state->rolling_intra_refresh;
5086 cmd->dw3.widi_intra_refresh_en = priv_state->rolling_intra_refresh;
5087 cmd->dw3.half_update_mixed_lcu = 0;
5088 cmd->dw4.penalty_for_intra_8x8_non_dc_pred_mode = 0;
5089 cmd->dw4.intra_compute_type = 1;
5090 cmd->dw4.avc_intra_8x8_mask = 0;
5091 cmd->dw4.intra_sad_adjust = 2;
5092 cmd->dw5.fixed_point_lambda_cu_mode_for_cost_calculation = new_point_lambda_for_luma;
5093 cmd->dw6.screen_content_flag = !!pic_param->pic_fields.bits.screen_content_flag;
5094 cmd->dw7.mode_cost_intra_non_pred = mode_cost[0];
5095 cmd->dw7.mode_cost_intra_16x16 = mode_cost[1];
5096 cmd->dw7.mode_cost_intra_8x8 = mode_cost[2];
5097 cmd->dw7.mode_cost_intra_4x4 = mode_cost[3];
5098 cmd->dw8.fixed_point_lambda_cu_mode_for_luma = priv_state->fixed_point_lambda_for_luma;
5100 if (priv_state->rolling_intra_refresh) {
5101 cmd->dw9.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
5102 cmd->dw9.widi_intra_refresh_mb_num = priv_state->widi_intra_insertion_location;
5103 cmd->dw9.widi_intra_refresh_unit_in_mb = priv_state->widi_intra_insertion_size;
5106 cmd->dw10.simplified_flag_for_inter = 0;
5107 cmd->dw10.haar_transform_mode = priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1;
5109 cmd->dw16.bti_src_y = bti_idx++;
5111 cmd->dw17.bti_sad_16x16_pu = bti_idx++;
5112 cmd->dw18.bti_pak_object = bti_idx++;
5113 cmd->dw19.bti_sad_32x32_pu_mode = bti_idx++;
5114 cmd->dw20.bti_vme_mode_8x8 = bti_idx++;
5115 cmd->dw21.bti_slice_map = bti_idx++;
5116 cmd->dw22.bti_vme_src = bti_idx++;
5117 cmd->dw23.bti_brc_input = bti_idx++;
5118 cmd->dw24.bti_simplest_intra = bti_idx++;
5119 cmd->dw25.bti_lcu_qp_surface = bti_idx++;
5120 cmd->dw26.bti_brc_data = bti_idx++;
5121 cmd->dw27.bti_debug = bti_idx++;
5123 i965_gpe_context_unmap_curbe(gpe_context);
5127 gen9_hevc_16x16_pu_mode_set_surfaces(VADriverContextP ctx,
5128 struct encode_state *encode_state,
5129 struct intel_encoder_context *encoder_context,
5130 struct i965_gpe_context *gpe_context)
5132 struct encoder_vme_mfc_context *vme_context = NULL;
5133 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5134 struct gen9_hevc_encoder_state *priv_state = NULL;
5138 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5139 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5140 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5142 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5143 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
5144 1, 1, I965_SURFACEFORMAT_R8_UNORM,
5148 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5149 HEVC_ENC_SURFACE_16x16PU_SAD, bti_idx++,
5150 0, 0, 0, NULL, NULL);
5152 size = priv_state->width_in_cu * priv_state->height_in_cu *
5153 priv_state->cu_record_size;
5154 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5155 HEVC_ENC_SURFACE_CU_RECORD, bti_idx++,
5156 0, size, priv_state->mb_data_offset, NULL, NULL);
5158 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5159 HEVC_ENC_SURFACE_32x32_PU_OUTPUT, bti_idx++,
5160 0, 0, 0, NULL, NULL);
5162 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5163 HEVC_ENC_SURFACE_VME_8x8, bti_idx++,
5164 0, 0, 0, NULL, NULL);
5166 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5167 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
5168 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5171 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
5172 HEVC_ENC_SURFACE_RAW_VME, bti_idx++,
5175 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5176 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
5177 0, 0, 0, NULL, NULL);
5179 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5180 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
5181 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5184 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5185 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
5186 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5189 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5190 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
5191 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5194 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5195 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
5196 0, 0, 0, NULL, NULL);
5200 gen9_hevc_16x16_pu_mode(VADriverContextP ctx,
5201 struct encode_state *encode_state,
5202 struct intel_encoder_context *encoder_context)
5204 struct encoder_vme_mfc_context *vme_context = NULL;
5205 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5206 struct gen9_hevc_encoder_state *priv_state = NULL;
5207 struct gpe_media_object_walker_parameter param;
5208 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5209 struct i965_gpe_context *gpe_context = NULL;
5210 int media_state = HEVC_ENC_MEDIA_STATE_16x16_PU_MODE_DECISION;
5212 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5213 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5214 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5216 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_16x16MD_IDX];
5218 gen8_gpe_context_init(ctx, gpe_context);
5219 gen9_gpe_reset_binding_table(ctx, gpe_context);
5220 gen9_hevc_16x16_pu_mode_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5221 gen9_hevc_16x16_pu_mode_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5222 gen8_gpe_setup_interface_data(ctx, gpe_context);
5224 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5225 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
5226 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
5227 hevc_walker_param.no_dependency = 1;
5228 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5229 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5234 gen9_hevc_16x16_sad_pu_comp_set_curbe(VADriverContextP ctx,
5235 struct encode_state *encode_state,
5236 struct intel_encoder_context *encoder_context,
5237 struct i965_gpe_context *gpe_context)
5239 struct encoder_vme_mfc_context *vme_context = NULL;
5240 struct gen9_hevc_encoder_state *priv_state = NULL;
5241 gen9_hevc_mbenc_16x16_sad_curbe_data *cmd = NULL;
5242 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
5245 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5246 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5247 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
5249 cmd = i965_gpe_context_map_curbe(gpe_context);
5253 memset((void *)cmd, 0, sizeof(*cmd));
5255 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
5256 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
5257 cmd->dw1.log2_min_cu_size = seq_param->log2_min_luma_coding_block_size_minus3 + 3;
5258 cmd->dw1.log2_max_cu_size = cmd->dw1.log2_min_cu_size + seq_param->log2_diff_max_min_luma_coding_block_size;
5259 cmd->dw1.log2_min_tu_size = seq_param->log2_min_transform_block_size_minus2 + 2;
5260 cmd->dw1.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ?
5261 (priv_state->picture_coding_type == HEVC_SLICE_I ? 0 : 1) : 0;
5262 cmd->dw2.sim_flag_for_inter = 0;
5263 cmd->dw2.slice_type = priv_state->picture_coding_type;
5264 cmd->dw2.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
5265 0 : priv_state->video_surveillance_flag;
5267 cmd->dw8.bti_src_y = bti_idx++;
5269 cmd->dw9.bti_sad_16x16_pu_output = bti_idx++;
5270 cmd->dw10.bti_32x32_pu_mode_decision = bti_idx++;
5271 cmd->dw11.bti_slice_map = bti_idx++;
5272 cmd->dw12.bti_simplest_intra = bti_idx++;
5273 cmd->dw13.bti_debug = bti_idx++;
5275 i965_gpe_context_unmap_curbe(gpe_context);
5279 gen9_hevc_16x16_sad_pu_comp_set_surfaces(VADriverContextP ctx,
5280 struct encode_state *encode_state,
5281 struct intel_encoder_context *encoder_context,
5282 struct i965_gpe_context *gpe_context)
5284 struct encoder_vme_mfc_context *vme_context = NULL;
5285 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5288 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5289 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5291 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5292 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
5293 1, 1, I965_SURFACEFORMAT_R8_UNORM,
5297 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5298 HEVC_ENC_SURFACE_16x16PU_SAD, bti_idx++,
5299 0, 0, 0, NULL, NULL);
5301 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5302 HEVC_ENC_SURFACE_32x32_PU_OUTPUT, bti_idx++,
5303 0, 0, 0, NULL, NULL);
5305 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5306 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
5307 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5310 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5311 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
5312 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5315 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5316 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx++,
5317 0, 0, 0, NULL, NULL);
5321 gen9_hevc_16x16_sad_pu_computation(VADriverContextP ctx,
5322 struct encode_state *encode_state,
5323 struct intel_encoder_context *encoder_context)
5325 struct encoder_vme_mfc_context *vme_context = NULL;
5326 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5327 struct gen9_hevc_encoder_state *priv_state = NULL;
5328 struct gpe_media_object_walker_parameter param;
5329 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5330 struct i965_gpe_context *gpe_context = NULL;
5331 int media_state = HEVC_ENC_MEDIA_STATE_16x16_PU_SAD;
5333 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5334 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5335 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5337 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_16x16SAD_IDX];
5339 gen8_gpe_context_init(ctx, gpe_context);
5340 gen9_gpe_reset_binding_table(ctx, gpe_context);
5341 gen9_hevc_16x16_sad_pu_comp_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5342 gen9_hevc_16x16_sad_pu_comp_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5343 gen8_gpe_setup_interface_data(ctx, gpe_context);
5345 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5346 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 16) >> 4;
5347 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 16) >> 4;
5348 hevc_walker_param.no_dependency = 1;
5349 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5350 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5355 gen9_hevc_32x32_b_intra_set_curbe(VADriverContextP ctx,
5356 struct encode_state *encode_state,
5357 struct intel_encoder_context *encoder_context,
5358 struct i965_gpe_context *gpe_context)
5360 struct encoder_vme_mfc_context *vme_context = NULL;
5361 struct generic_enc_codec_state *generic_state = NULL;
5362 struct gen9_hevc_encoder_state *priv_state = NULL;
5363 gen9_hevc_mbenc_b_32x32_pu_intra_curbe_data *cmd = NULL;
5364 VAEncSequenceParameterBufferHEVC *seq_param = NULL;
5367 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5368 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
5369 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5370 seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
5372 cmd = i965_gpe_context_map_curbe(gpe_context);
5376 memset((void *)cmd, 0, sizeof(*cmd));
5378 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
5379 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
5380 cmd->dw1.enable_debug_dump = 0;
5381 cmd->dw1.enable_intra_early_exit = priv_state->tu_mode == HEVC_TU_RT_SPEED ? 1 : 0;
5383 cmd->dw1.log2_min_tu_size = seq_param->log2_min_transform_block_size_minus2 + 2;
5384 cmd->dw1.slice_type = priv_state->picture_coding_type;
5385 cmd->dw1.hme_enable = generic_state->hme_enabled;
5386 cmd->dw1.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
5387 0 : priv_state->video_surveillance_flag;
5389 cmd->dw2.qp_multiplier = 100;
5390 cmd->dw2.qp_value = 0;
5392 cmd->dw8.bti_per_32x32_pu_intra_checck = bti_idx++;
5393 cmd->dw9.bti_src_y = bti_idx++;
5395 cmd->dw10.bti_src_y2x = bti_idx++;
5396 cmd->dw11.bti_slice_map = bti_idx++;
5397 cmd->dw12.bti_vme_y2x = bti_idx++;
5398 cmd->dw13.bti_simplest_intra = bti_idx++;
5399 cmd->dw14.bti_hme_mv_pred = bti_idx++;
5400 cmd->dw15.bti_hme_dist = bti_idx++;
5401 cmd->dw16.bti_lcu_skip = bti_idx++;
5402 cmd->dw17.bti_debug = bti_idx++;
5404 i965_gpe_context_unmap_curbe(gpe_context);
5408 gen9_hevc_32x32_b_intra_set_surfaces(VADriverContextP ctx,
5409 struct encode_state *encode_state,
5410 struct intel_encoder_context *encoder_context,
5411 struct i965_gpe_context *gpe_context)
5413 struct encoder_vme_mfc_context *vme_context = NULL;
5414 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5417 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5418 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5420 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5421 HEVC_ENC_SURFACE_32x32_PU_OUTPUT, bti_idx++,
5422 0, 0, 0, NULL, NULL);
5424 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5425 HEVC_ENC_SURFACE_RAW_Y_UV, bti_idx++,
5426 1, 1, I965_SURFACEFORMAT_R8_UNORM,
5430 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5431 HEVC_ENC_SURFACE_Y_2X, bti_idx++,
5432 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5435 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5436 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
5437 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5440 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
5441 HEVC_ENC_SURFACE_Y_2X_VME, bti_idx++,
5444 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5445 HEVC_ENC_SURFACE_SIMPLIFIED_INTRA, bti_idx++,
5446 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5449 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5450 HEVC_ENC_SURFACE_HME_MVP, bti_idx++,
5451 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5454 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5455 HEVC_ENC_SURFACE_HME_DIST, bti_idx++,
5456 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5459 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5460 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
5461 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5464 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5465 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx,
5466 0, 0, 0, NULL, NULL);
5470 gen9_hevc_32x32_b_intra(VADriverContextP ctx,
5471 struct encode_state *encode_state,
5472 struct intel_encoder_context *encoder_context)
5474 struct encoder_vme_mfc_context *vme_context = NULL;
5475 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5476 struct gen9_hevc_encoder_state *priv_state = NULL;
5477 struct gpe_media_object_walker_parameter param;
5478 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5479 struct i965_gpe_context *gpe_context = NULL;
5480 int media_state = HEVC_ENC_MEDIA_STATE_32x32_B_INTRA_CHECK;
5482 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5483 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5484 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5486 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_32x32INTRACHECK_IDX];
5488 gen8_gpe_context_init(ctx, gpe_context);
5489 gen9_gpe_reset_binding_table(ctx, gpe_context);
5490 gen9_hevc_32x32_b_intra_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5491 gen9_hevc_32x32_b_intra_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5492 gen8_gpe_setup_interface_data(ctx, gpe_context);
5494 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5495 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
5496 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
5497 hevc_walker_param.no_dependency = 1;
5498 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5499 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5504 gen9_hevc_32x32_pu_mode_set_curbe(VADriverContextP ctx,
5505 struct encode_state *encode_state,
5506 struct intel_encoder_context *encoder_context,
5507 struct i965_gpe_context *gpe_context)
5509 struct encoder_vme_mfc_context *vme_context = NULL;
5510 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5511 struct generic_enc_codec_state *generic_state = NULL;
5512 struct gen9_hevc_encoder_state *priv_state = NULL;
5513 VAEncPictureParameterBufferHEVC *pic_param = NULL;
5514 VAEncSliceParameterBufferHEVC *slice_param = NULL;
5515 gen9_hevc_mbenc_32x32_pu_mode_curbe_data *cmd = NULL;
5516 double lambda_scaling_factor = 1.0, qp_lambda = 0.0, squared_qp_lambda = 0.0;
5517 unsigned int slice_qp = 0, fixed_point_lambda = 0;
5520 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5521 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5522 generic_state = (struct generic_enc_codec_state *)vme_context->generic_enc_state;
5523 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5524 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
5525 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[0]->buffer;
5527 slice_qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
5528 gen9_hevc_set_lambda_tables(priv_ctx, HEVC_SLICE_I, HEVC_ENC_INTRA_TRANS_HAAR);
5529 lambda_scaling_factor = 1.0;
5530 qp_lambda = priv_ctx->lambda_md_table[HEVC_SLICE_I][slice_qp];
5531 squared_qp_lambda = qp_lambda * qp_lambda;
5532 fixed_point_lambda = (unsigned int)(lambda_scaling_factor * squared_qp_lambda * (1 << 10));
5534 cmd = i965_gpe_context_map_curbe(gpe_context);
5538 memset((void *)cmd, 0, sizeof(*cmd));
5540 cmd->dw0.frame_width = ALIGN(priv_state->picture_width, 16);
5541 cmd->dw0.frame_height = ALIGN(priv_state->picture_height, 16);
5542 cmd->dw1.enable_debug_dump = 0;
5543 cmd->dw1.lcu_type = priv_state->lcu_size == 64 ? 0 : 1;
5544 cmd->dw1.pu_type = 0;
5545 cmd->dw1.brc_enable = !!generic_state->brc_enabled;
5546 cmd->dw1.lcu_brc_enable = priv_state->lcu_brc_enabled;
5547 cmd->dw1.slice_type = priv_state->picture_coding_type;
5548 cmd->dw1.fast_surveillance_flag = priv_state->picture_coding_type == HEVC_SLICE_I ?
5549 0 : priv_state->video_surveillance_flag;
5550 cmd->dw1.roi_enable = (priv_state->num_roi > 0);
5552 cmd->dw2.lambda = fixed_point_lambda;
5553 cmd->dw3.mode_cost_32x32 = 0;
5554 cmd->dw4.early_exit = (unsigned int) - 1;
5556 cmd->dw8.bti_32x32_pu_output = bti_idx++;
5557 cmd->dw9.bti_src_y = bti_idx++;
5559 cmd->dw10.bti_src_y2x = bti_idx++;
5560 cmd->dw11.bti_slice_map = bti_idx++;
5561 cmd->dw12.bti_src_y2x_vme = bti_idx++;
5562 cmd->dw13.bti_brc_input = bti_idx++;
5563 cmd->dw14.bti_lcu_qp_surface = bti_idx++;
5564 cmd->dw15.bti_brc_data = bti_idx++;
5565 cmd->dw16.bti_kernel_debug = bti_idx++;
5567 i965_gpe_context_unmap_curbe(gpe_context);
5571 gen9_hevc_32x32_pu_mode_set_surfaces(VADriverContextP ctx,
5572 struct encode_state *encode_state,
5573 struct intel_encoder_context *encoder_context,
5574 struct i965_gpe_context *gpe_context)
5576 struct encoder_vme_mfc_context *vme_context = NULL;
5577 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5580 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5581 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5583 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5584 HEVC_ENC_SURFACE_32x32_PU_OUTPUT, bti_idx++,
5585 0, 0, 0, NULL, NULL);
5587 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5588 HEVC_ENC_SURFACE_RAW_Y, bti_idx++,
5589 1, 1, I965_SURFACEFORMAT_R8_UNORM,
5593 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5594 HEVC_ENC_SURFACE_Y_2X, bti_idx++,
5595 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5598 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5599 HEVC_ENC_SURFACE_SLICE_MAP, bti_idx++,
5600 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5603 gen9_hevc_set_gpe_adv_surface(ctx, priv_ctx, gpe_context,
5604 HEVC_ENC_SURFACE_Y_2X_VME, bti_idx++,
5607 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5608 HEVC_ENC_SURFACE_BRC_INPUT, bti_idx++,
5609 0, 0, 0, NULL, NULL);
5611 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5612 HEVC_ENC_SURFACE_LCU_QP, bti_idx++,
5613 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5616 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5617 HEVC_ENC_SURFACE_BRC_DATA, bti_idx++,
5618 0, 1, I965_SURFACEFORMAT_R8_UNORM,
5621 gen9_hevc_set_gpe_1d_surface(ctx, priv_ctx, gpe_context,
5622 HEVC_ENC_SURFACE_KERNEL_DEBUG, bti_idx,
5623 0, 0, 0, NULL, NULL);
5627 gen9_hevc_32x32_pu_mode(VADriverContextP ctx,
5628 struct encode_state *encode_state,
5629 struct intel_encoder_context *encoder_context)
5631 struct encoder_vme_mfc_context *vme_context = NULL;
5632 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5633 struct gen9_hevc_encoder_state *priv_state = NULL;
5634 struct gpe_media_object_walker_parameter param;
5635 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5636 struct i965_gpe_context *gpe_context = NULL;
5637 int media_state = HEVC_ENC_MEDIA_STATE_32x32_PU_MODE_DECISION;
5639 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5640 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5641 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5643 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_32x32MD_IDX];
5645 gen8_gpe_context_init(ctx, gpe_context);
5646 gen9_gpe_reset_binding_table(ctx, gpe_context);
5647 gen9_hevc_32x32_pu_mode_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5648 gen9_hevc_32x32_pu_mode_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5649 gen8_gpe_setup_interface_data(ctx, gpe_context);
5651 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5652 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
5653 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
5654 hevc_walker_param.no_dependency = 1;
5655 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5656 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5661 gen9_hevc_2x_scaling_set_curbe(VADriverContextP ctx,
5662 struct encode_state *encode_state,
5663 struct intel_encoder_context *encoder_context,
5664 struct i965_gpe_context *gpe_context)
5666 struct encoder_vme_mfc_context *vme_context = NULL;
5667 struct gen9_hevc_encoder_state *priv_state = NULL;
5668 gen9_hevc_mbenc_downscaling2x_curbe_data *cmd = NULL;
5671 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5672 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5674 cmd = i965_gpe_context_map_curbe(gpe_context);
5678 memset((void *)cmd, 0, sizeof(gen9_hevc_mbenc_downscaling2x_curbe_data));
5680 cmd->dw0.pic_width = ALIGN(priv_state->picture_width, 16);
5681 cmd->dw0.pic_height = ALIGN(priv_state->picture_height, 16);
5683 cmd->dw8.bti_src_y = bti_idx++;
5684 cmd->dw9.bit_dst_y = bti_idx;
5686 i965_gpe_context_unmap_curbe(gpe_context);
5690 gen9_hevc_2x_scaling_set_surfaces(VADriverContextP ctx,
5691 struct encode_state *encode_state,
5692 struct intel_encoder_context *encoder_context,
5693 struct i965_gpe_context *gpe_context)
5695 struct encoder_vme_mfc_context *vme_context = NULL;
5696 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5699 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5700 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5702 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5703 HEVC_ENC_SURFACE_RAW_Y, bti_idx++,
5704 0, 1, I965_SURFACEFORMAT_R16_UNORM,
5707 gen9_hevc_set_gpe_2d_surface(ctx, priv_ctx, gpe_context,
5708 HEVC_ENC_SURFACE_Y_2X, bti_idx,
5709 0, 1, I965_SURFACEFORMAT_R16_UNORM,
5714 gen9_hevc_2x_scaling(VADriverContextP ctx,
5715 struct encode_state *encode_state,
5716 struct intel_encoder_context *encoder_context)
5718 struct encoder_vme_mfc_context *vme_context = NULL;
5719 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5720 struct gen9_hevc_encoder_state *priv_state = NULL;
5721 struct gpe_media_object_walker_parameter param;
5722 struct hevc_enc_kernel_walker_parameter hevc_walker_param;
5723 struct i965_gpe_context *gpe_context = NULL;
5724 int media_state = HEVC_ENC_MEDIA_STATE_2X_SCALING;
5726 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5727 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5728 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5730 gpe_context = &priv_ctx->mbenc_context.gpe_contexts[HEVC_MBENC_2xSCALING_IDX];
5732 gen8_gpe_context_init(ctx, gpe_context);
5733 gen9_gpe_reset_binding_table(ctx, gpe_context);
5734 gen9_hevc_2x_scaling_set_curbe(ctx, encode_state, encoder_context, gpe_context);
5735 gen9_hevc_2x_scaling_set_surfaces(ctx, encode_state, encoder_context, gpe_context);
5736 gen8_gpe_setup_interface_data(ctx, gpe_context);
5738 memset((void *)&hevc_walker_param, 0, sizeof(hevc_walker_param));
5739 hevc_walker_param.resolution_x = ALIGN(priv_state->picture_width, 32) >> 5;
5740 hevc_walker_param.resolution_y = ALIGN(priv_state->picture_height, 32) >> 5;
5741 hevc_walker_param.no_dependency = 1;
5742 gen9_hevc_init_object_walker(&hevc_walker_param, ¶m);
5744 gen9_hevc_run_object_walker(ctx, encoder_context, gpe_context, ¶m,
5749 gen9_hevc_mbenc(VADriverContextP ctx,
5750 struct encode_state *encode_state,
5751 struct intel_encoder_context *encoder_context)
5753 struct encoder_vme_mfc_context *vme_context = NULL;
5754 struct gen9_hevc_encoder_state *priv_state = NULL;
5756 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5757 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5759 if (!priv_state->bit_depth_luma_minus8)
5760 gen9_hevc_2x_scaling(ctx, encode_state, encoder_context);
5762 if (priv_state->picture_coding_type == HEVC_SLICE_I)
5763 gen9_hevc_32x32_pu_mode(ctx, encode_state, encoder_context);
5765 gen9_hevc_32x32_b_intra(ctx, encode_state, encoder_context);
5767 gen9_hevc_16x16_sad_pu_computation(ctx, encode_state, encoder_context);
5768 gen9_hevc_16x16_pu_mode(ctx, encode_state, encoder_context);
5769 gen9_hevc_8x8_pu_mode(ctx, encode_state, encoder_context);
5770 gen9_hevc_8x8_pu_fmode(ctx, encode_state, encoder_context);
5772 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
5773 gen9_hevc_8x8_b_mbenc(ctx, encode_state, encoder_context);
5774 gen9_hevc_8x8_b_pak(ctx, encode_state, encoder_context);
5779 gen9_hevc_vme_gpe_init(VADriverContextP ctx,
5780 struct encode_state *encode_state,
5781 struct intel_encoder_context *encoder_context)
5783 struct encoder_vme_mfc_context *vme_context = NULL;
5784 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5786 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5787 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5789 i965_zero_gpe_resource(&priv_ctx->res_mb_code_surface);
5790 i965_zero_gpe_resource(&priv_ctx->res_slice_map_buffer);
5792 return VA_STATUS_SUCCESS;
5796 gen9_hevc_vme_gpe_run(VADriverContextP ctx,
5797 struct encode_state *encode_state,
5798 struct intel_encoder_context *encoder_context)
5800 struct encoder_vme_mfc_context *vme_context = NULL;
5801 struct generic_enc_codec_state *generic_state = NULL;
5802 struct gen9_hevc_encoder_state *priv_state = NULL;
5804 vme_context = encoder_context->vme_context;
5805 generic_state = vme_context->generic_enc_state;
5806 priv_state = vme_context->private_enc_state;
5808 if (generic_state->brc_enabled &&
5809 (generic_state->brc_need_reset || !generic_state->brc_inited)) {
5810 gen9_hevc_brc_init_reset(ctx, encode_state, encoder_context,
5811 generic_state->brc_inited ? 1 : 0);
5812 generic_state->brc_need_reset = 0;
5813 generic_state->brc_inited = 1;
5816 if (generic_state->hme_supported || generic_state->brc_enabled) {
5817 gen9_hevc_hme_scaling(ctx, encode_state, encoder_context);
5819 if (generic_state->brc_enabled)
5820 gen9_hevc_brc_intra_dist(ctx, encode_state, encoder_context);
5822 if (generic_state->hme_enabled)
5823 gen9_hevc_hme_encode_me(ctx, encode_state, encoder_context);
5825 if (generic_state->brc_enabled)
5826 gen9_hevc_brc_update(ctx, encode_state, encoder_context);
5829 if (priv_state->num_roi && !generic_state->brc_enabled)
5830 gen9_hevc_brc_update_lcu_based(ctx, encode_state, encoder_context);
5832 if (priv_state->bit_depth_luma_minus8)
5833 gen9_hevc_ref_frame_depth_conversion(ctx, encode_state, encoder_context);
5835 gen9_hevc_mbenc(ctx, encode_state, encoder_context);
5837 return VA_STATUS_SUCCESS;
5841 gen9_hevc_vme_pipeline(VADriverContextP ctx,
5843 struct encode_state *encode_state,
5844 struct intel_encoder_context *encoder_context)
5846 VAStatus va_status = VA_STATUS_SUCCESS;
5848 va_status = gen9_hevc_enc_init_parameters(ctx, encode_state, encoder_context);
5849 if (va_status != VA_STATUS_SUCCESS)
5852 va_status = gen9_hevc_vme_gpe_init(ctx, encode_state, encoder_context);
5853 if (va_status != VA_STATUS_SUCCESS)
5856 va_status = gen9_hevc_vme_gpe_run(ctx, encode_state, encoder_context);
5863 gen9_hevc_vme_scaling_context_init(VADriverContextP ctx,
5864 struct intel_encoder_context *encoder_context)
5866 struct encoder_vme_mfc_context *vme_context = NULL;
5867 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5868 struct gen9_hevc_encoder_state *priv_state = NULL;
5869 struct i965_gpe_context *gpe_context = NULL;
5870 struct i965_kernel kernel_info;
5871 struct gen9_hevc_scaling_context *scaling_ctx = NULL;
5872 GEN9_ENC_OPERATION kernel_idx;
5876 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5877 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5878 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5880 scaling_ctx = &priv_ctx->scaling_context;
5882 for (i = 0; i < NUM_HEVC_ENC_SCALING; i++) {
5883 if (i == HEVC_ENC_SCALING_4X ||
5884 i == HEVC_ENC_SCALING_16X) {
5885 curbe_size = sizeof(gen9_hevc_scaling4x_curbe_data);
5886 kernel_idx = GEN9_ENC_SCALING4X;
5887 } else if (i == HEVC_ENC_SCALING_32X) {
5888 curbe_size = sizeof(gen9_hevc_scaling2x_curbe_data);
5889 kernel_idx = GEN9_ENC_SCALING2X;
5892 gpe_context = &scaling_ctx->gpe_contexts[i];
5894 gen9_hevc_vme_init_gpe_context(ctx, gpe_context,
5897 gen9_hevc_vme_init_scoreboard(gpe_context,
5899 priv_state->use_hw_scoreboard,
5900 priv_state->use_hw_non_stalling_scoreborad);
5902 memset(&kernel_info, 0, sizeof(kernel_info));
5903 gen9_hevc_get_kernel_header_and_size((void *)hevc_enc_kernel_ptr,
5904 hevc_enc_kernel_size,
5908 gen8_gpe_load_kernels(ctx,
5916 gen9_hevc_vme_me_context_init(VADriverContextP ctx,
5917 struct intel_encoder_context *encoder_context)
5919 struct encoder_vme_mfc_context *vme_context = NULL;
5920 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5921 struct gen9_hevc_encoder_state *priv_state = NULL;
5922 struct i965_gpe_context *gpe_context = NULL;
5923 struct i965_kernel kernel_info;
5924 struct gen9_hevc_me_context *me_ctx = NULL;
5927 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5928 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5929 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5931 me_ctx = &priv_ctx->me_context;
5933 for (i = 0; i < NUM_HEVC_ENC_ME; i++) {
5934 for (j = 0; j < NUM_HEVC_ENC_ME_TYPES; j++) {
5935 gpe_context = &me_ctx->gpe_context[j][i];
5937 gen9_hevc_vme_init_gpe_context(ctx, gpe_context,
5938 sizeof(gen9_hevc_me_curbe_data),
5940 gen9_hevc_vme_init_scoreboard(gpe_context,
5942 priv_state->use_hw_scoreboard,
5943 priv_state->use_hw_non_stalling_scoreborad);
5945 memset(&kernel_info, 0, sizeof(kernel_info));
5946 gen9_hevc_get_kernel_header_and_size((void *)hevc_enc_kernel_ptr,
5947 hevc_enc_kernel_size,
5951 gen8_gpe_load_kernels(ctx,
5960 gen9_hevc_vme_mbenc_context_init(VADriverContextP ctx,
5961 struct intel_encoder_context *encoder_context)
5963 struct encoder_vme_mfc_context *vme_context = NULL;
5964 struct gen9_hevc_encoder_context *priv_ctx = NULL;
5965 struct gen9_hevc_encoder_state *priv_state = NULL;
5966 struct i965_gpe_context *gpe_context = NULL;
5967 struct i965_kernel kernel_info;
5968 struct gen9_hevc_mbenc_context *mbenc_ctx = NULL;
5971 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
5972 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
5973 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
5975 mbenc_ctx = &priv_ctx->mbenc_context;
5977 mbenc_ctx->kernel_num = GEN8_HEVC_ENC_MBENC_TOTAL_NUM;
5979 for (i = 0; i < mbenc_ctx->kernel_num; i++) {
5980 gpe_context = &mbenc_ctx->gpe_contexts[i];
5982 gen9_hevc_vme_init_gpe_context(ctx, gpe_context,
5983 hevc_mbenc_curbe_size[i],
5985 gen9_hevc_vme_init_scoreboard(gpe_context,
5987 priv_state->use_hw_scoreboard,
5988 priv_state->use_hw_non_stalling_scoreborad);
5990 memset(&kernel_info, 0, sizeof(kernel_info));
5991 gen9_hevc_get_kernel_header_and_size((void *)hevc_enc_kernel_ptr,
5992 hevc_enc_kernel_size,
5996 gen8_gpe_load_kernels(ctx,
6004 gen9_hevc_vme_brc_context_init(VADriverContextP ctx,
6005 struct intel_encoder_context *encoder_context)
6007 struct encoder_vme_mfc_context *vme_context = NULL;
6008 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6009 struct gen9_hevc_encoder_state *priv_state = NULL;
6010 struct i965_gpe_context *gpe_context = NULL;
6011 struct i965_kernel kernel_info;
6012 struct gen9_hevc_brc_context *brc_ctx = NULL;
6015 vme_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6016 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
6017 priv_state = (struct gen9_hevc_encoder_state *)vme_context->private_enc_state;
6019 brc_ctx = &priv_ctx->brc_context;
6021 for (i = 0; i < GEN9_HEVC_ENC_BRC_NUM; i++) {
6022 gpe_context = &brc_ctx->gpe_contexts[i];
6024 gen9_hevc_vme_init_gpe_context(ctx, gpe_context,
6025 hevc_brc_curbe_size[i],
6027 gen9_hevc_vme_init_scoreboard(gpe_context,
6029 priv_state->use_hw_scoreboard,
6030 priv_state->use_hw_non_stalling_scoreborad);
6032 memset(&kernel_info, 0, sizeof(kernel_info));
6033 gen9_hevc_get_kernel_header_and_size((void *)hevc_enc_kernel_ptr,
6034 hevc_enc_kernel_size,
6038 gen8_gpe_load_kernels(ctx,
6046 gen9_hevc_vme_scaling_context_destroy(struct gen9_hevc_scaling_context *scaling_context)
6050 for (i = 0; i < NUM_HEVC_ENC_SCALING; i++)
6051 gen8_gpe_context_destroy(&scaling_context->gpe_contexts[i]);
6055 gen9_hevc_vme_me_context_destroy(struct gen9_hevc_me_context *me_context)
6059 for (i = 0; i < NUM_HEVC_ENC_ME; i++)
6060 for (j = 0; j < NUM_HEVC_ENC_ME_TYPES; j++)
6061 gen8_gpe_context_destroy(&me_context->gpe_context[j][i]);
6065 gen9_hevc_vme_mbenc_context_destroy(struct gen9_hevc_mbenc_context *mbenc_context)
6069 for (i = 0; i < mbenc_context->kernel_num; i++)
6070 gen8_gpe_context_destroy(&mbenc_context->gpe_contexts[i]);
6074 gen9_hevc_vme_brc_context_destroy(struct gen9_hevc_brc_context *brc_context)
6078 for (i = 0; i < GEN9_HEVC_ENC_BRC_NUM; i++)
6079 gen8_gpe_context_destroy(&brc_context->gpe_contexts[i]);
6083 gen9_hevc_vme_kernels_context_init(VADriverContextP ctx,
6084 struct intel_encoder_context *encoder_context)
6086 gen9_hevc_vme_scaling_context_init(ctx, encoder_context);
6087 gen9_hevc_vme_me_context_init(ctx, encoder_context);
6088 gen9_hevc_vme_mbenc_context_init(ctx, encoder_context);
6089 gen9_hevc_vme_brc_context_init(ctx, encoder_context);
6093 gen9_hevc_vme_kernels_context_destroy(struct encoder_vme_mfc_context *vme_context)
6095 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6097 priv_ctx = (struct gen9_hevc_encoder_context *)vme_context->private_enc_ctx;
6099 gen9_hevc_vme_scaling_context_destroy(&priv_ctx->scaling_context);
6100 gen9_hevc_vme_me_context_destroy(&priv_ctx->me_context);
6101 gen9_hevc_vme_mbenc_context_destroy(&priv_ctx->mbenc_context);
6102 gen9_hevc_vme_brc_context_destroy(&priv_ctx->brc_context);
6106 gen9_hevc_vme_context_destroy(void *context)
6108 struct encoder_vme_mfc_context *vme_context = (struct encoder_vme_mfc_context *)context;
6113 gen9_hevc_enc_free_resources(vme_context);
6115 gen9_hevc_vme_kernels_context_destroy(vme_context);
6117 if (vme_context->private_enc_ctx) free(vme_context->private_enc_ctx);
6118 if (vme_context->generic_enc_state) free(vme_context->generic_enc_state);
6119 if (vme_context->private_enc_state) free(vme_context->private_enc_state);
6124 #define PAK_IMPLEMENTATION_START
6127 gen9_hevc_pak_pipe_mode_select(VADriverContextP ctx,
6128 struct encode_state *encode_state,
6129 struct intel_encoder_context *encoder_context)
6131 struct intel_batchbuffer *batch = encoder_context->base.batch;
6133 BEGIN_BCS_BATCH(batch, 6);
6135 OUT_BCS_BATCH(batch, HCP_PIPE_MODE_SELECT | (6 - 2));
6136 OUT_BCS_BATCH(batch,
6139 HCP_CODEC_SELECT_ENCODE);
6140 OUT_BCS_BATCH(batch, 0);
6141 OUT_BCS_BATCH(batch, 0);
6142 OUT_BCS_BATCH(batch, 0);
6143 OUT_BCS_BATCH(batch, 0);
6145 ADVANCE_BCS_BATCH(batch);
6149 gen9_hevc_pak_add_surface_state(VADriverContextP ctx,
6150 struct encode_state *encode_state,
6151 struct intel_encoder_context *encoder_context,
6152 struct object_surface *obj_surface,
6153 enum GEN9_HEVC_ENC_SURFACE_TYPE type)
6155 struct intel_batchbuffer *batch = encoder_context->base.batch;
6157 BEGIN_BCS_BATCH(batch, 3);
6159 OUT_BCS_BATCH(batch, HCP_SURFACE_STATE | (3 - 2));
6160 OUT_BCS_BATCH(batch,
6162 (obj_surface->width - 1));
6163 OUT_BCS_BATCH(batch,
6164 (((obj_surface->fourcc == VA_FOURCC_P010) ?
6165 SURFACE_FORMAT_P010 :
6166 SURFACE_FORMAT_PLANAR_420_8) << 28) |
6167 (obj_surface->y_cb_offset));
6169 ADVANCE_BCS_BATCH(batch);
6172 #define OUT_BUFFER(buf_bo, is_target, ma) \
6175 OUT_RELOC64(batch, \
6177 I915_GEM_DOMAIN_RENDER, \
6178 is_target ? I915_GEM_DOMAIN_RENDER : 0, \
6181 OUT_BCS_BATCH(batch, 0); \
6182 OUT_BCS_BATCH(batch, 0); \
6185 OUT_BCS_BATCH(batch, priv_ctx->mocs); \
6188 #define OUT_BUFFER_MA_TARGET(buf_bo) OUT_BUFFER(buf_bo, 1, 1)
6189 #define OUT_BUFFER_MA_REFERENCE(buf_bo) OUT_BUFFER(buf_bo, 0, 1)
6190 #define OUT_BUFFER_NMA_REFERENCE(buf_bo) OUT_BUFFER(buf_bo, 0, 0)
6193 gen9_hevc_pak_add_pipe_buf_addr_state(VADriverContextP ctx,
6194 struct encode_state *encode_state,
6195 struct intel_encoder_context *encoder_context)
6197 struct i965_driver_data *i965 = i965_driver_data(ctx);
6198 struct intel_batchbuffer *batch = encoder_context->base.batch;
6199 struct encoder_vme_mfc_context *pak_context = NULL;
6200 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6204 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6205 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6207 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
6208 BEGIN_BCS_BATCH(batch, 104);
6210 OUT_BCS_BATCH(batch, HCP_PIPE_BUF_ADDR_STATE | (104 - 2));
6212 BEGIN_BCS_BATCH(batch, 95);
6214 OUT_BCS_BATCH(batch, HCP_PIPE_BUF_ADDR_STATE | (95 - 2));
6217 OUT_BUFFER_MA_TARGET(priv_ctx->reconstructed_object.obj_surface->bo);
6218 OUT_BUFFER_MA_TARGET(priv_ctx->deblocking_filter_line_buffer.bo);
6219 OUT_BUFFER_MA_TARGET(priv_ctx->deblocking_filter_tile_line_buffer.bo);
6220 OUT_BUFFER_MA_TARGET(priv_ctx->deblocking_filter_tile_column_buffer.bo);
6221 OUT_BUFFER_MA_TARGET(priv_ctx->metadata_line_buffer.bo);
6222 OUT_BUFFER_MA_TARGET(priv_ctx->metadata_tile_line_buffer.bo);
6223 OUT_BUFFER_MA_TARGET(priv_ctx->metadata_tile_column_buffer.bo);
6224 OUT_BUFFER_MA_TARGET(priv_ctx->sao_line_buffer.bo);
6225 OUT_BUFFER_MA_TARGET(priv_ctx->sao_tile_line_buffer.bo);
6226 OUT_BUFFER_MA_TARGET(priv_ctx->sao_tile_column_buffer.bo);
6227 OUT_BUFFER_MA_TARGET(priv_ctx->
6228 mv_temporal_buffer[GEN9_MAX_MV_TEMPORAL_BUFFERS - 1].bo);
6229 OUT_BUFFER_MA_TARGET(NULL);
6231 for (i = 0; i < GEN9_MAX_REF_SURFACES; i++) {
6232 if (priv_ctx->reference_surfaces[i].obj_surface &&
6233 priv_ctx->reference_surfaces[i].obj_surface->bo) {
6234 bo = priv_ctx->reference_surfaces[i].obj_surface->bo;
6236 OUT_BUFFER_NMA_REFERENCE(bo);
6238 OUT_BUFFER_NMA_REFERENCE(NULL);
6240 OUT_BCS_BATCH(batch, priv_ctx->mocs);
6242 OUT_BUFFER_MA_TARGET(priv_ctx->
6243 uncompressed_picture_source.obj_surface->bo);
6244 OUT_BUFFER_MA_TARGET(NULL);
6245 OUT_BUFFER_MA_TARGET(NULL);
6246 OUT_BUFFER_MA_TARGET(NULL);
6248 for (i = 0; i < GEN9_MAX_MV_TEMPORAL_BUFFERS - 1; i++) {
6249 bo = priv_ctx->mv_temporal_buffer[i].bo;
6252 OUT_BUFFER_NMA_REFERENCE(bo);
6254 OUT_BUFFER_NMA_REFERENCE(NULL);
6256 OUT_BCS_BATCH(batch, priv_ctx->mocs);
6258 OUT_BUFFER_MA_TARGET(NULL);
6259 OUT_BUFFER_MA_TARGET(NULL);
6260 OUT_BUFFER_MA_TARGET(NULL);
6261 OUT_BUFFER_MA_TARGET(NULL);
6263 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
6264 for (i = 0; i < 9; i++)
6265 OUT_BCS_BATCH(batch, 0);
6268 ADVANCE_BCS_BATCH(batch);
6272 gen9_hevc_pak_add_ind_obj_base_addr_state(VADriverContextP ctx,
6273 struct encode_state *encode_state,
6274 struct intel_encoder_context *encoder_context)
6276 struct intel_batchbuffer *batch = encoder_context->base.batch;
6277 struct encoder_vme_mfc_context *pak_context = NULL;
6278 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6279 struct gen9_hevc_encoder_state *priv_state = NULL;
6281 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6282 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6283 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
6285 BEGIN_BCS_BATCH(batch, 14);
6287 OUT_BCS_BATCH(batch, HCP_IND_OBJ_BASE_ADDR_STATE | (14 - 2));
6288 OUT_BUFFER_MA_REFERENCE(NULL);
6289 OUT_BUFFER_NMA_REFERENCE(NULL);
6292 priv_ctx->res_mb_code_surface.bo,
6293 I915_GEM_DOMAIN_INSTRUCTION, 0,
6294 priv_state->mb_data_offset);
6295 OUT_BCS_BATCH(batch, priv_ctx->mocs);
6298 priv_ctx->indirect_pak_bse_object.bo,
6299 I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
6300 priv_ctx->indirect_pak_bse_object.offset);
6301 OUT_BCS_BATCH(batch, priv_ctx->mocs);
6304 priv_ctx->indirect_pak_bse_object.bo,
6305 I915_GEM_DOMAIN_RENDER, 0,
6306 priv_ctx->indirect_pak_bse_object.end_offset);
6308 ADVANCE_BCS_BATCH(batch);
6312 gen9_hevc_pak_set_qm(VADriverContextP ctx,
6314 int color_component,
6319 struct intel_encoder_context *encoder_context)
6321 struct intel_batchbuffer *batch = encoder_context->base.batch;
6322 unsigned int qm_buffer[16];
6324 memset(qm_buffer, 0, sizeof(qm_buffer));
6325 memcpy(qm_buffer, qm, qm_length * 4);
6327 BEGIN_BCS_BATCH(batch, 18);
6329 OUT_BCS_BATCH(batch, HCP_QM_STATE | (18 - 2));
6330 OUT_BCS_BATCH(batch,
6332 color_component << 3 |
6335 intel_batchbuffer_data(batch, qm_buffer, 16 * 4);
6337 ADVANCE_BCS_BATCH(batch);
6340 static unsigned int qm_default[16] = {
6341 0x10101010, 0x10101010, 0x10101010, 0x10101010,
6342 0x10101010, 0x10101010, 0x10101010, 0x10101010,
6343 0x10101010, 0x10101010, 0x10101010, 0x10101010,
6344 0x10101010, 0x10101010, 0x10101010, 0x10101010
6348 gen9_hevc_pak_add_qm_state(VADriverContextP ctx,
6349 struct encode_state *encode_state,
6350 struct intel_encoder_context *encoder_context)
6354 for (i = 0; i < 6; i++)
6355 gen9_hevc_pak_set_qm(ctx,
6360 for (i = 0; i < 6; i++)
6361 gen9_hevc_pak_set_qm(ctx,
6366 for (i = 0; i < 6; i++)
6367 gen9_hevc_pak_set_qm(ctx,
6368 2, i % 3, i / 3, 16,
6372 for (i = 0; i < 2; i++)
6373 gen9_hevc_pak_set_qm(ctx,
6380 gen9_hevc_pak_set_fqm(VADriverContextP ctx,
6382 int color_component,
6387 struct intel_encoder_context *encoder_context)
6389 struct intel_batchbuffer *batch = encoder_context->base.batch;
6390 unsigned int fqm_buffer[32];
6392 memset(fqm_buffer, 0, sizeof(fqm_buffer));
6393 memcpy(fqm_buffer, fqm, fqm_length * 4);
6395 BEGIN_BCS_BATCH(batch, 34);
6397 OUT_BCS_BATCH(batch, HCP_FQM_STATE | (34 - 2));
6398 OUT_BCS_BATCH(batch,
6400 color_component << 3 |
6403 intel_batchbuffer_data(batch, fqm_buffer, 32 * 4);
6405 ADVANCE_BCS_BATCH(batch);
6408 static unsigned int fm_default[32] = {
6409 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6410 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6411 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6412 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6413 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6414 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6415 0x10001000, 0x10001000, 0x10001000, 0x10001000,
6416 0x10001000, 0x10001000, 0x10001000, 0x10001000
6420 gen9_hevc_pak_add_fm_state(VADriverContextP ctx,
6421 struct encode_state *encode_state,
6422 struct intel_encoder_context *encoder_context)
6424 gen9_hevc_pak_set_fqm(ctx,
6428 gen9_hevc_pak_set_fqm(ctx,
6432 gen9_hevc_pak_set_fqm(ctx,
6436 gen9_hevc_pak_set_fqm(ctx,
6440 gen9_hevc_pak_set_fqm(ctx,
6444 gen9_hevc_pak_set_fqm(ctx,
6448 gen9_hevc_pak_set_fqm(ctx,
6452 gen9_hevc_pak_set_fqm(ctx,
6459 gen9_hevc_set_reflist(VADriverContextP ctx,
6460 struct gen9_hevc_encoder_context *priv_ctx,
6461 VAEncPictureParameterBufferHEVC *pic_param,
6462 VAEncSliceParameterBufferHEVC *slice_param,
6464 struct intel_batchbuffer *batch)
6466 struct i965_driver_data *i965 = i965_driver_data(ctx);
6467 int num_ref_minus1 = (list_idx ?
6468 slice_param->num_ref_idx_l1_active_minus1 :
6469 slice_param->num_ref_idx_l0_active_minus1);
6470 VAPictureHEVC *ref_list = (list_idx ?
6471 slice_param->ref_pic_list1 :
6472 slice_param->ref_pic_list0);
6473 VAPictureHEVC *curr_pic = &pic_param->decoded_curr_pic;
6474 struct object_surface *obj_surface = NULL;
6478 BEGIN_BCS_BATCH(batch, 18);
6480 OUT_BCS_BATCH(batch, HCP_REF_IDX_STATE | (18 - 2));
6481 OUT_BCS_BATCH(batch,
6482 num_ref_minus1 << 1 |
6485 for (i = 0; i < 16; i++) {
6487 obj_surface = SURFACE(ref_list[i].picture_id);
6488 if (i < MIN((num_ref_minus1 + 1), GEN9_MAX_REF_SURFACES) && obj_surface) {
6489 for (j = 0; j < GEN9_MAX_REF_SURFACES; j++) {
6490 if (obj_surface == priv_ctx->reference_surfaces[j].obj_surface) {
6497 if (i < MIN((num_ref_minus1 + 1), GEN9_MAX_REF_SURFACES) &&
6499 OUT_BCS_BATCH(batch,
6502 !!(ref_list[i].flags & VA_PICTURE_HEVC_LONG_TERM_REFERENCE) << 13 |
6506 (CLAMP(-128, 127, curr_pic->pic_order_cnt -
6507 ref_list[i].pic_order_cnt) & 0xff));
6509 OUT_BCS_BATCH(batch, 0);
6513 ADVANCE_BCS_BATCH(batch);
6517 gen9_hevc_pak_add_slice_state(VADriverContextP ctx,
6518 struct encode_state *encode_state,
6519 struct intel_encoder_context *encoder_context,
6521 struct intel_batchbuffer *batch)
6523 struct i965_driver_data *i965 = i965_driver_data(ctx);
6524 struct encoder_vme_mfc_context *pak_context = NULL;
6525 struct gen9_hevc_encoder_state *priv_state = NULL;
6526 VAEncPictureParameterBufferHEVC *pic_param = NULL;
6527 VAEncSliceParameterBufferHEVC *slice_param = NULL;
6528 int slice_hor_pos, slice_ver_pos, next_slice_hor_pos, next_slice_ver_pos;
6529 int slice_type = 0, slice_end = 0, last_slice = 0;
6530 int collocated_ref_idx = 0;
6532 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6533 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
6534 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
6535 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice_idx]->buffer;
6537 slice_type = slice_param->slice_type;
6538 slice_end = slice_param->slice_segment_address + slice_param->num_ctu_in_slice;
6539 slice_hor_pos = slice_param->slice_segment_address % priv_state->width_in_lcu;
6540 slice_ver_pos = slice_param->slice_segment_address / priv_state->width_in_lcu;
6541 next_slice_hor_pos = slice_end % priv_state->width_in_lcu;
6542 next_slice_ver_pos = slice_end / priv_state->width_in_lcu;
6544 if (slice_end >= priv_state->width_in_lcu * priv_state->height_in_lcu ||
6545 slice_idx == encode_state->num_slice_params_ext - 1)
6548 if (priv_state->picture_coding_type != HEVC_SLICE_I &&
6549 slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag &&
6550 slice_param->slice_fields.bits.collocated_from_l0_flag)
6551 collocated_ref_idx = pic_param->collocated_ref_pic_index;
6553 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
6554 BEGIN_BCS_BATCH(batch, 11);
6556 OUT_BCS_BATCH(batch, HCP_SLICE_STATE | (11 - 2));
6558 BEGIN_BCS_BATCH(batch, 9);
6560 OUT_BCS_BATCH(batch, HCP_SLICE_STATE | (9 - 2));
6563 OUT_BCS_BATCH(batch,
6564 slice_ver_pos << 16 |
6566 OUT_BCS_BATCH(batch,
6567 next_slice_ver_pos << 16 |
6568 next_slice_hor_pos);
6569 OUT_BCS_BATCH(batch,
6570 (slice_param->slice_cr_qp_offset & 0x1f) << 17 |
6571 (slice_param->slice_cb_qp_offset & 0x1f) << 12 |
6572 (pic_param->pic_init_qp + slice_param->slice_qp_delta) << 6 |
6573 slice_param->slice_fields.bits.slice_temporal_mvp_enabled_flag << 5 |
6574 slice_param->slice_fields.bits.dependent_slice_segment_flag << 4 |
6577 OUT_BCS_BATCH(batch,
6578 collocated_ref_idx << 26 |
6579 (slice_param->max_num_merge_cand - 1) << 23 |
6580 slice_param->slice_fields.bits.cabac_init_flag << 22 |
6581 slice_param->luma_log2_weight_denom << 19 |
6582 (slice_param->luma_log2_weight_denom + slice_param->delta_chroma_log2_weight_denom) << 16 |
6583 slice_param->slice_fields.bits.collocated_from_l0_flag << 15 |
6584 priv_state->low_delay << 14 |
6585 slice_param->slice_fields.bits.mvd_l1_zero_flag << 13 |
6586 slice_param->slice_fields.bits.slice_sao_luma_flag << 12 |
6587 slice_param->slice_fields.bits.slice_sao_chroma_flag << 11 |
6588 slice_param->slice_fields.bits.slice_loop_filter_across_slices_enabled_flag << 10 |
6589 (slice_param->slice_beta_offset_div2 & 0xf) << 5 |
6590 (slice_param->slice_tc_offset_div2 & 0xf) << 1 |
6591 slice_param->slice_fields.bits.slice_deblocking_filter_disabled_flag);
6592 OUT_BCS_BATCH(batch, 0);
6594 if (!pic_param->pic_fields.bits.reference_pic_flag &&
6595 priv_state->picture_coding_type != HEVC_SLICE_I)
6596 OUT_BCS_BATCH(batch, 0 << 26 |
6599 OUT_BCS_BATCH(batch, 5 << 26 |
6602 OUT_BCS_BATCH(batch,
6608 OUT_BCS_BATCH(batch, 0);
6610 if (IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) {
6611 OUT_BCS_BATCH(batch, 0);
6612 OUT_BCS_BATCH(batch, 0);
6615 ADVANCE_BCS_BATCH(batch);
6619 gen9_hevc_find_skipemulcnt(unsigned char *buf, unsigned int bits_length)
6621 int skip_cnt = 0, i = 0;
6623 if ((bits_length >> 3) < 6)
6626 for (i = 0; i < 3; i++)
6639 gen9_hevc_pak_insert_object(unsigned int *data_buffer,
6640 unsigned int data_size,
6641 unsigned char emulation_flag,
6643 int is_end_of_slice,
6644 int skip_emul_byte_cnt,
6645 struct intel_batchbuffer *batch)
6647 int length_in_dws = ALIGN(data_size, 32) >> 5;
6648 int data_bits_in_last_dw = data_size & 0x1f;
6649 int skip_cnt = skip_emul_byte_cnt;
6651 if (data_bits_in_last_dw == 0)
6652 data_bits_in_last_dw = 32;
6654 if (emulation_flag) {
6656 skip_cnt = gen9_hevc_find_skipemulcnt((unsigned char *)data_buffer,
6660 BEGIN_BCS_BATCH(batch, length_in_dws + 2);
6662 OUT_BCS_BATCH(batch, HCP_INSERT_PAK_OBJECT | (length_in_dws + 2 - 2));
6663 OUT_BCS_BATCH(batch,
6667 (data_bits_in_last_dw << 8) |
6669 ((!!emulation_flag) << 3) |
6670 ((!!is_last_header) << 2) |
6671 ((!!is_end_of_slice) << 1) |
6673 intel_batchbuffer_data(batch, data_buffer, length_in_dws * 4);
6675 ADVANCE_BCS_BATCH(batch);
6679 gen9_hevc_pak_add_refs(VADriverContextP ctx,
6680 struct encode_state *encode_state,
6681 struct intel_encoder_context *encoder_context,
6683 struct intel_batchbuffer *batch)
6685 struct encoder_vme_mfc_context *pak_context = NULL;
6686 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6687 VAEncPictureParameterBufferHEVC *pic_param = NULL;
6688 VAEncSliceParameterBufferHEVC *slice_param = NULL;
6690 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6691 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6692 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
6693 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice_idx]->buffer;
6695 if (slice_param->slice_type == HEVC_SLICE_I)
6698 gen9_hevc_set_reflist(ctx, priv_ctx, pic_param, slice_param, 0, batch);
6700 if (slice_param->slice_type == HEVC_SLICE_P)
6703 gen9_hevc_set_reflist(ctx, priv_ctx, pic_param, slice_param, 1, batch);
6707 gen9_hevc_pak_insert_packed_data(VADriverContextP ctx,
6708 struct encode_state *encode_state,
6709 struct intel_encoder_context *encoder_context,
6711 struct intel_batchbuffer *batch)
6713 VAEncPackedHeaderParameterBuffer *param = NULL;
6714 unsigned int *header_data = NULL;
6715 unsigned int length_in_bits = 0;
6716 int packed_type = 0;
6717 int idx = 0, idx_offset = 0;
6720 for (i = 0; i < 4; i++) {
6724 packed_type = VAEncPackedHeaderHEVC_VPS;
6727 packed_type = VAEncPackedHeaderHEVC_VPS;
6731 packed_type = VAEncPackedHeaderHEVC_PPS;
6734 packed_type = VAEncPackedHeaderHEVC_SEI;
6740 idx = va_enc_packed_type_to_idx(packed_type) + idx_offset;
6741 if (encode_state->packed_header_data[idx]) {
6742 param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_param[idx]->buffer;
6743 header_data = (unsigned int *)encode_state->packed_header_data[idx]->buffer;
6744 length_in_bits = param->bit_length;
6746 gen9_hevc_pak_insert_object(header_data, length_in_bits,
6747 !param->has_emulation_bytes, 0, 0, 0,
6754 gen9_hevc_pak_insert_slice_header(VADriverContextP ctx,
6755 struct encode_state *encode_state,
6756 struct intel_encoder_context *encoder_context,
6758 struct intel_batchbuffer *batch)
6760 VAEncPackedHeaderParameterBuffer *param = NULL;
6761 unsigned int *header_data = NULL;
6762 unsigned int length_in_bits = 0;
6763 int count = 0, start_index = -1;
6766 count = encode_state->slice_rawdata_count[slice_idx];
6767 start_index = encode_state->slice_rawdata_index[slice_idx] &
6768 SLICE_PACKED_DATA_INDEX_MASK;
6770 for (i = 0; i < count; i++) {
6771 param = (VAEncPackedHeaderParameterBuffer *)
6772 (encode_state->packed_header_params_ext[start_index + i]->buffer);
6774 if (param->type == VAEncPackedHeaderSlice)
6777 header_data = (unsigned int *)encode_state->packed_header_data_ext[start_index]->buffer;
6778 length_in_bits = param->bit_length;
6779 gen9_hevc_pak_insert_object(header_data, length_in_bits,
6780 !param->has_emulation_bytes, 0, 0, 0,
6785 if (encode_state->slice_header_index[slice_idx] & SLICE_PACKED_DATA_INDEX_TYPE)
6786 start_index = encode_state->slice_header_index[slice_idx] &
6787 SLICE_PACKED_DATA_INDEX_MASK;
6788 if (start_index == -1) {
6789 VAEncSequenceParameterBufferHEVC *seq_param = (VAEncSequenceParameterBufferHEVC *)encode_state->seq_param_ext->buffer;
6790 VAEncPictureParameterBufferHEVC *pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
6791 VAEncSliceParameterBufferHEVC *slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice_idx]->buffer;
6792 unsigned char *slice_header = NULL;
6793 int slice_header_bits = 0;
6795 slice_header_bits = build_hevc_slice_header(seq_param,
6801 gen9_hevc_pak_insert_object((unsigned int *)slice_header, slice_header_bits,
6807 param = (VAEncPackedHeaderParameterBuffer *)
6808 (encode_state->packed_header_params_ext[start_index]->buffer);
6809 header_data = (unsigned int *)encode_state->packed_header_data_ext[start_index]->buffer;
6810 length_in_bits = param->bit_length;
6812 gen9_hevc_pak_insert_object(header_data, length_in_bits,
6813 !param->has_emulation_bytes, 1, 0, 0,
6819 gen9_hevc_pak_slice_level(VADriverContextP ctx,
6820 struct encode_state *encode_state,
6821 struct intel_encoder_context *encoder_context,
6824 struct intel_batchbuffer *batch = encoder_context->base.batch;
6825 struct encoder_vme_mfc_context *pak_context = NULL;
6826 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6827 struct generic_enc_codec_state *generic_state = NULL;
6828 struct gen9_hevc_encoder_state *priv_state = NULL;
6829 VAEncSliceParameterBufferHEVC *slice_param = NULL;
6830 struct intel_batchbuffer *slice_batch = NULL;
6831 struct gpe_mi_batch_buffer_start_parameter second_level_batch;
6832 VAStatus va_status = VA_STATUS_SUCCESS;
6833 int slice_offset = 0;
6835 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6836 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6837 generic_state = (struct generic_enc_codec_state *)pak_context->generic_enc_state;
6838 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
6839 slice_param = (VAEncSliceParameterBufferHEVC *)encode_state->slice_params_ext[slice_idx]->buffer;
6841 slice_batch = priv_ctx->res_pak_slice_batch_buffer;
6843 if (generic_state->curr_pak_pass == 0) {
6844 slice_offset = intel_batchbuffer_used_size(slice_batch);
6845 priv_state->slice_batch_offset[slice_idx] = slice_offset;
6847 if (slice_idx < encode_state->num_slice_params_ext - 1)
6848 priv_state->slice_start_lcu[slice_idx + 1] =
6849 priv_state->slice_start_lcu[slice_idx] +
6850 slice_param->num_ctu_in_slice;
6852 gen9_hevc_pak_add_refs(ctx, encode_state, encoder_context,
6853 slice_idx, slice_batch);
6854 gen9_hevc_pak_add_slice_state(ctx, encode_state, encoder_context,
6855 slice_idx, slice_batch);
6858 gen9_hevc_pak_insert_packed_data(ctx, encode_state, encoder_context,
6859 slice_idx, slice_batch);
6861 gen9_hevc_pak_insert_slice_header(ctx, encode_state, encoder_context,
6862 slice_idx, slice_batch);
6864 BEGIN_BCS_BATCH(slice_batch, 2);
6865 OUT_BCS_BATCH(slice_batch, 0);
6866 OUT_BCS_BATCH(slice_batch, MI_BATCH_BUFFER_END);
6867 ADVANCE_BCS_BATCH(slice_batch);
6869 slice_offset = priv_state->slice_batch_offset[slice_idx];
6871 memset(&second_level_batch, 0, sizeof(second_level_batch));
6872 second_level_batch.offset = slice_offset;
6873 second_level_batch.is_second_level = 1;
6874 second_level_batch.bo = slice_batch->buffer;
6875 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
6877 memset(&second_level_batch, 0, sizeof(second_level_batch));
6878 second_level_batch.offset = priv_state->slice_start_lcu[slice_idx] *
6879 priv_state->pak_obj_size;
6880 second_level_batch.is_second_level = 1;
6881 second_level_batch.bo = priv_ctx->res_mb_code_surface.bo;
6882 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
6888 gen9_hevc_pak_pipeline_prepare(VADriverContextP ctx,
6889 struct encode_state *encode_state,
6890 struct intel_encoder_context *encoder_context)
6892 struct i965_driver_data *i965 = i965_driver_data(ctx);
6893 struct encoder_vme_mfc_context *pak_context = NULL;
6894 struct gen9_hevc_encoder_context *priv_ctx = NULL;
6895 struct gen9_hevc_encoder_state *priv_state = NULL;
6896 struct gen9_hevc_surface_priv *surface_priv;
6897 VAEncPictureParameterBufferHEVC *pic_param = NULL;
6898 struct i965_coded_buffer_segment *coded_buffer_segment = NULL;
6899 struct object_surface *obj_surface = NULL;
6900 struct object_buffer *obj_buffer = NULL;
6904 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
6905 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
6906 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
6907 pic_param = (VAEncPictureParameterBufferHEVC *)encode_state->pic_param_ext->buffer;
6909 if (priv_ctx->uncompressed_picture_source.obj_surface &&
6910 priv_ctx->uncompressed_picture_source.obj_surface->bo)
6911 dri_bo_unreference(priv_ctx->uncompressed_picture_source.obj_surface->bo);
6912 priv_ctx->uncompressed_picture_source.obj_surface = encode_state->input_yuv_object;
6913 priv_ctx->uncompressed_picture_source.surface_id = encoder_context->input_yuv_surface;
6914 dri_bo_reference(priv_ctx->uncompressed_picture_source.obj_surface->bo);
6916 if (priv_ctx->reconstructed_object.obj_surface &&
6917 priv_ctx->reconstructed_object.obj_surface->bo)
6918 dri_bo_unreference(priv_ctx->reconstructed_object.obj_surface->bo);
6919 priv_ctx->reconstructed_object.obj_surface = encode_state->reconstructed_object;
6920 priv_ctx->reconstructed_object.surface_id = pic_param->decoded_curr_pic.picture_id;
6921 dri_bo_reference(priv_ctx->reconstructed_object.obj_surface->bo);
6923 surface_priv = (struct gen9_hevc_surface_priv *)encode_state->reconstructed_object->private_data;
6925 if (priv_ctx->mv_temporal_buffer[GEN9_MAX_MV_TEMPORAL_BUFFERS - 1].bo)
6926 dri_bo_unreference(priv_ctx->mv_temporal_buffer[GEN9_MAX_MV_TEMPORAL_BUFFERS - 1].bo);
6927 priv_ctx->mv_temporal_buffer[GEN9_MAX_MV_TEMPORAL_BUFFERS - 1].bo =
6928 surface_priv->motion_vector_temporal_bo;
6929 dri_bo_reference(surface_priv->motion_vector_temporal_bo);
6932 if (priv_state->picture_coding_type != HEVC_SLICE_I) {
6933 for (i = 0; i < GEN9_MAX_REF_SURFACES; i++) {
6934 obj_surface = encode_state->reference_objects[i];
6935 if (obj_surface && obj_surface->bo) {
6936 if (priv_ctx->reference_surfaces[i].obj_surface &&
6937 priv_ctx->reference_surfaces[i].obj_surface->bo)
6938 dri_bo_unreference(priv_ctx->reference_surfaces[i].obj_surface->bo);
6939 priv_ctx->reference_surfaces[i].obj_surface = obj_surface;
6940 priv_ctx->reference_surfaces[i].surface_id = pic_param->reference_frames[i].picture_id;
6941 dri_bo_reference(obj_surface->bo);
6943 surface_priv = (struct gen9_hevc_surface_priv *) obj_surface->private_data;
6945 if (priv_ctx->mv_temporal_buffer[i].bo)
6946 dri_bo_unreference(priv_ctx->mv_temporal_buffer[i].bo);
6947 priv_ctx->mv_temporal_buffer[i].bo = surface_priv->motion_vector_temporal_bo;
6948 dri_bo_reference(surface_priv->motion_vector_temporal_bo);
6956 obj_buffer = encode_state->coded_buf_object;
6957 bo = obj_buffer->buffer_store->bo;
6959 if (priv_ctx->indirect_pak_bse_object.bo)
6960 dri_bo_unreference(priv_ctx->indirect_pak_bse_object.bo);
6961 priv_ctx->indirect_pak_bse_object.offset = I965_CODEDBUFFER_HEADER_SIZE;
6962 priv_ctx->indirect_pak_bse_object.end_offset = ALIGN((obj_buffer->size_element - 0x1000), 0x1000);
6963 priv_ctx->indirect_pak_bse_object.bo = bo;
6964 dri_bo_reference(priv_ctx->indirect_pak_bse_object.bo);
6969 return VA_STATUS_ERROR_INVALID_VALUE;
6971 coded_buffer_segment = (struct i965_coded_buffer_segment *)bo->virtual;
6972 coded_buffer_segment->mapped = 0;
6973 coded_buffer_segment->codec = encoder_context->codec;
6974 coded_buffer_segment->status_support = 1;
6978 if (priv_ctx->res_pak_slice_batch_buffer)
6979 intel_batchbuffer_free(priv_ctx->res_pak_slice_batch_buffer);
6981 priv_ctx->res_pak_slice_batch_buffer =
6982 intel_batchbuffer_new(&i965->intel, I915_EXEC_BSD,
6983 GEN9_HEVC_ENC_PAK_SLICE_STATE_SIZE *
6984 encode_state->num_slice_params_ext);
6985 if (!priv_ctx->res_pak_slice_batch_buffer)
6986 return VA_STATUS_ERROR_ALLOCATION_FAILED;
6988 for (i = 0; i < NUM_SLICES; i++) {
6989 priv_state->slice_batch_offset[i] = 0;
6990 priv_state->slice_start_lcu[i] = 0;
6993 return VA_STATUS_SUCCESS;
6997 gen9_hevc_pak_picture_level(VADriverContextP ctx,
6998 struct encode_state *encode_state,
6999 struct intel_encoder_context *encoder_context)
7001 struct intel_batchbuffer *batch = encoder_context->base.batch;
7002 struct encoder_vme_mfc_context *pak_context = NULL;
7003 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7004 struct generic_enc_codec_state *generic_state = NULL;
7005 struct gen9_hevc_encoder_state *priv_state = NULL;
7006 struct gpe_mi_batch_buffer_start_parameter second_level_batch;
7007 struct hevc_encode_status_buffer *status_buffer = NULL;
7008 VAStatus va_status = VA_STATUS_SUCCESS;
7011 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
7012 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
7013 generic_state = (struct generic_enc_codec_state *)pak_context->generic_enc_state;
7014 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
7015 status_buffer = &priv_state->status_buffer;
7017 if (generic_state->brc_enabled &&
7018 generic_state->curr_pak_pass) {
7019 gen9_hevc_conditional_end(ctx,
7020 batch, status_buffer->bo,
7021 status_buffer->status_image_mask_offset,
7024 gen9_hevc_load_reg_mem(ctx,
7025 batch, status_buffer->bo,
7026 status_buffer->status_image_ctrl_offset,
7027 status_buffer->mmio_image_ctrl_offset);
7029 gen9_hevc_store_reg_mem(ctx, batch, priv_ctx->res_brc_pak_statistic_buffer.bo,
7030 offsetof(GEN9_HEVC_PAK_STATES, HEVC_ENC_IMAGE_STATUS_CONTROL_FOR_LAST_PASS),
7031 status_buffer->mmio_image_ctrl_offset);
7033 gen9_hevc_store_reg_mem(ctx, batch, status_buffer->bo,
7034 status_buffer->status_image_ctrl_last_pass_offset,
7035 status_buffer->mmio_image_ctrl_offset);
7038 gen9_hevc_pak_pipe_mode_select(ctx, encode_state, encoder_context);
7039 gen9_hevc_pak_add_surface_state(ctx, encode_state, encoder_context,
7040 encode_state->input_yuv_object,
7041 GEN9_HEVC_ENC_SURFACE_SOURCE);
7042 gen9_hevc_pak_add_surface_state(ctx, encode_state, encoder_context,
7043 encode_state->reconstructed_object,
7044 GEN9_HEVC_ENC_SURFACE_RECON);
7045 gen9_hevc_pak_add_pipe_buf_addr_state(ctx, encode_state, encoder_context);
7046 gen9_hevc_pak_add_ind_obj_base_addr_state(ctx, encode_state, encoder_context);
7047 gen9_hevc_pak_add_qm_state(ctx, encode_state, encoder_context);
7048 gen9_hevc_pak_add_fm_state(ctx, encode_state, encoder_context);
7050 if (generic_state->brc_enabled) {
7051 memset(&second_level_batch, 0, sizeof(second_level_batch));
7053 second_level_batch.offset = generic_state->curr_pak_pass * priv_state->pic_state_size;
7054 second_level_batch.bo = priv_ctx->res_brc_pic_states_write_buffer.bo;
7055 second_level_batch.is_second_level = 1;
7056 gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
7058 gen9_hevc_add_pic_state(ctx, encode_state, encoder_context, NULL, 0, 0);
7060 for (i = 0; i < encode_state->num_slice_params_ext; i++) {
7061 va_status = gen9_hevc_pak_slice_level(ctx, encode_state, encoder_context, i);
7062 if (va_status != VA_STATUS_SUCCESS)
7071 gen9_hevc_pak_read_status(VADriverContextP ctx,
7072 struct intel_encoder_context *encoder_context)
7074 struct intel_batchbuffer *batch = encoder_context->base.batch;
7075 struct encoder_vme_mfc_context *pak_context = NULL;
7076 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7077 struct generic_enc_codec_state *generic_state = NULL;
7078 struct gen9_hevc_encoder_state *priv_state = NULL;
7079 struct gpe_mi_flush_dw_parameter mi_flush_dw_param;
7080 struct hevc_encode_status_buffer *status_buffer = NULL;
7082 pak_context = (struct encoder_vme_mfc_context *)encoder_context->vme_context;
7083 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
7084 generic_state = (struct generic_enc_codec_state *)pak_context->generic_enc_state;
7085 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
7087 status_buffer = &priv_state->status_buffer;
7089 memset(&mi_flush_dw_param, 0, sizeof(mi_flush_dw_param));
7090 gen8_gpe_mi_flush_dw(ctx, batch, &mi_flush_dw_param);
7092 gen9_hevc_store_reg_mem(ctx, batch, status_buffer->bo,
7093 status_buffer->status_bs_byte_count_offset,
7094 status_buffer->mmio_bs_frame_offset);
7096 gen9_hevc_store_reg_mem(ctx, batch, status_buffer->bo,
7097 status_buffer->status_image_mask_offset,
7098 status_buffer->mmio_image_mask_offset);
7100 gen9_hevc_store_reg_mem(ctx, batch, status_buffer->bo,
7101 status_buffer->status_image_ctrl_offset,
7102 status_buffer->mmio_image_ctrl_offset);
7104 if (generic_state->brc_enabled) {
7105 gen9_hevc_store_reg_mem(ctx, batch, priv_ctx->res_brc_pak_statistic_buffer.bo,
7106 offsetof(GEN9_HEVC_PAK_STATES, HEVC_ENC_BYTECOUNT_FRAME),
7107 status_buffer->mmio_bs_frame_offset);
7108 gen9_hevc_store_reg_mem(ctx, batch, priv_ctx->res_brc_pak_statistic_buffer.bo,
7109 offsetof(GEN9_HEVC_PAK_STATES, HEVC_ENC_BYTECOUNT_FRAME_NOHEADER),
7110 status_buffer->mmio_bs_frame_no_header_offset);
7111 gen9_hevc_store_reg_mem(ctx, batch, priv_ctx->res_brc_pak_statistic_buffer.bo,
7112 offsetof(GEN9_HEVC_PAK_STATES, HEVC_ENC_IMAGE_STATUS_CONTROL),
7113 status_buffer->mmio_image_ctrl_offset);
7116 gen8_gpe_mi_flush_dw(ctx, batch, &mi_flush_dw_param);
7120 gen9_hevc_pak_pipeline(VADriverContextP ctx,
7122 struct encode_state *encode_state,
7123 struct intel_encoder_context *encoder_context)
7125 struct i965_driver_data *i965 = i965_driver_data(ctx);
7126 struct intel_batchbuffer *batch = encoder_context->base.batch;
7127 struct encoder_vme_mfc_context *pak_context = encoder_context->vme_context;
7128 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7129 struct generic_enc_codec_state *generic_state = NULL;
7130 struct gen9_hevc_encoder_state *priv_state = NULL;
7131 VAStatus va_status = VA_STATUS_SUCCESS;
7133 if (!pak_context || !pak_context->generic_enc_state || !batch) {
7134 va_status = VA_STATUS_ERROR_INVALID_CONTEXT;
7138 va_status = gen9_hevc_pak_pipeline_prepare(ctx, encode_state, encoder_context);
7139 if (va_status != VA_STATUS_SUCCESS)
7142 if (i965->intel.has_bsd2)
7143 intel_batchbuffer_start_atomic_bcs_override(batch, 0x1000, BSD_RING0);
7145 intel_batchbuffer_start_atomic_bcs(batch, 0x1000);
7147 intel_batchbuffer_emit_mi_flush(batch);
7149 generic_state = (struct generic_enc_codec_state *)pak_context->generic_enc_state;
7150 priv_state = (struct gen9_hevc_encoder_state *)pak_context->private_enc_state;
7151 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
7153 for (generic_state->curr_pak_pass = 0;
7154 generic_state->curr_pak_pass < generic_state->num_pak_passes;
7155 generic_state->curr_pak_pass++) {
7156 va_status = gen9_hevc_pak_picture_level(ctx, encode_state, encoder_context);
7157 if (va_status != VA_STATUS_SUCCESS)
7160 gen9_hevc_pak_read_status(ctx, encoder_context);
7163 if (priv_ctx->res_pak_slice_batch_buffer) {
7164 intel_batchbuffer_free(priv_ctx->res_pak_slice_batch_buffer);
7166 priv_ctx->res_pak_slice_batch_buffer = NULL;
7169 intel_batchbuffer_end_atomic(batch);
7171 intel_batchbuffer_flush(batch);
7173 priv_state->frame_number++;
7180 gen9_hevc_pak_context_destroy(void *context)
7182 struct encoder_vme_mfc_context *pak_context = (struct encoder_vme_mfc_context *)context;
7183 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7186 priv_ctx = (struct gen9_hevc_encoder_context *)pak_context->private_enc_ctx;
7188 if (priv_ctx->res_pak_slice_batch_buffer) {
7189 intel_batchbuffer_free(priv_ctx->res_pak_slice_batch_buffer);
7190 priv_ctx->res_pak_slice_batch_buffer = NULL;
7193 dri_bo_unreference(priv_ctx->indirect_pak_bse_object.bo);
7194 priv_ctx->indirect_pak_bse_object.bo = NULL;
7196 if (priv_ctx->uncompressed_picture_source.obj_surface &&
7197 priv_ctx->uncompressed_picture_source.obj_surface->bo)
7198 i965_destroy_surface_storage(priv_ctx->uncompressed_picture_source.obj_surface);
7200 if (priv_ctx->reconstructed_object.obj_surface &&
7201 priv_ctx->reconstructed_object.obj_surface->bo)
7202 i965_destroy_surface_storage(priv_ctx->reconstructed_object.obj_surface);
7204 for (i = 0; i < GEN9_MAX_REF_SURFACES; i++)
7205 if (priv_ctx->reference_surfaces[i].obj_surface &&
7206 priv_ctx->reference_surfaces[i].obj_surface->bo)
7207 i965_destroy_surface_storage(priv_ctx->reference_surfaces[i].obj_surface);
7210 #define STATUS_IMPLEMENTATION_START
7213 gen9_hevc_status_buffer_init(struct hevc_encode_status_buffer *status_buffer)
7215 uint32_t base_offset = offsetof(struct i965_coded_buffer_segment, codec_private_data);
7217 status_buffer->mmio_bs_frame_offset = MMIO_HCP_ENC_BITSTREAM_BYTECOUNT_FRAME_OFFSET;
7218 status_buffer->mmio_bs_frame_no_header_offset = MMIO_HCP_ENC_BITSTREAM_BYTECOUNT_FRAME_NO_HEADER_OFFSET;
7219 status_buffer->mmio_image_mask_offset = MMIO_HCP_ENC_IMAGE_STATUS_MASK_OFFSET;
7220 status_buffer->mmio_image_ctrl_offset = MMIO_HCP_ENC_IMAGE_STATUS_CTRL_OFFSET;
7222 status_buffer->status_image_mask_offset = base_offset +
7223 offsetof(struct hevc_encode_status, image_status_mask);
7224 status_buffer->status_image_ctrl_offset = base_offset +
7225 offsetof(struct hevc_encode_status, image_status_ctrl);
7226 status_buffer->status_image_ctrl_last_pass_offset = base_offset +
7227 offsetof(struct hevc_encode_status, image_status_ctrl_last_pass);
7228 status_buffer->status_bs_byte_count_offset = base_offset +
7229 offsetof(struct hevc_encode_status, bs_byte_count);
7230 status_buffer->status_media_state_offset = base_offset +
7231 offsetof(struct hevc_encode_status, media_state);
7232 status_buffer->status_pass_num_offset = base_offset +
7233 offsetof(struct hevc_encode_status, pass_num);
7237 gen9_hevc_get_coded_status(VADriverContextP ctx,
7238 struct intel_encoder_context *encoder_context,
7239 struct i965_coded_buffer_segment *coded_buf_seg)
7241 struct hevc_encode_status *encode_status;
7242 struct hevc_enc_image_status_ctrl *image_status_ctrl, *image_status_ctrl_last_pass;
7244 if (!encoder_context || !coded_buf_seg)
7245 return VA_STATUS_ERROR_INVALID_BUFFER;
7247 encode_status = (struct hevc_encode_status *)coded_buf_seg->codec_private_data;
7249 coded_buf_seg->base.size = encode_status->bs_byte_count;
7251 image_status_ctrl = (struct hevc_enc_image_status_ctrl *)&encode_status->image_status_ctrl;
7252 image_status_ctrl_last_pass = (struct hevc_enc_image_status_ctrl *)&encode_status->image_status_ctrl_last_pass;
7254 if (image_status_ctrl->total_pass && image_status_ctrl->cumulative_frame_delta_qp == 0)
7255 image_status_ctrl->cumulative_frame_delta_qp = image_status_ctrl_last_pass->cumulative_frame_delta_qp;
7257 image_status_ctrl_last_pass->cumulative_frame_delta_qp = 0;
7259 return VA_STATUS_SUCCESS;
7262 // External initial APIs
7265 gen9_hevc_vme_context_init(VADriverContextP ctx,
7266 struct intel_encoder_context *encoder_context)
7268 struct i965_driver_data *i965 = i965_driver_data(ctx);
7269 struct encoder_vme_mfc_context *vme_context = NULL;
7270 struct gen9_hevc_encoder_context *priv_ctx = NULL;
7271 struct generic_enc_codec_state *generic_state = NULL;
7272 struct gen9_hevc_encoder_state *priv_state = NULL;
7274 hevc_enc_kernel_ptr = (void *)gen9_hevc_encoder_kernels;
7275 hevc_enc_kernel_size = sizeof(gen9_hevc_encoder_kernels);
7277 vme_context = calloc(1, sizeof(*vme_context));
7278 priv_ctx = calloc(1, sizeof(*priv_ctx));
7279 generic_state = calloc(1, sizeof(*generic_state));
7280 priv_state = calloc(1, sizeof(*priv_state));
7282 if (!vme_context || !generic_state ||
7283 !priv_ctx || !priv_state) {
7284 if (vme_context) free(vme_context);
7285 if (generic_state) free(generic_state);
7286 if (priv_ctx) free(priv_ctx);
7287 if (priv_state) free(priv_state);
7292 encoder_context->vme_context = (void *)vme_context;
7293 vme_context->private_enc_ctx = (void *)priv_ctx;
7294 vme_context->generic_enc_state = (void *)generic_state;
7295 vme_context->private_enc_state = (void *)priv_state;
7297 priv_ctx->ctx = ctx;
7298 priv_ctx->mocs = i965->intel.mocs_state;
7300 generic_state->num_pak_passes = 1;
7301 generic_state->brc_enabled = 0;
7303 priv_state->tu_mode = HEVC_TU_RT_SPEED;
7304 priv_state->use_hw_scoreboard = 1;
7305 priv_state->use_hw_non_stalling_scoreborad = 1;
7306 priv_state->rolling_intra_refresh = 0;
7307 priv_state->flatness_check_supported = 0;
7308 priv_state->walking_pattern_26 = 0;
7309 priv_state->num_regions_in_slice = 4;
7310 priv_state->frames_per_100s = 30000;
7311 priv_state->user_max_frame_size = 0;
7312 priv_state->brc_method = HEVC_BRC_CQP;
7313 priv_state->lcu_brc_enabled = 0;
7314 priv_state->parallel_brc = 0;
7315 priv_state->pak_obj_size = ((IS_KBL(i965->intel.device_info) || IS_GLK(i965->intel.device_info)) ?
7316 GEN95_HEVC_ENC_PAK_OBJ_SIZE :
7317 GEN9_HEVC_ENC_PAK_OBJ_SIZE) *
7319 priv_state->cu_record_size = GEN9_HEVC_ENC_PAK_CU_RECORD_SIZE * 4;
7320 priv_state->pic_state_size = GEN9_HEVC_ENC_BRC_PIC_STATE_SIZE;
7322 gen9_hevc_status_buffer_init(&priv_state->status_buffer);
7323 gen9_hevc_vme_kernels_context_init(ctx, encoder_context);
7324 gen9_hevc_lambda_tables_init(priv_ctx);
7326 encoder_context->vme_pipeline = gen9_hevc_vme_pipeline;
7327 encoder_context->vme_context_destroy = gen9_hevc_vme_context_destroy;
7332 gen9_hevc_pak_context_init(VADriverContextP ctx,
7333 struct intel_encoder_context *encoder_context)
7335 struct encoder_vme_mfc_context *pak_context = encoder_context->vme_context;
7340 encoder_context->mfc_context = pak_context;
7341 encoder_context->mfc_context_destroy = gen9_hevc_pak_context_destroy;
7342 encoder_context->mfc_pipeline = gen9_hevc_pak_pipeline;
7343 encoder_context->mfc_brc_prepare = gen9_hevc_brc_prepare;
7344 encoder_context->get_status = gen9_hevc_get_coded_status;