Lines Matching full:enc
52 static void flush(struct rvce_encoder *enc) in flush() argument
54 enc->ws->cs_flush(&enc->cs, PIPE_FLUSH_ASYNC, NULL); in flush()
55 enc->task_info_idx = 0; in flush()
56 enc->bs_idx = 0; in flush()
60 static void dump_feedback(struct rvce_encoder *enc, struct rvid_buffer *fb)
62 uint32_t *ptr = enc->ws->buffer_map(fb->res->buf, &enc->cs, PIPE_MAP_READ_WRITE);
81 enc->ws->buffer_unmap(fb->res->buf);
88 static void reset_cpb(struct rvce_encoder *enc) in reset_cpb() argument
92 list_inithead(&enc->cpb_slots); in reset_cpb()
93 for (i = 0; i < enc->cpb_num; ++i) { in reset_cpb()
94 struct rvce_cpb_slot *slot = &enc->cpb_array[i]; in reset_cpb()
99 list_addtail(&slot->list, &enc->cpb_slots); in reset_cpb()
106 static void sort_cpb(struct rvce_encoder *enc) in sort_cpb() argument
110 LIST_FOR_EACH_ENTRY (i, &enc->cpb_slots, list) { in sort_cpb()
111 if (i->frame_num == enc->pic.ref_idx_l0_list[0]) in sort_cpb()
114 if (i->frame_num == enc->pic.ref_idx_l1_list[0]) in sort_cpb()
117 if (enc->pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_P && l0) in sort_cpb()
120 if (enc->pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B && l0 && l1) in sort_cpb()
126 list_add(&l1->list, &enc->cpb_slots); in sort_cpb()
131 list_add(&l0->list, &enc->cpb_slots); in sort_cpb()
138 static unsigned get_cpb_num(struct rvce_encoder *enc) in get_cpb_num() argument
140 unsigned w = align(enc->base.width, 16) / 16; in get_cpb_num()
141 unsigned h = align(enc->base.height, 16) / 16; in get_cpb_num()
144 switch (enc->base.level) { in get_cpb_num()
192 struct rvce_cpb_slot *si_current_slot(struct rvce_encoder *enc) in si_current_slot() argument
194 return list_entry(enc->cpb_slots.prev, struct rvce_cpb_slot, list); in si_current_slot()
200 struct rvce_cpb_slot *si_l0_slot(struct rvce_encoder *enc) in si_l0_slot() argument
202 return list_entry(enc->cpb_slots.next, struct rvce_cpb_slot, list); in si_l0_slot()
208 struct rvce_cpb_slot *si_l1_slot(struct rvce_encoder *enc) in si_l1_slot() argument
210 return list_entry(enc->cpb_slots.next->next, struct rvce_cpb_slot, list); in si_l1_slot()
216 void si_vce_frame_offset(struct rvce_encoder *enc, struct rvce_cpb_slot *slot, signed *luma_offset, in si_vce_frame_offset() argument
219 struct si_screen *sscreen = (struct si_screen *)enc->screen; in si_vce_frame_offset()
223 pitch = align(enc->luma->u.legacy.level[0].nblk_x * enc->luma->bpe, 128); in si_vce_frame_offset()
224 vpitch = align(enc->luma->u.legacy.level[0].nblk_y, 16); in si_vce_frame_offset()
226 pitch = align(enc->luma->u.gfx9.surf_pitch * enc->luma->bpe, 256); in si_vce_frame_offset()
227 vpitch = align(enc->luma->u.gfx9.surf_height, 16); in si_vce_frame_offset()
240 struct rvce_encoder *enc = (struct rvce_encoder *)encoder; in rvce_destroy() local
241 if (enc->stream_handle) { in rvce_destroy()
243 si_vid_create_buffer(enc->screen, &fb, 512, PIPE_USAGE_STAGING); in rvce_destroy()
244 enc->fb = &fb; in rvce_destroy()
245 enc->session(enc); in rvce_destroy()
246 enc->destroy(enc); in rvce_destroy()
247 flush(enc); in rvce_destroy()
250 si_vid_destroy_buffer(&enc->cpb); in rvce_destroy()
251 enc->ws->cs_destroy(&enc->cs); in rvce_destroy()
252 FREE(enc->cpb_array); in rvce_destroy()
253 FREE(enc); in rvce_destroy()
259 struct rvce_encoder *enc = (struct rvce_encoder *)encoder; in rvce_begin_frame() local
264 enc->pic.rate_ctrl[0].rate_ctrl_method != pic->rate_ctrl[0].rate_ctrl_method || in rvce_begin_frame()
265 enc->pic.quant_i_frames != pic->quant_i_frames || in rvce_begin_frame()
266 enc->pic.quant_p_frames != pic->quant_p_frames || in rvce_begin_frame()
267 enc->pic.quant_b_frames != pic->quant_b_frames || in rvce_begin_frame()
268 enc->pic.rate_ctrl[0].target_bitrate != pic->rate_ctrl[0].target_bitrate || in rvce_begin_frame()
269 enc->pic.rate_ctrl[0].frame_rate_num != pic->rate_ctrl[0].frame_rate_num || in rvce_begin_frame()
270 enc->pic.rate_ctrl[0].frame_rate_den != pic->rate_ctrl[0].frame_rate_den; in rvce_begin_frame()
272 enc->pic = *pic; in rvce_begin_frame()
273 enc->si_get_pic_param(enc, pic); in rvce_begin_frame()
275 enc->get_buffer(vid_buf->resources[0], &enc->handle, &enc->luma); in rvce_begin_frame()
276 enc->get_buffer(vid_buf->resources[1], NULL, &enc->chroma); in rvce_begin_frame()
279 reset_cpb(enc); in rvce_begin_frame()
282 sort_cpb(enc); in rvce_begin_frame()
284 if (!enc->stream_handle) { in rvce_begin_frame()
286 enc->stream_handle = si_vid_alloc_stream_handle(); in rvce_begin_frame()
287 si_vid_create_buffer(enc->screen, &fb, 512, PIPE_USAGE_STAGING); in rvce_begin_frame()
288 enc->fb = &fb; in rvce_begin_frame()
289 enc->session(enc); in rvce_begin_frame()
290 enc->create(enc); in rvce_begin_frame()
291 enc->config(enc); in rvce_begin_frame()
292 enc->feedback(enc); in rvce_begin_frame()
293 flush(enc); in rvce_begin_frame()
294 // dump_feedback(enc, &fb); in rvce_begin_frame()
300 enc->session(enc); in rvce_begin_frame()
301 enc->config(enc); in rvce_begin_frame()
302 flush(enc); in rvce_begin_frame()
310 struct rvce_encoder *enc = (struct rvce_encoder *)encoder; in rvce_encode_bitstream() local
311 enc->get_buffer(destination, &enc->bs_handle, NULL); in rvce_encode_bitstream()
312 enc->bs_size = destination->width0; in rvce_encode_bitstream()
314 *fb = enc->fb = CALLOC_STRUCT(rvid_buffer); in rvce_encode_bitstream()
315 if (!si_vid_create_buffer(enc->screen, enc->fb, 512, PIPE_USAGE_STAGING)) { in rvce_encode_bitstream()
319 if (!radeon_emitted(&enc->cs, 0)) in rvce_encode_bitstream()
320 enc->session(enc); in rvce_encode_bitstream()
321 enc->encode(enc); in rvce_encode_bitstream()
322 enc->feedback(enc); in rvce_encode_bitstream()
328 struct rvce_encoder *enc = (struct rvce_encoder *)encoder; in rvce_end_frame() local
329 struct rvce_cpb_slot *slot = list_entry(enc->cpb_slots.prev, struct rvce_cpb_slot, list); in rvce_end_frame()
331 if (!enc->dual_inst || enc->bs_idx > 1) in rvce_end_frame()
332 flush(enc); in rvce_end_frame()
335 slot->picture_type = enc->pic.picture_type; in rvce_end_frame()
336 slot->frame_num = enc->pic.frame_num; in rvce_end_frame()
337 slot->pic_order_cnt = enc->pic.pic_order_cnt; in rvce_end_frame()
338 if (!enc->pic.not_referenced) { in rvce_end_frame()
340 list_add(&slot->list, &enc->cpb_slots); in rvce_end_frame()
346 struct rvce_encoder *enc = (struct rvce_encoder *)encoder; in rvce_get_feedback() local
350 uint32_t *ptr = enc->ws->buffer_map(enc->ws, fb->res->buf, &enc->cs, in rvce_get_feedback()
359 enc->ws->buffer_unmap(enc->ws, fb->res->buf); in rvce_get_feedback()
361 // dump_feedback(enc, fb); in rvce_get_feedback()
371 struct rvce_encoder *enc = (struct rvce_encoder *)encoder; in rvce_flush() local
373 flush(enc); in rvce_flush()
387 struct rvce_encoder *enc; in si_vce_create_encoder() local
401 enc = CALLOC_STRUCT(rvce_encoder); in si_vce_create_encoder()
402 if (!enc) in si_vce_create_encoder()
406 enc->use_vm = true; in si_vce_create_encoder()
408 enc->use_vui = true; in si_vce_create_encoder()
413 enc->dual_pipe = true; in si_vce_create_encoder()
417 enc->dual_inst = true; in si_vce_create_encoder()
419 enc->base = *templ; in si_vce_create_encoder()
420 enc->base.context = context; in si_vce_create_encoder()
422 enc->base.destroy = rvce_destroy; in si_vce_create_encoder()
423 enc->base.begin_frame = rvce_begin_frame; in si_vce_create_encoder()
424 enc->base.encode_bitstream = rvce_encode_bitstream; in si_vce_create_encoder()
425 enc->base.end_frame = rvce_end_frame; in si_vce_create_encoder()
426 enc->base.flush = rvce_flush; in si_vce_create_encoder()
427 enc->base.get_feedback = rvce_get_feedback; in si_vce_create_encoder()
428 enc->get_buffer = get_buffer; in si_vce_create_encoder()
430 enc->screen = context->screen; in si_vce_create_encoder()
431 enc->ws = ws; in si_vce_create_encoder()
433 if (!ws->cs_create(&enc->cs, sctx->ctx, AMD_IP_VCE, rvce_cs_flush, enc, false)) { in si_vce_create_encoder()
439 templat.width = enc->base.width; in si_vce_create_encoder()
440 templat.height = enc->base.height; in si_vce_create_encoder()
447 enc->cpb_num = get_cpb_num(enc); in si_vce_create_encoder()
448 if (!enc->cpb_num) in si_vce_create_encoder()
462 cpb_size = cpb_size * enc->cpb_num; in si_vce_create_encoder()
463 if (enc->dual_pipe) in si_vce_create_encoder()
466 if (!si_vid_create_buffer(enc->screen, &enc->cpb, cpb_size, PIPE_USAGE_DEFAULT)) { in si_vce_create_encoder()
471 enc->cpb_array = CALLOC(enc->cpb_num, sizeof(struct rvce_cpb_slot)); in si_vce_create_encoder()
472 if (!enc->cpb_array) in si_vce_create_encoder()
475 reset_cpb(enc); in si_vce_create_encoder()
479 si_vce_40_2_2_init(enc); in si_vce_create_encoder()
486 si_vce_50_init(enc); in si_vce_create_encoder()
492 si_vce_52_init(enc); in si_vce_create_encoder()
497 si_vce_52_init(enc); in si_vce_create_encoder()
502 return &enc->base; in si_vce_create_encoder()
505 enc->ws->cs_destroy(&enc->cs); in si_vce_create_encoder()
507 si_vid_destroy_buffer(&enc->cpb); in si_vce_create_encoder()
509 FREE(enc->cpb_array); in si_vce_create_encoder()
510 FREE(enc); in si_vce_create_encoder()
540 void si_vce_add_buffer(struct rvce_encoder *enc, struct pb_buffer *buf, unsigned usage, in si_vce_add_buffer() argument
545 reloc_idx = enc->ws->cs_add_buffer(&enc->cs, buf, usage | RADEON_USAGE_SYNCHRONIZED, domain); in si_vce_add_buffer()
546 if (enc->use_vm) { in si_vce_add_buffer()
548 addr = enc->ws->buffer_get_virtual_address(buf); in si_vce_add_buffer()
553 offset += enc->ws->buffer_get_reloc_offset(buf); in si_vce_add_buffer()