Home | History | Annotate | Download | only in radeon
      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