bool gen75_send_avc_picid_state( struct intel_batchbuffer *batch, GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES] ) { uint16_t pic_ids[16]; if (!gen75_fill_avc_picid_list(pic_ids, frame_store)) return false; BEGIN_BCS_BATCH(batch, 10); OUT_BCS_BATCH(batch, MFD_AVC_PICID_STATE | (10 - 2)); OUT_BCS_BATCH(batch, 0); // enable Picture ID Remapping intel_batchbuffer_data(batch, pic_ids, sizeof(pic_ids)); ADVANCE_BCS_BATCH(batch); return true; }
/* Emit Reference List Entries (Gen6+: SNB, IVB) */ static void gen6_send_avc_ref_idx_state_1( struct intel_batchbuffer *batch, unsigned int list, const VAPictureH264 *ref_list, unsigned int ref_list_count, const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES] ) { uint8_t ref_idx_state[32]; BEGIN_BCS_BATCH(batch, 10); OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | (10 - 2)); OUT_BCS_BATCH(batch, list); gen5_fill_avc_ref_idx_state( ref_idx_state, ref_list, ref_list_count, frame_store ); intel_batchbuffer_data(batch, ref_idx_state, sizeof(ref_idx_state)); ADVANCE_BCS_BATCH(batch); }
static void gen6_mfd_avc_phantom_slice_bsd_object(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param, struct intel_batchbuffer *batch) { BEGIN_BCS_BATCH(batch, 6); OUT_BCS_BATCH(batch, MFD_AVC_BSD_OBJECT | (6 - 2)); 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); ADVANCE_BCS_BATCH(batch); }
void intel_batchbuffer_emit_mi_flush(struct intel_batchbuffer *batch) { struct intel_driver_data *intel = batch->intel; if (IS_GEN6(intel->device_info) || IS_GEN7(intel->device_info) || IS_GEN8(intel->device_info)) { if (batch->flag == I915_EXEC_RENDER) { if (IS_GEN8(intel->device_info)) { BEGIN_BATCH(batch, 6); OUT_BATCH(batch, CMD_PIPE_CONTROL | (6 - 2)); OUT_BATCH(batch, CMD_PIPE_CONTROL_CS_STALL | CMD_PIPE_CONTROL_WC_FLUSH | CMD_PIPE_CONTROL_TC_FLUSH | CMD_PIPE_CONTROL_DC_FLUSH | CMD_PIPE_CONTROL_NOWRITE); OUT_BATCH(batch, 0); /* write address */ OUT_BATCH(batch, 0); OUT_BATCH(batch, 0); /* write data */ OUT_BATCH(batch, 0); ADVANCE_BATCH(batch); } else if (IS_GEN6(intel->device_info)) { assert(batch->wa_render_bo); BEGIN_BATCH(batch, 4 * 3); OUT_BATCH(batch, CMD_PIPE_CONTROL | (4 - 2)); OUT_BATCH(batch, CMD_PIPE_CONTROL_CS_STALL | CMD_PIPE_CONTROL_STALL_AT_SCOREBOARD); OUT_BATCH(batch, 0); /* address */ OUT_BATCH(batch, 0); /* write data */ OUT_BATCH(batch, CMD_PIPE_CONTROL | (4 - 2)); OUT_BATCH(batch, CMD_PIPE_CONTROL_WRITE_QWORD); OUT_RELOC(batch, batch->wa_render_bo, I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION, 0); OUT_BATCH(batch, 0); /* write data */ /* now finally the _real flush */ OUT_BATCH(batch, CMD_PIPE_CONTROL | (4 - 2)); OUT_BATCH(batch, CMD_PIPE_CONTROL_WC_FLUSH | CMD_PIPE_CONTROL_TC_FLUSH | CMD_PIPE_CONTROL_NOWRITE); OUT_BATCH(batch, 0); /* write address */ OUT_BATCH(batch, 0); /* write data */ ADVANCE_BATCH(batch); } else { BEGIN_BATCH(batch, 4); OUT_BATCH(batch, CMD_PIPE_CONTROL | (4 - 2)); OUT_BATCH(batch, CMD_PIPE_CONTROL_WC_FLUSH | CMD_PIPE_CONTROL_TC_FLUSH | CMD_PIPE_CONTROL_DC_FLUSH | CMD_PIPE_CONTROL_NOWRITE); OUT_BATCH(batch, 0); /* write address */ OUT_BATCH(batch, 0); /* write data */ ADVANCE_BATCH(batch); } } else { if (batch->flag == I915_EXEC_BLT) { BEGIN_BLT_BATCH(batch, 4); OUT_BLT_BATCH(batch, MI_FLUSH_DW); OUT_BLT_BATCH(batch, 0); OUT_BLT_BATCH(batch, 0); OUT_BLT_BATCH(batch, 0); ADVANCE_BLT_BATCH(batch); }else if (batch->flag == I915_EXEC_VEBOX) { BEGIN_VEB_BATCH(batch, 4); OUT_VEB_BATCH(batch, MI_FLUSH_DW); OUT_VEB_BATCH(batch, 0); OUT_VEB_BATCH(batch, 0); OUT_VEB_BATCH(batch, 0); ADVANCE_VEB_BATCH(batch); } else { assert(batch->flag == I915_EXEC_BSD); BEGIN_BCS_BATCH(batch, 4); OUT_BCS_BATCH(batch, MI_FLUSH_DW | MI_FLUSH_DW_VIDEO_PIPELINE_CACHE_INVALIDATE); OUT_BCS_BATCH(batch, 0); OUT_BCS_BATCH(batch, 0); OUT_BCS_BATCH(batch, 0); ADVANCE_BCS_BATCH(batch); } } } else { if (batch->flag == I915_EXEC_RENDER) { BEGIN_BATCH(batch, 1); OUT_BATCH(batch, MI_FLUSH | MI_FLUSH_STATE_INSTRUCTION_CACHE_INVALIDATE); ADVANCE_BATCH(batch); } else { assert(batch->flag == I915_EXEC_BSD); BEGIN_BCS_BATCH(batch, 1); OUT_BCS_BATCH(batch, MI_FLUSH | MI_FLUSH_STATE_INSTRUCTION_CACHE_INVALIDATE); ADVANCE_BCS_BATCH(batch); } } }
static void gen6_mfd_avc_phantom_slice_state(VADriverContextP ctx, VAPictureParameterBufferH264 *pic_param, VASliceParameterBufferH264 *next_slice_param, struct intel_batchbuffer *batch) { int width_in_mbs = pic_param->picture_width_in_mbs_minus1 + 1; int height_in_mbs = pic_param->picture_height_in_mbs_minus1 + 1; /* frame height */ int slice_hor_pos, slice_ver_pos, slice_start_mb_num, next_slice_hor_pos, next_slice_ver_pos; int mbaff_picture = (!pic_param->pic_fields.bits.field_pic_flag && pic_param->seq_fields.bits.mb_adaptive_frame_field_flag); if (next_slice_param) { int first_mb_in_next_slice; slice_hor_pos = 0; slice_ver_pos = 0; slice_start_mb_num = 0; first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture; next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs; } else { slice_hor_pos = 0; slice_ver_pos = height_in_mbs; slice_start_mb_num = width_in_mbs * height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag); next_slice_hor_pos = 0; next_slice_ver_pos = 0; } BEGIN_BCS_BATCH(batch, 11); OUT_BCS_BATCH(batch, MFX_AVC_SLICE_STATE | (11 - 2)); OUT_BCS_BATCH(batch, 0); OUT_BCS_BATCH(batch, 0); OUT_BCS_BATCH(batch, 0); OUT_BCS_BATCH(batch, slice_ver_pos << 24 | slice_hor_pos << 16 | slice_start_mb_num << 0); OUT_BCS_BATCH(batch, next_slice_ver_pos << 16 | next_slice_hor_pos << 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); ADVANCE_BCS_BATCH(batch); }