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