Subversion Repositories Kolibri OS

Rev

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

  1. #ifndef COMMON_CMDBUF_H
  2. #define COMMON_CMDBUF_H
  3.  
  4. GLboolean rcommonEnsureCmdBufSpace(radeonContextPtr rmesa, int dwords, const char *caller);
  5. int rcommonFlushCmdBuf(radeonContextPtr rmesa, const char *caller);
  6. int rcommonFlushCmdBufLocked(radeonContextPtr rmesa, const char *caller);
  7. void rcommonInitCmdBuf(radeonContextPtr rmesa);
  8. void rcommonDestroyCmdBuf(radeonContextPtr rmesa);
  9.  
  10. void rcommonBeginBatch(radeonContextPtr rmesa,
  11.                        int n,
  12.                        int dostate,
  13.                        const char *file,
  14.                        const char *function,
  15.                        int line);
  16.  
  17. /* +r6/r7 : code here moved */
  18.  
  19. #define CP_PACKET2  (2 << 30)
  20. #define CP_PACKET0(reg, n)      (RADEON_CP_PACKET0 | ((n)<<16) | ((reg)>>2))
  21. #define CP_PACKET0_ONE(reg, n)  (RADEON_CP_PACKET0 | RADEON_CP_PACKET0_ONE_REG_WR | ((n)<<16) | ((reg)>>2))
  22. #define CP_PACKET3(pkt, n)      (RADEON_CP_PACKET3 | (pkt) | ((n) << 16))
  23.  
  24. /**
  25.  * Every function writing to the command buffer needs to declare this
  26.  * to get the necessary local variables.
  27.  */
  28. #define BATCH_LOCALS(rmesa) \
  29.         const radeonContextPtr b_l_rmesa = rmesa
  30.  
  31. /**
  32.  * Prepare writing n dwords to the command buffer,
  33.  * including producing any necessary state emits on buffer wraparound.
  34.  */
  35. #define BEGIN_BATCH(n) rcommonBeginBatch(b_l_rmesa, n, 1, __FILE__, __FUNCTION__, __LINE__)
  36.  
  37. /**
  38.  * Same as BEGIN_BATCH, but do not cause automatic state emits.
  39.  */
  40. #define BEGIN_BATCH_NO_AUTOSTATE(n) rcommonBeginBatch(b_l_rmesa, n, 0, __FILE__, __FUNCTION__, __LINE__)
  41.  
  42. /**
  43.  * Write one dword to the command buffer.
  44.  */
  45. #define OUT_BATCH(data) \
  46.         do { \
  47.         radeon_cs_write_dword(b_l_rmesa->cmdbuf.cs, data);\
  48.         } while(0)
  49.  
  50. /**
  51.  * Write a relocated dword to the command buffer.
  52.  */
  53. #define OUT_BATCH_RELOC(data, bo, offset, rd, wd, flags)        \
  54.         do {                                                    \
  55.         int  __offset = (offset);                               \
  56.         if (0 && __offset) {                                    \
  57.             fprintf(stderr, "(%s:%s:%d) offset : %d\n",         \
  58.             __FILE__, __FUNCTION__, __LINE__, __offset);        \
  59.         }                                                       \
  60.         radeon_cs_write_dword(b_l_rmesa->cmdbuf.cs, __offset);  \
  61.         radeon_cs_write_reloc(b_l_rmesa->cmdbuf.cs,             \
  62.                               bo, rd, wd, flags);               \
  63.         } while(0)
  64.  
  65.  
  66. /**
  67.  * Write n dwords from ptr to the command buffer.
  68.  */
  69. #define OUT_BATCH_TABLE(ptr,n) \
  70.         do { \
  71.                 radeon_cs_write_table(b_l_rmesa->cmdbuf.cs, (ptr), (n));\
  72.         } while(0)
  73.  
  74. /**
  75.  * Finish writing dwords to the command buffer.
  76.  * The number of (direct or indirect) OUT_BATCH calls between the previous
  77.  * BEGIN_BATCH and END_BATCH must match the number specified at BEGIN_BATCH time.
  78.  */
  79. #define END_BATCH() \
  80.         do { \
  81.         radeon_cs_end(b_l_rmesa->cmdbuf.cs, __FILE__, __FUNCTION__, __LINE__);\
  82.         } while(0)
  83.  
  84. /**
  85.  * After the last END_BATCH() of rendering, this indicates that flushing
  86.  * the command buffer now is okay.
  87.  */
  88. #define COMMIT_BATCH() \
  89.         do { \
  90.         } while(0)
  91.  
  92.  
  93. /** Single register write to command buffer; requires 2 dwords. */
  94. #define OUT_BATCH_REGVAL(reg, val) \
  95.         OUT_BATCH(cmdpacket0(b_l_rmesa->radeonScreen, (reg), 1)); \
  96.         OUT_BATCH((val))
  97.  
  98. /** Continuous register range write to command buffer; requires 1 dword,
  99.  * expects count dwords afterwards for register contents. */
  100. #define OUT_BATCH_REGSEQ(reg, count) \
  101.         OUT_BATCH(cmdpacket0(b_l_rmesa->radeonScreen, (reg), (count)))
  102.  
  103. /* +r6/r7 : code here moved */
  104.  
  105. /* Fire the buffered vertices no matter what.
  106.  */
  107. static INLINE void radeon_firevertices(radeonContextPtr radeon)
  108. {
  109.    if (radeon->cmdbuf.cs->cdw || radeon->dma.flush )
  110.       radeon->glCtx.Driver.Flush(&radeon->glCtx); /* +r6/r7 */
  111. }
  112.  
  113. #endif
  114.