Lines Matching refs:dec
103 static int flush(struct ruvd_decoder *dec, unsigned flags) in flush() argument
105 return dec->ws->cs_flush(dec->cs, flags, NULL); in flush()
109 static void set_reg(struct ruvd_decoder *dec, unsigned reg, uint32_t val) in set_reg() argument
111 radeon_emit(dec->cs, RUVD_PKT0(reg >> 2, 0)); in set_reg()
112 radeon_emit(dec->cs, val); in set_reg()
116 static void send_cmd(struct ruvd_decoder *dec, unsigned cmd, in send_cmd() argument
122 reloc_idx = dec->ws->cs_add_buffer(dec->cs, buf, usage | RADEON_USAGE_SYNCHRONIZED, in send_cmd()
125 if (!dec->use_legacy) { in send_cmd()
127 addr = dec->ws->buffer_get_virtual_address(buf); in send_cmd()
129 set_reg(dec, dec->reg.data0, addr); in send_cmd()
130 set_reg(dec, dec->reg.data1, addr >> 32); in send_cmd()
132 off += dec->ws->buffer_get_reloc_offset(buf); in send_cmd()
133 set_reg(dec, RUVD_GPCOM_VCPU_DATA0, off); in send_cmd()
134 set_reg(dec, RUVD_GPCOM_VCPU_DATA1, reloc_idx * 4); in send_cmd()
136 set_reg(dec, dec->reg.cmd, cmd << 1); in send_cmd()
140 static bool have_it(struct ruvd_decoder *dec) in have_it() argument
142 return dec->stream_type == RUVD_CODEC_H264_PERF || in have_it()
143 dec->stream_type == RUVD_CODEC_H265; in have_it()
147 static void map_msg_fb_it_buf(struct ruvd_decoder *dec) in map_msg_fb_it_buf() argument
153 buf = &dec->msg_fb_it_buffers[dec->cur_buffer]; in map_msg_fb_it_buf()
156 ptr = dec->ws->buffer_map(buf->res->buf, dec->cs, PIPE_TRANSFER_WRITE); in map_msg_fb_it_buf()
159 dec->msg = (struct ruvd_msg *)ptr; in map_msg_fb_it_buf()
160 memset(dec->msg, 0, sizeof(*dec->msg)); in map_msg_fb_it_buf()
162 dec->fb = (uint32_t *)(ptr + FB_BUFFER_OFFSET); in map_msg_fb_it_buf()
163 if (have_it(dec)) in map_msg_fb_it_buf()
164 dec->it = (uint8_t *)(ptr + FB_BUFFER_OFFSET + dec->fb_size); in map_msg_fb_it_buf()
168 static void send_msg_buf(struct ruvd_decoder *dec) in send_msg_buf() argument
173 if (!dec->msg || !dec->fb) in send_msg_buf()
177 buf = &dec->msg_fb_it_buffers[dec->cur_buffer]; in send_msg_buf()
180 dec->ws->buffer_unmap(buf->res->buf); in send_msg_buf()
181 dec->msg = NULL; in send_msg_buf()
182 dec->fb = NULL; in send_msg_buf()
183 dec->it = NULL; in send_msg_buf()
186 if (dec->sessionctx.res) in send_msg_buf()
187 send_cmd(dec, RUVD_CMD_SESSION_CONTEXT_BUFFER, in send_msg_buf()
188 dec->sessionctx.res->buf, 0, RADEON_USAGE_READWRITE, in send_msg_buf()
192 send_cmd(dec, RUVD_CMD_MSG_BUFFER, buf->res->buf, 0, in send_msg_buf()
197 static void next_buffer(struct ruvd_decoder *dec) in next_buffer() argument
199 ++dec->cur_buffer; in next_buffer()
200 dec->cur_buffer %= NUM_BUFFERS; in next_buffer()
204 static uint32_t profile2stream_type(struct ruvd_decoder *dec, unsigned family) in profile2stream_type() argument
206 switch (u_reduce_video_profile(dec->base.profile)) { in profile2stream_type()
231 static unsigned calc_ctx_size_h265_main(struct ruvd_decoder *dec) in calc_ctx_size_h265_main() argument
233 unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH); in calc_ctx_size_h265_main()
234 unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT); in calc_ctx_size_h265_main()
236 unsigned max_references = dec->base.max_references + 1; in calc_ctx_size_h265_main()
238 if (dec->base.width * dec->base.height >= 4096*2000) in calc_ctx_size_h265_main()
248 static unsigned calc_ctx_size_h265_main10(struct ruvd_decoder *dec, struct pipe_h265_picture_desc *… in calc_ctx_size_h265_main10() argument
254 unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH); in calc_ctx_size_h265_main10()
255 unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT); in calc_ctx_size_h265_main10()
258 unsigned max_references = dec->base.max_references + 1; in calc_ctx_size_h265_main10()
260 if (dec->base.width * dec->base.height >= 4096*2000) in calc_ctx_size_h265_main10()
281 static unsigned get_db_pitch_alignment(struct ruvd_decoder *dec) in get_db_pitch_alignment() argument
287 static unsigned calc_dpb_size(struct ruvd_decoder *dec) in calc_dpb_size() argument
292 unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH); in calc_dpb_size()
293 unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT); in calc_dpb_size()
296 unsigned max_references = dec->base.max_references + 1; in calc_dpb_size()
299 image_size = align(width, get_db_pitch_alignment(dec)) * height; in calc_dpb_size()
307 switch (u_reduce_video_profile(dec->base.profile)) { in calc_dpb_size()
309 if (!dec->use_legacy) { in calc_dpb_size()
313 if (dec->stream_type == RUVD_CODEC_H264_PERF) in calc_dpb_size()
315 switch(dec->base.level) { in calc_dpb_size()
344 if ((dec->stream_type != RUVD_CODEC_H264_PERF)) { in calc_dpb_size()
353 if ((dec->stream_type != RUVD_CODEC_H264_PERF)) { in calc_dpb_size()
364 if (dec->base.width * dec->base.height >= 4096*2000) in calc_dpb_size()
371 if (dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10) in calc_dpb_size()
372 …dpb_size = align((align(width, get_db_pitch_alignment(dec)) * height * 9) / 4, 256) * max_referenc… in calc_dpb_size()
374 …dpb_size = align((align(width, get_db_pitch_alignment(dec)) * height * 3) / 2, 256) * max_referenc… in calc_dpb_size()
437 static struct ruvd_h264 get_h264_msg(struct ruvd_decoder *dec, struct pipe_h264_picture_desc *pic) in get_h264_msg() argument
461 result.level = dec->base.level; in get_h264_msg()
475 switch (dec->base.chroma_format) { in get_h264_msg()
513 if (dec->stream_type == RUVD_CODEC_H264_PERF) { in get_h264_msg()
514 memcpy(dec->it, result.scaling_list_4x4, 6*16); in get_h264_msg()
515 memcpy((dec->it + 96), result.scaling_list_8x8, 2*64); in get_h264_msg()
535 static struct ruvd_h265 get_h265_msg(struct ruvd_decoder *dec, struct pipe_video_buffer *target, in get_h265_msg() argument
620 vl_video_buffer_set_associated_data(target, &dec->base, in get_h265_msg()
631 ref_pic = (uintptr_t)vl_video_buffer_get_associated_data(ref, &dec->base); in get_h265_msg()
658 memcpy(dec->it, pic->pps->sps->ScalingList4x4, 6 * 16); in get_h265_msg()
659 memcpy(dec->it + 96, pic->pps->sps->ScalingList8x8, 6 * 64); in get_h265_msg()
660 memcpy(dec->it + 480, pic->pps->sps->ScalingList16x16, 6 * 64); in get_h265_msg()
661 memcpy(dec->it + 864, pic->pps->sps->ScalingList32x32, 2 * 64); in get_h265_msg()
769 static uint32_t get_ref_pic_idx(struct ruvd_decoder *dec, struct pipe_video_buffer *ref) in get_ref_pic_idx() argument
771 uint32_t min = MAX2(dec->frame_number, NUM_MPEG2_REFS) - NUM_MPEG2_REFS; in get_ref_pic_idx()
772 uint32_t max = MAX2(dec->frame_number, 1) - 1; in get_ref_pic_idx()
780 frame = (uintptr_t)vl_video_buffer_get_associated_data(ref, &dec->base); in get_ref_pic_idx()
787 static struct ruvd_mpeg2 get_mpeg2_msg(struct ruvd_decoder *dec, in get_mpeg2_msg() argument
795 result.decoded_pic_idx = dec->frame_number; in get_mpeg2_msg()
797 result.ref_pic_idx[i] = get_ref_pic_idx(dec, pic->ref[i]); in get_mpeg2_msg()
828 static struct ruvd_mpeg4 get_mpeg4_msg(struct ruvd_decoder *dec, in get_mpeg4_msg() argument
835 result.decoded_pic_idx = dec->frame_number; in get_mpeg4_msg()
837 result.ref_pic_idx[i] = get_ref_pic_idx(dec, pic->ref[i]); in get_mpeg4_msg()
845 result.video_object_layer_width = dec->base.width; in get_mpeg4_msg()
846 result.video_object_layer_height = dec->base.height; in get_mpeg4_msg()
888 static void get_mjpeg_slice_header(struct ruvd_decoder *dec, struct pipe_mjpeg_picture_desc *pic) in get_mjpeg_slice_header() argument
892 uint8_t *buf = dec->bs_ptr; in get_mjpeg_slice_header()
1017 dec->bs_ptr += size; in get_mjpeg_slice_header()
1018 dec->bs_size += size; in get_mjpeg_slice_header()
1026 struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder; in ruvd_destroy() local
1031 map_msg_fb_it_buf(dec); in ruvd_destroy()
1032 dec->msg->size = sizeof(*dec->msg); in ruvd_destroy()
1033 dec->msg->msg_type = RUVD_MSG_DESTROY; in ruvd_destroy()
1034 dec->msg->stream_handle = dec->stream_handle; in ruvd_destroy()
1035 send_msg_buf(dec); in ruvd_destroy()
1037 flush(dec, 0); in ruvd_destroy()
1039 dec->ws->cs_destroy(dec->cs); in ruvd_destroy()
1042 rvid_destroy_buffer(&dec->msg_fb_it_buffers[i]); in ruvd_destroy()
1043 rvid_destroy_buffer(&dec->bs_buffers[i]); in ruvd_destroy()
1046 rvid_destroy_buffer(&dec->dpb); in ruvd_destroy()
1047 rvid_destroy_buffer(&dec->ctx); in ruvd_destroy()
1048 rvid_destroy_buffer(&dec->sessionctx); in ruvd_destroy()
1050 FREE(dec); in ruvd_destroy()
1060 struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder; in ruvd_begin_frame() local
1065 frame = ++dec->frame_number; in ruvd_begin_frame()
1069 dec->bs_size = 0; in ruvd_begin_frame()
1070 dec->bs_ptr = dec->ws->buffer_map( in ruvd_begin_frame()
1071 dec->bs_buffers[dec->cur_buffer].res->buf, in ruvd_begin_frame()
1072 dec->cs, PIPE_TRANSFER_WRITE); in ruvd_begin_frame()
1098 struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder; in ruvd_decode_bitstream() local
1104 if (!dec->bs_ptr) in ruvd_decode_bitstream()
1108 get_mjpeg_slice_header(dec, (struct pipe_mjpeg_picture_desc*)picture); in ruvd_decode_bitstream()
1111 struct rvid_buffer *buf = &dec->bs_buffers[dec->cur_buffer]; in ruvd_decode_bitstream()
1112 unsigned new_size = dec->bs_size + sizes[i]; in ruvd_decode_bitstream()
1118 dec->ws->buffer_unmap(buf->res->buf); in ruvd_decode_bitstream()
1119 if (!rvid_resize_buffer(dec->screen, dec->cs, buf, new_size)) { in ruvd_decode_bitstream()
1124 dec->bs_ptr = dec->ws->buffer_map(buf->res->buf, dec->cs, in ruvd_decode_bitstream()
1126 if (!dec->bs_ptr) in ruvd_decode_bitstream()
1129 dec->bs_ptr += dec->bs_size; in ruvd_decode_bitstream()
1132 memcpy(dec->bs_ptr, buffers[i], sizes[i]); in ruvd_decode_bitstream()
1133 dec->bs_size += sizes[i]; in ruvd_decode_bitstream()
1134 dec->bs_ptr += sizes[i]; in ruvd_decode_bitstream()
1138 ((uint8_t *)dec->bs_ptr)[0] = 0xff; /* EOI */ in ruvd_decode_bitstream()
1139 ((uint8_t *)dec->bs_ptr)[1] = 0xd9; in ruvd_decode_bitstream()
1140 dec->bs_size += 2; in ruvd_decode_bitstream()
1141 dec->bs_ptr += 2; in ruvd_decode_bitstream()
1152 struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder; in ruvd_end_frame() local
1159 if (!dec->bs_ptr) in ruvd_end_frame()
1162 msg_fb_it_buf = &dec->msg_fb_it_buffers[dec->cur_buffer]; in ruvd_end_frame()
1163 bs_buf = &dec->bs_buffers[dec->cur_buffer]; in ruvd_end_frame()
1165 bs_size = align(dec->bs_size, 128); in ruvd_end_frame()
1166 memset(dec->bs_ptr, 0, bs_size - dec->bs_size); in ruvd_end_frame()
1167 dec->ws->buffer_unmap(bs_buf->res->buf); in ruvd_end_frame()
1169 map_msg_fb_it_buf(dec); in ruvd_end_frame()
1170 dec->msg->size = sizeof(*dec->msg); in ruvd_end_frame()
1171 dec->msg->msg_type = RUVD_MSG_DECODE; in ruvd_end_frame()
1172 dec->msg->stream_handle = dec->stream_handle; in ruvd_end_frame()
1173 dec->msg->status_report_feedback_number = dec->frame_number; in ruvd_end_frame()
1175 dec->msg->body.decode.stream_type = dec->stream_type; in ruvd_end_frame()
1176 dec->msg->body.decode.decode_flags = 0x1; in ruvd_end_frame()
1177 dec->msg->body.decode.width_in_samples = dec->base.width; in ruvd_end_frame()
1178 dec->msg->body.decode.height_in_samples = dec->base.height; in ruvd_end_frame()
1182 dec->msg->body.decode.width_in_samples = align(dec->msg->body.decode.width_in_samples, 16) / 16; in ruvd_end_frame()
1183 dec->msg->body.decode.height_in_samples = align(dec->msg->body.decode.height_in_samples, 16) / 16; in ruvd_end_frame()
1186 if (dec->dpb.res) in ruvd_end_frame()
1187 dec->msg->body.decode.dpb_size = dec->dpb.res->buf->size; in ruvd_end_frame()
1188 dec->msg->body.decode.bsd_size = bs_size; in ruvd_end_frame()
1189 dec->msg->body.decode.db_pitch = align(dec->base.width, get_db_pitch_alignment(dec)); in ruvd_end_frame()
1191 dt = dec->set_dtb(dec->msg, (struct vl_video_buffer *)target); in ruvd_end_frame()
1195 dec->msg->body.decode.codec.h264 = get_h264_msg(dec, (struct pipe_h264_picture_desc*)picture); in ruvd_end_frame()
1199 …dec->msg->body.decode.codec.h265 = get_h265_msg(dec, target, (struct pipe_h265_picture_desc*)pictu… in ruvd_end_frame()
1200 if (dec->ctx.res == NULL) { in ruvd_end_frame()
1202 if (dec->base.profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10) in ruvd_end_frame()
1203 ctx_size = calc_ctx_size_h265_main10(dec, (struct pipe_h265_picture_desc*)picture); in ruvd_end_frame()
1205 ctx_size = calc_ctx_size_h265_main(dec); in ruvd_end_frame()
1206 if (!rvid_create_buffer(dec->screen, &dec->ctx, ctx_size, PIPE_USAGE_DEFAULT)) { in ruvd_end_frame()
1209 rvid_clear_buffer(decoder->context, &dec->ctx); in ruvd_end_frame()
1212 if (dec->ctx.res) in ruvd_end_frame()
1213 dec->msg->body.decode.dpb_reserved = dec->ctx.res->buf->size; in ruvd_end_frame()
1217 dec->msg->body.decode.codec.vc1 = get_vc1_msg((struct pipe_vc1_picture_desc*)picture); in ruvd_end_frame()
1221 dec->msg->body.decode.codec.mpeg2 = get_mpeg2_msg(dec, (struct pipe_mpeg12_picture_desc*)picture); in ruvd_end_frame()
1225 dec->msg->body.decode.codec.mpeg4 = get_mpeg4_msg(dec, (struct pipe_mpeg4_picture_desc*)picture); in ruvd_end_frame()
1236 dec->msg->body.decode.db_surf_tile_config = dec->msg->body.decode.dt_surf_tile_config; in ruvd_end_frame()
1237 dec->msg->body.decode.extension_support = 0x1; in ruvd_end_frame()
1240 dec->fb[0] = dec->fb_size; in ruvd_end_frame()
1242 send_msg_buf(dec); in ruvd_end_frame()
1244 if (dec->dpb.res) in ruvd_end_frame()
1245 send_cmd(dec, RUVD_CMD_DPB_BUFFER, dec->dpb.res->buf, 0, in ruvd_end_frame()
1248 if (dec->ctx.res) in ruvd_end_frame()
1249 send_cmd(dec, RUVD_CMD_CONTEXT_BUFFER, dec->ctx.res->buf, 0, in ruvd_end_frame()
1251 send_cmd(dec, RUVD_CMD_BITSTREAM_BUFFER, bs_buf->res->buf, in ruvd_end_frame()
1253 send_cmd(dec, RUVD_CMD_DECODING_TARGET_BUFFER, dt, 0, in ruvd_end_frame()
1255 send_cmd(dec, RUVD_CMD_FEEDBACK_BUFFER, msg_fb_it_buf->res->buf, in ruvd_end_frame()
1257 if (have_it(dec)) in ruvd_end_frame()
1258 send_cmd(dec, RUVD_CMD_ITSCALING_TABLE_BUFFER, msg_fb_it_buf->res->buf, in ruvd_end_frame()
1259 FB_BUFFER_OFFSET + dec->fb_size, RADEON_USAGE_READ, RADEON_DOMAIN_GTT); in ruvd_end_frame()
1260 set_reg(dec, dec->reg.cntl, 1); in ruvd_end_frame()
1262 flush(dec, PIPE_FLUSH_ASYNC); in ruvd_end_frame()
1263 next_buffer(dec); in ruvd_end_frame()
1286 struct ruvd_decoder *dec; in ruvd_create_decoder() local
1311 dec = CALLOC_STRUCT(ruvd_decoder); in ruvd_create_decoder()
1313 if (!dec) in ruvd_create_decoder()
1317 dec->use_legacy = true; in ruvd_create_decoder()
1319 dec->base = *templ; in ruvd_create_decoder()
1320 dec->base.context = context; in ruvd_create_decoder()
1321 dec->base.width = width; in ruvd_create_decoder()
1322 dec->base.height = height; in ruvd_create_decoder()
1324 dec->base.destroy = ruvd_destroy; in ruvd_create_decoder()
1325 dec->base.begin_frame = ruvd_begin_frame; in ruvd_create_decoder()
1326 dec->base.decode_macroblock = ruvd_decode_macroblock; in ruvd_create_decoder()
1327 dec->base.decode_bitstream = ruvd_decode_bitstream; in ruvd_create_decoder()
1328 dec->base.end_frame = ruvd_end_frame; in ruvd_create_decoder()
1329 dec->base.flush = ruvd_flush; in ruvd_create_decoder()
1331 dec->stream_type = profile2stream_type(dec, info.family); in ruvd_create_decoder()
1332 dec->set_dtb = set_dtb; in ruvd_create_decoder()
1333 dec->stream_handle = rvid_alloc_stream_handle(); in ruvd_create_decoder()
1334 dec->screen = context->screen; in ruvd_create_decoder()
1335 dec->ws = ws; in ruvd_create_decoder()
1336 dec->cs = ws->cs_create(rctx->ctx, RING_UVD, NULL, NULL); in ruvd_create_decoder()
1337 if (!dec->cs) { in ruvd_create_decoder()
1342 dec->fb_size = FB_BUFFER_SIZE; in ruvd_create_decoder()
1345 unsigned msg_fb_it_size = FB_BUFFER_OFFSET + dec->fb_size; in ruvd_create_decoder()
1347 if (have_it(dec)) in ruvd_create_decoder()
1349 if (!rvid_create_buffer(dec->screen, &dec->msg_fb_it_buffers[i], in ruvd_create_decoder()
1355 if (!rvid_create_buffer(dec->screen, &dec->bs_buffers[i], in ruvd_create_decoder()
1361 rvid_clear_buffer(context, &dec->msg_fb_it_buffers[i]); in ruvd_create_decoder()
1362 rvid_clear_buffer(context, &dec->bs_buffers[i]); in ruvd_create_decoder()
1365 dpb_size = calc_dpb_size(dec); in ruvd_create_decoder()
1367 if (!rvid_create_buffer(dec->screen, &dec->dpb, dpb_size, PIPE_USAGE_DEFAULT)) { in ruvd_create_decoder()
1371 rvid_clear_buffer(context, &dec->dpb); in ruvd_create_decoder()
1374 dec->reg.data0 = RUVD_GPCOM_VCPU_DATA0; in ruvd_create_decoder()
1375 dec->reg.data1 = RUVD_GPCOM_VCPU_DATA1; in ruvd_create_decoder()
1376 dec->reg.cmd = RUVD_GPCOM_VCPU_CMD; in ruvd_create_decoder()
1377 dec->reg.cntl = RUVD_ENGINE_CNTL; in ruvd_create_decoder()
1379 map_msg_fb_it_buf(dec); in ruvd_create_decoder()
1380 dec->msg->size = sizeof(*dec->msg); in ruvd_create_decoder()
1381 dec->msg->msg_type = RUVD_MSG_CREATE; in ruvd_create_decoder()
1382 dec->msg->stream_handle = dec->stream_handle; in ruvd_create_decoder()
1383 dec->msg->body.create.stream_type = dec->stream_type; in ruvd_create_decoder()
1384 dec->msg->body.create.width_in_samples = dec->base.width; in ruvd_create_decoder()
1385 dec->msg->body.create.height_in_samples = dec->base.height; in ruvd_create_decoder()
1386 dec->msg->body.create.dpb_size = dpb_size; in ruvd_create_decoder()
1387 send_msg_buf(dec); in ruvd_create_decoder()
1388 r = flush(dec, 0); in ruvd_create_decoder()
1392 next_buffer(dec); in ruvd_create_decoder()
1394 return &dec->base; in ruvd_create_decoder()
1397 if (dec->cs) dec->ws->cs_destroy(dec->cs); in ruvd_create_decoder()
1400 rvid_destroy_buffer(&dec->msg_fb_it_buffers[i]); in ruvd_create_decoder()
1401 rvid_destroy_buffer(&dec->bs_buffers[i]); in ruvd_create_decoder()
1404 rvid_destroy_buffer(&dec->dpb); in ruvd_create_decoder()
1405 rvid_destroy_buffer(&dec->ctx); in ruvd_create_decoder()
1406 rvid_destroy_buffer(&dec->sessionctx); in ruvd_create_decoder()
1408 FREE(dec); in ruvd_create_decoder()