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 
10 struct 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 
19 struct 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 
48 static INLINE void
nouveau_vpe_write(struct nouveau_decoder * dec,unsigned data)49 nouveau_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 
57 static INLINE uint32_t
NV04_FIFO_PKHDR(int subc,int mthd,unsigned size)58 NV04_FIFO_PKHDR(int subc, int mthd, unsigned size)
59 {
60    return 0x00000000 | (size << 18) | (subc << 13) | mthd;
61 }
62 
63 static INLINE uint32_t
NV04_FIFO_PKHDR_NI(int subc,int mthd,unsigned size)64 NV04_FIFO_PKHDR_NI(int subc, int mthd, unsigned size)
65 {
66    return 0x40000000 | (size << 18) | (subc << 13) | mthd;
67 }
68 
69 static INLINE void
BEGIN_NV04(struct nouveau_pushbuf * push,int subc,int mthd,unsigned size)70 BEGIN_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 
76 static INLINE void
BEGIN_NI04(struct nouveau_pushbuf * push,int subc,int mthd,unsigned size)77 BEGIN_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 
83 static INLINE void
PUSH_MTHDl(struct nouveau_pushbuf * push,int subc,int mthd,struct nouveau_bo * bo,uint32_t offset,struct nouveau_bufctx * ctx,int bin,uint32_t rw)84 PUSH_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