| #ifndef COMMON_CMDBUF_H |
| #define COMMON_CMDBUF_H |
| |
| GLboolean rcommonEnsureCmdBufSpace(radeonContextPtr rmesa, int dwords, const char *caller); |
| int rcommonFlushCmdBuf(radeonContextPtr rmesa, const char *caller); |
| int rcommonFlushCmdBufLocked(radeonContextPtr rmesa, const char *caller); |
| void rcommonInitCmdBuf(radeonContextPtr rmesa); |
| void rcommonDestroyCmdBuf(radeonContextPtr rmesa); |
| |
| void rcommonBeginBatch(radeonContextPtr rmesa, |
| int n, |
| int dostate, |
| const char *file, |
| const char *function, |
| int line); |
| |
| /* +r6/r7 : code here moved */ |
| |
| #define CP_PACKET2 (2 << 30) |
| #define CP_PACKET0(reg, n) (RADEON_CP_PACKET0 | ((n)<<16) | ((reg)>>2)) |
| #define CP_PACKET0_ONE(reg, n) (RADEON_CP_PACKET0 | RADEON_CP_PACKET0_ONE_REG_WR | ((n)<<16) | ((reg)>>2)) |
| #define CP_PACKET3(pkt, n) (RADEON_CP_PACKET3 | (pkt) | ((n) << 16)) |
| |
| /** |
| * Every function writing to the command buffer needs to declare this |
| * to get the necessary local variables. |
| */ |
| #define BATCH_LOCALS(rmesa) \ |
| const radeonContextPtr b_l_rmesa = rmesa |
| |
| /** |
| * Prepare writing n dwords to the command buffer, |
| * including producing any necessary state emits on buffer wraparound. |
| */ |
| #define BEGIN_BATCH(n) rcommonBeginBatch(b_l_rmesa, n, 1, __FILE__, __FUNCTION__, __LINE__) |
| |
| /** |
| * Same as BEGIN_BATCH, but do not cause automatic state emits. |
| */ |
| #define BEGIN_BATCH_NO_AUTOSTATE(n) rcommonBeginBatch(b_l_rmesa, n, 0, __FILE__, __FUNCTION__, __LINE__) |
| |
| /** |
| * Write one dword to the command buffer. |
| */ |
| #define OUT_BATCH(data) \ |
| do { \ |
| radeon_cs_write_dword(b_l_rmesa->cmdbuf.cs, data);\ |
| } while(0) |
| |
| /** |
| * Write a relocated dword to the command buffer. |
| */ |
| #define OUT_BATCH_RELOC(data, bo, offset, rd, wd, flags) \ |
| do { \ |
| int __offset = (offset); \ |
| if (0 && __offset) { \ |
| fprintf(stderr, "(%s:%s:%d) offset : %d\n", \ |
| __FILE__, __FUNCTION__, __LINE__, __offset); \ |
| } \ |
| radeon_cs_write_dword(b_l_rmesa->cmdbuf.cs, __offset); \ |
| radeon_cs_write_reloc(b_l_rmesa->cmdbuf.cs, \ |
| bo, rd, wd, flags); \ |
| } while(0) |
| |
| |
| /** |
| * Write n dwords from ptr to the command buffer. |
| */ |
| #define OUT_BATCH_TABLE(ptr,n) \ |
| do { \ |
| radeon_cs_write_table(b_l_rmesa->cmdbuf.cs, (ptr), (n));\ |
| } while(0) |
| |
| /** |
| * Finish writing dwords to the command buffer. |
| * The number of (direct or indirect) OUT_BATCH calls between the previous |
| * BEGIN_BATCH and END_BATCH must match the number specified at BEGIN_BATCH time. |
| */ |
| #define END_BATCH() \ |
| do { \ |
| radeon_cs_end(b_l_rmesa->cmdbuf.cs, __FILE__, __FUNCTION__, __LINE__);\ |
| } while(0) |
| |
| /** |
| * After the last END_BATCH() of rendering, this indicates that flushing |
| * the command buffer now is okay. |
| */ |
| #define COMMIT_BATCH() \ |
| do { \ |
| } while(0) |
| |
| |
| /** Single register write to command buffer; requires 2 dwords. */ |
| #define OUT_BATCH_REGVAL(reg, val) \ |
| OUT_BATCH(cmdpacket0(b_l_rmesa->radeonScreen, (reg), 1)); \ |
| OUT_BATCH((val)) |
| |
| /** Continuous register range write to command buffer; requires 1 dword, |
| * expects count dwords afterwards for register contents. */ |
| #define OUT_BATCH_REGSEQ(reg, count) \ |
| OUT_BATCH(cmdpacket0(b_l_rmesa->radeonScreen, (reg), (count))) |
| |
| /* +r6/r7 : code here moved */ |
| |
| /* Fire the buffered vertices no matter what. |
| */ |
| static INLINE void radeon_firevertices(radeonContextPtr radeon) |
| { |
| if (radeon->cmdbuf.cs->cdw || radeon->dma.flush ) |
| radeon->glCtx->Driver.Flush(radeon->glCtx); /* +r6/r7 */ |
| } |
| |
| #endif |