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