Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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
  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
  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
  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
  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
  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
  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.