Lines Matching refs:dec
36 nouveau_vpe_init(struct nouveau_decoder *dec) { in nouveau_vpe_init() argument
38 if (dec->cmds) in nouveau_vpe_init()
40 ret = nouveau_bo_map(dec->cmd_bo, NOUVEAU_BO_RDWR, dec->client); in nouveau_vpe_init()
45 ret = nouveau_bo_map(dec->data_bo, NOUVEAU_BO_RDWR, dec->client); in nouveau_vpe_init()
50 dec->cmds = dec->cmd_bo->map; in nouveau_vpe_init()
51 dec->data = dec->data_bo->map; in nouveau_vpe_init()
56 nouveau_vpe_synch(struct nouveau_decoder *dec) { in nouveau_vpe_synch() argument
57 struct nouveau_pushbuf *push = dec->push; in nouveau_vpe_synch()
59 if (dec->fence_map) { in nouveau_vpe_synch()
61 PUSH_DATA (push, ++dec->fence_seq); in nouveau_vpe_synch()
63 while (dec->fence_map[0] != dec->fence_seq) in nouveau_vpe_synch()
71 nouveau_vpe_fini(struct nouveau_decoder *dec) { in nouveau_vpe_fini() argument
72 struct nouveau_pushbuf *push = dec->push; in nouveau_vpe_fini()
73 if (!dec->cmds) in nouveau_vpe_fini()
77 nouveau_bufctx_reset(dec->bufctx, NV31_VIDEO_BIND_CMD); in nouveau_vpe_fini()
79 #define BCTX_ARGS dec->bufctx, NV31_VIDEO_BIND_CMD, NOUVEAU_BO_RD in nouveau_vpe_fini()
82 PUSH_MTHDl(push, NV31_MPEG(CMD_OFFSET), dec->cmd_bo, 0, BCTX_ARGS); in nouveau_vpe_fini()
83 PUSH_DATA (push, dec->ofs * 4); in nouveau_vpe_fini()
86 PUSH_MTHDl(push, NV31_MPEG(DATA_OFFSET), dec->data_bo, 0, BCTX_ARGS); in nouveau_vpe_fini()
87 PUSH_DATA (push, dec->data_pos * 4); in nouveau_vpe_fini()
91 if (unlikely(nouveau_pushbuf_validate(dec->push))) in nouveau_vpe_fini()
97 nouveau_vpe_synch(dec); in nouveau_vpe_fini()
98 dec->ofs = dec->data_pos = dec->num_surfaces = 0; in nouveau_vpe_fini()
99 dec->cmds = dec->data = NULL; in nouveau_vpe_fini()
100 dec->current = dec->future = dec->past = 8; in nouveau_vpe_fini()
104 nouveau_vpe_mb_dct_blocks(struct nouveau_decoder *dec, const struct pipe_mpeg12_macroblock *mb) in nouveau_vpe_mb_dct_blocks() argument
114 dec->data[dec->data_pos++] = (db[i] << 16) | (i * 2); in nouveau_vpe_mb_dct_blocks()
118 dec->data[dec->data_pos - 1] |= 1; in nouveau_vpe_mb_dct_blocks()
120 dec->data[dec->data_pos++] = 1; in nouveau_vpe_mb_dct_blocks()
123 dec->data[dec->data_pos++] = 1; in nouveau_vpe_mb_dct_blocks()
129 nouveau_vpe_mb_data_blocks(struct nouveau_decoder *dec, const struct pipe_mpeg12_macroblock *mb) in nouveau_vpe_mb_data_blocks() argument
136 memcpy(&dec->data[dec->data_pos], db, 128); in nouveau_vpe_mb_data_blocks()
137 dec->data_pos += 32; in nouveau_vpe_mb_data_blocks()
140 memset(&dec->data[dec->data_pos], 0, 128); in nouveau_vpe_mb_data_blocks()
141 dec->data_pos += 32; in nouveau_vpe_mb_data_blocks()
147 nouveau_vpe_mb_dct_header(struct nouveau_decoder *dec, in nouveau_vpe_mb_dct_header() argument
157 base_dct = dec->current << NV17_MPEG_CMD_CHROMA_MB_HEADER_SURFACE__SHIFT; in nouveau_vpe_mb_dct_header()
167 if (dec->picture_structure == PIPE_MPEG12_PICTURE_STRUCTURE_FRAME) { in nouveau_vpe_mb_dct_header()
172 if (dec->picture_structure == PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_BOTTOM) in nouveau_vpe_mb_dct_header()
185 nouveau_vpe_write(dec, base_dct); in nouveau_vpe_mb_dct_header()
186 nouveau_vpe_write(dec, NV17_MPEG_CMD_MB_COORDS_OP_MB_COORDS | in nouveau_vpe_mb_dct_header()
232 nouveau_vpe_mb_mv(struct nouveau_decoder *dec, unsigned mc_header, in nouveau_vpe_mb_mv() argument
241 unsigned width = dec->base.width; in nouveau_vpe_mb_mv()
242 unsigned height = dec->base.height; in nouveau_vpe_mb_mv()
256 nouveau_vpe_write(dec, mc_header); in nouveau_vpe_mb_mv()
267 nouveau_vpe_write(dec, mc_vector); in nouveau_vpe_mb_mv()
271 nouveau_vpe_mb_mv_header(struct nouveau_decoder *dec, in nouveau_vpe_mb_mv_header() argument
275 bool frame = dec->picture_structure == PIPE_MPEG12_PICTURE_STRUCTURE_FRAME; in nouveau_vpe_mb_mv_header()
290 assert(!forward || dec->past < 8); in nouveau_vpe_mb_mv_header()
291 assert(!backward || dec->future < 8); in nouveau_vpe_mb_mv_header()
299 nouveau_vpe_mb_mv(dec, base, luma, frame, true, false, in nouveau_vpe_mb_mv_header()
300 x, y, mb->PMV[0][0], dec->past, true); in nouveau_vpe_mb_mv_header()
301 nouveau_vpe_mb_mv(dec, base, luma, frame, true, true, in nouveau_vpe_mb_mv_header()
302 x, y2, mb->PMV[0][0], dec->past, false); in nouveau_vpe_mb_mv_header()
305 nouveau_vpe_mb_mv(dec, base, luma, frame, !forward, true, in nouveau_vpe_mb_mv_header()
306 x, y, mb->PMV[1][0], dec->future, true); in nouveau_vpe_mb_mv_header()
307 nouveau_vpe_mb_mv(dec, base, luma, frame, !forward, false, in nouveau_vpe_mb_mv_header()
308 x, y2, mb->PMV[1][1], dec->future, false); in nouveau_vpe_mb_mv_header()
323 nouveau_vpe_mb_mv(dec, base, luma, frame, true, in nouveau_vpe_mb_mv_header()
324 dec->picture_structure != PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_TOP, in nouveau_vpe_mb_mv_header()
325 x, y, mb->PMV[0][0], dec->past, true); in nouveau_vpe_mb_mv_header()
327 nouveau_vpe_mb_mv(dec, base, luma, frame, false, in nouveau_vpe_mb_mv_header()
328 dec->picture_structure == PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_TOP, in nouveau_vpe_mb_mv_header()
329 x, y, mb->PMV[0][1], dec->future, true); in nouveau_vpe_mb_mv_header()
344 nouveau_vpe_mb_mv(dec, base, luma, frame, true, false, in nouveau_vpe_mb_mv_header()
345 x, y, mb->PMV[0][0], dec->past, true); in nouveau_vpe_mb_mv_header()
347 nouveau_vpe_mb_mv(dec, base, luma, frame, !forward, false, in nouveau_vpe_mb_mv_header()
348 x, y, mb->PMV[0][1], dec->future, true); in nouveau_vpe_mb_mv_header()
356 nouveau_vpe_mb_mv(dec, base, luma, frame, true, in nouveau_vpe_mb_mv_header()
358 x, y, mb->PMV[0][0], dec->past, true); in nouveau_vpe_mb_mv_header()
359 nouveau_vpe_mb_mv(dec, base, luma, frame, true, in nouveau_vpe_mb_mv_header()
361 x, y2, mb->PMV[1][0], dec->past, false); in nouveau_vpe_mb_mv_header()
364 nouveau_vpe_mb_mv(dec, base, luma, frame, !forward, in nouveau_vpe_mb_mv_header()
366 x, y, mb->PMV[0][1], dec->future, true); in nouveau_vpe_mb_mv_header()
367 nouveau_vpe_mb_mv(dec, base, luma, frame, !forward, in nouveau_vpe_mb_mv_header()
369 x, y2, mb->PMV[1][1], dec->future, false); in nouveau_vpe_mb_mv_header()
374 nouveau_decoder_surface_index(struct nouveau_decoder *dec, in nouveau_decoder_surface_index() argument
378 struct nouveau_pushbuf *push = dec->push; in nouveau_decoder_surface_index()
384 for (i = 0; i < dec->num_surfaces; ++i) { in nouveau_decoder_surface_index()
385 if (dec->surfaces[i] == buf) in nouveau_decoder_surface_index()
389 dec->surfaces[i] = buf; in nouveau_decoder_surface_index()
390 dec->num_surfaces++; in nouveau_decoder_surface_index()
392 nouveau_bufctx_reset(dec->bufctx, NV31_VIDEO_BIND_IMG(i)); in nouveau_decoder_surface_index()
394 #define BCTX_ARGS dec->bufctx, NV31_VIDEO_BIND_IMG(i), NOUVEAU_BO_RDWR in nouveau_decoder_surface_index()
417 struct nouveau_decoder *dec = (struct nouveau_decoder *)decoder; in nouveau_decoder_decode_macroblock() local
424 dec->current = nouveau_decoder_surface_index(dec, target); in nouveau_decoder_decode_macroblock()
425 assert(dec->current < 8); in nouveau_decoder_decode_macroblock()
426 dec->picture_structure = desc->picture_structure; in nouveau_decoder_decode_macroblock()
428 dec->future = nouveau_decoder_surface_index(dec, desc->ref[1]); in nouveau_decoder_decode_macroblock()
430 dec->past = nouveau_decoder_surface_index(dec, desc->ref[0]); in nouveau_decoder_decode_macroblock()
432 if (nouveau_vpe_init(dec)) return; in nouveau_decoder_decode_macroblock()
435 nouveau_vpe_write(dec, 0x720000c0); in nouveau_decoder_decode_macroblock()
436 nouveau_vpe_write(dec, dec->data_pos); in nouveau_decoder_decode_macroblock()
441 nouveau_vpe_mb_dct_header(dec, mb, true); in nouveau_decoder_decode_macroblock()
442 nouveau_vpe_mb_dct_header(dec, mb, false); in nouveau_decoder_decode_macroblock()
444 nouveau_vpe_mb_mv_header(dec, mb, true); in nouveau_decoder_decode_macroblock()
445 nouveau_vpe_mb_dct_header(dec, mb, true); in nouveau_decoder_decode_macroblock()
447 nouveau_vpe_mb_mv_header(dec, mb, false); in nouveau_decoder_decode_macroblock()
448 nouveau_vpe_mb_dct_header(dec, mb, false); in nouveau_decoder_decode_macroblock()
450 if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) in nouveau_decoder_decode_macroblock()
451 nouveau_vpe_mb_dct_blocks(dec, mb); in nouveau_decoder_decode_macroblock()
453 nouveau_vpe_mb_data_blocks(dec, mb); in nouveau_decoder_decode_macroblock()
467 struct nouveau_decoder *dec = (struct nouveau_decoder *)decoder; in nouveau_decoder_flush() local
468 if (dec->ofs) in nouveau_decoder_flush()
469 nouveau_vpe_fini(dec); in nouveau_decoder_flush()
475 struct nouveau_decoder *dec = (struct nouveau_decoder*)decoder; in nouveau_decoder_destroy() local
477 if (dec->data_bo) in nouveau_decoder_destroy()
478 nouveau_bo_ref(NULL, &dec->data_bo); in nouveau_decoder_destroy()
479 if (dec->cmd_bo) in nouveau_decoder_destroy()
480 nouveau_bo_ref(NULL, &dec->cmd_bo); in nouveau_decoder_destroy()
481 if (dec->fence_bo) in nouveau_decoder_destroy()
482 nouveau_bo_ref(NULL, &dec->fence_bo); in nouveau_decoder_destroy()
484 nouveau_object_del(&dec->mpeg); in nouveau_decoder_destroy()
486 if (dec->bufctx) in nouveau_decoder_destroy()
487 nouveau_bufctx_del(&dec->bufctx); in nouveau_decoder_destroy()
488 if (dec->push) in nouveau_decoder_destroy()
489 nouveau_pushbuf_del(&dec->push); in nouveau_decoder_destroy()
490 if (dec->client) in nouveau_decoder_destroy()
491 nouveau_client_del(&dec->client); in nouveau_decoder_destroy()
492 if (dec->chan) in nouveau_decoder_destroy()
493 nouveau_object_del(&dec->chan); in nouveau_decoder_destroy()
495 FREE(dec); in nouveau_decoder_destroy()
506 struct nouveau_decoder *dec; in nouveau_create_decoder() local
523 dec = CALLOC_STRUCT(nouveau_decoder); in nouveau_create_decoder()
524 if (!dec) in nouveau_create_decoder()
529 &nv04_data, sizeof(nv04_data), &dec->chan); in nouveau_create_decoder()
532 ret = nouveau_client_new(screen->device, &dec->client); in nouveau_create_decoder()
535 ret = nouveau_pushbuf_new(dec->client, dec->chan, 2, 4096, 1, &dec->push); in nouveau_create_decoder()
538 ret = nouveau_bufctx_new(dec->client, NV31_VIDEO_BIND_COUNT, &dec->bufctx); in nouveau_create_decoder()
541 push = dec->push; in nouveau_create_decoder()
547 ret = nouveau_object_new(dec->chan, 0xbeef8274, NV84_MPEG_CLASS, NULL, 0, in nouveau_create_decoder()
550 ret = nouveau_object_new(dec->chan, 0xbeef3174, NV31_MPEG_CLASS, NULL, 0, in nouveau_create_decoder()
557 dec->mpeg = mpeg; in nouveau_create_decoder()
558 dec->base = *templ; in nouveau_create_decoder()
559 dec->base.context = context; in nouveau_create_decoder()
560 dec->base.width = width; in nouveau_create_decoder()
561 dec->base.height = height; in nouveau_create_decoder()
562 dec->base.destroy = nouveau_decoder_destroy; in nouveau_create_decoder()
563 dec->base.begin_frame = nouveau_decoder_begin_frame; in nouveau_create_decoder()
564 dec->base.decode_macroblock = nouveau_decoder_decode_macroblock; in nouveau_create_decoder()
565 dec->base.end_frame = nouveau_decoder_end_frame; in nouveau_create_decoder()
566 dec->base.flush = nouveau_decoder_flush; in nouveau_create_decoder()
567 dec->screen = screen; in nouveau_create_decoder()
569 ret = nouveau_bo_new(dec->screen->device, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, in nouveau_create_decoder()
570 0, 1024 * 1024, NULL, &dec->cmd_bo); in nouveau_create_decoder()
574 ret = nouveau_bo_new(dec->screen->device, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, in nouveau_create_decoder()
575 0, width * height * 6, NULL, &dec->data_bo); in nouveau_create_decoder()
581 ret = nouveau_bo_new(dec->screen->device, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, in nouveau_create_decoder()
582 0, 4096, NULL, &dec->fence_bo); in nouveau_create_decoder()
585 nouveau_bo_map(dec->fence_bo, NOUVEAU_BO_RDWR, NULL); in nouveau_create_decoder()
586 dec->fence_map = dec->fence_bo->map; in nouveau_create_decoder()
587 dec->fence_map[0] = 0; in nouveau_create_decoder()
590 nouveau_pushbuf_bufctx(dec->push, dec->bufctx); in nouveau_create_decoder()
594 PUSH_DATA (push, dec->mpeg->handle); in nouveau_create_decoder()
622 PUSH_DATA (push, dec->fence_bo->offset); in nouveau_create_decoder()
623 PUSH_DATA (push, dec->fence_seq); in nouveau_create_decoder()
627 ret = nouveau_vpe_init(dec); in nouveau_create_decoder()
630 nouveau_vpe_fini(dec); in nouveau_create_decoder()
631 return &dec->base; in nouveau_create_decoder()
634 nouveau_decoder_destroy(&dec->base); in nouveau_create_decoder()