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"
49 #include "r300_cmdbuf.h"
50 #include "r300_emit.h"
51 #include "radeon_bocs_wrapper.h"
52 #include "radeon_mipmap_tree.h"
53 #include "r300_state.h"
54 #include "radeon_queryobj.h"
56 /** # of dwords reserved for additional instructions that may need to be written
59 #define SPACE_FOR_FLUSHING 4
61 static unsigned packet0_count(r300ContextPtr r300
, uint32_t *pkt
)
63 if (r300
->radeon
.radeonScreen
->kernel_mm
) {
64 return ((((*pkt
) >> 16) & 0x3FFF) + 1);
66 drm_r300_cmd_header_t
*t
= (drm_r300_cmd_header_t
*)pkt
;
67 return t
->packet0
.count
;
71 #define vpu_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->vpu.count)
72 #define r500fp_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->r500fp.count)
74 int check_vpu(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
76 r300ContextPtr r300
= R300_CONTEXT(ctx
);
79 cnt
= vpu_count(atom
->cmd
);
81 if (r300
->radeon
.radeonScreen
->kernel_mm
) {
85 return cnt
? (cnt
* 4) + extra
: 0;
89 void emit_vpu(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
91 r300ContextPtr r300
= R300_CONTEXT(ctx
);
92 BATCH_LOCALS(&r300
->radeon
);
93 drm_r300_cmd_header_t cmd
;
97 addr
= (cmd
.vpu
.adrhi
<< 8) | cmd
.vpu
.adrlo
;
98 ndw
= atom
->check(ctx
, atom
);
100 BEGIN_BATCH_NO_AUTOSTATE(ndw
);
103 OUT_BATCH_REGVAL(R300_VAP_PVS_VECTOR_INDX_REG
, addr
);
104 OUT_BATCH(CP_PACKET0(R300_VAP_PVS_UPLOAD_DATA
, ndw
-1) | RADEON_ONE_REG_WR
);
105 OUT_BATCH_TABLE(&atom
->cmd
[1], ndw
);
106 OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG
, 0);
110 void r500_emit_fp(struct r300_context
*r300
,
117 BATCH_LOCALS(&r300
->radeon
);
119 addr
|= (type
<< 16);
120 addr
|= (clamp
<< 17);
122 BEGIN_BATCH_NO_AUTOSTATE(len
+ 3);
123 OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_INDEX
, 0));
125 OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_DATA
, len
-1) | RADEON_ONE_REG_WR
);
126 OUT_BATCH_TABLE(data
, len
);
130 static void emit_r500fp_atom(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
132 r300ContextPtr r300
= R300_CONTEXT(ctx
);
133 drm_r300_cmd_header_t cmd
;
134 uint32_t addr
, count
;
137 cmd
.u
= atom
->cmd
[0];
138 addr
= ((cmd
.r500fp
.adrhi_flags
& 1) << 8) | cmd
.r500fp
.adrlo
;
139 type
= !!(cmd
.r500fp
.adrhi_flags
& R500FP_CONSTANT_TYPE
);
140 clamp
= !!(cmd
.r500fp
.adrhi_flags
& R500FP_CONSTANT_CLAMP
);
143 count
= r500fp_count(atom
->cmd
) * 4;
145 count
= r500fp_count(atom
->cmd
) * 6;
148 r500_emit_fp(r300
, &atom
->cmd
[1], count
, addr
, type
, clamp
);
151 static int check_tex_offsets(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
153 r300ContextPtr r300
= R300_CONTEXT(ctx
);
154 int numtmus
= packet0_count(r300
, r300
->hw
.tex
.offset
.cmd
);
156 if (atom
->cmd
[0] == CP_PACKET2
) {
159 for(i
= 0; i
< numtmus
; ++i
) {
160 radeonTexObj
*t
= r300
->hw
.textures
[i
];
161 if (!t
&& !r300
->radeon
.radeonScreen
->kernel_mm
) {
163 } else if (t
&& t
->image_override
&& !t
->bo
) {
164 if (!r300
->radeon
.radeonScreen
->kernel_mm
)
172 static void emit_tex_offsets(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
174 r300ContextPtr r300
= R300_CONTEXT(ctx
);
175 BATCH_LOCALS(&r300
->radeon
);
176 int numtmus
= packet0_count(r300
, r300
->hw
.tex
.offset
.cmd
);
179 for(i
= 0; i
< numtmus
; ++i
) {
180 radeonTexObj
*t
= r300
->hw
.textures
[i
];
181 if (t
&& !t
->image_override
) {
182 BEGIN_BATCH_NO_AUTOSTATE(4);
183 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0
+ (i
* 4), 1);
184 OUT_BATCH_RELOC(t
->tile_bits
, t
->mt
->bo
, get_base_teximage_offset(t
),
185 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
188 /* Texture unit hasn't a texture bound.
189 * We assign the current color buffer as a fakery to make
190 * KIL work on KMS (without it, the CS checker will complain).
192 if (r300
->radeon
.radeonScreen
->kernel_mm
) {
193 struct radeon_renderbuffer
*rrb
= radeon_get_colorbuffer(&r300
->radeon
);
194 if (rrb
&& rrb
->bo
) {
195 BEGIN_BATCH_NO_AUTOSTATE(4);
196 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0
+ (i
* 4), 1);
197 OUT_BATCH_RELOC(0, rrb
->bo
, 0,
198 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
202 } else { /* override cases */
204 BEGIN_BATCH_NO_AUTOSTATE(4);
205 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0
+ (i
* 4), 1);
206 OUT_BATCH_RELOC(t
->tile_bits
, t
->bo
, 0,
207 RADEON_GEM_DOMAIN_GTT
|RADEON_GEM_DOMAIN_VRAM
, 0, 0);
209 } else if (!r300
->radeon
.radeonScreen
->kernel_mm
) {
210 BEGIN_BATCH_NO_AUTOSTATE(2);
211 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0
+ (i
* 4), 1);
212 OUT_BATCH(t
->override_offset
);
215 /* Texture unit hasn't a texture bound nothings to do */
221 void r300_emit_scissor(GLcontext
*ctx
)
223 r300ContextPtr r300
= R300_CONTEXT(ctx
);
224 BATCH_LOCALS(&r300
->radeon
);
225 unsigned x1
, y1
, x2
, y2
;
226 struct radeon_renderbuffer
*rrb
;
228 if (!r300
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
) {
231 rrb
= radeon_get_colorbuffer(&r300
->radeon
);
232 if (!rrb
|| !rrb
->bo
) {
233 fprintf(stderr
, "no rrb\n");
236 if (r300
->radeon
.state
.scissor
.enabled
) {
237 x1
= r300
->radeon
.state
.scissor
.rect
.x1
;
238 y1
= r300
->radeon
.state
.scissor
.rect
.y1
;
239 x2
= r300
->radeon
.state
.scissor
.rect
.x2
;
240 y2
= r300
->radeon
.state
.scissor
.rect
.y2
;
244 x2
= rrb
->base
.Width
- 1;
245 y2
= rrb
->base
.Height
- 1;
247 if (r300
->radeon
.radeonScreen
->chip_family
< CHIP_FAMILY_RV515
) {
248 x1
+= R300_SCISSORS_OFFSET
;
249 y1
+= R300_SCISSORS_OFFSET
;
250 x2
+= R300_SCISSORS_OFFSET
;
251 y2
+= R300_SCISSORS_OFFSET
;
253 BEGIN_BATCH_NO_AUTOSTATE(3);
254 OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL
, 2);
255 OUT_BATCH((x1
<< R300_SCISSORS_X_SHIFT
)|(y1
<< R300_SCISSORS_Y_SHIFT
));
256 OUT_BATCH((x2
<< R300_SCISSORS_X_SHIFT
)|(y2
<< R300_SCISSORS_Y_SHIFT
));
259 static int check_cb_offset(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
261 r300ContextPtr r300
= R300_CONTEXT(ctx
);
262 uint32_t dw
= 6 + 3 + 16;
263 if (r300
->radeon
.radeonScreen
->kernel_mm
)
265 if (!r300
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
) {
271 static void emit_scissor(struct r300_context
*r300
,
276 BATCH_LOCALS(&r300
->radeon
);
277 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
) {
278 BEGIN_BATCH_NO_AUTOSTATE(3);
279 OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL
, 2);
281 OUT_BATCH(((width
- 1) << R300_SCISSORS_X_SHIFT
) |
282 ((height
- 1) << R300_SCISSORS_Y_SHIFT
));
284 BEGIN_BATCH_NO_AUTOSTATE(16);
285 for (i
= 0; i
< 4; i
++) {
286 OUT_BATCH_REGSEQ(R300_SC_CLIPRECT_TL_0
+ (i
* 8), 2);
287 OUT_BATCH((0 << R300_CLIPRECT_X_SHIFT
) | (0 << R300_CLIPRECT_Y_SHIFT
));
288 OUT_BATCH(((width
- 1) << R300_CLIPRECT_X_SHIFT
) | ((height
- 1) << R300_CLIPRECT_Y_SHIFT
));
290 OUT_BATCH_REGSEQ(R300_SC_CLIP_RULE
, 1);
292 OUT_BATCH_REGSEQ(R300_SC_SCREENDOOR
, 1);
296 BEGIN_BATCH_NO_AUTOSTATE(3);
297 OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL
, 2);
298 OUT_BATCH((R300_SCISSORS_OFFSET
<< R300_SCISSORS_X_SHIFT
) |
299 (R300_SCISSORS_OFFSET
<< R300_SCISSORS_Y_SHIFT
));
300 OUT_BATCH(((width
+ R300_SCISSORS_OFFSET
- 1) << R300_SCISSORS_X_SHIFT
) |
301 ((height
+ R300_SCISSORS_OFFSET
- 1) << R300_SCISSORS_Y_SHIFT
));
303 BEGIN_BATCH_NO_AUTOSTATE(16);
304 for (i
= 0; i
< 4; i
++) {
305 OUT_BATCH_REGSEQ(R300_SC_CLIPRECT_TL_0
+ (i
* 8), 2);
306 OUT_BATCH((R300_SCISSORS_OFFSET
<< R300_CLIPRECT_X_SHIFT
) | (R300_SCISSORS_OFFSET
<< R300_CLIPRECT_Y_SHIFT
));
307 OUT_BATCH(((R300_SCISSORS_OFFSET
+ width
- 1) << R300_CLIPRECT_X_SHIFT
) |
308 ((R300_SCISSORS_OFFSET
+ height
- 1) << R300_CLIPRECT_Y_SHIFT
));
310 OUT_BATCH_REGSEQ(R300_SC_CLIP_RULE
, 1);
312 OUT_BATCH_REGSEQ(R300_SC_SCREENDOOR
, 1);
318 void r300_emit_cb_setup(struct r300_context
*r300
,
319 struct radeon_bo
*bo
,
325 BATCH_LOCALS(&r300
->radeon
);
326 uint32_t cbpitch
= pitch
/ cpp
;
329 assert(offset
% 256 == 0);
332 case MESA_FORMAT_RGB565
:
333 assert(_mesa_little_endian());
334 cbpitch
|= R300_COLOR_FORMAT_RGB565
;
336 case MESA_FORMAT_RGB565_REV
:
337 assert(!_mesa_little_endian());
338 cbpitch
|= R300_COLOR_FORMAT_RGB565
;
340 case MESA_FORMAT_ARGB4444
:
341 assert(_mesa_little_endian());
342 cbpitch
|= R300_COLOR_FORMAT_ARGB4444
;
344 case MESA_FORMAT_ARGB4444_REV
:
345 assert(!_mesa_little_endian());
346 cbpitch
|= R300_COLOR_FORMAT_ARGB4444
;
348 case MESA_FORMAT_ARGB1555
:
349 assert(_mesa_little_endian());
350 cbpitch
|= R300_COLOR_FORMAT_ARGB1555
;
352 case MESA_FORMAT_ARGB1555_REV
:
353 assert(!_mesa_little_endian());
354 cbpitch
|= R300_COLOR_FORMAT_ARGB1555
;
358 cbpitch
|= R300_COLOR_FORMAT_ARGB8888
;
360 _mesa_problem(r300
->radeon
.glCtx
, "unexpected format in emit_cb_offset()");;
365 if (bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
)
366 cbpitch
|= R300_COLOR_TILE_ENABLE
;
368 if (r300
->radeon
.radeonScreen
->kernel_mm
)
371 BEGIN_BATCH_NO_AUTOSTATE(dw
);
372 OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0
, 1);
373 OUT_BATCH_RELOC(offset
, bo
, offset
, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
374 OUT_BATCH_REGSEQ(R300_RB3D_COLORPITCH0
, 1);
375 if (!r300
->radeon
.radeonScreen
->kernel_mm
)
378 OUT_BATCH_RELOC(cbpitch
, bo
, cbpitch
, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
382 static void emit_cb_offset_atom(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
384 r300ContextPtr r300
= R300_CONTEXT(ctx
);
385 struct radeon_renderbuffer
*rrb
;
386 uint32_t offset
= r300
->radeon
.state
.color
.draw_offset
;
388 rrb
= radeon_get_colorbuffer(&r300
->radeon
);
389 if (!rrb
|| !rrb
->bo
) {
390 fprintf(stderr
, "no rrb\n");
394 if (RADEON_DEBUG
& RADEON_STATE
)
395 fprintf(stderr
,"rrb is %p %d %dx%d\n", rrb
, offset
, rrb
->base
.Width
, rrb
->base
.Height
);
397 r300_emit_cb_setup(r300
, rrb
->bo
, offset
, rrb
->base
.Format
, rrb
->cpp
, rrb
->pitch
);
399 if (r300
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
) {
400 emit_scissor(r300
, rrb
->base
.Width
, rrb
->base
.Height
);
404 static int check_zb_offset(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
406 r300ContextPtr r300
= R300_CONTEXT(ctx
);
409 if (r300
->radeon
.radeonScreen
->kernel_mm
)
414 static void emit_zb_offset(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
416 r300ContextPtr r300
= R300_CONTEXT(ctx
);
417 BATCH_LOCALS(&r300
->radeon
);
418 struct radeon_renderbuffer
*rrb
;
420 uint32_t dw
= atom
->check(ctx
, atom
);
422 rrb
= radeon_get_depthbuffer(&r300
->radeon
);
426 zbpitch
= (rrb
->pitch
/ rrb
->cpp
);
427 if (!r300
->radeon
.radeonScreen
->kernel_mm
) {
428 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
) {
429 zbpitch
|= R300_DEPTHMACROTILE_ENABLE
;
431 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MICRO_TILE
){
432 zbpitch
|= R300_DEPTHMICROTILE_TILED
;
436 BEGIN_BATCH_NO_AUTOSTATE(dw
);
437 OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET
, 1);
438 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
439 OUT_BATCH_REGSEQ(R300_ZB_DEPTHPITCH
, 1);
440 if (!r300
->radeon
.radeonScreen
->kernel_mm
)
443 OUT_BATCH_RELOC(cbpitch
, rrb
->bo
, zbpitch
, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
447 static void emit_zstencil_format(GLcontext
*ctx
, struct radeon_state_atom
* atom
)
449 r300ContextPtr r300
= R300_CONTEXT(ctx
);
450 BATCH_LOCALS(&r300
->radeon
);
451 struct radeon_renderbuffer
*rrb
;
454 rrb
= radeon_get_depthbuffer(&r300
->radeon
);
459 format
= R300_DEPTHFORMAT_16BIT_INT_Z
;
460 else if (rrb
->cpp
== 4)
461 format
= R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL
;
464 BEGIN_BATCH_NO_AUTOSTATE(atom
->cmd_size
);
465 OUT_BATCH(atom
->cmd
[0]);
466 atom
->cmd
[1] &= ~0xf;
467 atom
->cmd
[1] |= format
;
468 OUT_BATCH(atom
->cmd
[1]);
469 OUT_BATCH(atom
->cmd
[2]);
470 OUT_BATCH(atom
->cmd
[3]);
471 OUT_BATCH(atom
->cmd
[4]);
475 static int check_never(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
480 static int check_always(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
482 return atom
->cmd_size
;
485 static int check_variable(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
487 r300ContextPtr r300
= R300_CONTEXT(ctx
);
489 if (atom
->cmd
[0] == CP_PACKET2
) {
492 cnt
= packet0_count(r300
, atom
->cmd
);
493 return cnt
? cnt
+ 1 : 0;
496 static int check_r500fp(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
499 r300ContextPtr r300
= R300_CONTEXT(ctx
);
501 cnt
= r500fp_count(atom
->cmd
);
502 if (r300
->radeon
.radeonScreen
->kernel_mm
)
505 return cnt
? (cnt
* 6) + extra
: 0;
508 static int check_r500fp_const(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
511 r300ContextPtr r300
= R300_CONTEXT(ctx
);
513 cnt
= r500fp_count(atom
->cmd
);
514 if (r300
->radeon
.radeonScreen
->kernel_mm
)
517 cnt
= r500fp_count(atom
->cmd
);
518 return cnt
? (cnt
* 4) + extra
: 0;
521 #define ALLOC_STATE( ATOM, CHK, SZ, IDX ) \
523 r300->hw.ATOM.cmd_size = (SZ); \
524 r300->hw.ATOM.cmd = (uint32_t*)CALLOC((SZ) * sizeof(uint32_t)); \
525 r300->hw.ATOM.name = #ATOM; \
526 r300->hw.ATOM.idx = (IDX); \
527 r300->hw.ATOM.check = check_##CHK; \
528 r300->hw.ATOM.dirty = GL_FALSE; \
529 r300->radeon.hw.max_state_size += (SZ); \
530 insert_at_tail(&r300->radeon.hw.atomlist, &r300->hw.ATOM); \
533 * Allocate memory for the command buffer and initialize the state atom
534 * list. Note that the initial hardware state is set by r300InitState().
536 void r300InitCmdBuf(r300ContextPtr r300
)
542 has_tcl
= r300
->options
.hw_tcl_enabled
;
544 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
)
547 r300
->radeon
.hw
.max_state_size
= 2 + 2; /* reserve extra space for WAIT_IDLE and tex cache flush */
549 mtu
= r300
->radeon
.glCtx
->Const
.MaxTextureUnits
;
550 if (RADEON_DEBUG
& RADEON_TEXTURE
) {
551 fprintf(stderr
, "Using %d maximum texture units..\n", mtu
);
554 /* Setup the atom linked list */
555 make_empty_list(&r300
->radeon
.hw
.atomlist
);
556 r300
->radeon
.hw
.atomlist
.name
= "atom-list";
558 /* Initialize state atoms */
559 ALLOC_STATE(vpt
, always
, R300_VPT_CMDSIZE
, 0);
560 r300
->hw
.vpt
.cmd
[R300_VPT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SE_VPORT_XSCALE
, 6);
561 ALLOC_STATE(vap_cntl
, always
, R300_VAP_CNTL_SIZE
, 0);
562 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_FLUSH
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PVS_STATE_FLUSH_REG
, 1);
563 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_FLUSH_1
] = 0;
564 r300
->hw
.vap_cntl
.cmd
[R300_VAP_CNTL_CMD
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CNTL
, 1);
565 if (is_r500
&& !r300
->radeon
.radeonScreen
->kernel_mm
) {
566 ALLOC_STATE(vap_index_offset
, always
, 2, 0);
567 r300
->hw
.vap_index_offset
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_VAP_INDEX_OFFSET
, 1);
568 r300
->hw
.vap_index_offset
.cmd
[1] = 0;
570 ALLOC_STATE(vte
, always
, 3, 0);
571 r300
->hw
.vte
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SE_VTE_CNTL
, 2);
572 ALLOC_STATE(vap_vf_max_vtx_indx
, always
, 3, 0);
573 r300
->hw
.vap_vf_max_vtx_indx
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_VF_MAX_VTX_INDX
, 2);
574 ALLOC_STATE(vap_cntl_status
, always
, 2, 0);
575 r300
->hw
.vap_cntl_status
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CNTL_STATUS
, 1);
576 ALLOC_STATE(vir
[0], variable
, R300_VIR_CMDSIZE
, 0);
577 r300
->hw
.vir
[0].cmd
[R300_VIR_CMD_0
] =
578 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PROG_STREAM_CNTL_0
, 1);
579 ALLOC_STATE(vir
[1], variable
, R300_VIR_CMDSIZE
, 1);
580 r300
->hw
.vir
[1].cmd
[R300_VIR_CMD_0
] =
581 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PROG_STREAM_CNTL_EXT_0
, 1);
582 ALLOC_STATE(vic
, always
, R300_VIC_CMDSIZE
, 0);
583 r300
->hw
.vic
.cmd
[R300_VIC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_VTX_STATE_CNTL
, 2);
584 ALLOC_STATE(vap_psc_sgn_norm_cntl
, always
, 2, 0);
585 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
);
588 ALLOC_STATE(vap_clip_cntl
, always
, 2, 0);
589 r300
->hw
.vap_clip_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_CLIP_CNTL
, 1);
590 ALLOC_STATE(vap_clip
, always
, 5, 0);
591 r300
->hw
.vap_clip
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_GB_VERT_CLIP_ADJ
, 4);
592 ALLOC_STATE(vap_pvs_vtx_timeout_reg
, always
, 2, 0);
593 r300
->hw
.vap_pvs_vtx_timeout_reg
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, VAP_PVS_VTX_TIMEOUT_REG
, 1);
596 ALLOC_STATE(vof
, always
, R300_VOF_CMDSIZE
, 0);
597 r300
->hw
.vof
.cmd
[R300_VOF_CMD_0
] =
598 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_OUTPUT_VTX_FMT_0
, 2);
601 ALLOC_STATE(pvs
, always
, R300_PVS_CMDSIZE
, 0);
602 r300
->hw
.pvs
.cmd
[R300_PVS_CMD_0
] =
603 cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PVS_CODE_CNTL_0
, 3);
606 ALLOC_STATE(gb_enable
, always
, 2, 0);
607 r300
->hw
.gb_enable
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GB_ENABLE
, 1);
608 if (!r300
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
) {
609 ALLOC_STATE(gb_misc
, always
, R300_GB_MISC_CMDSIZE
, 0);
611 ALLOC_STATE(gb_misc
, never
, R300_GB_MISC_CMDSIZE
, 0);
613 r300
->hw
.gb_misc
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GB_MSPOS0
, 3);
614 ALLOC_STATE(gb_misc2
, always
, R300_GB_MISC2_CMDSIZE
, 0);
615 r300
->hw
.gb_misc2
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, 0x401C, 2);
616 ALLOC_STATE(txe
, always
, R300_TXE_CMDSIZE
, 0);
617 r300
->hw
.txe
.cmd
[R300_TXE_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_ENABLE
, 1);
618 ALLOC_STATE(ga_point_s0
, always
, 5, 0);
619 r300
->hw
.ga_point_s0
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_S0
, 4);
620 ALLOC_STATE(ga_triangle_stipple
, always
, 2, 0);
621 r300
->hw
.ga_triangle_stipple
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_TRIANGLE_STIPPLE
, 1);
622 ALLOC_STATE(ps
, always
, R300_PS_CMDSIZE
, 0);
623 r300
->hw
.ps
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_SIZE
, 1);
624 ALLOC_STATE(ga_point_minmax
, always
, 4, 0);
625 r300
->hw
.ga_point_minmax
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POINT_MINMAX
, 3);
626 ALLOC_STATE(lcntl
, always
, 2, 0);
627 r300
->hw
.lcntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_LINE_CNTL
, 1);
628 ALLOC_STATE(ga_line_stipple
, always
, 4, 0);
629 r300
->hw
.ga_line_stipple
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_LINE_STIPPLE_VALUE
, 3);
630 if (!r300
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
) {
631 ALLOC_STATE(shade
, always
, 2, 0);
633 ALLOC_STATE(shade
, never
, 2, 0);
635 r300
->hw
.shade
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_ENHANCE
, 1);
636 ALLOC_STATE(shade2
, always
, 4, 0);
637 r300
->hw
.shade2
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, 0x4278, 3);
638 ALLOC_STATE(polygon_mode
, always
, 4, 0);
639 r300
->hw
.polygon_mode
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_POLY_MODE
, 3);
640 ALLOC_STATE(fogp
, always
, 3, 0);
641 r300
->hw
.fogp
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_GA_FOG_SCALE
, 2);
642 ALLOC_STATE(zbias_cntl
, always
, 2, 0);
643 r300
->hw
.zbias_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_TEX_WRAP
, 1);
644 ALLOC_STATE(zbs
, always
, R300_ZBS_CMDSIZE
, 0);
645 r300
->hw
.zbs
.cmd
[R300_ZBS_CMD_0
] =
646 cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_POLY_OFFSET_FRONT_SCALE
, 4);
647 ALLOC_STATE(occlusion_cntl
, always
, 2, 0);
648 r300
->hw
.occlusion_cntl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_POLY_OFFSET_ENABLE
, 1);
649 ALLOC_STATE(cul
, always
, R300_CUL_CMDSIZE
, 0);
650 r300
->hw
.cul
.cmd
[R300_CUL_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_CULL_MODE
, 1);
651 ALLOC_STATE(su_depth_scale
, always
, 3, 0);
652 r300
->hw
.su_depth_scale
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_DEPTH_SCALE
, 2);
653 ALLOC_STATE(rc
, always
, R300_RC_CMDSIZE
, 0);
654 r300
->hw
.rc
.cmd
[R300_RC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_COUNT
, 2);
656 ALLOC_STATE(ri
, variable
, R500_RI_CMDSIZE
, 0);
657 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RS_IP_0
, 16);
658 ALLOC_STATE(rr
, variable
, R300_RR_CMDSIZE
, 0);
659 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RS_INST_0
, 1);
661 ALLOC_STATE(ri
, variable
, R300_RI_CMDSIZE
, 0);
662 r300
->hw
.ri
.cmd
[R300_RI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_IP_0
, 8);
663 ALLOC_STATE(rr
, variable
, R300_RR_CMDSIZE
, 0);
664 r300
->hw
.rr
.cmd
[R300_RR_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RS_INST_0
, 1);
666 ALLOC_STATE(sc_hyperz
, always
, 3, 0);
667 r300
->hw
.sc_hyperz
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_HYPERZ
, 2);
668 ALLOC_STATE(sc_screendoor
, always
, 2, 0);
669 r300
->hw
.sc_screendoor
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_SCREENDOOR
, 1);
670 ALLOC_STATE(us_out_fmt
, always
, 6, 0);
671 r300
->hw
.us_out_fmt
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_OUT_FMT
, 5);
674 ALLOC_STATE(fp
, always
, R500_FP_CMDSIZE
, 0);
675 r300
->hw
.fp
.cmd
[R500_FP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_CONFIG
, 2);
676 r300
->hw
.fp
.cmd
[R500_FP_CNTL
] = R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO
;
677 r300
->hw
.fp
.cmd
[R500_FP_CMD_1
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_CODE_ADDR
, 3);
678 r300
->hw
.fp
.cmd
[R500_FP_CMD_2
] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_US_FC_CTRL
, 1);
679 r300
->hw
.fp
.cmd
[R500_FP_FC_CNTL
] = 0; /* FIXME when we add flow control */
681 ALLOC_STATE(r500fp
, r500fp
, R500_FPI_CMDSIZE
, 0);
682 r300
->hw
.r500fp
.cmd
[R300_FPI_CMD_0
] =
683 cmdr500fp(r300
->radeon
.radeonScreen
, 0, 0, 0, 0);
684 if (r300
->radeon
.radeonScreen
->kernel_mm
)
685 r300
->hw
.r500fp
.emit
= emit_r500fp_atom
;
687 ALLOC_STATE(r500fp_const
, r500fp_const
, R500_FPP_CMDSIZE
, 0);
688 r300
->hw
.r500fp_const
.cmd
[R300_FPI_CMD_0
] =
689 cmdr500fp(r300
->radeon
.radeonScreen
, 0, 0, 1, 0);
690 if (r300
->radeon
.radeonScreen
->kernel_mm
)
691 r300
->hw
.r500fp_const
.emit
= emit_r500fp_atom
;
693 ALLOC_STATE(fp
, always
, R300_FP_CMDSIZE
, 0);
694 r300
->hw
.fp
.cmd
[R300_FP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_CONFIG
, 3);
695 r300
->hw
.fp
.cmd
[R300_FP_CMD_1
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_CODE_ADDR_0
, 4);
697 ALLOC_STATE(fpt
, variable
, R300_FPT_CMDSIZE
, 0);
698 r300
->hw
.fpt
.cmd
[R300_FPT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_TEX_INST_0
, 0);
700 ALLOC_STATE(fpi
[0], variable
, R300_FPI_CMDSIZE
, 0);
701 r300
->hw
.fpi
[0].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_RGB_INST_0
, 1);
702 ALLOC_STATE(fpi
[1], variable
, R300_FPI_CMDSIZE
, 1);
703 r300
->hw
.fpi
[1].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_RGB_ADDR_0
, 1);
704 ALLOC_STATE(fpi
[2], variable
, R300_FPI_CMDSIZE
, 2);
705 r300
->hw
.fpi
[2].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_ALPHA_INST_0
, 1);
706 ALLOC_STATE(fpi
[3], variable
, R300_FPI_CMDSIZE
, 3);
707 r300
->hw
.fpi
[3].cmd
[R300_FPI_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_US_ALU_ALPHA_ADDR_0
, 1);
708 ALLOC_STATE(fpp
, variable
, R300_FPP_CMDSIZE
, 0);
709 r300
->hw
.fpp
.cmd
[R300_FPP_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_PFS_PARAM_0_X
, 0);
711 ALLOC_STATE(fogs
, always
, R300_FOGS_CMDSIZE
, 0);
712 r300
->hw
.fogs
.cmd
[R300_FOGS_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_FOG_BLEND
, 1);
713 ALLOC_STATE(fogc
, always
, R300_FOGC_CMDSIZE
, 0);
714 r300
->hw
.fogc
.cmd
[R300_FOGC_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_FOG_COLOR_R
, 3);
715 ALLOC_STATE(at
, always
, R300_AT_CMDSIZE
, 0);
716 r300
->hw
.at
.cmd
[R300_AT_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_ALPHA_FUNC
, 2);
717 ALLOC_STATE(fg_depth_src
, always
, 2, 0);
718 r300
->hw
.fg_depth_src
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_FG_DEPTH_SRC
, 1);
719 ALLOC_STATE(rb3d_cctl
, always
, 2, 0);
720 r300
->hw
.rb3d_cctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_CCTL
, 1);
721 ALLOC_STATE(bld
, always
, R300_BLD_CMDSIZE
, 0);
722 r300
->hw
.bld
.cmd
[R300_BLD_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_CBLEND
, 2);
723 ALLOC_STATE(cmk
, always
, R300_CMK_CMDSIZE
, 0);
724 r300
->hw
.cmk
.cmd
[R300_CMK_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, RB3D_COLOR_CHANNEL_MASK
, 1);
726 ALLOC_STATE(blend_color
, always
, 3, 0);
727 r300
->hw
.blend_color
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RB3D_CONSTANT_COLOR_AR
, 2);
729 ALLOC_STATE(blend_color
, always
, 2, 0);
730 r300
->hw
.blend_color
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_BLEND_COLOR
, 1);
732 ALLOC_STATE(rop
, always
, 2, 0);
733 r300
->hw
.rop
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_ROPCNTL
, 1);
734 ALLOC_STATE(cb
, cb_offset
, R300_CB_CMDSIZE
, 0);
735 r300
->hw
.cb
.emit
= &emit_cb_offset_atom
;
736 ALLOC_STATE(rb3d_dither_ctl
, always
, 10, 0);
737 r300
->hw
.rb3d_dither_ctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_DITHER_CTL
, 9);
738 ALLOC_STATE(rb3d_aaresolve_ctl
, always
, 2, 0);
739 r300
->hw
.rb3d_aaresolve_ctl
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_AARESOLVE_CTL
, 1);
740 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV350
) {
741 ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold
, always
, 3, 0);
743 ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold
, never
, 3, 0);
745 r300
->hw
.rb3d_discard_src_pixel_lte_threshold
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
, 2);
746 ALLOC_STATE(zs
, always
, R300_ZS_CMDSIZE
, 0);
747 r300
->hw
.zs
.cmd
[R300_ZS_CMD_0
] =
748 cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_CNTL
, 3);
750 if (r300
->radeon
.radeonScreen
->kernel_mm
)
751 ALLOC_STATE(zsb
, always
, R300_ZSB_CMDSIZE
, 0);
753 ALLOC_STATE(zsb
, never
, R300_ZSB_CMDSIZE
, 0);
754 r300
->hw
.zsb
.cmd
[R300_ZSB_CMD_0
] =
755 cmdpacket0(r300
->radeon
.radeonScreen
, R500_ZB_STENCILREFMASK_BF
, 1);
758 ALLOC_STATE(zstencil_format
, always
, 5, 0);
759 r300
->hw
.zstencil_format
.cmd
[0] =
760 cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_FORMAT
, 4);
761 r300
->hw
.zstencil_format
.emit
= emit_zstencil_format
;
763 ALLOC_STATE(zb
, zb_offset
, R300_ZB_CMDSIZE
, 0);
764 r300
->hw
.zb
.emit
= emit_zb_offset
;
765 ALLOC_STATE(zb_depthclearvalue
, always
, 2, 0);
766 r300
->hw
.zb_depthclearvalue
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_DEPTHCLEARVALUE
, 1);
767 ALLOC_STATE(zb_zmask
, always
, 3, 0);
768 r300
->hw
.zb_zmask
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_ZMASK_OFFSET
, 2);
769 ALLOC_STATE(zb_hiz_offset
, always
, 2, 0);
770 r300
->hw
.zb_hiz_offset
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_HIZ_OFFSET
, 1);
771 ALLOC_STATE(zb_hiz_pitch
, always
, 2, 0);
772 r300
->hw
.zb_hiz_pitch
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_HIZ_PITCH
, 1);
774 /* VPU only on TCL */
777 if (r300
->radeon
.radeonScreen
->kernel_mm
) {
778 ALLOC_STATE(vap_flush
, always
, 10, 0);
779 /* flush processing vertices */
780 r300
->hw
.vap_flush
.cmd
[0] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_SCREENDOOR
, 1);
781 r300
->hw
.vap_flush
.cmd
[1] = 0;
782 r300
->hw
.vap_flush
.cmd
[2] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_RB3D_DSTCACHE_CTLSTAT
, 1);
783 r300
->hw
.vap_flush
.cmd
[3] = R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D
;
784 r300
->hw
.vap_flush
.cmd
[4] = cmdpacket0(r300
->radeon
.radeonScreen
, RADEON_WAIT_UNTIL
, 1);
785 r300
->hw
.vap_flush
.cmd
[5] = RADEON_WAIT_3D_IDLECLEAN
;
786 r300
->hw
.vap_flush
.cmd
[6] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SC_SCREENDOOR
, 1);
787 r300
->hw
.vap_flush
.cmd
[7] = 0xffffff;
788 r300
->hw
.vap_flush
.cmd
[8] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_VAP_PVS_STATE_FLUSH_REG
, 1);
789 r300
->hw
.vap_flush
.cmd
[9] = 0;
791 ALLOC_STATE(vap_flush
, never
, 10, 0);
795 ALLOC_STATE(vpi
, vpu
, R300_VPI_CMDSIZE
, 0);
796 r300
->hw
.vpi
.cmd
[0] =
797 cmdvpu(r300
->radeon
.radeonScreen
, R300_PVS_CODE_START
, 0);
798 if (r300
->radeon
.radeonScreen
->kernel_mm
)
799 r300
->hw
.vpi
.emit
= emit_vpu
;
802 ALLOC_STATE(vpp
, vpu
, R300_VPP_CMDSIZE
, 0);
803 r300
->hw
.vpp
.cmd
[0] =
804 cmdvpu(r300
->radeon
.radeonScreen
, R500_PVS_CONST_START
, 0);
805 if (r300
->radeon
.radeonScreen
->kernel_mm
)
806 r300
->hw
.vpp
.emit
= emit_vpu
;
808 ALLOC_STATE(vps
, vpu
, R300_VPS_CMDSIZE
, 0);
809 r300
->hw
.vps
.cmd
[0] =
810 cmdvpu(r300
->radeon
.radeonScreen
, R500_POINT_VPORT_SCALE_OFFSET
, 1);
811 if (r300
->radeon
.radeonScreen
->kernel_mm
)
812 r300
->hw
.vps
.emit
= emit_vpu
;
814 for (i
= 0; i
< 6; i
++) {
815 ALLOC_STATE(vpucp
[i
], vpu
, R300_VPUCP_CMDSIZE
, 0);
816 r300
->hw
.vpucp
[i
].cmd
[0] =
817 cmdvpu(r300
->radeon
.radeonScreen
,
818 R500_PVS_UCP_START
+ i
, 1);
819 if (r300
->radeon
.radeonScreen
->kernel_mm
)
820 r300
->hw
.vpucp
[i
].emit
= emit_vpu
;
823 ALLOC_STATE(vpp
, vpu
, R300_VPP_CMDSIZE
, 0);
824 r300
->hw
.vpp
.cmd
[0] =
825 cmdvpu(r300
->radeon
.radeonScreen
, R300_PVS_CONST_START
, 0);
826 if (r300
->radeon
.radeonScreen
->kernel_mm
)
827 r300
->hw
.vpp
.emit
= emit_vpu
;
829 ALLOC_STATE(vps
, vpu
, R300_VPS_CMDSIZE
, 0);
830 r300
->hw
.vps
.cmd
[0] =
831 cmdvpu(r300
->radeon
.radeonScreen
, R300_POINT_VPORT_SCALE_OFFSET
, 1);
832 if (r300
->radeon
.radeonScreen
->kernel_mm
)
833 r300
->hw
.vps
.emit
= emit_vpu
;
835 for (i
= 0; i
< 6; i
++) {
836 ALLOC_STATE(vpucp
[i
], vpu
, R300_VPUCP_CMDSIZE
, 0);
837 r300
->hw
.vpucp
[i
].cmd
[0] =
838 cmdvpu(r300
->radeon
.radeonScreen
,
839 R300_PVS_UCP_START
+ i
, 1);
840 if (r300
->radeon
.radeonScreen
->kernel_mm
)
841 r300
->hw
.vpucp
[i
].emit
= emit_vpu
;
847 ALLOC_STATE(tex
.filter
, variable
, mtu
+ 1, 0);
848 r300
->hw
.tex
.filter
.cmd
[R300_TEX_CMD_0
] =
849 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FILTER0_0
, 0);
851 ALLOC_STATE(tex
.filter_1
, variable
, mtu
+ 1, 0);
852 r300
->hw
.tex
.filter_1
.cmd
[R300_TEX_CMD_0
] =
853 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FILTER1_0
, 0);
855 ALLOC_STATE(tex
.size
, variable
, mtu
+ 1, 0);
856 r300
->hw
.tex
.size
.cmd
[R300_TEX_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_SIZE_0
, 0);
858 ALLOC_STATE(tex
.format
, variable
, mtu
+ 1, 0);
859 r300
->hw
.tex
.format
.cmd
[R300_TEX_CMD_0
] =
860 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FORMAT_0
, 0);
862 ALLOC_STATE(tex
.pitch
, variable
, mtu
+ 1, 0);
863 r300
->hw
.tex
.pitch
.cmd
[R300_TEX_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_FORMAT2_0
, 0);
865 ALLOC_STATE(tex
.offset
, tex_offsets
, 1, 0);
866 r300
->hw
.tex
.offset
.cmd
[R300_TEX_CMD_0
] =
867 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_OFFSET_0
, 0);
868 r300
->hw
.tex
.offset
.emit
= &emit_tex_offsets
;
870 ALLOC_STATE(tex
.chroma_key
, variable
, mtu
+ 1, 0);
871 r300
->hw
.tex
.chroma_key
.cmd
[R300_TEX_CMD_0
] =
872 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_CHROMA_KEY_0
, 0);
874 ALLOC_STATE(tex
.border_color
, variable
, mtu
+ 1, 0);
875 r300
->hw
.tex
.border_color
.cmd
[R300_TEX_CMD_0
] =
876 cmdpacket0(r300
->radeon
.radeonScreen
, R300_TX_BORDER_COLOR_0
, 0);
878 radeon_init_query_stateobj(&r300
->radeon
, R300_QUERYOBJ_CMDSIZE
);
879 if (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV530
) {
880 r300
->radeon
.query
.queryobj
.cmd
[R300_QUERYOBJ_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, RV530_FG_ZBREG_DEST
, 1);
881 r300
->radeon
.query
.queryobj
.cmd
[R300_QUERYOBJ_DATA_0
] = RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL
;
883 r300
->radeon
.query
.queryobj
.cmd
[R300_QUERYOBJ_CMD_0
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_SU_REG_DEST
, 1);
884 r300
->radeon
.query
.queryobj
.cmd
[R300_QUERYOBJ_DATA_0
] = R300_RASTER_PIPE_SELECT_ALL
;
886 r300
->radeon
.query
.queryobj
.cmd
[R300_QUERYOBJ_CMD_1
] = cmdpacket0(r300
->radeon
.radeonScreen
, R300_ZB_ZPASS_DATA
, 1);
887 r300
->radeon
.query
.queryobj
.cmd
[R300_QUERYOBJ_DATA_1
] = 0;
889 r300
->radeon
.hw
.is_dirty
= GL_TRUE
;
890 r300
->radeon
.hw
.all_dirty
= GL_TRUE
;
892 rcommonInitCmdBuf(&r300
->radeon
);