11a51b76343255af9be6282f93614e92788ad4f0fDave Airlie#ifndef COMMON_CMDBUF_H
21a51b76343255af9be6282f93614e92788ad4f0fDave Airlie#define COMMON_CMDBUF_H
31a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
4c0f4063703265fc4009e6cadc2de79f553f99b1cPauli NieminenGLboolean rcommonEnsureCmdBufSpace(radeonContextPtr rmesa, int dwords, const char *caller);
51a51b76343255af9be6282f93614e92788ad4f0fDave Airlieint rcommonFlushCmdBuf(radeonContextPtr rmesa, const char *caller);
61a51b76343255af9be6282f93614e92788ad4f0fDave Airlieint rcommonFlushCmdBufLocked(radeonContextPtr rmesa, const char *caller);
71090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlievoid rcommonInitCmdBuf(radeonContextPtr rmesa);
81a51b76343255af9be6282f93614e92788ad4f0fDave Airlievoid rcommonDestroyCmdBuf(radeonContextPtr rmesa);
91a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
101a51b76343255af9be6282f93614e92788ad4f0fDave Airlievoid rcommonBeginBatch(radeonContextPtr rmesa,
111a51b76343255af9be6282f93614e92788ad4f0fDave Airlie		       int n,
121a51b76343255af9be6282f93614e92788ad4f0fDave Airlie		       int dostate,
131a51b76343255af9be6282f93614e92788ad4f0fDave Airlie		       const char *file,
141a51b76343255af9be6282f93614e92788ad4f0fDave Airlie		       const char *function,
151a51b76343255af9be6282f93614e92788ad4f0fDave Airlie		       int line);
161a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
17e2dcebd2e6b2af6269a5ece6d6ced73ec8bb4a47Richard Li/* +r6/r7 : code here moved */
1869edb8a156cb83e6658dfbe50f56ce4394a79e14Alex Deucher
19ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie#define CP_PACKET2  (2 << 30)
20ed3a1cce73fcd0d6f4b6e9b5f69a98ad179ddc4bDave Airlie#define CP_PACKET0(reg, n)	(RADEON_CP_PACKET0 | ((n)<<16) | ((reg)>>2))
21ab6edc9dce3ee0c63037c155a40d97a868c19341Dave Airlie#define CP_PACKET0_ONE(reg, n)	(RADEON_CP_PACKET0 | RADEON_CP_PACKET0_ONE_REG_WR | ((n)<<16) | ((reg)>>2))
2269edb8a156cb83e6658dfbe50f56ce4394a79e14Alex Deucher#define CP_PACKET3(pkt, n)	(RADEON_CP_PACKET3 | (pkt) | ((n) << 16))
231a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
241a51b76343255af9be6282f93614e92788ad4f0fDave Airlie/**
251a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * Every function writing to the command buffer needs to declare this
261a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * to get the necessary local variables.
271a51b76343255af9be6282f93614e92788ad4f0fDave Airlie */
281a51b76343255af9be6282f93614e92788ad4f0fDave Airlie#define BATCH_LOCALS(rmesa) \
291a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	const radeonContextPtr b_l_rmesa = rmesa
301a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
311a51b76343255af9be6282f93614e92788ad4f0fDave Airlie/**
321a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * Prepare writing n dwords to the command buffer,
331a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * including producing any necessary state emits on buffer wraparound.
341a51b76343255af9be6282f93614e92788ad4f0fDave Airlie */
351a51b76343255af9be6282f93614e92788ad4f0fDave Airlie#define BEGIN_BATCH(n) rcommonBeginBatch(b_l_rmesa, n, 1, __FILE__, __FUNCTION__, __LINE__)
361a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
371a51b76343255af9be6282f93614e92788ad4f0fDave Airlie/**
381a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * Same as BEGIN_BATCH, but do not cause automatic state emits.
391a51b76343255af9be6282f93614e92788ad4f0fDave Airlie */
4008d90fe8a5e12d92994c05b2ec9f68ab7232275cDave Airlie#define BEGIN_BATCH_NO_AUTOSTATE(n) rcommonBeginBatch(b_l_rmesa, n, 0, __FILE__, __FUNCTION__, __LINE__)
411a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
421a51b76343255af9be6282f93614e92788ad4f0fDave Airlie/**
431a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * Write one dword to the command buffer.
441a51b76343255af9be6282f93614e92788ad4f0fDave Airlie */
451a51b76343255af9be6282f93614e92788ad4f0fDave Airlie#define OUT_BATCH(data) \
461a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	do { \
471a51b76343255af9be6282f93614e92788ad4f0fDave Airlie        radeon_cs_write_dword(b_l_rmesa->cmdbuf.cs, data);\
481a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	} while(0)
491a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
501a51b76343255af9be6282f93614e92788ad4f0fDave Airlie/**
511a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * Write a relocated dword to the command buffer.
521a51b76343255af9be6282f93614e92788ad4f0fDave Airlie */
530a43603c1c714b4a87b3a282bdf1295ecda31713Dave Airlie#define OUT_BATCH_RELOC(data, bo, offset, rd, wd, flags) 	\
540a43603c1c714b4a87b3a282bdf1295ecda31713Dave Airlie	do { 							\
555d10890795d9bddc8cafc4afb19cacf164d6e667Pauli Nieminen	int  __offset = (offset);				\
565d10890795d9bddc8cafc4afb19cacf164d6e667Pauli Nieminen        if (0 && __offset) {					\
570a43603c1c714b4a87b3a282bdf1295ecda31713Dave Airlie            fprintf(stderr, "(%s:%s:%d) offset : %d\n",		\
585d10890795d9bddc8cafc4afb19cacf164d6e667Pauli Nieminen            __FILE__, __FUNCTION__, __LINE__, __offset);	\
590a43603c1c714b4a87b3a282bdf1295ecda31713Dave Airlie        }							\
605d10890795d9bddc8cafc4afb19cacf164d6e667Pauli Nieminen        radeon_cs_write_dword(b_l_rmesa->cmdbuf.cs, __offset);	\
610a43603c1c714b4a87b3a282bdf1295ecda31713Dave Airlie        radeon_cs_write_reloc(b_l_rmesa->cmdbuf.cs, 		\
620a43603c1c714b4a87b3a282bdf1295ecda31713Dave Airlie                              bo, rd, wd, flags);		\
631a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	} while(0)
641a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
651a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
661a51b76343255af9be6282f93614e92788ad4f0fDave Airlie/**
671a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * Write n dwords from ptr to the command buffer.
681a51b76343255af9be6282f93614e92788ad4f0fDave Airlie */
691a51b76343255af9be6282f93614e92788ad4f0fDave Airlie#define OUT_BATCH_TABLE(ptr,n) \
701a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	do { \
7166513ba884350c45226c3820d43bfa0b834b93c1Pauli Nieminen		radeon_cs_write_table(b_l_rmesa->cmdbuf.cs, (ptr), (n));\
721a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	} while(0)
731a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
741a51b76343255af9be6282f93614e92788ad4f0fDave Airlie/**
751a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * Finish writing dwords to the command buffer.
761a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * The number of (direct or indirect) OUT_BATCH calls between the previous
771a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * BEGIN_BATCH and END_BATCH must match the number specified at BEGIN_BATCH time.
781a51b76343255af9be6282f93614e92788ad4f0fDave Airlie */
791a51b76343255af9be6282f93614e92788ad4f0fDave Airlie#define END_BATCH() \
801a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	do { \
811a51b76343255af9be6282f93614e92788ad4f0fDave Airlie        radeon_cs_end(b_l_rmesa->cmdbuf.cs, __FILE__, __FUNCTION__, __LINE__);\
821a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	} while(0)
831a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
841a51b76343255af9be6282f93614e92788ad4f0fDave Airlie/**
851a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * After the last END_BATCH() of rendering, this indicates that flushing
861a51b76343255af9be6282f93614e92788ad4f0fDave Airlie * the command buffer now is okay.
871a51b76343255af9be6282f93614e92788ad4f0fDave Airlie */
881a51b76343255af9be6282f93614e92788ad4f0fDave Airlie#define COMMIT_BATCH() \
891a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	do { \
901a51b76343255af9be6282f93614e92788ad4f0fDave Airlie	} while(0)
911a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
921a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
9308d90fe8a5e12d92994c05b2ec9f68ab7232275cDave Airlie/** Single register write to command buffer; requires 2 dwords. */
9408d90fe8a5e12d92994c05b2ec9f68ab7232275cDave Airlie#define OUT_BATCH_REGVAL(reg, val) \
9508d90fe8a5e12d92994c05b2ec9f68ab7232275cDave Airlie	OUT_BATCH(cmdpacket0(b_l_rmesa->radeonScreen, (reg), 1)); \
9608d90fe8a5e12d92994c05b2ec9f68ab7232275cDave Airlie	OUT_BATCH((val))
971a51b76343255af9be6282f93614e92788ad4f0fDave Airlie
9808d90fe8a5e12d92994c05b2ec9f68ab7232275cDave Airlie/** Continuous register range write to command buffer; requires 1 dword,
9908d90fe8a5e12d92994c05b2ec9f68ab7232275cDave Airlie * expects count dwords afterwards for register contents. */
10008d90fe8a5e12d92994c05b2ec9f68ab7232275cDave Airlie#define OUT_BATCH_REGSEQ(reg, count) \
10169edb8a156cb83e6658dfbe50f56ce4394a79e14Alex Deucher	OUT_BATCH(cmdpacket0(b_l_rmesa->radeonScreen, (reg), (count)))
10208d90fe8a5e12d92994c05b2ec9f68ab7232275cDave Airlie
103e2dcebd2e6b2af6269a5ece6d6ced73ec8bb4a47Richard Li/* +r6/r7 : code here moved */
1041090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie
1051090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie/* Fire the buffered vertices no matter what.
1061090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie */
1071090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airliestatic INLINE void radeon_firevertices(radeonContextPtr radeon)
1081090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie{
1091090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   if (radeon->cmdbuf.cs->cdw || radeon->dma.flush )
110e2dcebd2e6b2af6269a5ece6d6ced73ec8bb4a47Richard Li      radeon->glCtx->Driver.Flush(radeon->glCtx); /* +r6/r7 */
1111090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie}
1121090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie
1131a51b76343255af9be6282f93614e92788ad4f0fDave Airlie#endif
114