2 Copyright (C) The Weather Channel, Inc. 2002.
3 Copyright (C) 2004 Nicolai Haehnle.
6 The Weather Channel (TM) funded Tungsten Graphics to develop the
7 initial release of the Radeon 8500 driver under the XFree86 license.
8 This notice must be preserved.
10 Permission is hereby granted, free of charge, to any person obtaining
11 a copy of this software and associated documentation files (the
12 "Software"), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sublicense, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial
20 portions of the Software.
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
26 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 **************************************************************************/
35 * \author Keith Whitwell <keith@tungstengraphics.com>
37 * \author Nicolai Haehnle <prefect_@gmx.net>
43 #include "main/glheader.h"
44 #include "main/imports.h"
45 #include "main/macros.h"
46 #include "main/context.h"
47 #include "swrast/swrast.h"
49 #include "radeon_common.h"
50 #include "radeon_lock.h"
51 #include "r300_context.h"
52 #include "r300_ioctl.h"
53 #include "r300_cmdbuf.h"
54 #include "r300_state.h"
55 #include "r300_vertprog.h"
56 #include "radeon_reg.h"
57 #include "r300_emit.h"
58 #include "r300_fragprog.h"
59 #include "r300_context.h"
63 #define R200_3D_DRAW_IMMD_2 0xC0003500
65 #define CLEARBUFFER_COLOR 0x1
66 #define CLEARBUFFER_DEPTH 0x2
67 #define CLEARBUFFER_STENCIL 0x4
69 static void r300EmitClearState(GLcontext
* ctx
);
71 static void r300ClearBuffer(r300ContextPtr r300
, int flags
,
72 struct radeon_renderbuffer
*rrb
,
73 struct radeon_renderbuffer
*rrbd
)
75 BATCH_LOCALS(&r300
->radeon
);
76 GLcontext
*ctx
= r300
->radeon
.glCtx
;
77 __DRIdrawablePrivate
*dPriv
= radeon_get_drawable(&r300
->radeon
);
79 r300ContextPtr rmesa
= r300
;
81 if (RADEON_DEBUG
& DEBUG_IOCTL
)
82 fprintf(stderr
, "%s: buffer %p (%i,%i %ix%i)\n",
83 __FUNCTION__
, rrb
, dPriv
->x
, dPriv
->y
,
87 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
89 cbpitch
|= R300_COLOR_FORMAT_ARGB8888
;
91 cbpitch
|= R300_COLOR_FORMAT_RGB565
;
93 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
){
94 cbpitch
|= R300_COLOR_TILE_ENABLE
;
99 cp_wait(&r300
->radeon
, R300_WAIT_3D
| R300_WAIT_3D_CLEAN
);
100 end_3d(&rmesa
->radeon
);
102 if (flags
& CLEARBUFFER_COLOR
) {
104 BEGIN_BATCH_NO_AUTOSTATE(6);
105 OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0
, 1);
106 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
107 OUT_BATCH_REGVAL(R300_RB3D_COLORPITCH0
, cbpitch
);
111 if (flags
& (CLEARBUFFER_DEPTH
| CLEARBUFFER_STENCIL
)) {
113 cbpitch
= (rrbd
->pitch
/ rrbd
->cpp
);
114 if (rrbd
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
){
115 cbpitch
|= R300_DEPTHMACROTILE_ENABLE
;
117 if (rrbd
->bo
->flags
& RADEON_BO_FLAGS_MICRO_TILE
){
118 cbpitch
|= R300_DEPTHMICROTILE_TILED
;
120 BEGIN_BATCH_NO_AUTOSTATE(6);
121 OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET
, 1);
122 OUT_BATCH_RELOC(0, rrbd
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
123 OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH
, cbpitch
);
127 BEGIN_BATCH_NO_AUTOSTATE(6);
128 OUT_BATCH_REGSEQ(RB3D_COLOR_CHANNEL_MASK
, 1);
129 if (flags
& CLEARBUFFER_COLOR
) {
130 OUT_BATCH((ctx
->Color
.ColorMask
[BCOMP
] ? RB3D_COLOR_CHANNEL_MASK_BLUE_MASK0
: 0) |
131 (ctx
->Color
.ColorMask
[GCOMP
] ? RB3D_COLOR_CHANNEL_MASK_GREEN_MASK0
: 0) |
132 (ctx
->Color
.ColorMask
[RCOMP
] ? RB3D_COLOR_CHANNEL_MASK_RED_MASK0
: 0) |
133 (ctx
->Color
.ColorMask
[ACOMP
] ? RB3D_COLOR_CHANNEL_MASK_ALPHA_MASK0
: 0));
145 if (flags
& CLEARBUFFER_DEPTH
) {
146 t1
|= R300_Z_ENABLE
| R300_Z_WRITE_ENABLE
;
148 (R300_ZS_ALWAYS
<< R300_Z_FUNC_SHIFT
);
151 if (flags
& CLEARBUFFER_STENCIL
) {
152 t1
|= R300_STENCIL_ENABLE
;
155 R300_S_FRONT_FUNC_SHIFT
) |
157 R300_S_FRONT_SFAIL_OP_SHIFT
) |
159 R300_S_FRONT_ZPASS_OP_SHIFT
) |
161 R300_S_FRONT_ZFAIL_OP_SHIFT
);
164 OUT_BATCH_REGSEQ(R300_ZB_CNTL
, 3);
167 OUT_BATCH(((ctx
->Stencil
.WriteMask
[0] & R300_STENCILREF_MASK
) <<
168 R300_STENCILWRITEMASK_SHIFT
) |
169 (ctx
->Stencil
.Clear
& R300_STENCILREF_MASK
));
173 if (!rmesa
->radeon
.radeonScreen
->kernel_mm
) {
174 BEGIN_BATCH_NO_AUTOSTATE(9);
175 OUT_BATCH(cmdpacket3(r300
->radeon
.radeonScreen
, R300_CMD_PACKET3_CLEAR
));
176 OUT_BATCH_FLOAT32(dPriv
->w
/ 2.0);
177 OUT_BATCH_FLOAT32(dPriv
->h
/ 2.0);
178 OUT_BATCH_FLOAT32(ctx
->Depth
.Clear
);
179 OUT_BATCH_FLOAT32(1.0);
180 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[0]);
181 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[1]);
182 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[2]);
183 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[3]);
186 OUT_BATCH(CP_PACKET3(R200_3D_DRAW_IMMD_2
, 8));
187 OUT_BATCH(R300_PRIM_TYPE_POINT
| R300_PRIM_WALK_RING
|
188 (1 << R300_PRIM_NUM_VERTICES_SHIFT
));
189 OUT_BATCH_FLOAT32(dPriv
->w
/ 2.0);
190 OUT_BATCH_FLOAT32(dPriv
->h
/ 2.0);
191 OUT_BATCH_FLOAT32(ctx
->Depth
.Clear
);
192 OUT_BATCH_FLOAT32(1.0);
193 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[0]);
194 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[1]);
195 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[2]);
196 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[3]);
199 r300EmitCacheFlush(rmesa
);
200 cp_wait(&r300
->radeon
, R300_WAIT_3D
| R300_WAIT_3D_CLEAN
);
202 R300_STATECHANGE(r300
, cb
);
203 R300_STATECHANGE(r300
, cmk
);
204 R300_STATECHANGE(r300
, zs
);
207 static void r300EmitClearState(GLcontext
* ctx
)
209 r300ContextPtr r300
= R300_CONTEXT(ctx
);
210 BATCH_LOCALS(&r300
->radeon
);
211 __DRIdrawablePrivate
*dPriv
= radeon_get_drawable(&r300
->radeon
);
217 has_tcl
= r300
->options
.hw_tcl_enabled
;
219 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
)
222 /* State atom dirty tracking is a little subtle here.
224 * On the one hand, we need to make sure base state is emitted
225 * here if we start with an empty batch buffer, otherwise clear
226 * works incorrectly with multiple processes. Therefore, the first
227 * BEGIN_BATCH cannot be a BEGIN_BATCH_NO_AUTOSTATE.
229 * On the other hand, implicit state emission clears the state atom
230 * dirty bits, so we have to call R300_STATECHANGE later than the
233 * The final trickiness is that, because we change state, we need
234 * to ensure that any stored swtcl primitives are flushed properly
235 * before we start changing state. See the R300_NEWPRIM in r300Clear
239 OUT_BATCH_REGSEQ(R300_VAP_PROG_STREAM_CNTL_0
, 1);
241 OUT_BATCH(((((0 << R300_DST_VEC_LOC_SHIFT
) | R300_DATA_TYPE_FLOAT_4
) << R300_DATA_TYPE_0_SHIFT
) |
242 ((R300_LAST_VEC
| (2 << R300_DST_VEC_LOC_SHIFT
) | R300_DATA_TYPE_FLOAT_4
) << R300_DATA_TYPE_1_SHIFT
)));
244 OUT_BATCH(((((0 << R300_DST_VEC_LOC_SHIFT
) | R300_DATA_TYPE_FLOAT_4
) << R300_DATA_TYPE_0_SHIFT
) |
245 ((R300_LAST_VEC
| (1 << R300_DST_VEC_LOC_SHIFT
) | R300_DATA_TYPE_FLOAT_4
) << R300_DATA_TYPE_1_SHIFT
)));
247 OUT_BATCH_REGVAL(R300_FG_FOG_BLEND
, 0);
248 OUT_BATCH_REGVAL(R300_VAP_PROG_STREAM_CNTL_EXT_0
,
249 ((((R300_SWIZZLE_SELECT_X
<< R300_SWIZZLE_SELECT_X_SHIFT
) |
250 (R300_SWIZZLE_SELECT_Y
<< R300_SWIZZLE_SELECT_Y_SHIFT
) |
251 (R300_SWIZZLE_SELECT_Z
<< R300_SWIZZLE_SELECT_Z_SHIFT
) |
252 (R300_SWIZZLE_SELECT_W
<< R300_SWIZZLE_SELECT_W_SHIFT
) |
253 ((R300_WRITE_ENA_X
| R300_WRITE_ENA_Y
| R300_WRITE_ENA_Z
| R300_WRITE_ENA_W
) << R300_WRITE_ENA_SHIFT
))
254 << R300_SWIZZLE0_SHIFT
) |
255 (((R300_SWIZZLE_SELECT_X
<< R300_SWIZZLE_SELECT_X_SHIFT
) |
256 (R300_SWIZZLE_SELECT_Y
<< R300_SWIZZLE_SELECT_Y_SHIFT
) |
257 (R300_SWIZZLE_SELECT_Z
<< R300_SWIZZLE_SELECT_Z_SHIFT
) |
258 (R300_SWIZZLE_SELECT_W
<< R300_SWIZZLE_SELECT_W_SHIFT
) |
259 ((R300_WRITE_ENA_X
| R300_WRITE_ENA_Y
| R300_WRITE_ENA_Z
| R300_WRITE_ENA_W
) << R300_WRITE_ENA_SHIFT
))
260 << R300_SWIZZLE1_SHIFT
)));
262 /* R300_VAP_INPUT_CNTL_0, R300_VAP_INPUT_CNTL_1 */
263 OUT_BATCH_REGSEQ(R300_VAP_VTX_STATE_CNTL
, 2);
264 OUT_BATCH((R300_SEL_USER_COLOR_0
<< R300_COLOR_0_ASSEMBLY_SHIFT
));
265 OUT_BATCH(R300_INPUT_CNTL_POS
| R300_INPUT_CNTL_COLOR
| R300_INPUT_CNTL_TC0
);
267 /* comes from fglrx startup of clear */
268 OUT_BATCH_REGSEQ(R300_SE_VTE_CNTL
, 2);
269 OUT_BATCH(R300_VTX_W0_FMT
| R300_VPORT_X_SCALE_ENA
|
270 R300_VPORT_X_OFFSET_ENA
| R300_VPORT_Y_SCALE_ENA
|
271 R300_VPORT_Y_OFFSET_ENA
| R300_VPORT_Z_SCALE_ENA
|
272 R300_VPORT_Z_OFFSET_ENA
);
275 OUT_BATCH_REGVAL(R300_VAP_PSC_SGN_NORM_CNTL
, 0xaaaaaaaa);
277 OUT_BATCH_REGSEQ(R300_VAP_OUTPUT_VTX_FMT_0
, 2);
278 OUT_BATCH(R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
|
279 R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT
);
280 OUT_BATCH(0); /* no textures */
282 OUT_BATCH_REGVAL(R300_TX_ENABLE
, 0);
284 OUT_BATCH_REGSEQ(R300_SE_VPORT_XSCALE
, 6);
285 OUT_BATCH_FLOAT32(1.0);
286 OUT_BATCH_FLOAT32(dPriv
->x
);
287 OUT_BATCH_FLOAT32(1.0);
288 OUT_BATCH_FLOAT32(dPriv
->y
);
289 OUT_BATCH_FLOAT32(1.0);
290 OUT_BATCH_FLOAT32(0.0);
292 OUT_BATCH_REGVAL(R300_FG_ALPHA_FUNC
, 0);
294 OUT_BATCH_REGSEQ(R300_RB3D_CBLEND
, 2);
299 R300_STATECHANGE(r300
, vir
[0]);
300 R300_STATECHANGE(r300
, fogs
);
301 R300_STATECHANGE(r300
, vir
[1]);
302 R300_STATECHANGE(r300
, vic
);
303 R300_STATECHANGE(r300
, vte
);
304 R300_STATECHANGE(r300
, vof
);
305 R300_STATECHANGE(r300
, txe
);
306 R300_STATECHANGE(r300
, vpt
);
307 R300_STATECHANGE(r300
, at
);
308 R300_STATECHANGE(r300
, bld
);
309 R300_STATECHANGE(r300
, ps
);
312 R300_STATECHANGE(r300
, vap_clip_cntl
);
314 BEGIN_BATCH_NO_AUTOSTATE(2);
315 OUT_BATCH_REGVAL(R300_VAP_CLIP_CNTL
, R300_PS_UCP_MODE_CLIP_AS_TRIFAN
| R300_CLIP_DISABLE
);
319 BEGIN_BATCH_NO_AUTOSTATE(2);
320 OUT_BATCH_REGVAL(R300_GA_POINT_SIZE
,
321 ((dPriv
->w
* 6) << R300_POINTSIZE_X_SHIFT
) |
322 ((dPriv
->h
* 6) << R300_POINTSIZE_Y_SHIFT
));
326 R300_STATECHANGE(r300
, ri
);
327 R300_STATECHANGE(r300
, rc
);
328 R300_STATECHANGE(r300
, rr
);
331 OUT_BATCH_REGSEQ(R300_RS_IP_0
, 8);
332 for (i
= 0; i
< 8; ++i
)
333 OUT_BATCH(R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(3));
335 OUT_BATCH_REGSEQ(R300_RS_COUNT
, 2);
336 OUT_BATCH((1 << R300_IC_COUNT_SHIFT
) | R300_HIRES_EN
);
339 OUT_BATCH_REGVAL(R300_RS_INST_0
, R300_RS_INST_COL_CN_WRITE
);
342 R300_STATECHANGE(r300
, ri
);
343 R300_STATECHANGE(r300
, rc
);
344 R300_STATECHANGE(r300
, rr
);
347 OUT_BATCH_REGSEQ(R500_RS_IP_0
, 8);
348 for (i
= 0; i
< 8; ++i
) {
349 OUT_BATCH((R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_S_SHIFT
) |
350 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_T_SHIFT
) |
351 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_R_SHIFT
) |
352 (R500_RS_IP_PTR_K1
<< R500_RS_IP_TEX_PTR_Q_SHIFT
));
355 OUT_BATCH_REGSEQ(R300_RS_COUNT
, 2);
356 OUT_BATCH((1 << R300_IC_COUNT_SHIFT
) | R300_HIRES_EN
);
359 OUT_BATCH_REGVAL(R500_RS_INST_0
, R500_RS_INST_COL_CN_WRITE
);
364 R300_STATECHANGE(r300
, fp
);
365 R300_STATECHANGE(r300
, fpi
[0]);
366 R300_STATECHANGE(r300
, fpi
[1]);
367 R300_STATECHANGE(r300
, fpi
[2]);
368 R300_STATECHANGE(r300
, fpi
[3]);
371 OUT_BATCH_REGSEQ(R300_US_CONFIG
, 3);
375 OUT_BATCH_REGSEQ(R300_US_CODE_ADDR_0
, 4);
379 OUT_BATCH(R300_RGBA_OUT
);
381 OUT_BATCH_REGVAL(R300_US_ALU_RGB_INST_0
,
382 FP_INSTRC(MAD
, FP_ARGC(SRC0C_XYZ
), FP_ARGC(ONE
), FP_ARGC(ZERO
)));
383 OUT_BATCH_REGVAL(R300_US_ALU_RGB_ADDR_0
,
384 FP_SELC(0, NO
, XYZ
, FP_TMP(0), 0, 0));
385 OUT_BATCH_REGVAL(R300_US_ALU_ALPHA_INST_0
,
386 FP_INSTRA(MAD
, FP_ARGA(SRC0A
), FP_ARGA(ONE
), FP_ARGA(ZERO
)));
387 OUT_BATCH_REGVAL(R300_US_ALU_ALPHA_ADDR_0
,
388 FP_SELA(0, NO
, W
, FP_TMP(0), 0, 0));
391 struct radeon_state_atom r500fp
;
394 R300_STATECHANGE(r300
, fp
);
395 R300_STATECHANGE(r300
, r500fp
);
398 OUT_BATCH_REGSEQ(R500_US_CONFIG
, 2);
399 OUT_BATCH(R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO
);
401 OUT_BATCH_REGSEQ(R500_US_CODE_ADDR
, 3);
402 OUT_BATCH(R500_US_CODE_START_ADDR(0) | R500_US_CODE_END_ADDR(1));
403 OUT_BATCH(R500_US_CODE_RANGE_ADDR(0) | R500_US_CODE_RANGE_SIZE(1));
404 OUT_BATCH(R500_US_CODE_OFFSET_ADDR(0));
407 r500fp
.check
= check_r500fp
;
409 r500fp
.cmd
[0] = cmdr500fp(r300
->radeon
.radeonScreen
, 0, 1, 0, 0);
410 r500fp
.cmd
[1] = R500_INST_TYPE_OUT
|
411 R500_INST_TEX_SEM_WAIT
|
413 R500_INST_RGB_OMASK_R
|
414 R500_INST_RGB_OMASK_G
|
415 R500_INST_RGB_OMASK_B
|
416 R500_INST_ALPHA_OMASK
|
417 R500_INST_RGB_CLAMP
|
418 R500_INST_ALPHA_CLAMP
;
419 r500fp
.cmd
[2] = R500_RGB_ADDR0(0) |
421 R500_RGB_ADDR1_CONST
|
423 R500_RGB_ADDR2_CONST
;
424 r500fp
.cmd
[3] = R500_ALPHA_ADDR0(0) |
425 R500_ALPHA_ADDR1(0) |
426 R500_ALPHA_ADDR1_CONST
|
427 R500_ALPHA_ADDR2(0) |
428 R500_ALPHA_ADDR2_CONST
;
429 r500fp
.cmd
[4] = R500_ALU_RGB_SEL_A_SRC0
|
430 R500_ALU_RGB_R_SWIZ_A_R
|
431 R500_ALU_RGB_G_SWIZ_A_G
|
432 R500_ALU_RGB_B_SWIZ_A_B
|
433 R500_ALU_RGB_SEL_B_SRC0
|
434 R500_ALU_RGB_R_SWIZ_B_R
|
435 R500_ALU_RGB_B_SWIZ_B_G
|
436 R500_ALU_RGB_G_SWIZ_B_B
;
437 r500fp
.cmd
[5] = R500_ALPHA_OP_CMP
|
438 R500_ALPHA_SWIZ_A_A
|
440 r500fp
.cmd
[6] = R500_ALU_RGBA_OP_CMP
|
441 R500_ALU_RGBA_R_SWIZ_0
|
442 R500_ALU_RGBA_G_SWIZ_0
|
443 R500_ALU_RGBA_B_SWIZ_0
|
444 R500_ALU_RGBA_A_SWIZ_0
;
447 emit_r500fp(ctx
, &r500fp
);
451 OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG
, 0);
455 vap_cntl
= ((10 << R300_PVS_NUM_SLOTS_SHIFT
) |
456 (5 << R300_PVS_NUM_CNTLRS_SHIFT
) |
457 (12 << R300_VF_MAX_VTX_NUM_SHIFT
));
458 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
)
459 vap_cntl
|= R500_TCL_STATE_OPTIMIZATION
;
461 vap_cntl
= ((10 << R300_PVS_NUM_SLOTS_SHIFT
) |
462 (5 << R300_PVS_NUM_CNTLRS_SHIFT
) |
463 (5 << R300_VF_MAX_VTX_NUM_SHIFT
));
466 if (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV515
)
467 vap_cntl
|= (2 << R300_PVS_NUM_FPUS_SHIFT
);
468 else if ((r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV530
) ||
469 (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV560
) ||
470 (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV570
))
471 vap_cntl
|= (5 << R300_PVS_NUM_FPUS_SHIFT
);
472 else if ((r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV410
) ||
473 (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R420
))
474 vap_cntl
|= (6 << R300_PVS_NUM_FPUS_SHIFT
);
475 else if ((r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R520
) ||
476 (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R580
))
477 vap_cntl
|= (8 << R300_PVS_NUM_FPUS_SHIFT
);
479 vap_cntl
|= (4 << R300_PVS_NUM_FPUS_SHIFT
);
481 R300_STATECHANGE(r300
, vap_cntl
);
484 OUT_BATCH_REGVAL(R300_VAP_CNTL
, vap_cntl
);
488 struct radeon_state_atom vpu
;
490 R300_STATECHANGE(r300
, pvs
);
491 R300_STATECHANGE(r300
, vpi
);
494 OUT_BATCH_REGSEQ(R300_VAP_PVS_CODE_CNTL_0
, 3);
495 OUT_BATCH((0 << R300_PVS_FIRST_INST_SHIFT
) |
496 (0 << R300_PVS_XYZW_VALID_INST_SHIFT
) |
497 (1 << R300_PVS_LAST_INST_SHIFT
));
498 OUT_BATCH((0 << R300_PVS_CONST_BASE_OFFSET_SHIFT
) |
499 (0 << R300_PVS_MAX_CONST_ADDR_SHIFT
));
500 OUT_BATCH(1 << R300_PVS_LAST_VTX_SRC_INST_SHIFT
);
503 vpu
.check
= check_vpu
;
505 vpu
.cmd
[0] = cmdvpu(r300
->radeon
.radeonScreen
, 0, 2);
507 vpu
.cmd
[1] = PVS_OP_DST_OPERAND(VE_ADD
, GL_FALSE
, GL_FALSE
,
508 0, 0xf, PVS_DST_REG_OUT
);
509 vpu
.cmd
[2] = PVS_SRC_OPERAND(0, PVS_SRC_SELECT_X
, PVS_SRC_SELECT_Y
,
510 PVS_SRC_SELECT_Z
, PVS_SRC_SELECT_W
,
511 PVS_SRC_REG_INPUT
, VSF_FLAG_NONE
);
512 vpu
.cmd
[3] = PVS_SRC_OPERAND(0, PVS_SRC_SELECT_FORCE_0
,
513 PVS_SRC_SELECT_FORCE_0
,
514 PVS_SRC_SELECT_FORCE_0
,
515 PVS_SRC_SELECT_FORCE_0
,
516 PVS_SRC_REG_INPUT
, VSF_FLAG_NONE
);
519 vpu
.cmd
[5] = PVS_OP_DST_OPERAND(VE_ADD
, GL_FALSE
, GL_FALSE
, 1, 0xf,
521 vpu
.cmd
[6] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_X
,
522 PVS_SRC_SELECT_Y
, PVS_SRC_SELECT_Z
,
523 PVS_SRC_SELECT_W
, PVS_SRC_REG_INPUT
,
526 vpu
.cmd
[7] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_FORCE_0
,
527 PVS_SRC_SELECT_FORCE_0
,
528 PVS_SRC_SELECT_FORCE_0
,
529 PVS_SRC_SELECT_FORCE_0
,
530 PVS_SRC_REG_INPUT
, VSF_FLAG_NONE
);
533 r300
->vap_flush_needed
= GL_TRUE
;
538 static int r300KernelClear(GLcontext
*ctx
, GLuint flags
)
540 r300ContextPtr r300
= R300_CONTEXT(ctx
);
541 __DRIdrawablePrivate
*dPriv
= radeon_get_drawable(&r300
->radeon
);
542 struct radeon_framebuffer
*rfb
= dPriv
->driverPrivate
;
543 struct radeon_renderbuffer
*rrb
;
544 struct radeon_renderbuffer
*rrbd
;
547 /* Make sure it fits there. */
548 radeon_cs_space_reset_bos(r300
->radeon
.cmdbuf
.cs
);
550 if (flags
& BUFFER_BIT_COLOR0
) {
551 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_COLOR0
);
552 radeon_cs_space_add_persistent_bo(r300
->radeon
.cmdbuf
.cs
,
553 rrb
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
);
556 if (flags
& BUFFER_BIT_FRONT_LEFT
) {
557 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_FRONT_LEFT
);
558 radeon_cs_space_add_persistent_bo(r300
->radeon
.cmdbuf
.cs
,
559 rrb
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
);
562 if (flags
& BUFFER_BIT_BACK_LEFT
) {
563 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_BACK_LEFT
);
564 radeon_cs_space_add_persistent_bo(r300
->radeon
.cmdbuf
.cs
,
565 rrb
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
);
568 rrbd
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_DEPTH
);
570 radeon_cs_space_add_persistent_bo(r300
->radeon
.cmdbuf
.cs
,
571 rrbd
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
);
574 ret
= radeon_cs_space_check(r300
->radeon
.cmdbuf
.cs
);
578 rcommonEnsureCmdBufSpace(&r300
->radeon
, 421 * 3, __FUNCTION__
);
580 r300EmitClearState(ctx
);
582 rrbd
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_DEPTH
);
583 if (rrbd
&& (flags
& BUFFER_BIT_DEPTH
))
584 bits
|= CLEARBUFFER_DEPTH
;
586 if (rrbd
&& (flags
& BUFFER_BIT_STENCIL
))
587 bits
|= CLEARBUFFER_STENCIL
;
589 if (flags
& BUFFER_BIT_COLOR0
) {
590 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_COLOR0
);
591 r300ClearBuffer(r300
, CLEARBUFFER_COLOR
, rrb
, NULL
);
595 if (flags
& BUFFER_BIT_FRONT_LEFT
) {
596 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_FRONT_LEFT
);
597 r300ClearBuffer(r300
, bits
| CLEARBUFFER_COLOR
, rrb
, rrbd
);
601 if (flags
& BUFFER_BIT_BACK_LEFT
) {
602 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_BACK_LEFT
);
603 r300ClearBuffer(r300
, bits
| CLEARBUFFER_COLOR
, rrb
, rrbd
);
608 r300ClearBuffer(r300
, bits
, NULL
, rrbd
);
617 static void r300Clear(GLcontext
* ctx
, GLbitfield mask
)
619 r300ContextPtr r300
= R300_CONTEXT(ctx
);
620 __DRIdrawablePrivate
*dPriv
= radeon_get_drawable(&r300
->radeon
);
621 const GLuint colorMask
= *((GLuint
*) & ctx
->Color
.ColorMask
);
622 GLbitfield swrast_mask
= 0, tri_mask
= 0;
624 struct gl_framebuffer
*fb
= ctx
->DrawBuffer
;
626 if (RADEON_DEBUG
& DEBUG_IOCTL
)
627 fprintf(stderr
, "r300Clear\n");
629 if (!r300
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
) {
630 LOCK_HARDWARE(&r300
->radeon
);
631 UNLOCK_HARDWARE(&r300
->radeon
);
632 if (dPriv
->numClipRects
== 0)
636 /* Flush swtcl vertices if necessary, because we will change hardware
637 * state during clear. See also the state-related comment in
638 * r300EmitClearState.
643 tri_mask
|= (mask
& BUFFER_BITS_COLOR
);
645 tri_mask
|= (mask
& (BUFFER_BIT_FRONT_LEFT
| BUFFER_BIT_BACK_LEFT
));
649 if (mask
& BUFFER_BIT_STENCIL
) {
650 tri_mask
|= BUFFER_BIT_STENCIL
;
654 if (mask
& BUFFER_BIT_DEPTH
) {
655 tri_mask
|= BUFFER_BIT_DEPTH
;
658 /* If we're doing a tri pass for depth/stencil, include a likely color
662 for (i
= 0; i
< BUFFER_COUNT
; i
++) {
663 GLuint bufBit
= 1 << i
;
664 if ((tri_mask
) & bufBit
) {
665 if (!fb
->Attachment
[i
].Renderbuffer
->ClassID
) {
667 swrast_mask
|= bufBit
;
672 /* SW fallback clearing */
673 swrast_mask
= mask
& ~tri_mask
;
677 if (r300
->radeon
.radeonScreen
->kernel_mm
)
678 radeonUserClear(ctx
, tri_mask
);
680 /* if kernel clear fails due to size restraints fallback */
681 ret
= r300KernelClear(ctx
, tri_mask
);
683 swrast_mask
|= tri_mask
;
688 if (RADEON_DEBUG
& DEBUG_FALLBACKS
)
689 fprintf(stderr
, "%s: swrast clear, mask: %x\n",
690 __FUNCTION__
, swrast_mask
);
691 _swrast_Clear(ctx
, swrast_mask
);
696 void r300InitIoctlFuncs(struct dd_function_table
*functions
)
698 functions
->Clear
= r300Clear
;
699 functions
->Finish
= radeonFinish
;
700 functions
->Flush
= radeonFlush
;