Lines Matching refs:dec
103 static int flush(struct ruvd_decoder *dec, unsigned flags)
105 return dec->ws->cs_flush(&dec->cs, flags, NULL);
109 static void set_reg(struct ruvd_decoder *dec, unsigned reg, uint32_t val)
111 radeon_emit(&dec->cs, RUVD_PKT0(reg >> 2, 0));
112 radeon_emit(&dec->cs, val);
116 static void send_cmd(struct ruvd_decoder *dec, unsigned cmd,
122 reloc_idx = dec->ws->cs_add_buffer(&dec->cs, buf, usage | RADEON_USAGE_SYNCHRONIZED,
124 if (!dec->use_legacy) {
126 addr = dec->ws->buffer_get_virtual_address(buf);
128 set_reg(dec, dec->reg.data0, addr);
129 set_reg(dec, dec->reg.data1, addr >> 32);
131 off += dec->ws->buffer_get_reloc_offset(buf);
132 set_reg(dec, RUVD_GPCOM_VCPU_DATA0, off);
133 set_reg(dec, RUVD_GPCOM_VCPU_DATA1, reloc_idx * 4);
135 set_reg(dec, dec->reg.cmd, cmd << 1);
139 static bool have_it(struct ruvd_decoder *dec)
141 return dec->stream_type == RUVD_CODEC_H264_PERF ||
142 dec->stream_type == RUVD_CODEC_H265;
146 static void map_msg_fb_it_buf(struct ruvd_decoder *dec)
152 buf = &dec->msg_fb_it_buffers[dec->cur_buffer];
155 ptr = dec->ws->buffer_map(dec->ws, buf->res->buf, &dec->cs,
159 dec->msg = (struct ruvd_msg *)ptr;
160 memset(dec->msg, 0, sizeof(*dec->msg));
162 dec->fb = (uint32_t *)(ptr + FB_BUFFER_OFFSET);
163 if (have_it(dec))
164 dec->it = (uint8_t *)(ptr + FB_BUFFER_OFFSET + dec->fb_size);
168 static void send_msg_buf(struct ruvd_decoder *dec)
173 if (!dec->msg || !dec->fb)
177 buf = &dec->msg_fb_it_buffers[dec->cur_buffer];
180 dec->ws->buffer_unmap(dec->ws, buf->res->buf);
181 dec->bs_ptr = NULL;
182 dec->msg = NULL;
183 dec->fb = NULL;
184 dec->it = NULL;
187 if (dec->sessionctx.res)
188 send_cmd(dec, RUVD_CMD_SESSION_CONTEXT_BUFFER,
189 dec->sessionctx.res->buf, 0, RADEON_USAGE_READWRITE,
193 send_cmd(dec, RUVD_CMD_MSG_BUFFER, buf->res->buf, 0,
198 static void next_buffer(struct ruvd_decoder *dec)
200 ++dec->cur_buffer;
201 dec->cur_buffer %= NUM_BUFFERS;
205 static uint32_t profile2stream_type(struct ruvd_decoder *dec, unsigned family)
207 switch (u_reduce_video_profile(dec->base.profile)) {
230 static unsigned get_db_pitch_alignment(struct ruvd_decoder *dec)
236 static unsigned calc_dpb_size(struct ruvd_decoder *dec)
241 unsigned width = align(dec->base.width, VL_MACROBLOCK_WIDTH);
242 unsigned height = align(dec->base.height, VL_MACROBLOCK_HEIGHT);
245 unsigned max_references = dec->base.max_references + 1;
248 image_size = align(width, get_db_pitch_alignment(dec)) * height;
256 switch (u_reduce_video_profile(dec->base.profile)) {
258 if (!dec->use_legacy) {
262 if (dec->stream_type == RUVD_CODEC_H264_PERF)
264 switch(dec->base.level) {
293 if ((dec->stream_type != RUVD_CODEC_H264_PERF)) {
302 if ((dec->stream_type != RUVD_CODEC_H264_PERF)) {
372 static struct ruvd_h264 get_h264_msg(struct ruvd_decoder *dec, struct pipe_h264_picture_desc *pic)
396 result.level = dec->base.level;
410 switch (dec->base.chroma_format) {
448 if (dec->stream_type == RUVD_CODEC_H264_PERF) {
449 memcpy(dec->it, result.scaling_list_4x4, 6*16);
450 memcpy((dec->it + 96), result.scaling_list_8x8, 2*64);
542 static uint32_t get_ref_pic_idx(struct ruvd_decoder *dec, struct pipe_video_buffer *ref)
544 uint32_t min = MAX2(dec->frame_number, NUM_MPEG2_REFS) - NUM_MPEG2_REFS;
545 uint32_t max = MAX2(dec->frame_number, 1) - 1;
553 frame = (uintptr_t)vl_video_buffer_get_associated_data(ref, &dec->base);
560 static struct ruvd_mpeg2 get_mpeg2_msg(struct ruvd_decoder *dec,
568 result.decoded_pic_idx = dec->frame_number;
570 result.ref_pic_idx[i] = get_ref_pic_idx(dec, pic->ref[i]);
601 static struct ruvd_mpeg4 get_mpeg4_msg(struct ruvd_decoder *dec,
608 result.decoded_pic_idx = dec->frame_number;
610 result.ref_pic_idx[i] = get_ref_pic_idx(dec, pic->ref[i]);
618 result.video_object_layer_width = dec->base.width;
619 result.video_object_layer_height = dec->base.height;
661 static void get_mjpeg_slice_header(struct ruvd_decoder *dec, struct pipe_mjpeg_picture_desc *pic)
665 uint8_t *buf = dec->bs_ptr;
790 dec->bs_ptr += size;
791 dec->bs_size += size;
799 struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder;
804 map_msg_fb_it_buf(dec);
805 dec->msg->size = sizeof(*dec->msg);
806 dec->msg->msg_type = RUVD_MSG_DESTROY;
807 dec->msg->stream_handle = dec->stream_handle;
808 send_msg_buf(dec);
810 flush(dec, 0);
812 dec->ws->cs_destroy(&dec->cs);
815 rvid_destroy_buffer(&dec->msg_fb_it_buffers[i]);
816 rvid_destroy_buffer(&dec->bs_buffers[i]);
819 rvid_destroy_buffer(&dec->dpb);
820 rvid_destroy_buffer(&dec->ctx);
821 rvid_destroy_buffer(&dec->sessionctx);
823 FREE(dec);
833 struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder;
838 frame = ++dec->frame_number;
842 dec->bs_size = 0;
843 dec->bs_ptr = dec->ws->buffer_map(dec->ws,
844 dec->bs_buffers[dec->cur_buffer].res->buf,
845 &dec->cs, PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);
871 struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder;
877 if (!dec->bs_ptr)
881 get_mjpeg_slice_header(dec, (struct pipe_mjpeg_picture_desc*)picture);
884 struct rvid_buffer *buf = &dec->bs_buffers[dec->cur_buffer];
885 unsigned new_size = dec->bs_size + sizes[i];
891 dec->ws->buffer_unmap(dec->ws, buf->res->buf);
892 dec->bs_ptr = NULL;
893 if (!rvid_resize_buffer(dec->screen, &dec->cs, buf, new_size)) {
898 dec->bs_ptr = dec->ws->buffer_map(dec->ws, buf->res->buf, &dec->cs,
901 if (!dec->bs_ptr)
904 dec->bs_ptr += dec->bs_size;
907 memcpy(dec->bs_ptr, buffers[i], sizes[i]);
908 dec->bs_size += sizes[i];
909 dec->bs_ptr += sizes[i];
913 ((uint8_t *)dec->bs_ptr)[0] = 0xff; /* EOI */
914 ((uint8_t *)dec->bs_ptr)[1] = 0xd9;
915 dec->bs_size += 2;
916 dec->bs_ptr += 2;
927 struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder;
934 if (!dec->bs_ptr)
937 msg_fb_it_buf = &dec->msg_fb_it_buffers[dec->cur_buffer];
938 bs_buf = &dec->bs_buffers[dec->cur_buffer];
940 bs_size = align(dec->bs_size, 128);
941 memset(dec->bs_ptr, 0, bs_size - dec->bs_size);
942 dec->ws->buffer_unmap(dec->ws, bs_buf->res->buf);
943 dec->bs_ptr = NULL;
945 map_msg_fb_it_buf(dec);
946 dec->msg->size = sizeof(*dec->msg);
947 dec->msg->msg_type = RUVD_MSG_DECODE;
948 dec->msg->stream_handle = dec->stream_handle;
949 dec->msg->status_report_feedback_number = dec->frame_number;
951 dec->msg->body.decode.stream_type = dec->stream_type;
952 dec->msg->body.decode.decode_flags = 0x1;
953 dec->msg->body.decode.width_in_samples = dec->base.width;
954 dec->msg->body.decode.height_in_samples = dec->base.height;
958 dec->msg->body.decode.width_in_samples = align(dec->msg->body.decode.width_in_samples, 16) / 16;
959 dec->msg->body.decode.height_in_samples = align(dec->msg->body.decode.height_in_samples, 16) / 16;
962 if (dec->dpb.res)
963 dec->msg->body.decode.dpb_size = dec->dpb.res->buf->size;
964 dec->msg->body.decode.bsd_size = bs_size;
965 dec->msg->body.decode.db_pitch = align(dec->base.width, get_db_pitch_alignment(dec));
967 dt = dec->set_dtb(dec->msg, (struct vl_video_buffer *)target);
971 dec->msg->body.decode.codec.h264 = get_h264_msg(dec, (struct pipe_h264_picture_desc*)picture);
975 dec->msg->body.decode.codec.vc1 = get_vc1_msg((struct pipe_vc1_picture_desc*)picture);
979 dec->msg->body.decode.codec.mpeg2 = get_mpeg2_msg(dec, (struct pipe_mpeg12_picture_desc*)picture);
983 dec->msg->body.decode.codec.mpeg4 = get_mpeg4_msg(dec, (struct pipe_mpeg4_picture_desc*)picture);
994 dec->msg->body.decode.db_surf_tile_config = dec->msg->body.decode.dt_surf_tile_config;
995 dec->msg->body.decode.extension_support = 0x1;
998 dec->fb[0] = dec->fb_size;
1000 send_msg_buf(dec);
1002 if (dec->dpb.res)
1003 send_cmd(dec, RUVD_CMD_DPB_BUFFER, dec->dpb.res->buf, 0,
1006 if (dec->ctx.res)
1007 send_cmd(dec, RUVD_CMD_CONTEXT_BUFFER, dec->ctx.res->buf, 0,
1009 send_cmd(dec, RUVD_CMD_BITSTREAM_BUFFER, bs_buf->res->buf,
1011 send_cmd(dec, RUVD_CMD_DECODING_TARGET_BUFFER, dt, 0,
1013 send_cmd(dec, RUVD_CMD_FEEDBACK_BUFFER, msg_fb_it_buf->res->buf,
1015 if (have_it(dec))
1016 send_cmd(dec, RUVD_CMD_ITSCALING_TABLE_BUFFER, msg_fb_it_buf->res->buf,
1017 FB_BUFFER_OFFSET + dec->fb_size, RADEON_USAGE_READ, RADEON_DOMAIN_GTT);
1018 set_reg(dec, dec->reg.cntl, 1);
1020 flush(dec, PIPE_FLUSH_ASYNC);
1021 next_buffer(dec);
1044 struct ruvd_decoder *dec;
1069 dec = CALLOC_STRUCT(ruvd_decoder);
1071 if (!dec)
1074 dec->use_legacy = true;
1076 dec->base = *templ;
1077 dec->base.context = context;
1078 dec->base.width = width;
1079 dec->base.height = height;
1081 dec->base.destroy = ruvd_destroy;
1082 dec->base.begin_frame = ruvd_begin_frame;
1083 dec->base.decode_macroblock = ruvd_decode_macroblock;
1084 dec->base.decode_bitstream = ruvd_decode_bitstream;
1085 dec->base.end_frame = ruvd_end_frame;
1086 dec->base.flush = ruvd_flush;
1088 dec->stream_type = profile2stream_type(dec, info.family);
1089 dec->set_dtb = set_dtb;
1090 dec->stream_handle = rvid_alloc_stream_handle();
1091 dec->screen = context->screen;
1092 dec->ws = ws;
1094 if (!ws->cs_create(&dec->cs, rctx->ctx, AMD_IP_UVD, NULL, NULL, false)) {
1099 dec->fb_size = FB_BUFFER_SIZE;
1102 unsigned msg_fb_it_size = FB_BUFFER_OFFSET + dec->fb_size;
1104 if (have_it(dec))
1106 if (!rvid_create_buffer(dec->screen, &dec->msg_fb_it_buffers[i],
1112 if (!rvid_create_buffer(dec->screen, &dec->bs_buffers[i],
1118 rvid_clear_buffer(context, &dec->msg_fb_it_buffers[i]);
1119 rvid_clear_buffer(context, &dec->bs_buffers[i]);
1122 dpb_size = calc_dpb_size(dec);
1124 if (!rvid_create_buffer(dec->screen, &dec->dpb, dpb_size, PIPE_USAGE_DEFAULT)) {
1128 rvid_clear_buffer(context, &dec->dpb);
1131 dec->reg.data0 = RUVD_GPCOM_VCPU_DATA0;
1132 dec->reg.data1 = RUVD_GPCOM_VCPU_DATA1;
1133 dec->reg.cmd = RUVD_GPCOM_VCPU_CMD;
1134 dec->reg.cntl = RUVD_ENGINE_CNTL;
1136 map_msg_fb_it_buf(dec);
1137 dec->msg->size = sizeof(*dec->msg);
1138 dec->msg->msg_type = RUVD_MSG_CREATE;
1139 dec->msg->stream_handle = dec->stream_handle;
1140 dec->msg->body.create.stream_type = dec->stream_type;
1141 dec->msg->body.create.width_in_samples = dec->base.width;
1142 dec->msg->body.create.height_in_samples = dec->base.height;
1143 dec->msg->body.create.dpb_size = dpb_size;
1144 send_msg_buf(dec);
1145 r = flush(dec, 0);
1149 next_buffer(dec);
1151 return &dec->base;
1154 dec->ws->cs_destroy(&dec->cs);
1157 rvid_destroy_buffer(&dec->msg_fb_it_buffers[i]);
1158 rvid_destroy_buffer(&dec->bs_buffers[i]);
1161 rvid_destroy_buffer(&dec->dpb);
1162 rvid_destroy_buffer(&dec->ctx);
1163 rvid_destroy_buffer(&dec->sessionctx);
1165 FREE(dec);