2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
4 The Weather Channel (TM) funded Tungsten Graphics to develop the
5 initial release of the Radeon 8500 driver under the XFree86 license.
6 This notice must be preserved.
8 Permission is hereby granted, free of charge, to any person obtaining
9 a copy of this software and associated documentation files (the
10 "Software"), to deal in the Software without restriction, including
11 without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense, and/or sell copies of the Software, and to
13 permit persons to whom the Software is furnished to do so, subject to
14 the following conditions:
16 The above copyright notice and this permission notice (including the
17 next paragraph) shall be included in all copies or substantial
18 portions of the Software.
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 **************************************************************************/
33 * \author Nicolai Haehnle <prefect_@gmx.net>
36 #include "main/glheader.h"
37 #include "main/state.h"
38 #include "main/imports.h"
39 #include "main/macros.h"
40 #include "main/context.h"
41 #include "main/simple_list.h"
42 #include "swrast/swrast.h"
45 #include "radeon_drm.h"
47 #include "r300_context.h"
48 #include "r300_ioctl.h"
49 #include "radeon_reg.h"
51 #include "r300_cmdbuf.h"
52 #include "r300_emit.h"
53 #include "radeon_bocs_wrapper.h"
54 #include "radeon_mipmap_tree.h"
55 #include "r300_state.h"
56 #include "radeon_reg.h"
58 #define R300_VAP_PVS_UPLOAD_ADDRESS 0x2200
59 # define RADEON_ONE_REG_WR (1 << 15)
61 /** # of dwords reserved for additional instructions that may need to be written
64 #define SPACE_FOR_FLUSHING 4
66 static unsigned packet0_count(r300ContextPtr r300
, uint32_t *pkt
)
68 if (r300
->radeon
.radeonScreen
->kernel_mm
) {
69 return ((((*pkt
) >> 16) & 0x3FFF) + 1);
71 drm_r300_cmd_header_t
*t
= (drm_r300_cmd_header_t
*)pkt
;
72 return t
->packet0
.count
;
77 #define vpu_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->vpu.count)
78 #define r500fp_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->r500fp.count)
80 void emit_vpu(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
82 r300ContextPtr r300
= R300_CONTEXT(ctx
);
83 BATCH_LOCALS(&r300
->radeon
);
84 drm_r300_cmd_header_t cmd
;
85 uint32_t addr
, ndw
, i
;
87 if (!r300
->radeon
.radeonScreen
->kernel_mm
) {
89 dwords
= (*atom
->check
) (ctx
, atom
);
90 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
91 OUT_BATCH_TABLE(atom
->cmd
, dwords
);
97 addr
= (cmd
.vpu
.adrhi
<< 8) | cmd
.vpu
.adrlo
;
98 ndw
= cmd
.vpu
.count
* 4;
101 if (r300
->vap_flush_needed
) {
102 BEGIN_BATCH_NO_AUTOSTATE(15 + ndw
);
104 /* flush processing vertices */
105 OUT_BATCH_REGVAL(R300_SC_SCREENDOOR
, 0);
106 OUT_BATCH_REGVAL(R300_RB3D_DSTCACHE_CTLSTAT
, R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D
);
107 OUT_BATCH_REGVAL(RADEON_WAIT_UNTIL
, RADEON_WAIT_3D_IDLECLEAN
);
108 OUT_BATCH_REGVAL(R300_SC_SCREENDOOR
, 0xffffff);
109 OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG
, 0);
110 r300
->vap_flush_needed
= GL_FALSE
;
112 BEGIN_BATCH_NO_AUTOSTATE(5 + ndw
);
114 OUT_BATCH_REGVAL(R300_VAP_PVS_UPLOAD_ADDRESS
, addr
);
115 OUT_BATCH(CP_PACKET0(R300_VAP_PVS_UPLOAD_DATA
, ndw
-1) | RADEON_ONE_REG_WR
);
116 for (i
= 0; i
< ndw
; i
++) {
117 OUT_BATCH(atom
->cmd
[i
+1]);
119 OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG
, 0);
124 void emit_r500fp(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
126 r300ContextPtr r300
= R300_CONTEXT(ctx
);
127 BATCH_LOCALS(&r300
->radeon
);
128 drm_r300_cmd_header_t cmd
;
129 uint32_t addr
, ndw
, i
, sz
;
130 int type
, clamp
, stride
;
132 if (!r300
->radeon
.radeonScreen
->kernel_mm
) {
134 dwords
= (*atom
->check
) (ctx
, atom
);
135 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
136 OUT_BATCH_TABLE(atom
->cmd
, dwords
);
141 cmd
.u
= atom
->cmd
[0];
142 sz
= cmd
.r500fp
.count
;
143 addr
= ((cmd
.r500fp
.adrhi_flags
& 1) << 8) | cmd
.r500fp
.adrlo
;
144 type
= !!(cmd
.r500fp
.adrhi_flags
& R500FP_CONSTANT_TYPE
);
145 clamp
= !!(cmd
.r500fp
.adrhi_flags
& R500FP_CONSTANT_CLAMP
);
147 addr
|= (type
<< 16);
148 addr
|= (clamp
<< 17);
150 stride
= type
? 4 : 6;
155 BEGIN_BATCH_NO_AUTOSTATE(3 + ndw
);
156 OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_INDEX
, 0));
158 OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_DATA
, ndw
-1) | RADEON_ONE_REG_WR
);
159 for (i
= 0; i
< ndw
; i
++) {
160 OUT_BATCH(atom
->cmd
[i
+1]);
166 static void emit_tex_offsets(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
168 r300ContextPtr r300
= R300_CONTEXT(ctx
);
169 BATCH_LOCALS(&r300
->radeon
);
170 int numtmus
= packet0_count(r300
, r300
->hw
.tex
.offset
.cmd
);
176 for(i
= 0; i
< numtmus
; ++i
) {
177 radeonTexObj
*t
= r300
->hw
.textures
[i
];
183 if (r300
->radeon
.radeonScreen
->kernel_mm
&& notexture
) {
186 BEGIN_BATCH_NO_AUTOSTATE(4 * numtmus
);
187 for(i
= 0; i
< numtmus
; ++i
) {
188 radeonTexObj
*t
= r300
->hw
.textures
[i
];
189 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0
+ (i
* 4), 1);
190 if (t
&& !t
->image_override
) {
191 OUT_BATCH_RELOC(t
->tile_bits
, t
->mt
->bo
, 0,
192 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
194 OUT_BATCH(r300
->radeon
.radeonScreen
->texOffset
[0]);
195 } else { /* override cases */
197 OUT_BATCH_RELOC(t
->tile_bits
, t
->bo
, 0,
198 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
199 } else if (!r300
->radeon
.radeonScreen
->kernel_mm
) {
200 OUT_BATCH(t
->override_offset
);
203 OUT_BATCH(r300
->radeon
.radeonScreen
->texOffset
[0]);
210 static void emit_cb_offset(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
212 r300ContextPtr r300
= R300_CONTEXT(ctx
);
213 BATCH_LOCALS(&r300
->radeon
);
214 struct radeon_renderbuffer
*rrb
;
216 uint32_t offset
= r300
->radeon
.state
.color
.draw_offset
;
218 rrb
= radeon_get_colorbuffer(&r300
->radeon
);
219 if (!rrb
|| !rrb
->bo
) {
220 fprintf(stderr
, "no rrb\n");
224 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
226 cbpitch
|= R300_COLOR_FORMAT_ARGB8888
;
228 cbpitch
|= R300_COLOR_FORMAT_RGB565
;
230 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
)
231 cbpitch
|= R300_COLOR_TILE_ENABLE
;
233 BEGIN_BATCH_NO_AUTOSTATE(6);
234 OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0
, 1);
235 OUT_BATCH_RELOC(offset
, rrb
->bo
, offset
, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
236 OUT_BATCH_REGSEQ(R300_RB3D_COLORPITCH0
, 1);
241 static void emit_zb_offset(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
243 r300ContextPtr r300
= R300_CONTEXT(ctx
);
244 BATCH_LOCALS(&r300
->radeon
);
245 struct radeon_renderbuffer
*rrb
;
248 rrb
= radeon_get_depthbuffer(&r300
->radeon
);
252 zbpitch
= (rrb
->pitch
/ rrb
->cpp
);
253 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
) {
254 zbpitch
|= R300_DEPTHMACROTILE_ENABLE
;
256 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MICRO_TILE
){
257 zbpitch
|= R300_DEPTHMICROTILE_TILED
;
260 BEGIN_BATCH_NO_AUTOSTATE(6);
261 OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET
, 1);
262 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
263 OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH
, zbpitch
);
267 static void emit_zstencil_format(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
269 r300ContextPtr r300
= R300_CONTEXT(ctx
);
270 BATCH_LOCALS(&r300
->radeon
);
271 struct radeon_renderbuffer
*rrb
;
274 rrb
= radeon_get_depthbuffer(&r300
->radeon
);
279 format
= R300_DEPTHFORMAT_16BIT_INT_Z
;
280 else if (rrb
->cpp
== 4)
281 format
= R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL
;
284 OUT_BATCH(atom
->cmd
[0]);
285 atom
->cmd
[1] &= ~(3 << 0);
286 atom
->cmd
[1] |= format
;
287 OUT_BATCH(atom
->cmd
[1]);
288 OUT_BATCH(atom
->cmd
[2]);
289 OUT_BATCH(atom
->cmd
[3]);
290 OUT_BATCH(atom
->cmd
[4]);
293 static int check_always(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
295 return atom
->cmd_size
;
298 static int check_variable(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
300 r300ContextPtr r300
= R300_CONTEXT(ctx
);
302 if (atom
->cmd
[0] == CP_PACKET2
) {
305 cnt
= packet0_count(r300
, atom
->cmd
);
306 return cnt
? cnt
+ 1 : 0;
309 int check_vpu(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
313 cnt
= vpu_count(atom
->cmd
);
314 return cnt
? (cnt
* 4) + 1 : 0;
317 int check_r500fp(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
321 cnt
= r500fp_count(atom
->cmd
);
322 return cnt
? (cnt
* 6) + 1 : 0;
325 int check_r500fp_const(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
329 cnt
= r500fp_count(atom
->cmd
);
330 return cnt
? (cnt
* 4) + 1 : 0;
333 #define ALLOC_STATE( ATOM, CHK, SZ, IDX ) \
335 r300->hw.ATOM.cmd_size = (SZ); \
336 r300->hw.ATOM.cmd = (uint32_t*)CALLOC((SZ) * sizeof(uint32_t)); \
337 r300->hw.ATOM.name = #ATOM; \
338 r300->hw.ATOM.idx = (IDX); \
339 r300->hw.ATOM.check = check_##CHK; \
340 r300->hw.ATOM.dirty = GL_FALSE; \
341 r300->radeon.hw.max_state_size += (SZ); \
342 insert_at_tail(&r300->radeon.hw.atomlist, &r300->hw.ATOM); \
345 * Allocate memory for the command buffer and initialize the state atom
346 * list. Note that the initial hardware state is set by r300InitState().
348 void r300InitCmdBuf(r300ContextPtr r300
)
355 if (!(r300
->radeon
.radeonScreen
->chip_flags
& RADEON_CHIPSET_TCL
))
358 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
)
361 r300
->radeon
.hw
.max_state_size
= 2 + 2; /* reserve extra space for WAIT_IDLE and tex cache flush */
363 mtu
= r300
->radeon
.glCtx
->Const
.MaxTextureUnits
;
364 if (RADEON_DEBUG
& DEBUG_TEXTURE
) {
365 fprintf(stderr
, "Using %d maximum texture units..\n", mtu
);
368 /* Setup the atom linked list */
369 make_empty_list(&r300
->radeon
.hw
.atomlist
);
370 r300
->radeon
.hw
.atomlist
.name
= "atom-list";
372 /* Initialize state atoms */
373 ALLOC_STATE(vpt
, always
, R300_VPT_CMDSIZE
, 0);
374 r300
->hw
.vpt
.cmd
[R300_VPT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SE_VPORT_XSCALE
, 6);
375 ALLOC_STATE(vap_cntl
, always
, R300_VAP_CNTL_SIZE
, 0);
376 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_FLUSH
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PVS_STATE_FLUSH_REG
, 1);
377 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_FLUSH_1
] = 0;
378 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_CMD
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CNTL
, 1);
380 ALLOC_STATE(vap_index_offset
, always
, 2, 0);
381 r300
->hw
.vap_index_offset
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_VAP_INDEX_OFFSET
, 1);
382 r300
->hw
.vap_index_offset
.cmd
[1] = 0;
384 ALLOC_STATE(vte
, always
, 3, 0);
385 r300
->hw
.vte
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SE_VTE_CNTL
, 2);
386 ALLOC_STATE(vap_vf_max_vtx_indx
, always
, 3, 0);
387 r300
->hw
.vap_vf_max_vtx_indx
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_VF_MAX_VTX_INDX
, 2);
388 ALLOC_STATE(vap_cntl_status
, always
, 2, 0);
389 r300
->hw
.vap_cntl_status
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CNTL_STATUS
, 1);
390 ALLOC_STATE(vir
[0], variable
, R300_VIR_CMDSIZE
, 0);
391 r300
->hw
.vir
[0].cmd
[R300_VIR_CMD_0
] =
392 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PROG_STREAM_CNTL_0
, 1);
393 ALLOC_STATE(vir
[1], variable
, R300_VIR_CMDSIZE
, 1);
394 r300
->hw
.vir
[1].cmd
[R300_VIR_CMD_0
] =
395 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PROG_STREAM_CNTL_EXT_0
, 1);
396 ALLOC_STATE(vic
, always
, R300_VIC_CMDSIZE
, 0);
397 r300
->hw
.vic
.cmd
[R300_VIC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_VTX_STATE_CNTL
, 2);
398 ALLOC_STATE(vap_psc_sgn_norm_cntl
, always
, 2, 0);
399 r300
->hw
.vap_psc_sgn_norm_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PSC_SGN_NORM_CNTL
, SGN_NORM_ZERO_CLAMP_MINUS_ONE
);
402 ALLOC_STATE(vap_clip_cntl
, always
, 2, 0);
403 r300
->hw
.vap_clip_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CLIP_CNTL
, 1);
404 ALLOC_STATE(vap_clip
, always
, 5, 0);
405 r300
->hw
.vap_clip
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_GB_VERT_CLIP_ADJ
, 4);
406 ALLOC_STATE(vap_pvs_vtx_timeout_reg
, always
, 2, 0);
407 r300
->hw
.vap_pvs_vtx_timeout_reg
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, VAP_PVS_VTX_TIMEOUT_REG
, 1);
410 ALLOC_STATE(vof
, always
, R300_VOF_CMDSIZE
, 0);
411 r300
->hw
.vof
.cmd
[R300_VOF_CMD_0
] =
412 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_OUTPUT_VTX_FMT_0
, 2);
415 ALLOC_STATE(pvs
, always
, R300_PVS_CMDSIZE
, 0);
416 r300
->hw
.pvs
.cmd
[R300_PVS_CMD_0
] =
417 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PVS_CODE_CNTL_0
, 3);
420 ALLOC_STATE(gb_enable
, always
, 2, 0);
421 r300
->hw
.gb_enable
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GB_ENABLE
, 1);
422 ALLOC_STATE(gb_misc
, always
, R300_GB_MISC_CMDSIZE
, 0);
423 r300
->hw
.gb_misc
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GB_MSPOS0
, 5);
424 ALLOC_STATE(txe
, always
, R300_TXE_CMDSIZE
, 0);
425 r300
->hw
.txe
.cmd
[R300_TXE_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_ENABLE
, 1);
426 ALLOC_STATE(ga_point_s0
, always
, 5, 0);
427 r300
->hw
.ga_point_s0
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_S0
, 4);
428 ALLOC_STATE(ga_triangle_stipple
, always
, 2, 0);
429 r300
->hw
.ga_triangle_stipple
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_TRIANGLE_STIPPLE
, 1);
430 ALLOC_STATE(ps
, always
, R300_PS_CMDSIZE
, 0);
431 r300
->hw
.ps
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_SIZE
, 1);
432 ALLOC_STATE(ga_point_minmax
, always
, 4, 0);
433 r300
->hw
.ga_point_minmax
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_MINMAX
, 3);
434 ALLOC_STATE(lcntl
, always
, 2, 0);
435 r300
->hw
.lcntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_LINE_CNTL
, 1);
436 ALLOC_STATE(ga_line_stipple
, always
, 4, 0);
437 r300
->hw
.ga_line_stipple
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_LINE_STIPPLE_VALUE
, 3);
438 ALLOC_STATE(shade
, always
, 5, 0);
439 r300
->hw
.shade
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_ENHANCE
, 4);
440 ALLOC_STATE(polygon_mode
, always
, 4, 0);
441 r300
->hw
.polygon_mode
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POLY_MODE
, 3);
442 ALLOC_STATE(fogp
, always
, 3, 0);
443 r300
->hw
.fogp
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_FOG_SCALE
, 2);
444 ALLOC_STATE(zbias_cntl
, always
, 2, 0);
445 r300
->hw
.zbias_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_TEX_WRAP
, 1);
446 ALLOC_STATE(zbs
, always
, R300_ZBS_CMDSIZE
, 0);
447 r300
->hw
.zbs
.cmd
[R300_ZBS_CMD_0
] =
448 cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_POLY_OFFSET_FRONT_SCALE
, 4);
449 ALLOC_STATE(occlusion_cntl
, always
, 2, 0);
450 r300
->hw
.occlusion_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_POLY_OFFSET_ENABLE
, 1);
451 ALLOC_STATE(cul
, always
, R300_CUL_CMDSIZE
, 0);
452 r300
->hw
.cul
.cmd
[R300_CUL_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_CULL_MODE
, 1);
453 ALLOC_STATE(su_depth_scale
, always
, 3, 0);
454 r300
->hw
.su_depth_scale
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_DEPTH_SCALE
, 2);
455 ALLOC_STATE(rc
, always
, R300_RC_CMDSIZE
, 0);
456 r300
->hw
.rc
.cmd
[R300_RC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_COUNT
, 2);
458 ALLOC_STATE(ri
, always
, R500_RI_CMDSIZE
, 0);
459 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RS_IP_0
, 16);
460 for (i
= 0; i
< 8; i
++) {
461 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
+ i
+1] =
462 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_S_SHIFT
) |
463 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_T_SHIFT
) |
464 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_R_SHIFT
) |
465 (R500_RS_IP_PTR_K1
<< R500_RS_IP_TEX_PTR_Q_SHIFT
);
467 ALLOC_STATE(rr
, variable
, R300_RR_CMDSIZE
, 0);
468 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RS_INST_0
, 1);
470 ALLOC_STATE(ri
, always
, R300_RI_CMDSIZE
, 0);
471 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_IP_0
, 8);
472 ALLOC_STATE(rr
, variable
, R300_RR_CMDSIZE
, 0);
473 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_INST_0
, 1);
475 ALLOC_STATE(sc_hyperz
, always
, 3, 0);
476 r300
->hw
.sc_hyperz
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_HYPERZ
, 2);
477 ALLOC_STATE(sc_screendoor
, always
, 2, 0);
478 r300
->hw
.sc_screendoor
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_SCREENDOOR
, 1);
479 ALLOC_STATE(us_out_fmt
, always
, 6, 0);
480 r300
->hw
.us_out_fmt
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_OUT_FMT
, 5);
483 ALLOC_STATE(fp
, always
, R500_FP_CMDSIZE
, 0);
484 r300
->hw
.fp
.cmd
[R500_FP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_CONFIG
, 2);
485 r300
->hw
.fp
.cmd
[R500_FP_CNTL
] = R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO
;
486 r300
->hw
.fp
.cmd
[R500_FP_CMD_1
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_CODE_ADDR
, 3);
487 r300
->hw
.fp
.cmd
[R500_FP_CMD_2
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_FC_CTRL
, 1);
488 r300
->hw
.fp
.cmd
[R500_FP_FC_CNTL
] = 0; /* FIXME when we add flow control */
490 ALLOC_STATE(r500fp
, r500fp
, R500_FPI_CMDSIZE
, 0);
491 r300
->hw
.r500fp
.cmd
[R300_FPI_CMD_0
] =
492 cmdr500fp(r300
->radeon
.radeonScreen
, 0, 0, 0, 0);
493 r300
->hw
.r500fp
.emit
= emit_r500fp
;
494 ALLOC_STATE(r500fp_const
, r500fp_const
, R500_FPP_CMDSIZE
, 0);
495 r300
->hw
.r500fp_const
.cmd
[R300_FPI_CMD_0
] =
496 cmdr500fp(r300
->radeon
.radeonScreen
, 0, 0, 1, 0);
497 r300
->hw
.r500fp_const
.emit
= emit_r500fp
;
499 ALLOC_STATE(fp
, always
, R300_FP_CMDSIZE
, 0);
500 r300
->hw
.fp
.cmd
[R300_FP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_CONFIG
, 3);
501 r300
->hw
.fp
.cmd
[R300_FP_CMD_1
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_CODE_ADDR_0
, 4);
503 ALLOC_STATE(fpt
, variable
, R300_FPT_CMDSIZE
, 0);
504 r300
->hw
.fpt
.cmd
[R300_FPT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_TEX_INST_0
, 0);
506 ALLOC_STATE(fpi
[0], variable
, R300_FPI_CMDSIZE
, 0);
507 r300
->hw
.fpi
[0].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_RGB_INST_0
, 1);
508 ALLOC_STATE(fpi
[1], variable
, R300_FPI_CMDSIZE
, 1);
509 r300
->hw
.fpi
[1].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_RGB_ADDR_0
, 1);
510 ALLOC_STATE(fpi
[2], variable
, R300_FPI_CMDSIZE
, 2);
511 r300
->hw
.fpi
[2].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_ALPHA_INST_0
, 1);
512 ALLOC_STATE(fpi
[3], variable
, R300_FPI_CMDSIZE
, 3);
513 r300
->hw
.fpi
[3].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_ALPHA_ADDR_0
, 1);
514 ALLOC_STATE(fpp
, variable
, R300_FPP_CMDSIZE
, 0);
515 r300
->hw
.fpp
.cmd
[R300_FPP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_PFS_PARAM_0_X
, 0);
517 ALLOC_STATE(fogs
, always
, R300_FOGS_CMDSIZE
, 0);
518 r300
->hw
.fogs
.cmd
[R300_FOGS_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_FOG_BLEND
, 1);
519 ALLOC_STATE(fogc
, always
, R300_FOGC_CMDSIZE
, 0);
520 r300
->hw
.fogc
.cmd
[R300_FOGC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_FOG_COLOR_R
, 3);
521 ALLOC_STATE(at
, always
, R300_AT_CMDSIZE
, 0);
522 r300
->hw
.at
.cmd
[R300_AT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_ALPHA_FUNC
, 2);
523 ALLOC_STATE(fg_depth_src
, always
, 2, 0);
524 r300
->hw
.fg_depth_src
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_DEPTH_SRC
, 1);
525 ALLOC_STATE(rb3d_cctl
, always
, 2, 0);
526 r300
->hw
.rb3d_cctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_CCTL
, 1);
527 ALLOC_STATE(bld
, always
, R300_BLD_CMDSIZE
, 0);
528 r300
->hw
.bld
.cmd
[R300_BLD_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_CBLEND
, 2);
529 ALLOC_STATE(cmk
, always
, R300_CMK_CMDSIZE
, 0);
530 r300
->hw
.cmk
.cmd
[R300_CMK_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, RB3D_COLOR_CHANNEL_MASK
, 1);
532 ALLOC_STATE(blend_color
, always
, 3, 0);
533 r300
->hw
.blend_color
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RB3D_CONSTANT_COLOR_AR
, 2);
535 ALLOC_STATE(blend_color
, always
, 2, 0);
536 r300
->hw
.blend_color
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_BLEND_COLOR
, 1);
538 ALLOC_STATE(rop
, always
, 2, 0);
539 r300
->hw
.rop
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_ROPCNTL
, 1);
540 ALLOC_STATE(cb
, always
, R300_CB_CMDSIZE
, 0);
541 r300
->hw
.cb
.emit
= &emit_cb_offset
;
542 ALLOC_STATE(rb3d_dither_ctl
, always
, 10, 0);
543 r300
->hw
.rb3d_dither_ctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_DITHER_CTL
, 9);
544 ALLOC_STATE(rb3d_aaresolve_ctl
, always
, 2, 0);
545 r300
->hw
.rb3d_aaresolve_ctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_AARESOLVE_CTL
, 1);
546 ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold
, always
, 3, 0);
547 r300
->hw
.rb3d_discard_src_pixel_lte_threshold
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
, 2);
548 ALLOC_STATE(zs
, always
, R300_ZS_CMDSIZE
, 0);
549 r300
->hw
.zs
.cmd
[R300_ZS_CMD_0
] =
550 cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_CNTL
, 3);
552 ALLOC_STATE(zstencil_format
, always
, 5, 0);
553 r300
->hw
.zstencil_format
.cmd
[0] =
554 cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_FORMAT
, 4);
555 r300
->hw
.zstencil_format
.emit
= emit_zstencil_format
;
557 ALLOC_STATE(zb
, always
, R300_ZB_CMDSIZE
, 0);
558 r300
->hw
.zb
.emit
= emit_zb_offset
;
559 ALLOC_STATE(zb_depthclearvalue
, always
, 2, 0);
560 r300
->hw
.zb_depthclearvalue
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_DEPTHCLEARVALUE
, 1);
561 ALLOC_STATE(unk4F30
, always
, 3, 0);
562 r300
->hw
.unk4F30
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, 0x4F30, 2);
563 ALLOC_STATE(zb_hiz_offset
, always
, 2, 0);
564 r300
->hw
.zb_hiz_offset
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_HIZ_OFFSET
, 1);
565 ALLOC_STATE(zb_hiz_pitch
, always
, 2, 0);
566 r300
->hw
.zb_hiz_pitch
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_HIZ_PITCH
, 1);
568 /* VPU only on TCL */
571 ALLOC_STATE(vpi
, vpu
, R300_VPI_CMDSIZE
, 0);
572 r300
->hw
.vpi
.cmd
[0] =
573 cmdvpu(r300
->radeon
.radeonScreen
, R300_PVS_CODE_START
, 0);
574 r300
->hw
.vpi
.emit
= emit_vpu
;
577 ALLOC_STATE(vpp
, vpu
, R300_VPP_CMDSIZE
, 0);
578 r300
->hw
.vpp
.cmd
[0] =
579 cmdvpu(r300
->radeon
.radeonScreen
, R500_PVS_CONST_START
, 0);
580 r300
->hw
.vpp
.emit
= emit_vpu
;
582 ALLOC_STATE(vps
, vpu
, R300_VPS_CMDSIZE
, 0);
583 r300
->hw
.vps
.cmd
[0] =
584 cmdvpu(r300
->radeon
.radeonScreen
, R500_POINT_VPORT_SCALE_OFFSET
, 1);
585 r300
->hw
.vps
.emit
= emit_vpu
;
587 for (i
= 0; i
< 6; i
++) {
588 ALLOC_STATE(vpucp
[i
], vpu
, R300_VPUCP_CMDSIZE
, 0);
589 r300
->hw
.vpucp
[i
].cmd
[0] =
590 cmdvpu(r300
->radeon
.radeonScreen
,
591 R500_PVS_UCP_START
+ i
, 1);
592 r300
->hw
.vpucp
[i
].emit
= emit_vpu
;
595 ALLOC_STATE(vpp
, vpu
, R300_VPP_CMDSIZE
, 0);
596 r300
->hw
.vpp
.cmd
[0] =
597 cmdvpu(r300
->radeon
.radeonScreen
, R300_PVS_CONST_START
, 0);
598 r300
->hw
.vpp
.emit
= emit_vpu
;
600 ALLOC_STATE(vps
, vpu
, R300_VPS_CMDSIZE
, 0);
601 r300
->hw
.vps
.cmd
[0] =
602 cmdvpu(r300
->radeon
.radeonScreen
, R300_POINT_VPORT_SCALE_OFFSET
, 1);
603 r300
->hw
.vps
.emit
= emit_vpu
;
605 for (i
= 0; i
< 6; i
++) {
606 ALLOC_STATE(vpucp
[i
], vpu
, R300_VPUCP_CMDSIZE
, 0);
607 r300
->hw
.vpucp
[i
].cmd
[0] =
608 cmdvpu(r300
->radeon
.radeonScreen
,
609 R300_PVS_UCP_START
+ i
, 1);
610 r300
->hw
.vpucp
[i
].emit
= emit_vpu
;
616 ALLOC_STATE(tex
.filter
, variable
, mtu
+ 1, 0);
617 r300
->hw
.tex
.filter
.cmd
[R300_TEX_CMD_0
] =
618 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FILTER0_0
, 0);
620 ALLOC_STATE(tex
.filter_1
, variable
, mtu
+ 1, 0);
621 r300
->hw
.tex
.filter_1
.cmd
[R300_TEX_CMD_0
] =
622 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FILTER1_0
, 0);
624 ALLOC_STATE(tex
.size
, variable
, mtu
+ 1, 0);
625 r300
->hw
.tex
.size
.cmd
[R300_TEX_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_SIZE_0
, 0);
627 ALLOC_STATE(tex
.format
, variable
, mtu
+ 1, 0);
628 r300
->hw
.tex
.format
.cmd
[R300_TEX_CMD_0
] =
629 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FORMAT_0
, 0);
631 ALLOC_STATE(tex
.pitch
, variable
, mtu
+ 1, 0);
632 r300
->hw
.tex
.pitch
.cmd
[R300_TEX_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FORMAT2_0
, 0);
634 ALLOC_STATE(tex
.offset
, variable
, 1, 0);
635 r300
->hw
.tex
.offset
.cmd
[R300_TEX_CMD_0
] =
636 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_OFFSET_0
, 0);
637 r300
->hw
.tex
.offset
.emit
= &emit_tex_offsets
;
639 ALLOC_STATE(tex
.chroma_key
, variable
, mtu
+ 1, 0);
640 r300
->hw
.tex
.chroma_key
.cmd
[R300_TEX_CMD_0
] =
641 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_CHROMA_KEY_0
, 0);
643 ALLOC_STATE(tex
.border_color
, variable
, mtu
+ 1, 0);
644 r300
->hw
.tex
.border_color
.cmd
[R300_TEX_CMD_0
] =
645 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_BORDER_COLOR_0
, 0);
647 r300
->radeon
.hw
.is_dirty
= GL_TRUE
;
648 r300
->radeon
.hw
.all_dirty
= GL_TRUE
;
650 rcommonInitCmdBuf(&r300
->radeon
);
654 * Destroy the command buffer and state atoms.
656 void r300DestroyCmdBuf(r300ContextPtr r300
)
658 struct radeon_state_atom
*atom
;
660 foreach(atom
, &r300
->radeon
.hw
.atomlist
) {