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 "radeon_buffer.h"
48 #include "r300_context.h"
49 #include "r300_ioctl.h"
50 #include "radeon_reg.h"
52 #include "r300_cmdbuf.h"
53 #include "r300_emit.h"
54 #include "radeon_mipmap_tree.h"
55 #include "r300_state.h"
56 #include "radeon_cs_legacy.h"
57 #include "radeon_cs_gem.h"
58 #include "radeon_reg.h"
60 #define R300_VAP_PVS_UPLOAD_ADDRESS 0x2200
61 # define RADEON_ONE_REG_WR (1 << 15)
63 /** # of dwords reserved for additional instructions that may need to be written
66 #define SPACE_FOR_FLUSHING 4
68 static unsigned packet0_count(r300ContextPtr r300
, uint32_t *pkt
)
70 if (r300
->radeon
.radeonScreen
->kernel_mm
) {
71 return ((((*pkt
) >> 16) & 0x3FFF) + 1);
73 drm_r300_cmd_header_t
*t
= (drm_r300_cmd_header_t
*)pkt
;
74 return t
->packet0
.count
;
79 #define vpu_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->vpu.count)
80 #define r500fp_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->r500fp.count)
82 void emit_vpu(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
84 r300ContextPtr r300
= R300_CONTEXT(ctx
);
85 BATCH_LOCALS(&r300
->radeon
);
86 drm_r300_cmd_header_t cmd
;
87 uint32_t addr
, ndw
, i
;
89 if (!r300
->radeon
.radeonScreen
->kernel_mm
) {
91 dwords
= (*atom
->check
) (ctx
, atom
);
92 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
93 OUT_BATCH_TABLE(atom
->cmd
, dwords
);
99 addr
= (cmd
.vpu
.adrhi
<< 8) | cmd
.vpu
.adrlo
;
100 ndw
= cmd
.vpu
.count
* 4;
102 BEGIN_BATCH_NO_AUTOSTATE(11 + ndw
);
104 /* flush processing vertices */
105 OUT_BATCH(CP_PACKET0(R300_SC_SCREENDOOR
, 0));
107 OUT_BATCH(CP_PACKET0(RADEON_WAIT_UNTIL
, 0));
108 OUT_BATCH((1 << 15) | (1 << 28));
109 OUT_BATCH(CP_PACKET0(R300_SC_SCREENDOOR
, 0));
110 OUT_BATCH(0x00FFFFFF);
111 OUT_BATCH(CP_PACKET0(R300_VAP_PVS_STATE_FLUSH_REG
, 0));
114 OUT_BATCH(CP_PACKET0(R300_VAP_PVS_UPLOAD_ADDRESS
, 0));
116 OUT_BATCH(CP_PACKET0(R300_VAP_PVS_UPLOAD_DATA
, ndw
-1) | RADEON_ONE_REG_WR
);
117 for (i
= 0; i
< ndw
; i
++) {
118 OUT_BATCH(atom
->cmd
[i
+1]);
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
);
175 for(i
= 0; i
< numtmus
; ++i
) {
176 radeonTexObj
*t
= r300
->hw
.textures
[i
];
177 if (t
&& !t
->image_override
) {
178 BEGIN_BATCH_NO_AUTOSTATE(4);
179 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0
+ (i
* 4), 1);
180 OUT_BATCH_RELOC(t
->tile_bits
, t
->mt
->bo
, 0,
181 RADEON_GEM_DOMAIN_VRAM
, 0, 0);
187 BEGIN_BATCH_NO_AUTOSTATE(4);
188 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0
+ (i
* 4), 1);
189 OUT_BATCH_RELOC(t
->tile_bits
, t
->bo
, 0,
190 RADEON_GEM_DOMAIN_VRAM
, 0, 0);
192 } else if (!r300
->radeon
.radeonScreen
->kernel_mm
) {
193 BEGIN_BATCH_NO_AUTOSTATE(2);
194 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0
+ (i
* 4), 1);
195 OUT_BATCH(t
->override_offset
);
203 static void emit_cb_offset(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
205 r300ContextPtr r300
= R300_CONTEXT(ctx
);
206 BATCH_LOCALS(&r300
->radeon
);
207 struct radeon_renderbuffer
*rrb
;
210 rrb
= radeon_get_colorbuffer(&r300
->radeon
);
211 if (!rrb
|| !rrb
->bo
) {
212 fprintf(stderr
, "no rrb\n");
216 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
218 cbpitch
|= R300_COLOR_FORMAT_ARGB8888
;
220 cbpitch
|= R300_COLOR_FORMAT_RGB565
;
222 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
)
223 cbpitch
|= R300_COLOR_TILE_ENABLE
;
225 BEGIN_BATCH_NO_AUTOSTATE(6);
226 OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0
, 1);
227 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
228 OUT_BATCH_REGSEQ(R300_RB3D_COLORPITCH0
, 1);
233 static void emit_zb_offset(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
235 r300ContextPtr r300
= R300_CONTEXT(ctx
);
236 BATCH_LOCALS(&r300
->radeon
);
237 struct radeon_renderbuffer
*rrb
;
240 rrb
= radeon_get_depthbuffer(&r300
->radeon
);
244 zbpitch
= (rrb
->pitch
/ rrb
->cpp
);
245 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
) {
246 zbpitch
|= R300_DEPTHMACROTILE_ENABLE
;
248 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MICRO_TILE
){
249 zbpitch
|= R300_DEPTHMICROTILE_TILED
;
252 BEGIN_BATCH_NO_AUTOSTATE(6);
253 OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET
, 1);
254 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
255 OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH
, zbpitch
);
259 static int check_always(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
261 return atom
->cmd_size
;
264 static int check_variable(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
266 r300ContextPtr r300
= R300_CONTEXT(ctx
);
268 if (atom
->cmd
[0] == CP_PACKET2
) {
271 cnt
= packet0_count(r300
, atom
->cmd
);
272 return cnt
? cnt
+ 1 : 0;
275 int check_vpu(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
279 cnt
= vpu_count(atom
->cmd
);
280 return cnt
? (cnt
* 4) + 1 : 0;
283 int check_r500fp(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
287 cnt
= r500fp_count(atom
->cmd
);
288 return cnt
? (cnt
* 6) + 1 : 0;
291 int check_r500fp_const(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
295 cnt
= r500fp_count(atom
->cmd
);
296 return cnt
? (cnt
* 4) + 1 : 0;
299 #define ALLOC_STATE( ATOM, CHK, SZ, IDX ) \
301 r300->hw.ATOM.cmd_size = (SZ); \
302 r300->hw.ATOM.cmd = (uint32_t*)CALLOC((SZ) * sizeof(uint32_t)); \
303 r300->hw.ATOM.name = #ATOM; \
304 r300->hw.ATOM.idx = (IDX); \
305 r300->hw.ATOM.check = check_##CHK; \
306 r300->hw.ATOM.dirty = GL_FALSE; \
307 r300->radeon.hw.max_state_size += (SZ); \
308 insert_at_tail(&r300->radeon.hw.atomlist, &r300->hw.ATOM); \
311 * Allocate memory for the command buffer and initialize the state atom
312 * list. Note that the initial hardware state is set by r300InitState().
314 void r300InitCmdBuf(r300ContextPtr r300
)
321 if (!(r300
->radeon
.radeonScreen
->chip_flags
& RADEON_CHIPSET_TCL
))
324 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
)
327 r300
->radeon
.hw
.max_state_size
= 2 + 2; /* reserve extra space for WAIT_IDLE and tex cache flush */
329 mtu
= r300
->radeon
.glCtx
->Const
.MaxTextureUnits
;
330 if (RADEON_DEBUG
& DEBUG_TEXTURE
) {
331 fprintf(stderr
, "Using %d maximum texture units..\n", mtu
);
334 /* Setup the atom linked list */
335 make_empty_list(&r300
->radeon
.hw
.atomlist
);
336 r300
->radeon
.hw
.atomlist
.name
= "atom-list";
338 /* Initialize state atoms */
339 ALLOC_STATE(vpt
, always
, R300_VPT_CMDSIZE
, 0);
340 r300
->hw
.vpt
.cmd
[R300_VPT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SE_VPORT_XSCALE
, 6);
341 ALLOC_STATE(vap_cntl
, always
, R300_VAP_CNTL_SIZE
, 0);
342 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_FLUSH
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PVS_STATE_FLUSH_REG
, 1);
343 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_FLUSH_1
] = 0;
344 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_CMD
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CNTL
, 1);
346 ALLOC_STATE(vap_index_offset
, always
, 2, 0);
347 r300
->hw
.vap_index_offset
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_VAP_INDEX_OFFSET
, 1);
348 r300
->hw
.vap_index_offset
.cmd
[1] = 0;
350 ALLOC_STATE(vte
, always
, 3, 0);
351 r300
->hw
.vte
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SE_VTE_CNTL
, 2);
352 ALLOC_STATE(vap_vf_max_vtx_indx
, always
, 3, 0);
353 r300
->hw
.vap_vf_max_vtx_indx
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_VF_MAX_VTX_INDX
, 2);
354 ALLOC_STATE(vap_cntl_status
, always
, 2, 0);
355 r300
->hw
.vap_cntl_status
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CNTL_STATUS
, 1);
356 ALLOC_STATE(vir
[0], variable
, R300_VIR_CMDSIZE
, 0);
357 r300
->hw
.vir
[0].cmd
[R300_VIR_CMD_0
] =
358 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PROG_STREAM_CNTL_0
, 1);
359 ALLOC_STATE(vir
[1], variable
, R300_VIR_CMDSIZE
, 1);
360 r300
->hw
.vir
[1].cmd
[R300_VIR_CMD_0
] =
361 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PROG_STREAM_CNTL_EXT_0
, 1);
362 ALLOC_STATE(vic
, always
, R300_VIC_CMDSIZE
, 0);
363 r300
->hw
.vic
.cmd
[R300_VIC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_VTX_STATE_CNTL
, 2);
364 ALLOC_STATE(vap_psc_sgn_norm_cntl
, always
, 2, 0);
365 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
);
368 ALLOC_STATE(vap_clip_cntl
, always
, 2, 0);
369 r300
->hw
.vap_clip_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CLIP_CNTL
, 1);
370 ALLOC_STATE(vap_clip
, always
, 5, 0);
371 r300
->hw
.vap_clip
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_GB_VERT_CLIP_ADJ
, 4);
372 ALLOC_STATE(vap_pvs_vtx_timeout_reg
, always
, 2, 0);
373 r300
->hw
.vap_pvs_vtx_timeout_reg
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, VAP_PVS_VTX_TIMEOUT_REG
, 1);
376 ALLOC_STATE(vof
, always
, R300_VOF_CMDSIZE
, 0);
377 r300
->hw
.vof
.cmd
[R300_VOF_CMD_0
] =
378 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_OUTPUT_VTX_FMT_0
, 2);
381 ALLOC_STATE(pvs
, always
, R300_PVS_CMDSIZE
, 0);
382 r300
->hw
.pvs
.cmd
[R300_PVS_CMD_0
] =
383 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PVS_CODE_CNTL_0
, 3);
386 ALLOC_STATE(gb_enable
, always
, 2, 0);
387 r300
->hw
.gb_enable
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GB_ENABLE
, 1);
388 ALLOC_STATE(gb_misc
, always
, R300_GB_MISC_CMDSIZE
, 0);
389 r300
->hw
.gb_misc
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GB_MSPOS0
, 5);
390 ALLOC_STATE(txe
, always
, R300_TXE_CMDSIZE
, 0);
391 r300
->hw
.txe
.cmd
[R300_TXE_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_ENABLE
, 1);
392 ALLOC_STATE(ga_point_s0
, always
, 5, 0);
393 r300
->hw
.ga_point_s0
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_S0
, 4);
394 ALLOC_STATE(ga_triangle_stipple
, always
, 2, 0);
395 r300
->hw
.ga_triangle_stipple
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_TRIANGLE_STIPPLE
, 1);
396 ALLOC_STATE(ps
, always
, R300_PS_CMDSIZE
, 0);
397 r300
->hw
.ps
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_SIZE
, 1);
398 ALLOC_STATE(ga_point_minmax
, always
, 4, 0);
399 r300
->hw
.ga_point_minmax
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_MINMAX
, 3);
400 ALLOC_STATE(lcntl
, always
, 2, 0);
401 r300
->hw
.lcntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_LINE_CNTL
, 1);
402 ALLOC_STATE(ga_line_stipple
, always
, 4, 0);
403 r300
->hw
.ga_line_stipple
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_LINE_STIPPLE_VALUE
, 3);
404 ALLOC_STATE(shade
, always
, 5, 0);
405 r300
->hw
.shade
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_ENHANCE
, 4);
406 ALLOC_STATE(polygon_mode
, always
, 4, 0);
407 r300
->hw
.polygon_mode
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POLY_MODE
, 3);
408 ALLOC_STATE(fogp
, always
, 3, 0);
409 r300
->hw
.fogp
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_FOG_SCALE
, 2);
410 ALLOC_STATE(zbias_cntl
, always
, 2, 0);
411 r300
->hw
.zbias_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_TEX_WRAP
, 1);
412 ALLOC_STATE(zbs
, always
, R300_ZBS_CMDSIZE
, 0);
413 r300
->hw
.zbs
.cmd
[R300_ZBS_CMD_0
] =
414 cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_POLY_OFFSET_FRONT_SCALE
, 4);
415 ALLOC_STATE(occlusion_cntl
, always
, 2, 0);
416 r300
->hw
.occlusion_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_POLY_OFFSET_ENABLE
, 1);
417 ALLOC_STATE(cul
, always
, R300_CUL_CMDSIZE
, 0);
418 r300
->hw
.cul
.cmd
[R300_CUL_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_CULL_MODE
, 1);
419 ALLOC_STATE(su_depth_scale
, always
, 3, 0);
420 r300
->hw
.su_depth_scale
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_DEPTH_SCALE
, 2);
421 ALLOC_STATE(rc
, always
, R300_RC_CMDSIZE
, 0);
422 r300
->hw
.rc
.cmd
[R300_RC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_COUNT
, 2);
424 ALLOC_STATE(ri
, always
, R500_RI_CMDSIZE
, 0);
425 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RS_IP_0
, 16);
426 for (i
= 0; i
< 8; i
++) {
427 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
+ i
+1] =
428 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_S_SHIFT
) |
429 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_T_SHIFT
) |
430 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_R_SHIFT
) |
431 (R500_RS_IP_PTR_K1
<< R500_RS_IP_TEX_PTR_Q_SHIFT
);
433 ALLOC_STATE(rr
, variable
, R300_RR_CMDSIZE
, 0);
434 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RS_INST_0
, 1);
436 ALLOC_STATE(ri
, always
, R300_RI_CMDSIZE
, 0);
437 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_IP_0
, 8);
438 ALLOC_STATE(rr
, variable
, R300_RR_CMDSIZE
, 0);
439 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_INST_0
, 1);
441 ALLOC_STATE(sc_hyperz
, always
, 3, 0);
442 r300
->hw
.sc_hyperz
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_HYPERZ
, 2);
443 ALLOC_STATE(sc_screendoor
, always
, 2, 0);
444 r300
->hw
.sc_screendoor
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_SCREENDOOR
, 1);
445 ALLOC_STATE(us_out_fmt
, always
, 6, 0);
446 r300
->hw
.us_out_fmt
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_OUT_FMT
, 5);
449 ALLOC_STATE(fp
, always
, R500_FP_CMDSIZE
, 0);
450 r300
->hw
.fp
.cmd
[R500_FP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_CONFIG
, 2);
451 r300
->hw
.fp
.cmd
[R500_FP_CNTL
] = R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO
;
452 r300
->hw
.fp
.cmd
[R500_FP_CMD_1
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_CODE_ADDR
, 3);
453 r300
->hw
.fp
.cmd
[R500_FP_CMD_2
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_FC_CTRL
, 1);
454 r300
->hw
.fp
.cmd
[R500_FP_FC_CNTL
] = 0; /* FIXME when we add flow control */
456 ALLOC_STATE(r500fp
, r500fp
, R500_FPI_CMDSIZE
, 0);
457 r300
->hw
.r500fp
.cmd
[R300_FPI_CMD_0
] =
458 cmdr500fp(r300
->radeon
.radeonScreen
, 0, 0, 0, 0);
459 r300
->hw
.r500fp
.emit
= emit_r500fp
;
460 ALLOC_STATE(r500fp_const
, r500fp_const
, R500_FPP_CMDSIZE
, 0);
461 r300
->hw
.r500fp_const
.cmd
[R300_FPI_CMD_0
] =
462 cmdr500fp(r300
->radeon
.radeonScreen
, 0, 0, 1, 0);
463 r300
->hw
.r500fp_const
.emit
= emit_r500fp
;
465 ALLOC_STATE(fp
, always
, R300_FP_CMDSIZE
, 0);
466 r300
->hw
.fp
.cmd
[R300_FP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_CONFIG
, 3);
467 r300
->hw
.fp
.cmd
[R300_FP_CMD_1
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_CODE_ADDR_0
, 4);
469 ALLOC_STATE(fpt
, variable
, R300_FPT_CMDSIZE
, 0);
470 r300
->hw
.fpt
.cmd
[R300_FPT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_TEX_INST_0
, 0);
472 ALLOC_STATE(fpi
[0], variable
, R300_FPI_CMDSIZE
, 0);
473 r300
->hw
.fpi
[0].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_RGB_INST_0
, 1);
474 ALLOC_STATE(fpi
[1], variable
, R300_FPI_CMDSIZE
, 1);
475 r300
->hw
.fpi
[1].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_RGB_ADDR_0
, 1);
476 ALLOC_STATE(fpi
[2], variable
, R300_FPI_CMDSIZE
, 2);
477 r300
->hw
.fpi
[2].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_ALPHA_INST_0
, 1);
478 ALLOC_STATE(fpi
[3], variable
, R300_FPI_CMDSIZE
, 3);
479 r300
->hw
.fpi
[3].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_ALPHA_ADDR_0
, 1);
480 ALLOC_STATE(fpp
, variable
, R300_FPP_CMDSIZE
, 0);
481 r300
->hw
.fpp
.cmd
[R300_FPP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_PFS_PARAM_0_X
, 0);
483 ALLOC_STATE(fogs
, always
, R300_FOGS_CMDSIZE
, 0);
484 r300
->hw
.fogs
.cmd
[R300_FOGS_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_FOG_BLEND
, 1);
485 ALLOC_STATE(fogc
, always
, R300_FOGC_CMDSIZE
, 0);
486 r300
->hw
.fogc
.cmd
[R300_FOGC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_FOG_COLOR_R
, 3);
487 ALLOC_STATE(at
, always
, R300_AT_CMDSIZE
, 0);
488 r300
->hw
.at
.cmd
[R300_AT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_ALPHA_FUNC
, 2);
489 ALLOC_STATE(fg_depth_src
, always
, 2, 0);
490 r300
->hw
.fg_depth_src
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_DEPTH_SRC
, 1);
491 ALLOC_STATE(rb3d_cctl
, always
, 2, 0);
492 r300
->hw
.rb3d_cctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_CCTL
, 1);
493 ALLOC_STATE(bld
, always
, R300_BLD_CMDSIZE
, 0);
494 r300
->hw
.bld
.cmd
[R300_BLD_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_CBLEND
, 2);
495 ALLOC_STATE(cmk
, always
, R300_CMK_CMDSIZE
, 0);
496 r300
->hw
.cmk
.cmd
[R300_CMK_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, RB3D_COLOR_CHANNEL_MASK
, 1);
498 ALLOC_STATE(blend_color
, always
, 3, 0);
499 r300
->hw
.blend_color
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RB3D_CONSTANT_COLOR_AR
, 2);
501 ALLOC_STATE(blend_color
, always
, 2, 0);
502 r300
->hw
.blend_color
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_BLEND_COLOR
, 1);
504 ALLOC_STATE(rop
, always
, 2, 0);
505 r300
->hw
.rop
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_ROPCNTL
, 1);
506 ALLOC_STATE(cb
, always
, R300_CB_CMDSIZE
, 0);
507 r300
->hw
.cb
.emit
= &emit_cb_offset
;
508 ALLOC_STATE(rb3d_dither_ctl
, always
, 10, 0);
509 r300
->hw
.rb3d_dither_ctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_DITHER_CTL
, 9);
510 ALLOC_STATE(rb3d_aaresolve_ctl
, always
, 2, 0);
511 r300
->hw
.rb3d_aaresolve_ctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_AARESOLVE_CTL
, 1);
512 ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold
, always
, 3, 0);
513 r300
->hw
.rb3d_discard_src_pixel_lte_threshold
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
, 2);
514 ALLOC_STATE(zs
, always
, R300_ZS_CMDSIZE
, 0);
515 r300
->hw
.zs
.cmd
[R300_ZS_CMD_0
] =
516 cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_CNTL
, 3);
517 ALLOC_STATE(zstencil_format
, always
, 5, 0);
518 r300
->hw
.zstencil_format
.cmd
[0] =
519 cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_FORMAT
, 4);
520 ALLOC_STATE(zb
, always
, R300_ZB_CMDSIZE
, 0);
521 r300
->hw
.zb
.emit
= emit_zb_offset
;
522 ALLOC_STATE(zb_depthclearvalue
, always
, 2, 0);
523 r300
->hw
.zb_depthclearvalue
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_DEPTHCLEARVALUE
, 1);
524 ALLOC_STATE(unk4F30
, always
, 3, 0);
525 r300
->hw
.unk4F30
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, 0x4F30, 2);
526 ALLOC_STATE(zb_hiz_offset
, always
, 2, 0);
527 r300
->hw
.zb_hiz_offset
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_HIZ_OFFSET
, 1);
528 ALLOC_STATE(zb_hiz_pitch
, always
, 2, 0);
529 r300
->hw
.zb_hiz_pitch
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_HIZ_PITCH
, 1);
531 /* VPU only on TCL */
534 ALLOC_STATE(vpi
, vpu
, R300_VPI_CMDSIZE
, 0);
535 r300
->hw
.vpi
.cmd
[0] =
536 cmdvpu(r300
->radeon
.radeonScreen
, R300_PVS_CODE_START
, 0);
537 r300
->hw
.vpi
.emit
= emit_vpu
;
540 ALLOC_STATE(vpp
, vpu
, R300_VPP_CMDSIZE
, 0);
541 r300
->hw
.vpp
.cmd
[0] =
542 cmdvpu(r300
->radeon
.radeonScreen
, R500_PVS_CONST_START
, 0);
543 r300
->hw
.vpp
.emit
= emit_vpu
;
545 ALLOC_STATE(vps
, vpu
, R300_VPS_CMDSIZE
, 0);
546 r300
->hw
.vps
.cmd
[0] =
547 cmdvpu(r300
->radeon
.radeonScreen
, R500_POINT_VPORT_SCALE_OFFSET
, 1);
548 r300
->hw
.vps
.emit
= emit_vpu
;
550 for (i
= 0; i
< 6; i
++) {
551 ALLOC_STATE(vpucp
[i
], vpu
, R300_VPUCP_CMDSIZE
, 0);
552 r300
->hw
.vpucp
[i
].cmd
[0] =
553 cmdvpu(r300
->radeon
.radeonScreen
,
554 R500_PVS_UCP_START
+ i
, 1);
555 r300
->hw
.vpucp
[i
].emit
= emit_vpu
;
558 ALLOC_STATE(vpp
, vpu
, R300_VPP_CMDSIZE
, 0);
559 r300
->hw
.vpp
.cmd
[0] =
560 cmdvpu(r300
->radeon
.radeonScreen
, R300_PVS_CONST_START
, 0);
561 r300
->hw
.vpp
.emit
= emit_vpu
;
563 ALLOC_STATE(vps
, vpu
, R300_VPS_CMDSIZE
, 0);
564 r300
->hw
.vps
.cmd
[0] =
565 cmdvpu(r300
->radeon
.radeonScreen
, R300_POINT_VPORT_SCALE_OFFSET
, 1);
566 r300
->hw
.vps
.emit
= emit_vpu
;
568 for (i
= 0; i
< 6; i
++) {
569 ALLOC_STATE(vpucp
[i
], vpu
, R300_VPUCP_CMDSIZE
, 0);
570 r300
->hw
.vpucp
[i
].cmd
[0] =
571 cmdvpu(r300
->radeon
.radeonScreen
,
572 R300_PVS_UCP_START
+ i
, 1);
573 r300
->hw
.vpucp
[i
].emit
= emit_vpu
;
579 ALLOC_STATE(tex
.filter
, variable
, mtu
+ 1, 0);
580 r300
->hw
.tex
.filter
.cmd
[R300_TEX_CMD_0
] =
581 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FILTER0_0
, 0);
583 ALLOC_STATE(tex
.filter_1
, variable
, mtu
+ 1, 0);
584 r300
->hw
.tex
.filter_1
.cmd
[R300_TEX_CMD_0
] =
585 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FILTER1_0
, 0);
587 ALLOC_STATE(tex
.size
, variable
, mtu
+ 1, 0);
588 r300
->hw
.tex
.size
.cmd
[R300_TEX_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_SIZE_0
, 0);
590 ALLOC_STATE(tex
.format
, variable
, mtu
+ 1, 0);
591 r300
->hw
.tex
.format
.cmd
[R300_TEX_CMD_0
] =
592 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FORMAT_0
, 0);
594 ALLOC_STATE(tex
.pitch
, variable
, mtu
+ 1, 0);
595 r300
->hw
.tex
.pitch
.cmd
[R300_TEX_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FORMAT2_0
, 0);
597 ALLOC_STATE(tex
.offset
, variable
, 1, 0);
598 r300
->hw
.tex
.offset
.cmd
[R300_TEX_CMD_0
] =
599 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_OFFSET_0
, 0);
600 r300
->hw
.tex
.offset
.emit
= &emit_tex_offsets
;
602 ALLOC_STATE(tex
.chroma_key
, variable
, mtu
+ 1, 0);
603 r300
->hw
.tex
.chroma_key
.cmd
[R300_TEX_CMD_0
] =
604 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_CHROMA_KEY_0
, 0);
606 ALLOC_STATE(tex
.border_color
, variable
, mtu
+ 1, 0);
607 r300
->hw
.tex
.border_color
.cmd
[R300_TEX_CMD_0
] =
608 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_BORDER_COLOR_0
, 0);
610 r300
->radeon
.hw
.is_dirty
= GL_TRUE
;
611 r300
->radeon
.hw
.all_dirty
= GL_TRUE
;
613 rcommonInitCmdBuf(&r300
->radeon
);
617 * Destroy the command buffer and state atoms.
619 void r300DestroyCmdBuf(r300ContextPtr r300
)
621 struct radeon_state_atom
*atom
;
623 foreach(atom
, &r300
->radeon
.hw
.atomlist
) {