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