summaryrefslogtreecommitdiff
path: root/src/gen9_vp9_encoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen9_vp9_encoder.c')
-rw-r--r--src/gen9_vp9_encoder.c5885
1 files changed, 0 insertions, 5885 deletions
diff --git a/src/gen9_vp9_encoder.c b/src/gen9_vp9_encoder.c
deleted file mode 100644
index f5c250b..0000000
--- a/src/gen9_vp9_encoder.c
+++ /dev/null
@@ -1,5885 +0,0 @@
-/*
- * Copyright © 2016 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWAR
- *
- * Authors:
- * Zhao, Yakui <yakui.zhao@intel.com>
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <string.h>
-#include <math.h>
-#include <assert.h>
-#include <va/va.h>
-
-#include "intel_batchbuffer.h"
-#include "intel_driver.h"
-
-#include "i965_defines.h"
-#include "i965_drv_video.h"
-#include "i965_encoder.h"
-#include "gen9_vp9_encapi.h"
-#include "gen9_vp9_encoder.h"
-#include "gen9_vp9_encoder_kernels.h"
-#include "vp9_probs.h"
-#include "gen9_vp9_const_def.h"
-
-#define MAX_VP9_ENCODER_SURFACES 64
-
-#define MAX_URB_SIZE 4096 /* In register */
-#define NUM_KERNELS_PER_GPE_CONTEXT 1
-
-#define VP9_BRC_KBPS 1000
-
-#define BRC_KERNEL_CBR 0x0010
-#define BRC_KERNEL_VBR 0x0020
-#define BRC_KERNEL_AVBR 0x0040
-#define BRC_KERNEL_CQL 0x0080
-
-#define DEFAULT_MOCS 0x02
-#define VP9_PIC_STATE_BUFFER_SIZE 192
-
-typedef struct _intel_kernel_header_
-{
- uint32_t reserved : 6;
- uint32_t kernel_start_pointer : 26;
-} intel_kernel_header;
-
-typedef struct _intel_vp9_kernel_header {
- int nKernelCount;
- intel_kernel_header PLY_DSCALE;
- intel_kernel_header VP9_ME_P;
- intel_kernel_header VP9_Enc_I_32x32;
- intel_kernel_header VP9_Enc_I_16x16;
- intel_kernel_header VP9_Enc_P;
- intel_kernel_header VP9_Enc_TX;
- intel_kernel_header VP9_DYS;
-
- intel_kernel_header VP9BRC_Intra_Distortion;
- intel_kernel_header VP9BRC_Init;
- intel_kernel_header VP9BRC_Reset;
- intel_kernel_header VP9BRC_Update;
-} intel_vp9_kernel_header;
-
-#define DYS_1X_FLAG 0x01
-#define DYS_4X_FLAG 0x02
-#define DYS_16X_FLAG 0x04
-
-struct vp9_surface_param {
- uint32_t frame_width;
- uint32_t frame_height;
-};
-
-static uint32_t intel_convert_sign_mag(int val, int sign_bit_pos)
-{
- uint32_t ret_val = 0;
- if (val < 0)
- {
- val = -val;
- ret_val = ((1 << (sign_bit_pos - 1)) | (val & ((1 << (sign_bit_pos - 1)) - 1)));
- }
- else
- {
- ret_val = val & ((1 << (sign_bit_pos - 1)) - 1);
- }
- return ret_val;
-}
-
-static bool
-intel_vp9_get_kernel_header_and_size(
- void *pvbinary,
- int binary_size,
- INTEL_VP9_ENC_OPERATION operation,
- int krnstate_idx,
- struct i965_kernel *ret_kernel)
-{
- typedef uint32_t BIN_PTR[4];
-
- char *bin_start;
- intel_vp9_kernel_header *pkh_table;
- intel_kernel_header *pcurr_header, *pinvalid_entry, *pnext_header;
- int next_krnoffset;
-
- if (!pvbinary || !ret_kernel)
- return false;
-
- bin_start = (char *)pvbinary;
- pkh_table = (intel_vp9_kernel_header *)pvbinary;
- pinvalid_entry = &(pkh_table->VP9BRC_Update) + 1;
- next_krnoffset = binary_size;
-
- if ((operation == INTEL_VP9_ENC_SCALING4X) || (operation == INTEL_VP9_ENC_SCALING2X))
- {
- pcurr_header = &pkh_table->PLY_DSCALE;
- }
- else if (operation == INTEL_VP9_ENC_ME)
- {
- pcurr_header = &pkh_table->VP9_ME_P;
- }
- else if (operation == INTEL_VP9_ENC_MBENC)
- {
- pcurr_header = &pkh_table->VP9_Enc_I_32x32;
- }
- else if (operation == INTEL_VP9_ENC_DYS)
- {
- pcurr_header = &pkh_table->VP9_DYS;
- }
- else if (operation == INTEL_VP9_ENC_BRC)
- {
- pcurr_header = &pkh_table->VP9BRC_Intra_Distortion;
- }
- else
- {
- return false;
- }
-
- pcurr_header += krnstate_idx;
- ret_kernel->bin = (const BIN_PTR *)(bin_start + (pcurr_header->kernel_start_pointer << 6));
-
- pnext_header = (pcurr_header + 1);
- if (pnext_header < pinvalid_entry)
- {
- next_krnoffset = pnext_header->kernel_start_pointer << 6;
- }
- ret_kernel->size = next_krnoffset - (pcurr_header->kernel_start_pointer << 6);
-
- return true;
-}
-
-
-static void
-gen9_free_surfaces_vp9(void **data)
-{
- struct gen9_surface_vp9 *vp9_surface;
-
- if (!data || !*data)
- return;
-
- vp9_surface = *data;
-
- if (vp9_surface->scaled_4x_surface_obj) {
- i965_DestroySurfaces(vp9_surface->ctx, &vp9_surface->scaled_4x_surface_id, 1);
- vp9_surface->scaled_4x_surface_id = VA_INVALID_SURFACE;
- vp9_surface->scaled_4x_surface_obj = NULL;
- }
-
- if (vp9_surface->scaled_16x_surface_obj) {
- i965_DestroySurfaces(vp9_surface->ctx, &vp9_surface->scaled_16x_surface_id, 1);
- vp9_surface->scaled_16x_surface_id = VA_INVALID_SURFACE;
- vp9_surface->scaled_16x_surface_obj = NULL;
- }
-
- if (vp9_surface->dys_4x_surface_obj) {
- i965_DestroySurfaces(vp9_surface->ctx, &vp9_surface->dys_4x_surface_id, 1);
- vp9_surface->dys_4x_surface_id = VA_INVALID_SURFACE;
- vp9_surface->dys_4x_surface_obj = NULL;
- }
-
- if (vp9_surface->dys_16x_surface_obj) {
- i965_DestroySurfaces(vp9_surface->ctx, &vp9_surface->dys_16x_surface_id, 1);
- vp9_surface->dys_16x_surface_id = VA_INVALID_SURFACE;
- vp9_surface->dys_16x_surface_obj = NULL;
- }
-
- if (vp9_surface->dys_surface_obj) {
- i965_DestroySurfaces(vp9_surface->ctx, &vp9_surface->dys_surface_id, 1);
- vp9_surface->dys_surface_id = VA_INVALID_SURFACE;
- vp9_surface->dys_surface_obj = NULL;
- }
-
- free(vp9_surface);
-
- *data = NULL;
-
- return;
-}
-
-static VAStatus
-gen9_vp9_init_check_surfaces(VADriverContextP ctx,
- struct object_surface *obj_surface,
- struct vp9_surface_param *surface_param)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct gen9_surface_vp9 *vp9_surface;
- int downscaled_width_4x, downscaled_height_4x;
- int downscaled_width_16x, downscaled_height_16x;
-
- if (!obj_surface || !obj_surface->bo)
- return VA_STATUS_ERROR_INVALID_SURFACE;
-
- if (obj_surface->private_data &&
- obj_surface->free_private_data != gen9_free_surfaces_vp9) {
- obj_surface->free_private_data(&obj_surface->private_data);
- obj_surface->private_data = NULL;
- }
-
- if (obj_surface->private_data) {
- /* if the frame width/height is already the same as the expected,
- * it is unncessary to reallocate it.
- */
- vp9_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
- if (vp9_surface->frame_width >= surface_param->frame_width ||
- vp9_surface->frame_height >= surface_param->frame_height)
- return VA_STATUS_SUCCESS;
-
- obj_surface->free_private_data(&obj_surface->private_data);
- obj_surface->private_data = NULL;
- vp9_surface = NULL;
- }
-
- vp9_surface = calloc(1, sizeof(struct gen9_surface_vp9));
-
- if (!vp9_surface)
- return VA_STATUS_ERROR_ALLOCATION_FAILED;
-
- vp9_surface->ctx = ctx;
- obj_surface->private_data = vp9_surface;
- obj_surface->free_private_data = gen9_free_surfaces_vp9;
-
- vp9_surface->frame_width = surface_param->frame_width;
- vp9_surface->frame_height = surface_param->frame_height;
-
- downscaled_width_4x = ALIGN(surface_param->frame_width / 4, 16);
- downscaled_height_4x = ALIGN(surface_param->frame_height / 4, 16);
-
- i965_CreateSurfaces(ctx,
- downscaled_width_4x,
- downscaled_height_4x,
- VA_RT_FORMAT_YUV420,
- 1,
- &vp9_surface->scaled_4x_surface_id);
-
- vp9_surface->scaled_4x_surface_obj = SURFACE(vp9_surface->scaled_4x_surface_id);
-
- if (!vp9_surface->scaled_4x_surface_obj) {
- return VA_STATUS_ERROR_ALLOCATION_FAILED;
- }
-
- i965_check_alloc_surface_bo(ctx, vp9_surface->scaled_4x_surface_obj, 1,
- VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
-
- downscaled_width_16x = ALIGN(surface_param->frame_width / 16, 16);
- downscaled_height_16x = ALIGN(surface_param->frame_height / 16, 16);
- i965_CreateSurfaces(ctx,
- downscaled_width_16x,
- downscaled_height_16x,
- VA_RT_FORMAT_YUV420,
- 1,
- &vp9_surface->scaled_16x_surface_id);
- vp9_surface->scaled_16x_surface_obj = SURFACE(vp9_surface->scaled_16x_surface_id);
-
- if (!vp9_surface->scaled_16x_surface_obj) {
- return VA_STATUS_ERROR_ALLOCATION_FAILED;
- }
-
- i965_check_alloc_surface_bo(ctx, vp9_surface->scaled_16x_surface_obj, 1,
- VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-gen9_vp9_check_dys_surfaces(VADriverContextP ctx,
- struct object_surface *obj_surface,
- struct vp9_surface_param *surface_param)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct gen9_surface_vp9 *vp9_surface;
- int dys_width_4x, dys_height_4x;
- int dys_width_16x, dys_height_16x;
-
- /* As this is handled after the surface checking, it is unnecessary
- * to check the surface bo and vp9_priv_surface again
- */
-
- vp9_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- if (!vp9_surface)
- return VA_STATUS_ERROR_INVALID_SURFACE;
-
- /* if the frame_width/height of dys_surface is the same as
- * the expected, it is unnecessary to allocate it again
- */
- if (vp9_surface->dys_frame_width == surface_param->frame_width &&
- vp9_surface->dys_frame_width == surface_param->frame_width)
- return VA_STATUS_SUCCESS;
-
- if (vp9_surface->dys_4x_surface_obj) {
- i965_DestroySurfaces(vp9_surface->ctx, &vp9_surface->dys_4x_surface_id, 1);
- vp9_surface->dys_4x_surface_id = VA_INVALID_SURFACE;
- vp9_surface->dys_4x_surface_obj = NULL;
- }
-
- if (vp9_surface->dys_16x_surface_obj) {
- i965_DestroySurfaces(vp9_surface->ctx, &vp9_surface->dys_16x_surface_id, 1);
- vp9_surface->dys_16x_surface_id = VA_INVALID_SURFACE;
- vp9_surface->dys_16x_surface_obj = NULL;
- }
-
- if (vp9_surface->dys_surface_obj) {
- i965_DestroySurfaces(vp9_surface->ctx, &vp9_surface->dys_surface_id, 1);
- vp9_surface->dys_surface_id = VA_INVALID_SURFACE;
- vp9_surface->dys_surface_obj = NULL;
- }
-
- vp9_surface->dys_frame_width = surface_param->frame_width;
- vp9_surface->dys_frame_height = surface_param->frame_height;
-
- i965_CreateSurfaces(ctx,
- surface_param->frame_width,
- surface_param->frame_height,
- VA_RT_FORMAT_YUV420,
- 1,
- &vp9_surface->dys_surface_id);
- vp9_surface->dys_surface_obj = SURFACE(vp9_surface->dys_surface_id);
-
- if (!vp9_surface->dys_surface_obj) {
- return VA_STATUS_ERROR_ALLOCATION_FAILED;
- }
-
- i965_check_alloc_surface_bo(ctx, vp9_surface->dys_surface_obj, 1,
- VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
-
- dys_width_4x = ALIGN(surface_param->frame_width / 4, 16);
- dys_height_4x = ALIGN(surface_param->frame_width / 4, 16);
-
- i965_CreateSurfaces(ctx,
- dys_width_4x,
- dys_height_4x,
- VA_RT_FORMAT_YUV420,
- 1,
- &vp9_surface->dys_4x_surface_id);
-
- vp9_surface->dys_4x_surface_obj = SURFACE(vp9_surface->dys_4x_surface_id);
-
- if (!vp9_surface->dys_4x_surface_obj) {
- return VA_STATUS_ERROR_ALLOCATION_FAILED;
- }
-
- i965_check_alloc_surface_bo(ctx, vp9_surface->dys_4x_surface_obj, 1,
- VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
-
- dys_width_16x = ALIGN(surface_param->frame_width / 16, 16);
- dys_height_16x = ALIGN(surface_param->frame_width / 16, 16);
- i965_CreateSurfaces(ctx,
- dys_width_16x,
- dys_height_16x,
- VA_RT_FORMAT_YUV420,
- 1,
- &vp9_surface->dys_16x_surface_id);
- vp9_surface->dys_16x_surface_obj = SURFACE(vp9_surface->dys_16x_surface_id);
-
- if (!vp9_surface->dys_16x_surface_obj) {
- return VA_STATUS_ERROR_ALLOCATION_FAILED;
- }
-
- i965_check_alloc_surface_bo(ctx, vp9_surface->dys_16x_surface_obj, 1,
- VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420);
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-gen9_vp9_allocate_resources(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- int allocate)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct gen9_vp9_state *vp9_state;
- int allocate_flag, i;
- int res_size;
- uint32_t frame_width_in_sb, frame_height_in_sb, frame_sb_num;
- unsigned int width, height;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- /* the buffer related with BRC is not changed. So it is allocated
- * based on the input parameter
- */
- if (allocate) {
- i965_free_gpe_resource(&vme_context->res_brc_history_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_const_data_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_mbenc_curbe_write_buffer);
- i965_free_gpe_resource(&vme_context->res_pic_state_brc_read_buffer);
- i965_free_gpe_resource(&vme_context->res_pic_state_brc_write_hfw_read_buffer);
- i965_free_gpe_resource(&vme_context->res_pic_state_hfw_write_buffer);
- i965_free_gpe_resource(&vme_context->res_seg_state_brc_read_buffer);
- i965_free_gpe_resource(&vme_context->res_seg_state_brc_write_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_bitstream_size_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_hfw_data_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_mmdk_pak_buffer);
-
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_brc_history_buffer,
- VP9_BRC_HISTORY_BUFFER_SIZE,
- "Brc History buffer");
- if (!allocate_flag)
- goto failed_allocation;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_brc_const_data_buffer,
- VP9_BRC_CONSTANTSURFACE_SIZE,
- "Brc Constant buffer");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = ALIGN(sizeof(vp9_mbenc_curbe_data), 64) + 128 +
- ALIGN(sizeof(struct gen8_interface_descriptor_data), 64) * NUM_VP9_MBENC;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_brc_mbenc_curbe_write_buffer,
- res_size,
- "Brc Curbe write");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = VP9_PIC_STATE_BUFFER_SIZE * 4;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_pic_state_brc_read_buffer,
- res_size,
- "Pic State Brc_read");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = VP9_PIC_STATE_BUFFER_SIZE * 4;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_pic_state_brc_write_hfw_read_buffer,
- res_size,
- "Pic State Brc_write Hfw_Read");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = VP9_PIC_STATE_BUFFER_SIZE * 4;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_pic_state_hfw_write_buffer,
- res_size,
- "Pic State Hfw Write");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = VP9_SEGMENT_STATE_BUFFER_SIZE;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_seg_state_brc_read_buffer,
- res_size,
- "Segment state brc_read");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = VP9_SEGMENT_STATE_BUFFER_SIZE;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_seg_state_brc_write_buffer,
- res_size,
- "Segment state brc_write");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = VP9_BRC_BITSTREAM_SIZE_BUFFER_SIZE;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_brc_bitstream_size_buffer,
- res_size,
- "Brc bitstream buffer");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = VP9_HFW_BRC_DATA_BUFFER_SIZE;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_brc_hfw_data_buffer,
- res_size,
- "mfw Brc data");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = VP9_BRC_MMDK_PAK_BUFFER_SIZE;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_brc_mmdk_pak_buffer,
- res_size,
- "Brc mmdk_pak");
- if (!allocate_flag)
- goto failed_allocation;
- }
-
- /* If the width/height of allocated buffer is greater than the expected,
- * it is unnecessary to allocate it again
- */
- if (vp9_state->res_width >= vp9_state->frame_width &&
- vp9_state->res_height >= vp9_state->frame_height) {
-
- return VA_STATUS_SUCCESS;
- }
- frame_width_in_sb = ALIGN(vp9_state->frame_width, 64) / 64;
- frame_height_in_sb = ALIGN(vp9_state->frame_height, 64) / 64;
- frame_sb_num = frame_width_in_sb * frame_height_in_sb;
-
- i965_free_gpe_resource(&vme_context->res_hvd_line_buffer);
- res_size = frame_width_in_sb * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_hvd_line_buffer,
- res_size,
- "VP9 hvd line line");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_hvd_tile_line_buffer);
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_hvd_tile_line_buffer,
- res_size,
- "VP9 hvd tile_line line");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_deblocking_filter_line_buffer);
- res_size = frame_width_in_sb * 18 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_deblocking_filter_line_buffer,
- res_size,
- "VP9 deblocking filter line");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_deblocking_filter_tile_line_buffer);
- res_size = frame_width_in_sb * 18 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_deblocking_filter_tile_line_buffer,
- res_size,
- "VP9 deblocking tile line");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_deblocking_filter_tile_col_buffer);
- res_size = frame_height_in_sb * 17 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_deblocking_filter_tile_col_buffer,
- res_size,
- "VP9 deblocking tile col");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_metadata_line_buffer);
- res_size = frame_width_in_sb * 5 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_metadata_line_buffer,
- res_size,
- "VP9 metadata line");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_metadata_tile_line_buffer);
- res_size = frame_width_in_sb * 5 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_metadata_tile_line_buffer,
- res_size,
- "VP9 metadata tile line");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_metadata_tile_col_buffer);
- res_size = frame_height_in_sb * 5 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_metadata_tile_col_buffer,
- res_size,
- "VP9 metadata tile col");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_prob_buffer);
- res_size = 2048;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_prob_buffer,
- res_size,
- "VP9 prob");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_segmentid_buffer);
- res_size = frame_sb_num * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_segmentid_buffer,
- res_size,
- "VP9 segment id");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_zero_gpe_resource(&vme_context->res_segmentid_buffer);
-
- i965_free_gpe_resource(&vme_context->res_prob_delta_buffer);
- res_size = 29 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_prob_delta_buffer,
- res_size,
- "VP9 prob delta");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_zero_gpe_resource(&vme_context->res_segmentid_buffer);
-
- i965_free_gpe_resource(&vme_context->res_prob_delta_buffer);
- res_size = 29 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_prob_delta_buffer,
- res_size,
- "VP9 prob delta");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_compressed_input_buffer);
- res_size = 32 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_compressed_input_buffer,
- res_size,
- "VP9 compressed_input buffer");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_prob_counter_buffer);
- res_size = 193 * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_prob_counter_buffer,
- res_size,
- "VP9 prob counter");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_tile_record_streamout_buffer);
- res_size = frame_sb_num * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_tile_record_streamout_buffer,
- res_size,
- "VP9 tile record stream_out");
- if (!allocate_flag)
- goto failed_allocation;
-
- i965_free_gpe_resource(&vme_context->res_cu_stat_streamout_buffer);
- res_size = frame_sb_num * 64;
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_cu_stat_streamout_buffer,
- res_size,
- "VP9 CU stat stream_out");
- if (!allocate_flag)
- goto failed_allocation;
-
- width = vp9_state->downscaled_width_4x_in_mb * 32;
- height = vp9_state->downscaled_height_4x_in_mb * 16;
- i965_free_gpe_resource(&vme_context->s4x_memv_data_buffer);
- allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
- &vme_context->s4x_memv_data_buffer,
- width, height,
- ALIGN(width, 64),
- "VP9 4x MEMV data");
- if (!allocate_flag)
- goto failed_allocation;
-
- width = vp9_state->downscaled_width_4x_in_mb * 8;
- height = vp9_state->downscaled_height_4x_in_mb * 16;
- i965_free_gpe_resource(&vme_context->s4x_memv_distortion_buffer);
- allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
- &vme_context->s4x_memv_distortion_buffer,
- width, height,
- ALIGN(width, 64),
- "VP9 4x MEMV distorion");
- if (!allocate_flag)
- goto failed_allocation;
-
- width = ALIGN(vp9_state->downscaled_width_16x_in_mb * 32, 64);
- height = vp9_state->downscaled_height_16x_in_mb * 16;
- i965_free_gpe_resource(&vme_context->s16x_memv_data_buffer);
- allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
- &vme_context->s16x_memv_data_buffer,
- width, height,
- width,
- "VP9 16x MEMV data");
- if (!allocate_flag)
- goto failed_allocation;
-
- width = vp9_state->frame_width_in_mb * 16;
- height = vp9_state->frame_height_in_mb * 8;
- i965_free_gpe_resource(&vme_context->res_output_16x16_inter_modes);
- allocate_flag = i965_gpe_allocate_2d_resource(i965->intel.bufmgr,
- &vme_context->res_output_16x16_inter_modes,
- width, height,
- ALIGN(width, 64),
- "VP9 output inter_mode");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = vp9_state->frame_width_in_mb * vp9_state->frame_height_in_mb *
- 16 * 4;
- for (i = 0; i < 2; i++) {
- i965_free_gpe_resource(&vme_context->res_mode_decision[i]);
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_mode_decision[i],
- res_size,
- "VP9 mode decision");
- if (!allocate_flag)
- goto failed_allocation;
-
- }
-
- res_size = frame_sb_num * 9 * 64;
- for (i = 0; i < 2; i++) {
- i965_free_gpe_resource(&vme_context->res_mv_temporal_buffer[i]);
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_mv_temporal_buffer[i],
- res_size,
- "VP9 temporal mv");
- if (!allocate_flag)
- goto failed_allocation;
- }
-
- vp9_state->mb_data_offset = ALIGN(frame_sb_num * 16, 4096) + 4096;
- res_size = vp9_state->mb_data_offset + frame_sb_num * 64 * 64 + 1000;
- i965_free_gpe_resource(&vme_context->res_mb_code_surface);
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_mb_code_surface,
- ALIGN(res_size, 4096),
- "VP9 mb_code surface");
- if (!allocate_flag)
- goto failed_allocation;
-
- res_size = 128;
- i965_free_gpe_resource(&vme_context->res_pak_uncompressed_input_buffer);
- allocate_flag = i965_allocate_gpe_resource(i965->intel.bufmgr,
- &vme_context->res_pak_uncompressed_input_buffer,
- ALIGN(res_size, 4096),
- "VP9 pak_uncompressed_input");
- if (!allocate_flag)
- goto failed_allocation;
-
- if (!vme_context->frame_header_data) {
- /* allocate 512 bytes for generating the uncompressed header */
- vme_context->frame_header_data = calloc(1, 512);
- }
-
- vp9_state->res_width = vp9_state->frame_width;
- vp9_state->res_height = vp9_state->frame_height;
-
- return VA_STATUS_SUCCESS;
-
-failed_allocation:
- return VA_STATUS_ERROR_ALLOCATION_FAILED;
-}
-
-static void
-gen9_vp9_free_resources(struct gen9_encoder_context_vp9 *vme_context)
-{
- int i;
- struct gen9_vp9_state *vp9_state = (struct gen9_vp9_state *) vme_context->enc_priv_state;
-
- if (vp9_state->brc_enabled) {
- i965_free_gpe_resource(&vme_context->res_brc_history_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_const_data_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_mbenc_curbe_write_buffer);
- i965_free_gpe_resource(&vme_context->res_pic_state_brc_read_buffer);
- i965_free_gpe_resource(&vme_context->res_pic_state_brc_write_hfw_read_buffer);
- i965_free_gpe_resource(&vme_context->res_pic_state_hfw_write_buffer);
- i965_free_gpe_resource(&vme_context->res_seg_state_brc_read_buffer);
- i965_free_gpe_resource(&vme_context->res_seg_state_brc_write_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_bitstream_size_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_hfw_data_buffer);
- i965_free_gpe_resource(&vme_context->res_brc_mmdk_pak_buffer);
- }
-
- i965_free_gpe_resource(&vme_context->res_hvd_line_buffer);
- i965_free_gpe_resource(&vme_context->res_hvd_tile_line_buffer);
- i965_free_gpe_resource(&vme_context->res_deblocking_filter_line_buffer);
- i965_free_gpe_resource(&vme_context->res_deblocking_filter_tile_line_buffer);
- i965_free_gpe_resource(&vme_context->res_deblocking_filter_tile_col_buffer);
- i965_free_gpe_resource(&vme_context->res_metadata_line_buffer);
- i965_free_gpe_resource(&vme_context->res_metadata_tile_line_buffer);
- i965_free_gpe_resource(&vme_context->res_metadata_tile_col_buffer);
- i965_free_gpe_resource(&vme_context->res_prob_buffer);
- i965_free_gpe_resource(&vme_context->res_segmentid_buffer);
- i965_free_gpe_resource(&vme_context->res_prob_delta_buffer);
- i965_free_gpe_resource(&vme_context->res_prob_counter_buffer);
- i965_free_gpe_resource(&vme_context->res_tile_record_streamout_buffer);
- i965_free_gpe_resource(&vme_context->res_cu_stat_streamout_buffer);
- i965_free_gpe_resource(&vme_context->s4x_memv_data_buffer);
- i965_free_gpe_resource(&vme_context->s4x_memv_distortion_buffer);
- i965_free_gpe_resource(&vme_context->s16x_memv_data_buffer);
- i965_free_gpe_resource(&vme_context->res_output_16x16_inter_modes);
- for (i = 0; i < 2; i++) {
- i965_free_gpe_resource(&vme_context->res_mode_decision[i]);
- }
-
- for (i = 0; i < 2; i++) {
- i965_free_gpe_resource(&vme_context->res_mv_temporal_buffer[i]);
- }
-
- i965_free_gpe_resource(&vme_context->res_compressed_input_buffer);
- i965_free_gpe_resource(&vme_context->res_mb_code_surface);
- i965_free_gpe_resource(&vme_context->res_pak_uncompressed_input_buffer);
-
- if (vme_context->frame_header_data) {
- free(vme_context->frame_header_data);
- vme_context->frame_header_data = NULL;
- }
- return;
-}
-
-static void
-gen9_init_media_object_walker_parameter(struct intel_encoder_context *encoder_context,
- struct vp9_encoder_kernel_walker_parameter *kernel_walker_param,
- struct gpe_media_object_walker_parameter *walker_param)
-{
- memset(walker_param, 0, sizeof(*walker_param));
-
- walker_param->use_scoreboard = kernel_walker_param->use_scoreboard;
-
- walker_param->block_resolution.x = kernel_walker_param->resolution_x;
- walker_param->block_resolution.y = kernel_walker_param->resolution_y;
-
- walker_param->global_resolution.x = kernel_walker_param->resolution_x;
- walker_param->global_resolution.y = kernel_walker_param->resolution_y;
-
- walker_param->global_outer_loop_stride.x = kernel_walker_param->resolution_x;
- walker_param->global_outer_loop_stride.y = 0;
-
- walker_param->global_inner_loop_unit.x = 0;
- walker_param->global_inner_loop_unit.y = kernel_walker_param->resolution_y;
-
- walker_param->local_loop_exec_count = 0xFFFF; //MAX VALUE
- walker_param->global_loop_exec_count = 0xFFFF; //MAX VALUE
-
- if (kernel_walker_param->no_dependency) {
- walker_param->scoreboard_mask = 0;
- walker_param->use_scoreboard = 0;
- // Raster scan walking pattern
- walker_param->local_outer_loop_stride.x = 0;
- walker_param->local_outer_loop_stride.y = 1;
- walker_param->local_inner_loop_unit.x = 1;
- walker_param->local_inner_loop_unit.y = 0;
- walker_param->local_end.x = kernel_walker_param->resolution_x - 1;
- walker_param->local_end.y = 0;
- } else {
- walker_param->local_end.x = 0;
- walker_param->local_end.y = 0;
-
- if (kernel_walker_param->walker_degree == VP9_45Z_DEGREE) {
- // 45z degree
- walker_param->scoreboard_mask = 0x0F;
-
- walker_param->global_loop_exec_count = 0x3FF;
- walker_param->local_loop_exec_count = 0x3FF;
-
- walker_param->global_resolution.x = (unsigned int)(kernel_walker_param->resolution_x / 2.f) + 1;
- walker_param->global_resolution.y = 2 * kernel_walker_param->resolution_y;
-
- walker_param->global_start.x = 0;
- walker_param->global_start.y = 0;
-
- walker_param->global_outer_loop_stride.x = walker_param->global_resolution.x;
- walker_param->global_outer_loop_stride.y = 0;
-
- walker_param->global_inner_loop_unit.x = 0;
- walker_param->global_inner_loop_unit.y = walker_param->global_resolution.y;
-
- walker_param->block_resolution.x = walker_param->global_resolution.x;
- walker_param->block_resolution.y = walker_param->global_resolution.y;
-
- walker_param->local_start.x = 0;
- walker_param->local_start.y = 0;
-
- walker_param->local_outer_loop_stride.x = 1;
- walker_param->local_outer_loop_stride.y = 0;
-
- walker_param->local_inner_loop_unit.x = -1;
- walker_param->local_inner_loop_unit.y = 4;
-
- walker_param->middle_loop_extra_steps = 3;
- walker_param->mid_loop_unit_x = 0;
- walker_param->mid_loop_unit_y = 1;
- } else {
- // 26 degree
- walker_param->scoreboard_mask = 0x0F;
- walker_param->local_outer_loop_stride.x = 1;
- walker_param->local_outer_loop_stride.y = 0;
- walker_param->local_inner_loop_unit.x = -2;
- walker_param->local_inner_loop_unit.y = 1;
- }
- }
-}
-
-static void
-gen9_add_2d_gpe_surface(VADriverContextP ctx,
- struct i965_gpe_context *gpe_context,
- struct object_surface *obj_surface,
- int is_uv_surface,
- int is_media_block_rw,
- unsigned int format,
- int index)
-{
- struct i965_gpe_resource gpe_resource;
- struct i965_gpe_surface gpe_surface;
-
- memset(&gpe_surface, 0, sizeof(gpe_surface));
-
- i965_object_surface_to_2d_gpe_resource(&gpe_resource, obj_surface);
- gpe_surface.gpe_resource = &gpe_resource;
- gpe_surface.is_2d_surface = 1;
- gpe_surface.is_uv_surface = !!is_uv_surface;
- gpe_surface.is_media_block_rw = !!is_media_block_rw;
-
- gpe_surface.cacheability_control = DEFAULT_MOCS;
- gpe_surface.format = format;
-
- gen9_gpe_context_add_surface(gpe_context, &gpe_surface, index);
- i965_free_gpe_resource(&gpe_resource);
-}
-
-static void
-gen9_add_adv_gpe_surface(VADriverContextP ctx,
- struct i965_gpe_context *gpe_context,
- struct object_surface *obj_surface,
- int index)
-{
- struct i965_gpe_resource gpe_resource;
- struct i965_gpe_surface gpe_surface;
-
- memset(&gpe_surface, 0, sizeof(gpe_surface));
-
- i965_object_surface_to_2d_gpe_resource(&gpe_resource, obj_surface);
- gpe_surface.gpe_resource = &gpe_resource;
- gpe_surface.is_adv_surface = 1;
- gpe_surface.cacheability_control = DEFAULT_MOCS;
- gpe_surface.v_direction = 2;
-
- gen9_gpe_context_add_surface(gpe_context, &gpe_surface, index);
- i965_free_gpe_resource(&gpe_resource);
-}
-
-static void
-gen9_add_buffer_gpe_surface(VADriverContextP ctx,
- struct i965_gpe_context *gpe_context,
- struct i965_gpe_resource *gpe_buffer,
- int is_raw_buffer,
- unsigned int size,
- unsigned int offset,
- int index)
-{
- struct i965_gpe_surface gpe_surface;
-
- memset(&gpe_surface, 0, sizeof(gpe_surface));
-
- gpe_surface.gpe_resource = gpe_buffer;
- gpe_surface.is_buffer = 1;
- gpe_surface.is_raw_buffer = !!is_raw_buffer;
- gpe_surface.cacheability_control = DEFAULT_MOCS;
- gpe_surface.size = size;
- gpe_surface.offset = offset;
-
- gen9_gpe_context_add_surface(gpe_context, &gpe_surface, index);
-}
-
-static void
-gen9_add_buffer_2d_gpe_surface(VADriverContextP ctx,
- struct i965_gpe_context *gpe_context,
- struct i965_gpe_resource *gpe_buffer,
- int is_media_block_rw,
- unsigned int format,
- int index)
-{
- struct i965_gpe_surface gpe_surface;
-
- memset(&gpe_surface, 0, sizeof(gpe_surface));
-
- gpe_surface.gpe_resource = gpe_buffer;
- gpe_surface.is_2d_surface = 1;
- gpe_surface.is_media_block_rw = !!is_media_block_rw;
- gpe_surface.cacheability_control = DEFAULT_MOCS;
- gpe_surface.format = format;
-
- gen9_gpe_context_add_surface(gpe_context, &gpe_surface, index);
-}
-
-static void
-gen9_add_dri_buffer_gpe_surface(VADriverContextP ctx,
- struct i965_gpe_context *gpe_context,
- dri_bo *bo,
- int is_raw_buffer,
- unsigned int size,
- unsigned int offset,
- int index)
-{
- struct i965_gpe_resource gpe_resource;
-
- i965_dri_object_to_buffer_gpe_resource(&gpe_resource, bo);
- gen9_add_buffer_gpe_surface(ctx,
- gpe_context,
- &gpe_resource,
- is_raw_buffer,
- size,
- offset,
- index);
-
- i965_free_gpe_resource(&gpe_resource);
-}
-
-/*
-static void
-gen9_add_dri_buffer_2d_gpe_surface(VADriverContextP ctx,
- struct i965_gpe_context *gpe_context,
- dri_bo *bo,
- unsigned int width,
- unsigned int height,
- unsigned int pitch,
- int is_media_block_rw,
- unsigned int format,
- int index)
-{
- struct i965_gpe_resource gpe_resource;
-
- i965_dri_object_to_2d_gpe_resource(&gpe_resource, bo, width, height, pitch);
- gen9_add_buffer_2d_gpe_surface(ctx,
- gpe_context,
- &gpe_resource,
- is_media_block_rw,
- format,
- index);
-
- i965_free_gpe_resource(&gpe_resource);
-}
-*/
-
-static void
-gen9_run_kernel_media_object(VADriverContextP ctx,
- struct intel_encoder_context *encoder_context,
- struct i965_gpe_context *gpe_context,
- int media_function,
- struct gpe_media_object_parameter *param)
-{
- struct intel_batchbuffer *batch = encoder_context->base.batch;
- struct vp9_encode_status_buffer_internal *status_buffer;
- struct gen9_vp9_state *vp9_state;
- struct gpe_mi_store_data_imm_parameter mi_store_data_imm;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
- if (!vp9_state || !batch)
- return;
-
- intel_batchbuffer_start_atomic(batch, 0x1000);
-
- status_buffer = &(vp9_state->status_buffer);
- memset(&mi_store_data_imm, 0, sizeof(mi_store_data_imm));
- mi_store_data_imm.bo = status_buffer->bo;
- mi_store_data_imm.offset = status_buffer->media_index_offset;
- mi_store_data_imm.dw0 = media_function;
- gen8_gpe_mi_store_data_imm(ctx, batch, &mi_store_data_imm);
-
- intel_batchbuffer_emit_mi_flush(batch);
- gen9_gpe_pipeline_setup(ctx, gpe_context, batch);
- gen8_gpe_media_object(ctx, gpe_context, batch, param);
- gen8_gpe_media_state_flush(ctx, gpe_context, batch);
-
- gen9_gpe_pipeline_end(ctx, gpe_context, batch);
-
- intel_batchbuffer_end_atomic(batch);
-
- intel_batchbuffer_flush(batch);
-}
-
-static void
-gen9_run_kernel_media_object_walker(VADriverContextP ctx,
- struct intel_encoder_context *encoder_context,
- struct i965_gpe_context *gpe_context,
- int media_function,
- struct gpe_media_object_walker_parameter *param)
-{
- struct intel_batchbuffer *batch = encoder_context->base.batch;
- struct vp9_encode_status_buffer_internal *status_buffer;
- struct gen9_vp9_state *vp9_state;
- struct gpe_mi_store_data_imm_parameter mi_store_data_imm;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
- if (!vp9_state || !batch)
- return;
-
- intel_batchbuffer_start_atomic(batch, 0x1000);
-
- intel_batchbuffer_emit_mi_flush(batch);
-
- status_buffer = &(vp9_state->status_buffer);
- memset(&mi_store_data_imm, 0, sizeof(mi_store_data_imm));
- mi_store_data_imm.bo = status_buffer->bo;
- mi_store_data_imm.offset = status_buffer->media_index_offset;
- mi_store_data_imm.dw0 = media_function;
- gen8_gpe_mi_store_data_imm(ctx, batch, &mi_store_data_imm);
-
- gen9_gpe_pipeline_setup(ctx, gpe_context, batch);
- gen8_gpe_media_object_walker(ctx, gpe_context, batch, param);
- gen8_gpe_media_state_flush(ctx, gpe_context, batch);
-
- gen9_gpe_pipeline_end(ctx, gpe_context, batch);
-
- intel_batchbuffer_end_atomic(batch);
-
- intel_batchbuffer_flush(batch);
-}
-
-static
-void gen9_vp9_set_curbe_brc(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct i965_gpe_context *gpe_context,
- struct intel_encoder_context *encoder_context,
- struct gen9_vp9_brc_curbe_param *param)
-{
- VAEncSequenceParameterBufferVP9 *seq_param;
- VAEncPictureParameterBufferVP9 *pic_param;
- VAEncMiscParameterTypeVP9PerSegmantParam *segment_param;
- vp9_brc_curbe_data *cmd;
- double dbps_ratio, dInputBitsPerFrame;
- struct gen9_vp9_state *vp9_state;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- pic_param = param->ppic_param;
- seq_param = param->pseq_param;
- segment_param = param->psegment_param;
-
- cmd = i965_gpe_context_map_curbe(gpe_context);
-
- if (!cmd)
- return;
-
- memset(cmd, 0, sizeof(vp9_brc_curbe_data));
-
- if (!vp9_state->dys_enabled)
- {
- cmd->dw0.frame_width = pic_param->frame_width_src;
- cmd->dw0.frame_height = pic_param->frame_height_src;
- }
- else
- {
- cmd->dw0.frame_width = pic_param->frame_width_dst;
- cmd->dw0.frame_height = pic_param->frame_height_dst;
- }
-
- cmd->dw1.frame_type = vp9_state->picture_coding_type;
- cmd->dw1.segmentation_enable = 0;
- cmd->dw1.ref_frame_flags = vp9_state->ref_frame_flag;
- cmd->dw1.num_tlevels = 1;
-
- switch(param->media_state_type)
- {
- case VP9_MEDIA_STATE_BRC_INIT_RESET:
- {
- cmd->dw3.max_level_ratiot0 = 0;
- cmd->dw3.max_level_ratiot1 = 0;
- cmd->dw3.max_level_ratiot2 = 0;
- cmd->dw3.max_level_ratiot3 = 0;
-
- cmd->dw4.profile_level_max_frame = seq_param->max_frame_width *
- seq_param->max_frame_height;
- cmd->dw5.init_buf_fullness = vp9_state->init_vbv_buffer_fullness_in_bit;
- cmd->dw6.buf_size = vp9_state->vbv_buffer_size_in_bit;
- cmd->dw7.target_bit_rate = (vp9_state->target_bit_rate + VP9_BRC_KBPS - 1) / VP9_BRC_KBPS *
- VP9_BRC_KBPS;
- cmd->dw8.max_bit_rate = (vp9_state->max_bit_rate + VP9_BRC_KBPS - 1) / VP9_BRC_KBPS *
- VP9_BRC_KBPS;
- cmd->dw9.min_bit_rate = (vp9_state->min_bit_rate + VP9_BRC_KBPS - 1) / VP9_BRC_KBPS *
- VP9_BRC_KBPS;
- cmd->dw10.frame_ratem = vp9_state->framerate.num;
- cmd->dw11.frame_rated = vp9_state->framerate.den;
-
- cmd->dw14.avbr_accuracy = 30;
- cmd->dw14.avbr_convergence = 150;
-
- if (encoder_context->rate_control_mode == VA_RC_CBR)
- {
- cmd->dw12.brc_flag = BRC_KERNEL_CBR;
- cmd->dw8.max_bit_rate = cmd->dw7.target_bit_rate;
- cmd->dw9.min_bit_rate = 0;
- }
- else if (encoder_context->rate_control_mode == VA_RC_VBR)
- {
- cmd->dw12.brc_flag = BRC_KERNEL_VBR;
- }
- else
- {
- cmd->dw12.brc_flag = BRC_KERNEL_CQL;
- cmd->dw16.cq_level = 30;
- }
- cmd->dw12.gopp = seq_param->intra_period - 1;
-
- cmd->dw13.init_frame_width = pic_param->frame_width_src;
- cmd->dw13.init_frame_height = pic_param->frame_height_src;
-
- cmd->dw15.min_qp = 0;
- cmd->dw15.max_qp = 255;
-
- cmd->dw16.cq_level = 30;
-
- cmd->dw17.enable_dynamic_scaling = vp9_state->dys_in_use;
- cmd->dw17.brc_overshoot_cbr_pct = 150;
-
- dInputBitsPerFrame = (double)cmd->dw8.max_bit_rate * (double)vp9_state->framerate.den / (double)vp9_state->framerate.num;
- dbps_ratio = dInputBitsPerFrame / ((double)vp9_state->vbv_buffer_size_in_bit / 30.0);
- if (dbps_ratio < 0.1)
- dbps_ratio = 0.1;
- if (dbps_ratio > 3.5)
- dbps_ratio = 3.5;
-
- *param->pbrc_init_reset_buf_size_in_bits = cmd->dw6.buf_size;
- *param->pbrc_init_reset_input_bits_per_frame = dInputBitsPerFrame;
-
- cmd->dw18.pframe_deviation_threshold0 = (uint32_t)(-50 * pow(0.90, dbps_ratio));
- cmd->dw18.pframe_deviation_threshold1 = (uint32_t)(-50 * pow(0.66, dbps_ratio));
- cmd->dw18.pframe_deviation_threshold2 = (uint32_t)(-50 * pow(0.46, dbps_ratio));
- cmd->dw18.pframe_deviation_threshold3 = (uint32_t)(-50 * pow(0.3, dbps_ratio));
- cmd->dw19.pframe_deviation_threshold4 = (uint32_t)(50 * pow(0.3, dbps_ratio));
- cmd->dw19.pframe_deviation_threshold5 = (uint32_t)(50 * pow(0.46, dbps_ratio));
- cmd->dw19.pframe_deviation_threshold6 = (uint32_t)(50 * pow(0.7, dbps_ratio));
- cmd->dw19.pframe_deviation_threshold7 = (uint32_t)(50 * pow(0.9, dbps_ratio));
-
- cmd->dw20.vbr_deviation_threshold0 = (uint32_t)(-50 * pow(0.9, dbps_ratio));
- cmd->dw20.vbr_deviation_threshold1 = (uint32_t)(-50 * pow(0.7, dbps_ratio));
- cmd->dw20.vbr_deviation_threshold2 = (uint32_t)(-50 * pow(0.5, dbps_ratio));
- cmd->dw20.vbr_deviation_threshold3 = (uint32_t)(-50 * pow(0.3, dbps_ratio));
- cmd->dw21.vbr_deviation_threshold4 = (uint32_t)(100 * pow(0.4, dbps_ratio));
- cmd->dw21.vbr_deviation_threshold5 = (uint32_t)(100 * pow(0.5, dbps_ratio));
- cmd->dw21.vbr_deviation_threshold6 = (uint32_t)(100 * pow(0.75, dbps_ratio));
- cmd->dw21.vbr_deviation_threshold7 = (uint32_t)(100 * pow(0.9, dbps_ratio));
-
- cmd->dw22.kframe_deviation_threshold0 = (uint32_t)(-50 * pow(0.8, dbps_ratio));
- cmd->dw22.kframe_deviation_threshold1 = (uint32_t)(-50 * pow(0.6, dbps_ratio));
- cmd->dw22.kframe_deviation_threshold2 = (uint32_t)(-50 * pow(0.34, dbps_ratio));
- cmd->dw22.kframe_deviation_threshold3 = (uint32_t)(-50 * pow(0.2, dbps_ratio));
- cmd->dw23.kframe_deviation_threshold4 = (uint32_t)(50 * pow(0.2, dbps_ratio));
- cmd->dw23.kframe_deviation_threshold5 = (uint32_t)(50 * pow(0.4, dbps_ratio));
- cmd->dw23.kframe_deviation_threshold6 = (uint32_t)(50 * pow(0.66, dbps_ratio));
- cmd->dw23.kframe_deviation_threshold7 = (uint32_t)(50 * pow(0.9, dbps_ratio));
-
- break;
- }
- case VP9_MEDIA_STATE_BRC_UPDATE:
- {
- cmd->dw15.min_qp = 0;
- cmd->dw15.max_qp = 255;
-
- cmd->dw25.frame_number = param->frame_number;
-
- // Used in dynamic scaling. set to zero for now
- cmd->dw27.hrd_buffer_fullness_upper_limit = 0;
- cmd->dw28.hrd_buffer_fullness_lower_limit = 0;
-
- if (pic_param->pic_flags.bits.segmentation_enabled) {
- cmd->dw32.seg_delta_qp0 = segment_param->seg_data[0].segment_qindex_delta;
- cmd->dw32.seg_delta_qp1 = segment_param->seg_data[1].segment_qindex_delta;
- cmd->dw32.seg_delta_qp2 = segment_param->seg_data[2].segment_qindex_delta;
- cmd->dw32.seg_delta_qp3 = segment_param->seg_data[3].segment_qindex_delta;
-
- cmd->dw33.seg_delta_qp4 = segment_param->seg_data[4].segment_qindex_delta;
- cmd->dw33.seg_delta_qp5 = segment_param->seg_data[5].segment_qindex_delta;
- cmd->dw33.seg_delta_qp6 = segment_param->seg_data[6].segment_qindex_delta;
- cmd->dw33.seg_delta_qp7 = segment_param->seg_data[7].segment_qindex_delta;
- }
-
- //cmd->dw34.temporal_id = pPicParams->temporal_idi;
- cmd->dw34.temporal_id = 0;
- cmd->dw34.multi_ref_qp_check = param->multi_ref_qp_check;
-
- cmd->dw35.max_num_pak_passes = param->brc_num_pak_passes;
- cmd->dw35.sync_async = 0;
- cmd->dw35.mbrc = param->mbbrc_enabled;
- if (*param->pbrc_init_current_target_buf_full_in_bits >
- ((double)(*param->pbrc_init_reset_buf_size_in_bits))) {
- *param->pbrc_init_current_target_buf_full_in_bits -=
- (double)(*param->pbrc_init_reset_buf_size_in_bits);
- cmd->dw35.overflow = 1;
- }
- else
- cmd->dw35.overflow = 0;
-
- cmd->dw24.target_size = (uint32_t)(*param->pbrc_init_current_target_buf_full_in_bits);
-
- cmd->dw36.segmentation = pic_param->pic_flags.bits.segmentation_enabled;
-
- *param->pbrc_init_current_target_buf_full_in_bits += *param->pbrc_init_reset_input_bits_per_frame;
-
- cmd->dw38.qdelta_ydc = pic_param->luma_dc_qindex_delta;
- cmd->dw38.qdelta_uvdc = pic_param->chroma_dc_qindex_delta;
- cmd->dw38.qdelta_uvac = pic_param->chroma_ac_qindex_delta;
-
- break;
- }
- case VP9_MEDIA_STATE_ENC_I_FRAME_DIST:
- cmd->dw2.intra_mode_disable = 0;
- break;
- default:
- break;
- }
-
- cmd->dw48.brc_y4x_input_bti = VP9_BTI_BRC_SRCY4X_G9;
- cmd->dw49.brc_vme_coarse_intra_input_bti = VP9_BTI_BRC_VME_COARSE_INTRA_G9;
- cmd->dw50.brc_history_buffer_bti = VP9_BTI_BRC_HISTORY_G9;
- cmd->dw51.brc_const_data_input_bti = VP9_BTI_BRC_CONSTANT_DATA_G9;
- cmd->dw52.brc_distortion_bti = VP9_BTI_BRC_DISTORTION_G9;
- cmd->dw53.brc_mmdk_pak_output_bti = VP9_BTI_BRC_MMDK_PAK_OUTPUT_G9;
- cmd->dw54.brc_enccurbe_input_bti = VP9_BTI_BRC_MBENC_CURBE_INPUT_G9;
- cmd->dw55.brc_enccurbe_output_bti = VP9_BTI_BRC_MBENC_CURBE_OUTPUT_G9;
- cmd->dw56.brc_pic_state_input_bti = VP9_BTI_BRC_PIC_STATE_INPUT_G9;
- cmd->dw57.brc_pic_state_output_bti = VP9_BTI_BRC_PIC_STATE_OUTPUT_G9;
- cmd->dw58.brc_seg_state_input_bti = VP9_BTI_BRC_SEGMENT_STATE_INPUT_G9;
- cmd->dw59.brc_seg_state_output_bti = VP9_BTI_BRC_SEGMENT_STATE_OUTPUT_G9;
- cmd->dw60.brc_bitstream_size_data_bti = VP9_BTI_BRC_BITSTREAM_SIZE_G9;
- cmd->dw61.brc_hfw_data_output_bti = VP9_BTI_BRC_HFW_DATA_G9;
-
- i965_gpe_context_unmap_curbe(gpe_context);
- return;
-}
-
-static void
-gen9_brc_init_reset_add_surfaces_vp9(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- struct i965_gpe_context *gpe_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
-
- gen9_add_buffer_gpe_surface(ctx,
- gpe_context,
- &vme_context->res_brc_history_buffer,
- 0,
- vme_context->res_brc_history_buffer.size,
- 0,
- VP9_BTI_BRC_HISTORY_G9);
-
- gen9_add_buffer_2d_gpe_surface(ctx,
- gpe_context,
- &vme_context->s4x_memv_distortion_buffer,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_BRC_DISTORTION_G9);
-}
-
-/* The function related with BRC */
-static VAStatus
-gen9_vp9_brc_init_reset_kernel(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct vp9_brc_context *brc_context = &vme_context->brc_context;
- struct gpe_media_object_parameter media_object_param;
- struct i965_gpe_context *gpe_context;
- int gpe_index = VP9_BRC_INIT;
- int media_function = VP9_MEDIA_STATE_BRC_INIT_RESET;
- struct gen9_vp9_brc_curbe_param brc_initreset_curbe;
- VAEncPictureParameterBufferVP9 *pic_param;
- struct gen9_vp9_state *vp9_state;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- pic_param = vp9_state->pic_param;
-
- if (vp9_state->brc_inited)
- gpe_index = VP9_BRC_RESET;
-
- gpe_context = &brc_context->gpe_contexts[gpe_index];
-
- gen8_gpe_context_init(ctx, gpe_context);
- gen9_gpe_reset_binding_table(ctx, gpe_context);
-
- brc_initreset_curbe.media_state_type = media_function;
- brc_initreset_curbe.curr_frame = pic_param->reconstructed_frame;
- brc_initreset_curbe.ppic_param = vp9_state->pic_param;
- brc_initreset_curbe.pseq_param = vp9_state->seq_param;
- brc_initreset_curbe.psegment_param = vp9_state->segment_param;
- brc_initreset_curbe.frame_width = vp9_state->frame_width;
- brc_initreset_curbe.frame_height = vp9_state->frame_height;
- brc_initreset_curbe.pbrc_init_current_target_buf_full_in_bits =
- &vp9_state->brc_init_current_target_buf_full_in_bits;
- brc_initreset_curbe.pbrc_init_reset_buf_size_in_bits =
- &vp9_state->brc_init_reset_buf_size_in_bits;
- brc_initreset_curbe.pbrc_init_reset_input_bits_per_frame =
- &vp9_state->brc_init_reset_input_bits_per_frame;
- brc_initreset_curbe.picture_coding_type = vp9_state->picture_coding_type;
- brc_initreset_curbe.initbrc = !vp9_state->brc_inited;
- brc_initreset_curbe.mbbrc_enabled = 0;
- brc_initreset_curbe.ref_frame_flag = vp9_state->ref_frame_flag;
-
- vme_context->pfn_set_curbe_brc(ctx, encode_state,
- gpe_context,
- encoder_context,
- &brc_initreset_curbe);
-
- gen9_brc_init_reset_add_surfaces_vp9(ctx, encode_state, encoder_context, gpe_context);
- gen8_gpe_setup_interface_data(ctx, gpe_context);
-
- memset(&media_object_param, 0, sizeof(media_object_param));
- gen9_run_kernel_media_object(ctx, encoder_context, gpe_context, media_function, &media_object_param);
-
- return VA_STATUS_SUCCESS;
-}
-
-static void
-gen9_brc_intra_dist_add_surfaces_vp9(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- struct i965_gpe_context *gpe_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
-
- struct object_surface *obj_surface;
- struct gen9_surface_vp9 *vp9_priv_surface;
-
- /* sScaled4xSurface surface */
- obj_surface = encode_state->reconstructed_object;
-
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- obj_surface = vp9_priv_surface->scaled_4x_surface_obj;
- gen9_add_2d_gpe_surface(ctx, gpe_context,
- obj_surface,
- 0, 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_BRC_SRCY4X_G9
- );
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- obj_surface,
- VP9_BTI_BRC_VME_COARSE_INTRA_G9);
-
- gen9_add_buffer_2d_gpe_surface(ctx,
- gpe_context,
- &vme_context->s4x_memv_distortion_buffer,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_BRC_DISTORTION_G9);
-
- return;
-}
-
-/* The function related with BRC */
-static VAStatus
-gen9_vp9_brc_intra_dist_kernel(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct vp9_brc_context *brc_context = &vme_context->brc_context;
- struct i965_gpe_context *gpe_context;
- int gpe_index = VP9_BRC_INTRA_DIST;
- int media_function = VP9_MEDIA_STATE_ENC_I_FRAME_DIST;
- struct gen9_vp9_brc_curbe_param brc_intra_dist_curbe;
- VAEncPictureParameterBufferVP9 *pic_param;
- struct gen9_vp9_state *vp9_state;
- struct gpe_media_object_walker_parameter media_object_walker_param;
- struct vp9_encoder_kernel_walker_parameter kernel_walker_param;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- pic_param = vp9_state->pic_param;
-
- gpe_context = &brc_context->gpe_contexts[gpe_index];
-
- gen8_gpe_context_init(ctx, gpe_context);
- gen9_gpe_reset_binding_table(ctx, gpe_context);
-
- brc_intra_dist_curbe.media_state_type = media_function;
- brc_intra_dist_curbe.curr_frame = pic_param->reconstructed_frame;
- brc_intra_dist_curbe.ppic_param = vp9_state->pic_param;
- brc_intra_dist_curbe.pseq_param = vp9_state->seq_param;
- brc_intra_dist_curbe.psegment_param = vp9_state->segment_param;
- brc_intra_dist_curbe.frame_width = vp9_state->frame_width;
- brc_intra_dist_curbe.frame_height = vp9_state->frame_height;
- brc_intra_dist_curbe.pbrc_init_current_target_buf_full_in_bits =
- &vp9_state->brc_init_current_target_buf_full_in_bits;
- brc_intra_dist_curbe.pbrc_init_reset_buf_size_in_bits =
- &vp9_state->brc_init_reset_buf_size_in_bits;
- brc_intra_dist_curbe.pbrc_init_reset_input_bits_per_frame =
- &vp9_state->brc_init_reset_input_bits_per_frame;
- brc_intra_dist_curbe.picture_coding_type = vp9_state->picture_coding_type;
- brc_intra_dist_curbe.initbrc = !vp9_state->brc_inited;
- brc_intra_dist_curbe.mbbrc_enabled = 0;
- brc_intra_dist_curbe.ref_frame_flag = vp9_state->ref_frame_flag;
-
- vme_context->pfn_set_curbe_brc(ctx, encode_state,
- gpe_context,
- encoder_context,
- &brc_intra_dist_curbe);
-
- /* zero distortion buffer */
- i965_zero_gpe_resource(&vme_context->s4x_memv_distortion_buffer);
-
- gen9_brc_intra_dist_add_surfaces_vp9(ctx, encode_state, encoder_context, gpe_context);
- gen8_gpe_setup_interface_data(ctx, gpe_context);
-
- memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
- kernel_walker_param.resolution_x = vme_context->downscaled_width_in_mb4x;
- kernel_walker_param.resolution_y = vme_context->downscaled_height_in_mb4x;
- kernel_walker_param.no_dependency = 1;
-
- gen9_init_media_object_walker_parameter(encoder_context, &kernel_walker_param, &media_object_walker_param);
-
- gen9_run_kernel_media_object_walker(ctx, encoder_context,
- gpe_context,
- media_function,
- &media_object_walker_param);
-
- return VA_STATUS_SUCCESS;
-}
-
-static void
-intel_vp9enc_construct_picstate_batchbuf(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- struct i965_gpe_resource *gpe_resource)
-{
- struct gen9_vp9_state *vp9_state;
- VAEncPictureParameterBufferVP9 *pic_param;
- int frame_width_minus1, frame_height_minus1;
- int is_lossless = 0;
- int is_intra_only = 0;
- unsigned int last_frame_type;
- unsigned int ref_flags;
- unsigned int use_prev_frame_mvs, adapt_flag;
- struct gen9_surface_vp9 *vp9_surface = NULL;
- struct object_surface *obj_surface = NULL;
- uint32_t scale_h = 0;
- uint32_t scale_w = 0;
-
- char *pdata;
- int i, j;
- unsigned int *cmd_ptr, cmd_value, tmp;
-
- pdata = i965_map_gpe_resource(gpe_resource);
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param || !pdata)
- return;
-
- pic_param = vp9_state->pic_param;
- frame_width_minus1 = ALIGN(pic_param->frame_width_dst, 8) - 1;
- frame_height_minus1 = ALIGN(pic_param->frame_height_dst, 8) - 1;
- if ((pic_param->luma_ac_qindex == 0) &&
- (pic_param->luma_dc_qindex_delta == 0) &&
- (pic_param->chroma_ac_qindex_delta == 0) &&
- (pic_param->chroma_dc_qindex_delta == 0))
- is_lossless = 1;
-
- if (pic_param->pic_flags.bits.frame_type)
- is_intra_only = pic_param->pic_flags.bits.intra_only;
-
- last_frame_type = vp9_state->vp9_last_frame.frame_type;
-
- use_prev_frame_mvs = 0;
- if (pic_param->pic_flags.bits.frame_type == HCP_VP9_KEY_FRAME) {
- last_frame_type = 0;
- ref_flags = 0;
- } else {
- ref_flags = ((pic_param->ref_flags.bits.ref_arf_sign_bias << 9) |
- (pic_param->ref_flags.bits.ref_gf_sign_bias << 8) |
- (pic_param->ref_flags.bits.ref_last_sign_bias << 7)
- );
- if (!pic_param->pic_flags.bits.error_resilient_mode &&
- (pic_param->frame_width_dst == vp9_state->vp9_last_frame.frame_width) &&
- (pic_param->frame_height_dst == vp9_state->vp9_last_frame.frame_height) &&
- !pic_param->pic_flags.bits.intra_only &&
- vp9_state->vp9_last_frame.show_frame &&
- ((vp9_state->vp9_last_frame.frame_type == HCP_VP9_INTER_FRAME) &&
- !vp9_state->vp9_last_frame.intra_only)
- )
- use_prev_frame_mvs = 1;
- }
- adapt_flag = 0;
- if (!pic_param->pic_flags.bits.error_resilient_mode &&
- !pic_param->pic_flags.bits.frame_parallel_decoding_mode)
- adapt_flag = 1;
-
- for (i = 0; i < 4; i++) {
- uint32_t non_first_pass;
- non_first_pass = 1;
- if (i == 0)
- non_first_pass = 0;
-
- cmd_ptr =(unsigned int *)(pdata + i * VP9_PIC_STATE_BUFFER_SIZE);
-
- *cmd_ptr++ = (HCP_VP9_PIC_STATE | (33 - 2));
- *cmd_ptr++ = (frame_height_minus1 << 16 |
- frame_width_minus1);
- /* dw2 */
- *cmd_ptr++ = ( 0 << 31 | /* disable segment_in */
- 0 << 30 | /* disable segment_out */
- is_lossless << 29 | /* loseless */
- (pic_param->pic_flags.bits.segmentation_enabled && pic_param->pic_flags.bits.segmentation_temporal_update) << 28 | /* temporal update */
- (pic_param->pic_flags.bits.segmentation_enabled && pic_param->pic_flags.bits.segmentation_update_map) << 27 | /* temporal update */
- (pic_param->pic_flags.bits.segmentation_enabled << 26) |
- (pic_param->sharpness_level << 23) |
- (pic_param->filter_level << 17) |
- (pic_param->pic_flags.bits.frame_parallel_decoding_mode << 16) |
- (pic_param->pic_flags.bits.error_resilient_mode << 15) |
- (pic_param->pic_flags.bits.refresh_frame_context << 14) |
- (last_frame_type << 13) |
- (vp9_state->tx_mode == TX_MODE_SELECT) << 12 |
- (pic_param->pic_flags.bits.comp_prediction_mode == REFERENCE_MODE_SELECT) << 11 |
- (use_prev_frame_mvs) << 10 |
- ref_flags |
- (pic_param->pic_flags.bits.mcomp_filter_type << 4) |
- (pic_param->pic_flags.bits.allow_high_precision_mv << 3) |
- (is_intra_only << 2) |
- (adapt_flag << 1) |
- (pic_param->pic_flags.bits.frame_type) << 0);
-
- *cmd_ptr++ =((0 << 28) | /* VP9Profile0 */
- (0 << 24) | /* 8-bit depth */
- (0 << 22) | /* only 420 format */
- (0 << 0) | /* sse statistics */
- (pic_param->log2_tile_rows << 8) |
- (pic_param->log2_tile_columns << 0));
-
- /* dw4..6 */
- if (pic_param->pic_flags.bits.frame_type &&
- !pic_param->pic_flags.bits.intra_only) {
- for (j = 0; j < 3; j++) {
- obj_surface = encode_state->reference_objects[j];
- scale_w = 0;
- scale_h = 0;
- if (obj_surface && obj_surface->private_data) {
- vp9_surface = obj_surface->private_data;
- scale_w = (vp9_surface->frame_width << 14) / pic_param->frame_width_dst;
- scale_h = (vp9_surface->frame_height << 14) / pic_param->frame_height_dst;
- *cmd_ptr++ = (scale_w << 16 |
- scale_h);
- } else
- *cmd_ptr++ = 0;
- }
- } else {
- *cmd_ptr++ = 0;
- *cmd_ptr++ = 0;
- *cmd_ptr++ = 0;
- }
- /* dw7..9 */
- for(j = 0; j < 3; j++) {
- obj_surface = encode_state->reference_objects[j];
- vp9_surface = NULL;
-
- if (obj_surface && obj_surface->private_data) {
- vp9_surface = obj_surface->private_data;
- *cmd_ptr++ = (vp9_surface->frame_height - 1) << 16 |
- (vp9_surface->frame_width - 1);
- } else
- *cmd_ptr++ = 0;
- }
- /* dw10 */
- *cmd_ptr++ = 0;
- /* dw11 */
- *cmd_ptr++ = (1 << 1);
- *cmd_ptr++ = 0;
-
- /* dw13 */
- *cmd_ptr++ = ((1 << 25) | /* header insertation for VP9 */
- (0 << 24) | /* tail insertation */
- (pic_param->luma_ac_qindex << 16) |
- 0 /* compressed header bin count */);
-
- /* dw14 */
- tmp = intel_convert_sign_mag(pic_param->luma_dc_qindex_delta, 5);
- cmd_value = (tmp << 16);
- tmp = intel_convert_sign_mag(pic_param->chroma_dc_qindex_delta, 5);
- cmd_value |= (tmp << 8);
- tmp = intel_convert_sign_mag(pic_param->chroma_ac_qindex_delta, 5);
- cmd_value |= tmp;
- *cmd_ptr++ = cmd_value;
-
- tmp = intel_convert_sign_mag(pic_param->ref_lf_delta[0], 7);
- cmd_value = tmp;
- tmp = intel_convert_sign_mag(pic_param->ref_lf_delta[1], 7);
- cmd_value |= (tmp << 8);
- tmp = intel_convert_sign_mag(pic_param->ref_lf_delta[2], 7);
- cmd_value |= (tmp << 16);
- tmp = intel_convert_sign_mag(pic_param->ref_lf_delta[3], 7);
- cmd_value |= (tmp << 24);
- *cmd_ptr++ = cmd_value;
-
- /* dw16 */
- tmp = intel_convert_sign_mag(pic_param->mode_lf_delta[0], 7);
- cmd_value = tmp;
- tmp = intel_convert_sign_mag(pic_param->mode_lf_delta[1], 7);
- cmd_value |= (tmp << 8);
- *cmd_ptr++ = cmd_value;
-
- /* dw17 */
- *cmd_ptr++ = vp9_state->frame_header.bit_offset_ref_lf_delta |
- (vp9_state->frame_header.bit_offset_mode_lf_delta << 16);
- *cmd_ptr++ = vp9_state->frame_header.bit_offset_qindex |
- (vp9_state->frame_header.bit_offset_lf_level << 16);
-
- /* dw19 */
- *cmd_ptr++ = (1 << 26 | (1 << 25) |
- non_first_pass << 16);
- /* dw20 */
- *cmd_ptr++ = (1 << 31) | (256);
-
- /* dw21 */
- *cmd_ptr++ = (0 << 31) | 1;
-
- /* dw22-dw24. Frame_delta_qindex_range */
- *cmd_ptr++ = 0;
- *cmd_ptr++ = 0;
- *cmd_ptr++ = 0;
-
- /* dw25-26. frame_delta_lf_range */
- *cmd_ptr++ = 0;
- *cmd_ptr++ = 0;
-
- /* dw27. frame_delta_lf_min */
- *cmd_ptr++ = 0;
-
- /* dw28..30 */
- *cmd_ptr++ = 0;
- *cmd_ptr++ = 0;
- *cmd_ptr++ = 0;
-
- /* dw31 */
- *cmd_ptr++ = (0 << 30) | 1;
- /* dw32 */
- *cmd_ptr++ = vp9_state->frame_header.bit_offset_first_partition_size;
-
- *cmd_ptr++ = 0;
- *cmd_ptr++ = MI_BATCH_BUFFER_END;
- }
-
- i965_unmap_gpe_resource(gpe_resource);
-}
-
-static void
-gen9_brc_update_add_surfaces_vp9(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- struct i965_gpe_context *brc_gpe_context,
- struct i965_gpe_context *mbenc_gpe_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
-
- /* 0. BRC history buffer */
- gen9_add_buffer_gpe_surface(ctx,
- brc_gpe_context,
- &vme_context->res_brc_history_buffer,
- 0,
- vme_context->res_brc_history_buffer.size,
- 0,
- VP9_BTI_BRC_HISTORY_G9);
-
- /* 1. Constant data buffer */
- gen9_add_buffer_gpe_surface(ctx,
- brc_gpe_context,
- &vme_context->res_brc_const_data_buffer,
- 0,
- vme_context->res_brc_const_data_buffer.size,
- 0,
- VP9_BTI_BRC_CONSTANT_DATA_G9);
-
- /* 2. Distortion 2D surface buffer */
- gen9_add_buffer_2d_gpe_surface(ctx,
- brc_gpe_context,
- &vme_context->s4x_memv_distortion_buffer,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_BRC_DISTORTION_G9);
-
- /* 3. pak buffer */
- gen9_add_buffer_gpe_surface(ctx,
- brc_gpe_context,
- &vme_context->res_brc_mmdk_pak_buffer,
- 0,
- vme_context->res_brc_mmdk_pak_buffer.size,
- 0,
- VP9_BTI_BRC_MMDK_PAK_OUTPUT_G9);
- /* 4. Mbenc curbe input buffer */
- gen9_add_dri_buffer_gpe_surface(ctx,
- brc_gpe_context,
- mbenc_gpe_context->curbe.bo,
- 0,
- ALIGN(mbenc_gpe_context->curbe.length, 64),
- mbenc_gpe_context->curbe.offset,
- VP9_BTI_BRC_MBENC_CURBE_INPUT_G9);
- /* 5. Mbenc curbe output buffer */
- gen9_add_dri_buffer_gpe_surface(ctx,
- brc_gpe_context,
- mbenc_gpe_context->curbe.bo,
- 0,
- ALIGN(mbenc_gpe_context->curbe.length, 64),
- mbenc_gpe_context->curbe.offset,
- VP9_BTI_BRC_MBENC_CURBE_OUTPUT_G9);
-
- /* 6. BRC_PIC_STATE read buffer */
- gen9_add_buffer_gpe_surface(ctx, brc_gpe_context,
- &vme_context->res_pic_state_brc_read_buffer,
- 0,
- vme_context->res_pic_state_brc_read_buffer.size,
- 0,
- VP9_BTI_BRC_PIC_STATE_INPUT_G9);
-
- /* 7. BRC_PIC_STATE write buffer */
- gen9_add_buffer_gpe_surface(ctx, brc_gpe_context,
- &vme_context->res_pic_state_brc_write_hfw_read_buffer,
- 0,
- vme_context->res_pic_state_brc_write_hfw_read_buffer.size,
- 0,
- VP9_BTI_BRC_PIC_STATE_OUTPUT_G9);
-
- /* 8. SEGMENT_STATE read buffer */
- gen9_add_buffer_gpe_surface(ctx, brc_gpe_context,
- &vme_context->res_seg_state_brc_read_buffer,
- 0,
- vme_context->res_seg_state_brc_read_buffer.size,
- 0,
- VP9_BTI_BRC_SEGMENT_STATE_INPUT_G9);
-
- /* 9. SEGMENT_STATE write buffer */
- gen9_add_buffer_gpe_surface(ctx, brc_gpe_context,
- &vme_context->res_seg_state_brc_write_buffer,
- 0,
- vme_context->res_seg_state_brc_write_buffer.size,
- 0,
- VP9_BTI_BRC_SEGMENT_STATE_OUTPUT_G9);
-
- /* 10. Bitstream size buffer */
- gen9_add_buffer_gpe_surface(ctx, brc_gpe_context,
- &vme_context->res_brc_bitstream_size_buffer,
- 0,
- vme_context->res_brc_bitstream_size_buffer.size,
- 0,
- VP9_BTI_BRC_BITSTREAM_SIZE_G9);
-
- gen9_add_buffer_gpe_surface(ctx, brc_gpe_context,
- &vme_context->res_brc_hfw_data_buffer,
- 0,
- vme_context->res_brc_hfw_data_buffer.size,
- 0,
- VP9_BTI_BRC_HFW_DATA_G9);
-
- return;
-}
-
-static VAStatus
-gen9_vp9_brc_update_kernel(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct vp9_brc_context *brc_context = &vme_context->brc_context;
- struct i965_gpe_context *brc_gpe_context, *mbenc_gpe_context;
- int mbenc_index, gpe_index = VP9_BRC_UPDATE;
- int media_function = VP9_MEDIA_STATE_BRC_UPDATE;
- int mbenc_function;
- struct gen9_vp9_brc_curbe_param brc_update_curbe_param;
- VAEncPictureParameterBufferVP9 *pic_param;
- struct gen9_vp9_state *vp9_state;
- struct gen9_vp9_mbenc_curbe_param mbenc_curbe_param;
- struct gpe_media_object_parameter media_object_param;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- pic_param = vp9_state->pic_param;
- // Setup VP9 MbEnc Curbe
- if (vp9_state->picture_coding_type) {
- mbenc_function = VP9_MEDIA_STATE_MBENC_P;
- mbenc_index = VP9_MBENC_IDX_INTER;
- } else {
- mbenc_function = VP9_MEDIA_STATE_MBENC_I_32x32;
- mbenc_index = VP9_MBENC_IDX_KEY_32x32;
- }
-
- mbenc_gpe_context = &(vme_context->mbenc_context.gpe_contexts[mbenc_index]);
-
- memset(&mbenc_curbe_param, 0, sizeof(mbenc_curbe_param));
-
- mbenc_curbe_param.ppic_param = vp9_state->pic_param;
- mbenc_curbe_param.pseq_param = vp9_state->seq_param;
- mbenc_curbe_param.psegment_param = vp9_state->segment_param;
- //mbenc_curbe_param.ppRefList = &(vp9_state->pRefList[0]);
- mbenc_curbe_param.last_ref_obj = vp9_state->last_ref_obj;
- mbenc_curbe_param.golden_ref_obj = vp9_state->golden_ref_obj;
- mbenc_curbe_param.alt_ref_obj = vp9_state->alt_ref_obj;
- mbenc_curbe_param.frame_width_in_mb = ALIGN(vp9_state->frame_width, 16) / 16;
- mbenc_curbe_param.frame_height_in_mb = ALIGN(vp9_state->frame_height, 16) / 16;
- mbenc_curbe_param.hme_enabled = vp9_state->hme_enabled;
- mbenc_curbe_param.ref_frame_flag = vp9_state->ref_frame_flag;
- mbenc_curbe_param.multi_ref_qp_check = vp9_state->multi_ref_qp_check;
- mbenc_curbe_param.picture_coding_type = vp9_state->picture_coding_type;
- mbenc_curbe_param.media_state_type = mbenc_function;
-
- vme_context->pfn_set_curbe_mbenc(ctx, encode_state,
- mbenc_gpe_context,
- encoder_context,
- &mbenc_curbe_param);
-
- vp9_state->mbenc_curbe_set_in_brc_update = true;
-
- brc_gpe_context = &brc_context->gpe_contexts[gpe_index];
-
- gen8_gpe_context_init(ctx, brc_gpe_context);
- gen9_gpe_reset_binding_table(ctx, brc_gpe_context);
-
- memset(&brc_update_curbe_param, 0, sizeof(brc_update_curbe_param));
-
- // Setup BRC Update Curbe
- brc_update_curbe_param.media_state_type = media_function;
- brc_update_curbe_param.curr_frame = pic_param->reconstructed_frame;
- brc_update_curbe_param.ppic_param = vp9_state->pic_param;
- brc_update_curbe_param.pseq_param = vp9_state->seq_param;
- brc_update_curbe_param.psegment_param = vp9_state->segment_param;
- brc_update_curbe_param.picture_coding_type = vp9_state->picture_coding_type;
- brc_update_curbe_param.frame_width_in_mb = ALIGN(vp9_state->frame_width, 16) / 16;
- brc_update_curbe_param.frame_height_in_mb = ALIGN(vp9_state->frame_height, 16) / 16;
- brc_update_curbe_param.hme_enabled = vp9_state->hme_enabled;
- brc_update_curbe_param.b_used_ref = 1;
- brc_update_curbe_param.frame_number = vp9_state->frame_number;
- brc_update_curbe_param.ref_frame_flag = vp9_state->ref_frame_flag;
- brc_update_curbe_param.mbbrc_enabled = 0;
- brc_update_curbe_param.multi_ref_qp_check = vp9_state->multi_ref_qp_check;
- brc_update_curbe_param.brc_num_pak_passes = vp9_state->num_pak_passes;
-
- brc_update_curbe_param.pbrc_init_current_target_buf_full_in_bits =
- &vp9_state->brc_init_current_target_buf_full_in_bits;
- brc_update_curbe_param.pbrc_init_reset_buf_size_in_bits =
- &vp9_state->brc_init_reset_buf_size_in_bits;
- brc_update_curbe_param.pbrc_init_reset_input_bits_per_frame =
- &vp9_state->brc_init_reset_input_bits_per_frame;
-
- vme_context->pfn_set_curbe_brc(ctx, encode_state,
- brc_gpe_context,
- encoder_context,
- &brc_update_curbe_param);
-
-
- // Check if the constant data surface is present
- if (vp9_state->brc_constant_buffer_supported)
- {
- char *brc_const_buffer;
- brc_const_buffer = i965_map_gpe_resource(&vme_context->res_brc_const_data_buffer);
-
- if (!brc_const_buffer)
- return VA_STATUS_ERROR_OPERATION_FAILED;
-
- if (vp9_state->picture_coding_type)
- memcpy(brc_const_buffer, vp9_brc_const_data_p_g9,
- sizeof(vp9_brc_const_data_p_g9));
- else
- memcpy(brc_const_buffer, vp9_brc_const_data_i_g9,
- sizeof(vp9_brc_const_data_i_g9));
-
- i965_unmap_gpe_resource(&vme_context->res_brc_const_data_buffer);
- }
-
- if (pic_param->pic_flags.bits.segmentation_enabled)
- {
- //reallocate the vme_state->mb_segment_map_surface
- /* this will be added later */
- }
-
- {
- pic_param->filter_level = 0;
- // clear the filter level value in picParams ebfore programming pic state, as this value will be determined and updated by BRC.
- intel_vp9enc_construct_picstate_batchbuf(ctx, encode_state,
- encoder_context, &vme_context->res_pic_state_brc_read_buffer);
- }
-
- gen9_brc_update_add_surfaces_vp9(ctx, encode_state,
- encoder_context,
- brc_gpe_context,
- mbenc_gpe_context);
-
- gen8_gpe_setup_interface_data(ctx, brc_gpe_context);
- memset(&media_object_param, 0, sizeof(media_object_param));
- gen9_run_kernel_media_object(ctx, encoder_context,
- brc_gpe_context,
- media_function,
- &media_object_param);
- return VA_STATUS_SUCCESS;
-}
-
-static
-void gen9_vp9_set_curbe_me(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct i965_gpe_context *gpe_context,
- struct intel_encoder_context *encoder_context,
- struct gen9_vp9_me_curbe_param *param)
-{
- vp9_me_curbe_data *me_cmd;
- int enc_media_state;
- int me_mode;
- unsigned int width, height;
- uint32_t l0_ref_frames;
- uint32_t scale_factor;
-
- if (param->b16xme_enabled) {
- if (param->use_16x_me)
- me_mode = VP9_ENC_ME16X_BEFORE_ME4X;
- else
- me_mode = VP9_ENC_ME4X_AFTER_ME16X;
- } else {
- me_mode = VP9_ENC_ME4X_ONLY;
- }
-
- if (me_mode == VP9_ENC_ME16X_BEFORE_ME4X)
- scale_factor = 16;
- else
- scale_factor = 4;
-
- if (param->use_16x_me)
- enc_media_state = VP9_MEDIA_STATE_16X_ME;
- else
- enc_media_state = VP9_MEDIA_STATE_4X_ME;
-
- me_cmd = i965_gpe_context_map_curbe(gpe_context);
-
- if (!me_cmd)
- return;
-
- memset(me_cmd, 0, sizeof(vp9_me_curbe_data));
-
- me_cmd->dw1.max_num_mvs = 0x10;
- me_cmd->dw1.bi_weight = 0x00;
-
- me_cmd->dw2.max_num_su = 0x39;
- me_cmd->dw2.max_len_sp = 0x39;
-
- me_cmd->dw3.sub_mb_part_mask = 0x77;
- me_cmd->dw3.inter_sad = 0x00;
- me_cmd->dw3.intra_sad = 0x00;
- me_cmd->dw3.bme_disable_fbr = 0x01;
- me_cmd->dw3.sub_pel_mode = 0x03;
-
- width = param->frame_width / scale_factor;
- height = param->frame_height / scale_factor;
-
- me_cmd->dw4.picture_width = ALIGN(width, 16) / 16;
- me_cmd->dw4.picture_height_minus1 = ALIGN(height, 16) / 16 - 1;
-
- me_cmd->dw5.ref_width = 0x30;
- me_cmd->dw5.ref_height = 0x28;
-
- if (enc_media_state == VP9_MEDIA_STATE_4X_ME)
- me_cmd->dw6.write_distortions = 0x01;
-
- me_cmd->dw6.use_mv_from_prev_step = me_mode == VP9_ENC_ME4X_AFTER_ME16X ? 1 : 0;
- me_cmd->dw6.super_combine_dist = 0x5;
- me_cmd->dw6.max_vmvr = 0x7fc;
-
- l0_ref_frames = (param->ref_frame_flag & 0x01) +
- !!(param->ref_frame_flag & 0x02) +
- !!(param->ref_frame_flag & 0x04);
- me_cmd->dw13.num_ref_idx_l0_minus1 = (l0_ref_frames > 0) ? l0_ref_frames - 1 : 0;
- me_cmd->dw13.num_ref_idx_l1_minus1 = 0;
-
- me_cmd->dw14.l0_ref_pic_polarity_bits = 0;
- me_cmd->dw14.l1_ref_pic_polarity_bits = 0;
-
- me_cmd->dw15.mv_shift_factor = 0x02;
-
- {
- memcpy((void *)((char *)me_cmd + 64),
- vp9_diamond_ime_search_path_delta,
- sizeof(vp9_diamond_ime_search_path_delta));
- }
-
-
- me_cmd->dw32._4x_memv_output_data_surf_index = VP9_BTI_ME_MV_DATA_SURFACE;
- me_cmd->dw33._16x_32x_memv_input_data_surf_index = VP9_BTI_16XME_MV_DATA_SURFACE;
- me_cmd->dw34._4x_me_output_dist_surf_index = VP9_BTI_ME_DISTORTION_SURFACE;
- me_cmd->dw35._4x_me_output_brc_dist_surf_index = VP9_BTI_ME_BRC_DISTORTION_SURFACE;
- me_cmd->dw36.vme_fwd_inter_pred_surf_index = VP9_BTI_ME_CURR_PIC_L0;
- me_cmd->dw37.vme_bdw_inter_pred_surf_index = VP9_BTI_ME_CURR_PIC_L1;
-
- i965_gpe_context_unmap_curbe(gpe_context);
-}
-
-static void
-gen9_vp9_send_me_surface(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct i965_gpe_context *gpe_context,
- struct intel_encoder_context *encoder_context,
- struct gen9_vp9_me_surface_param *param)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct object_surface *obj_surface;
- struct gen9_surface_vp9 *vp9_priv_surface;
- struct object_surface *input_surface;
- struct i965_gpe_resource *gpe_resource;
- int ref_bti;
-
- obj_surface = SURFACE(param->curr_pic);
-
- if (!obj_surface || !obj_surface->private_data)
- return;
-
- vp9_priv_surface = obj_surface->private_data;
- if (param->use_16x_me)
- {
- gpe_resource = param->pres_16x_memv_data_buffer;
- }
- else
- {
- gpe_resource = param->pres_4x_memv_data_buffer;
- }
-
- gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
- gpe_resource,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_ME_MV_DATA_SURFACE);
-
- if (param->b16xme_enabled) {
- gpe_resource = param->pres_16x_memv_data_buffer;
- gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
- gpe_resource,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_16XME_MV_DATA_SURFACE);
- }
-
- if (!param->use_16x_me) {
- gpe_resource = param->pres_me_brc_distortion_buffer;
-
- gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
- gpe_resource,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_ME_BRC_DISTORTION_SURFACE);
-
- gpe_resource = param->pres_me_distortion_buffer;
-
- gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
- gpe_resource,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_ME_DISTORTION_SURFACE);
- }
-
- if (param->use_16x_me)
- input_surface = vp9_priv_surface->scaled_16x_surface_obj;
- else
- input_surface = vp9_priv_surface->scaled_4x_surface_obj;
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- input_surface,
- VP9_BTI_ME_CURR_PIC_L0);
-
- ref_bti = VP9_BTI_ME_CURR_PIC_L0 + 1;
-
-
- if (param->last_ref_pic) {
- obj_surface = param->last_ref_pic;
- vp9_priv_surface = obj_surface->private_data;
-
- if (param->use_16x_me)
- input_surface = vp9_priv_surface->scaled_16x_surface_obj;
- else
- input_surface = vp9_priv_surface->scaled_4x_surface_obj;
-
- if (param->dys_enabled &&
- ((vp9_priv_surface->frame_width != param->frame_width) ||
- (vp9_priv_surface->frame_height != param->frame_height))) {
- if (param->use_16x_me)
- input_surface = vp9_priv_surface->dys_16x_surface_obj;
- else
- input_surface = vp9_priv_surface->dys_4x_surface_obj;
- }
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- input_surface,
- ref_bti);
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- input_surface,
- ref_bti + 1);
- ref_bti += 2;
- }
-
- if (param->golden_ref_pic) {
- obj_surface = param->golden_ref_pic;
- vp9_priv_surface = obj_surface->private_data;
-
- if (param->use_16x_me)
- input_surface = vp9_priv_surface->scaled_16x_surface_obj;
- else
- input_surface = vp9_priv_surface->scaled_4x_surface_obj;
-
- if (param->dys_enabled &&
- ((vp9_priv_surface->frame_width != param->frame_width) ||
- (vp9_priv_surface->frame_height != param->frame_height))) {
- if (param->use_16x_me)
- input_surface = vp9_priv_surface->dys_16x_surface_obj;
- else
- input_surface = vp9_priv_surface->dys_4x_surface_obj;
- }
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- input_surface,
- ref_bti);
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- input_surface,
- ref_bti + 1);
- ref_bti += 2;
- }
-
- if (param->alt_ref_pic) {
- obj_surface = param->alt_ref_pic;
- vp9_priv_surface = obj_surface->private_data;
-
- if (param->use_16x_me)
- input_surface = vp9_priv_surface->scaled_16x_surface_obj;
- else
- input_surface = vp9_priv_surface->scaled_4x_surface_obj;
-
- if (param->dys_enabled &&
- ((vp9_priv_surface->frame_width != param->frame_width) ||
- (vp9_priv_surface->frame_height != param->frame_height))) {
- if (param->use_16x_me)
- input_surface = vp9_priv_surface->dys_16x_surface_obj;
- else
- input_surface = vp9_priv_surface->dys_4x_surface_obj;
- }
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- input_surface,
- ref_bti);
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- input_surface,
- ref_bti + 1);
- ref_bti += 2;
- }
-
- return;
-}
-
-static
-void gen9_me_add_surfaces_vp9(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- struct i965_gpe_context *gpe_context,
- int use_16x_me)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct gen9_vp9_me_surface_param me_surface_param;
- struct gen9_vp9_state *vp9_state;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
-
- /* sScaled4xSurface surface */
- memset(&me_surface_param, 0, sizeof(me_surface_param));
- me_surface_param.last_ref_pic = vp9_state->last_ref_obj;
- me_surface_param.golden_ref_pic = vp9_state->golden_ref_obj;
- me_surface_param.alt_ref_pic = vp9_state->alt_ref_obj;
- me_surface_param.curr_pic = vp9_state->curr_frame;
- me_surface_param.pres_4x_memv_data_buffer = &vme_context->s4x_memv_data_buffer;
- me_surface_param.pres_16x_memv_data_buffer = &vme_context->s16x_memv_data_buffer;
- me_surface_param.pres_me_distortion_buffer = &vme_context->s4x_memv_distortion_buffer;
- me_surface_param.pres_me_brc_distortion_buffer = &vme_context->s4x_memv_distortion_buffer;
-
- if (use_16x_me) {
- me_surface_param.downscaled_width_in_mb = vp9_state->downscaled_width_16x_in_mb;
- me_surface_param.downscaled_height_in_mb = vp9_state->downscaled_height_16x_in_mb;
- } else {
- me_surface_param.downscaled_width_in_mb = vp9_state->downscaled_width_4x_in_mb;
- me_surface_param.downscaled_height_in_mb = vp9_state->downscaled_height_4x_in_mb;
- }
- me_surface_param.frame_width = vp9_state->frame_width;
- me_surface_param.frame_height = vp9_state->frame_height;
-
- me_surface_param.use_16x_me = use_16x_me;
- me_surface_param.b16xme_enabled = vp9_state->b16xme_enabled;
- me_surface_param.dys_enabled = vp9_state->dys_in_use;
-
- vme_context->pfn_send_me_surface(ctx, encode_state,
- gpe_context,
- encoder_context,
- &me_surface_param);
- return;
-}
-
-static VAStatus
-gen9_vp9_me_kernel(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- int use_16x_me)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct i965_gpe_context *gpe_context;
- int media_function;
- struct gen9_vp9_me_curbe_param me_curbe_param;
- struct gen9_vp9_state *vp9_state;
- struct gpe_media_object_walker_parameter media_object_walker_param;
- struct vp9_encoder_kernel_walker_parameter kernel_walker_param;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- if (use_16x_me)
- media_function = VP9_MEDIA_STATE_16X_ME;
- else
- media_function = VP9_MEDIA_STATE_4X_ME;
-
- gpe_context = &(vme_context->me_context.gpe_context);
-
- gen8_gpe_context_init(ctx, gpe_context);
- gen9_gpe_reset_binding_table(ctx, gpe_context);
-
- memset(&me_curbe_param, 0, sizeof(me_curbe_param));
- me_curbe_param.ppic_param = vp9_state->pic_param;
- me_curbe_param.pseq_param = vp9_state->seq_param;
- me_curbe_param.frame_width = vp9_state->frame_width;
- me_curbe_param.frame_height = vp9_state->frame_height;
- me_curbe_param.ref_frame_flag = vp9_state->ref_frame_flag;
- me_curbe_param.use_16x_me = use_16x_me;
- me_curbe_param.b16xme_enabled = vp9_state->b16xme_enabled;
- vme_context->pfn_set_curbe_me(ctx, encode_state,
- gpe_context,
- encoder_context,
- &me_curbe_param);
-
- gen9_me_add_surfaces_vp9(ctx, encode_state,
- encoder_context,
- gpe_context,
- use_16x_me);
-
- gen8_gpe_setup_interface_data(ctx, gpe_context);
-
- memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
- if (use_16x_me) {
- kernel_walker_param.resolution_x = vp9_state->downscaled_width_16x_in_mb;
- kernel_walker_param.resolution_y = vp9_state->downscaled_height_16x_in_mb;
- } else {
- kernel_walker_param.resolution_x = vp9_state->downscaled_width_4x_in_mb;
- kernel_walker_param.resolution_y = vp9_state->downscaled_height_4x_in_mb;
- }
- kernel_walker_param.no_dependency = 1;
-
- gen9_init_media_object_walker_parameter(encoder_context, &kernel_walker_param, &media_object_walker_param);
-
- gen9_run_kernel_media_object_walker(ctx, encoder_context,
- gpe_context,
- media_function,
- &media_object_walker_param);
-
- return VA_STATUS_SUCCESS;
-}
-
-static void
-gen9_vp9_set_curbe_scaling_cm(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct i965_gpe_context *gpe_context,
- struct intel_encoder_context *encoder_context,
- struct gen9_vp9_scaling_curbe_param *curbe_param)
-{
- vp9_scaling4x_curbe_data_cm *curbe_cmd;
-
- curbe_cmd = i965_gpe_context_map_curbe(gpe_context);
-
- if (!curbe_cmd)
- return;
-
- memset(curbe_cmd, 0, sizeof(vp9_scaling4x_curbe_data_cm));
-
- curbe_cmd->dw0.input_picture_width = curbe_param->input_picture_width;
- curbe_cmd->dw0.input_picture_height = curbe_param->input_picture_height;
-
- curbe_cmd->dw1.input_y_bti = VP9_BTI_SCALING_FRAME_SRC_Y;
- curbe_cmd->dw2.output_y_bti = VP9_BTI_SCALING_FRAME_DST_Y;
-
-
- curbe_cmd->dw6.enable_mb_variance_output = 0;
- curbe_cmd->dw6.enable_mb_pixel_average_output = 0;
- curbe_cmd->dw6.enable_blk8x8_stat_output = 0;
-
- if (curbe_param->mb_variance_output_enabled ||
- curbe_param->mb_pixel_average_output_enabled)
- {
- curbe_cmd->dw10.mbv_proc_stat_bti = VP9_BTI_SCALING_FRAME_MBVPROCSTATS_DST_CM;
- }
-
- i965_gpe_context_unmap_curbe(gpe_context);
- return;
-}
-
-static void
-gen9_vp9_send_scaling_surface(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct i965_gpe_context *gpe_context,
- struct intel_encoder_context *encoder_context,
- struct gen9_vp9_scaling_surface_param *scaling_surface_param)
-{
- vp9_bti_scaling_offset *scaling_bti;
- unsigned int surface_format;
-
- scaling_bti = scaling_surface_param->p_scaling_bti;
-
- if (scaling_surface_param->scaling_out_use_32unorm_surf_fmt)
- surface_format = I965_SURFACEFORMAT_R32_UNORM;
- else if (scaling_surface_param->scaling_out_use_16unorm_surf_fmt)
- surface_format = I965_SURFACEFORMAT_R16_UNORM;
- else
- surface_format = I965_SURFACEFORMAT_R8_UNORM;
-
- gen9_add_2d_gpe_surface(ctx, gpe_context,
- scaling_surface_param->input_surface,
- 0, 1, surface_format,
- scaling_bti->scaling_frame_src_y);
-
- gen9_add_2d_gpe_surface(ctx, gpe_context,
- scaling_surface_param->output_surface,
- 0, 1, surface_format,
- scaling_bti->scaling_frame_dst_y);
-
-
- return;
-}
-
-static VAStatus
-gen9_vp9_scaling_kernel(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- int use_16x_scaling)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct i965_gpe_context *gpe_context;
- int media_function;
- struct gen9_vp9_scaling_curbe_param scaling_curbe_param;
- struct gen9_vp9_scaling_surface_param scaling_surface_param;
- struct gen9_vp9_state *vp9_state;
- VAEncPictureParameterBufferVP9 *pic_param;
- struct gpe_media_object_walker_parameter media_object_walker_param;
- struct vp9_encoder_kernel_walker_parameter kernel_walker_param;
- struct object_surface *obj_surface;
- struct object_surface *input_surface, *output_surface;
- struct gen9_surface_vp9 *vp9_priv_surface;
- unsigned int downscaled_width_in_mb, downscaled_height_in_mb;
- unsigned int input_frame_width, input_frame_height;
- unsigned int output_frame_width, output_frame_height;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- pic_param = vp9_state->pic_param;
-
- if (use_16x_scaling)
- media_function = VP9_MEDIA_STATE_16X_SCALING;
- else
- media_function = VP9_MEDIA_STATE_4X_SCALING;
-
- gpe_context = &(vme_context->scaling_context.gpe_contexts[0]);
-
- gen8_gpe_context_init(ctx, gpe_context);
- gen9_gpe_reset_binding_table(ctx, gpe_context);
-
- obj_surface = encode_state->reconstructed_object;
- vp9_priv_surface = obj_surface->private_data;
-
- if (use_16x_scaling)
- {
- downscaled_width_in_mb = vp9_state->downscaled_width_16x_in_mb;
- downscaled_height_in_mb = vp9_state->downscaled_height_16x_in_mb;
-
- input_surface = vp9_priv_surface->scaled_4x_surface_obj;
- input_frame_width = vp9_state->frame_width_4x;
- input_frame_height = vp9_state->frame_height_4x;
-
- output_surface = vp9_priv_surface->scaled_16x_surface_obj;
- output_frame_width = vp9_state->frame_width_16x;
- output_frame_height = vp9_state->frame_height_16x;
- } else {
- downscaled_width_in_mb = vp9_state->downscaled_width_4x_in_mb;
- downscaled_height_in_mb = vp9_state->downscaled_height_4x_in_mb;
-
- if (vp9_state->dys_in_use &&
- ((pic_param->frame_width_src != pic_param->frame_width_dst) ||
- (pic_param->frame_height_src != pic_param->frame_height_dst)))
- input_surface = vp9_priv_surface->dys_surface_obj;
- else
- input_surface = encode_state->input_yuv_object;
-
- input_frame_width = vp9_state->frame_width;
- input_frame_height = vp9_state->frame_height;
-
- output_surface = vp9_priv_surface->scaled_4x_surface_obj;
- output_frame_width = vp9_state->frame_width_4x;
- output_frame_height = vp9_state->frame_height_4x;
- }
-
- memset(&scaling_curbe_param, 0, sizeof(scaling_curbe_param));
-
- scaling_curbe_param.input_picture_width = input_frame_width;
- scaling_curbe_param.input_picture_height = input_frame_height;
-
- scaling_curbe_param.use_16x_scaling = use_16x_scaling;
- scaling_curbe_param.use_32x_scaling = 0;
-
- if (use_16x_scaling)
- scaling_curbe_param.mb_variance_output_enabled = 0;
- else
- scaling_curbe_param.mb_variance_output_enabled = vp9_state->adaptive_transform_decision_enabled;
-
- scaling_curbe_param.blk8x8_stat_enabled = 0;
-
- vme_context->pfn_set_curbe_scaling(ctx, encode_state,
- gpe_context,
- encoder_context,
- &scaling_curbe_param);
-
- memset(&scaling_surface_param, 0, sizeof(scaling_surface_param));
- scaling_surface_param.p_scaling_bti = (void *)(&vme_context->scaling_context.scaling_4x_bti);
- scaling_surface_param.input_surface = input_surface;
- scaling_surface_param.input_frame_width = input_frame_width;
- scaling_surface_param.input_frame_height = input_frame_height;
-
- scaling_surface_param.output_surface = output_surface;
- scaling_surface_param.output_frame_width = output_frame_width;
- scaling_surface_param.output_frame_height = output_frame_height;
- scaling_surface_param.scaling_out_use_16unorm_surf_fmt = 0;
- scaling_surface_param.scaling_out_use_32unorm_surf_fmt = 1;
-
- vme_context->pfn_send_scaling_surface(ctx, encode_state,
- gpe_context,
- encoder_context,
- &scaling_surface_param);
-
- gen8_gpe_setup_interface_data(ctx, gpe_context);
-
- memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
- /* the scaling is based on 8x8 blk level */
- kernel_walker_param.resolution_x = downscaled_width_in_mb * 2;
- kernel_walker_param.resolution_y = downscaled_height_in_mb * 2;
- kernel_walker_param.no_dependency = 1;
-
- gen9_init_media_object_walker_parameter(encoder_context, &kernel_walker_param, &media_object_walker_param);
-
- gen9_run_kernel_media_object_walker(ctx, encoder_context,
- gpe_context,
- media_function,
- &media_object_walker_param);
-
- return VA_STATUS_SUCCESS;
-}
-
-static void
-gen9_vp9_dys_set_sampler_state(struct i965_gpe_context *gpe_context)
-{
- struct gen9_sampler_8x8_avs *sampler_cmd;
-
- if (!gpe_context)
- return;
-
- dri_bo_map(gpe_context->sampler.bo, 1);
-
- if (!gpe_context->sampler.bo->virtual)
- return;
-
- sampler_cmd = (struct gen9_sampler_8x8_avs *)
- (gpe_context->sampler.bo->virtual + gpe_context->sampler.offset);
-
- memset(sampler_cmd, 0, sizeof(struct gen9_sampler_8x8_avs));
-
- sampler_cmd->dw0.r3c_coefficient = 15;
- sampler_cmd->dw0.r3x_coefficient = 6;
- sampler_cmd->dw0.strong_edge_threshold = 8;
- sampler_cmd->dw0.weak_edge_threshold = 1;
- sampler_cmd->dw0.gain_factor = 32;
-
- sampler_cmd->dw2.r5c_coefficient = 3;
- sampler_cmd->dw2.r5cx_coefficient = 8;
- sampler_cmd->dw2.r5x_coefficient = 9;
- sampler_cmd->dw2.strong_edge_weight = 6;
- sampler_cmd->dw2.regular_weight = 3;
- sampler_cmd->dw2.non_edge_weight = 2;
- sampler_cmd->dw2.global_noise_estimation = 255;
-
- sampler_cmd->dw3.enable_8tap_adaptive_filter = 0;
- sampler_cmd->dw3.cos_alpha = 79;
- sampler_cmd->dw3.sin_alpha = 101;
-
- sampler_cmd->dw5.diamond_du = 0;
- sampler_cmd->dw5.hs_margin = 3;
- sampler_cmd->dw5.diamond_alpha = 100;
-
- sampler_cmd->dw7.inv_margin_vyl = 3300;
-
- sampler_cmd->dw8.inv_margin_vyu = 1600;
-
- sampler_cmd->dw10.y_slope2 = 24;
- sampler_cmd->dw10.s0l = 1792;
-
- sampler_cmd->dw12.y_slope1 = 24;
-
- sampler_cmd->dw14.s0u = 256;
-
- sampler_cmd->dw15.s2u = 1792;
- sampler_cmd->dw15.s1u = 0;
-
- memcpy(sampler_cmd->coefficients,
- &gen9_vp9_avs_coeffs[0],
- 17 * sizeof(struct gen8_sampler_8x8_avs_coefficients));
-
- sampler_cmd->dw152.default_sharpness_level = 255;
- sampler_cmd->dw152.max_derivative_4_pixels = 7;
- sampler_cmd->dw152.max_derivative_8_pixels = 20;
- sampler_cmd->dw152.transition_area_with_4_pixels = 4;
- sampler_cmd->dw152.transition_area_with_8_pixels = 5;
-
- sampler_cmd->dw153.bypass_x_adaptive_filtering = 1;
- sampler_cmd->dw153.bypass_y_adaptive_filtering = 1;
- sampler_cmd->dw153.adaptive_filter_for_all_channel = 0;
-
- memcpy(sampler_cmd->extra_coefficients,
- &gen9_vp9_avs_coeffs[17 * 8],
- 15 * sizeof(struct gen8_sampler_8x8_avs_coefficients));
-
- dri_bo_unmap(gpe_context->sampler.bo);
-}
-
-static void
-gen9_vp9_set_curbe_dys(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct i965_gpe_context *gpe_context,
- struct intel_encoder_context *encoder_context,
- struct gen9_vp9_dys_curbe_param *curbe_param)
-{
- vp9_dys_curbe_data *curbe_cmd;
-
- curbe_cmd = i965_gpe_context_map_curbe(gpe_context);
-
- if (!curbe_cmd)
- return;
-
- memset(curbe_cmd, 0, sizeof(vp9_dys_curbe_data));
-
- curbe_cmd->dw0.input_frame_width = curbe_param->input_width;
- curbe_cmd->dw0.input_frame_height = curbe_param->input_height;
-
- curbe_cmd->dw1.output_frame_width = curbe_param->output_width;
- curbe_cmd->dw1.output_frame_height = curbe_param->output_height;
-
- curbe_cmd->dw2.delta_u = 1.0f / curbe_param->output_width;
- curbe_cmd->dw3.delta_v = 1.0f / curbe_param->output_height;
-
- curbe_cmd->dw16.input_frame_nv12_bti = VP9_BTI_DYS_INPUT_NV12;
- curbe_cmd->dw17.output_frame_y_bti = VP9_BTI_DYS_OUTPUT_Y;
- curbe_cmd->dw18.avs_sample_idx = 0;
-
- i965_gpe_context_unmap_curbe(gpe_context);
-}
-
-static void
-gen9_vp9_send_dys_surface(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct i965_gpe_context *gpe_context,
- struct intel_encoder_context *encoder_context,
- struct gen9_vp9_dys_surface_param *surface_param)
-{
-
- if (surface_param->input_frame)
- gen9_add_adv_gpe_surface(ctx,
- gpe_context,
- surface_param->input_frame,
- VP9_BTI_DYS_INPUT_NV12);
-
- if (surface_param->output_frame) {
- gen9_add_2d_gpe_surface(ctx,
- gpe_context,
- surface_param->output_frame,
- 0,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_DYS_OUTPUT_Y);
-
- gen9_add_2d_gpe_surface(ctx,
- gpe_context,
- surface_param->output_frame,
- 1,
- 1,
- I965_SURFACEFORMAT_R16_UINT,
- VP9_BTI_DYS_OUTPUT_UV);
- }
-
- return;
-}
-
-static VAStatus
-gen9_vp9_dys_kernel(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- gen9_vp9_dys_kernel_param *dys_kernel_param)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct i965_gpe_context *gpe_context;
- int media_function;
- struct gen9_vp9_dys_curbe_param curbe_param;
- struct gen9_vp9_dys_surface_param surface_param;
- struct gpe_media_object_walker_parameter media_object_walker_param;
- struct vp9_encoder_kernel_walker_parameter kernel_walker_param;
- unsigned int resolution_x, resolution_y;
-
- media_function = VP9_MEDIA_STATE_DYS;
- gpe_context = &vme_context->dys_context.gpe_context;
-
- //gen8_gpe_context_init(ctx, gpe_context);
- gen9_gpe_reset_binding_table(ctx, gpe_context);
-
- /* sampler state is configured only when initializing the GPE context */
-
- memset(&curbe_param, 0, sizeof(curbe_param));
- curbe_param.input_width = dys_kernel_param->input_width;
- curbe_param.input_height = dys_kernel_param->input_height;
- curbe_param.output_width = dys_kernel_param->output_width;
- curbe_param.output_height = dys_kernel_param->output_height;
- vme_context->pfn_set_curbe_dys(ctx, encode_state,
- gpe_context,
- encoder_context,
- &curbe_param);
-
- // Add surface states
- memset(&surface_param, 0, sizeof(surface_param));
- surface_param.input_frame = dys_kernel_param->input_surface;
- surface_param.output_frame = dys_kernel_param->output_surface;
- surface_param.vert_line_stride = 0;
- surface_param.vert_line_stride_offset = 0;
-
- vme_context->pfn_send_dys_surface(ctx,
- encode_state,
- gpe_context,
- encoder_context,
- &surface_param);
-
- resolution_x = ALIGN(dys_kernel_param->output_width, 16) / 16;
- resolution_y = ALIGN(dys_kernel_param->output_height, 16) / 16;
-
- gen8_gpe_setup_interface_data(ctx, gpe_context);
-
- memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
- kernel_walker_param.resolution_x = resolution_x;
- kernel_walker_param.resolution_y = resolution_y;
- kernel_walker_param.no_dependency = 1;
-
- gen9_init_media_object_walker_parameter(encoder_context, &kernel_walker_param, &media_object_walker_param);
-
- gen9_run_kernel_media_object_walker(ctx, encoder_context,
- gpe_context,
- media_function,
- &media_object_walker_param);
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-gen9_vp9_run_dys_refframes(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct gen9_vp9_state *vp9_state;
- VAEncPictureParameterBufferVP9 *pic_param;
- gen9_vp9_dys_kernel_param dys_kernel_param;
- struct object_surface *obj_surface;
- struct object_surface *input_surface, *output_surface;
- struct gen9_surface_vp9 *vp9_priv_surface;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- pic_param = vp9_state->pic_param;
-
- if ((pic_param->frame_width_src != pic_param->frame_width_dst) ||
- (pic_param->frame_height_src != pic_param->frame_height_dst)) {
- input_surface = encode_state->input_yuv_object;
- obj_surface = encode_state->reconstructed_object;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
- output_surface = vp9_priv_surface->dys_surface_obj;
-
- memset(&dys_kernel_param, 0, sizeof(dys_kernel_param));
- dys_kernel_param.input_width = pic_param->frame_width_src;
- dys_kernel_param.input_height = pic_param->frame_height_src;
- dys_kernel_param.input_surface = input_surface;
- dys_kernel_param.output_width = pic_param->frame_width_dst;
- dys_kernel_param.output_height = pic_param->frame_height_dst;
- dys_kernel_param.output_surface = output_surface;
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
- }
-
- if ((vp9_state->dys_ref_frame_flag & VP9_LAST_REF) &&
- vp9_state->last_ref_obj) {
- obj_surface = vp9_state->last_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- input_surface = obj_surface;
- output_surface = vp9_priv_surface->dys_surface_obj;
-
- dys_kernel_param.input_width = vp9_priv_surface->frame_width;
- dys_kernel_param.input_height = vp9_priv_surface->frame_height;
- dys_kernel_param.input_surface = input_surface;
-
- dys_kernel_param.output_width = pic_param->frame_width_dst;
- dys_kernel_param.output_height = pic_param->frame_height_dst;
- dys_kernel_param.output_surface = output_surface;
-
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
-
- if (vp9_state->hme_enabled) {
- dys_kernel_param.input_width = ALIGN((vp9_priv_surface->frame_width / 4), 16);
- dys_kernel_param.input_width = ALIGN((vp9_priv_surface->frame_height / 4), 16);
- dys_kernel_param.input_surface = vp9_priv_surface->scaled_4x_surface_obj;
-
- dys_kernel_param.output_width = vp9_state->frame_width_4x;
- dys_kernel_param.output_height = vp9_state->frame_height_4x;
- dys_kernel_param.output_surface = vp9_priv_surface->dys_4x_surface_obj;
-
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
-
- /* Does it really need to do the 16x HME if the
- * resolution is different?
- * Maybe it should be restricted
- */
- if (vp9_state->b16xme_enabled) {
- dys_kernel_param.input_width = ALIGN((vp9_priv_surface->frame_width / 16), 16);
- dys_kernel_param.input_height = ALIGN((vp9_priv_surface->frame_height / 16), 16);
- dys_kernel_param.input_surface = vp9_priv_surface->scaled_16x_surface_obj;
-
- dys_kernel_param.output_width = vp9_state->frame_width_16x;
- dys_kernel_param.output_height = vp9_state->frame_height_16x;
- dys_kernel_param.output_surface = vp9_priv_surface->dys_16x_surface_obj;
-
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
- }
- }
- }
-
- if ((vp9_state->dys_ref_frame_flag & VP9_GOLDEN_REF) &&
- vp9_state->golden_ref_obj) {
- obj_surface = vp9_state->golden_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- input_surface = obj_surface;
- output_surface = vp9_priv_surface->dys_surface_obj;
-
- dys_kernel_param.input_width = vp9_priv_surface->frame_width;
- dys_kernel_param.input_height = vp9_priv_surface->frame_height;
- dys_kernel_param.input_surface = input_surface;
-
- dys_kernel_param.output_width = pic_param->frame_width_dst;
- dys_kernel_param.output_height = pic_param->frame_height_dst;
- dys_kernel_param.output_surface = output_surface;
-
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
-
- if (vp9_state->hme_enabled) {
- dys_kernel_param.input_width = ALIGN((vp9_priv_surface->frame_width / 4), 16);
- dys_kernel_param.input_width = ALIGN((vp9_priv_surface->frame_height / 4), 16);
- dys_kernel_param.input_surface = vp9_priv_surface->scaled_4x_surface_obj;
-
- dys_kernel_param.output_width = vp9_state->frame_width_4x;
- dys_kernel_param.output_height = vp9_state->frame_height_4x;
- dys_kernel_param.output_surface = vp9_priv_surface->dys_4x_surface_obj;
-
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
-
- /* Does it really need to do the 16x HME if the
- * resolution is different?
- * Maybe it should be restricted
- */
- if (vp9_state->b16xme_enabled) {
- dys_kernel_param.input_width = ALIGN((vp9_priv_surface->frame_width / 16), 16);
- dys_kernel_param.input_height = ALIGN((vp9_priv_surface->frame_height / 16), 16);
- dys_kernel_param.input_surface = vp9_priv_surface->scaled_16x_surface_obj;
-
- dys_kernel_param.output_width = vp9_state->frame_width_16x;
- dys_kernel_param.output_height = vp9_state->frame_height_16x;
- dys_kernel_param.output_surface = vp9_priv_surface->dys_16x_surface_obj;
-
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
- }
- }
- }
-
- if ((vp9_state->dys_ref_frame_flag & VP9_ALT_REF) &&
- vp9_state->alt_ref_obj) {
- obj_surface = vp9_state->alt_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- input_surface = obj_surface;
- output_surface = vp9_priv_surface->dys_surface_obj;
-
- dys_kernel_param.input_width = vp9_priv_surface->frame_width;
- dys_kernel_param.input_height = vp9_priv_surface->frame_height;
- dys_kernel_param.input_surface = input_surface;
-
- dys_kernel_param.output_width = pic_param->frame_width_dst;
- dys_kernel_param.output_height = pic_param->frame_height_dst;
- dys_kernel_param.output_surface = output_surface;
-
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
-
- if (vp9_state->hme_enabled) {
- dys_kernel_param.input_width = ALIGN((vp9_priv_surface->frame_width / 4), 16);
- dys_kernel_param.input_width = ALIGN((vp9_priv_surface->frame_height / 4), 16);
- dys_kernel_param.input_surface = vp9_priv_surface->scaled_4x_surface_obj;
-
- dys_kernel_param.output_width = vp9_state->frame_width_4x;
- dys_kernel_param.output_height = vp9_state->frame_height_4x;
- dys_kernel_param.output_surface = vp9_priv_surface->dys_4x_surface_obj;
-
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
-
- /* Does it really need to do the 16x HME if the
- * resolution is different?
- * Maybe it should be restricted
- */
- if (vp9_state->b16xme_enabled) {
- dys_kernel_param.input_width = ALIGN((vp9_priv_surface->frame_width / 16), 16);
- dys_kernel_param.input_height = ALIGN((vp9_priv_surface->frame_height / 16), 16);
- dys_kernel_param.input_surface = vp9_priv_surface->scaled_16x_surface_obj;
-
- dys_kernel_param.output_width = vp9_state->frame_width_16x;
- dys_kernel_param.output_height = vp9_state->frame_height_16x;
- dys_kernel_param.output_surface = vp9_priv_surface->dys_16x_surface_obj;
-
- gen9_vp9_dys_kernel(ctx, encode_state,
- encoder_context,
- &dys_kernel_param);
- }
- }
- }
-
- return VA_STATUS_SUCCESS;
-}
-
-static void
-gen9_vp9_set_curbe_mbenc(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct i965_gpe_context *gpe_context,
- struct intel_encoder_context *encoder_context,
- struct gen9_vp9_mbenc_curbe_param *curbe_param)
-{
- struct gen9_vp9_state *vp9_state;
- VAEncMiscParameterTypeVP9PerSegmantParam *seg_param, tmp_seg_param;
- vp9_mbenc_curbe_data *curbe_cmd;
- VAEncPictureParameterBufferVP9 *pic_param;
- int i, segment_count;
- int seg_qindex;
- struct object_surface *obj_surface;
- struct gen9_surface_vp9 *vp9_priv_surface;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param)
- return;
-
- pic_param = curbe_param->ppic_param;
- seg_param = curbe_param->psegment_param;
-
- if (!seg_param) {
- memset(&tmp_seg_param, 0, sizeof(tmp_seg_param));
- seg_param = &tmp_seg_param;
- }
-
- curbe_cmd = i965_gpe_context_map_curbe(gpe_context);
-
- if (!curbe_cmd)
- return;
-
- memset(curbe_cmd, 0, sizeof(vp9_mbenc_curbe_data));
-
- if (vp9_state->dys_in_use)
- {
- curbe_cmd->dw0.frame_width = pic_param->frame_width_dst;
- curbe_cmd->dw0.frame_height = pic_param->frame_height_dst;
- }
- else
- {
- curbe_cmd->dw0.frame_width = pic_param->frame_width_src;
- curbe_cmd->dw0.frame_height = pic_param->frame_height_src;
- }
-
- curbe_cmd->dw1.frame_type = curbe_param->picture_coding_type;
-
- curbe_cmd->dw1.segmentation_enable = pic_param->pic_flags.bits.segmentation_enabled;
- if (pic_param->pic_flags.bits.segmentation_enabled)
- segment_count = 8;
- else
- segment_count = 1;
-
- curbe_cmd->dw1.ref_frame_flags = curbe_param->ref_frame_flag;
-
- //right now set them to normal settings
- if (curbe_param->picture_coding_type)
- {
- switch (vp9_state->target_usage)
- {
- case INTEL_ENC_VP9_TU_QUALITY:
- curbe_cmd->dw1.min_16for32_check = 0x00;
- curbe_cmd->dw2.multi_pred = 0x02;
- curbe_cmd->dw2.len_sp = 0x39;
- curbe_cmd->dw2.search_x = 0x30;
- curbe_cmd->dw2.search_y = 0x28;
- curbe_cmd->dw3.min_ref_for32_check = 0x01;
- curbe_cmd->dw4.skip16_threshold = 0x000A;
- curbe_cmd->dw4.disable_mr_threshold = 0x000C;
-
- memcpy(&curbe_cmd->dw16,
- vp9_diamond_ime_search_path_delta,
- 14 * sizeof(unsigned int));
- break;
- case INTEL_ENC_VP9_TU_PERFORMANCE:
- curbe_cmd->dw1.min_16for32_check = 0x02;
- curbe_cmd->dw2.multi_pred = 0x00;
- curbe_cmd->dw2.len_sp = 0x10;
- curbe_cmd->dw2.search_x = 0x20;
- curbe_cmd->dw2.search_y = 0x20;
- curbe_cmd->dw3.min_ref_for32_check = 0x03;
- curbe_cmd->dw4.skip16_threshold = 0x0014;
- curbe_cmd->dw4.disable_mr_threshold = 0x0016;
-
- memcpy(&curbe_cmd->dw16,
- vp9_fullspiral_ime_search_path_delta,
- 14 * sizeof(unsigned int));
-
- break;
- default: // normal settings
- curbe_cmd->dw1.min_16for32_check = 0x01;
- curbe_cmd->dw2.multi_pred = 0x00;
- curbe_cmd->dw2.len_sp = 0x19;
- curbe_cmd->dw2.search_x = 0x30;
- curbe_cmd->dw2.search_y = 0x28;
- curbe_cmd->dw3.min_ref_for32_check = 0x02;
- curbe_cmd->dw4.skip16_threshold = 0x000F;
- curbe_cmd->dw4.disable_mr_threshold = 0x0011;
-
- memcpy(&curbe_cmd->dw16,
- vp9_diamond_ime_search_path_delta,
- 14 * sizeof(unsigned int));
- break;
- }
-
- curbe_cmd->dw3.hme_enabled = curbe_param->hme_enabled;
- curbe_cmd->dw3.multi_ref_qp_check = curbe_param->multi_ref_qp_check;
- // co-located predictor must be disabled when dynamic scaling is enabled
- curbe_cmd->dw3.disable_temp_pred = vp9_state->dys_in_use;
- }
-
- curbe_cmd->dw5.inter_round = 0;
- curbe_cmd->dw5.intra_round = 4;
- curbe_cmd->dw5.frame_qpindex = pic_param->luma_ac_qindex;
-
- for (i = 0; i < segment_count; i++)
- {
- seg_qindex = pic_param->luma_ac_qindex + pic_param->luma_dc_qindex_delta
- + seg_param->seg_data[i].segment_qindex_delta;
-
- seg_qindex = CLAMP(0, 255, seg_qindex);
-
- if (curbe_param->picture_coding_type)
- memcpy(&curbe_cmd->segments[i],
- &intel_vp9_costlut_p[seg_qindex * 16],
- 16 * sizeof(unsigned int));
- else
- memcpy(&curbe_cmd->segments[i],
- &intel_vp9_costlut_key[seg_qindex * 16],
- 16 * sizeof(unsigned int));
- }
-
- if (curbe_param->picture_coding_type)
- {
- if (curbe_cmd->dw3.multi_ref_qp_check)
- {
- if (curbe_param->ref_frame_flag & 0x01)
- {
- obj_surface = curbe_param->last_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
- curbe_cmd->dw8.last_ref_qp = vp9_quant_dc[vp9_priv_surface->qp_value];
- }
-
- if (curbe_param->ref_frame_flag & 0x02)
- {
- obj_surface = curbe_param->golden_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
- curbe_cmd->dw8.golden_ref_qp = vp9_quant_dc[vp9_priv_surface->qp_value];
- }
-
- if (curbe_param->ref_frame_flag & 0x04)
- {
- obj_surface = curbe_param->alt_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
- curbe_cmd->dw9.alt_ref_qp = vp9_quant_dc[vp9_priv_surface->qp_value];
- }
- }
- }
- curbe_cmd->dw160.enc_curr_y_surf_bti = VP9_BTI_MBENC_CURR_Y_G9;
- curbe_cmd->dw162.enc_curr_nv12_surf_bti = VP9_BTI_MBENC_CURR_NV12_G9;
- curbe_cmd->dw166.segmentation_map_bti = VP9_BTI_MBENC_SEGMENTATION_MAP_G9;
- curbe_cmd->dw172.mode_decision_bti = VP9_BTI_MBENC_MODE_DECISION_G9;
- curbe_cmd->dw167.tx_curbe_bti = VP9_BTI_MBENC_TX_CURBE_G9;
- curbe_cmd->dw168.hme_mvdata_bti = VP9_BTI_MBENC_HME_MV_DATA_G9;
- curbe_cmd->dw169.hme_distortion_bti = VP9_BTI_MBENC_HME_DISTORTION_G9;
- curbe_cmd->dw171.mode_decision_prev_bti = VP9_BTI_MBENC_MODE_DECISION_PREV_G9;
- curbe_cmd->dw172.mode_decision_bti = VP9_BTI_MBENC_MODE_DECISION_G9;
- curbe_cmd->dw173.output_16x16_inter_modes_bti = VP9_BTI_MBENC_OUT_16x16_INTER_MODES_G9;
- curbe_cmd->dw174.cu_record_bti = VP9_BTI_MBENC_CU_RECORDS_G9;
- curbe_cmd->dw175.pak_data_bti = VP9_BTI_MBENC_PAK_DATA_G9;
-
- i965_gpe_context_unmap_curbe(gpe_context);
- return;
-}
-
-static void
-gen9_vp9_send_mbenc_surface(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct i965_gpe_context *gpe_context,
- struct intel_encoder_context *encoder_context,
- struct gen9_vp9_mbenc_surface_param *mbenc_param)
-{
- struct gen9_vp9_state *vp9_state;
- unsigned int res_size;
- unsigned int frame_width_in_sb, frame_height_in_sb;
- struct object_surface *obj_surface, *tmp_input;
- struct gen9_surface_vp9 *vp9_priv_surface;
- int media_function;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param)
- return;
-
- frame_width_in_sb = ALIGN(mbenc_param->frame_width, 64) / 64;
- frame_height_in_sb = ALIGN(mbenc_param->frame_height, 64) / 64;
- media_function = mbenc_param->media_state_type;
-
- switch (media_function)
- {
- case VP9_MEDIA_STATE_MBENC_I_32x32:
- {
- obj_surface = mbenc_param->curr_frame_obj;
-
- gen9_add_2d_gpe_surface(ctx,
- gpe_context,
- obj_surface,
- 0,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_CURR_Y_G9);
-
- gen9_add_2d_gpe_surface(ctx,
- gpe_context,
- obj_surface,
- 1,
- 1,
- I965_SURFACEFORMAT_R16_UINT,
- VP9_BTI_MBENC_CURR_UV_G9);
-
-
- if (mbenc_param->segmentation_enabled)
- {
- gen9_add_buffer_2d_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_segmentation_map,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_SEGMENTATION_MAP_G9);
-
- }
-
- res_size = 16 * mbenc_param->frame_width_in_mb *
- mbenc_param->frame_height_in_mb * sizeof(unsigned int);
- gen9_add_buffer_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_mode_decision,
- 0,
- res_size / 4,
- 0,
- VP9_BTI_MBENC_MODE_DECISION_G9);
-
- break;
- }
- case VP9_MEDIA_STATE_MBENC_I_16x16:
- {
- obj_surface = mbenc_param->curr_frame_obj;
-
- gen9_add_2d_gpe_surface(ctx,
- gpe_context,
- obj_surface,
- 0,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_CURR_Y_G9);
-
- gen9_add_2d_gpe_surface(ctx,
- gpe_context,
- obj_surface,
- 1,
- 1,
- I965_SURFACEFORMAT_R16_UINT,
- VP9_BTI_MBENC_CURR_UV_G9);
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- obj_surface,
- VP9_BTI_MBENC_CURR_NV12_G9);
-
- if (mbenc_param->segmentation_enabled)
- {
- gen9_add_buffer_2d_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_segmentation_map,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_SEGMENTATION_MAP_G9);
-
- }
-
- res_size = 16 * mbenc_param->frame_width_in_mb *
- mbenc_param->frame_height_in_mb * sizeof(unsigned int);
- gen9_add_buffer_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_mode_decision,
- 0,
- res_size / 4,
- 0,
- VP9_BTI_MBENC_MODE_DECISION_G9);
-
- res_size = 160;
-
- gen9_add_dri_buffer_gpe_surface(ctx,
- gpe_context,
- mbenc_param->gpe_context_tx->curbe.bo,
- 0,
- ALIGN(res_size, 64),
- mbenc_param->gpe_context_tx->curbe.offset,
- VP9_BTI_MBENC_TX_CURBE_G9);
-
- break;
- }
- case VP9_MEDIA_STATE_MBENC_P:
- {
- obj_surface = mbenc_param->curr_frame_obj;
-
- gen9_add_2d_gpe_surface(ctx,
- gpe_context,
- obj_surface,
- 0,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_CURR_Y_G9);
-
- gen9_add_2d_gpe_surface(ctx, gpe_context,
- obj_surface,
- 1,
- 1,
- I965_SURFACEFORMAT_R16_UINT,
- VP9_BTI_MBENC_CURR_UV_G9);
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- obj_surface,
- VP9_BTI_MBENC_CURR_NV12_G9);
-
- if (mbenc_param->last_ref_obj)
- {
- obj_surface = mbenc_param->last_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- if (vp9_state->dys_in_use &&
- ((vp9_priv_surface->frame_width != vp9_state->frame_width) ||
- (vp9_priv_surface->frame_height != vp9_state->frame_height)))
- tmp_input = vp9_priv_surface->dys_surface_obj;
- else
- tmp_input = obj_surface;
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- tmp_input,
- VP9_BTI_MBENC_LAST_NV12_G9);
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- tmp_input,
- VP9_BTI_MBENC_LAST_NV12_G9 + 1);
-
- }
-
- if (mbenc_param->golden_ref_obj)
- {
- obj_surface = mbenc_param->golden_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- if (vp9_state->dys_in_use &&
- ((vp9_priv_surface->frame_width != vp9_state->frame_width) ||
- (vp9_priv_surface->frame_height != vp9_state->frame_height)))
- tmp_input = vp9_priv_surface->dys_surface_obj;
- else
- tmp_input = obj_surface;
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- tmp_input,
- VP9_BTI_MBENC_GOLD_NV12_G9);
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- tmp_input,
- VP9_BTI_MBENC_GOLD_NV12_G9 + 1);
-
- }
-
- if (mbenc_param->alt_ref_obj)
- {
- obj_surface = mbenc_param->alt_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- if (vp9_state->dys_in_use &&
- ((vp9_priv_surface->frame_width != vp9_state->frame_width) ||
- (vp9_priv_surface->frame_height != vp9_state->frame_height)))
- tmp_input = vp9_priv_surface->dys_surface_obj;
- else
- tmp_input = obj_surface;
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- tmp_input,
- VP9_BTI_MBENC_ALTREF_NV12_G9);
-
- gen9_add_adv_gpe_surface(ctx, gpe_context,
- tmp_input,
- VP9_BTI_MBENC_ALTREF_NV12_G9 + 1);
-
- }
-
- if (mbenc_param->hme_enabled)
- {
- gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
- mbenc_param->ps4x_memv_data_buffer,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_HME_MV_DATA_G9);
-
- gen9_add_buffer_2d_gpe_surface(ctx, gpe_context,
- mbenc_param->ps4x_memv_distortion_buffer,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_HME_DISTORTION_G9);
- }
-
- if (mbenc_param->segmentation_enabled)
- {
- gen9_add_buffer_2d_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_segmentation_map,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_SEGMENTATION_MAP_G9);
-
- }
-
- res_size = 16 * mbenc_param->frame_width_in_mb *
- mbenc_param->frame_height_in_mb * sizeof(unsigned int);
- gen9_add_buffer_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_mode_decision_prev,
- 0,
- res_size / 4,
- 0,
- VP9_BTI_MBENC_MODE_DECISION_PREV_G9);
-
- gen9_add_buffer_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_mode_decision,
- 0,
- res_size / 4,
- 0,
- VP9_BTI_MBENC_MODE_DECISION_G9);
-
- gen9_add_buffer_2d_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_output_16x16_inter_modes,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_OUT_16x16_INTER_MODES_G9);
-
- res_size = 160;
-
- gen9_add_dri_buffer_gpe_surface(ctx,
- gpe_context,
- mbenc_param->gpe_context_tx->curbe.bo,
- 0,
- ALIGN(res_size, 64),
- mbenc_param->gpe_context_tx->curbe.offset,
- VP9_BTI_MBENC_TX_CURBE_G9);
-
-
- break;
- }
- case VP9_MEDIA_STATE_MBENC_TX:
- {
- obj_surface = mbenc_param->curr_frame_obj;
-
- gen9_add_2d_gpe_surface(ctx,
- gpe_context,
- obj_surface,
- 0,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_CURR_Y_G9);
-
- gen9_add_2d_gpe_surface(ctx,
- gpe_context,
- obj_surface,
- 1,
- 1,
- I965_SURFACEFORMAT_R16_UINT,
- VP9_BTI_MBENC_CURR_UV_G9);
-
- if (mbenc_param->segmentation_enabled)
- {
- gen9_add_buffer_2d_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_segmentation_map,
- 1,
- I965_SURFACEFORMAT_R8_UNORM,
- VP9_BTI_MBENC_SEGMENTATION_MAP_G9);
-
- }
-
- res_size = 16 * mbenc_param->frame_width_in_mb *
- mbenc_param->frame_height_in_mb * sizeof(unsigned int);
- gen9_add_buffer_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_mode_decision,
- 0,
- res_size / 4,
- 0,
- VP9_BTI_MBENC_MODE_DECISION_G9);
-
- res_size = frame_width_in_sb * frame_height_in_sb * 4 * sizeof(unsigned int);
- gen9_add_buffer_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_mb_code_surface,
- 0,
- res_size / 4,
- 0,
- VP9_BTI_MBENC_PAK_DATA_G9);
-
- // CU Record
- res_size = frame_width_in_sb * frame_height_in_sb *
- 64 * 16 * sizeof(unsigned int);
-
- gen9_add_buffer_gpe_surface(ctx,
- gpe_context,
- mbenc_param->pres_mb_code_surface,
- 0,
- res_size / 4,
- mbenc_param->mb_data_offset,
- VP9_BTI_MBENC_CU_RECORDS_G9);
- }
- default:
- break;
- }
-
- return;
-}
-
-static VAStatus
-gen9_vp9_mbenc_kernel(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- int media_function)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct i965_gpe_context *gpe_context, *tx_gpe_context;
- struct gpe_media_object_walker_parameter media_object_walker_param;
- struct vp9_encoder_kernel_walker_parameter kernel_walker_param;
- unsigned int resolution_x, resolution_y;
- struct gen9_vp9_state *vp9_state;
- VAEncPictureParameterBufferVP9 *pic_param;
- struct gen9_vp9_mbenc_curbe_param curbe_param;
- struct gen9_vp9_mbenc_surface_param surface_param;
- VAStatus va_status = VA_STATUS_SUCCESS;
- int mbenc_gpe_index = 0;
- struct object_surface *obj_surface;
- struct gen9_surface_vp9 *vp9_priv_surface;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_ENCODING_ERROR;
-
- pic_param = vp9_state->pic_param;
-
- switch (media_function)
- {
- case VP9_MEDIA_STATE_MBENC_I_32x32:
- mbenc_gpe_index = VP9_MBENC_IDX_KEY_32x32;
- break;
-
- case VP9_MEDIA_STATE_MBENC_I_16x16:
- mbenc_gpe_index = VP9_MBENC_IDX_KEY_16x16;
- break;
-
- case VP9_MEDIA_STATE_MBENC_P:
- mbenc_gpe_index = VP9_MBENC_IDX_INTER;
- break;
-
- case VP9_MEDIA_STATE_MBENC_TX:
- mbenc_gpe_index = VP9_MBENC_IDX_TX;
- break;
-
- default:
- va_status = VA_STATUS_ERROR_OPERATION_FAILED;
- return va_status;
- }
-
- gpe_context = &(vme_context->mbenc_context.gpe_contexts[mbenc_gpe_index]);
- tx_gpe_context = &(vme_context->mbenc_context.gpe_contexts[VP9_MBENC_IDX_TX]);
-
- gen9_gpe_reset_binding_table(ctx, gpe_context);
-
- // Set curbe
- if (!vp9_state->mbenc_curbe_set_in_brc_update)
- {
- if(media_function == VP9_MEDIA_STATE_MBENC_I_32x32 ||
- media_function == VP9_MEDIA_STATE_MBENC_P)
- {
- memset(&curbe_param, 0, sizeof(curbe_param));
- curbe_param.ppic_param = vp9_state->pic_param;
- curbe_param.pseq_param = vp9_state->seq_param;
- curbe_param.psegment_param = vp9_state->segment_param;
- curbe_param.frame_width_in_mb = vp9_state->frame_width_in_mb;
- curbe_param.frame_height_in_mb = vp9_state->frame_height_in_mb;
- curbe_param.last_ref_obj = vp9_state->last_ref_obj;
- curbe_param.golden_ref_obj = vp9_state->golden_ref_obj;
- curbe_param.alt_ref_obj = vp9_state->alt_ref_obj;
- curbe_param.hme_enabled = vp9_state->hme_enabled;
- curbe_param.ref_frame_flag = vp9_state->ref_frame_flag;
- curbe_param.picture_coding_type = vp9_state->picture_coding_type;
- curbe_param.media_state_type = media_function;
- curbe_param.mbenc_curbe_set_in_brc_update = vp9_state->mbenc_curbe_set_in_brc_update;
-
- vme_context->pfn_set_curbe_mbenc(ctx,
- encode_state,
- gpe_context,
- encoder_context,
- &curbe_param);
- }
- }
-
- memset(&surface_param, 0, sizeof(surface_param));
- surface_param.media_state_type = media_function;
- surface_param.picture_coding_type = vp9_state->picture_coding_type;
- surface_param.frame_width = vp9_state->frame_width;
- surface_param.frame_height = vp9_state->frame_height;
- surface_param.frame_width_in_mb = vp9_state->frame_width_in_mb;
- surface_param.frame_height_in_mb = vp9_state->frame_height_in_mb;
- surface_param.hme_enabled = vp9_state->hme_enabled;
- surface_param.segmentation_enabled = pic_param->pic_flags.bits.segmentation_enabled;
- surface_param.pres_segmentation_map = &vme_context->mb_segment_map_surface;
- surface_param.ps4x_memv_data_buffer = &vme_context->s4x_memv_data_buffer;
- surface_param.ps4x_memv_distortion_buffer = &vme_context->s4x_memv_distortion_buffer;
- surface_param.pres_mode_decision =
- &vme_context->res_mode_decision[vp9_state->curr_mode_decision_index];
- surface_param.pres_mode_decision_prev =
- &vme_context->res_mode_decision[!vp9_state->curr_mode_decision_index];
- surface_param.pres_output_16x16_inter_modes = &vme_context->res_output_16x16_inter_modes;
- surface_param.pres_mbenc_curbe_buffer = NULL;
- surface_param.last_ref_obj = vp9_state->last_ref_obj;
- surface_param.golden_ref_obj = vp9_state->golden_ref_obj;
- surface_param.alt_ref_obj = vp9_state->alt_ref_obj;
- surface_param.pres_mb_code_surface = &vme_context->res_mb_code_surface;
- surface_param.gpe_context_tx = tx_gpe_context;
- surface_param.mb_data_offset = vp9_state->mb_data_offset;
-
- obj_surface = encode_state->reconstructed_object;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
- if (vp9_state->dys_in_use &&
- (pic_param->frame_width_src != pic_param->frame_height_dst ||
- pic_param->frame_height_src != pic_param->frame_height_dst)) {
- obj_surface = vp9_priv_surface->dys_surface_obj;
- } else
- obj_surface = encode_state->input_yuv_object;
-
- surface_param.curr_frame_obj = obj_surface;
-
- vme_context->pfn_send_mbenc_surface(ctx,
- encode_state,
- gpe_context,
- encoder_context,
- &surface_param);
-
- if (media_function == VP9_MEDIA_STATE_MBENC_I_32x32) {
- resolution_x = ALIGN(vp9_state->frame_width, 32) / 32;
- resolution_y = ALIGN(vp9_state->frame_height, 32) / 32;
- } else {
- resolution_x = ALIGN(vp9_state->frame_width, 16) / 16;
- resolution_y = ALIGN(vp9_state->frame_height, 16) / 16;
- }
-
- memset(&kernel_walker_param, 0, sizeof(kernel_walker_param));
- kernel_walker_param.resolution_x = resolution_x;
- kernel_walker_param.resolution_y = resolution_y;
-
- if (media_function == VP9_MEDIA_STATE_MBENC_P ||
- media_function == VP9_MEDIA_STATE_MBENC_I_16x16) {
- kernel_walker_param.use_scoreboard = 1;
- kernel_walker_param.no_dependency = 0;
- kernel_walker_param.walker_degree = VP9_45Z_DEGREE;
- } else {
- kernel_walker_param.use_scoreboard = 0;
- kernel_walker_param.no_dependency = 1;
- }
-
- gen8_gpe_setup_interface_data(ctx, gpe_context);
-
- gen9_init_media_object_walker_parameter(encoder_context, &kernel_walker_param, &media_object_walker_param);
-
- gen9_run_kernel_media_object_walker(ctx, encoder_context,
- gpe_context,
- media_function,
- &media_object_walker_param);
- return va_status;
-}
-
-static void
-gen9_init_gpe_context_vp9(VADriverContextP ctx,
- struct i965_gpe_context *gpe_context,
- struct vp9_encoder_kernel_parameter *kernel_param)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
-
- gpe_context->curbe.length = kernel_param->curbe_size; // in bytes
-
- gpe_context->sampler.entry_size = 0;
- gpe_context->sampler.max_entries = 0;
-
- if (kernel_param->sampler_size) {
- gpe_context->sampler.entry_size = ALIGN(kernel_param->sampler_size, 64);
- gpe_context->sampler.max_entries = 1;
- }
-
- gpe_context->idrt.entry_size = ALIGN(sizeof(struct gen8_interface_descriptor_data), 64); // 8 dws, 1 register
- gpe_context->idrt.max_entries = NUM_KERNELS_PER_GPE_CONTEXT;
-
- gpe_context->surface_state_binding_table.max_entries = MAX_VP9_ENCODER_SURFACES;
- gpe_context->surface_state_binding_table.binding_table_offset = 0;
- gpe_context->surface_state_binding_table.surface_state_offset = ALIGN(MAX_VP9_ENCODER_SURFACES * 4, 64);
- gpe_context->surface_state_binding_table.length = ALIGN(MAX_VP9_ENCODER_SURFACES * 4, 64) + ALIGN(MAX_VP9_ENCODER_SURFACES * SURFACE_STATE_PADDED_SIZE_GEN9, 64);
-
- if (i965->intel.eu_total > 0)
- gpe_context->vfe_state.max_num_threads = 6 * i965->intel.eu_total;
- else
- gpe_context->vfe_state.max_num_threads = 112; // 16 EU * 7 threads
-
- gpe_context->vfe_state.curbe_allocation_size = MAX(1, ALIGN(gpe_context->curbe.length, 32) >> 5); // in registers
- gpe_context->vfe_state.urb_entry_size = MAX(1, ALIGN(kernel_param->inline_data_size, 32) >> 5); // in registers
- gpe_context->vfe_state.num_urb_entries = (MAX_URB_SIZE -
- gpe_context->vfe_state.curbe_allocation_size -
- ((gpe_context->idrt.entry_size >> 5) *
- gpe_context->idrt.max_entries)) / gpe_context->vfe_state.urb_entry_size;
- gpe_context->vfe_state.num_urb_entries = CLAMP(1, 127, gpe_context->vfe_state.num_urb_entries);
- gpe_context->vfe_state.gpgpu_mode = 0;
-}
-
-static void
-gen9_init_vfe_scoreboard_vp9(struct i965_gpe_context *gpe_context,
- struct vp9_encoder_scoreboard_parameter *scoreboard_param)
-{
- gpe_context->vfe_desc5.scoreboard0.mask = scoreboard_param->mask;
- gpe_context->vfe_desc5.scoreboard0.type = scoreboard_param->type;
- gpe_context->vfe_desc5.scoreboard0.enable = scoreboard_param->enable;
-
- if (scoreboard_param->walkpat_flag) {
- gpe_context->vfe_desc5.scoreboard0.mask = 0x0F;
- gpe_context->vfe_desc5.scoreboard0.type = 1;
-
- gpe_context->vfe_desc6.scoreboard1.delta_x0 = 0x0;
- gpe_context->vfe_desc6.scoreboard1.delta_y0 = 0xF;
-
- gpe_context->vfe_desc6.scoreboard1.delta_x1 = 0x0;
- gpe_context->vfe_desc6.scoreboard1.delta_y1 = 0xE;
-
- gpe_context->vfe_desc6.scoreboard1.delta_x2 = 0xF;
- gpe_context->vfe_desc6.scoreboard1.delta_y2 = 0x3;
-
- gpe_context->vfe_desc6.scoreboard1.delta_x3 = 0xF;
- gpe_context->vfe_desc6.scoreboard1.delta_y3 = 0x1;
- } else {
- // Scoreboard 0
- gpe_context->vfe_desc6.scoreboard1.delta_x0 = 0xF;
- gpe_context->vfe_desc6.scoreboard1.delta_y0 = 0x0;
-
- // Scoreboard 1
- gpe_context->vfe_desc6.scoreboard1.delta_x1 = 0x0;
- gpe_context->vfe_desc6.scoreboard1.delta_y1 = 0xF;
-
- // Scoreboard 2
- gpe_context->vfe_desc6.scoreboard1.delta_x2 = 0x1;
- gpe_context->vfe_desc6.scoreboard1.delta_y2 = 0xF;
-
- // Scoreboard 3
- gpe_context->vfe_desc6.scoreboard1.delta_x3 = 0xF;
- gpe_context->vfe_desc6.scoreboard1.delta_y3 = 0xF;
-
- // Scoreboard 4
- gpe_context->vfe_desc7.scoreboard2.delta_x4 = 0xF;
- gpe_context->vfe_desc7.scoreboard2.delta_y4 = 0x1;
-
- // Scoreboard 5
- gpe_context->vfe_desc7.scoreboard2.delta_x5 = 0x0;
- gpe_context->vfe_desc7.scoreboard2.delta_y5 = 0xE;
-
- // Scoreboard 6
- gpe_context->vfe_desc7.scoreboard2.delta_x6 = 0x1;
- gpe_context->vfe_desc7.scoreboard2.delta_y6 = 0xE;
-
- // Scoreboard 7
- gpe_context->vfe_desc7.scoreboard2.delta_x6 = 0xF;
- gpe_context->vfe_desc7.scoreboard2.delta_y6 = 0xE;
- }
-}
-
-#define VP9_MI_BLOCK_MASK 0x07
-#define VP9_VME_REF_WIN 48
-
-static VAStatus
-gen9_encode_vp9_check_parameter(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct gen9_vp9_state *vp9_state;
- VAEncPictureParameterBufferVP9 *pic_param;
- VAEncMiscParameterTypeVP9PerSegmantParam *seg_param;
- VAEncSequenceParameterBufferVP9 *seq_param;
- struct object_surface *obj_surface;
- struct object_buffer *obj_buffer;
- struct gen9_surface_vp9 *vp9_priv_surface;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!encode_state->pic_param_ext ||
- !encode_state->pic_param_ext->buffer) {
- return VA_STATUS_ERROR_INVALID_PARAMETER;
- }
- pic_param = (VAEncPictureParameterBufferVP9 *)encode_state->pic_param_ext->buffer;
-
- if (pic_param->frame_width_src & VP9_MI_BLOCK_MASK ||
- pic_param->frame_height_src & VP9_MI_BLOCK_MASK ||
- pic_param->frame_width_dst & VP9_MI_BLOCK_MASK ||
- pic_param->frame_height_dst & VP9_MI_BLOCK_MASK)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- obj_buffer = BUFFER(pic_param->coded_buf);
-
- if (!obj_buffer ||
- !obj_buffer->buffer_store ||
- !obj_buffer->buffer_store->bo)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- encode_state->coded_buf_object = obj_buffer;
-
- vp9_state->status_buffer.bo = obj_buffer->buffer_store->bo;
-
- encode_state->reconstructed_object = SURFACE(pic_param->reconstructed_frame);
-
- if (!encode_state->reconstructed_object ||
- !encode_state->input_yuv_object)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- vp9_state->curr_frame = pic_param->reconstructed_frame;
- vp9_state->ref_frame_flag = 0;
- if (pic_param->pic_flags.bits.frame_type == KEY_FRAME ||
- pic_param->pic_flags.bits.intra_only) {
- /* this will be regarded as I-frame type */
- vp9_state->picture_coding_type = 0;
- vp9_state->last_ref_obj = NULL;
- vp9_state->golden_ref_obj = NULL;
- vp9_state->alt_ref_obj = NULL;
- } else {
- vp9_state->picture_coding_type = 1;
- vp9_state->ref_frame_flag = pic_param->ref_flags.bits.ref_frame_ctrl_l0 |
- pic_param->ref_flags.bits.ref_frame_ctrl_l1;
-
- obj_surface = SURFACE(pic_param->reference_frames[pic_param->ref_flags.bits.ref_last_idx]);
- vp9_state->last_ref_obj = obj_surface;
- if (!obj_surface ||
- !obj_surface->bo ||
- !obj_surface->private_data) {
- vp9_state->last_ref_obj = NULL;
- vp9_state->ref_frame_flag &= ~(VP9_LAST_REF);
- }
-
- obj_surface = SURFACE(pic_param->reference_frames[pic_param->ref_flags.bits.ref_gf_idx]);
- vp9_state->golden_ref_obj = obj_surface;
- if (!obj_surface ||
- !obj_surface->bo ||
- !obj_surface->private_data) {
- vp9_state->golden_ref_obj = NULL;
- vp9_state->ref_frame_flag &= ~(VP9_GOLDEN_REF);
- }
-
- obj_surface = SURFACE(pic_param->reference_frames[pic_param->ref_flags.bits.ref_arf_idx]);
- vp9_state->alt_ref_obj = obj_surface;
- if (!obj_surface ||
- !obj_surface->bo ||
- !obj_surface->private_data) {
- vp9_state->alt_ref_obj = NULL;
- vp9_state->ref_frame_flag &= ~(VP9_ALT_REF);
- }
-
- /* remove the duplicated flag and ref frame list */
- if (vp9_state->ref_frame_flag & VP9_LAST_REF) {
- if (pic_param->reference_frames[pic_param->ref_flags.bits.ref_last_idx] ==
- pic_param->reference_frames[pic_param->ref_flags.bits.ref_gf_idx]) {
- vp9_state->ref_frame_flag &= ~(VP9_GOLDEN_REF);
- vp9_state->golden_ref_obj = NULL;
- }
-
- if (pic_param->reference_frames[pic_param->ref_flags.bits.ref_last_idx] ==
- pic_param->reference_frames[pic_param->ref_flags.bits.ref_arf_idx]) {
- vp9_state->ref_frame_flag &= ~(VP9_ALT_REF);
- vp9_state->alt_ref_obj = NULL;
- }
- }
-
- if (vp9_state->ref_frame_flag & VP9_GOLDEN_REF) {
- if (pic_param->reference_frames[pic_param->ref_flags.bits.ref_gf_idx] ==
- pic_param->reference_frames[pic_param->ref_flags.bits.ref_arf_idx]) {
- vp9_state->ref_frame_flag &= ~(VP9_ALT_REF);
- vp9_state->alt_ref_obj = NULL;
- }
- }
-
- if (vp9_state->ref_frame_flag == 0)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
- }
-
- seg_param = NULL;
- if (pic_param->pic_flags.bits.segmentation_enabled) {
- if (!encode_state->q_matrix ||
- !encode_state->q_matrix->buffer) {
- return VA_STATUS_ERROR_INVALID_PARAMETER;
- }
- seg_param = (VAEncMiscParameterTypeVP9PerSegmantParam *)
- encode_state->q_matrix->buffer;
- }
-
- seq_param = NULL;
- if (encode_state->seq_param_ext &&
- encode_state->seq_param_ext->buffer)
- seq_param = (VAEncSequenceParameterBufferVP9 *)encode_state->seq_param_ext->buffer;
-
- if (!seq_param) {
- seq_param = &vp9_state->bogus_seq_param;
- }
-
- vp9_state->pic_param = pic_param;
- vp9_state->segment_param = seg_param;
- vp9_state->seq_param = seq_param;
-
- obj_surface = encode_state->reconstructed_object;
- if (pic_param->frame_width_dst > obj_surface->orig_width ||
- pic_param->frame_height_dst > obj_surface->orig_height)
- return VA_STATUS_ERROR_INVALID_SURFACE;
-
- if (!vp9_state->dys_enabled &&
- ((pic_param->frame_width_src != pic_param->frame_width_dst) ||
- (pic_param->frame_height_src != pic_param->frame_height_dst)))
- return VA_STATUS_ERROR_UNIMPLEMENTED;
-
- if (vp9_state->brc_enabled) {
- if (vp9_state->first_frame || vp9_state->picture_coding_type == KEY_FRAME) {
- vp9_state->brc_reset = encoder_context->brc.need_reset || vp9_state->first_frame;
-
- if (!encoder_context->brc.framerate[0].num || !encoder_context->brc.framerate[0].den ||
- !encoder_context->brc.bits_per_second[0])
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- vp9_state->gop_size = encoder_context->brc.gop_size;
- vp9_state->framerate = encoder_context->brc.framerate[0];
-
- if (encoder_context->rate_control_mode == VA_RC_CBR ||
- !encoder_context->brc.target_percentage[0]) {
- vp9_state->target_bit_rate = encoder_context->brc.bits_per_second[0];
- vp9_state->max_bit_rate = vp9_state->target_bit_rate;
- vp9_state->min_bit_rate = vp9_state->target_bit_rate;
- } else {
- vp9_state->max_bit_rate = encoder_context->brc.bits_per_second[0];
- vp9_state->target_bit_rate = vp9_state->max_bit_rate * encoder_context->brc.target_percentage[0] / 100;
- if (2 * vp9_state->target_bit_rate < vp9_state->max_bit_rate)
- vp9_state->min_bit_rate = 0;
- else
- vp9_state->min_bit_rate = 2 * vp9_state->target_bit_rate - vp9_state->max_bit_rate;
- }
-
- if (encoder_context->brc.hrd_buffer_size)
- vp9_state->vbv_buffer_size_in_bit = encoder_context->brc.hrd_buffer_size;
- else if (encoder_context->brc.window_size)
- vp9_state->vbv_buffer_size_in_bit = (uint64_t)vp9_state->max_bit_rate * encoder_context->brc.window_size / 1000;
- else
- vp9_state->vbv_buffer_size_in_bit = vp9_state->max_bit_rate;
- if (encoder_context->brc.hrd_initial_buffer_fullness)
- vp9_state->init_vbv_buffer_fullness_in_bit = encoder_context->brc.hrd_initial_buffer_fullness;
- else
- vp9_state->init_vbv_buffer_fullness_in_bit = vp9_state->vbv_buffer_size_in_bit / 2;
- }
- }
-
- vp9_state->frame_width = pic_param->frame_width_dst;
- vp9_state->frame_height = pic_param->frame_height_dst;
-
- vp9_state->frame_width_4x = ALIGN(vp9_state->frame_width / 4, 16);
- vp9_state->frame_height_4x = ALIGN(vp9_state->frame_height / 4, 16);
-
- vp9_state->frame_width_16x = ALIGN(vp9_state->frame_width / 16, 16);
- vp9_state->frame_height_16x = ALIGN(vp9_state->frame_height / 16, 16);
-
- vp9_state->frame_width_in_mb = ALIGN(vp9_state->frame_width, 16) / 16;
- vp9_state->frame_height_in_mb = ALIGN(vp9_state->frame_height, 16) / 16;
-
- vp9_state->downscaled_width_4x_in_mb = vp9_state->frame_width_4x / 16;
- vp9_state->downscaled_height_4x_in_mb = vp9_state->frame_height_4x / 16;
- vp9_state->downscaled_width_16x_in_mb = vp9_state->frame_width_16x / 16;
- vp9_state->downscaled_height_16x_in_mb = vp9_state->frame_height_16x / 16;
-
- vp9_state->dys_in_use = 0;
- if(pic_param->frame_width_src != pic_param->frame_width_dst ||
- pic_param->frame_height_src != pic_param->frame_height_dst)
- vp9_state->dys_in_use = 1;
- vp9_state->dys_ref_frame_flag = 0;
- /* check the dys setting. The dys is supported by default. */
- if (pic_param->pic_flags.bits.frame_type != KEY_FRAME &&
- !pic_param->pic_flags.bits.intra_only) {
- vp9_state->dys_ref_frame_flag = vp9_state->ref_frame_flag;
-
- if ((vp9_state->ref_frame_flag & VP9_LAST_REF) &&
- vp9_state->last_ref_obj) {
- obj_surface = vp9_state->last_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- if (vp9_state->frame_width == vp9_priv_surface->frame_width &&
- vp9_state->frame_height == vp9_priv_surface->frame_height)
- vp9_state->dys_ref_frame_flag &= ~(VP9_LAST_REF);
- }
- if ((vp9_state->ref_frame_flag & VP9_GOLDEN_REF) &&
- vp9_state->golden_ref_obj) {
- obj_surface = vp9_state->golden_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- if (vp9_state->frame_width == vp9_priv_surface->frame_width &&
- vp9_state->frame_height == vp9_priv_surface->frame_height)
- vp9_state->dys_ref_frame_flag &= ~(VP9_GOLDEN_REF);
- }
- if ((vp9_state->ref_frame_flag & VP9_ALT_REF) &&
- vp9_state->alt_ref_obj) {
- obj_surface = vp9_state->alt_ref_obj;
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
-
- if (vp9_state->frame_width == vp9_priv_surface->frame_width &&
- vp9_state->frame_height == vp9_priv_surface->frame_height)
- vp9_state->dys_ref_frame_flag &= ~(VP9_ALT_REF);
- }
- if (vp9_state->dys_ref_frame_flag)
- vp9_state->dys_in_use = 1;
- }
-
- if (vp9_state->hme_supported) {
- vp9_state->hme_enabled = 1;
- } else {
- vp9_state->hme_enabled = 0;
- }
-
- if (vp9_state->b16xme_supported) {
- vp9_state->b16xme_enabled = 1;
- } else {
- vp9_state->b16xme_enabled = 0;
- }
-
- /* disable HME/16xME if the size is too small */
- if (vp9_state->frame_width_4x <= VP9_VME_REF_WIN ||
- vp9_state->frame_height_4x <= VP9_VME_REF_WIN) {
- vp9_state->hme_enabled = 0;
- vp9_state->b16xme_enabled = 0;
- }
-
- if (vp9_state->frame_width_16x < VP9_VME_REF_WIN ||
- vp9_state->frame_height_16x < VP9_VME_REF_WIN)
- vp9_state->b16xme_enabled = 0;
-
- if (pic_param->pic_flags.bits.frame_type == HCP_VP9_KEY_FRAME ||
- pic_param->pic_flags.bits.intra_only) {
- vp9_state->hme_enabled = 0;
- vp9_state->b16xme_enabled = 0;
- }
-
- vp9_state->mbenc_keyframe_dist_enabled = 0;
- if ((vp9_state->picture_coding_type == KEY_FRAME) &&
- vp9_state->brc_distortion_buffer_supported)
- vp9_state->mbenc_keyframe_dist_enabled = 1;
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-gen9_vme_gpe_kernel_prepare_vp9(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct vp9_surface_param surface_param;
- struct gen9_vp9_state *vp9_state;
- VAEncPictureParameterBufferVP9 *pic_param;
- struct object_surface *obj_surface;
- struct gen9_surface_vp9 *vp9_surface;
- int driver_header_flag = 0;
- VAStatus va_status;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- pic_param = vp9_state->pic_param;
-
- /* this is to check whether the driver should generate the uncompressed header */
- driver_header_flag = 1;
- if (encode_state->packed_header_data_ext &&
- encode_state->packed_header_data_ext[0] &&
- pic_param->bit_offset_first_partition_size) {
- VAEncPackedHeaderParameterBuffer *param = NULL;
-
- param = (VAEncPackedHeaderParameterBuffer *)encode_state->packed_header_params_ext[0]->buffer;
-
- if (param->type == VAEncPackedHeaderRawData) {
- char *header_data;
- unsigned int length_in_bits;
-
- header_data = (char *)encode_state->packed_header_data_ext[0]->buffer;
- length_in_bits = param->bit_length;
- driver_header_flag = 0;
-
- vp9_state->frame_header.bit_offset_first_partition_size =
- pic_param->bit_offset_first_partition_size;
- vp9_state->header_length = ALIGN(length_in_bits, 8) >> 3;
- vp9_state->alias_insert_data = header_data;
-
- vp9_state->frame_header.bit_offset_ref_lf_delta = pic_param->bit_offset_ref_lf_delta;
- vp9_state->frame_header.bit_offset_mode_lf_delta = pic_param->bit_offset_mode_lf_delta;
- vp9_state->frame_header.bit_offset_lf_level = pic_param->bit_offset_lf_level;
- vp9_state->frame_header.bit_offset_qindex = pic_param->bit_offset_qindex;
- vp9_state->frame_header.bit_offset_segmentation = pic_param->bit_offset_segmentation;
- vp9_state->frame_header.bit_size_segmentation = pic_param->bit_size_segmentation;
- }
- }
-
- if (driver_header_flag) {
- memset(&vp9_state->frame_header, 0, sizeof(vp9_state->frame_header));
- intel_write_uncompressed_header(encode_state,
- VAProfileVP9Profile0,
- vme_context->frame_header_data,
- &vp9_state->header_length,
- &vp9_state->frame_header);
- vp9_state->alias_insert_data = vme_context->frame_header_data;
- }
-
- va_status = i965_check_alloc_surface_bo(ctx, encode_state->input_yuv_object,
- 1, VA_FOURCC_NV12, SUBSAMPLE_YUV420);
- if (va_status != VA_STATUS_SUCCESS)
- return va_status;
-
- va_status = i965_check_alloc_surface_bo(ctx, encode_state->reconstructed_object,
- 1, VA_FOURCC_NV12, SUBSAMPLE_YUV420);
-
- if (va_status != VA_STATUS_SUCCESS)
- return va_status;
-
- surface_param.frame_width = vp9_state->frame_width;
- surface_param.frame_height = vp9_state->frame_height;
- va_status = gen9_vp9_init_check_surfaces(ctx,
- encode_state->reconstructed_object,
- &surface_param);
-
- {
- vp9_surface = (struct gen9_surface_vp9*)encode_state->reconstructed_object;
-
- vp9_surface->qp_value = pic_param->luma_ac_qindex + pic_param->luma_dc_qindex_delta;
- }
- if (vp9_state->dys_in_use &&
- (pic_param->frame_width_src != pic_param->frame_width_dst ||
- pic_param->frame_height_src != pic_param->frame_height_dst)) {
- surface_param.frame_width = pic_param->frame_width_dst;
- surface_param.frame_height = pic_param->frame_height_dst;
- va_status = gen9_vp9_check_dys_surfaces(ctx,
- encode_state->reconstructed_object,
- &surface_param);
-
- if (va_status)
- return va_status;
- }
-
- if (vp9_state->dys_ref_frame_flag) {
- if ((vp9_state->dys_ref_frame_flag & VP9_LAST_REF) &&
- vp9_state->last_ref_obj) {
- obj_surface = vp9_state->last_ref_obj;
- surface_param.frame_width = vp9_state->frame_width;
- surface_param.frame_height = vp9_state->frame_height;
- va_status = gen9_vp9_check_dys_surfaces(ctx,
- obj_surface,
- &surface_param);
-
- if (va_status)
- return va_status;
- }
- if ((vp9_state->dys_ref_frame_flag & VP9_GOLDEN_REF) &&
- vp9_state->golden_ref_obj) {
- obj_surface = vp9_state->golden_ref_obj;
- surface_param.frame_width = vp9_state->frame_width;
- surface_param.frame_height = vp9_state->frame_height;
- va_status = gen9_vp9_check_dys_surfaces(ctx,
- obj_surface,
- &surface_param);
-
- if (va_status)
- return va_status;
- }
- if ((vp9_state->dys_ref_frame_flag & VP9_ALT_REF) &&
- vp9_state->alt_ref_obj) {
- obj_surface = vp9_state->alt_ref_obj;
- surface_param.frame_width = vp9_state->frame_width;
- surface_param.frame_height = vp9_state->frame_height;
- va_status = gen9_vp9_check_dys_surfaces(ctx,
- obj_surface,
- &surface_param);
-
- if (va_status)
- return va_status;
- }
- }
-
- if (va_status != VA_STATUS_SUCCESS)
- return va_status;
- /* check the corresponding ref_frame_flag && dys_ref_frame_flag */
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-gen9_vme_gpe_kernel_init_vp9(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct vp9_mbenc_context *mbenc_context = &vme_context->mbenc_context;
- struct vp9_dys_context *dys_context = &vme_context->dys_context;
- struct gpe_dynamic_state_parameter ds_param;
- int i;
-
- /*
- * BRC will update MBEnc curbe data buffer, so initialize GPE context for
- * MBEnc first
- */
- for (i = 0; i < NUM_VP9_MBENC; i++) {
- gen8_gpe_context_init(ctx, &mbenc_context->gpe_contexts[i]);
- }
-
- /*
- * VP9_MBENC_XXX uses the same dynamic state buffer as they share the same
- * curbe_buffer.
- */
- ds_param.bo_size = ALIGN(sizeof(vp9_mbenc_curbe_data), 64) + 128 +
- ALIGN(sizeof(struct gen8_interface_descriptor_data), 64) * NUM_VP9_MBENC;
- mbenc_context->mbenc_bo_dys = dri_bo_alloc(i965->intel.bufmgr,
- "mbenc_dys",
- ds_param.bo_size,
- 0x1000);
- mbenc_context->mbenc_bo_size = ds_param.bo_size;
-
- ds_param.bo = mbenc_context->mbenc_bo_dys;
- ds_param.curbe_offset = 0;
- ds_param.sampler_offset = ALIGN(sizeof(vp9_mbenc_curbe_data), 64);
- for (i = 0; i < NUM_VP9_MBENC; i++) {
- ds_param.idrt_offset = ds_param.sampler_offset + 128 +
- ALIGN(sizeof(struct gen8_interface_descriptor_data), 64) * i;
-
- gen8_gpe_context_set_dynamic_buffer(ctx,
- &mbenc_context->gpe_contexts[i],
- &ds_param);
- }
-
- gen8_gpe_context_init(ctx, &dys_context->gpe_context);
- gen9_vp9_dys_set_sampler_state(&dys_context->gpe_context);
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-gen9_vme_gpe_kernel_final_vp9(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct vp9_mbenc_context *mbenc_context = &vme_context->mbenc_context;
-
- dri_bo_unreference(mbenc_context->mbenc_bo_dys);
- mbenc_context->mbenc_bo_dys = NULL;
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-gen9_vme_gpe_kernel_run_vp9(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = encoder_context->vme_context;
- struct gen9_vp9_state *vp9_state;
- int i;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state || !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- if (vp9_state->dys_in_use) {
- gen9_vp9_run_dys_refframes(ctx, encode_state, encoder_context);
- }
-
- if (vp9_state->brc_enabled && (vp9_state->brc_reset || !vp9_state->brc_inited)) {
- gen9_vp9_brc_init_reset_kernel(ctx, encode_state, encoder_context);
- }
-
- if (vp9_state->picture_coding_type == KEY_FRAME) {
- for (i = 0; i < 2; i++)
- i965_zero_gpe_resource(&vme_context->res_mode_decision[i]);
- }
-
- if (vp9_state->hme_supported) {
- gen9_vp9_scaling_kernel(ctx, encode_state,
- encoder_context,
- 0);
- if (vp9_state->b16xme_supported) {
- gen9_vp9_scaling_kernel(ctx, encode_state,
- encoder_context,
- 1);
- }
- }
-
- if (vp9_state->picture_coding_type && vp9_state->hme_enabled) {
- if (vp9_state->b16xme_enabled)
- gen9_vp9_me_kernel(ctx, encode_state,
- encoder_context,
- 1);
-
- gen9_vp9_me_kernel(ctx, encode_state,
- encoder_context,
- 0);
- }
-
- if (vp9_state->brc_enabled) {
- if (vp9_state->mbenc_keyframe_dist_enabled)
- gen9_vp9_brc_intra_dist_kernel(ctx,
- encode_state,
- encoder_context);
-
- gen9_vp9_brc_update_kernel(ctx, encode_state,
- encoder_context);
- }
-
- if (vp9_state->picture_coding_type == KEY_FRAME) {
- gen9_vp9_mbenc_kernel(ctx, encode_state,
- encoder_context,
- VP9_MEDIA_STATE_MBENC_I_32x32);
- gen9_vp9_mbenc_kernel(ctx, encode_state,
- encoder_context,
- VP9_MEDIA_STATE_MBENC_I_16x16);
- } else {
- gen9_vp9_mbenc_kernel(ctx, encode_state,
- encoder_context,
- VP9_MEDIA_STATE_MBENC_P);
- }
-
- gen9_vp9_mbenc_kernel(ctx, encode_state,
- encoder_context,
- VP9_MEDIA_STATE_MBENC_TX);
-
- vp9_state->curr_mode_decision_index ^= 1;
- if (vp9_state->brc_enabled) {
- vp9_state->brc_inited = 1;
- vp9_state->brc_reset = 0;
- }
-
- return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-gen9_vme_pipeline_vp9(VADriverContextP ctx,
- VAProfile profile,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- VAStatus va_status;
- struct gen9_vp9_state *vp9_state;
-
- vp9_state = (struct gen9_vp9_state *) encoder_context->enc_priv_state;
-
- if (!vp9_state)
- return VA_STATUS_ERROR_INVALID_CONTEXT;
-
- va_status = gen9_encode_vp9_check_parameter(ctx, encode_state, encoder_context);
- if (va_status != VA_STATUS_SUCCESS)
- return va_status;
-
- va_status = gen9_vp9_allocate_resources(ctx, encode_state,
- encoder_context,
- !vp9_state->brc_allocated);
-
- if (va_status != VA_STATUS_SUCCESS)
- return va_status;
- vp9_state->brc_allocated = 1;
-
- va_status = gen9_vme_gpe_kernel_prepare_vp9(ctx, encode_state, encoder_context);
-
- if (va_status != VA_STATUS_SUCCESS)
- return va_status;
-
- va_status = gen9_vme_gpe_kernel_init_vp9(ctx, encode_state, encoder_context);
- if (va_status != VA_STATUS_SUCCESS)
- return va_status;
-
- va_status = gen9_vme_gpe_kernel_run_vp9(ctx, encode_state, encoder_context);
- if (va_status != VA_STATUS_SUCCESS)
- return va_status;
-
- gen9_vme_gpe_kernel_final_vp9(ctx, encode_state, encoder_context);
-
- return VA_STATUS_SUCCESS;
-}
-
-static void
-gen9_vme_brc_context_destroy_vp9(struct vp9_brc_context *brc_context)
-{
- int i;
-
- for (i = 0; i < NUM_VP9_BRC; i++)
- gen8_gpe_context_destroy(&brc_context->gpe_contexts[i]);
-}
-
-static void
-gen9_vme_scaling_context_destroy_vp9(struct vp9_scaling_context *scaling_context)
-{
- int i;
-
- for (i = 0; i < NUM_VP9_SCALING; i++)
- gen8_gpe_context_destroy(&scaling_context->gpe_contexts[i]);
-}
-
-static void
-gen9_vme_me_context_destroy_vp9(struct vp9_me_context *me_context)
-{
- gen8_gpe_context_destroy(&me_context->gpe_context);
-}
-
-static void
-gen9_vme_mbenc_context_destroy_vp9(struct vp9_mbenc_context *mbenc_context)
-{
- int i;
-
- for (i = 0; i < NUM_VP9_MBENC; i++)
- gen8_gpe_context_destroy(&mbenc_context->gpe_contexts[i]);
- dri_bo_unreference(mbenc_context->mbenc_bo_dys);
- mbenc_context->mbenc_bo_size = 0;
-}
-
-static void
-gen9_vme_dys_context_destroy_vp9(struct vp9_dys_context *dys_context)
-{
- gen8_gpe_context_destroy(&dys_context->gpe_context);
-}
-
-static void
-gen9_vme_kernel_context_destroy_vp9(struct gen9_encoder_context_vp9 *vme_context)
-{
- gen9_vp9_free_resources(vme_context);
- gen9_vme_scaling_context_destroy_vp9(&vme_context->scaling_context);
- gen9_vme_me_context_destroy_vp9(&vme_context->me_context);
- gen9_vme_mbenc_context_destroy_vp9(&vme_context->mbenc_context);
- gen9_vme_brc_context_destroy_vp9(&vme_context->brc_context);
- gen9_vme_dys_context_destroy_vp9(&vme_context->dys_context);
-
- return;
-}
-
-static void
-gen9_vme_context_destroy_vp9(void *context)
-{
- struct gen9_encoder_context_vp9 *vme_context = context;
-
- if (!vme_context)
- return;
-
- gen9_vme_kernel_context_destroy_vp9(vme_context);
-
- free(vme_context);
-
- return;
-}
-
-static void
-gen9_vme_scaling_context_init_vp9(VADriverContextP ctx,
- struct gen9_encoder_context_vp9 *vme_context,
- struct vp9_scaling_context *scaling_context)
-{
- struct i965_gpe_context *gpe_context = NULL;
- struct vp9_encoder_kernel_parameter kernel_param;
- struct vp9_encoder_scoreboard_parameter scoreboard_param;
- struct i965_kernel scale_kernel;
-
- kernel_param.curbe_size = sizeof(vp9_scaling4x_curbe_data_cm);
- kernel_param.inline_data_size = sizeof(vp9_scaling4x_inline_data_cm);
- kernel_param.sampler_size = 0;
-
- memset(&scoreboard_param, 0, sizeof(scoreboard_param));
- scoreboard_param.mask = 0xFF;
- scoreboard_param.enable = vme_context->use_hw_scoreboard;
- scoreboard_param.type = vme_context->use_hw_non_stalling_scoreboard;
- scoreboard_param.walkpat_flag = 0;
-
- gpe_context = &scaling_context->gpe_contexts[0];
- gen9_init_gpe_context_vp9(ctx, gpe_context, &kernel_param);
- gen9_init_vfe_scoreboard_vp9(gpe_context, &scoreboard_param);
-
- scaling_context->scaling_4x_bti.scaling_frame_src_y = VP9_BTI_SCALING_FRAME_SRC_Y;
- scaling_context->scaling_4x_bti.scaling_frame_dst_y = VP9_BTI_SCALING_FRAME_DST_Y;
- scaling_context->scaling_4x_bti.scaling_frame_mbv_proc_stat_dst =
- VP9_BTI_SCALING_FRAME_MBVPROCSTATS_DST_CM;
-
- memset(&scale_kernel, 0, sizeof(scale_kernel));
-
- intel_vp9_get_kernel_header_and_size((void *)media_vp9_kernels,
- sizeof(media_vp9_kernels),
- INTEL_VP9_ENC_SCALING4X,
- 0,
- &scale_kernel);
-
- gen8_gpe_load_kernels(ctx,
- gpe_context,
- &scale_kernel,
- 1);
-
- kernel_param.curbe_size = sizeof(vp9_scaling2x_curbe_data_cm);
- kernel_param.inline_data_size = 0;
- kernel_param.sampler_size = 0;
-
- gpe_context = &scaling_context->gpe_contexts[1];
- gen9_init_gpe_context_vp9(ctx, gpe_context, &kernel_param);
- gen9_init_vfe_scoreboard_vp9(gpe_context, &scoreboard_param);
-
- memset(&scale_kernel, 0, sizeof(scale_kernel));
-
- intel_vp9_get_kernel_header_and_size((void *)media_vp9_kernels,
- sizeof(media_vp9_kernels),
- INTEL_VP9_ENC_SCALING2X,
- 0,
- &scale_kernel);
-
- gen8_gpe_load_kernels(ctx,
- gpe_context,
- &scale_kernel,
- 1);
-
- scaling_context->scaling_2x_bti.scaling_frame_src_y = VP9_BTI_SCALING_FRAME_SRC_Y;
- scaling_context->scaling_2x_bti.scaling_frame_dst_y = VP9_BTI_SCALING_FRAME_DST_Y;
- return;
-}
-
-static void
-gen9_vme_me_context_init_vp9(VADriverContextP ctx,
- struct gen9_encoder_context_vp9 *vme_context,
- struct vp9_me_context *me_context)
-{
- struct i965_gpe_context *gpe_context = NULL;
- struct vp9_encoder_kernel_parameter kernel_param;
- struct vp9_encoder_scoreboard_parameter scoreboard_param;
- struct i965_kernel scale_kernel;
-
- kernel_param.curbe_size = sizeof(vp9_me_curbe_data);
- kernel_param.inline_data_size = 0;
- kernel_param.sampler_size = 0;
-
- memset(&scoreboard_param, 0, sizeof(scoreboard_param));
- scoreboard_param.mask = 0xFF;
- scoreboard_param.enable = vme_context->use_hw_scoreboard;
- scoreboard_param.type = vme_context->use_hw_non_stalling_scoreboard;
- scoreboard_param.walkpat_flag = 0;
-
- gpe_context = &me_context->gpe_context;
- gen9_init_gpe_context_vp9(ctx, gpe_context, &kernel_param);
- gen9_init_vfe_scoreboard_vp9(gpe_context, &scoreboard_param);
-
- memset(&scale_kernel, 0, sizeof(scale_kernel));
-
- intel_vp9_get_kernel_header_and_size((void *)media_vp9_kernels,
- sizeof(media_vp9_kernels),
- INTEL_VP9_ENC_ME,
- 0,
- &scale_kernel);
-
- gen8_gpe_load_kernels(ctx,
- gpe_context,
- &scale_kernel,
- 1);
-
- return;
-}
-
-static void
-gen9_vme_mbenc_context_init_vp9(VADriverContextP ctx,
- struct gen9_encoder_context_vp9 *vme_context,
- struct vp9_mbenc_context *mbenc_context)
-{
- struct i965_gpe_context *gpe_context = NULL;
- struct vp9_encoder_kernel_parameter kernel_param;
- struct vp9_encoder_scoreboard_parameter scoreboard_param;
- int i;
- struct i965_kernel scale_kernel;
-
- kernel_param.curbe_size = sizeof(vp9_mbenc_curbe_data);
- kernel_param.inline_data_size = 0;
- kernel_param.sampler_size = 0;
-
- memset(&scoreboard_param, 0, sizeof(scoreboard_param));
- scoreboard_param.mask = 0xFF;
- scoreboard_param.enable = vme_context->use_hw_scoreboard;
- scoreboard_param.type = vme_context->use_hw_non_stalling_scoreboard;
-
- for (i = 0; i < NUM_VP9_MBENC; i++) {
- gpe_context = &mbenc_context->gpe_contexts[i];
-
- if ((i == VP9_MBENC_IDX_KEY_16x16) ||
- (i == VP9_MBENC_IDX_INTER)) {
- scoreboard_param.walkpat_flag = 1;
- } else
- scoreboard_param.walkpat_flag = 0;
-
- gen9_init_gpe_context_vp9(ctx, gpe_context, &kernel_param);
- gen9_init_vfe_scoreboard_vp9(gpe_context, &scoreboard_param);
-
- memset(&scale_kernel, 0, sizeof(scale_kernel));
-
- intel_vp9_get_kernel_header_and_size((void *)media_vp9_kernels,
- sizeof(media_vp9_kernels),
- INTEL_VP9_ENC_MBENC,
- i,
- &scale_kernel);
-
- gen8_gpe_load_kernels(ctx,
- gpe_context,
- &scale_kernel,
- 1);
- }
-}
-
-static void
-gen9_vme_brc_context_init_vp9(VADriverContextP ctx,
- struct gen9_encoder_context_vp9 *vme_context,
- struct vp9_brc_context *brc_context)
-{
- struct i965_gpe_context *gpe_context = NULL;
- struct vp9_encoder_kernel_parameter kernel_param;
- struct vp9_encoder_scoreboard_parameter scoreboard_param;
- int i;
- struct i965_kernel scale_kernel;
-
- kernel_param.curbe_size = sizeof(vp9_brc_curbe_data);
- kernel_param.inline_data_size = 0;
- kernel_param.sampler_size = 0;
-
- memset(&scoreboard_param, 0, sizeof(scoreboard_param));
- scoreboard_param.mask = 0xFF;
- scoreboard_param.enable = vme_context->use_hw_scoreboard;
- scoreboard_param.type = vme_context->use_hw_non_stalling_scoreboard;
-
- for (i = 0; i < NUM_VP9_BRC; i++) {
- gpe_context = &brc_context->gpe_contexts[i];
- gen9_init_gpe_context_vp9(ctx, gpe_context, &kernel_param);
- gen9_init_vfe_scoreboard_vp9(gpe_context, &scoreboard_param);
-
- memset(&scale_kernel, 0, sizeof(scale_kernel));
-
- intel_vp9_get_kernel_header_and_size((void *)media_vp9_kernels,
- sizeof(media_vp9_kernels),
- INTEL_VP9_ENC_BRC,
- i,
- &scale_kernel);
-
- gen8_gpe_load_kernels(ctx,
- gpe_context,
- &scale_kernel,
- 1);
- }
-}
-
-static void
-gen9_vme_dys_context_init_vp9(VADriverContextP ctx,
- struct gen9_encoder_context_vp9 *vme_context,
- struct vp9_dys_context *dys_context)
-{
- struct i965_gpe_context *gpe_context = NULL;
- struct vp9_encoder_kernel_parameter kernel_param;
- struct vp9_encoder_scoreboard_parameter scoreboard_param;
- struct i965_kernel scale_kernel;
-
- kernel_param.curbe_size = sizeof(vp9_dys_curbe_data);
- kernel_param.inline_data_size = 0;
- kernel_param.sampler_size = sizeof(struct gen9_sampler_8x8_avs);
-
- memset(&scoreboard_param, 0, sizeof(scoreboard_param));
- scoreboard_param.mask = 0xFF;
- scoreboard_param.enable = vme_context->use_hw_scoreboard;
- scoreboard_param.type = vme_context->use_hw_non_stalling_scoreboard;
- scoreboard_param.walkpat_flag = 0;
-
- gpe_context = &dys_context->gpe_context;
- gen9_init_gpe_context_vp9(ctx, gpe_context, &kernel_param);
- gen9_init_vfe_scoreboard_vp9(gpe_context, &scoreboard_param);
-
- memset(&scale_kernel, 0, sizeof(scale_kernel));
-
- intel_vp9_get_kernel_header_and_size((void *)media_vp9_kernels,
- sizeof(media_vp9_kernels),
- INTEL_VP9_ENC_DYS,
- 0,
- &scale_kernel);
-
- gen8_gpe_load_kernels(ctx,
- gpe_context,
- &scale_kernel,
- 1);
-
- return;
-}
-
-static Bool
-gen9_vme_kernels_context_init_vp9(VADriverContextP ctx,
- struct intel_encoder_context *encoder_context,
- struct gen9_encoder_context_vp9 *vme_context)
-{
- gen9_vme_scaling_context_init_vp9(ctx, vme_context, &vme_context->scaling_context);
- gen9_vme_me_context_init_vp9(ctx, vme_context, &vme_context->me_context);
- gen9_vme_mbenc_context_init_vp9(ctx, vme_context, &vme_context->mbenc_context);
- gen9_vme_dys_context_init_vp9(ctx, vme_context, &vme_context->dys_context);
- gen9_vme_brc_context_init_vp9(ctx, vme_context, &vme_context->brc_context);
-
- vme_context->pfn_set_curbe_brc = gen9_vp9_set_curbe_brc;
- vme_context->pfn_set_curbe_me = gen9_vp9_set_curbe_me;
- vme_context->pfn_send_me_surface = gen9_vp9_send_me_surface;
- vme_context->pfn_send_scaling_surface = gen9_vp9_send_scaling_surface;
-
- vme_context->pfn_set_curbe_scaling = gen9_vp9_set_curbe_scaling_cm;
-
- vme_context->pfn_send_dys_surface = gen9_vp9_send_dys_surface;
- vme_context->pfn_set_curbe_dys = gen9_vp9_set_curbe_dys;
- vme_context->pfn_set_curbe_mbenc = gen9_vp9_set_curbe_mbenc;
- vme_context->pfn_send_mbenc_surface = gen9_vp9_send_mbenc_surface;
- return true;
-}
-
-static
-void gen9_vp9_write_compressed_element(char *buffer,
- int index,
- int prob,
- bool value)
-{
- struct vp9_compressed_element *base_element, *vp9_element;
- base_element = (struct vp9_compressed_element *)buffer;
-
- vp9_element = base_element + (index >> 1);
- if (index % 2) {
- vp9_element->b_valid = 1;
- vp9_element->b_probdiff_select = 1;
- vp9_element->b_prob_select = (prob == 252) ? 1: 0;
- vp9_element->b_bin = value;
- } else {
- vp9_element->a_valid = 1;
- vp9_element->a_probdiff_select = 1;
- vp9_element->a_prob_select = (prob == 252) ? 1: 0;
- vp9_element->a_bin = value;
- }
-}
-
-static void
-intel_vp9enc_refresh_frame_internal_buffers(VADriverContextP ctx,
- struct intel_encoder_context *encoder_context)
-{
- struct gen9_encoder_context_vp9 *pak_context = encoder_context->mfc_context;
- VAEncPictureParameterBufferVP9 *pic_param;
- struct gen9_vp9_state *vp9_state;
- char *buffer;
- int i;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
-
- if (!pak_context || !vp9_state || !vp9_state->pic_param)
- return;
-
- pic_param = vp9_state->pic_param;
- if ((pic_param->pic_flags.bits.frame_type == HCP_VP9_KEY_FRAME) ||
- (pic_param->pic_flags.bits.intra_only) ||
- pic_param->pic_flags.bits.error_resilient_mode) {
- /* reset current frame_context */
- intel_init_default_vp9_probs(&vp9_state->vp9_current_fc);
- if ((pic_param->pic_flags.bits.frame_type == HCP_VP9_KEY_FRAME) ||
- pic_param->pic_flags.bits.error_resilient_mode ||
- (pic_param->pic_flags.bits.reset_frame_context == 3)) {
- for (i = 0; i < 4; i++)
- memcpy(&vp9_state->vp9_frame_ctx[i],
- &vp9_state->vp9_current_fc,
- sizeof(FRAME_CONTEXT));
- } else if (pic_param->pic_flags.bits.reset_frame_context == 2) {
- i = pic_param->pic_flags.bits.frame_context_idx;
- memcpy(&vp9_state->vp9_frame_ctx[i],
- &vp9_state->vp9_current_fc, sizeof(FRAME_CONTEXT));
- }
- /* reset the frame_ctx_idx = 0 */
- vp9_state->frame_ctx_idx = 0;
- } else {
- vp9_state->frame_ctx_idx = pic_param->pic_flags.bits.frame_context_idx;
- }
-
- i965_zero_gpe_resource(&pak_context->res_compressed_input_buffer);
- buffer = i965_map_gpe_resource(&pak_context->res_compressed_input_buffer);
-
- if (!buffer)
- return;
-
- /* write tx_size */
- if ((pic_param->luma_ac_qindex == 0) &&
- (pic_param->luma_dc_qindex_delta == 0) &&
- (pic_param->chroma_ac_qindex_delta == 0) &&
- (pic_param->chroma_dc_qindex_delta == 0)) {
- /* lossless flag */
- /* nothing is needed */
- gen9_vp9_write_compressed_element(buffer,
- 0, 128, 0);
- gen9_vp9_write_compressed_element(buffer,
- 1, 128, 0);
- gen9_vp9_write_compressed_element(buffer,
- 2, 128, 0);
- } else {
- if (vp9_state->tx_mode == TX_MODE_SELECT) {
- gen9_vp9_write_compressed_element(buffer,
- 0, 128, 1);
- gen9_vp9_write_compressed_element(buffer,
- 1, 128, 1);
- gen9_vp9_write_compressed_element(buffer,
- 2, 128, 1);
- } else if (vp9_state->tx_mode == ALLOW_32X32) {
- gen9_vp9_write_compressed_element(buffer,
- 0, 128, 1);
- gen9_vp9_write_compressed_element(buffer,
- 1, 128, 1);
- gen9_vp9_write_compressed_element(buffer,
- 2, 128, 0);
- } else {
- unsigned int tx_mode;
-
- tx_mode = vp9_state->tx_mode;
- gen9_vp9_write_compressed_element(buffer,
- 0, 128, ((tx_mode) & 2));
- gen9_vp9_write_compressed_element(buffer,
- 1, 128, ((tx_mode) & 1));
- gen9_vp9_write_compressed_element(buffer,
- 2, 128, 0);
- }
-
- if (vp9_state->tx_mode == TX_MODE_SELECT) {
-
- gen9_vp9_write_compressed_element(buffer,
- 3, 128, 0);
-
- gen9_vp9_write_compressed_element(buffer,
- 7, 128, 0);
-
- gen9_vp9_write_compressed_element(buffer,
- 15, 128, 0);
- }
- }
- /*Setup all the input&output object*/
-
- {
- /* update the coeff_update flag */
- gen9_vp9_write_compressed_element(buffer,
- 27, 128, 0);
- gen9_vp9_write_compressed_element(buffer,
- 820, 128, 0);
- gen9_vp9_write_compressed_element(buffer,
- 1613, 128, 0);
- gen9_vp9_write_compressed_element(buffer,
- 2406, 128, 0);
- }
-
-
- if (pic_param->pic_flags.bits.frame_type && !pic_param->pic_flags.bits.intra_only)
- {
- bool allow_comp = !(
- (pic_param->ref_flags.bits.ref_last_sign_bias && pic_param->ref_flags.bits.ref_gf_sign_bias && pic_param->ref_flags.bits.ref_arf_sign_bias) ||
- (!pic_param->ref_flags.bits.ref_last_sign_bias && !pic_param->ref_flags.bits.ref_gf_sign_bias && !pic_param->ref_flags.bits.ref_arf_sign_bias)
- );
-
- if (allow_comp)
- {
- if (pic_param->pic_flags.bits.comp_prediction_mode == REFERENCE_MODE_SELECT) {
- gen9_vp9_write_compressed_element(buffer,
- 3271, 128, 1);
- gen9_vp9_write_compressed_element(buffer,
- 3272, 128, 1);
- }
- else if (pic_param->pic_flags.bits.comp_prediction_mode == COMPOUND_REFERENCE) {
- gen9_vp9_write_compressed_element(buffer,
- 3271, 128, 1);
- gen9_vp9_write_compressed_element(buffer,
- 3272, 128, 0);
- }
- else {
-
- gen9_vp9_write_compressed_element(buffer,
- 3271, 128, 0);
- gen9_vp9_write_compressed_element(buffer,
- 3272, 128, 0);
- }
- }
- }
-
- i965_unmap_gpe_resource(&pak_context->res_compressed_input_buffer);
-}
-
-
-static void
-gen9_pak_vp9_pipe_mode_select(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- struct gen9_hcpe_pipe_mode_select_param *pipe_mode_param)
-{
- struct intel_batchbuffer *batch = encoder_context->base.batch;
-
- BEGIN_BCS_BATCH(batch, 6);
-
- OUT_BCS_BATCH(batch, HCP_PIPE_MODE_SELECT | (6 - 2));
- OUT_BCS_BATCH(batch,
- (pipe_mode_param->stream_out << 12) |
- (pipe_mode_param->codec_mode << 5) |
- (0 << 3) | /* disable Pic Status / Error Report */
- (pipe_mode_param->stream_out << 2) |
- HCP_CODEC_SELECT_ENCODE);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, (1 << 6));
- OUT_BCS_BATCH(batch, 0);
-
- ADVANCE_BCS_BATCH(batch);
-}
-
-static void
-gen9_vp9_add_surface_state(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- hcp_surface_state *hcp_state)
-{
- struct intel_batchbuffer *batch = encoder_context->base.batch;
- if (!hcp_state)
- return;
-
- BEGIN_BCS_BATCH(batch, 3);
- OUT_BCS_BATCH(batch, HCP_SURFACE_STATE | (3 - 2));
- OUT_BCS_BATCH(batch,
- (hcp_state->dw1.surface_id << 28) |
- (hcp_state->dw1.surface_pitch - 1)
- );
- OUT_BCS_BATCH(batch,
- (hcp_state->dw2.surface_format << 28) |
- (hcp_state->dw2.y_cb_offset)
- );
- ADVANCE_BCS_BATCH(batch);
-}
-
-static void
-gen9_pak_vp9_pipe_buf_addr_state(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct intel_batchbuffer *batch = encoder_context->base.batch;
- struct gen9_encoder_context_vp9 *pak_context = encoder_context->mfc_context;
- struct gen9_vp9_state *vp9_state;
- unsigned int i;
- struct object_surface *obj_surface;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
-
- if (!vp9_state || !vp9_state->pic_param)
- return;
-
-
- BEGIN_BCS_BATCH(batch, 104);
-
- OUT_BCS_BATCH(batch, HCP_PIPE_BUF_ADDR_STATE | (104 - 2));
-
- obj_surface = encode_state->reconstructed_object;
-
- /* reconstructed obj_surface is already checked. So this is skipped */
- /* DW 1..3 decoded surface */
- OUT_RELOC64(batch,
- obj_surface->bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 4..6 deblocking line */
- OUT_RELOC64(batch,
- pak_context->res_deblocking_filter_line_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 7..9 deblocking tile line */
- OUT_RELOC64(batch,
- pak_context->res_deblocking_filter_tile_line_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 10..12 deblocking tile col */
- OUT_RELOC64(batch,
- pak_context->res_deblocking_filter_tile_col_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 13..15 metadata line */
- OUT_RELOC64(batch,
- pak_context->res_metadata_line_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 16..18 metadata tile line */
- OUT_RELOC64(batch,
- pak_context->res_metadata_tile_line_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 19..21 metadata tile col */
- OUT_RELOC64(batch,
- pak_context->res_metadata_tile_col_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 22..30 SAO is not used for VP9 */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- /* DW 31..33 Current Motion vector temporal buffer */
- OUT_RELOC64(batch,
- pak_context->res_mv_temporal_buffer[vp9_state->curr_mv_temporal_index].bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 34..36 Not used */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- /* Only the first three reference_frame is used for VP9 */
- /* DW 37..52 for reference_frame */
- i = 0;
- if (vp9_state->picture_coding_type) {
- for (i = 0; i < 3; i++) {
-
- if (pak_context->reference_surfaces[i].bo) {
- OUT_RELOC64(batch,
- pak_context->reference_surfaces[i].bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0,
- 0);
- } else {
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- }
- }
- }
-
- for (; i < 8; i++) {
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- }
-
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 54..56 for source input */
- OUT_RELOC64(batch,
- pak_context->uncompressed_picture_source.bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 57..59 StreamOut is not used */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- /* DW 60..62. Not used for encoder */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- /* DW 63..65. ILDB Not used for encoder */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- /* DW 66..81 For the collocated motion vector temporal buffer */
- if (vp9_state->picture_coding_type) {
- int prev_index = vp9_state->curr_mv_temporal_index ^ 0x01;
- OUT_RELOC64(batch,
- pak_context->res_mv_temporal_buffer[prev_index].bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0,
- 0);
- } else {
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- }
-
- for (i = 1; i < 8; i++) {
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- }
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 83..85 VP9 prob buffer */
- OUT_RELOC64(batch,
- pak_context->res_prob_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
-
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 86..88 Segment id buffer */
- if (pak_context->res_segmentid_buffer.bo) {
- OUT_RELOC64(batch,
- pak_context->res_segmentid_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- } else {
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- }
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 89..91 HVD line rowstore buffer */
- OUT_RELOC64(batch,
- pak_context->res_hvd_line_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 92..94 HVD tile line rowstore buffer */
- OUT_RELOC64(batch,
- pak_context->res_hvd_tile_line_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 95..97 SAO streamout. Not used for VP9 */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- /* reserved for KBL. 98..100 */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- /* 101..103 */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- ADVANCE_BCS_BATCH(batch);
-}
-
-static void
-gen9_pak_vp9_ind_obj_base_addr_state(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct intel_batchbuffer *batch = encoder_context->base.batch;
- struct gen9_encoder_context_vp9 *pak_context = encoder_context->mfc_context;
- struct gen9_vp9_state *vp9_state;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
-
- /* to do */
- BEGIN_BCS_BATCH(batch, 29);
-
- OUT_BCS_BATCH(batch, HCP_IND_OBJ_BASE_ADDR_STATE | (29 - 2));
-
- /* indirect bitstream object base */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- /* the upper bound of indirect bitstream object */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- /* DW 6: Indirect CU object base address */
- OUT_RELOC64(batch,
- pak_context->res_mb_code_surface.bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0, /* No write domain */
- vp9_state->mb_data_offset);
- /* default attribute */
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 9..11, PAK-BSE */
- OUT_RELOC64(batch,
- pak_context->indirect_pak_bse_object.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- pak_context->indirect_pak_bse_object.offset);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 12..13 upper bound */
- OUT_RELOC64(batch,
- pak_context->indirect_pak_bse_object.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- pak_context->indirect_pak_bse_object.end_offset);
-
- /* DW 14..16 compressed header buffer */
- OUT_RELOC64(batch,
- pak_context->res_compressed_input_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 17..19 prob counter streamout */
- OUT_RELOC64(batch,
- pak_context->res_prob_counter_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 20..22 prob delta streamin */
- OUT_RELOC64(batch,
- pak_context->res_prob_delta_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 23..25 Tile record streamout */
- OUT_RELOC64(batch,
- pak_context->res_tile_record_streamout_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- /* DW 26..28 CU record streamout */
- OUT_RELOC64(batch,
- pak_context->res_cu_stat_streamout_buffer.bo,
- I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
- 0);
- OUT_BCS_BATCH(batch, i965->intel.mocs_state);
-
- ADVANCE_BCS_BATCH(batch);
-}
-
-static void
-gen9_pak_vp9_segment_state(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context,
- VAEncSegParamVP9 *seg_param, uint8_t seg_id)
-{
- struct intel_batchbuffer *batch = encoder_context->base.batch;
- uint32_t batch_value, tmp;
- VAEncPictureParameterBufferVP9 *pic_param;
-
- if (!encode_state->pic_param_ext ||
- !encode_state->pic_param_ext->buffer) {
- return;
- }
-
- pic_param = (VAEncPictureParameterBufferVP9 *)encode_state->pic_param_ext->buffer;
-
- batch_value = seg_param->seg_flags.bits.segment_reference;
- if (pic_param->pic_flags.bits.frame_type == HCP_VP9_KEY_FRAME ||
- pic_param->pic_flags.bits.intra_only)
- batch_value = 0;
-
- BEGIN_BCS_BATCH(batch, 8);
-
- OUT_BCS_BATCH(batch, HCP_VP9_SEGMENT_STATE | (8 - 2));
- OUT_BCS_BATCH(batch, seg_id << 0); /* DW 1 - SegmentID */
- OUT_BCS_BATCH(batch,
- (seg_param->seg_flags.bits.segment_reference_enabled << 3) |
- (batch_value << 1) |
- (seg_param->seg_flags.bits.segment_reference_skipped <<0)
- );
-
- /* DW 3..6 is not used for encoder */
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
- OUT_BCS_BATCH(batch, 0);
-
- /* DW 7 Mode */
- tmp = intel_convert_sign_mag(seg_param->segment_qindex_delta, 9);
- batch_value = tmp;
- tmp = intel_convert_sign_mag(seg_param->segment_lf_level_delta, 7);
- batch_value |= (tmp << 16);
- OUT_BCS_BATCH(batch, batch_value);
-
- ADVANCE_BCS_BATCH(batch);
-
-}
-
-static void
-intel_vp9enc_construct_pak_insertobj_batchbuffer(VADriverContextP ctx,
- struct intel_encoder_context *encoder_context,
- struct i965_gpe_resource *obj_batch_buffer)
-{
- struct gen9_encoder_context_vp9 *pak_context = encoder_context->mfc_context;
- struct gen9_vp9_state *vp9_state;
- int uncompressed_header_length;
- unsigned int *cmd_ptr;
- unsigned int dw_length, bits_in_last_dw;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
-
- if (!pak_context || !vp9_state || !vp9_state->pic_param)
- return;
-
- uncompressed_header_length = vp9_state->header_length;
- cmd_ptr = i965_map_gpe_resource(obj_batch_buffer);
-
- if (!cmd_ptr)
- return;
-
- bits_in_last_dw = uncompressed_header_length % 4;
- bits_in_last_dw *= 8;
-
- if (bits_in_last_dw == 0)
- bits_in_last_dw = 32;
-
- /* get the DWORD length of the inserted_data */
- dw_length = ALIGN(uncompressed_header_length, 4) / 4;
- *cmd_ptr++ = HCP_INSERT_PAK_OBJECT | dw_length;
-
- *cmd_ptr++ = ((0 << 31) | /* indirect payload */
- (0 << 16) | /* the start offset in first DW */
- (0 << 15) |
- (bits_in_last_dw << 8) | /* bits_in_last_dw */
- (0 << 4) | /* skip emulation byte count. 0 for VP9 */
- (0 << 3) | /* emulation flag. 0 for VP9 */
- (1 << 2) | /* last header flag. */
- (0 << 1));
- memcpy(cmd_ptr, vp9_state->alias_insert_data, dw_length * sizeof(unsigned int));
-
- cmd_ptr += dw_length;
-
- *cmd_ptr++ = MI_NOOP;
- *cmd_ptr++ = MI_BATCH_BUFFER_END;
- i965_unmap_gpe_resource(obj_batch_buffer);
-}
-
-static void
-gen9_vp9_pak_picture_level(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct intel_batchbuffer *batch = encoder_context->base.batch;
- struct gen9_encoder_context_vp9 *pak_context = encoder_context->mfc_context;
- struct object_surface *obj_surface;
- VAEncPictureParameterBufferVP9 *pic_param;
- VAEncMiscParameterTypeVP9PerSegmantParam *seg_param, tmp_seg_param;
- struct gen9_vp9_state *vp9_state;
- struct gen9_surface_vp9 *vp9_priv_surface;
- int i;
- struct gen9_hcpe_pipe_mode_select_param mode_param;
- hcp_surface_state hcp_surface;
- struct gpe_mi_batch_buffer_start_parameter second_level_batch;
- int segment_count;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
-
- if (!pak_context || !vp9_state || !vp9_state->pic_param)
- return;
-
- pic_param = vp9_state->pic_param;
- seg_param = vp9_state->segment_param;
-
- if (vp9_state->curr_pak_pass == 0)
- {
- intel_vp9enc_construct_pak_insertobj_batchbuffer(ctx, encoder_context,
- &pak_context->res_pak_uncompressed_input_buffer);
-
- // Check if driver already programmed pic state as part of BRC update kernel programming.
- if (!vp9_state->brc_enabled)
- {
- intel_vp9enc_construct_picstate_batchbuf(ctx, encode_state,
- encoder_context, &pak_context->res_pic_state_brc_write_hfw_read_buffer);
- }
- }
-
- if (vp9_state->curr_pak_pass == 0)
- {
- intel_vp9enc_refresh_frame_internal_buffers(ctx, encoder_context);
- }
-
- {
- /* copy the frame_context[frame_idx] into curr_frame_context */
- memcpy(&vp9_state->vp9_current_fc,
- &(vp9_state->vp9_frame_ctx[vp9_state->frame_ctx_idx]),
- sizeof(FRAME_CONTEXT));
- {
- uint8_t *prob_ptr;
-
- prob_ptr = i965_map_gpe_resource(&pak_context->res_prob_buffer);
-
- if (!prob_ptr)
- return;
-
- /* copy the current fc to vp9_prob buffer */
- memcpy(prob_ptr, &vp9_state->vp9_current_fc, sizeof(FRAME_CONTEXT));
- if ((pic_param->pic_flags.bits.frame_type == HCP_VP9_KEY_FRAME) ||
- pic_param->pic_flags.bits.intra_only) {
- FRAME_CONTEXT *frame_ptr = (FRAME_CONTEXT *)prob_ptr;
-
- memcpy(frame_ptr->partition_prob, vp9_kf_partition_probs,
- sizeof(vp9_kf_partition_probs));
- memcpy(frame_ptr->uv_mode_prob, vp9_kf_uv_mode_prob,
- sizeof(vp9_kf_uv_mode_prob));
- }
- i965_unmap_gpe_resource(&pak_context->res_prob_buffer);
- }
- }
-
- if (vp9_state->brc_enabled && vp9_state->curr_pak_pass) {
- /* read image status and insert the conditional end cmd */
- /* image ctrl/status is already accessed */
- struct gpe_mi_conditional_batch_buffer_end_parameter mi_cond_end;
- struct vp9_encode_status_buffer_internal *status_buffer;
-
- status_buffer = &vp9_state->status_buffer;
- memset(&mi_cond_end, 0, sizeof(mi_cond_end));
- mi_cond_end.offset = status_buffer->image_status_mask_offset;
- mi_cond_end.bo = status_buffer->bo;
- mi_cond_end.compare_data = 0;
- mi_cond_end.compare_mask_mode_disabled = 1;
- gen9_gpe_mi_conditional_batch_buffer_end(ctx, batch,
- &mi_cond_end);
- }
-
- mode_param.codec_mode = 1;
- mode_param.stream_out = 0;
- gen9_pak_vp9_pipe_mode_select(ctx, encode_state, encoder_context, &mode_param);
-
- /* reconstructed surface */
- memset(&hcp_surface, 0, sizeof(hcp_surface));
- obj_surface = encode_state->reconstructed_object;
- hcp_surface.dw1.surface_id = 0;
- hcp_surface.dw1.surface_pitch = obj_surface->width;
- hcp_surface.dw2.surface_format = SURFACE_FORMAT_PLANAR_420_8;
- hcp_surface.dw2.y_cb_offset = obj_surface->y_cb_offset;
- gen9_vp9_add_surface_state(ctx, encode_state, encoder_context,
- &hcp_surface);
-
- /* Input surface */
- if (vp9_state->dys_in_use &&
- ((pic_param->frame_width_src != pic_param->frame_width_dst) ||
- (pic_param->frame_height_src != pic_param->frame_height_dst))) {
- vp9_priv_surface = (struct gen9_surface_vp9 *)(obj_surface->private_data);
- obj_surface = vp9_priv_surface->dys_surface_obj;
- } else {
- obj_surface = encode_state->input_yuv_object;
- }
-
- hcp_surface.dw1.surface_id = 1;
- hcp_surface.dw1.surface_pitch = obj_surface->width;
- hcp_surface.dw2.surface_format = SURFACE_FORMAT_PLANAR_420_8;
- hcp_surface.dw2.y_cb_offset = obj_surface->y_cb_offset;
- gen9_vp9_add_surface_state(ctx, encode_state, encoder_context,
- &hcp_surface);
-
- if (vp9_state->picture_coding_type) {
- /* Add surface for last */
- if (vp9_state->last_ref_obj) {
- obj_surface = vp9_state->last_ref_obj;
- hcp_surface.dw1.surface_id = 2;
- hcp_surface.dw1.surface_pitch = obj_surface->width;
- hcp_surface.dw2.surface_format = SURFACE_FORMAT_PLANAR_420_8;
- hcp_surface.dw2.y_cb_offset = obj_surface->y_cb_offset;
- gen9_vp9_add_surface_state(ctx, encode_state, encoder_context,
- &hcp_surface);
- }
- if (vp9_state->golden_ref_obj) {
- obj_surface = vp9_state->golden_ref_obj;
- hcp_surface.dw1.surface_id = 3;
- hcp_surface.dw1.surface_pitch = obj_surface->width;
- hcp_surface.dw2.surface_format = SURFACE_FORMAT_PLANAR_420_8;
- hcp_surface.dw2.y_cb_offset = obj_surface->y_cb_offset;
- gen9_vp9_add_surface_state(ctx, encode_state, encoder_context,
- &hcp_surface);
- }
- if (vp9_state->alt_ref_obj) {
- obj_surface = vp9_state->alt_ref_obj;
- hcp_surface.dw1.surface_id = 4;
- hcp_surface.dw1.surface_pitch = obj_surface->width;
- hcp_surface.dw2.surface_format = SURFACE_FORMAT_PLANAR_420_8;
- hcp_surface.dw2.y_cb_offset = obj_surface->y_cb_offset;
- gen9_vp9_add_surface_state(ctx, encode_state, encoder_context,
- &hcp_surface);
- }
- }
-
- gen9_pak_vp9_pipe_buf_addr_state(ctx, encode_state, encoder_context);
-
- gen9_pak_vp9_ind_obj_base_addr_state(ctx, encode_state, encoder_context);
-
- // Using picstate zero with updated QP and LF deltas by HuC for repak, irrespective of how many Pak passes were run in multi-pass mode.
- memset(&second_level_batch, 0, sizeof(second_level_batch));
-
- if (vp9_state->curr_pak_pass == 0) {
- second_level_batch.offset = 0;
- } else
- second_level_batch.offset = vp9_state->curr_pak_pass * VP9_PIC_STATE_BUFFER_SIZE;
-
- second_level_batch.is_second_level = 1;
- second_level_batch.bo = pak_context->res_pic_state_brc_write_hfw_read_buffer.bo;
-
- gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
-
- if (pic_param->pic_flags.bits.segmentation_enabled &&
- seg_param)
- segment_count = 8;
- else {
- segment_count = 1;
- memset(&tmp_seg_param, 0, sizeof(tmp_seg_param));
- seg_param = &tmp_seg_param;
- }
- for (i = 0; i < segment_count; i++)
- {
- gen9_pak_vp9_segment_state(ctx, encode_state,
- encoder_context,
- &seg_param->seg_data[i], i);
- }
-
- /* Insert the uncompressed header buffer */
- second_level_batch.is_second_level = 1;
- second_level_batch.offset = 0;
- second_level_batch.bo = pak_context->res_pak_uncompressed_input_buffer.bo;
-
- gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
-
- /* PAK_OBJECT */
- second_level_batch.is_second_level = 1;
- second_level_batch.offset = 0;
- second_level_batch.bo = pak_context->res_mb_code_surface.bo;
- gen8_gpe_mi_batch_buffer_start(ctx, batch, &second_level_batch);
-
- return;
-}
-
-static void
-gen9_vp9_read_mfc_status(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
-{
- struct intel_batchbuffer *batch = encoder_context->base.batch;
- struct gen9_encoder_context_vp9 *pak_context = encoder_context->mfc_context;
- struct gpe_mi_store_register_mem_parameter mi_store_reg_mem_param;
- struct gpe_mi_flush_dw_parameter mi_flush_dw_param;
- //struct gpe_mi_copy_mem_parameter mi_copy_mem_param;
- struct vp9_encode_status_buffer_internal *status_buffer;
- struct gen9_vp9_state *vp9_state;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
- if (!vp9_state || !pak_context || !batch)
- return;
-
- status_buffer = &(vp9_state->status_buffer);
-
- memset(&mi_flush_dw_param, 0, sizeof(mi_flush_dw_param));
- gen8_gpe_mi_flush_dw(ctx, batch, &mi_flush_dw_param);
-
- memset(&mi_store_reg_mem_param, 0, sizeof(mi_store_reg_mem_param));
- mi_store_reg_mem_param.bo = status_buffer->bo;
- mi_store_reg_mem_param.offset = status_buffer->bs_byte_count_offset;
- mi_store_reg_mem_param.mmio_offset = status_buffer->vp9_bs_frame_reg_offset;
- gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
-
- mi_store_reg_mem_param.bo = pak_context->res_brc_bitstream_size_buffer.bo;
- mi_store_reg_mem_param.offset = 0;
- mi_store_reg_mem_param.mmio_offset = status_buffer->vp9_bs_frame_reg_offset;
- gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
-
- /* Read HCP Image status */
- mi_store_reg_mem_param.bo = status_buffer->bo;
- mi_store_reg_mem_param.offset = status_buffer->image_status_mask_offset;
- mi_store_reg_mem_param.mmio_offset =
- status_buffer->vp9_image_mask_reg_offset;
- gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
-
- mi_store_reg_mem_param.bo = status_buffer->bo;
- mi_store_reg_mem_param.offset = status_buffer->image_status_ctrl_offset;
- mi_store_reg_mem_param.mmio_offset =
- status_buffer->vp9_image_ctrl_reg_offset;
- gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
-
- mi_store_reg_mem_param.bo = pak_context->res_brc_bitstream_size_buffer.bo;
- mi_store_reg_mem_param.offset = 4;
- mi_store_reg_mem_param.mmio_offset =
- status_buffer->vp9_image_ctrl_reg_offset;
- gen8_gpe_mi_store_register_mem(ctx, batch, &mi_store_reg_mem_param);
-
- gen8_gpe_mi_flush_dw(ctx, batch, &mi_flush_dw_param);
-
- return;
-}
-
-static VAStatus
-gen9_vp9_pak_pipeline_prepare(VADriverContextP ctx,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct gen9_encoder_context_vp9 *pak_context = encoder_context->mfc_context;
- struct object_surface *obj_surface;
- struct object_buffer *obj_buffer;
- struct i965_coded_buffer_segment *coded_buffer_segment;
- VAEncPictureParameterBufferVP9 *pic_param;
- struct gen9_vp9_state *vp9_state;
- dri_bo *bo;
- int i;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
- if (!vp9_state ||
- !vp9_state->pic_param)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- pic_param = vp9_state->pic_param;
-
- /* reconstructed surface */
- obj_surface = encode_state->reconstructed_object;
- i965_check_alloc_surface_bo(ctx, obj_surface, 1, VA_FOURCC_NV12, SUBSAMPLE_YUV420);
-
- dri_bo_unreference(pak_context->reconstructed_object.bo);
-
- pak_context->reconstructed_object.bo = obj_surface->bo;
- dri_bo_reference(pak_context->reconstructed_object.bo);
-
- /* set vp9 reference frames */
- for (i = 0; i < ARRAY_ELEMS(pak_context->reference_surfaces); i++) {
- if (pak_context->reference_surfaces[i].bo)
- dri_bo_unreference(pak_context->reference_surfaces[i].bo);
- pak_context->reference_surfaces[i].bo = NULL;
- }
-
- /* Three reference frames are enough for VP9 */
- if (pic_param->pic_flags.bits.frame_type &&
- !pic_param->pic_flags.bits.intra_only) {
- for (i = 0; i < 3; i++) {
- obj_surface = encode_state->reference_objects[i];
- if (obj_surface && obj_surface->bo) {
- pak_context->reference_surfaces[i].bo = obj_surface->bo;
- dri_bo_reference(obj_surface->bo);
- }
- }
- }
-
- /* input YUV surface */
- dri_bo_unreference(pak_context->uncompressed_picture_source.bo);
- pak_context->uncompressed_picture_source.bo = NULL;
- obj_surface = encode_state->reconstructed_object;
- if (vp9_state->dys_in_use &&
- ((pic_param->frame_width_src != pic_param->frame_width_dst) ||
- (pic_param->frame_height_src != pic_param->frame_height_dst))) {
- struct gen9_surface_vp9 *vp9_priv_surface =
- (struct gen9_surface_vp9 *)(obj_surface->private_data);
- obj_surface = vp9_priv_surface->dys_surface_obj;
- } else
- obj_surface = encode_state->input_yuv_object;
-
- pak_context->uncompressed_picture_source.bo = obj_surface->bo;
- dri_bo_reference(pak_context->uncompressed_picture_source.bo);
-
- /* coded buffer */
- dri_bo_unreference(pak_context->indirect_pak_bse_object.bo);
- pak_context->indirect_pak_bse_object.bo = NULL;
- obj_buffer = encode_state->coded_buf_object;
- bo = obj_buffer->buffer_store->bo;
- pak_context->indirect_pak_bse_object.offset = I965_CODEDBUFFER_HEADER_SIZE;
- pak_context->indirect_pak_bse_object.end_offset = ALIGN((obj_buffer->size_element - 0x1000), 0x1000);
- pak_context->indirect_pak_bse_object.bo = bo;
- dri_bo_reference(pak_context->indirect_pak_bse_object.bo);
-
- /* set the internal flag to 0 to indicate the coded size is unknown */
- dri_bo_map(bo, 1);
- coded_buffer_segment = (struct i965_coded_buffer_segment *)bo->virtual;
- coded_buffer_segment->mapped = 0;
- coded_buffer_segment->codec = encoder_context->codec;
- coded_buffer_segment->status_support = 1;
- dri_bo_unmap(bo);
-
- return VA_STATUS_SUCCESS;
-}
-
-static void
-gen9_vp9_pak_brc_prepare(struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
-}
-
-static void
-gen9_vp9_pak_context_destroy(void *context)
-{
- struct gen9_encoder_context_vp9 *pak_context = context;
- int i;
-
- dri_bo_unreference(pak_context->reconstructed_object.bo);
- pak_context->reconstructed_object.bo = NULL;
-
- dri_bo_unreference(pak_context->uncompressed_picture_source.bo);
- pak_context->uncompressed_picture_source.bo = NULL;
-
- dri_bo_unreference(pak_context->indirect_pak_bse_object.bo);
- pak_context->indirect_pak_bse_object.bo = NULL;
-
- for (i = 0; i < 8; i++){
- dri_bo_unreference(pak_context->reference_surfaces[i].bo);
- pak_context->reference_surfaces[i].bo = NULL;
- }
-
- /* vme & pak same the same structure, so don't free the context here */
-}
-
-static VAStatus
-gen9_vp9_pak_pipeline(VADriverContextP ctx,
- VAProfile profile,
- struct encode_state *encode_state,
- struct intel_encoder_context *encoder_context)
-{
- struct i965_driver_data *i965 = i965_driver_data(ctx);
- struct intel_batchbuffer *batch = encoder_context->base.batch;
- struct gen9_encoder_context_vp9 *pak_context = encoder_context->mfc_context;
- VAStatus va_status;
- struct gen9_vp9_state *vp9_state;
- VAEncPictureParameterBufferVP9 *pic_param;
- int i;
-
- vp9_state = (struct gen9_vp9_state *)(encoder_context->enc_priv_state);
-
- if (!vp9_state || !vp9_state->pic_param || !pak_context)
- return VA_STATUS_ERROR_INVALID_PARAMETER;
-
- va_status = gen9_vp9_pak_pipeline_prepare(ctx, encode_state, encoder_context);
-
- if (va_status != VA_STATUS_SUCCESS)
- return va_status;
-
- if (i965->intel.has_bsd2)
- intel_batchbuffer_start_atomic_bcs_override(batch, 0x1000, BSD_RING0);
- else
- intel_batchbuffer_start_atomic_bcs(batch, 0x1000);
-
- intel_batchbuffer_emit_mi_flush(batch);
-
- BEGIN_BCS_BATCH(batch, 64);
- for (i = 0; i < 64; i++)
- OUT_BCS_BATCH(batch, MI_NOOP);
-
- ADVANCE_BCS_BATCH(batch);
-
- for (vp9_state->curr_pak_pass = 0;
- vp9_state->curr_pak_pass < vp9_state->num_pak_passes;
- vp9_state->curr_pak_pass++) {
-
- if (vp9_state->curr_pak_pass == 0) {
- /* Initialize the VP9 Image Ctrl reg for the first pass */
- struct gpe_mi_load_register_imm_parameter mi_load_reg_imm;
- struct vp9_encode_status_buffer_internal *status_buffer;
-
- status_buffer = &(vp9_state->status_buffer);
- memset(&mi_load_reg_imm, 0, sizeof(mi_load_reg_imm));
- mi_load_reg_imm.mmio_offset = status_buffer->vp9_image_ctrl_reg_offset;
- mi_load_reg_imm.data = 0;
- gen8_gpe_mi_load_register_imm(ctx, batch, &mi_load_reg_imm);
- }
- gen9_vp9_pak_picture_level(ctx, encode_state, encoder_context);
- gen9_vp9_read_mfc_status(ctx, encoder_context);
- }
-
- intel_batchbuffer_end_atomic(batch);
- intel_batchbuffer_flush(batch);
-
- pic_param = vp9_state->pic_param;
- vp9_state->vp9_last_frame.frame_width = pic_param->frame_width_dst;
- vp9_state->vp9_last_frame.frame_height = pic_param->frame_height_dst;
- vp9_state->vp9_last_frame.frame_type = pic_param->pic_flags.bits.frame_type;
- vp9_state->vp9_last_frame.show_frame = pic_param->pic_flags.bits.show_frame;
- vp9_state->vp9_last_frame.refresh_frame_context = pic_param->pic_flags.bits.refresh_frame_context;
- vp9_state->vp9_last_frame.frame_context_idx = pic_param->pic_flags.bits.frame_context_idx;
- vp9_state->vp9_last_frame.intra_only = pic_param->pic_flags.bits.intra_only;
- vp9_state->frame_number++;
- vp9_state->curr_mv_temporal_index ^= 1;
- vp9_state->first_frame = 0;
-
- return VA_STATUS_SUCCESS;
-}
-
-Bool
-gen9_vp9_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
-{
- struct gen9_encoder_context_vp9 *vme_context = NULL;
- struct gen9_vp9_state *vp9_state = NULL;
-
- vme_context = calloc(1, sizeof(struct gen9_encoder_context_vp9));
- vp9_state = calloc(1, sizeof(struct gen9_vp9_state));
-
- if (!vme_context || !vp9_state) {
- if (vme_context)
- free(vme_context);
- if (vp9_state)
- free(vp9_state);
- return false;
- }
-
- encoder_context->enc_priv_state = vp9_state;
- vme_context->enc_priv_state = vp9_state;
-
- /* Initialize the features that are supported by VP9 */
- vme_context->hme_supported = 1;
- vme_context->use_hw_scoreboard = 1;
- vme_context->use_hw_non_stalling_scoreboard = 1;
-
- vp9_state->tx_mode = TX_MODE_SELECT;
- vp9_state->multi_ref_qp_check = 0;
- vp9_state->target_usage = INTEL_ENC_VP9_TU_NORMAL;
- vp9_state->num_pak_passes = 1;
- vp9_state->hme_supported = vme_context->hme_supported;
- vp9_state->b16xme_supported = 1;
-
- if (encoder_context->rate_control_mode != VA_RC_NONE &&
- encoder_context->rate_control_mode != VA_RC_CQP) {
- vp9_state->brc_enabled = 1;
- vp9_state->brc_distortion_buffer_supported = 1;
- vp9_state->brc_constant_buffer_supported = 1;
- vp9_state->num_pak_passes = 4;
- }
- vp9_state->dys_enabled = 1; /* this is supported by default */
- vp9_state->first_frame = 1;
-
- /* the definition of status buffer offset for VP9 */
- {
- struct vp9_encode_status_buffer_internal *status_buffer;
- uint32_t base_offset = offsetof(struct i965_coded_buffer_segment, codec_private_data);
-
- status_buffer = &vp9_state->status_buffer;
- memset(status_buffer, 0,
- sizeof(struct vp9_encode_status_buffer_internal));
-
- status_buffer->bs_byte_count_offset = base_offset + offsetof(struct vp9_encode_status, bs_byte_count);
- status_buffer->image_status_mask_offset = base_offset + offsetof(struct vp9_encode_status, image_status_mask);
- status_buffer->image_status_ctrl_offset = base_offset + offsetof(struct vp9_encode_status, image_status_ctrl);
- status_buffer->media_index_offset = base_offset + offsetof(struct vp9_encode_status, media_index);
-
- status_buffer->vp9_bs_frame_reg_offset = 0x1E9E0;
- status_buffer->vp9_image_mask_reg_offset = 0x1E9F0;
- status_buffer->vp9_image_ctrl_reg_offset = 0x1E9F4;
- }
-
- gen9_vme_kernels_context_init_vp9(ctx, encoder_context, vme_context);
-
- encoder_context->vme_context = vme_context;
- encoder_context->vme_pipeline = gen9_vme_pipeline_vp9;
- encoder_context->vme_context_destroy = gen9_vme_context_destroy_vp9;
-
- return true;
-}
-
-static VAStatus
-gen9_vp9_get_coded_status(VADriverContextP ctx,
- struct intel_encoder_context *encoder_context,
- struct i965_coded_buffer_segment *coded_buf_seg)
-{
- struct vp9_encode_status *vp9_encode_status;
-
- if (!encoder_context || !coded_buf_seg)
- return VA_STATUS_ERROR_INVALID_BUFFER;
-
- vp9_encode_status = (struct vp9_encode_status *)coded_buf_seg->codec_private_data;
- coded_buf_seg->base.size = vp9_encode_status->bs_byte_count;
-
- /* One VACodedBufferSegment for VP9 will be added later.
- * It will be linked to the next element of coded_buf_seg->base.next
- */
-
- return VA_STATUS_SUCCESS;
-}
-
-Bool
-gen9_vp9_pak_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context)
-{
- /* VME & PAK share the same context */
- struct gen9_encoder_context_vp9 *pak_context = encoder_context->vme_context;
-
- if (!pak_context)
- return false;
-
- encoder_context->mfc_context = pak_context;
- encoder_context->mfc_context_destroy = gen9_vp9_pak_context_destroy;
- encoder_context->mfc_pipeline = gen9_vp9_pak_pipeline;
- encoder_context->mfc_brc_prepare = gen9_vp9_pak_brc_prepare;
- encoder_context->get_status = gen9_vp9_get_coded_status;
- return true;
-}