Merge branch 'mesa_7_5_branch'
[mesa.git] / src / mesa / drivers / dri / r600 / r600_cmdbuf.h
1 /*
2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
3
4 The Weather Channel (TM) funded Tungsten Graphics to develop the
5 initial release of the Radeon 8500 driver under the XFree86 license.
6 This notice must be preserved.
7
8 Permission is hereby granted, free of charge, to any person obtaining
9 a copy of this software and associated documentation files (the
10 "Software"), to deal in the Software without restriction, including
11 without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense, and/or sell copies of the Software, and to
13 permit persons to whom the Software is furnished to do so, subject to
14 the following conditions:
15
16 The above copyright notice and this permission notice (including the
17 next paragraph) shall be included in all copies or substantial
18 portions of the Software.
19
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 **************************************************************************/
29
30 /**
31 * \file
32 *
33 * \author Nicolai Haehnle <prefect_@gmx.net>
34 */
35
36 #ifndef __R600_CMDBUF_H__
37 #define __R600_CMDBUF_H__
38
39 #include "r600_context.h"
40 #include "r600_emit.h"
41
42 #define RADEON_CP_PACKET3_NOP 0xC0001000
43 #define RADEON_CP_PACKET3_NEXT_CHAR 0xC0001900
44 #define RADEON_CP_PACKET3_PLY_NEXTSCAN 0xC0001D00
45 #define RADEON_CP_PACKET3_SET_SCISSORS 0xC0001E00
46 #define RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM 0xC0002300
47 #define RADEON_CP_PACKET3_LOAD_MICROCODE 0xC0002400
48 #define RADEON_CP_PACKET3_WAIT_FOR_IDLE 0xC0002600
49 #define RADEON_CP_PACKET3_3D_DRAW_VBUF 0xC0002800
50 #define RADEON_CP_PACKET3_3D_DRAW_IMMD 0xC0002900
51 #define RADEON_CP_PACKET3_3D_DRAW_INDX 0xC0002A00
52 #define RADEON_CP_PACKET3_LOAD_PALETTE 0xC0002C00
53 #define RADEON_CP_PACKET3_3D_LOAD_VBPNTR 0xC0002F00
54 #define RADEON_CP_PACKET3_CNTL_PAINT 0xC0009100
55 #define RADEON_CP_PACKET3_CNTL_BITBLT 0xC0009200
56 #define RADEON_CP_PACKET3_CNTL_SMALLTEXT 0xC0009300
57 #define RADEON_CP_PACKET3_CNTL_HOSTDATA_BLT 0xC0009400
58 #define RADEON_CP_PACKET3_CNTL_POLYLINE 0xC0009500
59 #define RADEON_CP_PACKET3_CNTL_POLYSCANLINES 0xC0009800
60 #define RADEON_CP_PACKET3_CNTL_PAINT_MULTI 0xC0009A00
61 #define RADEON_CP_PACKET3_CNTL_BITBLT_MULTI 0xC0009B00
62 #define RADEON_CP_PACKET3_CNTL_TRANS_BITBLT 0xC0009C00
63
64 /* r6xx/r7xx packet 3 type offsets */
65 #define R600_SET_CONFIG_REG_OFFSET 0x00008000
66 #define R600_SET_CONFIG_REG_END 0x0000ac00
67 #define R600_SET_CONTEXT_REG_OFFSET 0x00028000
68 #define R600_SET_CONTEXT_REG_END 0x00029000
69 #define R600_SET_ALU_CONST_OFFSET 0x00030000
70 #define R600_SET_ALU_CONST_END 0x00032000
71 #define R600_SET_RESOURCE_OFFSET 0x00038000
72 #define R600_SET_RESOURCE_END 0x0003c000
73 #define R600_SET_SAMPLER_OFFSET 0x0003c000
74 #define R600_SET_SAMPLER_END 0x0003cff0
75 #define R600_SET_CTL_CONST_OFFSET 0x0003cff0
76 #define R600_SET_CTL_CONST_END 0x0003e200
77 #define R600_SET_LOOP_CONST_OFFSET 0x0003e200
78 #define R600_SET_LOOP_CONST_END 0x0003e380
79 #define R600_SET_BOOL_CONST_OFFSET 0x0003e380
80 #define R600_SET_BOOL_CONST_END 0x00040000
81
82 /* r6xx/r7xx packet 3 types */
83 #define R600_IT_INDIRECT_BUFFER_END 0x00001700
84 #define R600_IT_SET_PREDICATION 0x00002000
85 #define R600_IT_REG_RMW 0x00002100
86 #define R600_IT_COND_EXEC 0x00002200
87 #define R600_IT_PRED_EXEC 0x00002300
88 #define R600_IT_START_3D_CMDBUF 0x00002400
89 #define R600_IT_DRAW_INDEX_2 0x00002700
90 #define R600_IT_CONTEXT_CONTROL 0x00002800
91 #define R600_IT_DRAW_INDEX_IMMD_BE 0x00002900
92 #define R600_IT_INDEX_TYPE 0x00002A00
93 #define R600_IT_DRAW_INDEX 0x00002B00
94 #define R600_IT_DRAW_INDEX_AUTO 0x00002D00
95 #define R600_IT_DRAW_INDEX_IMMD 0x00002E00
96 #define R600_IT_NUM_INSTANCES 0x00002F00
97 #define R600_IT_STRMOUT_BUFFER_UPDATE 0x00003400
98 #define R600_IT_INDIRECT_BUFFER_MP 0x00003800
99 #define R600_IT_MEM_SEMAPHORE 0x00003900
100 #define R600_IT_MPEG_INDEX 0x00003A00
101 #define R600_IT_WAIT_REG_MEM 0x00003C00
102 #define R600_IT_MEM_WRITE 0x00003D00
103 #define R600_IT_INDIRECT_BUFFER 0x00003200
104 #define R600_IT_CP_INTERRUPT 0x00004000
105 #define R600_IT_SURFACE_SYNC 0x00004300
106 #define R600_IT_ME_INITIALIZE 0x00004400
107 #define R600_IT_COND_WRITE 0x00004500
108 #define R600_IT_EVENT_WRITE 0x00004600
109 #define R600_IT_EVENT_WRITE_EOP 0x00004700
110 #define R600_IT_ONE_REG_WRITE 0x00005700
111 #define R600_IT_SET_CONFIG_REG 0x00006800
112 #define R600_IT_SET_CONTEXT_REG 0x00006900
113 #define R600_IT_SET_ALU_CONST 0x00006A00
114 #define R600_IT_SET_BOOL_CONST 0x00006B00
115 #define R600_IT_SET_LOOP_CONST 0x00006C00
116 #define R600_IT_SET_RESOURCE 0x00006D00
117 #define R600_IT_SET_SAMPLER 0x00006E00
118 #define R600_IT_SET_CTL_CONST 0x00006F00
119 #define R600_IT_SURFACE_BASE_UPDATE 0x00007300
120
121 struct r600_cs_manager_legacy
122 {
123 struct radeon_cs_manager base;
124 struct radeon_context *ctx;
125 /* hack for scratch stuff */
126 uint32_t pending_age;
127 uint32_t pending_count;
128 };
129
130 struct r600_cs_reloc_legacy {
131 struct radeon_cs_reloc base;
132 uint32_t cindices;
133 uint32_t *indices;
134 uint32_t *reloc_indices;
135 };
136
137 extern int r600_cs_write_reloc(struct radeon_cs *cs,
138 struct radeon_bo *bo,
139 uint32_t read_domain,
140 uint32_t write_domain,
141 uint32_t flags);
142
143 static inline void r600_cs_write_dword(struct radeon_cs *cs, uint32_t dword)
144 {
145 cs->packets[cs->cdw++] = dword;
146 }
147
148 struct radeon_cs_manager * r600_radeon_cs_manager_legacy_ctor(struct radeon_context *ctx);
149
150 /**
151 * Write one dword to the command buffer.
152 */
153 #define R600_OUT_BATCH(data) \
154 do { \
155 r600_cs_write_dword(b_l_rmesa->cmdbuf.cs, data);\
156 } while(0)
157
158 /**
159 * Write n dwords from ptr to the command buffer.
160 */
161 #define R600_OUT_BATCH_TABLE(ptr,n) \
162 do { \
163 int _i; \
164 for (_i=0; _i < n; _i++) {\
165 r600_cs_write_dword(b_l_rmesa->cmdbuf.cs, ptr[_i]);\
166 }\
167 } while(0)
168
169 /**
170 * Write a relocated dword to the command buffer.
171 */
172 #define R600_OUT_BATCH_RELOC(data, bo, offset, rd, wd, flags) \
173 do { \
174 if (0 && offset) { \
175 fprintf(stderr, "(%s:%s:%d) offset : %d\n", \
176 __FILE__, __FUNCTION__, __LINE__, offset); \
177 } \
178 r600_cs_write_dword(b_l_rmesa->cmdbuf.cs, offset); \
179 r600_cs_write_reloc(b_l_rmesa->cmdbuf.cs, \
180 bo, rd, wd, flags); \
181 } while(0)
182
183 /* R600/R700 */
184 #define R600_OUT_BATCH_REGS(reg, num) \
185 do { \
186 if ((reg) >= R600_SET_CONFIG_REG_OFFSET && (reg) < R600_SET_CONFIG_REG_END) { \
187 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CONFIG_REG, (num))); \
188 R600_OUT_BATCH(((reg) - R600_SET_CONFIG_REG_OFFSET) >> 2); \
189 } else if ((reg) >= R600_SET_CONTEXT_REG_OFFSET && (reg) < R600_SET_CONTEXT_REG_END) { \
190 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CONTEXT_REG, (num))); \
191 R600_OUT_BATCH(((reg) - R600_SET_CONTEXT_REG_OFFSET) >> 2); \
192 } else if ((reg) >= R600_SET_ALU_CONST_OFFSET && (reg) < R600_SET_ALU_CONST_END) { \
193 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_ALU_CONST, (num))); \
194 R600_OUT_BATCH(((reg) - R600_SET_ALU_CONST_OFFSET) >> 2); \
195 } else if ((reg) >= R600_SET_RESOURCE_OFFSET && (reg) < R600_SET_RESOURCE_END) { \
196 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, (num))); \
197 R600_OUT_BATCH(((reg) - R600_SET_RESOURCE_OFFSET) >> 2); \
198 } else if ((reg) >= R600_SET_SAMPLER_OFFSET && (reg) < R600_SET_SAMPLER_END) { \
199 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER, (num))); \
200 R600_OUT_BATCH(((reg) - R600_SET_SAMPLER_OFFSET) >> 2); \
201 } else if ((reg) >= R600_SET_CTL_CONST_OFFSET && (reg) < R600_SET_CTL_CONST_END) { \
202 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, (num))); \
203 R600_OUT_BATCH(((reg) - R600_SET_CTL_CONST_OFFSET) >> 2); \
204 } else if ((reg) >= R600_SET_LOOP_CONST_OFFSET && (reg) < R600_SET_LOOP_CONST_END) { \
205 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_LOOP_CONST, (num))); \
206 R600_OUT_BATCH(((reg) - R600_SET_LOOP_CONST_OFFSET) >> 2); \
207 } else if ((reg) >= R600_SET_BOOL_CONST_OFFSET && (reg) < R600_SET_BOOL_CONST_END) { \
208 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_BOOL_CONST, (num))); \
209 R600_OUT_BATCH(((reg) - R600_SET_BOOL_CONST_OFFSET) >> 2); \
210 } else { \
211 R600_OUT_BATCH(CP_PACKET0((reg), (num))); \
212 } \
213 } while (0)
214
215 /** Single register write to command buffer; requires 3 dwords for most things. */
216 #define R600_OUT_BATCH_REGVAL(reg, val) \
217 R600_OUT_BATCH_REGS((reg), 1); \
218 R600_OUT_BATCH((val))
219
220 /** Continuous register range write to command buffer; requires 1 dword,
221 * expects count dwords afterwards for register contents. */
222 #define R600_OUT_BATCH_REGSEQ(reg, count) \
223 R600_OUT_BATCH_REGS((reg), (count))
224
225 extern void r600InitCmdBuf(context_t *r600);
226
227 #endif /* __R600_CMDBUF_H__ */