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 #define LINK_STATES(reg) \
44 pStateListWork->puiValue = (unsigned int*)&(r700->reg); \
45 pStateListWork->unOffset = mm##reg - ASIC_CONTEXT_BASE_INDEX; \
46 pStateListWork->pNext = pStateListWork + 1; \
50 GLboolean
r700InitChipObject(context_t
*context
)
52 ContextState
* pStateListWork
;
54 R700_CHIP_CONTEXT
*r700
= &context
->hw
;
57 r700
->pStateList
= (ContextState
*) MALLOC (sizeof(ContextState
)*sizeof(R700_CHIP_CONTEXT
)/sizeof(unsigned int));
58 pStateListWork
= r700
->pStateList
;
61 LINK_STATES(TA_CNTL_AUX
);
62 LINK_STATES(VC_ENHANCE
);
63 LINK_STATES(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
);
64 LINK_STATES(DB_DEBUG
);
65 LINK_STATES(DB_WATERMARKS
);
68 LINK_STATES(DB_DEPTH_SIZE
);
69 LINK_STATES(DB_DEPTH_VIEW
);
70 LINK_STATES(DB_DEPTH_BASE
);
71 LINK_STATES(DB_DEPTH_INFO
);
72 LINK_STATES(DB_HTILE_DATA_BASE
);
73 LINK_STATES(DB_STENCIL_CLEAR
);
74 LINK_STATES(DB_DEPTH_CLEAR
);
75 LINK_STATES(DB_DEPTH_CONTROL
);
76 LINK_STATES(DB_SHADER_CONTROL
);
77 LINK_STATES(DB_RENDER_CONTROL
);
78 LINK_STATES(DB_RENDER_OVERRIDE
);
79 LINK_STATES(DB_HTILE_SURFACE
);
80 LINK_STATES(DB_ALPHA_TO_MASK
);
83 LINK_STATES(PA_SC_SCREEN_SCISSOR_TL
);
84 LINK_STATES(PA_SC_SCREEN_SCISSOR_BR
);
85 LINK_STATES(PA_SC_WINDOW_OFFSET
);
86 LINK_STATES(PA_SC_WINDOW_SCISSOR_TL
);
87 LINK_STATES(PA_SC_WINDOW_SCISSOR_BR
);
88 LINK_STATES(PA_SC_CLIPRECT_RULE
);
89 LINK_STATES(PA_SC_CLIPRECT_0_TL
);
90 LINK_STATES(PA_SC_CLIPRECT_0_BR
);
91 LINK_STATES(PA_SC_CLIPRECT_1_TL
);
92 LINK_STATES(PA_SC_CLIPRECT_1_BR
);
93 LINK_STATES(PA_SC_CLIPRECT_2_TL
);
94 LINK_STATES(PA_SC_CLIPRECT_2_BR
);
95 LINK_STATES(PA_SC_CLIPRECT_3_TL
);
96 LINK_STATES(PA_SC_CLIPRECT_3_BR
);
97 LINK_STATES(PA_SC_EDGERULE
);
98 LINK_STATES(PA_SC_GENERIC_SCISSOR_TL
);
99 LINK_STATES(PA_SC_GENERIC_SCISSOR_BR
);
100 LINK_STATES(PA_SC_LINE_STIPPLE
);
101 LINK_STATES(PA_SC_MPASS_PS_CNTL
);
102 LINK_STATES(PA_SC_MODE_CNTL
);
103 LINK_STATES(PA_SC_LINE_CNTL
);
104 LINK_STATES(PA_SC_AA_CONFIG
);
105 LINK_STATES(PA_SC_AA_SAMPLE_LOCS_MCTX
);
106 LINK_STATES(PA_SC_AA_SAMPLE_LOCS_8S_WD1_MCTX
);
107 LINK_STATES(PA_SC_AA_MASK
);
110 LINK_STATES(PA_SU_POINT_SIZE
);
111 LINK_STATES(PA_SU_POINT_MINMAX
);
112 LINK_STATES(PA_SU_LINE_CNTL
);
113 LINK_STATES(PA_SU_SC_MODE_CNTL
);
114 LINK_STATES(PA_SU_VTX_CNTL
);
115 LINK_STATES(PA_SU_POLY_OFFSET_DB_FMT_CNTL
);
116 LINK_STATES(PA_SU_POLY_OFFSET_CLAMP
);
117 LINK_STATES(PA_SU_POLY_OFFSET_FRONT_SCALE
);
118 LINK_STATES(PA_SU_POLY_OFFSET_FRONT_OFFSET
);
119 LINK_STATES(PA_SU_POLY_OFFSET_BACK_SCALE
);
122 LINK_STATES(PA_CL_CLIP_CNTL
);
123 LINK_STATES(PA_CL_VTE_CNTL
);
124 LINK_STATES(PA_CL_VS_OUT_CNTL
);
125 LINK_STATES(PA_CL_NANINF_CNTL
);
126 LINK_STATES(PA_CL_GB_VERT_CLIP_ADJ
);
127 LINK_STATES(PA_CL_GB_VERT_DISC_ADJ
);
128 LINK_STATES(PA_CL_GB_HORZ_CLIP_ADJ
);
129 LINK_STATES(PA_CL_GB_HORZ_DISC_ADJ
);
132 LINK_STATES(CB_CLEAR_RED_R6XX
);
133 LINK_STATES(CB_CLEAR_GREEN_R6XX
);
134 LINK_STATES(CB_CLEAR_BLUE_R6XX
);
135 LINK_STATES(CB_CLEAR_ALPHA_R6XX
);
136 LINK_STATES(CB_TARGET_MASK
);
137 LINK_STATES(CB_SHADER_MASK
);
138 LINK_STATES(CB_BLEND_RED
);
139 LINK_STATES(CB_BLEND_GREEN
);
140 LINK_STATES(CB_BLEND_BLUE
);
141 LINK_STATES(CB_BLEND_ALPHA
);
142 LINK_STATES(CB_FOG_RED_R6XX
);
143 LINK_STATES(CB_FOG_GREEN_R6XX
);
144 LINK_STATES(CB_FOG_BLUE_R6XX
);
145 LINK_STATES(CB_SHADER_CONTROL
);
146 LINK_STATES(CB_COLOR_CONTROL
);
147 LINK_STATES(CB_CLRCMP_CONTROL
);
148 LINK_STATES(CB_CLRCMP_SRC
);
149 LINK_STATES(CB_CLRCMP_DST
);
150 LINK_STATES(CB_CLRCMP_MSK
);
151 LINK_STATES(CB_BLEND_CONTROL
);
154 LINK_STATES(SX_MISC
);
155 LINK_STATES(SX_ALPHA_TEST_CONTROL
);
158 LINK_STATES(VGT_MAX_VTX_INDX
);
159 LINK_STATES(VGT_MIN_VTX_INDX
);
160 LINK_STATES(VGT_INDX_OFFSET
);
161 LINK_STATES(VGT_MULTI_PRIM_IB_RESET_INDX
);
162 LINK_STATES(VGT_OUTPUT_PATH_CNTL
);
163 LINK_STATES(VGT_HOS_CNTL
);
164 LINK_STATES(VGT_HOS_MAX_TESS_LEVEL
);
165 LINK_STATES(VGT_HOS_MIN_TESS_LEVEL
);
166 LINK_STATES(VGT_HOS_REUSE_DEPTH
);
167 LINK_STATES(VGT_GROUP_PRIM_TYPE
);
168 LINK_STATES(VGT_GROUP_FIRST_DECR
);
169 LINK_STATES(VGT_GROUP_DECR
);
170 LINK_STATES(VGT_GROUP_VECT_0_CNTL
);
171 LINK_STATES(VGT_GROUP_VECT_1_CNTL
);
172 LINK_STATES(VGT_GROUP_VECT_0_FMT_CNTL
);
173 LINK_STATES(VGT_GROUP_VECT_1_FMT_CNTL
);
174 LINK_STATES(VGT_GS_MODE
);
175 LINK_STATES(VGT_PRIMITIVEID_EN
);
176 LINK_STATES(VGT_DMA_NUM_INSTANCES
);
177 LINK_STATES(VGT_MULTI_PRIM_IB_RESET_EN
);
178 LINK_STATES(VGT_INSTANCE_STEP_RATE_0
);
179 LINK_STATES(VGT_INSTANCE_STEP_RATE_1
);
180 LINK_STATES(VGT_STRMOUT_EN
);
181 LINK_STATES(VGT_REUSE_OFF
);
182 LINK_STATES(VGT_VTX_CNT_EN
);
183 LINK_STATES(VGT_STRMOUT_BUFFER_EN
);
185 LINK_STATES(SQ_VTX_SEMANTIC_0
);
186 LINK_STATES(SQ_VTX_SEMANTIC_1
);
187 LINK_STATES(SQ_VTX_SEMANTIC_2
);
188 LINK_STATES(SQ_VTX_SEMANTIC_3
);
189 LINK_STATES(SQ_VTX_SEMANTIC_4
);
190 LINK_STATES(SQ_VTX_SEMANTIC_5
);
191 LINK_STATES(SQ_VTX_SEMANTIC_6
);
192 LINK_STATES(SQ_VTX_SEMANTIC_7
);
193 LINK_STATES(SQ_VTX_SEMANTIC_8
);
194 LINK_STATES(SQ_VTX_SEMANTIC_9
);
195 LINK_STATES(SQ_VTX_SEMANTIC_10
);
196 LINK_STATES(SQ_VTX_SEMANTIC_11
);
197 LINK_STATES(SQ_VTX_SEMANTIC_12
);
198 LINK_STATES(SQ_VTX_SEMANTIC_13
);
199 LINK_STATES(SQ_VTX_SEMANTIC_14
);
200 LINK_STATES(SQ_VTX_SEMANTIC_15
);
201 LINK_STATES(SQ_VTX_SEMANTIC_16
);
202 LINK_STATES(SQ_VTX_SEMANTIC_17
);
203 LINK_STATES(SQ_VTX_SEMANTIC_18
);
204 LINK_STATES(SQ_VTX_SEMANTIC_19
);
205 LINK_STATES(SQ_VTX_SEMANTIC_20
);
206 LINK_STATES(SQ_VTX_SEMANTIC_21
);
207 LINK_STATES(SQ_VTX_SEMANTIC_22
);
208 LINK_STATES(SQ_VTX_SEMANTIC_23
);
209 LINK_STATES(SQ_VTX_SEMANTIC_24
);
210 LINK_STATES(SQ_VTX_SEMANTIC_25
);
211 LINK_STATES(SQ_VTX_SEMANTIC_26
);
212 LINK_STATES(SQ_VTX_SEMANTIC_27
);
213 LINK_STATES(SQ_VTX_SEMANTIC_28
);
214 LINK_STATES(SQ_VTX_SEMANTIC_29
);
215 LINK_STATES(SQ_VTX_SEMANTIC_30
);
216 LINK_STATES(SQ_VTX_SEMANTIC_31
);
219 LINK_STATES(SPI_VS_OUT_ID_0
);
220 LINK_STATES(SPI_VS_OUT_ID_1
);
221 LINK_STATES(SPI_VS_OUT_ID_2
);
222 LINK_STATES(SPI_VS_OUT_ID_3
);
223 LINK_STATES(SPI_VS_OUT_ID_4
);
224 LINK_STATES(SPI_VS_OUT_ID_5
);
225 LINK_STATES(SPI_VS_OUT_ID_6
);
226 LINK_STATES(SPI_VS_OUT_ID_7
);
227 LINK_STATES(SPI_VS_OUT_ID_8
);
228 LINK_STATES(SPI_VS_OUT_ID_9
);
230 LINK_STATES(SPI_PS_INPUT_CNTL_0
);
231 LINK_STATES(SPI_PS_INPUT_CNTL_1
);
232 LINK_STATES(SPI_PS_INPUT_CNTL_2
);
233 LINK_STATES(SPI_PS_INPUT_CNTL_3
);
234 LINK_STATES(SPI_PS_INPUT_CNTL_4
);
235 LINK_STATES(SPI_PS_INPUT_CNTL_5
);
236 LINK_STATES(SPI_PS_INPUT_CNTL_6
);
237 LINK_STATES(SPI_PS_INPUT_CNTL_7
);
238 LINK_STATES(SPI_PS_INPUT_CNTL_8
);
239 LINK_STATES(SPI_PS_INPUT_CNTL_9
);
240 LINK_STATES(SPI_PS_INPUT_CNTL_10
);
241 LINK_STATES(SPI_PS_INPUT_CNTL_11
);
242 LINK_STATES(SPI_PS_INPUT_CNTL_12
);
243 LINK_STATES(SPI_PS_INPUT_CNTL_13
);
244 LINK_STATES(SPI_PS_INPUT_CNTL_14
);
245 LINK_STATES(SPI_PS_INPUT_CNTL_15
);
246 LINK_STATES(SPI_PS_INPUT_CNTL_16
);
247 LINK_STATES(SPI_PS_INPUT_CNTL_17
);
248 LINK_STATES(SPI_PS_INPUT_CNTL_18
);
249 LINK_STATES(SPI_PS_INPUT_CNTL_19
);
250 LINK_STATES(SPI_PS_INPUT_CNTL_20
);
251 LINK_STATES(SPI_PS_INPUT_CNTL_21
);
252 LINK_STATES(SPI_PS_INPUT_CNTL_22
);
253 LINK_STATES(SPI_PS_INPUT_CNTL_23
);
254 LINK_STATES(SPI_PS_INPUT_CNTL_24
);
255 LINK_STATES(SPI_PS_INPUT_CNTL_25
);
256 LINK_STATES(SPI_PS_INPUT_CNTL_26
);
257 LINK_STATES(SPI_PS_INPUT_CNTL_27
);
258 LINK_STATES(SPI_PS_INPUT_CNTL_28
);
259 LINK_STATES(SPI_PS_INPUT_CNTL_29
);
260 LINK_STATES(SPI_PS_INPUT_CNTL_30
);
261 LINK_STATES(SPI_PS_INPUT_CNTL_31
);
263 LINK_STATES(SPI_VS_OUT_CONFIG
);
264 LINK_STATES(SPI_THREAD_GROUPING
);
265 LINK_STATES(SPI_PS_IN_CONTROL_0
);
266 LINK_STATES(SPI_PS_IN_CONTROL_1
);
267 LINK_STATES(SPI_INTERP_CONTROL_0
);
268 LINK_STATES(SPI_INPUT_Z
);
269 LINK_STATES(SPI_FOG_CNTL
);
270 LINK_STATES(SPI_FOG_FUNC_SCALE
);
271 LINK_STATES(SPI_FOG_FUNC_BIAS
);
274 LINK_STATES(SQ_ESGS_RING_ITEMSIZE
);
275 LINK_STATES(SQ_GSVS_RING_ITEMSIZE
);
276 LINK_STATES(SQ_ESTMP_RING_ITEMSIZE
);
277 LINK_STATES(SQ_GSTMP_RING_ITEMSIZE
);
278 LINK_STATES(SQ_VSTMP_RING_ITEMSIZE
);
279 LINK_STATES(SQ_PSTMP_RING_ITEMSIZE
);
280 LINK_STATES(SQ_FBUF_RING_ITEMSIZE
);
281 LINK_STATES(SQ_REDUC_RING_ITEMSIZE
);
282 //LINK_STATES(SQ_GS_VERT_ITEMSIZE);
284 pStateListWork
->puiValue
= (unsigned int*)&(r700
->SQ_GS_VERT_ITEMSIZE
);
285 pStateListWork
->unOffset
= mmSQ_GS_VERT_ITEMSIZE
- ASIC_CONTEXT_BASE_INDEX
;
286 pStateListWork
->pNext
= NULL
; /* END OF STATE LIST */
291 void r700SetupVTXConstants(GLcontext
* ctx
,
292 unsigned int nStreamID
,
294 unsigned int size
, /* number of elements in vector */
296 unsigned int count
) /* number of vectors in stream */
298 context_t
*context
= R700_CONTEXT(ctx
);
300 struct radeon_aos
* paos
= (struct radeon_aos
*)pAos
;
301 offset_modifiers offset_mod
= {NO_SHIFT
, 0, 0xFFFFFFFF};
303 BATCH_LOCALS(&context
->radeon
);
305 unsigned int uSQ_VTX_CONSTANT_WORD0_0
;
306 unsigned int uSQ_VTX_CONSTANT_WORD1_0
;
307 unsigned int uSQ_VTX_CONSTANT_WORD2_0
= 0;
308 unsigned int uSQ_VTX_CONSTANT_WORD3_0
= 0;
309 unsigned int uSQ_VTX_CONSTANT_WORD6_0
= 0;
311 uSQ_VTX_CONSTANT_WORD0_0
= paos
->offset
;
312 uSQ_VTX_CONSTANT_WORD1_0
= count
* (size
* 4) - 1;
314 uSQ_VTX_CONSTANT_WORD2_0
|= 0 << BASE_ADDRESS_HI_shift
/* TODO */
315 |stride
<< SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift
316 |GetSurfaceFormat(GL_FLOAT
, size
, NULL
) << SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_shift
/* TODO : trace back api for initial data type, not only GL_FLOAT */
317 |SQ_NUM_FORMAT_SCALED
<< SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift
318 |SQ_VTX_CONSTANT_WORD2_0__FORMAT_COMP_ALL_bit
;
320 uSQ_VTX_CONSTANT_WORD3_0
|= 1 << MEM_REQUEST_SIZE_shift
;
322 uSQ_VTX_CONSTANT_WORD6_0
|= SQ_TEX_VTX_VALID_BUFFER
<< SQ_TEX_RESOURCE_WORD6_0__TYPE_shift
;
324 BEGIN_BATCH_NO_AUTOSTATE(9);
326 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE
, 7));
327 R600_OUT_BATCH((nStreamID
+ SQ_FETCH_RESOURCE_VS_OFFSET
) * FETCH_RESOURCE_STRIDE
);
329 R600_OUT_BATCH_RELOC(uSQ_VTX_CONSTANT_WORD0_0
,
331 uSQ_VTX_CONSTANT_WORD0_0
,
332 RADEON_GEM_DOMAIN_GTT
, 0, 0, &offset_mod
);
333 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD1_0
);
334 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD2_0
);
335 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD3_0
);
338 R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD6_0
);
345 int r700SetupStreams(GLcontext
* ctx
)
347 context_t
*context
= R700_CONTEXT(ctx
);
349 BATCH_LOCALS(&context
->radeon
);
351 struct r700_vertex_program
*vpc
352 = (struct r700_vertex_program
*)ctx
->VertexProgram
._Current
;
354 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
355 struct vertex_buffer
*vb
= &tnl
->vb
;
360 BEGIN_BATCH_NO_AUTOSTATE(6);
361 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST
, 1));
362 R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC
- ASIC_CTL_CONST_BASE_INDEX
);
365 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST
, 1));
366 R600_OUT_BATCH(mmSQ_VTX_START_INST_LOC
- ASIC_CTL_CONST_BASE_INDEX
);
371 context
->radeon
.tcl
.aos_count
= 0;
372 for(i
=0; i
<VERT_ATTRIB_MAX
; i
++)
375 if(vpc
->mesa_program
.Base
.InputsRead
& unBit
)
377 rcommon_emit_vector(ctx
,
378 &context
->radeon
.tcl
.aos
[i
],
379 vb
->AttribPtr
[i
]->data
,
380 vb
->AttribPtr
[i
]->size
,
381 vb
->AttribPtr
[i
]->stride
,
384 /* currently aos are packed */
385 r700SetupVTXConstants(ctx
,
387 (void*)(&context
->radeon
.tcl
.aos
[i
]),
388 (unsigned int)context
->radeon
.tcl
.aos
[i
].components
,
389 (unsigned int)context
->radeon
.tcl
.aos
[i
].stride
* 4,
390 (unsigned int)context
->radeon
.tcl
.aos
[i
].count
);
392 context
->radeon
.tcl
.aos_count
++;
396 return R600_FALLBACK_NONE
;
399 inline GLboolean
needRelocReg(context_t
*context
, unsigned int reg
)
401 switch (reg
+ ASIC_CONTEXT_BASE_INDEX
)
403 case mmCB_COLOR0_BASE
:
404 case mmCB_COLOR1_BASE
:
405 case mmCB_COLOR2_BASE
:
406 case mmCB_COLOR3_BASE
:
407 case mmCB_COLOR4_BASE
:
408 case mmCB_COLOR5_BASE
:
409 case mmCB_COLOR6_BASE
:
410 case mmCB_COLOR7_BASE
:
411 case mmDB_DEPTH_BASE
:
412 case mmSQ_PGM_START_VS
:
413 case mmSQ_PGM_START_FS
:
414 case mmSQ_PGM_START_ES
:
415 case mmSQ_PGM_START_GS
:
416 case mmSQ_PGM_START_PS
:
424 inline GLboolean
setRelocReg(context_t
*context
, unsigned int reg
)
426 BATCH_LOCALS(&context
->radeon
);
427 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
429 struct radeon_bo
* pbo
;
431 offset_modifiers offset_mod
;
433 switch (reg
+ ASIC_CONTEXT_BASE_INDEX
)
435 case mmDB_DEPTH_BASE
:
437 GLcontext
*ctx
= GL_CONTEXT(context
);
438 struct radeon_renderbuffer
*rrb
;
439 rrb
= radeon_get_depthbuffer(&context
->radeon
);
441 offset_mod
.shift
= NO_SHIFT
;
442 offset_mod
.shiftbits
= 0;
443 offset_mod
.mask
= 0xFFFFFFFF;
445 R600_OUT_BATCH_RELOC(r700
->DB_DEPTH_BASE
.u32All
,
447 r700
->DB_DEPTH_BASE
.u32All
,
448 0, RADEON_GEM_DOMAIN_VRAM
, 0, &offset_mod
);
458 GLboolean
r700SendContextStates(context_t
*context
)
460 BATCH_LOCALS(&context
->radeon
);
462 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
464 ContextState
* pState
= r700
->pStateList
;
465 ContextState
* pInit
;
469 while(NULL
!= pState
)
475 if(GL_FALSE
== needRelocReg(context
, pState
->unOffset
))
477 while(NULL
!= pState
->pNext
)
479 if( ((pState
->pNext
->unOffset
- pState
->unOffset
) > 1)
480 || (GL_TRUE
== needRelocReg(context
, pState
->pNext
->unOffset
)) )
486 pState
= pState
->pNext
;
492 pState
= pState
->pNext
;
494 BEGIN_BATCH_NO_AUTOSTATE(toSend
+ 2);
495 R600_OUT_BATCH_REGSEQ(((pInit
->unOffset
+ ASIC_CONTEXT_BASE_INDEX
)<<2), toSend
);
496 for(ui
=0; ui
<toSend
; ui
++)
498 if( GL_FALSE
== setRelocReg(context
, pInit
->unOffset
) )
500 /* for not reloc reg. */
501 R600_OUT_BATCH(*(pInit
->puiValue
));
503 pInit
= pInit
->pNext
;
513 GLboolean
r700SendRenderTargetState(context_t
*context
, int id
)
515 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
516 struct radeon_renderbuffer
*rrb
;
517 struct radeon_bo
* pbo
;
518 offset_modifiers offset_mod
;
519 BATCH_LOCALS(&context
->radeon
);
521 rrb
= radeon_get_colorbuffer(&context
->radeon
);
522 if (!rrb
|| !rrb
->bo
) {
523 fprintf(stderr
, "no rrb\n");
527 if (id
> R700_MAX_RENDER_TARGETS
)
530 if (!r700
->render_target
[id
].enabled
)
533 offset_mod
.shift
= NO_SHIFT
;
534 offset_mod
.shiftbits
= 0;
535 offset_mod
.mask
= 0xFFFFFFFF;
537 BEGIN_BATCH_NO_AUTOSTATE(3);
538 R600_OUT_BATCH_REGSEQ(CB_COLOR0_BASE
+ (4 * id
), 1);
539 R600_OUT_BATCH_RELOC(r700
->render_target
[id
].CB_COLOR0_BASE
.u32All
,
541 r700
->render_target
[id
].CB_COLOR0_BASE
.u32All
,
542 0, RADEON_GEM_DOMAIN_VRAM
, 0, &offset_mod
);
545 if ((context
->radeon
.radeonScreen
->chip_family
> CHIP_FAMILY_R600
) &&
546 (context
->radeon
.radeonScreen
->chip_family
< CHIP_FAMILY_RV770
)) {
547 BEGIN_BATCH_NO_AUTOSTATE(2);
548 R600_OUT_BATCH(CP_PACKET3(R600_IT_SURFACE_BASE_UPDATE
, 0));
549 R600_OUT_BATCH((2 << id
));
553 BEGIN_BATCH_NO_AUTOSTATE(18);
554 R600_OUT_BATCH_REGVAL(CB_COLOR0_SIZE
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_SIZE
.u32All
);
555 R600_OUT_BATCH_REGVAL(CB_COLOR0_VIEW
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_VIEW
.u32All
);
556 R600_OUT_BATCH_REGVAL(CB_COLOR0_INFO
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_INFO
.u32All
);
557 R600_OUT_BATCH_REGVAL(CB_COLOR0_TILE
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_TILE
.u32All
);
558 R600_OUT_BATCH_REGVAL(CB_COLOR0_FRAG
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_FRAG
.u32All
);
559 R600_OUT_BATCH_REGVAL(CB_COLOR0_MASK
+ (4 * id
), r700
->render_target
[id
].CB_COLOR0_MASK
.u32All
);
562 if (context
->radeon
.radeonScreen
->chip_family
> CHIP_FAMILY_R600
) {
563 BEGIN_BATCH_NO_AUTOSTATE(3);
564 R600_OUT_BATCH_REGVAL(CB_BLEND0_CONTROL
+ (4 * id
), r700
->render_target
[id
].CB_BLEND0_CONTROL
.u32All
);
573 GLboolean
r700SendPSState(context_t
*context
)
575 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
576 struct radeon_renderbuffer
*rrb
;
577 struct radeon_bo
* pbo
;
578 offset_modifiers offset_mod
;
579 BATCH_LOCALS(&context
->radeon
);
581 pbo
= (struct radeon_bo
*)r700GetActiveFpShaderBo(GL_CONTEXT(context
));
583 offset_mod
.shift
= NO_SHIFT
;
584 offset_mod
.shiftbits
= 0;
585 offset_mod
.mask
= 0xFFFFFFFF;
587 BEGIN_BATCH_NO_AUTOSTATE(3);
588 R600_OUT_BATCH_REGSEQ(SQ_PGM_START_PS
, 1);
589 R600_OUT_BATCH_RELOC(r700
->ps
.SQ_PGM_START_PS
.u32All
,
591 r700
->ps
.SQ_PGM_START_PS
.u32All
,
592 RADEON_GEM_DOMAIN_GTT
, 0, 0, &offset_mod
);
595 BEGIN_BATCH_NO_AUTOSTATE(9);
596 R600_OUT_BATCH_REGVAL(SQ_PGM_RESOURCES_PS
, r700
->ps
.SQ_PGM_RESOURCES_PS
.u32All
);
597 R600_OUT_BATCH_REGVAL(SQ_PGM_EXPORTS_PS
, r700
->ps
.SQ_PGM_EXPORTS_PS
.u32All
);
598 R600_OUT_BATCH_REGVAL(SQ_PGM_CF_OFFSET_PS
, r700
->ps
.SQ_PGM_CF_OFFSET_PS
.u32All
);
606 GLboolean
r700SendVSState(context_t
*context
)
608 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
609 struct radeon_renderbuffer
*rrb
;
610 struct radeon_bo
* pbo
;
611 offset_modifiers offset_mod
;
612 BATCH_LOCALS(&context
->radeon
);
614 pbo
= (struct radeon_bo
*)r700GetActiveVpShaderBo(GL_CONTEXT(context
));
616 offset_mod
.shift
= NO_SHIFT
;
617 offset_mod
.shiftbits
= 0;
618 offset_mod
.mask
= 0xFFFFFFFF;
620 BEGIN_BATCH_NO_AUTOSTATE(3);
621 R600_OUT_BATCH_REGSEQ(SQ_PGM_START_VS
, 1);
622 R600_OUT_BATCH_RELOC(r700
->vs
.SQ_PGM_START_VS
.u32All
,
624 r700
->vs
.SQ_PGM_START_VS
.u32All
,
625 RADEON_GEM_DOMAIN_GTT
, 0, 0, &offset_mod
);
628 BEGIN_BATCH_NO_AUTOSTATE(6);
629 R600_OUT_BATCH_REGVAL(SQ_PGM_RESOURCES_VS
, r700
->vs
.SQ_PGM_RESOURCES_VS
.u32All
);
630 R600_OUT_BATCH_REGVAL(SQ_PGM_CF_OFFSET_VS
, r700
->vs
.SQ_PGM_CF_OFFSET_VS
.u32All
);
638 GLboolean
r700SendViewportState(context_t
*context
, int id
)
640 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
641 struct radeon_renderbuffer
*rrb
;
642 struct radeon_bo
* pbo
;
643 offset_modifiers offset_mod
;
644 BATCH_LOCALS(&context
->radeon
);
646 if (id
> R700_MAX_VIEWPORTS
)
649 if (!r700
->viewport
[id
].enabled
)
652 BEGIN_BATCH_NO_AUTOSTATE(16);
653 R600_OUT_BATCH_REGSEQ(PA_SC_VPORT_SCISSOR_0_TL
+ (8 * id
), 2);
654 R600_OUT_BATCH(r700
->viewport
[id
].PA_SC_VPORT_SCISSOR_0_TL
.u32All
);
655 R600_OUT_BATCH(r700
->viewport
[id
].PA_SC_VPORT_SCISSOR_0_BR
.u32All
);
656 R600_OUT_BATCH_REGSEQ(PA_SC_VPORT_ZMIN_0
+ (8 * id
), 2);
657 R600_OUT_BATCH(r700
->viewport
[id
].PA_SC_VPORT_ZMIN_0
.u32All
);
658 R600_OUT_BATCH(r700
->viewport
[id
].PA_SC_VPORT_ZMAX_0
.u32All
);
659 R600_OUT_BATCH_REGSEQ(PA_CL_VPORT_XSCALE_0
+ (24 * id
), 6);
660 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_XSCALE
.u32All
);
661 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_XOFFSET
.u32All
);
662 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_YSCALE
.u32All
);
663 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_YOFFSET
.u32All
);
664 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_ZSCALE
.u32All
);
665 R600_OUT_BATCH(r700
->viewport
[id
].PA_CL_VPORT_ZOFFSET
.u32All
);
673 GLboolean
r700SendSQConfig(context_t
*context
)
675 R700_CHIP_CONTEXT
*r700
= R700_CONTEXT_STATES(context
);
676 BATCH_LOCALS(&context
->radeon
);
678 BEGIN_BATCH_NO_AUTOSTATE(8);
679 R600_OUT_BATCH_REGSEQ(SQ_CONFIG
, 6);
680 R600_OUT_BATCH(r700
->sq_config
.SQ_CONFIG
.u32All
);
681 R600_OUT_BATCH(r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_1
.u32All
);
682 R600_OUT_BATCH(r700
->sq_config
.SQ_GPR_RESOURCE_MGMT_2
.u32All
);
683 R600_OUT_BATCH(r700
->sq_config
.SQ_THREAD_RESOURCE_MGMT
.u32All
);
684 R600_OUT_BATCH(r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_1
.u32All
);
685 R600_OUT_BATCH(r700
->sq_config
.SQ_STACK_RESOURCE_MGMT_2
.u32All
);