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 "main/simple_list.h"
48 #include "swrast/swrast.h"
50 #include "radeon_common.h"
51 #include "radeon_lock.h"
52 #include "r300_context.h"
53 #include "r300_ioctl.h"
54 #include "r300_cmdbuf.h"
55 #include "r300_state.h"
56 #include "r300_vertprog.h"
57 #include "radeon_reg.h"
58 #include "r300_emit.h"
59 #include "r300_context.h"
60 #include "r300_queryobj.h"
64 #define R200_3D_DRAW_IMMD_2 0xC0003500
66 #define CLEARBUFFER_COLOR 0x1
67 #define CLEARBUFFER_DEPTH 0x2
68 #define CLEARBUFFER_STENCIL 0x4
73 * Fragment program helper macros
76 /* Produce unshifted source selectors */
77 #define FP_TMP(idx) (idx)
78 #define FP_CONST(idx) ((idx) | (1 << 5))
80 /* Produce source/dest selector dword */
81 #define FP_SELC_MASK_NO 0
82 #define FP_SELC_MASK_X 1
83 #define FP_SELC_MASK_Y 2
84 #define FP_SELC_MASK_XY 3
85 #define FP_SELC_MASK_Z 4
86 #define FP_SELC_MASK_XZ 5
87 #define FP_SELC_MASK_YZ 6
88 #define FP_SELC_MASK_XYZ 7
90 #define FP_SELC(destidx,regmask,outmask,src0,src1,src2) \
91 (((destidx) << R300_ALU_DSTC_SHIFT) | \
92 (FP_SELC_MASK_##regmask << 23) | \
93 (FP_SELC_MASK_##outmask << 26) | \
94 ((src0) << R300_ALU_SRC0C_SHIFT) | \
95 ((src1) << R300_ALU_SRC1C_SHIFT) | \
96 ((src2) << R300_ALU_SRC2C_SHIFT))
98 #define FP_SELA_MASK_NO 0
99 #define FP_SELA_MASK_W 1
101 #define FP_SELA(destidx,regmask,outmask,src0,src1,src2) \
102 (((destidx) << R300_ALU_DSTA_SHIFT) | \
103 (FP_SELA_MASK_##regmask << 23) | \
104 (FP_SELA_MASK_##outmask << 24) | \
105 ((src0) << R300_ALU_SRC0A_SHIFT) | \
106 ((src1) << R300_ALU_SRC1A_SHIFT) | \
107 ((src2) << R300_ALU_SRC2A_SHIFT))
109 /* Produce unshifted argument selectors */
110 #define FP_ARGC(source) R300_ALU_ARGC_##source
111 #define FP_ARGA(source) R300_ALU_ARGA_##source
112 #define FP_ABS(arg) ((arg) | (1 << 6))
113 #define FP_NEG(arg) ((arg) ^ (1 << 5))
115 /* Produce instruction dword */
116 #define FP_INSTRC(opcode,arg0,arg1,arg2) \
117 (R300_ALU_OUTC_##opcode | \
118 ((arg0) << R300_ALU_ARG0C_SHIFT) | \
119 ((arg1) << R300_ALU_ARG1C_SHIFT) | \
120 ((arg2) << R300_ALU_ARG2C_SHIFT))
122 #define FP_INSTRA(opcode,arg0,arg1,arg2) \
123 (R300_ALU_OUTA_##opcode | \
124 ((arg0) << R300_ALU_ARG0A_SHIFT) | \
125 ((arg1) << R300_ALU_ARG1A_SHIFT) | \
126 ((arg2) << R300_ALU_ARG2A_SHIFT))
130 static void r300EmitClearState(GLcontext
* ctx
);
132 static void r300ClearBuffer(r300ContextPtr r300
, int flags
,
133 struct radeon_renderbuffer
*rrb
,
134 struct radeon_renderbuffer
*rrbd
)
136 BATCH_LOCALS(&r300
->radeon
);
137 GLcontext
*ctx
= r300
->radeon
.glCtx
;
138 __DRIdrawablePrivate
*dPriv
= radeon_get_drawable(&r300
->radeon
);
140 r300ContextPtr rmesa
= r300
;
142 if (RADEON_DEBUG
& DEBUG_IOCTL
)
143 fprintf(stderr
, "%s: buffer %p (%i,%i %ix%i)\n",
144 __FUNCTION__
, rrb
, dPriv
->x
, dPriv
->y
,
148 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
150 cbpitch
|= R300_COLOR_FORMAT_ARGB8888
;
152 cbpitch
|= R300_COLOR_FORMAT_RGB565
;
154 if (rrb
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
){
155 cbpitch
|= R300_COLOR_TILE_ENABLE
;
160 cp_wait(&r300
->radeon
, R300_WAIT_3D
| R300_WAIT_3D_CLEAN
);
161 end_3d(&rmesa
->radeon
);
163 if (flags
& CLEARBUFFER_COLOR
) {
165 BEGIN_BATCH_NO_AUTOSTATE(6);
166 OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0
, 1);
167 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
168 OUT_BATCH_REGVAL(R300_RB3D_COLORPITCH0
, cbpitch
);
172 if (flags
& (CLEARBUFFER_DEPTH
| CLEARBUFFER_STENCIL
)) {
173 uint32_t zbpitch
= (rrbd
->pitch
/ rrbd
->cpp
);
174 if (rrbd
->bo
->flags
& RADEON_BO_FLAGS_MACRO_TILE
){
175 zbpitch
|= R300_DEPTHMACROTILE_ENABLE
;
177 if (rrbd
->bo
->flags
& RADEON_BO_FLAGS_MICRO_TILE
){
178 zbpitch
|= R300_DEPTHMICROTILE_TILED
;
180 BEGIN_BATCH_NO_AUTOSTATE(6);
181 OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET
, 1);
182 OUT_BATCH_RELOC(0, rrbd
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
183 OUT_BATCH_REGSEQ(R300_ZB_DEPTHPITCH
, 1);
184 if (!r300
->radeon
.radeonScreen
->kernel_mm
)
187 OUT_BATCH_RELOC(zbpitch
, rrbd
->bo
, zbpitch
, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
191 BEGIN_BATCH_NO_AUTOSTATE(6);
192 OUT_BATCH_REGSEQ(RB3D_COLOR_CHANNEL_MASK
, 1);
193 if (flags
& CLEARBUFFER_COLOR
) {
194 OUT_BATCH((ctx
->Color
.ColorMask
[BCOMP
] ? RB3D_COLOR_CHANNEL_MASK_BLUE_MASK0
: 0) |
195 (ctx
->Color
.ColorMask
[GCOMP
] ? RB3D_COLOR_CHANNEL_MASK_GREEN_MASK0
: 0) |
196 (ctx
->Color
.ColorMask
[RCOMP
] ? RB3D_COLOR_CHANNEL_MASK_RED_MASK0
: 0) |
197 (ctx
->Color
.ColorMask
[ACOMP
] ? RB3D_COLOR_CHANNEL_MASK_ALPHA_MASK0
: 0));
209 if (flags
& CLEARBUFFER_DEPTH
) {
210 t1
|= R300_Z_ENABLE
| R300_Z_WRITE_ENABLE
;
212 (R300_ZS_ALWAYS
<< R300_Z_FUNC_SHIFT
);
215 if (flags
& CLEARBUFFER_STENCIL
) {
216 t1
|= R300_STENCIL_ENABLE
;
219 R300_S_FRONT_FUNC_SHIFT
) |
221 R300_S_FRONT_SFAIL_OP_SHIFT
) |
223 R300_S_FRONT_ZPASS_OP_SHIFT
) |
225 R300_S_FRONT_ZFAIL_OP_SHIFT
);
228 OUT_BATCH_REGSEQ(R300_ZB_CNTL
, 3);
231 OUT_BATCH(((ctx
->Stencil
.WriteMask
[0] & R300_STENCILREF_MASK
) <<
232 R300_STENCILWRITEMASK_SHIFT
) |
233 (ctx
->Stencil
.Clear
& R300_STENCILREF_MASK
));
237 if (!rmesa
->radeon
.radeonScreen
->kernel_mm
) {
238 BEGIN_BATCH_NO_AUTOSTATE(9);
239 OUT_BATCH(cmdpacket3(r300
->radeon
.radeonScreen
, R300_CMD_PACKET3_CLEAR
));
240 OUT_BATCH_FLOAT32(dPriv
->w
/ 2.0);
241 OUT_BATCH_FLOAT32(dPriv
->h
/ 2.0);
242 OUT_BATCH_FLOAT32(ctx
->Depth
.Clear
);
243 OUT_BATCH_FLOAT32(1.0);
244 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[0]);
245 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[1]);
246 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[2]);
247 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[3]);
250 OUT_BATCH(CP_PACKET3(R200_3D_DRAW_IMMD_2
, 8));
251 OUT_BATCH(R300_PRIM_TYPE_POINT
| R300_PRIM_WALK_RING
|
252 (1 << R300_PRIM_NUM_VERTICES_SHIFT
));
253 OUT_BATCH_FLOAT32(dPriv
->w
/ 2.0);
254 OUT_BATCH_FLOAT32(dPriv
->h
/ 2.0);
255 OUT_BATCH_FLOAT32(ctx
->Depth
.Clear
);
256 OUT_BATCH_FLOAT32(1.0);
257 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[0]);
258 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[1]);
259 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[2]);
260 OUT_BATCH_FLOAT32(ctx
->Color
.ClearColor
[3]);
263 r300EmitCacheFlush(rmesa
);
264 cp_wait(&r300
->radeon
, R300_WAIT_3D
| R300_WAIT_3D_CLEAN
);
266 R300_STATECHANGE(r300
, cb
);
267 R300_STATECHANGE(r300
, cmk
);
268 R300_STATECHANGE(r300
, zs
);
271 static void r300EmitClearState(GLcontext
* ctx
)
273 r300ContextPtr r300
= R300_CONTEXT(ctx
);
274 BATCH_LOCALS(&r300
->radeon
);
275 __DRIdrawablePrivate
*dPriv
= radeon_get_drawable(&r300
->radeon
);
281 has_tcl
= r300
->options
.hw_tcl_enabled
;
283 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
)
286 /* State atom dirty tracking is a little subtle here.
288 * On the one hand, we need to make sure base state is emitted
289 * here if we start with an empty batch buffer, otherwise clear
290 * works incorrectly with multiple processes. Therefore, the first
291 * BEGIN_BATCH cannot be a BEGIN_BATCH_NO_AUTOSTATE.
293 * On the other hand, implicit state emission clears the state atom
294 * dirty bits, so we have to call R300_STATECHANGE later than the
297 * The final trickiness is that, because we change state, we need
298 * to ensure that any stored swtcl primitives are flushed properly
299 * before we start changing state. See the R300_NEWPRIM in r300Clear
303 OUT_BATCH_REGSEQ(R300_VAP_PROG_STREAM_CNTL_0
, 1);
305 OUT_BATCH(((((0 << R300_DST_VEC_LOC_SHIFT
) | R300_DATA_TYPE_FLOAT_4
) << R300_DATA_TYPE_0_SHIFT
) |
306 ((R300_LAST_VEC
| (2 << R300_DST_VEC_LOC_SHIFT
) | R300_DATA_TYPE_FLOAT_4
) << R300_DATA_TYPE_1_SHIFT
)));
308 OUT_BATCH(((((0 << R300_DST_VEC_LOC_SHIFT
) | R300_DATA_TYPE_FLOAT_4
) << R300_DATA_TYPE_0_SHIFT
) |
309 ((R300_LAST_VEC
| (1 << R300_DST_VEC_LOC_SHIFT
) | R300_DATA_TYPE_FLOAT_4
) << R300_DATA_TYPE_1_SHIFT
)));
311 OUT_BATCH_REGVAL(R300_FG_FOG_BLEND
, 0);
312 OUT_BATCH_REGVAL(R300_VAP_PROG_STREAM_CNTL_EXT_0
,
313 ((((R300_SWIZZLE_SELECT_X
<< R300_SWIZZLE_SELECT_X_SHIFT
) |
314 (R300_SWIZZLE_SELECT_Y
<< R300_SWIZZLE_SELECT_Y_SHIFT
) |
315 (R300_SWIZZLE_SELECT_Z
<< R300_SWIZZLE_SELECT_Z_SHIFT
) |
316 (R300_SWIZZLE_SELECT_W
<< R300_SWIZZLE_SELECT_W_SHIFT
) |
317 ((R300_WRITE_ENA_X
| R300_WRITE_ENA_Y
| R300_WRITE_ENA_Z
| R300_WRITE_ENA_W
) << R300_WRITE_ENA_SHIFT
))
318 << R300_SWIZZLE0_SHIFT
) |
319 (((R300_SWIZZLE_SELECT_X
<< R300_SWIZZLE_SELECT_X_SHIFT
) |
320 (R300_SWIZZLE_SELECT_Y
<< R300_SWIZZLE_SELECT_Y_SHIFT
) |
321 (R300_SWIZZLE_SELECT_Z
<< R300_SWIZZLE_SELECT_Z_SHIFT
) |
322 (R300_SWIZZLE_SELECT_W
<< R300_SWIZZLE_SELECT_W_SHIFT
) |
323 ((R300_WRITE_ENA_X
| R300_WRITE_ENA_Y
| R300_WRITE_ENA_Z
| R300_WRITE_ENA_W
) << R300_WRITE_ENA_SHIFT
))
324 << R300_SWIZZLE1_SHIFT
)));
326 /* R300_VAP_INPUT_CNTL_0, R300_VAP_INPUT_CNTL_1 */
327 OUT_BATCH_REGSEQ(R300_VAP_VTX_STATE_CNTL
, 2);
328 OUT_BATCH((R300_SEL_USER_COLOR_0
<< R300_COLOR_0_ASSEMBLY_SHIFT
));
329 OUT_BATCH(R300_INPUT_CNTL_POS
| R300_INPUT_CNTL_COLOR
| R300_INPUT_CNTL_TC0
);
331 /* comes from fglrx startup of clear */
332 OUT_BATCH_REGSEQ(R300_SE_VTE_CNTL
, 2);
333 OUT_BATCH(R300_VTX_W0_FMT
| R300_VPORT_X_SCALE_ENA
|
334 R300_VPORT_X_OFFSET_ENA
| R300_VPORT_Y_SCALE_ENA
|
335 R300_VPORT_Y_OFFSET_ENA
| R300_VPORT_Z_SCALE_ENA
|
336 R300_VPORT_Z_OFFSET_ENA
);
339 OUT_BATCH_REGVAL(R300_VAP_PSC_SGN_NORM_CNTL
, 0xaaaaaaaa);
341 OUT_BATCH_REGSEQ(R300_VAP_OUTPUT_VTX_FMT_0
, 2);
342 OUT_BATCH(R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
|
343 R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT
);
344 OUT_BATCH(0); /* no textures */
346 OUT_BATCH_REGVAL(R300_TX_ENABLE
, 0);
348 OUT_BATCH_REGSEQ(R300_SE_VPORT_XSCALE
, 6);
349 OUT_BATCH_FLOAT32(1.0);
350 OUT_BATCH_FLOAT32(dPriv
->x
);
351 OUT_BATCH_FLOAT32(1.0);
352 OUT_BATCH_FLOAT32(dPriv
->y
);
353 OUT_BATCH_FLOAT32(1.0);
354 OUT_BATCH_FLOAT32(0.0);
356 OUT_BATCH_REGVAL(R300_FG_ALPHA_FUNC
, 0);
358 OUT_BATCH_REGSEQ(R300_RB3D_CBLEND
, 2);
363 R300_STATECHANGE(r300
, vir
[0]);
364 R300_STATECHANGE(r300
, fogs
);
365 R300_STATECHANGE(r300
, vir
[1]);
366 R300_STATECHANGE(r300
, vic
);
367 R300_STATECHANGE(r300
, vte
);
368 R300_STATECHANGE(r300
, vof
);
369 R300_STATECHANGE(r300
, txe
);
370 R300_STATECHANGE(r300
, vpt
);
371 R300_STATECHANGE(r300
, at
);
372 R300_STATECHANGE(r300
, bld
);
373 R300_STATECHANGE(r300
, ps
);
376 R300_STATECHANGE(r300
, vap_clip_cntl
);
378 BEGIN_BATCH_NO_AUTOSTATE(2);
379 OUT_BATCH_REGVAL(R300_VAP_CLIP_CNTL
, R300_PS_UCP_MODE_CLIP_AS_TRIFAN
| R300_CLIP_DISABLE
);
383 BEGIN_BATCH_NO_AUTOSTATE(2);
384 OUT_BATCH_REGVAL(R300_GA_POINT_SIZE
,
385 ((dPriv
->w
* 6) << R300_POINTSIZE_X_SHIFT
) |
386 ((dPriv
->h
* 6) << R300_POINTSIZE_Y_SHIFT
));
390 R300_STATECHANGE(r300
, ri
);
391 R300_STATECHANGE(r300
, rc
);
392 R300_STATECHANGE(r300
, rr
);
395 OUT_BATCH_REGSEQ(R300_RS_IP_0
, 8);
396 for (i
= 0; i
< 8; ++i
)
397 OUT_BATCH(R300_RS_SEL_T(1) | R300_RS_SEL_R(2) | R300_RS_SEL_Q(3));
399 OUT_BATCH_REGSEQ(R300_RS_COUNT
, 2);
400 OUT_BATCH((1 << R300_IC_COUNT_SHIFT
) | R300_HIRES_EN
);
403 OUT_BATCH_REGVAL(R300_RS_INST_0
, R300_RS_INST_COL_CN_WRITE
);
406 R300_STATECHANGE(r300
, ri
);
407 R300_STATECHANGE(r300
, rc
);
408 R300_STATECHANGE(r300
, rr
);
411 OUT_BATCH_REGSEQ(R500_RS_IP_0
, 8);
412 for (i
= 0; i
< 8; ++i
) {
413 OUT_BATCH((R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_S_SHIFT
) |
414 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_T_SHIFT
) |
415 (R500_RS_IP_PTR_K0
<< R500_RS_IP_TEX_PTR_R_SHIFT
) |
416 (R500_RS_IP_PTR_K1
<< R500_RS_IP_TEX_PTR_Q_SHIFT
));
419 OUT_BATCH_REGSEQ(R300_RS_COUNT
, 2);
420 OUT_BATCH((1 << R300_IC_COUNT_SHIFT
) | R300_HIRES_EN
);
423 OUT_BATCH_REGVAL(R500_RS_INST_0
, R500_RS_INST_COL_CN_WRITE
);
428 R300_STATECHANGE(r300
, fp
);
429 R300_STATECHANGE(r300
, fpi
[0]);
430 R300_STATECHANGE(r300
, fpi
[1]);
431 R300_STATECHANGE(r300
, fpi
[2]);
432 R300_STATECHANGE(r300
, fpi
[3]);
435 OUT_BATCH_REGSEQ(R300_US_CONFIG
, 3);
439 OUT_BATCH_REGSEQ(R300_US_CODE_ADDR_0
, 4);
443 OUT_BATCH(R300_RGBA_OUT
);
445 OUT_BATCH_REGVAL(R300_US_ALU_RGB_INST_0
,
446 FP_INSTRC(MAD
, FP_ARGC(SRC0C_XYZ
), FP_ARGC(ONE
), FP_ARGC(ZERO
)));
447 OUT_BATCH_REGVAL(R300_US_ALU_RGB_ADDR_0
,
448 FP_SELC(0, NO
, XYZ
, FP_TMP(0), 0, 0));
449 OUT_BATCH_REGVAL(R300_US_ALU_ALPHA_INST_0
,
450 FP_INSTRA(MAD
, FP_ARGA(SRC0A
), FP_ARGA(ONE
), FP_ARGA(ZERO
)));
451 OUT_BATCH_REGVAL(R300_US_ALU_ALPHA_ADDR_0
,
452 FP_SELA(0, NO
, W
, FP_TMP(0), 0, 0));
455 struct radeon_state_atom r500fp
;
458 R300_STATECHANGE(r300
, fp
);
459 R300_STATECHANGE(r300
, r500fp
);
462 OUT_BATCH_REGSEQ(R500_US_CONFIG
, 2);
463 OUT_BATCH(R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO
);
465 OUT_BATCH_REGSEQ(R500_US_CODE_ADDR
, 3);
466 OUT_BATCH(R500_US_CODE_START_ADDR(0) | R500_US_CODE_END_ADDR(1));
467 OUT_BATCH(R500_US_CODE_RANGE_ADDR(0) | R500_US_CODE_RANGE_SIZE(1));
468 OUT_BATCH(R500_US_CODE_OFFSET_ADDR(0));
471 r500fp
.check
= check_r500fp
;
473 r500fp
.cmd
[0] = cmdr500fp(r300
->radeon
.radeonScreen
, 0, 1, 0, 0);
474 r500fp
.cmd
[1] = R500_INST_TYPE_OUT
|
475 R500_INST_TEX_SEM_WAIT
|
477 R500_INST_RGB_OMASK_R
|
478 R500_INST_RGB_OMASK_G
|
479 R500_INST_RGB_OMASK_B
|
480 R500_INST_ALPHA_OMASK
|
481 R500_INST_RGB_CLAMP
|
482 R500_INST_ALPHA_CLAMP
;
483 r500fp
.cmd
[2] = R500_RGB_ADDR0(0) |
485 R500_RGB_ADDR1_CONST
|
487 R500_RGB_ADDR2_CONST
;
488 r500fp
.cmd
[3] = R500_ALPHA_ADDR0(0) |
489 R500_ALPHA_ADDR1(0) |
490 R500_ALPHA_ADDR1_CONST
|
491 R500_ALPHA_ADDR2(0) |
492 R500_ALPHA_ADDR2_CONST
;
493 r500fp
.cmd
[4] = R500_ALU_RGB_SEL_A_SRC0
|
494 R500_ALU_RGB_R_SWIZ_A_R
|
495 R500_ALU_RGB_G_SWIZ_A_G
|
496 R500_ALU_RGB_B_SWIZ_A_B
|
497 R500_ALU_RGB_SEL_B_SRC0
|
498 R500_ALU_RGB_R_SWIZ_B_R
|
499 R500_ALU_RGB_B_SWIZ_B_G
|
500 R500_ALU_RGB_G_SWIZ_B_B
;
501 r500fp
.cmd
[5] = R500_ALPHA_OP_CMP
|
502 R500_ALPHA_SWIZ_A_A
|
504 r500fp
.cmd
[6] = R500_ALU_RGBA_OP_CMP
|
505 R500_ALU_RGBA_R_SWIZ_0
|
506 R500_ALU_RGBA_G_SWIZ_0
|
507 R500_ALU_RGBA_B_SWIZ_0
|
508 R500_ALU_RGBA_A_SWIZ_0
;
511 emit_r500fp(ctx
, &r500fp
);
515 OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG
, 0);
519 vap_cntl
= ((10 << R300_PVS_NUM_SLOTS_SHIFT
) |
520 (5 << R300_PVS_NUM_CNTLRS_SHIFT
) |
521 (12 << R300_VF_MAX_VTX_NUM_SHIFT
));
522 if (r300
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_RV515
)
523 vap_cntl
|= R500_TCL_STATE_OPTIMIZATION
;
525 vap_cntl
= ((10 << R300_PVS_NUM_SLOTS_SHIFT
) |
526 (5 << R300_PVS_NUM_CNTLRS_SHIFT
) |
527 (5 << R300_VF_MAX_VTX_NUM_SHIFT
));
530 if (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV515
)
531 vap_cntl
|= (2 << R300_PVS_NUM_FPUS_SHIFT
);
532 else if ((r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV530
) ||
533 (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV560
) ||
534 (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV570
))
535 vap_cntl
|= (5 << R300_PVS_NUM_FPUS_SHIFT
);
536 else if ((r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_RV410
) ||
537 (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R420
))
538 vap_cntl
|= (6 << R300_PVS_NUM_FPUS_SHIFT
);
539 else if ((r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R520
) ||
540 (r300
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R580
))
541 vap_cntl
|= (8 << R300_PVS_NUM_FPUS_SHIFT
);
543 vap_cntl
|= (4 << R300_PVS_NUM_FPUS_SHIFT
);
545 R300_STATECHANGE(r300
, vap_cntl
);
548 OUT_BATCH_REGVAL(R300_VAP_CNTL
, vap_cntl
);
552 struct radeon_state_atom vpu
;
554 R300_STATECHANGE(r300
, pvs
);
555 R300_STATECHANGE(r300
, vpi
);
558 OUT_BATCH_REGSEQ(R300_VAP_PVS_CODE_CNTL_0
, 3);
559 OUT_BATCH((0 << R300_PVS_FIRST_INST_SHIFT
) |
560 (0 << R300_PVS_XYZW_VALID_INST_SHIFT
) |
561 (1 << R300_PVS_LAST_INST_SHIFT
));
562 OUT_BATCH((0 << R300_PVS_CONST_BASE_OFFSET_SHIFT
) |
563 (0 << R300_PVS_MAX_CONST_ADDR_SHIFT
));
564 OUT_BATCH(1 << R300_PVS_LAST_VTX_SRC_INST_SHIFT
);
567 vpu
.check
= check_vpu
;
569 vpu
.cmd
[0] = cmdvpu(r300
->radeon
.radeonScreen
, 0, 2);
571 vpu
.cmd
[1] = PVS_OP_DST_OPERAND(VE_ADD
, GL_FALSE
, GL_FALSE
,
572 0, 0xf, PVS_DST_REG_OUT
);
573 vpu
.cmd
[2] = PVS_SRC_OPERAND(0, PVS_SRC_SELECT_X
, PVS_SRC_SELECT_Y
,
574 PVS_SRC_SELECT_Z
, PVS_SRC_SELECT_W
,
575 PVS_SRC_REG_INPUT
, NEGATE_NONE
);
576 vpu
.cmd
[3] = PVS_SRC_OPERAND(0, PVS_SRC_SELECT_FORCE_0
,
577 PVS_SRC_SELECT_FORCE_0
,
578 PVS_SRC_SELECT_FORCE_0
,
579 PVS_SRC_SELECT_FORCE_0
,
580 PVS_SRC_REG_INPUT
, NEGATE_NONE
);
583 vpu
.cmd
[5] = PVS_OP_DST_OPERAND(VE_ADD
, GL_FALSE
, GL_FALSE
, 1, 0xf,
585 vpu
.cmd
[6] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_X
,
586 PVS_SRC_SELECT_Y
, PVS_SRC_SELECT_Z
,
587 PVS_SRC_SELECT_W
, PVS_SRC_REG_INPUT
,
589 vpu
.cmd
[7] = PVS_SRC_OPERAND(1, PVS_SRC_SELECT_FORCE_0
,
590 PVS_SRC_SELECT_FORCE_0
,
591 PVS_SRC_SELECT_FORCE_0
,
592 PVS_SRC_SELECT_FORCE_0
,
593 PVS_SRC_REG_INPUT
, NEGATE_NONE
);
596 r300
->vap_flush_needed
= GL_TRUE
;
601 static int r300KernelClear(GLcontext
*ctx
, GLuint flags
)
603 r300ContextPtr r300
= R300_CONTEXT(ctx
);
604 __DRIdrawablePrivate
*dPriv
= radeon_get_drawable(&r300
->radeon
);
605 struct radeon_framebuffer
*rfb
= dPriv
->driverPrivate
;
606 struct radeon_renderbuffer
*rrb
;
607 struct radeon_renderbuffer
*rrbd
;
610 /* Make sure it fits there. */
611 radeon_cs_space_reset_bos(r300
->radeon
.cmdbuf
.cs
);
613 if (flags
& BUFFER_BIT_COLOR0
) {
614 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_COLOR0
);
615 radeon_cs_space_add_persistent_bo(r300
->radeon
.cmdbuf
.cs
,
616 rrb
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
);
619 if (flags
& BUFFER_BIT_FRONT_LEFT
) {
620 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_FRONT_LEFT
);
621 radeon_cs_space_add_persistent_bo(r300
->radeon
.cmdbuf
.cs
,
622 rrb
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
);
625 if (flags
& BUFFER_BIT_BACK_LEFT
) {
626 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_BACK_LEFT
);
627 radeon_cs_space_add_persistent_bo(r300
->radeon
.cmdbuf
.cs
,
628 rrb
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
);
631 rrbd
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_DEPTH
);
633 radeon_cs_space_add_persistent_bo(r300
->radeon
.cmdbuf
.cs
,
634 rrbd
->bo
, 0, RADEON_GEM_DOMAIN_VRAM
);
637 ret
= radeon_cs_space_check(r300
->radeon
.cmdbuf
.cs
);
641 rcommonEnsureCmdBufSpace(&r300
->radeon
, 421 * 3, __FUNCTION__
);
643 r300EmitClearState(ctx
);
645 rrbd
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_DEPTH
);
646 if (rrbd
&& (flags
& BUFFER_BIT_DEPTH
))
647 bits
|= CLEARBUFFER_DEPTH
;
649 if (rrbd
&& (flags
& BUFFER_BIT_STENCIL
))
650 bits
|= CLEARBUFFER_STENCIL
;
652 if (flags
& BUFFER_BIT_COLOR0
) {
653 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_COLOR0
);
654 r300ClearBuffer(r300
, CLEARBUFFER_COLOR
, rrb
, NULL
);
658 if (flags
& BUFFER_BIT_FRONT_LEFT
) {
659 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_FRONT_LEFT
);
660 r300ClearBuffer(r300
, bits
| CLEARBUFFER_COLOR
, rrb
, rrbd
);
664 if (flags
& BUFFER_BIT_BACK_LEFT
) {
665 rrb
= radeon_get_renderbuffer(&rfb
->base
, BUFFER_BACK_LEFT
);
666 r300ClearBuffer(r300
, bits
| CLEARBUFFER_COLOR
, rrb
, rrbd
);
671 r300ClearBuffer(r300
, bits
, NULL
, rrbd
);
680 static void r300Clear(GLcontext
* ctx
, GLbitfield mask
)
682 r300ContextPtr r300
= R300_CONTEXT(ctx
);
683 __DRIdrawablePrivate
*dPriv
= radeon_get_drawable(&r300
->radeon
);
684 const GLuint colorMask
= *((GLuint
*) & ctx
->Color
.ColorMask
);
685 GLbitfield swrast_mask
= 0, tri_mask
= 0;
687 struct gl_framebuffer
*fb
= ctx
->DrawBuffer
;
689 if (RADEON_DEBUG
& DEBUG_IOCTL
)
690 fprintf(stderr
, "r300Clear\n");
692 if (!r300
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
) {
693 LOCK_HARDWARE(&r300
->radeon
);
694 UNLOCK_HARDWARE(&r300
->radeon
);
695 if (dPriv
->numClipRects
== 0)
699 /* Flush swtcl vertices if necessary, because we will change hardware
700 * state during clear. See also the state-related comment in
701 * r300EmitClearState.
706 tri_mask
|= (mask
& BUFFER_BITS_COLOR
);
708 tri_mask
|= (mask
& (BUFFER_BIT_FRONT_LEFT
| BUFFER_BIT_BACK_LEFT
));
712 if (mask
& BUFFER_BIT_STENCIL
) {
713 tri_mask
|= BUFFER_BIT_STENCIL
;
717 if (mask
& BUFFER_BIT_DEPTH
) {
718 tri_mask
|= BUFFER_BIT_DEPTH
;
721 /* If we're doing a tri pass for depth/stencil, include a likely color
725 for (i
= 0; i
< BUFFER_COUNT
; i
++) {
726 GLuint bufBit
= 1 << i
;
727 if ((tri_mask
) & bufBit
) {
728 if (!fb
->Attachment
[i
].Renderbuffer
->ClassID
) {
730 swrast_mask
|= bufBit
;
735 /* SW fallback clearing */
736 swrast_mask
= mask
& ~tri_mask
;
740 if (r300
->radeon
.radeonScreen
->kernel_mm
)
741 radeonUserClear(ctx
, tri_mask
);
743 /* if kernel clear fails due to size restraints fallback */
744 ret
= r300KernelClear(ctx
, tri_mask
);
746 swrast_mask
|= tri_mask
;
751 if (RADEON_DEBUG
& DEBUG_FALLBACKS
)
752 fprintf(stderr
, "%s: swrast clear, mask: %x\n",
753 __FUNCTION__
, swrast_mask
);
754 _swrast_Clear(ctx
, swrast_mask
);
758 static void r300Flush(GLcontext
*ctx
)
760 r300ContextPtr r300
= R300_CONTEXT(ctx
);
764 make_empty_list(&r300
->query
.not_flushed_head
);
768 void r300InitIoctlFuncs(struct dd_function_table
*functions
)
770 functions
->Clear
= r300Clear
;
771 functions
->Finish
= radeonFinish
;
772 functions
->Flush
= r300Flush
;