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
;
219 rrb
= radeon_get_colorbuffer(&r300
->radeon
);
220 if (!rrb
|| !rrb
->bo
) {
221 fprintf(stderr
, "no rrb\n");
225 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
227 cbpitch
|= R300_COLOR_FORMAT_ARGB8888
;
229 cbpitch
|= R300_COLOR_FORMAT_RGB565
;
231 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
)
232 cbpitch
|= R300_COLOR_TILE_ENABLE
;
234 if (r300
->radeon
.radeonScreen
->kernel_mm
)
236 BEGIN_BATCH_NO_AUTOSTATE(dw
);
237 OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0
, 1);
238 OUT_BATCH_RELOC(offset
, rrb
->bo
, offset
, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
239 OUT_BATCH_REGSEQ(R300_RB3D_COLORPITCH0
, 1);
240 if (!r300
->radeon
.radeonScreen
->kernel_mm
)
243 OUT_BATCH_RELOC(cbpitch
, rrb
->bo
, cbpitch
, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
245 if (r300
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
) {
246 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
) {
247 BEGIN_BATCH_NO_AUTOSTATE(3);
248 OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL
, 2);
250 OUT_BATCH((rrb
->width
<< R300_SCISSORS_X_SHIFT
) |
251 (rrb
->height
<< R300_SCISSORS_Y_SHIFT
));
254 BEGIN_BATCH_NO_AUTOSTATE(3);
255 OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL
, 2);
256 OUT_BATCH((R300_SCISSORS_OFFSET
<< R300_SCISSORS_X_SHIFT
) |
257 (R300_SCISSORS_OFFSET
<< R300_SCISSORS_Y_SHIFT
));
258 OUT_BATCH(((rrb
->width
+ R300_SCISSORS_OFFSET
) << R300_SCISSORS_X_SHIFT
) |
259 ((rrb
->height
+ R300_SCISSORS_OFFSET
) << R300_SCISSORS_Y_SHIFT
));
265 static void emit_zb_offset(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
267 r300ContextPtr r300
= R300_CONTEXT(ctx
);
268 BATCH_LOCALS(&r300
->radeon
);
269 struct radeon_renderbuffer
*rrb
;
272 rrb
= radeon_get_depthbuffer(&r300
->radeon
);
276 zbpitch
= (rrb
->pitch
/ rrb
->cpp
);
277 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
) {
278 zbpitch
|= R300_DEPTHMACROTILE_ENABLE
;
280 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MICRO_TILE
){
281 zbpitch
|= R300_DEPTHMICROTILE_TILED
;
284 BEGIN_BATCH_NO_AUTOSTATE(6);
285 OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET
, 1);
286 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
287 OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH
, zbpitch
);
291 static void emit_zstencil_format(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
293 r300ContextPtr r300
= R300_CONTEXT(ctx
);
294 BATCH_LOCALS(&r300
->radeon
);
295 struct radeon_renderbuffer
*rrb
;
298 rrb
= radeon_get_depthbuffer(&r300
->radeon
);
303 format
= R300_DEPTHFORMAT_16BIT_INT_Z
;
304 else if (rrb
->cpp
== 4)
305 format
= R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL
;
308 OUT_BATCH(atom
->cmd
[0]);
309 atom
->cmd
[1] &= ~0xf;
310 atom
->cmd
[1] |= format
;
311 OUT_BATCH(atom
->cmd
[1]);
312 OUT_BATCH(atom
->cmd
[2]);
313 OUT_BATCH(atom
->cmd
[3]);
314 OUT_BATCH(atom
->cmd
[4]);
317 static int check_always(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
319 return atom
->cmd_size
;
322 static int check_variable(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
324 r300ContextPtr r300
= R300_CONTEXT(ctx
);
326 if (atom
->cmd
[0] == CP_PACKET2
) {
329 cnt
= packet0_count(r300
, atom
->cmd
);
330 return cnt
? cnt
+ 1 : 0;
333 int check_vpu(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
337 cnt
= vpu_count(atom
->cmd
);
338 return cnt
? (cnt
* 4) + 1 : 0;
341 int check_r500fp(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
345 cnt
= r500fp_count(atom
->cmd
);
346 return cnt
? (cnt
* 6) + 1 : 0;
349 int check_r500fp_const(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
353 cnt
= r500fp_count(atom
->cmd
);
354 return cnt
? (cnt
* 4) + 1 : 0;
357 #define ALLOC_STATE( ATOM, CHK, SZ, IDX ) \
359 r300->hw.ATOM.cmd_size = (SZ); \
360 r300->hw.ATOM.cmd = (uint32_t*)CALLOC((SZ) * sizeof(uint32_t)); \
361 r300->hw.ATOM.name = #ATOM; \
362 r300->hw.ATOM.idx = (IDX); \
363 r300->hw.ATOM.check = check_##CHK; \
364 r300->hw.ATOM.dirty = GL_FALSE; \
365 r300->radeon.hw.max_state_size += (SZ); \
366 insert_at_tail(&r300->radeon.hw.atomlist, &r300->hw.ATOM); \
369 * Allocate memory for the command buffer and initialize the state atom
370 * list. Note that the initial hardware state is set by r300InitState().
372 void r300InitCmdBuf(r300ContextPtr r300
)
379 if (!(r300
->radeon
.radeonScreen
->chip_flags
& RADEON_CHIPSET_TCL
))
382 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
)
385 r300
->radeon
.hw
.max_state_size
= 2 + 2; /* reserve extra space for WAIT_IDLE and tex cache flush */
387 mtu
= r300
->radeon
.glCtx
->Const
.MaxTextureUnits
;
388 if (RADEON_DEBUG
& DEBUG_TEXTURE
) {
389 fprintf(stderr
, "Using %d maximum texture units..\n", mtu
);
392 /* Setup the atom linked list */
393 make_empty_list(&r300
->radeon
.hw
.atomlist
);
394 r300
->radeon
.hw
.atomlist
.name
= "atom-list";
396 /* Initialize state atoms */
397 ALLOC_STATE(vpt
, always
, R300_VPT_CMDSIZE
, 0);
398 r300
->hw
.vpt
.cmd
[R300_VPT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SE_VPORT_XSCALE
, 6);
399 ALLOC_STATE(vap_cntl
, always
, R300_VAP_CNTL_SIZE
, 0);
400 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_FLUSH
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PVS_STATE_FLUSH_REG
, 1);
401 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_FLUSH_1
] = 0;
402 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_CMD
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CNTL
, 1);
404 ALLOC_STATE(vap_index_offset
, always
, 2, 0);
405 r300
->hw
.vap_index_offset
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_VAP_INDEX_OFFSET
, 1);
406 r300
->hw
.vap_index_offset
.cmd
[1] = 0;
408 ALLOC_STATE(vte
, always
, 3, 0);
409 r300
->hw
.vte
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SE_VTE_CNTL
, 2);
410 ALLOC_STATE(vap_vf_max_vtx_indx
, always
, 3, 0);
411 r300
->hw
.vap_vf_max_vtx_indx
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_VF_MAX_VTX_INDX
, 2);
412 ALLOC_STATE(vap_cntl_status
, always
, 2, 0);
413 r300
->hw
.vap_cntl_status
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CNTL_STATUS
, 1);
414 ALLOC_STATE(vir
[0], variable
, R300_VIR_CMDSIZE
, 0);
415 r300
->hw
.vir
[0].cmd
[R300_VIR_CMD_0
] =
416 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PROG_STREAM_CNTL_0
, 1);
417 ALLOC_STATE(vir
[1], variable
, R300_VIR_CMDSIZE
, 1);
418 r300
->hw
.vir
[1].cmd
[R300_VIR_CMD_0
] =
419 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PROG_STREAM_CNTL_EXT_0
, 1);
420 ALLOC_STATE(vic
, always
, R300_VIC_CMDSIZE
, 0);
421 r300
->hw
.vic
.cmd
[R300_VIC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_VTX_STATE_CNTL
, 2);
422 ALLOC_STATE(vap_psc_sgn_norm_cntl
, always
, 2, 0);
423 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
);
426 ALLOC_STATE(vap_clip_cntl
, always
, 2, 0);
427 r300
->hw
.vap_clip_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CLIP_CNTL
, 1);
428 ALLOC_STATE(vap_clip
, always
, 5, 0);
429 r300
->hw
.vap_clip
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_GB_VERT_CLIP_ADJ
, 4);
430 ALLOC_STATE(vap_pvs_vtx_timeout_reg
, always
, 2, 0);
431 r300
->hw
.vap_pvs_vtx_timeout_reg
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, VAP_PVS_VTX_TIMEOUT_REG
, 1);
434 ALLOC_STATE(vof
, always
, R300_VOF_CMDSIZE
, 0);
435 r300
->hw
.vof
.cmd
[R300_VOF_CMD_0
] =
436 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_OUTPUT_VTX_FMT_0
, 2);
439 ALLOC_STATE(pvs
, always
, R300_PVS_CMDSIZE
, 0);
440 r300
->hw
.pvs
.cmd
[R300_PVS_CMD_0
] =
441 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PVS_CODE_CNTL_0
, 3);
444 ALLOC_STATE(gb_enable
, always
, 2, 0);
445 r300
->hw
.gb_enable
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GB_ENABLE
, 1);
446 ALLOC_STATE(gb_misc
, always
, R300_GB_MISC_CMDSIZE
, 0);
447 r300
->hw
.gb_misc
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GB_MSPOS0
, 5);
448 ALLOC_STATE(txe
, always
, R300_TXE_CMDSIZE
, 0);
449 r300
->hw
.txe
.cmd
[R300_TXE_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_ENABLE
, 1);
450 ALLOC_STATE(ga_point_s0
, always
, 5, 0);
451 r300
->hw
.ga_point_s0
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_S0
, 4);
452 ALLOC_STATE(ga_triangle_stipple
, always
, 2, 0);
453 r300
->hw
.ga_triangle_stipple
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_TRIANGLE_STIPPLE
, 1);
454 ALLOC_STATE(ps
, always
, R300_PS_CMDSIZE
, 0);
455 r300
->hw
.ps
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_SIZE
, 1);
456 ALLOC_STATE(ga_point_minmax
, always
, 4, 0);
457 r300
->hw
.ga_point_minmax
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_MINMAX
, 3);
458 ALLOC_STATE(lcntl
, always
, 2, 0);
459 r300
->hw
.lcntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_LINE_CNTL
, 1);
460 ALLOC_STATE(ga_line_stipple
, always
, 4, 0);
461 r300
->hw
.ga_line_stipple
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_LINE_STIPPLE_VALUE
, 3);
462 ALLOC_STATE(shade
, always
, 5, 0);
463 r300
->hw
.shade
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_ENHANCE
, 4);
464 ALLOC_STATE(polygon_mode
, always
, 4, 0);
465 r300
->hw
.polygon_mode
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POLY_MODE
, 3);
466 ALLOC_STATE(fogp
, always
, 3, 0);
467 r300
->hw
.fogp
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_FOG_SCALE
, 2);
468 ALLOC_STATE(zbias_cntl
, always
, 2, 0);
469 r300
->hw
.zbias_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_TEX_WRAP
, 1);
470 ALLOC_STATE(zbs
, always
, R300_ZBS_CMDSIZE
, 0);
471 r300
->hw
.zbs
.cmd
[R300_ZBS_CMD_0
] =
472 cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_POLY_OFFSET_FRONT_SCALE
, 4);
473 ALLOC_STATE(occlusion_cntl
, always
, 2, 0);
474 r300
->hw
.occlusion_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_POLY_OFFSET_ENABLE
, 1);
475 ALLOC_STATE(cul
, always
, R300_CUL_CMDSIZE
, 0);
476 r300
->hw
.cul
.cmd
[R300_CUL_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_CULL_MODE
, 1);
477 ALLOC_STATE(su_depth_scale
, always
, 3, 0);
478 r300
->hw
.su_depth_scale
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_DEPTH_SCALE
, 2);
479 ALLOC_STATE(rc
, always
, R300_RC_CMDSIZE
, 0);
480 r300
->hw
.rc
.cmd
[R300_RC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_COUNT
, 2);
482 ALLOC_STATE(ri
, always
, R500_RI_CMDSIZE
, 0);
483 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RS_IP_0
, 16);
484 for (i
= 0; i
< 8; i
++) {
485 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
+ i
+1] =
486 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_S_SHIFT
) |
487 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_T_SHIFT
) |
488 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_R_SHIFT
) |
489 (R500_RS_IP_PTR_K1
<< R500_RS_IP_TEX_PTR_Q_SHIFT
);
491 ALLOC_STATE(rr
, variable
, R300_RR_CMDSIZE
, 0);
492 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RS_INST_0
, 1);
494 ALLOC_STATE(ri
, always
, R300_RI_CMDSIZE
, 0);
495 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_IP_0
, 8);
496 ALLOC_STATE(rr
, variable
, R300_RR_CMDSIZE
, 0);
497 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_INST_0
, 1);
499 ALLOC_STATE(sc_hyperz
, always
, 3, 0);
500 r300
->hw
.sc_hyperz
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_HYPERZ
, 2);
501 ALLOC_STATE(sc_screendoor
, always
, 2, 0);
502 r300
->hw
.sc_screendoor
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_SCREENDOOR
, 1);
503 ALLOC_STATE(us_out_fmt
, always
, 6, 0);
504 r300
->hw
.us_out_fmt
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_OUT_FMT
, 5);
507 ALLOC_STATE(fp
, always
, R500_FP_CMDSIZE
, 0);
508 r300
->hw
.fp
.cmd
[R500_FP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_CONFIG
, 2);
509 r300
->hw
.fp
.cmd
[R500_FP_CNTL
] = R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO
;
510 r300
->hw
.fp
.cmd
[R500_FP_CMD_1
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_CODE_ADDR
, 3);
511 r300
->hw
.fp
.cmd
[R500_FP_CMD_2
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_FC_CTRL
, 1);
512 r300
->hw
.fp
.cmd
[R500_FP_FC_CNTL
] = 0; /* FIXME when we add flow control */
514 ALLOC_STATE(r500fp
, r500fp
, R500_FPI_CMDSIZE
, 0);
515 r300
->hw
.r500fp
.cmd
[R300_FPI_CMD_0
] =
516 cmdr500fp(r300
->radeon
.radeonScreen
, 0, 0, 0, 0);
517 r300
->hw
.r500fp
.emit
= emit_r500fp
;
518 ALLOC_STATE(r500fp_const
, r500fp_const
, R500_FPP_CMDSIZE
, 0);
519 r300
->hw
.r500fp_const
.cmd
[R300_FPI_CMD_0
] =
520 cmdr500fp(r300
->radeon
.radeonScreen
, 0, 0, 1, 0);
521 r300
->hw
.r500fp_const
.emit
= emit_r500fp
;
523 ALLOC_STATE(fp
, always
, R300_FP_CMDSIZE
, 0);
524 r300
->hw
.fp
.cmd
[R300_FP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_CONFIG
, 3);
525 r300
->hw
.fp
.cmd
[R300_FP_CMD_1
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_CODE_ADDR_0
, 4);
527 ALLOC_STATE(fpt
, variable
, R300_FPT_CMDSIZE
, 0);
528 r300
->hw
.fpt
.cmd
[R300_FPT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_TEX_INST_0
, 0);
530 ALLOC_STATE(fpi
[0], variable
, R300_FPI_CMDSIZE
, 0);
531 r300
->hw
.fpi
[0].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_RGB_INST_0
, 1);
532 ALLOC_STATE(fpi
[1], variable
, R300_FPI_CMDSIZE
, 1);
533 r300
->hw
.fpi
[1].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_RGB_ADDR_0
, 1);
534 ALLOC_STATE(fpi
[2], variable
, R300_FPI_CMDSIZE
, 2);
535 r300
->hw
.fpi
[2].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_ALPHA_INST_0
, 1);
536 ALLOC_STATE(fpi
[3], variable
, R300_FPI_CMDSIZE
, 3);
537 r300
->hw
.fpi
[3].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_ALPHA_ADDR_0
, 1);
538 ALLOC_STATE(fpp
, variable
, R300_FPP_CMDSIZE
, 0);
539 r300
->hw
.fpp
.cmd
[R300_FPP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_PFS_PARAM_0_X
, 0);
541 ALLOC_STATE(fogs
, always
, R300_FOGS_CMDSIZE
, 0);
542 r300
->hw
.fogs
.cmd
[R300_FOGS_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_FOG_BLEND
, 1);
543 ALLOC_STATE(fogc
, always
, R300_FOGC_CMDSIZE
, 0);
544 r300
->hw
.fogc
.cmd
[R300_FOGC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_FOG_COLOR_R
, 3);
545 ALLOC_STATE(at
, always
, R300_AT_CMDSIZE
, 0);
546 r300
->hw
.at
.cmd
[R300_AT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_ALPHA_FUNC
, 2);
547 ALLOC_STATE(fg_depth_src
, always
, 2, 0);
548 r300
->hw
.fg_depth_src
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_DEPTH_SRC
, 1);
549 ALLOC_STATE(rb3d_cctl
, always
, 2, 0);
550 r300
->hw
.rb3d_cctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_CCTL
, 1);
551 ALLOC_STATE(bld
, always
, R300_BLD_CMDSIZE
, 0);
552 r300
->hw
.bld
.cmd
[R300_BLD_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_CBLEND
, 2);
553 ALLOC_STATE(cmk
, always
, R300_CMK_CMDSIZE
, 0);
554 r300
->hw
.cmk
.cmd
[R300_CMK_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, RB3D_COLOR_CHANNEL_MASK
, 1);
556 ALLOC_STATE(blend_color
, always
, 3, 0);
557 r300
->hw
.blend_color
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RB3D_CONSTANT_COLOR_AR
, 2);
559 ALLOC_STATE(blend_color
, always
, 2, 0);
560 r300
->hw
.blend_color
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_BLEND_COLOR
, 1);
562 ALLOC_STATE(rop
, always
, 2, 0);
563 r300
->hw
.rop
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_ROPCNTL
, 1);
564 ALLOC_STATE(cb
, always
, R300_CB_CMDSIZE
, 0);
565 r300
->hw
.cb
.emit
= &emit_cb_offset
;
566 ALLOC_STATE(rb3d_dither_ctl
, always
, 10, 0);
567 r300
->hw
.rb3d_dither_ctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_DITHER_CTL
, 9);
568 ALLOC_STATE(rb3d_aaresolve_ctl
, always
, 2, 0);
569 r300
->hw
.rb3d_aaresolve_ctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_AARESOLVE_CTL
, 1);
570 ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold
, always
, 3, 0);
571 r300
->hw
.rb3d_discard_src_pixel_lte_threshold
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
, 2);
572 ALLOC_STATE(zs
, always
, R300_ZS_CMDSIZE
, 0);
573 r300
->hw
.zs
.cmd
[R300_ZS_CMD_0
] =
574 cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_CNTL
, 3);
576 ALLOC_STATE(zstencil_format
, always
, 5, 0);
577 r300
->hw
.zstencil_format
.cmd
[0] =
578 cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_FORMAT
, 4);
579 r300
->hw
.zstencil_format
.emit
= emit_zstencil_format
;
581 ALLOC_STATE(zb
, always
, R300_ZB_CMDSIZE
, 0);
582 r300
->hw
.zb
.emit
= emit_zb_offset
;
583 ALLOC_STATE(zb_depthclearvalue
, always
, 2, 0);
584 r300
->hw
.zb_depthclearvalue
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_DEPTHCLEARVALUE
, 1);
585 ALLOC_STATE(unk4F30
, always
, 3, 0);
586 r300
->hw
.unk4F30
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, 0x4F30, 2);
587 ALLOC_STATE(zb_hiz_offset
, always
, 2, 0);
588 r300
->hw
.zb_hiz_offset
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_HIZ_OFFSET
, 1);
589 ALLOC_STATE(zb_hiz_pitch
, always
, 2, 0);
590 r300
->hw
.zb_hiz_pitch
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_HIZ_PITCH
, 1);
592 /* VPU only on TCL */
595 ALLOC_STATE(vpi
, vpu
, R300_VPI_CMDSIZE
, 0);
596 r300
->hw
.vpi
.cmd
[0] =
597 cmdvpu(r300
->radeon
.radeonScreen
, R300_PVS_CODE_START
, 0);
598 r300
->hw
.vpi
.emit
= emit_vpu
;
601 ALLOC_STATE(vpp
, vpu
, R300_VPP_CMDSIZE
, 0);
602 r300
->hw
.vpp
.cmd
[0] =
603 cmdvpu(r300
->radeon
.radeonScreen
, R500_PVS_CONST_START
, 0);
604 r300
->hw
.vpp
.emit
= emit_vpu
;
606 ALLOC_STATE(vps
, vpu
, R300_VPS_CMDSIZE
, 0);
607 r300
->hw
.vps
.cmd
[0] =
608 cmdvpu(r300
->radeon
.radeonScreen
, R500_POINT_VPORT_SCALE_OFFSET
, 1);
609 r300
->hw
.vps
.emit
= emit_vpu
;
611 for (i
= 0; i
< 6; i
++) {
612 ALLOC_STATE(vpucp
[i
], vpu
, R300_VPUCP_CMDSIZE
, 0);
613 r300
->hw
.vpucp
[i
].cmd
[0] =
614 cmdvpu(r300
->radeon
.radeonScreen
,
615 R500_PVS_UCP_START
+ i
, 1);
616 r300
->hw
.vpucp
[i
].emit
= emit_vpu
;
619 ALLOC_STATE(vpp
, vpu
, R300_VPP_CMDSIZE
, 0);
620 r300
->hw
.vpp
.cmd
[0] =
621 cmdvpu(r300
->radeon
.radeonScreen
, R300_PVS_CONST_START
, 0);
622 r300
->hw
.vpp
.emit
= emit_vpu
;
624 ALLOC_STATE(vps
, vpu
, R300_VPS_CMDSIZE
, 0);
625 r300
->hw
.vps
.cmd
[0] =
626 cmdvpu(r300
->radeon
.radeonScreen
, R300_POINT_VPORT_SCALE_OFFSET
, 1);
627 r300
->hw
.vps
.emit
= emit_vpu
;
629 for (i
= 0; i
< 6; i
++) {
630 ALLOC_STATE(vpucp
[i
], vpu
, R300_VPUCP_CMDSIZE
, 0);
631 r300
->hw
.vpucp
[i
].cmd
[0] =
632 cmdvpu(r300
->radeon
.radeonScreen
,
633 R300_PVS_UCP_START
+ i
, 1);
634 r300
->hw
.vpucp
[i
].emit
= emit_vpu
;
640 ALLOC_STATE(tex
.filter
, variable
, mtu
+ 1, 0);
641 r300
->hw
.tex
.filter
.cmd
[R300_TEX_CMD_0
] =
642 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FILTER0_0
, 0);
644 ALLOC_STATE(tex
.filter_1
, variable
, mtu
+ 1, 0);
645 r300
->hw
.tex
.filter_1
.cmd
[R300_TEX_CMD_0
] =
646 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FILTER1_0
, 0);
648 ALLOC_STATE(tex
.size
, variable
, mtu
+ 1, 0);
649 r300
->hw
.tex
.size
.cmd
[R300_TEX_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_SIZE_0
, 0);
651 ALLOC_STATE(tex
.format
, variable
, mtu
+ 1, 0);
652 r300
->hw
.tex
.format
.cmd
[R300_TEX_CMD_0
] =
653 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FORMAT_0
, 0);
655 ALLOC_STATE(tex
.pitch
, variable
, mtu
+ 1, 0);
656 r300
->hw
.tex
.pitch
.cmd
[R300_TEX_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FORMAT2_0
, 0);
658 ALLOC_STATE(tex
.offset
, variable
, 1, 0);
659 r300
->hw
.tex
.offset
.cmd
[R300_TEX_CMD_0
] =
660 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_OFFSET_0
, 0);
661 r300
->hw
.tex
.offset
.emit
= &emit_tex_offsets
;
663 ALLOC_STATE(tex
.chroma_key
, variable
, mtu
+ 1, 0);
664 r300
->hw
.tex
.chroma_key
.cmd
[R300_TEX_CMD_0
] =
665 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_CHROMA_KEY_0
, 0);
667 ALLOC_STATE(tex
.border_color
, variable
, mtu
+ 1, 0);
668 r300
->hw
.tex
.border_color
.cmd
[R300_TEX_CMD_0
] =
669 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_BORDER_COLOR_0
, 0);
671 r300
->radeon
.hw
.is_dirty
= GL_TRUE
;
672 r300
->radeon
.hw
.all_dirty
= GL_TRUE
;
674 rcommonInitCmdBuf(&r300
->radeon
);