Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 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><>16)><16)>16)><16)>><> |