Ilia Mirkin
2013-Dec-08 05:31 UTC
[Nouveau] [PATCH 1/3] nv50: enable h264 and mpeg4 for nv98+ (vp3, vp4.0)
Create the ref_bo without any storage type flags set for now. The issue probably arises from our use of the additional buffer space at the end of the ref_bo. It should probably be split up in the future. Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> Tested-by: Martin Peres <martin.peres at labri.fr> Cc: "10.0" <mesa-stable at lists.freedesktop.org> --- src/gallium/drivers/nouveau/nouveau_vp3_video.c | 7 +------ src/gallium/drivers/nouveau/nv50/nv98_video.c | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video.c b/src/gallium/drivers/nouveau/nouveau_vp3_video.c index 07ce016..ff00b37 100644 --- a/src/gallium/drivers/nouveau/nouveau_vp3_video.c +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video.c @@ -362,12 +362,7 @@ nouveau_vp3_screen_get_video_param(struct pipe_screen *pscreen, enum pipe_video_format codec = u_reduce_video_profile(profile); switch (param) { case PIPE_VIDEO_CAP_SUPPORTED: - /* For now, h264 and mpeg4 don't work on pre-nvc0. */ - if (chipset < 0xc0) - return codec == PIPE_VIDEO_FORMAT_MPEG12 || - codec == PIPE_VIDEO_FORMAT_VC1; - /* In the general case, this should work, once the pre-nvc0 problems are - * resolved. */ + /* VP3 does not support MPEG4, VP4+ do. */ return profile >= PIPE_VIDEO_PROFILE_MPEG1 && ( !vp3 || codec != PIPE_VIDEO_FORMAT_MPEG4); case PIPE_VIDEO_CAP_NPOT_TEXTURES: diff --git a/src/gallium/drivers/nouveau/nv50/nv98_video.c b/src/gallium/drivers/nouveau/nv50/nv98_video.c index 069481d..f748c81 100644 --- a/src/gallium/drivers/nouveau/nv50/nv98_video.c +++ b/src/gallium/drivers/nouveau/nv50/nv98_video.c @@ -200,7 +200,7 @@ nv98_create_decoder(struct pipe_context *context, dec->ref_stride = mb(templ->width)*16 * (mb_half(templ->height)*32 + nouveau_vp3_video_align(templ->height)/2); ret = nouveau_bo_new(screen->device, NOUVEAU_BO_VRAM, 0, dec->ref_stride * (templ->max_references+2) + tmp_size, - &cfg, &dec->ref_bo); + NULL, &dec->ref_bo); if (ret) goto fail; -- 1.8.3.2
Ilia Mirkin
2013-Dec-08 05:32 UTC
[Nouveau] [PATCH 2/3] nouveau/video: update h264 picparm field names based on usage
Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> --- src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c | 28 ++++++++++------------ 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c b/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c index a0f5332..ad4a586 100644 --- a/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c @@ -118,10 +118,10 @@ struct h264_picparm_vp { // 700..a00 uint32_t bucket_size; // 28 bucket size uint32_t inter_ring_data_size; // 2c - unsigned f0 : 1; // 0 0x01: into 640 shifted by 3, 540 shifted by 5, half size something? - unsigned f1 : 1; // 1 0x02: into vuc ofs 56 + unsigned mb_adaptive_frame_field_flag : 1; // 0 + unsigned direct_8x8_inference_flag : 1; // 1 0x02: into vuc ofs 56 unsigned weighted_pred_flag : 1; // 2 0x04 - unsigned f3 : 1; // 3 0x08: into vuc ofs 68 + unsigned constrained_intra_pred_flag : 1; // 3 0x08: into vuc ofs 68 unsigned is_reference : 1; // 4 unsigned interlace : 1; // 5 field_pic_flag unsigned bottom_field_flag : 1; // 6 @@ -144,15 +144,13 @@ struct h264_picparm_vp { // 700..a00 uint32_t field_order_cnt[2]; // 38, 3c struct { // 40 - // 0x00223102 - // nfi (needs: top_is_reference, bottom_is_reference, is_long_term, maybe some other state that was saved.. unsigned fifo_idx : 7; // 00 0..6 unsigned tmp_idx : 5; // 00 7..11 - unsigned unk12 : 1; // 00 12 not seen yet, but set, maybe top_is_reference - unsigned unk13 : 1; // 00 13 not seen yet, but set, maybe bottom_is_reference? + unsigned top_is_reference : 1; // 00 12 + unsigned bottom_is_reference : 1; // 00 13 unsigned unk14 : 1; // 00 14 skipped? unsigned notseenyet : 1; // 00 15 pad? - unsigned unk16 : 1; // 00 16 + unsigned field_pic_flag : 1; // 00 16 unsigned unk17 : 4; // 00 17..20 unsigned unk21 : 4; // 00 21..24 unsigned pad : 7; // 00 d25..31 @@ -340,10 +338,10 @@ nouveau_vp3_fill_picparm_h264_vp(struct nouveau_vp3_decoder *dec, nouveau_vp3_inter_sizes(dec, 1, &ring, &h->bucket_size, &h->inter_ring_data_size); h->u220 = 0; - h->f0 = d->pps->sps->mb_adaptive_frame_field_flag; - h->f1 = d->pps->sps->direct_8x8_inference_flag; + h->mb_adaptive_frame_field_flag = d->pps->sps->mb_adaptive_frame_field_flag; + h->direct_8x8_inference_flag = d->pps->sps->direct_8x8_inference_flag; h->weighted_pred_flag = d->pps->weighted_pred_flag; - h->f3 = d->pps->constrained_intra_pred_flag; + h->constrained_intra_pred_flag = d->pps->constrained_intra_pred_flag; h->is_reference = d->is_reference; h->interlace = d->field_pic_flag; h->bottom_field_flag = d->bottom_field_flag; @@ -376,12 +374,12 @@ nouveau_vp3_fill_picparm_h264_vp(struct nouveau_vp3_decoder *dec, h->refs[j].field_order_cnt[1] = d->field_order_cnt_list[i][1]; h->refs[j].frame_idx = d->frame_num_list[i]; if (!dec->refs[refs[j]->valid_ref].field_pic_flag) { - h->refs[j].unk12 = d->top_is_reference[i]; - h->refs[j].unk13 = d->bottom_is_reference[i]; + h->refs[j].top_is_reference = d->top_is_reference[i]; + h->refs[j].bottom_is_reference = d->bottom_is_reference[i]; } h->refs[j].unk14 = 0; h->refs[j].notseenyet = 0; - h->refs[j].unk16 = dec->refs[refs[j]->valid_ref].field_pic_flag; + h->refs[j].field_pic_flag = dec->refs[refs[j]->valid_ref].field_pic_flag; h->refs[j].unk17 = dec->refs[refs[j]->valid_ref].decoded_top && d->top_is_reference[i]; h->refs[j].unk21 = dec->refs[refs[j]->valid_ref].decoded_bottom && @@ -395,7 +393,7 @@ nouveau_vp3_fill_picparm_h264_vp(struct nouveau_vp3_decoder *dec, assert(d->num_ref_frames <= dec->base.max_references); for (; i < d->num_ref_frames; ++i) - h->refs[j].unk16 = d->field_pic_flag; + h->refs[j].field_pic_flag = d->field_pic_flag; *(struct h264_picparm_vp *)map = *h; return 0x1113; -- 1.8.3.2
Ilia Mirkin
2013-Dec-08 05:32 UTC
[Nouveau] [PATCH 3/3] nouveau/video: update a few more h264 picparm field names
Based on comments by Benjamin Morris <bmorris at nvidia.com> in http://lists.freedesktop.org/archives/nouveau/2013-December/015328.html This adds setting of is_long_term, and updates a few field names we were unclear about. Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> --- src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c | 33 +++++++++++----------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c b/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c index ad4a586..1130d10 100644 --- a/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video_vp.c @@ -114,7 +114,7 @@ struct h264_picparm_vp { // 700..a00 uint32_t stride1, stride2; // 04 08 uint32_t ofs[6]; // 0c..24 in-image offset - uint32_t u24; // nfi ac8 ? + uint32_t tmp_stride; uint32_t bucket_size; // 28 bucket size uint32_t inter_ring_data_size; // 2c @@ -125,10 +125,10 @@ struct h264_picparm_vp { // 700..a00 unsigned is_reference : 1; // 4 unsigned interlace : 1; // 5 field_pic_flag unsigned bottom_field_flag : 1; // 6 - unsigned f7 : 1; // 7 0x80: nfi yet + unsigned second_field : 1; // 7 0x80: nfi yet signed log2_max_frame_num_minus4 : 4; // 31 0..3 - unsigned u31_45 : 2; // 31 4..5 + unsigned chroma_format_idc : 2; // 31 4..5 unsigned pic_order_cnt_type : 2; // 31 6..7 signed pic_init_qp_minus26 : 6; // 32 0..5 signed chroma_qp_index_offset : 5; // 32 6..10 @@ -148,11 +148,11 @@ struct h264_picparm_vp { // 700..a00 unsigned tmp_idx : 5; // 00 7..11 unsigned top_is_reference : 1; // 00 12 unsigned bottom_is_reference : 1; // 00 13 - unsigned unk14 : 1; // 00 14 skipped? + unsigned is_long_term : 1; // 00 14 unsigned notseenyet : 1; // 00 15 pad? unsigned field_pic_flag : 1; // 00 16 - unsigned unk17 : 4; // 00 17..20 - unsigned unk21 : 4; // 00 21..24 + unsigned top_field_marking : 4; // 00 17..20 + unsigned bottom_field_marking : 4; // 00 21..24 unsigned pad : 7; // 00 d25..31 uint32_t field_order_cnt[2]; // 04,08 @@ -333,8 +333,8 @@ nouveau_vp3_fill_picparm_h264_vp(struct nouveau_vp3_decoder *dec, nouveau_vp3_ycbcr_offsets(dec, &h->ofs[1], &h->ofs[3], &h->ofs[4]); h->ofs[5] = h->ofs[3]; h->ofs[0] = h->ofs[2] = 0; - h->u24 = dec->tmp_stride >> 8; - assert(h->u24); + h->tmp_stride = dec->tmp_stride >> 8; + assert(h->tmp_stride); nouveau_vp3_inter_sizes(dec, 1, &ring, &h->bucket_size, &h->inter_ring_data_size); h->u220 = 0; @@ -345,9 +345,9 @@ nouveau_vp3_fill_picparm_h264_vp(struct nouveau_vp3_decoder *dec, h->is_reference = d->is_reference; h->interlace = d->field_pic_flag; h->bottom_field_flag = d->bottom_field_flag; - h->f7 = 0; // TODO: figure out when set.. + h->second_field = 0; // TODO: figure out when set.. h->log2_max_frame_num_minus4 = d->pps->sps->log2_max_frame_num_minus4; - h->u31_45 = 1; + h->chroma_format_idc = 1; h->pic_order_cnt_type = d->pps->sps->pic_order_cnt_type; h->pic_init_qp_minus26 = d->pps->pic_init_qp_minus26; @@ -377,15 +377,16 @@ nouveau_vp3_fill_picparm_h264_vp(struct nouveau_vp3_decoder *dec, h->refs[j].top_is_reference = d->top_is_reference[i]; h->refs[j].bottom_is_reference = d->bottom_is_reference[i]; } - h->refs[j].unk14 = 0; + h->refs[j].is_long_term = d->is_long_term[i]; h->refs[j].notseenyet = 0; h->refs[j].field_pic_flag = dec->refs[refs[j]->valid_ref].field_pic_flag; - h->refs[j].unk17 = dec->refs[refs[j]->valid_ref].decoded_top && - d->top_is_reference[i]; - h->refs[j].unk21 = dec->refs[refs[j]->valid_ref].decoded_bottom && - d->bottom_is_reference[i]; + h->refs[j].top_field_marking + dec->refs[refs[j]->valid_ref].decoded_top && d->top_is_reference[i] ? + 1 + d->is_long_term[i] : 0; + h->refs[j].bottom_field_marking + dec->refs[refs[j]->valid_ref].decoded_bottom && d->bottom_is_reference[i] ? + 1 + d->is_long_term[i] : 0; h->refs[j].pad = 0; - assert(!d->is_long_term[i]); j++; } for (; i < 16; ++i) -- 1.8.3.2
Possibly Parallel Threads
- [PATCH 00/10] Add support for MPEG2 and VC-1 on VP3/VP4 for NV98-NVAF
- H.264 engine differences between fermi and tesla cards
- H.264 engine differences between fermi and tesla cards
- H.264 engine differences between fermi and tesla cards
- assert in nouveau_vp3_video_vp.c ?