1#ifndef __NOUVEAU_VIDEO_H__ 2#define __NOUVEAU_VIDEO_H__ 3 4#include "nv17_mpeg.xml.h" 5#include "nv31_mpeg.xml.h" 6#include "nv_object.xml.h" 7 8#include "nouveau_winsys.h" 9 10struct nouveau_video_buffer { 11 struct pipe_video_buffer base; 12 unsigned num_planes; 13 struct pipe_resource *resources[3]; 14 struct pipe_sampler_view *sampler_view_planes[3]; 15 struct pipe_sampler_view *sampler_view_components[3]; 16 struct pipe_surface *surfaces[3]; 17}; 18 19struct nouveau_decoder { 20 struct pipe_video_decoder base; 21 struct nouveau_screen *screen; 22 struct nouveau_pushbuf *push; 23 struct nouveau_object *chan; 24 struct nouveau_client *client; 25 struct nouveau_bufctx *bufctx; 26 struct nouveau_object *mpeg; 27 struct nouveau_bo *cmd_bo, *data_bo, *fence_bo; 28 29 unsigned *fence_map; 30 unsigned fence_seq; 31 32 unsigned ofs; 33 unsigned *cmds; 34 35 unsigned *data; 36 unsigned data_pos; 37 unsigned picture_structure; 38 39 unsigned past, future, current; 40 unsigned num_surfaces; 41 struct nouveau_video_buffer *surfaces[8]; 42}; 43 44#define NV31_VIDEO_BIND_IMG(i) i 45#define NV31_VIDEO_BIND_CMD NV31_MPEG_IMAGE_Y_OFFSET__LEN 46#define NV31_VIDEO_BIND_COUNT (NV31_MPEG_IMAGE_Y_OFFSET__LEN + 1) 47 48static INLINE void 49nouveau_vpe_write(struct nouveau_decoder *dec, unsigned data) { 50 dec->cmds[dec->ofs++] = data; 51} 52 53#define SUBC_MPEG(mthd) 1, mthd 54#define NV31_MPEG(mthd) SUBC_MPEG(NV31_MPEG_##mthd) 55#define NV84_MPEG(mthd) SUBC_MPEG(NV84_MPEG_##mthd) 56 57static INLINE uint32_t 58NV04_FIFO_PKHDR(int subc, int mthd, unsigned size) 59{ 60 return 0x00000000 | (size << 18) | (subc << 13) | mthd; 61} 62 63static INLINE uint32_t 64NV04_FIFO_PKHDR_NI(int subc, int mthd, unsigned size) 65{ 66 return 0x40000000 | (size << 18) | (subc << 13) | mthd; 67} 68 69static INLINE void 70BEGIN_NV04(struct nouveau_pushbuf *push, int subc, int mthd, unsigned size) 71{ 72 PUSH_SPACE(push, size + 1); 73 PUSH_DATA (push, NV04_FIFO_PKHDR(subc, mthd, size)); 74} 75 76static INLINE void 77BEGIN_NI04(struct nouveau_pushbuf *push, int subc, int mthd, unsigned size) 78{ 79 PUSH_SPACE(push, size + 1); 80 PUSH_DATA (push, NV04_FIFO_PKHDR_NI(subc, mthd, size)); 81} 82 83static INLINE void 84PUSH_MTHDl(struct nouveau_pushbuf *push, int subc, int mthd, 85 struct nouveau_bo *bo, uint32_t offset, 86 struct nouveau_bufctx *ctx, int bin, uint32_t rw) 87{ 88 nouveau_bufctx_mthd(ctx, bin, NV04_FIFO_PKHDR(subc, mthd, 1), 89 bo, offset, 90 NOUVEAU_BO_LOW | (bo->flags & NOUVEAU_BO_APER) | rw, 91 0, 0); 92 93 PUSH_DATA(push, bo->offset + offset); 94} 95 96#endif 97