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