r600c: remove stray unmap call
[mesa.git] / src / mesa / drivers / dri / r600 / evergreen_chip.c
1 /*
2 * Copyright (C) 2008-2010 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 */
21
22 /*
23 * Authors:
24 * Richard Li <RichardZ.Li@amd.com>, <richardradeon@gmail.com>
25 */
26
27 #include "main/imports.h"
28 #include "main/glheader.h"
29 #include "main/simple_list.h"
30
31 #include "r600_context.h"
32 #include "r600_cmdbuf.h"
33
34 #include "evergreen_chip.h"
35 #include "evergreen_off.h"
36 #include "evergreen_diff.h"
37 #include "evergreen_fragprog.h"
38 #include "evergreen_vertprog.h"
39
40 #include "radeon_mipmap_tree.h"
41
42 void evergreenCreateChip(context_t *context)
43 {
44 EVERGREEN_CHIP_CONTEXT * evergreen =
45 (EVERGREEN_CHIP_CONTEXT*) CALLOC(sizeof(EVERGREEN_CHIP_CONTEXT));
46
47 context->pChip = (void*)evergreen;
48 }
49
50 #define EVERGREEN_ALLOC_STATE( ATOM, CHK, SZ, EMIT ) \
51 do { \
52 context->evergreen_atoms.ATOM.cmd_size = (SZ); \
53 context->evergreen_atoms.ATOM.cmd = NULL; \
54 context->evergreen_atoms.ATOM.name = #ATOM; \
55 context->evergreen_atoms.ATOM.idx = 0; \
56 context->evergreen_atoms.ATOM.check = check_##CHK; \
57 context->evergreen_atoms.ATOM.dirty = GL_FALSE; \
58 context->evergreen_atoms.ATOM.emit = (EMIT); \
59 context->radeon.hw.max_state_size += (SZ); \
60 insert_at_tail(&context->radeon.hw.atomlist, &context->evergreen_atoms.ATOM); \
61 } while (0)
62
63 static int check_queryobj(GLcontext *ctx, struct radeon_state_atom *atom)
64 {
65 radeonContextPtr radeon = RADEON_CONTEXT(ctx);
66 struct radeon_query_object *query = radeon->query.current;
67 int count;
68
69 if (!query || query->emitted_begin)
70 count = 0;
71 else
72 count = atom->cmd_size;
73 radeon_print(RADEON_STATE, RADEON_TRACE, "%s %d\n", __func__, count);
74 return count;
75 }
76
77 static void evergreenSendQueryBegin(GLcontext *ctx, struct radeon_state_atom *atom)
78 {
79 radeonContextPtr radeon = RADEON_CONTEXT(ctx);
80 struct radeon_query_object *query = radeon->query.current;
81 BATCH_LOCALS(radeon);
82 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
83
84 /* clear the buffer */
85 radeon_bo_map(query->bo, GL_FALSE);
86 memset(query->bo->ptr, 0, 8 * 2 * sizeof(uint64_t)); /* 8 DBs, 2 qwords each */
87 radeon_bo_unmap(query->bo);
88
89 radeon_cs_space_check_with_bo(radeon->cmdbuf.cs,
90 query->bo,
91 0, RADEON_GEM_DOMAIN_GTT);
92
93 BEGIN_BATCH_NO_AUTOSTATE(4 + 2);
94 R600_OUT_BATCH(CP_PACKET3(R600_IT_EVENT_WRITE, 2));
95 R600_OUT_BATCH(R600_EVENT_TYPE(ZPASS_DONE) | R600_EVENT_INDEX(1));
96 R600_OUT_BATCH(query->curr_offset); /* hw writes qwords */
97 R600_OUT_BATCH(0x00000000);
98 R600_OUT_BATCH_RELOC(VGT_EVENT_INITIATOR, query->bo, 0, 0, RADEON_GEM_DOMAIN_GTT, 0);
99 END_BATCH();
100 query->emitted_begin = GL_TRUE;
101 }
102
103 static void evergreen_init_query_stateobj(radeonContextPtr radeon, int SZ)
104 {
105 radeon->query.queryobj.cmd_size = (SZ);
106 radeon->query.queryobj.cmd = NULL;
107 radeon->query.queryobj.name = "queryobj";
108 radeon->query.queryobj.idx = 0;
109 radeon->query.queryobj.check = check_queryobj;
110 radeon->query.queryobj.dirty = GL_FALSE;
111 radeon->query.queryobj.emit = evergreenSendQueryBegin;
112 radeon->hw.max_state_size += (SZ);
113 insert_at_tail(&radeon->hw.atomlist, &radeon->query.queryobj);
114 }
115
116
117 static int check_always(GLcontext *ctx, struct radeon_state_atom *atom)
118 {
119 return atom->cmd_size;
120 }
121
122 static void evergreenSendTexState(GLcontext *ctx, struct radeon_state_atom *atom)
123 {
124 context_t *context = EVERGREEN_CONTEXT(ctx);
125 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
126
127 struct evergreen_vertex_program *vp = context->selected_vp;
128
129 struct radeon_bo *bo = NULL;
130 unsigned int i;
131 unsigned int nBorderSet = 0;
132 BATCH_LOCALS(&context->radeon);
133
134 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
135
136 for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) {
137 if (ctx->Texture.Unit[i]._ReallyEnabled) {
138 radeonTexObj *t = evergreen->textures[i];
139
140 if (t) {
141 /* Tex resource */
142 if (!t->image_override) {
143 bo = t->mt->bo;
144 } else {
145 bo = t->bo;
146 }
147 if (bo)
148 {
149
150 r700SyncSurf(context, bo,
151 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM,
152 0, TC_ACTION_ENA_bit);
153
154 BEGIN_BATCH_NO_AUTOSTATE(10 + 4);
155 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 8));
156
157 if( (1<<i) & vp->r700AsmCode.unVetTexBits )
158 { /* vs texture */
159 R600_OUT_BATCH((i + VERT_ATTRIB_MAX + EG_SQ_FETCH_RESOURCE_VS_OFFSET) * EG_FETCH_RESOURCE_STRIDE);
160 }
161 else
162 {
163 R600_OUT_BATCH(i * EG_FETCH_RESOURCE_STRIDE);
164 }
165
166 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_RESOURCE0);
167 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_RESOURCE1);
168 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_RESOURCE2);
169 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_RESOURCE3);
170 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_RESOURCE4);
171 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_RESOURCE5);
172 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_RESOURCE6);
173 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_RESOURCE7);
174
175 R600_OUT_BATCH_RELOC(evergreen->textures[i]->SQ_TEX_RESOURCE2,
176 bo,
177 evergreen->textures[i]->SQ_TEX_RESOURCE2,
178 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
179 R600_OUT_BATCH_RELOC(evergreen->textures[i]->SQ_TEX_RESOURCE3,
180 bo,
181 evergreen->textures[i]->SQ_TEX_RESOURCE3,
182 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
183 END_BATCH();
184 COMMIT_BATCH();
185 }
186 /* Tex sampler */
187 BEGIN_BATCH_NO_AUTOSTATE(5);
188 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER, 3));
189
190 if( (1<<i) & vp->r700AsmCode.unVetTexBits )
191 { /* vs texture */
192 R600_OUT_BATCH((i+SQ_TEX_SAMPLER_VS_OFFSET) * 3);
193 }
194 else
195 {
196 R600_OUT_BATCH(i * 3);
197 }
198 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_SAMPLER0);
199 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_SAMPLER1);
200 R600_OUT_BATCH(evergreen->textures[i]->SQ_TEX_SAMPLER2);
201
202 END_BATCH();
203 COMMIT_BATCH();
204
205 /* Tex border color */
206 if(0 == nBorderSet)
207 {
208 BEGIN_BATCH_NO_AUTOSTATE(2 + 4);
209 R600_OUT_BATCH_REGSEQ(EG_TD_PS_BORDER_COLOR_RED, 4);
210 R600_OUT_BATCH(evergreen->textures[i]->TD_PS_SAMPLER0_BORDER_RED);
211 R600_OUT_BATCH(evergreen->textures[i]->TD_PS_SAMPLER0_BORDER_GREEN);
212 R600_OUT_BATCH(evergreen->textures[i]->TD_PS_SAMPLER0_BORDER_BLUE);
213 R600_OUT_BATCH(evergreen->textures[i]->TD_PS_SAMPLER0_BORDER_ALPHA);
214 END_BATCH();
215 COMMIT_BATCH();
216
217 nBorderSet = 1;
218 }
219 }
220 }
221 }
222 }
223
224 static int check_evergreen_tx(GLcontext *ctx, struct radeon_state_atom *atom)
225 {
226 context_t *context = EVERGREEN_CONTEXT(ctx);
227 unsigned int i, count = 0;
228 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
229
230 for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) {
231 if (ctx->Texture.Unit[i]._ReallyEnabled) {
232 radeonTexObj *t = evergreen->textures[i];
233 if (t)
234 count++;
235 }
236 }
237 radeon_print(RADEON_STATE, RADEON_TRACE, "%s %d\n", __func__, count);
238 return count * 37 + 6;
239 }
240
241 static void evergreenSendSQConfig(GLcontext *ctx, struct radeon_state_atom *atom)
242 {
243 context_t *context = EVERGREEN_CONTEXT(ctx);
244 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
245 BATCH_LOCALS(&context->radeon);
246 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
247
248 BEGIN_BATCH_NO_AUTOSTATE(19);
249 //6
250 EVERGREEN_OUT_BATCH_REGVAL(EG_SPI_CONFIG_CNTL, evergreen->evergreen_config.SPI_CONFIG_CNTL.u32All);
251 EVERGREEN_OUT_BATCH_REGVAL(EG_SPI_CONFIG_CNTL_1, evergreen->evergreen_config.SPI_CONFIG_CNTL_1.u32All);
252 //6
253 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_CONFIG, 4);
254 R600_OUT_BATCH(evergreen->evergreen_config.SQ_CONFIG.u32All);
255 R600_OUT_BATCH(evergreen->evergreen_config.SQ_GPR_RESOURCE_MGMT_1.u32All);
256 R600_OUT_BATCH(evergreen->evergreen_config.SQ_GPR_RESOURCE_MGMT_2.u32All);
257 R600_OUT_BATCH(evergreen->evergreen_config.SQ_GPR_RESOURCE_MGMT_3.u32All);
258 //7
259 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_THREAD_RESOURCE_MGMT, 5);
260 R600_OUT_BATCH(evergreen->evergreen_config.SQ_THREAD_RESOURCE_MGMT.u32All);
261 R600_OUT_BATCH(evergreen->evergreen_config.SQ_THREAD_RESOURCE_MGMT_2.u32All);
262 R600_OUT_BATCH(evergreen->evergreen_config.SQ_STACK_RESOURCE_MGMT_1.u32All);
263 R600_OUT_BATCH(evergreen->evergreen_config.SQ_STACK_RESOURCE_MGMT_2.u32All);
264 R600_OUT_BATCH(evergreen->evergreen_config.SQ_STACK_RESOURCE_MGMT_3.u32All);
265
266 END_BATCH();
267
268 COMMIT_BATCH();
269 }
270
271 extern int evergreen_getTypeSize(GLenum type);
272 static void evergreenSetupVTXConstants(GLcontext * ctx,
273 void * pAos,
274 StreamDesc * pStreamDesc)
275 {
276 context_t *context = EVERGREEN_CONTEXT(ctx);
277 struct radeon_aos * paos = (struct radeon_aos *)pAos;
278 unsigned int nVBsize;
279 BATCH_LOCALS(&context->radeon);
280
281 unsigned int uSQ_VTX_CONSTANT_WORD0_0;
282 unsigned int uSQ_VTX_CONSTANT_WORD1_0;
283 unsigned int uSQ_VTX_CONSTANT_WORD2_0 = 0;
284 unsigned int uSQ_VTX_CONSTANT_WORD3_0 = 0;
285 unsigned int uSQ_VTX_CONSTANT_WORD7_0 = 0;
286
287 if (!paos->bo)
288 return;
289
290 r700SyncSurf(context, paos->bo, RADEON_GEM_DOMAIN_GTT, 0, VC_ACTION_ENA_bit);
291
292 if(0 == pStreamDesc->stride)
293 {
294 nVBsize = paos->count * pStreamDesc->size * getTypeSize(pStreamDesc->type);
295 }
296 else
297 {
298 nVBsize = (paos->count - 1) * pStreamDesc->stride
299 + pStreamDesc->size * getTypeSize(pStreamDesc->type);
300 }
301
302 //uSQ_VTX_CONSTANT_WORD0_0
303 uSQ_VTX_CONSTANT_WORD0_0 = paos->offset;
304
305 //uSQ_VTX_CONSTANT_WORD1_0
306 uSQ_VTX_CONSTANT_WORD1_0 = nVBsize;
307
308 //uSQ_VTX_CONSTANT_WORD2_0
309 SETfield(uSQ_VTX_CONSTANT_WORD2_0,
310 pStreamDesc->stride,
311 SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift,
312 SQ_VTX_CONSTANT_WORD2_0__STRIDE_mask);
313 SETfield(uSQ_VTX_CONSTANT_WORD2_0, GetSurfaceFormat(pStreamDesc->type, pStreamDesc->size, NULL),
314 SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_shift,
315 SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_mask); // TODO : trace back api for initial data type, not only GL_FLOAT
316 SETfield(uSQ_VTX_CONSTANT_WORD2_0, 0, BASE_ADDRESS_HI_shift, BASE_ADDRESS_HI_mask); // TODO
317 if(GL_TRUE == pStreamDesc->normalize)
318 {
319 SETfield(uSQ_VTX_CONSTANT_WORD2_0, SQ_NUM_FORMAT_NORM,
320 SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift, SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_mask);
321 }
322 else
323 {
324 SETfield(uSQ_VTX_CONSTANT_WORD2_0, SQ_NUM_FORMAT_SCALED,
325 SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift, SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_mask);
326 }
327 if(1 == pStreamDesc->_signed)
328 {
329 SETbit(uSQ_VTX_CONSTANT_WORD2_0, SQ_VTX_CONSTANT_WORD2_0__FORMAT_COMP_ALL_bit);
330 }
331
332 //uSQ_VTX_CONSTANT_WORD3_0
333 SETfield(uSQ_VTX_CONSTANT_WORD3_0, SQ_SEL_X,
334 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_X_shift,
335 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_X_mask);
336 SETfield(uSQ_VTX_CONSTANT_WORD3_0, SQ_SEL_Y,
337 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Y_shift,
338 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Y_mask);
339 SETfield(uSQ_VTX_CONSTANT_WORD3_0, SQ_SEL_Z,
340 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Z_shift,
341 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Z_mask);
342 SETfield(uSQ_VTX_CONSTANT_WORD3_0, SQ_SEL_W,
343 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_W_shift,
344 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_W_mask);
345
346 //uSQ_VTX_CONSTANT_WORD7_0
347 SETfield(uSQ_VTX_CONSTANT_WORD7_0, SQ_TEX_VTX_VALID_BUFFER,
348 SQ_TEX_RESOURCE_WORD6_0__TYPE_shift, SQ_TEX_RESOURCE_WORD6_0__TYPE_mask);
349
350 BEGIN_BATCH_NO_AUTOSTATE(10 + 2);
351
352 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 8));
353 R600_OUT_BATCH((pStreamDesc->element + EG_SQ_FETCH_RESOURCE_VS_OFFSET) * EG_FETCH_RESOURCE_STRIDE);
354 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD0_0);
355 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD1_0);
356 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD2_0);
357 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD3_0);
358 R600_OUT_BATCH(0);
359 R600_OUT_BATCH(0);
360 R600_OUT_BATCH(0);
361 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD7_0);
362 R600_OUT_BATCH_RELOC(uSQ_VTX_CONSTANT_WORD0_0,
363 paos->bo,
364 uSQ_VTX_CONSTANT_WORD0_0,
365 RADEON_GEM_DOMAIN_GTT, 0, 0);
366 END_BATCH();
367
368 COMMIT_BATCH();
369 }
370
371 static int check_evergreen_vtx(GLcontext *ctx, struct radeon_state_atom *atom)
372 {
373 context_t *context = EVERGREEN_CONTEXT(ctx);
374 int count = context->radeon.tcl.aos_count * 12;
375
376 if (count)
377 count += 6;
378
379 radeon_print(RADEON_STATE, RADEON_TRACE, "%s %d\n", __func__, count);
380 return count;
381 }
382
383 static void evergreenSendVTX(GLcontext *ctx, struct radeon_state_atom *atom)
384 {
385 context_t *context = EVERGREEN_CONTEXT(ctx);
386 struct evergreen_vertex_program *vp = (struct evergreen_vertex_program *)(context->selected_vp);
387 unsigned int i, j = 0;
388 BATCH_LOCALS(&context->radeon);
389 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
390
391 if (context->radeon.tcl.aos_count == 0)
392 return;
393
394 BEGIN_BATCH_NO_AUTOSTATE(6);
395 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
396 R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
397 R600_OUT_BATCH(0);
398
399 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
400 R600_OUT_BATCH(mmSQ_VTX_START_INST_LOC - ASIC_CTL_CONST_BASE_INDEX);
401 R600_OUT_BATCH(0);
402 END_BATCH();
403 COMMIT_BATCH();
404
405 for(i=0; i<VERT_ATTRIB_MAX; i++) {
406 if(vp->mesa_program->Base.InputsRead & (1 << i))
407 {
408 evergreenSetupVTXConstants(ctx,
409 (void*)(&context->radeon.tcl.aos[j]),
410 &(context->stream_desc[j]));
411 j++;
412 }
413 }
414 }
415 static void evergreenSendPA(GLcontext *ctx, struct radeon_state_atom *atom)
416 {
417 context_t *context = EVERGREEN_CONTEXT(ctx);
418 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
419 BATCH_LOCALS(&context->radeon);
420 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
421 int id = 0;
422
423 BEGIN_BATCH_NO_AUTOSTATE(3);
424 EVERGREEN_OUT_BATCH_REGVAL(EG_PA_SU_HARDWARE_SCREEN_OFFSET, 0);
425 END_BATCH();
426
427 BEGIN_BATCH_NO_AUTOSTATE(22);
428 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_SCREEN_SCISSOR_TL, 2);
429 R600_OUT_BATCH(evergreen->PA_SC_SCREEN_SCISSOR_TL.u32All);
430 R600_OUT_BATCH(evergreen->PA_SC_SCREEN_SCISSOR_BR.u32All);
431
432 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_WINDOW_OFFSET, 12);
433 R600_OUT_BATCH(evergreen->PA_SC_WINDOW_OFFSET.u32All);
434 R600_OUT_BATCH(evergreen->PA_SC_WINDOW_SCISSOR_TL.u32All);
435 R600_OUT_BATCH(evergreen->PA_SC_WINDOW_SCISSOR_BR.u32All);
436 R600_OUT_BATCH(evergreen->PA_SC_CLIPRECT_RULE.u32All);
437 R600_OUT_BATCH(evergreen->PA_SC_CLIPRECT_0_TL.u32All);
438 R600_OUT_BATCH(evergreen->PA_SC_CLIPRECT_0_BR.u32All);
439 R600_OUT_BATCH(evergreen->PA_SC_CLIPRECT_1_TL.u32All);
440 R600_OUT_BATCH(evergreen->PA_SC_CLIPRECT_1_BR.u32All);
441 R600_OUT_BATCH(evergreen->PA_SC_CLIPRECT_2_TL.u32All);
442 R600_OUT_BATCH(evergreen->PA_SC_CLIPRECT_2_BR.u32All);
443 R600_OUT_BATCH(evergreen->PA_SC_CLIPRECT_3_TL.u32All);
444 R600_OUT_BATCH(evergreen->PA_SC_CLIPRECT_3_BR.u32All);
445
446 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_GENERIC_SCISSOR_TL, 2);
447 R600_OUT_BATCH(evergreen->PA_SC_GENERIC_SCISSOR_TL.u32All);
448 R600_OUT_BATCH(evergreen->PA_SC_GENERIC_SCISSOR_BR.u32All);
449 END_BATCH();
450
451 BEGIN_BATCH_NO_AUTOSTATE(3);
452 EVERGREEN_OUT_BATCH_REGVAL(EG_PA_SC_EDGERULE, evergreen->PA_SC_EDGERULE.u32All);
453 END_BATCH();
454
455
456 BEGIN_BATCH_NO_AUTOSTATE(18);
457 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_VPORT_SCISSOR_0_TL, 4);
458 R600_OUT_BATCH(evergreen->viewport[id].PA_SC_VPORT_SCISSOR_0_TL.u32All);
459 R600_OUT_BATCH(evergreen->viewport[id].PA_SC_VPORT_SCISSOR_0_BR.u32All);
460 R600_OUT_BATCH(evergreen->viewport[id].PA_SC_VPORT_SCISSOR_0_TL.u32All);
461 R600_OUT_BATCH(evergreen->viewport[id].PA_SC_VPORT_SCISSOR_0_BR.u32All);
462
463 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_VPORT_ZMIN_0, 2);
464 R600_OUT_BATCH(evergreen->viewport[id].PA_SC_VPORT_ZMIN_0.u32All);
465 R600_OUT_BATCH(evergreen->viewport[id].PA_SC_VPORT_ZMAX_0.u32All);
466
467 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_CL_VPORT_XSCALE, 6);
468 R600_OUT_BATCH(evergreen->viewport[id].PA_CL_VPORT_XSCALE.u32All);
469 R600_OUT_BATCH(evergreen->viewport[id].PA_CL_VPORT_XOFFSET.u32All);
470 R600_OUT_BATCH(evergreen->viewport[id].PA_CL_VPORT_YSCALE.u32All);
471 R600_OUT_BATCH(evergreen->viewport[id].PA_CL_VPORT_YOFFSET.u32All);
472 R600_OUT_BATCH(evergreen->viewport[id].PA_CL_VPORT_ZSCALE.u32All);
473 R600_OUT_BATCH(evergreen->viewport[id].PA_CL_VPORT_ZOFFSET.u32All);
474 END_BATCH();
475
476
477 for (id = 0; id < EVERGREEN_MAX_UCP; id++) {
478 if (evergreen->ucp[id].enabled) {
479 BEGIN_BATCH_NO_AUTOSTATE(6);
480 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_CL_UCP_0_X + (4 * id), 4);
481 R600_OUT_BATCH(evergreen->ucp[id].PA_CL_UCP_0_X.u32All);
482 R600_OUT_BATCH(evergreen->ucp[id].PA_CL_UCP_0_Y.u32All);
483 R600_OUT_BATCH(evergreen->ucp[id].PA_CL_UCP_0_Z.u32All);
484 R600_OUT_BATCH(evergreen->ucp[id].PA_CL_UCP_0_W.u32All);
485 END_BATCH();
486 }
487 }
488
489 BEGIN_BATCH_NO_AUTOSTATE(42);
490 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_CL_CLIP_CNTL, 5);
491 R600_OUT_BATCH(evergreen->PA_CL_CLIP_CNTL.u32All);
492 R600_OUT_BATCH(evergreen->PA_SU_SC_MODE_CNTL.u32All);
493 R600_OUT_BATCH(evergreen->PA_CL_VTE_CNTL.u32All);
494 R600_OUT_BATCH(evergreen->PA_CL_VS_OUT_CNTL.u32All);
495 R600_OUT_BATCH(evergreen->PA_CL_NANINF_CNTL.u32All);
496
497 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SU_POINT_SIZE, 3);
498 R600_OUT_BATCH(evergreen->PA_SU_POINT_SIZE.u32All);
499 R600_OUT_BATCH(evergreen->PA_SU_POINT_MINMAX.u32All);
500 R600_OUT_BATCH(evergreen->PA_SU_LINE_CNTL.u32All);
501
502 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_MODE_CNTL_0, 2);
503 R600_OUT_BATCH(evergreen->PA_SC_MODE_CNTL_0.u32All);
504 R600_OUT_BATCH(evergreen->PA_SC_MODE_CNTL_1.u32All);
505
506 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SU_POLY_OFFSET_DB_FMT_CNTL, 6);
507 R600_OUT_BATCH(evergreen->PA_SU_POLY_OFFSET_DB_FMT_CNTL.u32All);
508 R600_OUT_BATCH(evergreen->PA_SU_POLY_OFFSET_CLAMP.u32All);
509 R600_OUT_BATCH(evergreen->PA_SU_POLY_OFFSET_FRONT_SCALE.u32All);
510 R600_OUT_BATCH(evergreen->PA_SU_POLY_OFFSET_FRONT_OFFSET.u32All);
511 R600_OUT_BATCH(evergreen->PA_SU_POLY_OFFSET_BACK_SCALE.u32All);
512 R600_OUT_BATCH(evergreen->PA_SU_POLY_OFFSET_BACK_OFFSET.u32All);
513
514 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_LINE_CNTL, 16);
515 R600_OUT_BATCH(evergreen->PA_SC_LINE_CNTL.u32All);
516 R600_OUT_BATCH(evergreen->PA_SC_AA_CONFIG.u32All);
517 R600_OUT_BATCH(evergreen->PA_SU_VTX_CNTL.u32All);
518 R600_OUT_BATCH(evergreen->PA_CL_GB_VERT_CLIP_ADJ.u32All);
519 R600_OUT_BATCH(evergreen->PA_CL_GB_VERT_DISC_ADJ.u32All);
520 R600_OUT_BATCH(evergreen->PA_CL_GB_HORZ_CLIP_ADJ.u32All);
521 R600_OUT_BATCH(evergreen->PA_CL_GB_HORZ_DISC_ADJ.u32All);
522 R600_OUT_BATCH(evergreen->PA_SC_AA_SAMPLE_LOCS_0.u32All);
523 R600_OUT_BATCH(evergreen->PA_SC_AA_SAMPLE_LOCS_1.u32All);
524 R600_OUT_BATCH(evergreen->PA_SC_AA_SAMPLE_LOCS_2.u32All);
525 R600_OUT_BATCH(evergreen->PA_SC_AA_SAMPLE_LOCS_3.u32All);
526 R600_OUT_BATCH(evergreen->PA_SC_AA_SAMPLE_LOCS_4.u32All);
527 R600_OUT_BATCH(evergreen->PA_SC_AA_SAMPLE_LOCS_5.u32All);
528 R600_OUT_BATCH(evergreen->PA_SC_AA_SAMPLE_LOCS_6.u32All);
529 R600_OUT_BATCH(evergreen->PA_SC_AA_SAMPLE_LOCS_7.u32All);
530 R600_OUT_BATCH(evergreen->PA_SC_AA_MASK.u32All);
531
532 END_BATCH();
533
534 COMMIT_BATCH();
535 }
536 static void evergreenSendTP(GLcontext *ctx, struct radeon_state_atom *atom)
537 {
538 /*
539 context_t *context = EVERGREEN_CONTEXT(ctx);
540 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
541 BATCH_LOCALS(&context->radeon);
542 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
543
544 COMMIT_BATCH();
545 */
546 }
547
548 static void evergreenSendPSresource(GLcontext *ctx)
549 {
550 context_t *context = EVERGREEN_CONTEXT(ctx);
551 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
552 struct radeon_bo * pbo;
553
554 struct radeon_bo * pbo_const;
555
556 BATCH_LOCALS(&context->radeon);
557 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
558
559 pbo = (struct radeon_bo *)evergreenGetActiveFpShaderBo(GL_CONTEXT(context));
560
561 if (!pbo)
562 return;
563
564 r700SyncSurf(context, pbo, RADEON_GEM_DOMAIN_GTT, 0, SH_ACTION_ENA_bit);
565
566 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
567 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_START_PS, 1);
568 R600_OUT_BATCH(evergreen->ps.SQ_PGM_START_PS.u32All);
569 R600_OUT_BATCH_RELOC(evergreen->ps.SQ_PGM_START_PS.u32All,
570 pbo,
571 evergreen->ps.SQ_PGM_START_PS.u32All,
572 RADEON_GEM_DOMAIN_GTT, 0, 0);
573 END_BATCH();
574
575 BEGIN_BATCH_NO_AUTOSTATE(3);
576 EVERGREEN_OUT_BATCH_REGVAL(EG_SQ_LOOP_CONST_0, 0x01000FFF);
577 END_BATCH();
578
579 pbo_const = (struct radeon_bo *)(context->fp_Constbo);
580
581 if(NULL != pbo_const)
582 {
583 r700SyncSurf(context, pbo_const, RADEON_GEM_DOMAIN_GTT, 0, SH_ACTION_ENA_bit);
584
585 BEGIN_BATCH_NO_AUTOSTATE(3);
586
587 if(evergreen->ps.num_consts < 4)
588 {
589 EVERGREEN_OUT_BATCH_REGVAL(EG_SQ_ALU_CONST_BUFFER_SIZE_PS_0, 1);
590 }
591 else
592 {
593 EVERGREEN_OUT_BATCH_REGVAL(EG_SQ_ALU_CONST_BUFFER_SIZE_PS_0, (evergreen->ps.num_consts * 4)/16 );
594 }
595
596 END_BATCH();
597
598 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
599 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_ALU_CONST_CACHE_PS_0, 1);
600 R600_OUT_BATCH(context->fp_bo_offset >> 8);
601 R600_OUT_BATCH_RELOC(0,
602 pbo_const,
603 0,
604 RADEON_GEM_DOMAIN_GTT, 0, 0);
605 END_BATCH();
606 }
607
608 COMMIT_BATCH();
609 }
610
611 static void evergreenSendVSresource(GLcontext *ctx, struct radeon_state_atom *atom)
612 {
613 context_t *context = EVERGREEN_CONTEXT(ctx);
614 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
615 struct radeon_bo * pbo;
616
617 struct radeon_bo * pbo_const;
618
619 BATCH_LOCALS(&context->radeon);
620 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
621
622 pbo = (struct radeon_bo *)evergreenGetActiveVpShaderBo(GL_CONTEXT(context));
623
624 if (!pbo)
625 return;
626
627 r700SyncSurf(context, pbo, RADEON_GEM_DOMAIN_GTT, 0, SH_ACTION_ENA_bit);
628
629 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
630 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_START_VS, 1);
631 R600_OUT_BATCH(evergreen->vs.SQ_PGM_START_VS.u32All);
632 R600_OUT_BATCH_RELOC(evergreen->vs.SQ_PGM_START_VS.u32All,
633 pbo,
634 evergreen->vs.SQ_PGM_START_VS.u32All,
635 RADEON_GEM_DOMAIN_GTT, 0, 0);
636 END_BATCH();
637
638 BEGIN_BATCH_NO_AUTOSTATE(3);
639 EVERGREEN_OUT_BATCH_REGVAL((EG_SQ_LOOP_CONST_0 + 32*1), 0x0100000F); //consts == 1
640 //EVERGREEN_OUT_BATCH_REGVAL((EG_SQ_LOOP_CONST_0 + (SQ_LOOP_CONST_vs<2)), 0x0100000F);
641 END_BATCH();
642
643 pbo_const = (struct radeon_bo *)(context->vp_Constbo);
644
645 if(NULL != pbo_const)
646 {
647 r700SyncSurf(context, pbo_const, RADEON_GEM_DOMAIN_GTT, 0, SH_ACTION_ENA_bit);
648
649 BEGIN_BATCH_NO_AUTOSTATE(3);
650
651 if(evergreen->vs.num_consts < 4)
652 {
653 EVERGREEN_OUT_BATCH_REGVAL(EG_SQ_ALU_CONST_BUFFER_SIZE_VS_0, 1);
654 }
655 else
656 {
657 EVERGREEN_OUT_BATCH_REGVAL(EG_SQ_ALU_CONST_BUFFER_SIZE_VS_0, (evergreen->vs.num_consts * 4)/16 );
658 }
659
660 END_BATCH();
661
662 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
663 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_ALU_CONST_CACHE_VS_0, 1);
664 R600_OUT_BATCH(context->vp_bo_offset >> 8);
665 R600_OUT_BATCH_RELOC(0,
666 pbo_const,
667 0,
668 RADEON_GEM_DOMAIN_GTT, 0, 0);
669 END_BATCH();
670 }
671
672 COMMIT_BATCH();
673 }
674
675 static void evergreenSendSQ(GLcontext *ctx, struct radeon_state_atom *atom)
676 {
677 context_t *context = EVERGREEN_CONTEXT(ctx);
678 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
679 BATCH_LOCALS(&context->radeon);
680 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
681
682 evergreenSendPSresource(ctx); //16 entries now
683
684 BEGIN_BATCH_NO_AUTOSTATE(77);
685
686 //34
687 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_VTX_SEMANTIC_0, 32);
688 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_0.u32All); //// // = 0x28380, // SAME
689 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_1.u32All); //// // = 0x28384, // SAME
690 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_2.u32All); //// // = 0x28388, // SAME
691 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_3.u32All); //// // = 0x2838C, // SAME
692 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_4.u32All); //// // = 0x28390, // SAME
693 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_5.u32All); //// // = 0x28394, // SAME
694 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_6.u32All); //// // = 0x28398, // SAME
695 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_7.u32All); //// // = 0x2839C, // SAME
696 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_8.u32All); //// // = 0x283A0, // SAME
697 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_9.u32All); //// // = 0x283A4, // SAME
698 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_10.u32All); //// // = 0x283A8, // SAME
699 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_11.u32All); //// // = 0x283AC, // SAME
700 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_12.u32All); //// // = 0x283B0, // SAME
701 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_13.u32All); //// // = 0x283B4, // SAME
702 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_14.u32All); //// // = 0x283B8, // SAME
703 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_15.u32All); //// // = 0x283BC, // SAME
704 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_16.u32All); //// // = 0x283C0, // SAME
705 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_17.u32All); //// // = 0x283C4, // SAME
706 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_18.u32All); //// // = 0x283C8, // SAME
707 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_19.u32All); //// // = 0x283CC, // SAME
708 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_20.u32All); //// // = 0x283D0, // SAME
709 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_21.u32All); //// // = 0x283D4, // SAME
710 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_22.u32All); //// // = 0x283D8, // SAME
711 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_23.u32All); //// // = 0x283DC, // SAME
712 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_24.u32All); //// // = 0x283E0, // SAME
713 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_25.u32All); //// // = 0x283E4, // SAME
714 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_26.u32All); //// // = 0x283E8, // SAME
715 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_27.u32All); //// // = 0x283EC, // SAME
716 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_28.u32All); //// // = 0x283F0, // SAME
717 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_29.u32All); //// // = 0x283F4, // SAME
718 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_30.u32All); //// // = 0x283F8, // SAME
719 R600_OUT_BATCH(evergreen->SQ_VTX_SEMANTIC_31.u32All); //// // = 0x283FC, // SAME
720
721
722 //3
723 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_DYN_GPR_RESOURCE_LIMIT_1, 1);
724 R600_OUT_BATCH(evergreen->SQ_DYN_GPR_RESOURCE_LIMIT_1.u32All);//// // = 0x28838, //
725
726 //5
727 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_RESOURCES_PS, 3);
728 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_PS.u32All); //// // = 0x28844, // DIFF 0x28850
729 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_2_PS.u32All); //// // = 0x28848, //
730 R600_OUT_BATCH(evergreen->SQ_PGM_EXPORTS_PS.u32All); //// // = 0x2884C, // SAME 0x28854
731
732 //4
733 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_RESOURCES_VS, 2);
734 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_VS.u32All);//// // = 0x28860, // DIFF 0x28868
735 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_2_VS.u32All); //// // = 0x28864, //
736
737 //5
738 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_RESOURCES_GS, 2);
739 /*
740 R600_OUT_BATCH(evergreen->SQ_PGM_START_GS.u32All); //// // = 0x28874, // SAME 0x2886C
741 */
742 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_GS.u32All); //// // = 0x28878, // DIFF 0x2887C
743 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_2_GS.u32All); //// // = 0x2887C, //
744
745 //5
746 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_RESOURCES_ES, 2);
747 /*
748 R600_OUT_BATCH(evergreen->SQ_PGM_START_ES.u32All); //// // = 0x2888C, // SAME 0x28880
749 */
750 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_ES.u32All); //// // = 0x28890, // DIFF
751 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_2_ES.u32All); //// // = 0x28894, //
752
753 //4
754 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_RESOURCES_FS, 1);
755 /*
756 R600_OUT_BATCH(evergreen->SQ_PGM_START_FS.u32All); //// // = 0x288A4, // SAME 0x28894
757 */
758 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_FS.u32All); //// // = 0x288A8, // DIFF 0x288A4
759
760 //3
761 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_RESOURCES_2_HS, 1);
762 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_2_HS.u32All);//// // = 0x288C0, //
763
764 //3
765 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_RESOURCES_2_LS, 1);
766 R600_OUT_BATCH(evergreen->SQ_PGM_RESOURCES_2_LS.u32All); //// // = 0x288D8, //
767
768 //3
769 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_LDS_ALLOC_PS, 1);
770 R600_OUT_BATCH(evergreen->SQ_LDS_ALLOC_PS.u32All); //// // = 0x288EC, //
771
772 //8
773 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_ESGS_RING_ITEMSIZE, 6);
774 R600_OUT_BATCH(evergreen->SQ_ESGS_RING_ITEMSIZE.u32All); //// // = 0x28900, // SAME 0x288A8
775 R600_OUT_BATCH(evergreen->SQ_GSVS_RING_ITEMSIZE.u32All); //// // = 0x28904, // SAME 0x288AC
776 R600_OUT_BATCH(evergreen->SQ_ESTMP_RING_ITEMSIZE.u32All); //// // = 0x28908, // SAME 0x288B0
777 R600_OUT_BATCH(evergreen->SQ_GSTMP_RING_ITEMSIZE.u32All); //// // = 0x2890C, // SAME 0x288B4
778 R600_OUT_BATCH(evergreen->SQ_VSTMP_RING_ITEMSIZE.u32All); //// // = 0x28910, // SAME 0x288B8
779 R600_OUT_BATCH(evergreen->SQ_PSTMP_RING_ITEMSIZE.u32All); //// // = 0x28914, // SAME 0x288BC
780
781 //3
782 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_GS_VERT_ITEMSIZE, 1);
783 R600_OUT_BATCH(evergreen->SQ_GS_VERT_ITEMSIZE.u32All); //// // = 0x2891C, // SAME 0x288C8
784
785 END_BATCH();
786
787 COMMIT_BATCH();
788
789 }
790 static void evergreenSendSPI(GLcontext *ctx, struct radeon_state_atom *atom)
791 {
792 context_t *context = EVERGREEN_CONTEXT(ctx);
793 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
794 BATCH_LOCALS(&context->radeon);
795 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
796
797 BEGIN_BATCH_NO_AUTOSTATE(59);
798
799 EVERGREEN_OUT_BATCH_REGSEQ(EG_SPI_VS_OUT_ID_0, 10);
800 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_0.u32All);
801 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_1.u32All);
802 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_2.u32All);
803 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_3.u32All);
804 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_4.u32All);
805 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_5.u32All);
806 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_6.u32All);
807 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_7.u32All);
808 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_8.u32All);
809 R600_OUT_BATCH(evergreen->SPI_VS_OUT_ID_9.u32All);
810
811 EVERGREEN_OUT_BATCH_REGSEQ(EG_SPI_PS_INPUT_CNTL_0, 45);
812 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[0].u32All);
813 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[1].u32All);
814 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[2].u32All);
815 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[3].u32All);
816 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[4].u32All);
817 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[5].u32All);
818 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[6].u32All);
819 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[7].u32All);
820 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[8].u32All);
821 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[9].u32All);
822 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[10].u32All);
823 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[11].u32All);
824 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[12].u32All);
825 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[13].u32All);
826 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[14].u32All);
827 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[15].u32All);
828 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[16].u32All);
829 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[17].u32All);
830 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[18].u32All);
831 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[19].u32All);
832 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[20].u32All);
833 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[21].u32All);
834 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[22].u32All);
835 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[23].u32All);
836 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[24].u32All);
837 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[25].u32All);
838 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[26].u32All);
839 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[27].u32All);
840 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[28].u32All);
841 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[29].u32All);
842 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[30].u32All);
843 R600_OUT_BATCH(evergreen->SPI_PS_INPUT_CNTL[31].u32All);
844 R600_OUT_BATCH(evergreen->SPI_VS_OUT_CONFIG.u32All);
845 R600_OUT_BATCH(evergreen->SPI_THREAD_GROUPING.u32All);
846 R600_OUT_BATCH(evergreen->SPI_PS_IN_CONTROL_0.u32All);
847 R600_OUT_BATCH(evergreen->SPI_PS_IN_CONTROL_1.u32All);
848 R600_OUT_BATCH(evergreen->SPI_INTERP_CONTROL_0.u32All);
849 R600_OUT_BATCH(evergreen->SPI_INPUT_Z.u32All);
850 R600_OUT_BATCH(evergreen->SPI_FOG_CNTL.u32All);
851 R600_OUT_BATCH(evergreen->SPI_BARYC_CNTL.u32All);
852 R600_OUT_BATCH(evergreen->SPI_PS_IN_CONTROL_2.u32All);
853 R600_OUT_BATCH(evergreen->SPI_COMPUTE_INPUT_CNTL.u32All);
854 R600_OUT_BATCH(evergreen->SPI_COMPUTE_NUM_THREAD_X.u32All);
855 R600_OUT_BATCH(evergreen->SPI_COMPUTE_NUM_THREAD_Y.u32All);
856 R600_OUT_BATCH(evergreen->SPI_COMPUTE_NUM_THREAD_Z.u32All);
857
858 END_BATCH();
859
860 COMMIT_BATCH();
861 }
862 static void evergreenSendSX(GLcontext *ctx, struct radeon_state_atom *atom)
863 {
864 context_t *context = EVERGREEN_CONTEXT(ctx);
865 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
866 BATCH_LOCALS(&context->radeon);
867 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
868
869 BEGIN_BATCH_NO_AUTOSTATE(9);
870
871 EVERGREEN_OUT_BATCH_REGVAL(EG_SX_MISC, evergreen->SX_MISC.u32All);
872 EVERGREEN_OUT_BATCH_REGVAL(EG_SX_ALPHA_TEST_CONTROL, evergreen->SX_ALPHA_TEST_CONTROL.u32All);
873 EVERGREEN_OUT_BATCH_REGVAL(EG_SX_ALPHA_REF, evergreen->SX_ALPHA_REF.u32All);
874
875 END_BATCH();
876
877 COMMIT_BATCH();
878 }
879
880 static void evergreenSetDepthTarget(context_t *context)
881 {
882 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
883 struct radeon_renderbuffer *rrb;
884 unsigned int nPitchInPixel;
885
886 rrb = radeon_get_depthbuffer(&context->radeon);
887 if (!rrb)
888 {
889 return;
890 }
891
892 EVERGREEN_STATECHANGE(context, db);
893
894 evergreen->DB_DEPTH_SIZE.u32All = 0;
895
896 SETfield(evergreen->DB_DEPTH_SIZE.u32All, (nPitchInPixel/8)-1,
897 EG_DB_DEPTH_SIZE__PITCH_TILE_MAX_shift,
898 EG_DB_DEPTH_SIZE__PITCH_TILE_MAX_mask);
899 SETfield(evergreen->DB_DEPTH_SIZE.u32All, (context->radeon.radeonScreen->driScreen->fbHeight/8)-1,
900 EG_DB_DEPTH_SIZE__HEIGHT_TILE_MAX_shift,
901 EG_DB_DEPTH_SIZE__HEIGHT_TILE_MAX_mask);
902 evergreen->DB_DEPTH_SLICE.u32All = ( (nPitchInPixel * context->radeon.radeonScreen->driScreen->fbHeight)/64 )-1;
903
904 if(4 == rrb->cpp)
905 {
906 SETfield(evergreen->DB_Z_INFO.u32All, DEPTH_8_24,
907 EG_DB_Z_INFO__FORMAT_shift,
908 EG_DB_Z_INFO__FORMAT_mask);
909 }
910 else
911 {
912 SETfield(evergreen->DB_Z_INFO.u32All, DEPTH_16,
913 EG_DB_Z_INFO__FORMAT_shift,
914 EG_DB_Z_INFO__FORMAT_mask);
915 }
916 SETfield(evergreen->DB_Z_INFO.u32All, ARRAY_1D_TILED_THIN1,
917 EG_DB_Z_INFO__ARRAY_MODE_shift,
918 EG_DB_Z_INFO__ARRAY_MODE_mask);
919 }
920
921 static void evergreenSendDB(GLcontext *ctx, struct radeon_state_atom *atom)
922 {
923 context_t *context = EVERGREEN_CONTEXT(ctx);
924 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
925 struct radeon_renderbuffer *rrb;
926 BATCH_LOCALS(&context->radeon);
927 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
928
929 evergreenSetDepthTarget(context);
930
931 //8
932 BEGIN_BATCH_NO_AUTOSTATE(7);
933 EVERGREEN_OUT_BATCH_REGSEQ(EG_DB_RENDER_CONTROL, 5);
934 R600_OUT_BATCH(evergreen->DB_RENDER_CONTROL.u32All);
935 R600_OUT_BATCH(evergreen->DB_COUNT_CONTROL.u32All);
936 R600_OUT_BATCH(evergreen->DB_DEPTH_VIEW.u32All);
937 R600_OUT_BATCH(evergreen->DB_RENDER_OVERRIDE.u32All);
938 R600_OUT_BATCH(evergreen->DB_RENDER_OVERRIDE2.u32All);
939 END_BATCH();
940
941 //4
942 BEGIN_BATCH_NO_AUTOSTATE(4);
943 EVERGREEN_OUT_BATCH_REGSEQ(EG_DB_STENCIL_CLEAR, 2);
944 R600_OUT_BATCH(evergreen->DB_STENCIL_CLEAR.u32All);
945 R600_OUT_BATCH(evergreen->DB_DEPTH_CLEAR.u32All);
946 END_BATCH();
947
948 //4
949 BEGIN_BATCH_NO_AUTOSTATE(4);
950 EVERGREEN_OUT_BATCH_REGSEQ(EG_DB_DEPTH_SIZE, 2);
951 R600_OUT_BATCH(evergreen->DB_DEPTH_SIZE.u32All);
952 R600_OUT_BATCH(evergreen->DB_DEPTH_SLICE.u32All);
953 END_BATCH();
954
955 //3
956 BEGIN_BATCH_NO_AUTOSTATE(3);
957 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_DEPTH_CONTROL, evergreen->DB_DEPTH_CONTROL.u32All);
958 END_BATCH();
959
960 //3
961 BEGIN_BATCH_NO_AUTOSTATE(3);
962 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_SHADER_CONTROL, evergreen->DB_SHADER_CONTROL.u32All);
963 END_BATCH();
964
965 //5
966 BEGIN_BATCH_NO_AUTOSTATE(5);
967 EVERGREEN_OUT_BATCH_REGSEQ(EG_DB_SRESULTS_COMPARE_STATE0, 3);
968 R600_OUT_BATCH(evergreen->DB_SRESULTS_COMPARE_STATE0.u32All);
969 R600_OUT_BATCH(evergreen->DB_SRESULTS_COMPARE_STATE1.u32All);
970 R600_OUT_BATCH(evergreen->DB_PRELOAD_CONTROL.u32All);
971 END_BATCH();
972
973 //3
974 BEGIN_BATCH_NO_AUTOSTATE(3);
975 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_ALPHA_TO_MASK, evergreen->DB_ALPHA_TO_MASK.u32All);
976 END_BATCH();
977
978 rrb = radeon_get_depthbuffer(&context->radeon);
979 if( (rrb != NULL) && (rrb->bo != NULL) )
980 {
981
982 /* make the hw happy */
983 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
984 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_HTILE_DATA_BASE, evergreen->DB_HTILE_DATA_BASE.u32All);
985 R600_OUT_BATCH_RELOC(evergreen->DB_HTILE_DATA_BASE.u32All,
986 rrb->bo,
987 evergreen->DB_HTILE_DATA_BASE.u32All,
988 0, RADEON_GEM_DOMAIN_VRAM, 0);
989 END_BATCH();
990
991 //5
992 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
993 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_Z_INFO, evergreen->DB_Z_INFO.u32All);
994 R600_OUT_BATCH_RELOC(evergreen->DB_Z_INFO.u32All,
995 rrb->bo,
996 evergreen->DB_Z_INFO.u32All,
997 0, RADEON_GEM_DOMAIN_VRAM, 0);
998 END_BATCH();
999
1000 //5
1001 if((evergreen->DB_DEPTH_CONTROL.u32All & Z_ENABLE_bit) > 0)
1002 {
1003 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
1004 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_Z_READ_BASE, evergreen->DB_Z_READ_BASE.u32All);
1005 R600_OUT_BATCH_RELOC(evergreen->DB_Z_READ_BASE.u32All,
1006 rrb->bo,
1007 evergreen->DB_Z_READ_BASE.u32All,
1008 0, RADEON_GEM_DOMAIN_VRAM, 0);
1009 END_BATCH();
1010 }
1011 //5
1012 if((evergreen->DB_DEPTH_CONTROL.u32All & Z_WRITE_ENABLE_bit) > 0)
1013 {
1014 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
1015 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_Z_WRITE_BASE, evergreen->DB_Z_READ_BASE.u32All);
1016 R600_OUT_BATCH_RELOC(evergreen->DB_Z_WRITE_BASE.u32All,
1017 rrb->bo,
1018 evergreen->DB_Z_WRITE_BASE.u32All,
1019 0, RADEON_GEM_DOMAIN_VRAM, 0);
1020 END_BATCH();
1021 }
1022 }
1023 /*
1024 if (ctx->DrawBuffer)
1025 {
1026 rrb = radeon_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL);
1027
1028 if((rrb != NULL) && (rrb->bo != NULL))
1029 {
1030 //5
1031 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
1032 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_STENCIL_INFO, evergreen->DB_Z_INFO.u32All);
1033 R600_OUT_BATCH_RELOC(evergreen->DB_STENCIL_INFO.u32All,
1034 rrb->bo,
1035 evergreen->DB_STENCIL_INFO.u32All,
1036 0, RADEON_GEM_DOMAIN_VRAM, 0);
1037 END_BATCH();
1038
1039 //10
1040 if((evergreen->DB_DEPTH_CONTROL.u32All & STENCIL_ENABLE_bit) > 0)
1041 {
1042 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
1043 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_STENCIL_READ_BASE, evergreen->DB_STENCIL_READ_BASE.u32All);
1044 R600_OUT_BATCH_RELOC(evergreen->DB_STENCIL_READ_BASE.u32All,
1045 rrb->bo,
1046 evergreen->DB_STENCIL_READ_BASE.u32All,
1047 0, RADEON_GEM_DOMAIN_VRAM, 0);
1048 END_BATCH();
1049
1050 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
1051 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_STENCIL_WRITE_BASE, evergreen->DB_STENCIL_WRITE_BASE.u32All);
1052 R600_OUT_BATCH_RELOC(evergreen->DB_STENCIL_WRITE_BASE.u32All,
1053 rrb->bo,
1054 evergreen->DB_STENCIL_WRITE_BASE.u32All,
1055 0, RADEON_GEM_DOMAIN_VRAM, 0);
1056 END_BATCH();
1057 }
1058 }
1059 }
1060 */
1061 COMMIT_BATCH();
1062 }
1063
1064 static void evergreenSetRenderTarget(context_t *context, int id)
1065 {
1066 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
1067 uint32_t format = COLOR_8_8_8_8, comp_swap = SWAP_ALT, number_type = NUMBER_UNORM, source_format = 1;
1068 struct radeon_renderbuffer *rrb;
1069 unsigned int nPitchInPixel;
1070
1071 rrb = radeon_get_colorbuffer(&context->radeon);
1072 if (!rrb || !rrb->bo) {
1073 return;
1074 }
1075
1076 EVERGREEN_STATECHANGE(context, cb);
1077
1078 /* addr */
1079 evergreen->render_target[id].CB_COLOR0_BASE.u32All = context->radeon.state.color.draw_offset / 256;
1080
1081 /* pitch */
1082 nPitchInPixel = rrb->pitch/rrb->cpp;
1083
1084 SETfield(evergreen->render_target[id].CB_COLOR0_PITCH.u32All, (nPitchInPixel/8)-1,
1085 EG_CB_COLOR0_PITCH__TILE_MAX_shift,
1086 EG_CB_COLOR0_PITCH__TILE_MAX_mask);
1087
1088 /* slice */
1089 SETfield(evergreen->render_target[id].CB_COLOR0_SLICE.u32All,
1090 ( (nPitchInPixel * context->radeon.radeonScreen->driScreen->fbHeight)/64 )-1,
1091 EG_CB_COLOR0_SLICE__TILE_MAX_shift,
1092 EG_CB_COLOR0_SLICE__TILE_MAX_mask);
1093
1094 /* CB_COLOR0_ATTRIB */ /* TODO : for z clear, this should be set to 0 */
1095 SETbit(evergreen->render_target[id].CB_COLOR0_ATTRIB.u32All,
1096 EG_CB_COLOR0_ATTRIB__NON_DISP_TILING_ORDER_bit);
1097
1098 /* CB_COLOR0_INFO */
1099 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1100 ENDIAN_NONE,
1101 EG_CB_COLOR0_INFO__ENDIAN_shift,
1102 EG_CB_COLOR0_INFO__ENDIAN_mask);
1103 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1104 ARRAY_LINEAR_GENERAL,
1105 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
1106 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
1107
1108 switch (rrb->base.Format) {
1109 case MESA_FORMAT_RGBA8888:
1110 format = COLOR_8_8_8_8;
1111 comp_swap = SWAP_STD_REV;
1112 number_type = NUMBER_UNORM;
1113 source_format = 1;
1114 break;
1115 case MESA_FORMAT_SIGNED_RGBA8888:
1116 format = COLOR_8_8_8_8;
1117 comp_swap = SWAP_STD_REV;
1118 number_type = NUMBER_SNORM;
1119 source_format = 1;
1120 break;
1121 case MESA_FORMAT_RGBA8888_REV:
1122 format = COLOR_8_8_8_8;
1123 comp_swap = SWAP_STD;
1124 number_type = NUMBER_UNORM;
1125 source_format = 1;
1126 break;
1127 case MESA_FORMAT_SIGNED_RGBA8888_REV:
1128 format = COLOR_8_8_8_8;
1129 comp_swap = SWAP_STD;
1130 number_type = NUMBER_SNORM;
1131 source_format = 1;
1132 break;
1133 case MESA_FORMAT_ARGB8888:
1134 case MESA_FORMAT_XRGB8888:
1135 format = COLOR_8_8_8_8;
1136 comp_swap = SWAP_ALT;
1137 number_type = NUMBER_UNORM;
1138 source_format = 1;
1139 break;
1140 case MESA_FORMAT_ARGB8888_REV:
1141 case MESA_FORMAT_XRGB8888_REV:
1142 format = COLOR_8_8_8_8;
1143 comp_swap = SWAP_ALT_REV;
1144 number_type = NUMBER_UNORM;
1145 source_format = 1;
1146 break;
1147 case MESA_FORMAT_RGB565:
1148 format = COLOR_5_6_5;
1149 comp_swap = SWAP_STD_REV;
1150 number_type = NUMBER_UNORM;
1151 source_format = 1;
1152 break;
1153 case MESA_FORMAT_RGB565_REV:
1154 format = COLOR_5_6_5;
1155 comp_swap = SWAP_STD;
1156 number_type = NUMBER_UNORM;
1157 source_format = 1;
1158 break;
1159 case MESA_FORMAT_ARGB4444:
1160 format = COLOR_4_4_4_4;
1161 comp_swap = SWAP_ALT;
1162 number_type = NUMBER_UNORM;
1163 source_format = 1;
1164 break;
1165 case MESA_FORMAT_ARGB4444_REV:
1166 format = COLOR_4_4_4_4;
1167 comp_swap = SWAP_ALT_REV;
1168 number_type = NUMBER_UNORM;
1169 source_format = 1;
1170 break;
1171 case MESA_FORMAT_ARGB1555:
1172 format = COLOR_1_5_5_5;
1173 comp_swap = SWAP_ALT;
1174 number_type = NUMBER_UNORM;
1175 source_format = 1;
1176 break;
1177 case MESA_FORMAT_ARGB1555_REV:
1178 format = COLOR_1_5_5_5;
1179 comp_swap = SWAP_ALT_REV;
1180 number_type = NUMBER_UNORM;
1181 source_format = 1;
1182 break;
1183 case MESA_FORMAT_AL88:
1184 format = COLOR_8_8;
1185 comp_swap = SWAP_STD;
1186 number_type = NUMBER_UNORM;
1187 source_format = 1;
1188 break;
1189 case MESA_FORMAT_AL88_REV:
1190 format = COLOR_8_8;
1191 comp_swap = SWAP_STD_REV;
1192 number_type = NUMBER_UNORM;
1193 source_format = 1;
1194 break;
1195 case MESA_FORMAT_RGB332:
1196 format = COLOR_3_3_2;
1197 comp_swap = SWAP_STD_REV;
1198 number_type = NUMBER_UNORM;
1199 source_format = 1;
1200 break;
1201 case MESA_FORMAT_A8:
1202 format = COLOR_8;
1203 comp_swap = SWAP_ALT_REV;
1204 number_type = NUMBER_UNORM;
1205 source_format = 1;
1206 break;
1207 case MESA_FORMAT_I8:
1208 case MESA_FORMAT_CI8:
1209 format = COLOR_8;
1210 comp_swap = SWAP_STD;
1211 number_type = NUMBER_UNORM;
1212 source_format = 1;
1213 break;
1214 case MESA_FORMAT_L8:
1215 format = COLOR_8;
1216 comp_swap = SWAP_ALT;
1217 number_type = NUMBER_UNORM;
1218 source_format = 1;
1219 break;
1220 case MESA_FORMAT_RGBA_FLOAT32:
1221 format = COLOR_32_32_32_32_FLOAT;
1222 comp_swap = SWAP_STD_REV;
1223 number_type = NUMBER_FLOAT;
1224 source_format = 0;
1225 break;
1226 case MESA_FORMAT_RGBA_FLOAT16:
1227 format = COLOR_16_16_16_16_FLOAT;
1228 comp_swap = SWAP_STD_REV;
1229 number_type = NUMBER_FLOAT;
1230 source_format = 0;
1231 break;
1232 case MESA_FORMAT_ALPHA_FLOAT32:
1233 format = COLOR_32_FLOAT;
1234 comp_swap = SWAP_ALT_REV;
1235 number_type = NUMBER_FLOAT;
1236 source_format = 0;
1237 break;
1238 case MESA_FORMAT_ALPHA_FLOAT16:
1239 format = COLOR_16_FLOAT;
1240 comp_swap = SWAP_ALT_REV;
1241 number_type = NUMBER_FLOAT;
1242 source_format = 0;
1243 break;
1244 case MESA_FORMAT_LUMINANCE_FLOAT32:
1245 format = COLOR_32_FLOAT;
1246 comp_swap = SWAP_ALT;
1247 number_type = NUMBER_FLOAT;
1248 source_format = 0;
1249 break;
1250 case MESA_FORMAT_LUMINANCE_FLOAT16:
1251 format = COLOR_16_FLOAT;
1252 comp_swap = SWAP_ALT;
1253 number_type = NUMBER_FLOAT;
1254 source_format = 0;
1255 break;
1256 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
1257 format = COLOR_32_32_FLOAT;
1258 comp_swap = SWAP_ALT_REV;
1259 number_type = NUMBER_FLOAT;
1260 source_format = 0;
1261 break;
1262 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
1263 format = COLOR_16_16_FLOAT;
1264 comp_swap = SWAP_ALT_REV;
1265 number_type = NUMBER_FLOAT;
1266 source_format = 0;
1267 break;
1268 case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
1269 format = COLOR_32_FLOAT;
1270 comp_swap = SWAP_STD;
1271 number_type = NUMBER_FLOAT;
1272 source_format = 0;
1273 break;
1274 case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
1275 format = COLOR_16_FLOAT;
1276 comp_swap = SWAP_STD;
1277 number_type = NUMBER_UNORM;
1278 source_format = 0;
1279 break;
1280 case MESA_FORMAT_X8_Z24:
1281 case MESA_FORMAT_S8_Z24:
1282 format = COLOR_8_24;
1283 comp_swap = SWAP_STD;
1284 number_type = NUMBER_UNORM;
1285 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1286 ARRAY_1D_TILED_THIN1,
1287 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
1288 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
1289 source_format = 0;
1290 break;
1291 case MESA_FORMAT_Z24_S8:
1292 format = COLOR_24_8;
1293 comp_swap = SWAP_STD;
1294 number_type = NUMBER_UNORM;
1295 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1296 ARRAY_1D_TILED_THIN1,
1297 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
1298 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
1299 source_format = 0;
1300 break;
1301 case MESA_FORMAT_Z16:
1302 format = COLOR_16;
1303 comp_swap = SWAP_STD;
1304 number_type = NUMBER_UNORM;
1305 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1306 ARRAY_1D_TILED_THIN1,
1307 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
1308 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
1309 source_format = 0;
1310 break;
1311 case MESA_FORMAT_Z32:
1312 format = COLOR_32;
1313 comp_swap = SWAP_STD;
1314 number_type = NUMBER_UNORM;
1315 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1316 ARRAY_1D_TILED_THIN1,
1317 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
1318 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
1319 source_format = 0;
1320 break;
1321 case MESA_FORMAT_SARGB8:
1322 format = COLOR_8_8_8_8;
1323 comp_swap = SWAP_ALT;
1324 number_type = NUMBER_SRGB;
1325 source_format = 1;
1326 break;
1327 case MESA_FORMAT_SLA8:
1328 format = COLOR_8_8;
1329 comp_swap = SWAP_ALT_REV;
1330 number_type = NUMBER_SRGB;
1331 source_format = 1;
1332 break;
1333 case MESA_FORMAT_SL8:
1334 format = COLOR_8;
1335 comp_swap = SWAP_ALT_REV;
1336 number_type = NUMBER_SRGB;
1337 source_format = 1;
1338 break;
1339 default:
1340 _mesa_problem(context->radeon.glCtx, "unexpected format in evergreenSetRenderTarget()");
1341 break;
1342 }
1343
1344 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1345 format,
1346 EG_CB_COLOR0_INFO__FORMAT_shift,
1347 EG_CB_COLOR0_INFO__FORMAT_mask);
1348 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1349 comp_swap,
1350 EG_CB_COLOR0_INFO__COMP_SWAP_shift,
1351 EG_CB_COLOR0_INFO__COMP_SWAP_mask);
1352 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1353 number_type,
1354 EG_CB_COLOR0_INFO__NUMBER_TYPE_shift,
1355 EG_CB_COLOR0_INFO__NUMBER_TYPE_mask);
1356 SETfield(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1357 source_format,
1358 EG_CB_COLOR0_INFO__SOURCE_FORMAT_shift,
1359 EG_CB_COLOR0_INFO__SOURCE_FORMAT_mask);
1360 SETbit(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1361 EG_CB_COLOR0_INFO__BLEND_CLAMP_bit);
1362
1363 evergreen->render_target[id].CB_COLOR0_VIEW.u32All = 0;
1364 evergreen->render_target[id].CB_COLOR0_CMASK.u32All = 0;
1365 evergreen->render_target[id].CB_COLOR0_FMASK.u32All = 0;
1366 evergreen->render_target[id].CB_COLOR0_FMASK_SLICE.u32All = 0;
1367
1368 evergreen->render_target[id].enabled = GL_TRUE;
1369 }
1370
1371 static void evergreenSendCB(GLcontext *ctx, struct radeon_state_atom *atom)
1372 {
1373 context_t *context = EVERGREEN_CONTEXT(ctx);
1374 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
1375 struct radeon_renderbuffer *rrb;
1376 BATCH_LOCALS(&context->radeon);
1377 int id = 0;
1378 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
1379
1380 rrb = radeon_get_colorbuffer(&context->radeon);
1381 if (!rrb || !rrb->bo) {
1382 return;
1383 }
1384
1385 evergreenSetRenderTarget(context, 0);
1386
1387 if (!evergreen->render_target[id].enabled)
1388 return;
1389
1390 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
1391 EVERGREEN_OUT_BATCH_REGSEQ(EG_CB_COLOR0_BASE + (4 * id), 1);
1392 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_BASE.u32All);
1393 R600_OUT_BATCH_RELOC(evergreen->render_target[id].CB_COLOR0_BASE.u32All,
1394 rrb->bo,
1395 evergreen->render_target[id].CB_COLOR0_BASE.u32All,
1396 0, RADEON_GEM_DOMAIN_VRAM, 0);
1397 END_BATCH();
1398
1399 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
1400 EVERGREEN_OUT_BATCH_REGVAL(EG_CB_COLOR0_INFO, evergreen->render_target[id].CB_COLOR0_INFO.u32All);
1401 R600_OUT_BATCH_RELOC(evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1402 rrb->bo,
1403 evergreen->render_target[id].CB_COLOR0_INFO.u32All,
1404 0, RADEON_GEM_DOMAIN_VRAM, 0);
1405 END_BATCH();
1406
1407 BEGIN_BATCH_NO_AUTOSTATE(5);
1408 EVERGREEN_OUT_BATCH_REGSEQ(EG_CB_COLOR0_PITCH, 3);
1409 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_PITCH.u32All);
1410 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_SLICE.u32All);
1411 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_VIEW.u32All);
1412 END_BATCH();
1413
1414 BEGIN_BATCH_NO_AUTOSTATE(4);
1415 EVERGREEN_OUT_BATCH_REGSEQ(EG_CB_COLOR0_ATTRIB, 2);
1416 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_ATTRIB.u32All);
1417 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_DIM.u32All);
1418 /*
1419 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_CMASK.u32All);
1420 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_CMASK_SLICE.u32All);
1421 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_FMASK.u32All);
1422 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_FMASK_SLICE.u32All);
1423 */
1424 END_BATCH();
1425
1426 BEGIN_BATCH_NO_AUTOSTATE(4);
1427 EVERGREEN_OUT_BATCH_REGSEQ(EG_CB_TARGET_MASK, 2);
1428 R600_OUT_BATCH(evergreen->CB_TARGET_MASK.u32All);
1429 R600_OUT_BATCH(evergreen->CB_SHADER_MASK.u32All);
1430 END_BATCH();
1431
1432 BEGIN_BATCH_NO_AUTOSTATE(5);
1433 EVERGREEN_OUT_BATCH_REGSEQ(EG_CB_BLEND_RED, 3);
1434 R600_OUT_BATCH(evergreen->CB_BLEND_RED.u32All);
1435 R600_OUT_BATCH(evergreen->CB_BLEND_GREEN.u32All);
1436 R600_OUT_BATCH(evergreen->CB_BLEND_BLUE.u32All);
1437 END_BATCH();
1438
1439 BEGIN_BATCH_NO_AUTOSTATE(9);
1440 EVERGREEN_OUT_BATCH_REGVAL(EG_CB_BLEND_ALPHA, evergreen->CB_BLEND_ALPHA.u32All);
1441 EVERGREEN_OUT_BATCH_REGVAL(EG_CB_BLEND0_CONTROL, evergreen->CB_BLEND0_CONTROL.u32All);
1442 EVERGREEN_OUT_BATCH_REGVAL(EG_CB_COLOR_CONTROL, evergreen->CB_COLOR_CONTROL.u32All);
1443 END_BATCH();
1444
1445 COMMIT_BATCH();
1446 }
1447 static void evergreenSendCP(GLcontext *ctx, struct radeon_state_atom *atom)
1448 {
1449 context_t *context = EVERGREEN_CONTEXT(ctx);
1450 BATCH_LOCALS(&context->radeon);
1451 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
1452
1453 //first to send
1454 //r700Start3D
1455 BEGIN_BATCH_NO_AUTOSTATE(3);
1456 R600_OUT_BATCH(CP_PACKET3(R600_IT_CONTEXT_CONTROL, 1)); //IT_CONTEXT_CONTROL 0x28
1457 R600_OUT_BATCH(0x80000000);
1458 R600_OUT_BATCH(0x80000000);
1459 END_BATCH();
1460
1461 COMMIT_BATCH();
1462 }
1463 static void evergreenSendVGT(GLcontext *ctx, struct radeon_state_atom *atom)
1464 {
1465 context_t *context = EVERGREEN_CONTEXT(ctx);
1466 EVERGREEN_CHIP_CONTEXT *evergreen = GET_EVERGREEN_CHIP(context);
1467 BATCH_LOCALS(&context->radeon);
1468 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
1469
1470 /* moved to draw:
1471 VGT_DRAW_INITIATOR
1472 VGT_INDEX_TYPE
1473 VGT_PRIMITIVE_TYPE
1474 */
1475 BEGIN_BATCH_NO_AUTOSTATE(5);
1476 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_MAX_VTX_INDX, 3);
1477 R600_OUT_BATCH(evergreen->VGT_MAX_VTX_INDX.u32All);
1478 R600_OUT_BATCH(evergreen->VGT_MIN_VTX_INDX.u32All);
1479 R600_OUT_BATCH(evergreen->VGT_INDX_OFFSET.u32All);
1480 END_BATCH();
1481
1482 BEGIN_BATCH_NO_AUTOSTATE(6);
1483 EVERGREEN_OUT_BATCH_REGVAL(EG_VGT_OUTPUT_PATH_CNTL, evergreen->VGT_OUTPUT_PATH_CNTL.u32All);
1484
1485 EVERGREEN_OUT_BATCH_REGVAL(EG_VGT_GS_MODE, evergreen->VGT_GS_MODE.u32All);
1486 END_BATCH();
1487
1488 BEGIN_BATCH_NO_AUTOSTATE(3);
1489 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_PRIMITIVEID_EN, 1);
1490 R600_OUT_BATCH(evergreen->VGT_PRIMITIVEID_EN.u32All);
1491 END_BATCH();
1492
1493 BEGIN_BATCH_NO_AUTOSTATE(4);
1494 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_INSTANCE_STEP_RATE_0, 2);
1495 R600_OUT_BATCH(evergreen->VGT_INSTANCE_STEP_RATE_0.u32All);
1496 R600_OUT_BATCH(evergreen->VGT_INSTANCE_STEP_RATE_1.u32All);
1497 END_BATCH();
1498
1499 BEGIN_BATCH_NO_AUTOSTATE(4);
1500 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_REUSE_OFF, 2);
1501 R600_OUT_BATCH(evergreen->VGT_REUSE_OFF.u32All);
1502 R600_OUT_BATCH(evergreen->VGT_VTX_CNT_EN.u32All);
1503 END_BATCH();
1504
1505 BEGIN_BATCH_NO_AUTOSTATE(3);
1506 EVERGREEN_OUT_BATCH_REGVAL(EG_VGT_SHADER_STAGES_EN, evergreen->VGT_SHADER_STAGES_EN.u32All);
1507 END_BATCH();
1508
1509 BEGIN_BATCH_NO_AUTOSTATE(4);
1510 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_STRMOUT_CONFIG, 2);
1511 R600_OUT_BATCH(evergreen->VGT_STRMOUT_CONFIG.u32All);
1512 R600_OUT_BATCH(evergreen->VGT_STRMOUT_BUFFER_CONFIG.u32All);
1513 END_BATCH();
1514
1515 COMMIT_BATCH();
1516 }
1517
1518 static void evergreenSendTIMESTAMP(GLcontext *ctx, struct radeon_state_atom *atom)
1519 {
1520 context_t *context = EVERGREEN_CONTEXT(ctx);
1521 BATCH_LOCALS(&context->radeon);
1522 radeon_print(RADEON_STATE, RADEON_VERBOSE, "%s\n", __func__);
1523 }
1524
1525 void evergreenInitAtoms(context_t *context)
1526 {
1527 radeon_print(RADEON_STATE, RADEON_NORMAL, "%s %p\n", __func__, context);
1528 context->radeon.hw.max_state_size = 10 + 5 + 14 + 3; /* start 3d, idle, cb/db flush, 3 for time stamp */
1529
1530 /* Setup the atom linked list */
1531 make_empty_list(&context->radeon.hw.atomlist);
1532 context->radeon.hw.atomlist.name = "atom-list";
1533
1534 EVERGREEN_ALLOC_STATE(init, always, 19, evergreenSendSQConfig);
1535
1536 //make sure send first
1537 EVERGREEN_ALLOC_STATE(cp, always, 3, evergreenSendCP);
1538
1539 EVERGREEN_ALLOC_STATE(vtx, evergreen_vtx, (6 + (VERT_ATTRIB_MAX * 12)), evergreenSendVTX);
1540 EVERGREEN_ALLOC_STATE(pa, always, 124, evergreenSendPA);
1541 EVERGREEN_ALLOC_STATE(tp, always, 0, evergreenSendTP);
1542 EVERGREEN_ALLOC_STATE(sq, always, 86, evergreenSendSQ); /* 85 */
1543 EVERGREEN_ALLOC_STATE(vs, always, 16, evergreenSendVSresource);
1544 EVERGREEN_ALLOC_STATE(spi, always, 59, evergreenSendSPI);
1545 EVERGREEN_ALLOC_STATE(sx, always, 9, evergreenSendSX);
1546 EVERGREEN_ALLOC_STATE(tx, evergreen_tx, (R700_TEXTURE_NUMBERUNITS * (21+5) + 6), evergreenSendTexState); /* 21 for resource, 5 for sampler */
1547 EVERGREEN_ALLOC_STATE(db, always, 65, evergreenSendDB);
1548 EVERGREEN_ALLOC_STATE(cb, always, 35, evergreenSendCB);
1549 EVERGREEN_ALLOC_STATE(vgt, always, 29, evergreenSendVGT);
1550 EVERGREEN_ALLOC_STATE(timestamp, always, 3, evergreenSendTIMESTAMP);
1551
1552 evergreen_init_query_stateobj(&context->radeon, 6 * 2);
1553
1554 context->radeon.hw.is_dirty = GL_TRUE;
1555 context->radeon.hw.all_dirty = GL_TRUE;
1556 }