2 * Copyright (C) 2008-2009 Advanced Micro Devices, Inc.
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:
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
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.
24 * Richard Li <RichardZ.Li@amd.com>, <richardradeon@gmail.com>
25 * CooperYuan <cooper.yuan@amd.com>, <cooperyuan@gmail.com>
28 #include "main/imports.h"
29 #include "main/glheader.h"
31 #include "r600_context.h"
32 #include "r600_cmdbuf.h"
34 #include "r700_state.h"
36 #include "r700_oglprog.h"
37 #include "r700_fragprog.h"
38 #include "r700_vertprog.h"
39 #include "r700_ioctl.h"
41 #include "radeon_mipmap_tree.h"
43 #define LINK_STATES(reg) \
46 pStateListWork->puiValue = (unsigned int*)&(r700->reg); \
47 pStateListWork->unOffset = mm##reg - ASIC_CONTEXT_BASE_INDEX; \
48 pStateListWork->pNext = pStateListWork + 1; \
52 GLboolean
r700InitChipObject(context_t
*context
)
54 ContextState
* pStateListWork
;
56 R700_CHIP_CONTEXT
*r700
= &context
->hw
;
59 r700
->pStateList
= (ContextState
*) MALLOC (sizeof(ContextState
)*sizeof(R700_CHIP_CONTEXT
)/sizeof(unsigned int));
60 pStateListWork
= r700
->pStateList
;
63 LINK_STATES(TA_CNTL_AUX
);
64 LINK_STATES(VC_ENHANCE
);
65 LINK_STATES(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
);
66 LINK_STATES(DB_DEBUG
);
67 LINK_STATES(DB_WATERMARKS
);
70 LINK_STATES(PA_SC_SCREEN_SCISSOR_TL
);
71 LINK_STATES(PA_SC_SCREEN_SCISSOR_BR
);
72 LINK_STATES(PA_SC_WINDOW_OFFSET
);
73 LINK_STATES(PA_SC_WINDOW_SCISSOR_TL
);
74 LINK_STATES(PA_SC_WINDOW_SCISSOR_BR
);
75 LINK_STATES(PA_SC_CLIPRECT_RULE
);
76 LINK_STATES(PA_SC_CLIPRECT_0_TL
);
77 LINK_STATES(PA_SC_CLIPRECT_0_BR
);
78 LINK_STATES(PA_SC_CLIPRECT_1_TL
);
79 LINK_STATES(PA_SC_CLIPRECT_1_BR
);
80 LINK_STATES(PA_SC_CLIPRECT_2_TL
);
81 LINK_STATES(PA_SC_CLIPRECT_2_BR
);
82 LINK_STATES(PA_SC_CLIPRECT_3_TL
);
83 LINK_STATES(PA_SC_CLIPRECT_3_BR
);
84 LINK_STATES(PA_SC_EDGERULE
);
85 LINK_STATES(PA_SC_GENERIC_SCISSOR_TL
);
86 LINK_STATES(PA_SC_GENERIC_SCISSOR_BR
);
87 LINK_STATES(PA_SC_LINE_STIPPLE
);
88 LINK_STATES(PA_SC_MPASS_PS_CNTL
);
89 LINK_STATES(PA_SC_MODE_CNTL
);
90 LINK_STATES(PA_SC_LINE_CNTL
);
91 LINK_STATES(PA_SC_AA_CONFIG
);
92 LINK_STATES(PA_SC_AA_SAMPLE_LOCS_MCTX
);
93 LINK_STATES(PA_SC_AA_SAMPLE_LOCS_8S_WD1_MCTX
);
94 LINK_STATES(PA_SC_AA_MASK
);
97 LINK_STATES(PA_SU_POINT_SIZE
);
98 LINK_STATES(PA_SU_POINT_MINMAX
);
99 LINK_STATES(PA_SU_LINE_CNTL
);
100 LINK_STATES(PA_SU_SC_MODE_CNTL
);
101 LINK_STATES(PA_SU_VTX_CNTL
);
102 LINK_STATES(PA_SU_POLY_OFFSET_DB_FMT_CNTL
);
103 LINK_STATES(PA_SU_POLY_OFFSET_CLAMP
);
104 LINK_STATES(PA_SU_POLY_OFFSET_FRONT_SCALE
);
105 LINK_STATES(PA_SU_POLY_OFFSET_FRONT_OFFSET
);
106 LINK_STATES(PA_SU_POLY_OFFSET_BACK_SCALE
);
107 LINK_STATES(PA_SU_POLY_OFFSET_BACK_OFFSET
);
110 LINK_STATES(PA_CL_CLIP_CNTL
);
111 LINK_STATES(PA_CL_VTE_CNTL
);
112 LINK_STATES(PA_CL_VS_OUT_CNTL
);
113 LINK_STATES(PA_CL_NANINF_CNTL
);
114 LINK_STATES(PA_CL_GB_VERT_CLIP_ADJ
);
115 LINK_STATES(PA_CL_GB_VERT_DISC_ADJ
);
116 LINK_STATES(PA_CL_GB_HORZ_CLIP_ADJ
);
117 LINK_STATES(PA_CL_GB_HORZ_DISC_ADJ
);
120 LINK_STATES(CB_CLEAR_RED_R6XX
);
121 LINK_STATES(CB_CLEAR_GREEN_R6XX
);
122 LINK_STATES(CB_CLEAR_BLUE_R6XX
);
123 LINK_STATES(CB_CLEAR_ALPHA_R6XX
);
124 LINK_STATES(CB_TARGET_MASK
);
125 LINK_STATES(CB_SHADER_MASK
);
126 LINK_STATES(CB_BLEND_RED
);
127 LINK_STATES(CB_BLEND_GREEN
);
128 LINK_STATES(CB_BLEND_BLUE
);
129 LINK_STATES(CB_BLEND_ALPHA
);
130 LINK_STATES(CB_FOG_RED_R6XX
);
131 LINK_STATES(CB_FOG_GREEN_R6XX
);
132 LINK_STATES(CB_FOG_BLUE_R6XX
);
133 LINK_STATES(CB_SHADER_CONTROL
);
134 LINK_STATES(CB_COLOR_CONTROL
);
135 LINK_STATES(CB_CLRCMP_CONTROL
);
136 LINK_STATES(CB_CLRCMP_SRC
);
137 LINK_STATES(CB_CLRCMP_DST
);
138 LINK_STATES(CB_CLRCMP_MSK
);
139 LINK_STATES(CB_BLEND_CONTROL
);
142 LINK_STATES(SX_MISC
);
143 LINK_STATES(SX_ALPHA_TEST_CONTROL
);
144 LINK_STATES(SX_ALPHA_REF
);
147 LINK_STATES(VGT_MAX_VTX_INDX
);
148 LINK_STATES(VGT_MIN_VTX_INDX
);
149 LINK_STATES(VGT_INDX_OFFSET
);
150 LINK_STATES(VGT_MULTI_PRIM_IB_RESET_INDX
);
151 LINK_STATES(VGT_OUTPUT_PATH_CNTL
);
152 LINK_STATES(VGT_HOS_CNTL
);
153 LINK_STATES(VGT_HOS_MAX_TESS_LEVEL
);
154 LINK_STATES(VGT_HOS_MIN_TESS_LEVEL
);
155 LINK_STATES(VGT_HOS_REUSE_DEPTH
);
156 LINK_STATES(VGT_GROUP_PRIM_TYPE
);
157 LINK_STATES(VGT_GROUP_FIRST_DECR
);
158 LINK_STATES(VGT_GROUP_DECR
);
159 LINK_STATES(VGT_GROUP_VECT_0_CNTL
);
160 LINK_STATES(VGT_GROUP_VECT_1_CNTL
);
161 LINK_STATES(VGT_GROUP_VECT_0_FMT_CNTL
);
162 LINK_STATES(VGT_GROUP_VECT_1_FMT_CNTL
);
163 LINK_STATES(VGT_GS_MODE
);
164 LINK_STATES(VGT_PRIMITIVEID_EN
);
165 LINK_STATES(VGT_MULTI_PRIM_IB_RESET_EN
);
166 LINK_STATES(VGT_INSTANCE_STEP_RATE_0
);
167 LINK_STATES(VGT_INSTANCE_STEP_RATE_1
);
168 LINK_STATES(VGT_STRMOUT_EN
);
169 LINK_STATES(VGT_REUSE_OFF
);
170 LINK_STATES(VGT_VTX_CNT_EN
);
171 LINK_STATES(VGT_STRMOUT_BUFFER_EN
);
173 LINK_STATES(SQ_VTX_SEMANTIC_0
);
174 LINK_STATES(SQ_VTX_SEMANTIC_1
);
175 LINK_STATES(SQ_VTX_SEMANTIC_2
);
176 LINK_STATES(SQ_VTX_SEMANTIC_3
);
177 LINK_STATES(SQ_VTX_SEMANTIC_4
);
178 LINK_STATES(SQ_VTX_SEMANTIC_5
);
179 LINK_STATES(SQ_VTX_SEMANTIC_6
);
180 LINK_STATES(SQ_VTX_SEMANTIC_7
);
181 LINK_STATES(SQ_VTX_SEMANTIC_8
);
182 LINK_STATES(SQ_VTX_SEMANTIC_9
);
183 LINK_STATES(SQ_VTX_SEMANTIC_10
);
184 LINK_STATES(SQ_VTX_SEMANTIC_11
);
185 LINK_STATES(SQ_VTX_SEMANTIC_12
);
186 LINK_STATES(SQ_VTX_SEMANTIC_13
);
187 LINK_STATES(SQ_VTX_SEMANTIC_14
);
188 LINK_STATES(SQ_VTX_SEMANTIC_15
);
189 LINK_STATES(SQ_VTX_SEMANTIC_16
);
190 LINK_STATES(SQ_VTX_SEMANTIC_17
);
191 LINK_STATES(SQ_VTX_SEMANTIC_18
);
192 LINK_STATES(SQ_VTX_SEMANTIC_19
);
193 LINK_STATES(SQ_VTX_SEMANTIC_20
);
194 LINK_STATES(SQ_VTX_SEMANTIC_21
);
195 LINK_STATES(SQ_VTX_SEMANTIC_22
);
196 LINK_STATES(SQ_VTX_SEMANTIC_23
);
197 LINK_STATES(SQ_VTX_SEMANTIC_24
);
198 LINK_STATES(SQ_VTX_SEMANTIC_25
);
199 LINK_STATES(SQ_VTX_SEMANTIC_26
);
200 LINK_STATES(SQ_VTX_SEMANTIC_27
);
201 LINK_STATES(SQ_VTX_SEMANTIC_28
);
202 LINK_STATES(SQ_VTX_SEMANTIC_29
);
203 LINK_STATES(SQ_VTX_SEMANTIC_30
);
204 LINK_STATES(SQ_VTX_SEMANTIC_31
);
207 LINK_STATES(SPI_VS_OUT_ID_0
);
208 LINK_STATES(SPI_VS_OUT_ID_1
);
209 LINK_STATES(SPI_VS_OUT_ID_2
);
210 LINK_STATES(SPI_VS_OUT_ID_3
);
211 LINK_STATES(SPI_VS_OUT_ID_4
);
212 LINK_STATES(SPI_VS_OUT_ID_5
);
213 LINK_STATES(SPI_VS_OUT_ID_6
);
214 LINK_STATES(SPI_VS_OUT_ID_7
);
215 LINK_STATES(SPI_VS_OUT_ID_8
);
216 LINK_STATES(SPI_VS_OUT_ID_9
);
218 LINK_STATES(SPI_VS_OUT_CONFIG
);
219 LINK_STATES(SPI_THREAD_GROUPING
);
220 LINK_STATES(SPI_PS_IN_CONTROL_0
);
221 LINK_STATES(SPI_PS_IN_CONTROL_1
);
222 LINK_STATES(SPI_INTERP_CONTROL_0
);
223 LINK_STATES(SPI_INPUT_Z
);
224 LINK_STATES(SPI_FOG_CNTL
);
225 LINK_STATES(SPI_FOG_FUNC_SCALE
);
226 LINK_STATES(SPI_FOG_FUNC_BIAS
);
229 LINK_STATES(SQ_ESGS_RING_ITEMSIZE
);
230 LINK_STATES(SQ_GSVS_RING_ITEMSIZE
);
231 LINK_STATES(SQ_ESTMP_RING_ITEMSIZE
);
232 LINK_STATES(SQ_GSTMP_RING_ITEMSIZE
);
233 LINK_STATES(SQ_VSTMP_RING_ITEMSIZE
);
234 LINK_STATES(SQ_PSTMP_RING_ITEMSIZE
);
235 LINK_STATES(SQ_FBUF_RING_ITEMSIZE
);
236 LINK_STATES(SQ_REDUC_RING_ITEMSIZE
);
237 //LINK_STATES(SQ_GS_VERT_ITEMSIZE);
239 pStateListWork
->puiValue
= (unsigned int*)&(r700
->SQ_GS_VERT_ITEMSIZE
);
240 pStateListWork
->unOffset
= mmSQ_GS_VERT_ITEMSIZE
- ASIC_CONTEXT_BASE_INDEX
;
241 pStateListWork
->pNext
= NULL
; /* END OF STATE LIST */
246 GLboolean
r700SendTextureState(context_t
*context
)
249 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
250 struct radeon_bo
*bo
= NULL
;
251 BATCH_LOCALS(&context
->radeon
);
253 for (i
=0; i
<R700_TEXTURE_NUMBERUNITS
; i
++) {
254 radeonTexObj
*t
= r700
->textures
[i
];
256 if (!t
->image_override
)
262 r700SyncSurf(context
, bo
,
263 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
,
264 0, TC_ACTION_ENA_bit
);
266 BEGIN_BATCH_NO_AUTOSTATE(9);
267 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE
, 7));
268 R600_OUT_BATCH(i
* 7);
269 R600_OUT_BATCH(r700
->textures
[i
]->SQ_TEX_RESOURCE0
);
270 R600_OUT_BATCH(r700
->textures
[i
]->SQ_TEX_RESOURCE1
);
271 R600_OUT_BATCH_RELOC(r700
->textures
[i
]->SQ_TEX_RESOURCE2
,
274 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
275 R600_OUT_BATCH_RELOC(r700
->textures
[i
]->SQ_TEX_RESOURCE3
,
277 r700
->textures
[i
]->SQ_TEX_RESOURCE3
,
278 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
279 R600_OUT_BATCH(r700
->textures
[i
]->SQ_TEX_RESOURCE4
);
280 R600_OUT_BATCH(r700
->textures
[i
]->SQ_TEX_RESOURCE5
);
281 R600_OUT_BATCH(r700
->textures
[i
]->SQ_TEX_RESOURCE6
);
284 BEGIN_BATCH_NO_AUTOSTATE(5);
285 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER
, 3));
286 R600_OUT_BATCH(i
* 3);
287 R600_OUT_BATCH(r700
->textures
[i
]->SQ_TEX_SAMPLER0
);
288 R600_OUT_BATCH(r700
->textures
[i
]->SQ_TEX_SAMPLER1
);
289 R600_OUT_BATCH(r700
->textures
[i
]->SQ_TEX_SAMPLER2
);
292 BEGIN_BATCH_NO_AUTOSTATE(2 + 4);
293 R600_OUT_BATCH_REGSEQ((TD_PS_SAMPLER0_BORDER_RED
+ (i
* 16)), 4);
294 R600_OUT_BATCH(r700
->textures
[i
]->TD_PS_SAMPLER0_BORDER_RED
);
295 R600_OUT_BATCH(r700
->textures
[i
]->TD_PS_SAMPLER0_BORDER_GREEN
);
296 R600_OUT_BATCH(r700
->textures
[i
]->TD_PS_SAMPLER0_BORDER_BLUE
);
297 R600_OUT_BATCH(r700
->textures
[i
]->TD_PS_SAMPLER0_BORDER_ALPHA
);
307 void r700SetupVTXConstants(GLcontext
* ctx
,
308 unsigned int nStreamID
,
310 unsigned int size
, /* number of elements in vector */
312 unsigned int count
) /* number of vectors in stream */
314 context_t
*context
= R700_CONTEXT(ctx
);
315 struct radeon_aos
* paos
= (struct radeon_aos
*)pAos
;
316 BATCH_LOCALS(&context
->radeon
);
318 unsigned int uSQ_VTX_CONSTANT_WORD0_0
;
319 unsigned int uSQ_VTX_CONSTANT_WORD1_0
;
320 unsigned int uSQ_VTX_CONSTANT_WORD2_0
= 0;
321 unsigned int uSQ_VTX_CONSTANT_WORD3_0
= 0;
322 unsigned int uSQ_VTX_CONSTANT_WORD6_0
= 0;
327 if ((context
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV610
) ||
328 (context
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV620
) ||
329 (context
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RS780
) ||
330 (context
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV710
))
331 r700SyncSurf(context
, paos
->bo
, RADEON_GEM_DOMAIN_GTT
, 0, TC_ACTION_ENA_bit
);
333 r700SyncSurf(context
, paos
->bo
, RADEON_GEM_DOMAIN_GTT
, 0, VC_ACTION_ENA_bit
);
335 uSQ_VTX_CONSTANT_WORD0_0
= paos
->offset
;
336 uSQ_VTX_CONSTANT_WORD1_0
= count
* (size
* 4) - 1;
338 SETfield(uSQ_VTX_CONSTANT_WORD2_0
, 0, BASE_ADDRESS_HI_shift
, BASE_ADDRESS_HI_mask
); /* TODO */
339 SETfield(uSQ_VTX_CONSTANT_WORD2_0
, stride
, SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift
,
340 SQ_VTX_CONSTANT_WORD2_0__STRIDE_mask
);
341 SETfield(uSQ_VTX_CONSTANT_WORD2_0
, GetSurfaceFormat(GL_FLOAT
, size
, NULL
),
342 SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_shift
,
343 SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_mask
); /* TODO : trace back api for initial data type, not only GL_FLOAT */
344 SETfield(uSQ_VTX_CONSTANT_WORD2_0
, SQ_NUM_FORMAT_SCALED
,
345 SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift
, SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_mask
);
346 SETbit(uSQ_VTX_CONSTANT_WORD2_0
, SQ_VTX_CONSTANT_WORD2_0__FORMAT_COMP_ALL_bit
);
348 SETfield(uSQ_VTX_CONSTANT_WORD3_0
, 1, MEM_REQUEST_SIZE_shift
, MEM_REQUEST_SIZE_mask
);
349 SETfield(uSQ_VTX_CONSTANT_WORD6_0
, SQ_TEX_VTX_VALID_BUFFER
,
350 SQ_TEX_RESOURCE_WORD6_0__TYPE_shift
, SQ_TEX_RESOURCE_WORD6_0__TYPE_mask
);
352 BEGIN_BATCH_NO_AUTOSTATE(9);
354 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE
, 7));
355 R600_OUT_BATCH((nStreamID
+ SQ_FETCH_RESOURCE_VS_OFFSET
) * FETCH_RESOURCE_STRIDE
);
357 R600_OUT_BATCH_RELOC(uSQ_VTX_CONSTANT_WORD0_0
,
359 uSQ_VTX_CONSTANT_WORD0_0
,
360 RADEON_GEM_DOMAIN_GTT
, 0, 0);
361 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD1_0
);
362 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD2_0
);
363 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD3_0
);
366 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD6_0
);
373 int r700SetupStreams(GLcontext
* ctx
)
375 context_t
*context
= R700_CONTEXT(ctx
);
376 BATCH_LOCALS(&context
->radeon
);
378 struct r700_vertex_program
*vpc
379 = (struct r700_vertex_program
*)ctx
->VertexProgram
._Current
;
381 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
382 struct vertex_buffer
*vb
= &tnl
->vb
;
385 unsigned int i
, j
= 0;
387 BEGIN_BATCH_NO_AUTOSTATE(6);
388 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST
, 1));
389 R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC
- ASIC_CTL_CONST_BASE_INDEX
);
392 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST
, 1));
393 R600_OUT_BATCH(mmSQ_VTX_START_INST_LOC
- ASIC_CTL_CONST_BASE_INDEX
);
398 context
->radeon
.tcl
.aos_count
= 0;
399 for(i
=0; i
<VERT_ATTRIB_MAX
; i
++)
402 if(vpc
->mesa_program
.Base
.InputsRead
& unBit
)
404 rcommon_emit_vector(ctx
,
405 &context
->radeon
.tcl
.aos
[j
],
406 vb
->AttribPtr
[i
]->data
,
407 vb
->AttribPtr
[i
]->size
,
408 vb
->AttribPtr
[i
]->stride
,
411 /* currently aos are packed */
412 r700SetupVTXConstants(ctx
,
414 (void*)(&context
->radeon
.tcl
.aos
[j
]),
415 (unsigned int)context
->radeon
.tcl
.aos
[j
].components
,
416 (unsigned int)context
->radeon
.tcl
.aos
[j
].stride
* 4,
417 (unsigned int)context
->radeon
.tcl
.aos
[j
].count
);
419 context
->radeon
.tcl
.aos_count
++;
423 return R600_FALLBACK_NONE
;
426 GLboolean
r700SendContextStates(context_t
*context
)
428 BATCH_LOCALS(&context
->radeon
);
430 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
432 ContextState
* pState
= r700
->pStateList
;
433 ContextState
* pInit
;
437 while(NULL
!= pState
)
443 while(NULL
!= pState
->pNext
)
445 if ((pState
->pNext
->unOffset
- pState
->unOffset
) > 1)
451 pState
= pState
->pNext
;
456 pState
= pState
->pNext
;
458 BEGIN_BATCH_NO_AUTOSTATE(toSend
+ 2);
459 R600_OUT_BATCH_REGSEQ(((pInit
->unOffset
+ ASIC_CONTEXT_BASE_INDEX
)<<2), toSend
);
460 for(ui
=0; ui
<toSend
; ui
++)
462 R600_OUT_BATCH(*(pInit
->puiValue
));
463 pInit
= pInit
->pNext
;
469 * - split this into a separate function?
470 * - only emit the ones we use
472 BEGIN_BATCH_NO_AUTOSTATE(2 + R700_MAX_SHADER_EXPORTS
);
473 R600_OUT_BATCH_REGSEQ(SPI_PS_INPUT_CNTL_0
, R700_MAX_SHADER_EXPORTS
);
474 for(ui
= 0; ui
< R700_MAX_SHADER_EXPORTS
; ui
++)
475 R600_OUT_BATCH(r700
->SPI_PS_INPUT_CNTL
[ui
].u32All
);
482 GLboolean
r700SendDepthTargetState(context_t
*context
)
484 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
485 struct radeon_renderbuffer
*rrb
;
486 BATCH_LOCALS(&context
->radeon
);
488 rrb
= radeon_get_depthbuffer(&context
->radeon
);
489 if (!rrb
|| !rrb
->bo
) {
490 fprintf(stderr
, "no rrb\n");
494 BEGIN_BATCH_NO_AUTOSTATE(9);
495 R600_OUT_BATCH_REGSEQ(DB_DEPTH_SIZE
, 2);
496 R600_OUT_BATCH(r700
->DB_DEPTH_SIZE
.u32All
);
497 R600_OUT_BATCH(r700
->DB_DEPTH_VIEW
.u32All
);
498 R600_OUT_BATCH_REGSEQ(DB_DEPTH_BASE
, 3);
499 R600_OUT_BATCH_RELOC(r700
->DB_DEPTH_BASE
.u32All
,
501 r700
->DB_DEPTH_BASE
.u32All
,
502 0, RADEON_GEM_DOMAIN_VRAM
, 0);
503 R600_OUT_BATCH(r700
->DB_DEPTH_INFO
.u32All
);
504 R600_OUT_BATCH(r700
->DB_HTILE_DATA_BASE
.u32All
);
507 BEGIN_BATCH_NO_AUTOSTATE(24);
508 R600_OUT_BATCH_REGSEQ(DB_STENCIL_CLEAR
, 2);
509 R600_OUT_BATCH(r700
->DB_STENCIL_CLEAR
.u32All
);
510 R600_OUT_BATCH(r700
->DB_DEPTH_CLEAR
.u32All
);
512 R600_OUT_BATCH_REGSEQ(DB_STENCILREFMASK
, 2);
513 R600_OUT_BATCH(r700
->DB_STENCILREFMASK
.u32All
);
514 R600_OUT_BATCH(r700
->DB_STENCILREFMASK_BF
.u32All
);
516 R600_OUT_BATCH_REGVAL(DB_DEPTH_CONTROL
, r700
->DB_DEPTH_CONTROL
.u32All
);
517 R600_OUT_BATCH_REGVAL(DB_SHADER_CONTROL
, r700
->DB_SHADER_CONTROL
.u32All
);
519 R600_OUT_BATCH_REGSEQ(DB_RENDER_CONTROL
, 2);
520 R600_OUT_BATCH(r700
->DB_RENDER_CONTROL
.u32All
);
521 R600_OUT_BATCH(r700
->DB_RENDER_OVERRIDE
.u32All
);
523 R600_OUT_BATCH_REGVAL(DB_HTILE_SURFACE
, r700
->DB_HTILE_SURFACE
.u32All
);
524 R600_OUT_BATCH_REGVAL(DB_ALPHA_TO_MASK
, r700
->DB_ALPHA_TO_MASK
.u32All
);
529 r700SyncSurf(context
, rrb
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
,
530 DB_ACTION_ENA_bit
| DB_DEST_BASE_ENA_bit
);
535 GLboolean
r700SendRenderTargetState(context_t
*context
, int id
)
537 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
538 struct radeon_renderbuffer
*rrb
;
539 BATCH_LOCALS(&context
->radeon
);
541 rrb
= radeon_get_colorbuffer(&context
->radeon
);
542 if (!rrb
|| !rrb
->bo
) {
543 fprintf(stderr
, "no rrb\n");
547 if (id
> R700_MAX_RENDER_TARGETS
)
550 if (!r700
->render_target
[id
].enabled
)
553 BEGIN_BATCH_NO_AUTOSTATE(3);
554 R600_OUT_BATCH_REGSEQ(CB_COLOR0_BASE
+ (4 * id
), 1);
555 R600_OUT_BATCH_RELOC(r700
->render_target
[id
].CB_COLOR0_BASE
.u32All
,
557 r700
->render_target
[id
].CB_COLOR0_BASE
.u32All
,
558 0, RADEON_GEM_DOMAIN_VRAM
, 0);
561 if ((context
->radeon
.radeonScreen
->chip_family
> CHIP_FAMILY_R600
) &&
562 (context
->radeon
.radeonScreen
->chip_family
< CHIP_FAMILY_RV770
)) {
563 BEGIN_BATCH_NO_AUTOSTATE(2);
564 R600_OUT_BATCH(CP_PACKET3(R600_IT_SURFACE_BASE_UPDATE
, 0));
565 R600_OUT_BATCH((2 << id
));
569 BEGIN_BATCH_NO_AUTOSTATE(18);
570 R600_OUT_BATCH_REGVAL(CB_COLOR0_SIZE
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_SIZE
.u32All
);
571 R600_OUT_BATCH_REGVAL(CB_COLOR0_VIEW
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_VIEW
.u32All
);
572 R600_OUT_BATCH_REGVAL(CB_COLOR0_INFO
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
);
573 R600_OUT_BATCH_REGVAL(CB_COLOR0_TILE
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_TILE
.u32All
);
574 R600_OUT_BATCH_REGVAL(CB_COLOR0_FRAG
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_FRAG
.u32All
);
575 R600_OUT_BATCH_REGVAL(CB_COLOR0_MASK
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_MASK
.u32All
);
578 if (context
->radeon
.radeonScreen
->chip_family
> CHIP_FAMILY_R600
) {
579 BEGIN_BATCH_NO_AUTOSTATE(3);
580 R600_OUT_BATCH_REGVAL(CB_BLEND0_CONTROL
+ (4 * id
), r700
->render_target
[id
].CB_BLEND0_CONTROL
.u32All
);
586 r700SyncSurf(context
, rrb
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
,
587 CB_ACTION_ENA_bit
| (1 << (id
+ 6)));
592 GLboolean
r700SendPSState(context_t
*context
)
594 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
595 struct radeon_bo
* pbo
;
596 BATCH_LOCALS(&context
->radeon
);
598 pbo
= (struct radeon_bo
*)r700GetActiveFpShaderBo(GL_CONTEXT(context
));
603 r700SyncSurf(context
, pbo
, RADEON_GEM_DOMAIN_GTT
, 0, SH_ACTION_ENA_bit
);
605 BEGIN_BATCH_NO_AUTOSTATE(3);
606 R600_OUT_BATCH_REGSEQ(SQ_PGM_START_PS
, 1);
607 R600_OUT_BATCH_RELOC(r700
->ps
.SQ_PGM_START_PS
.u32All
,
609 r700
->ps
.SQ_PGM_START_PS
.u32All
,
610 RADEON_GEM_DOMAIN_GTT
, 0, 0);
613 BEGIN_BATCH_NO_AUTOSTATE(9);
614 R600_OUT_BATCH_REGVAL(SQ_PGM_RESOURCES_PS
, r700
->ps
.SQ_PGM_RESOURCES_PS
.u32All
);
615 R600_OUT_BATCH_REGVAL(SQ_PGM_EXPORTS_PS
, r700
->ps
.SQ_PGM_EXPORTS_PS
.u32All
);
616 R600_OUT_BATCH_REGVAL(SQ_PGM_CF_OFFSET_PS
, r700
->ps
.SQ_PGM_CF_OFFSET_PS
.u32All
);
624 GLboolean
r700SendVSState(context_t
*context
)
626 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
627 struct radeon_bo
* pbo
;
628 BATCH_LOCALS(&context
->radeon
);
630 pbo
= (struct radeon_bo
*)r700GetActiveVpShaderBo(GL_CONTEXT(context
));
635 r700SyncSurf(context
, pbo
, RADEON_GEM_DOMAIN_GTT
, 0, SH_ACTION_ENA_bit
);
637 BEGIN_BATCH_NO_AUTOSTATE(3);
638 R600_OUT_BATCH_REGSEQ(SQ_PGM_START_VS
, 1);
639 R600_OUT_BATCH_RELOC(r700
->vs
.SQ_PGM_START_VS
.u32All
,
641 r700
->vs
.SQ_PGM_START_VS
.u32All
,
642 RADEON_GEM_DOMAIN_GTT
, 0, 0);
645 BEGIN_BATCH_NO_AUTOSTATE(6);
646 R600_OUT_BATCH_REGVAL(SQ_PGM_RESOURCES_VS
, r700
->vs
.SQ_PGM_RESOURCES_VS
.u32All
);
647 R600_OUT_BATCH_REGVAL(SQ_PGM_CF_OFFSET_VS
, r700
->vs
.SQ_PGM_CF_OFFSET_VS
.u32All
);
655 GLboolean
r700SendFSState(context_t
*context
)
657 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
658 struct radeon_bo
* pbo
;
659 BATCH_LOCALS(&context
->radeon
);
662 * R6xx chips require a FS be emitted, even if it's not used.
663 * since we aren't using FS yet, just send the VS address to make
664 * the kernel command checker happy
666 pbo
= (struct radeon_bo
*)r700GetActiveVpShaderBo(GL_CONTEXT(context
));
667 r700
->fs
.SQ_PGM_START_FS
.u32All
= r700
->vs
.SQ_PGM_START_VS
.u32All
;
668 r700
->fs
.SQ_PGM_RESOURCES_FS
.u32All
= 0;
669 r700
->fs
.SQ_PGM_CF_OFFSET_FS
.u32All
= 0;
675 r700SyncSurf(context
, pbo
, RADEON_GEM_DOMAIN_GTT
, 0, SH_ACTION_ENA_bit
);
677 BEGIN_BATCH_NO_AUTOSTATE(3);
678 R600_OUT_BATCH_REGSEQ(SQ_PGM_START_FS
, 1);
679 R600_OUT_BATCH_RELOC(r700
->fs
.SQ_PGM_START_FS
.u32All
,
681 r700
->fs
.SQ_PGM_START_FS
.u32All
,
682 RADEON_GEM_DOMAIN_GTT
, 0, 0);
685 BEGIN_BATCH_NO_AUTOSTATE(6);
686 R600_OUT_BATCH_REGVAL(SQ_PGM_RESOURCES_FS
, r700
->fs
.SQ_PGM_RESOURCES_FS
.u32All
);
687 R600_OUT_BATCH_REGVAL(SQ_PGM_CF_OFFSET_FS
, r700
->fs
.SQ_PGM_CF_OFFSET_FS
.u32All
);
695 GLboolean
r700SendViewportState(context_t
*context
, int id
)
697 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
698 BATCH_LOCALS(&context
->radeon
);
700 if (id
> R700_MAX_VIEWPORTS
)
703 if (!r700
->viewport
[id
].enabled
)
706 BEGIN_BATCH_NO_AUTOSTATE(16);
707 R600_OUT_BATCH_REGSEQ(PA_SC_VPORT_SCISSOR_0_TL
+ (8 * id
), 2);
708 R600_OUT_BATCH(r700
->viewport
[id
].PA_SC_VPORT_SCISSOR_0_TL
.u32All
);
709 R600_OUT_BATCH(r700
->viewport
[id
].PA_SC_VPORT_SCISSOR_0_BR
.u32All
);
710 R600_OUT_BATCH_REGSEQ(PA_SC_VPORT_ZMIN_0
+ (8 * id
), 2);
711 R600_OUT_BATCH(r700
->viewport
[id
].PA_SC_VPORT_ZMIN_0
.u32All
);
712 R600_OUT_BATCH(r700
->viewport
[id
].PA_SC_VPORT_ZMAX_0
.u32All
);
713 R600_OUT_BATCH_REGSEQ(PA_CL_VPORT_XSCALE_0
+ (24 * id
), 6);
714 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_XSCALE
.u32All
);
715 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_XOFFSET
.u32All
);
716 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_YSCALE
.u32All
);
717 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_YOFFSET
.u32All
);
718 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_ZSCALE
.u32All
);
719 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_ZOFFSET
.u32All
);
727 GLboolean
r700SendSQConfig(context_t
*context
)
729 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
730 BATCH_LOCALS(&context
->radeon
);
732 BEGIN_BATCH_NO_AUTOSTATE(8);
733 R600_OUT_BATCH_REGSEQ(SQ_CONFIG
, 6);
734 R600_OUT_BATCH(r700
->sq_config
.SQ_CONFIG
.u32All
);
735 R600_OUT_BATCH(r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_1
.u32All
);
736 R600_OUT_BATCH(r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_2
.u32All
);
737 R600_OUT_BATCH(r700
->sq_config
.SQ_THREAD_RESOURCE_MGMT
.u32All
);
738 R600_OUT_BATCH(r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_1
.u32All
);
739 R600_OUT_BATCH(r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_2
.u32All
);
746 GLboolean
r700SendUCPState(context_t
*context
)
748 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
749 BATCH_LOCALS(&context
->radeon
);
752 for (i
= 0; i
< R700_MAX_UCP
; i
++) {
753 if (r700
->ucp
[i
].enabled
) {
754 BEGIN_BATCH_NO_AUTOSTATE(6);
755 R600_OUT_BATCH_REGSEQ(PA_CL_UCP_0_X
+ (16 * i
), 4);
756 R600_OUT_BATCH(r700
->ucp
[i
].PA_CL_UCP_0_X
.u32All
);
757 R600_OUT_BATCH(r700
->ucp
[i
].PA_CL_UCP_0_Y
.u32All
);
758 R600_OUT_BATCH(r700
->ucp
[i
].PA_CL_UCP_0_Z
.u32All
);
759 R600_OUT_BATCH(r700
->ucp
[i
].PA_CL_UCP_0_W
.u32All
);