1848b8605Smrg#ifndef __NOUVEAU_VIDEO_H__ 2848b8605Smrg#define __NOUVEAU_VIDEO_H__ 3848b8605Smrg 4848b8605Smrg#include "nv17_mpeg.xml.h" 5848b8605Smrg#include "nv31_mpeg.xml.h" 6848b8605Smrg#include "nv_object.xml.h" 7848b8605Smrg 8848b8605Smrg#include "nouveau_winsys.h" 9848b8605Smrg 10848b8605Smrgstruct nouveau_video_buffer { 11848b8605Smrg struct pipe_video_buffer base; 12848b8605Smrg unsigned num_planes; 13848b8605Smrg struct pipe_resource *resources[VL_NUM_COMPONENTS]; 14848b8605Smrg struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS]; 15848b8605Smrg struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS]; 16848b8605Smrg struct pipe_surface *surfaces[VL_NUM_COMPONENTS * 2]; 17848b8605Smrg}; 18848b8605Smrg 19848b8605Smrgstruct nouveau_decoder { 20848b8605Smrg struct pipe_video_codec base; 21848b8605Smrg struct nouveau_screen *screen; 22848b8605Smrg struct nouveau_pushbuf *push; 23848b8605Smrg struct nouveau_object *chan; 24848b8605Smrg struct nouveau_client *client; 25848b8605Smrg struct nouveau_bufctx *bufctx; 26848b8605Smrg struct nouveau_object *mpeg; 27848b8605Smrg struct nouveau_bo *cmd_bo, *data_bo, *fence_bo; 28848b8605Smrg 29848b8605Smrg unsigned *fence_map; 30848b8605Smrg unsigned fence_seq; 31848b8605Smrg 32848b8605Smrg unsigned ofs; 33848b8605Smrg unsigned *cmds; 34848b8605Smrg 35848b8605Smrg unsigned *data; 36848b8605Smrg unsigned data_pos; 37848b8605Smrg unsigned picture_structure; 38848b8605Smrg 39848b8605Smrg unsigned past, future, current; 40848b8605Smrg unsigned num_surfaces; 41848b8605Smrg struct nouveau_video_buffer *surfaces[8]; 42848b8605Smrg}; 43848b8605Smrg 44848b8605Smrg#define NV31_VIDEO_BIND_IMG(i) i 45848b8605Smrg#define NV31_VIDEO_BIND_CMD NV31_MPEG_IMAGE_Y_OFFSET__LEN 46848b8605Smrg#define NV31_VIDEO_BIND_COUNT (NV31_MPEG_IMAGE_Y_OFFSET__LEN + 1) 47848b8605Smrg 48b8e80941Smrgstatic inline void 49848b8605Smrgnouveau_vpe_write(struct nouveau_decoder *dec, unsigned data) { 50848b8605Smrg dec->cmds[dec->ofs++] = data; 51848b8605Smrg} 52848b8605Smrg 53848b8605Smrg#define SUBC_MPEG(mthd) 1, mthd 54848b8605Smrg#define NV31_MPEG(mthd) SUBC_MPEG(NV31_MPEG_##mthd) 55848b8605Smrg#define NV84_MPEG(mthd) SUBC_MPEG(NV84_MPEG_##mthd) 56848b8605Smrg 57b8e80941Smrgstatic inline uint32_t 58848b8605SmrgNV04_FIFO_PKHDR(int subc, int mthd, unsigned size) 59848b8605Smrg{ 60848b8605Smrg return 0x00000000 | (size << 18) | (subc << 13) | mthd; 61848b8605Smrg} 62848b8605Smrg 63b8e80941Smrgstatic inline uint32_t 64848b8605SmrgNV04_FIFO_PKHDR_NI(int subc, int mthd, unsigned size) 65848b8605Smrg{ 66848b8605Smrg return 0x40000000 | (size << 18) | (subc << 13) | mthd; 67848b8605Smrg} 68848b8605Smrg 69b8e80941Smrgstatic inline void 70848b8605SmrgBEGIN_NV04(struct nouveau_pushbuf *push, int subc, int mthd, unsigned size) 71848b8605Smrg{ 72848b8605Smrg PUSH_SPACE(push, size + 1); 73848b8605Smrg PUSH_DATA (push, NV04_FIFO_PKHDR(subc, mthd, size)); 74848b8605Smrg} 75848b8605Smrg 76b8e80941Smrgstatic inline void 77848b8605SmrgBEGIN_NI04(struct nouveau_pushbuf *push, int subc, int mthd, unsigned size) 78848b8605Smrg{ 79848b8605Smrg PUSH_SPACE(push, size + 1); 80848b8605Smrg PUSH_DATA (push, NV04_FIFO_PKHDR_NI(subc, mthd, size)); 81848b8605Smrg} 82848b8605Smrg 83b8e80941Smrgstatic inline void 84848b8605SmrgPUSH_MTHDl(struct nouveau_pushbuf *push, int subc, int mthd, 85848b8605Smrg struct nouveau_bo *bo, uint32_t offset, 86b8e80941Smrg struct nouveau_bufctx *ctx, int bin, uint32_t rw) 87848b8605Smrg{ 88848b8605Smrg nouveau_bufctx_mthd(ctx, bin, NV04_FIFO_PKHDR(subc, mthd, 1), 89848b8605Smrg bo, offset, 90848b8605Smrg NOUVEAU_BO_LOW | (bo->flags & NOUVEAU_BO_APER) | rw, 91848b8605Smrg 0, 0); 92848b8605Smrg 93848b8605Smrg PUSH_DATA(push, bo->offset + offset); 94848b8605Smrg} 95848b8605Smrg 96848b8605Smrg#endif 97