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.
31 * Keith Whitwell <keith@tungstengraphics.com>
34 #include "main/glheader.h"
35 #include "main/imports.h"
36 #include "main/enums.h"
37 #include "main/colormac.h"
38 #include "main/api_arrayelt.h"
40 #include "swrast/swrast.h"
43 #include "tnl/t_pipeline.h"
44 #include "swrast_setup/swrast_setup.h"
46 #include "radeon_buffer.h"
47 #include "radeon_mipmap_tree.h"
48 #include "radeon_cs.h"
49 #include "common_context.h"
50 #include "common_cmdbuf.h"
51 #include "r200_context.h"
52 #include "r200_ioctl.h"
53 #include "r200_state.h"
56 #include "r200_swtcl.h"
60 /* New (1.3) state mechanism. 3 commands (packet, scalar, vector) in
61 * 1.3 cmdbuffers allow all previous state to be updated as well as
62 * the tcl scalar and vector areas.
68 } packet
[RADEON_MAX_STATE_PACKETS
] = {
69 {RADEON_PP_MISC
, 7, "RADEON_PP_MISC"},
70 {RADEON_PP_CNTL
, 3, "RADEON_PP_CNTL"},
71 {RADEON_RB3D_COLORPITCH
, 1, "RADEON_RB3D_COLORPITCH"},
72 {RADEON_RE_LINE_PATTERN
, 2, "RADEON_RE_LINE_PATTERN"},
73 {RADEON_SE_LINE_WIDTH
, 1, "RADEON_SE_LINE_WIDTH"},
74 {RADEON_PP_LUM_MATRIX
, 1, "RADEON_PP_LUM_MATRIX"},
75 {RADEON_PP_ROT_MATRIX_0
, 2, "RADEON_PP_ROT_MATRIX_0"},
76 {RADEON_RB3D_STENCILREFMASK
, 3, "RADEON_RB3D_STENCILREFMASK"},
77 {RADEON_SE_VPORT_XSCALE
, 6, "RADEON_SE_VPORT_XSCALE"},
78 {RADEON_SE_CNTL
, 2, "RADEON_SE_CNTL"},
79 {RADEON_SE_CNTL_STATUS
, 1, "RADEON_SE_CNTL_STATUS"},
80 {RADEON_RE_MISC
, 1, "RADEON_RE_MISC"},
81 {RADEON_PP_TXFILTER_0
, 6, "RADEON_PP_TXFILTER_0"},
82 {RADEON_PP_BORDER_COLOR_0
, 1, "RADEON_PP_BORDER_COLOR_0"},
83 {RADEON_PP_TXFILTER_1
, 6, "RADEON_PP_TXFILTER_1"},
84 {RADEON_PP_BORDER_COLOR_1
, 1, "RADEON_PP_BORDER_COLOR_1"},
85 {RADEON_PP_TXFILTER_2
, 6, "RADEON_PP_TXFILTER_2"},
86 {RADEON_PP_BORDER_COLOR_2
, 1, "RADEON_PP_BORDER_COLOR_2"},
87 {RADEON_SE_ZBIAS_FACTOR
, 2, "RADEON_SE_ZBIAS_FACTOR"},
88 {RADEON_SE_TCL_OUTPUT_VTX_FMT
, 11, "RADEON_SE_TCL_OUTPUT_VTX_FMT"},
89 {RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED
, 17,
90 "RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED"},
91 {R200_PP_TXCBLEND_0
, 4, "R200_PP_TXCBLEND_0"},
92 {R200_PP_TXCBLEND_1
, 4, "R200_PP_TXCBLEND_1"},
93 {R200_PP_TXCBLEND_2
, 4, "R200_PP_TXCBLEND_2"},
94 {R200_PP_TXCBLEND_3
, 4, "R200_PP_TXCBLEND_3"},
95 {R200_PP_TXCBLEND_4
, 4, "R200_PP_TXCBLEND_4"},
96 {R200_PP_TXCBLEND_5
, 4, "R200_PP_TXCBLEND_5"},
97 {R200_PP_TXCBLEND_6
, 4, "R200_PP_TXCBLEND_6"},
98 {R200_PP_TXCBLEND_7
, 4, "R200_PP_TXCBLEND_7"},
99 {R200_SE_TCL_LIGHT_MODEL_CTL_0
, 6, "R200_SE_TCL_LIGHT_MODEL_CTL_0"},
100 {R200_PP_TFACTOR_0
, 6, "R200_PP_TFACTOR_0"},
101 {R200_SE_VTX_FMT_0
, 4, "R200_SE_VTX_FMT_0"},
102 {R200_SE_VAP_CNTL
, 1, "R200_SE_VAP_CNTL"},
103 {R200_SE_TCL_MATRIX_SEL_0
, 5, "R200_SE_TCL_MATRIX_SEL_0"},
104 {R200_SE_TCL_TEX_PROC_CTL_2
, 5, "R200_SE_TCL_TEX_PROC_CTL_2"},
105 {R200_SE_TCL_UCP_VERT_BLEND_CTL
, 1, "R200_SE_TCL_UCP_VERT_BLEND_CTL"},
106 {R200_PP_TXFILTER_0
, 6, "R200_PP_TXFILTER_0"},
107 {R200_PP_TXFILTER_1
, 6, "R200_PP_TXFILTER_1"},
108 {R200_PP_TXFILTER_2
, 6, "R200_PP_TXFILTER_2"},
109 {R200_PP_TXFILTER_3
, 6, "R200_PP_TXFILTER_3"},
110 {R200_PP_TXFILTER_4
, 6, "R200_PP_TXFILTER_4"},
111 {R200_PP_TXFILTER_5
, 6, "R200_PP_TXFILTER_5"},
112 {R200_PP_TXOFFSET_0
, 1, "R200_PP_TXOFFSET_0"},
113 {R200_PP_TXOFFSET_1
, 1, "R200_PP_TXOFFSET_1"},
114 {R200_PP_TXOFFSET_2
, 1, "R200_PP_TXOFFSET_2"},
115 {R200_PP_TXOFFSET_3
, 1, "R200_PP_TXOFFSET_3"},
116 {R200_PP_TXOFFSET_4
, 1, "R200_PP_TXOFFSET_4"},
117 {R200_PP_TXOFFSET_5
, 1, "R200_PP_TXOFFSET_5"},
118 {R200_SE_VTE_CNTL
, 1, "R200_SE_VTE_CNTL"},
119 {R200_SE_TCL_OUTPUT_VTX_COMP_SEL
, 1,
120 "R200_SE_TCL_OUTPUT_VTX_COMP_SEL"},
121 {R200_PP_TAM_DEBUG3
, 1, "R200_PP_TAM_DEBUG3"},
122 {R200_PP_CNTL_X
, 1, "R200_PP_CNTL_X"},
123 {R200_RB3D_DEPTHXY_OFFSET
, 1, "R200_RB3D_DEPTHXY_OFFSET"},
124 {R200_RE_AUX_SCISSOR_CNTL
, 1, "R200_RE_AUX_SCISSOR_CNTL"},
125 {R200_RE_SCISSOR_TL_0
, 2, "R200_RE_SCISSOR_TL_0"},
126 {R200_RE_SCISSOR_TL_1
, 2, "R200_RE_SCISSOR_TL_1"},
127 {R200_RE_SCISSOR_TL_2
, 2, "R200_RE_SCISSOR_TL_2"},
128 {R200_SE_VAP_CNTL_STATUS
, 1, "R200_SE_VAP_CNTL_STATUS"},
129 {R200_SE_VTX_STATE_CNTL
, 1, "R200_SE_VTX_STATE_CNTL"},
130 {R200_RE_POINTSIZE
, 1, "R200_RE_POINTSIZE"},
131 {R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0
, 4,
132 "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0"},
133 {R200_PP_CUBIC_FACES_0
, 1, "R200_PP_CUBIC_FACES_0"}, /* 61 */
134 {R200_PP_CUBIC_OFFSET_F1_0
, 5, "R200_PP_CUBIC_OFFSET_F1_0"}, /* 62 */
135 {R200_PP_CUBIC_FACES_1
, 1, "R200_PP_CUBIC_FACES_1"},
136 {R200_PP_CUBIC_OFFSET_F1_1
, 5, "R200_PP_CUBIC_OFFSET_F1_1"},
137 {R200_PP_CUBIC_FACES_2
, 1, "R200_PP_CUBIC_FACES_2"},
138 {R200_PP_CUBIC_OFFSET_F1_2
, 5, "R200_PP_CUBIC_OFFSET_F1_2"},
139 {R200_PP_CUBIC_FACES_3
, 1, "R200_PP_CUBIC_FACES_3"},
140 {R200_PP_CUBIC_OFFSET_F1_3
, 5, "R200_PP_CUBIC_OFFSET_F1_3"},
141 {R200_PP_CUBIC_FACES_4
, 1, "R200_PP_CUBIC_FACES_4"},
142 {R200_PP_CUBIC_OFFSET_F1_4
, 5, "R200_PP_CUBIC_OFFSET_F1_4"},
143 {R200_PP_CUBIC_FACES_5
, 1, "R200_PP_CUBIC_FACES_5"},
144 {R200_PP_CUBIC_OFFSET_F1_5
, 5, "R200_PP_CUBIC_OFFSET_F1_5"},
145 {RADEON_PP_TEX_SIZE_0
, 2, "RADEON_PP_TEX_SIZE_0"},
146 {RADEON_PP_TEX_SIZE_1
, 2, "RADEON_PP_TEX_SIZE_1"},
147 {RADEON_PP_TEX_SIZE_2
, 2, "RADEON_PP_TEX_SIZE_2"},
148 {R200_RB3D_BLENDCOLOR
, 3, "R200_RB3D_BLENDCOLOR"},
149 {R200_SE_TCL_POINT_SPRITE_CNTL
, 1, "R200_SE_TCL_POINT_SPRITE_CNTL"},
150 {RADEON_PP_CUBIC_FACES_0
, 1, "RADEON_PP_CUBIC_FACES_0"},
151 {RADEON_PP_CUBIC_OFFSET_T0_0
, 5, "RADEON_PP_CUBIC_OFFSET_T0_0"},
152 {RADEON_PP_CUBIC_FACES_1
, 1, "RADEON_PP_CUBIC_FACES_1"},
153 {RADEON_PP_CUBIC_OFFSET_T1_0
, 5, "RADEON_PP_CUBIC_OFFSET_T1_0"},
154 {RADEON_PP_CUBIC_FACES_2
, 1, "RADEON_PP_CUBIC_FACES_2"},
155 {RADEON_PP_CUBIC_OFFSET_T2_0
, 5, "RADEON_PP_CUBIC_OFFSET_T2_0"},
156 {R200_PP_TRI_PERF
, 2, "R200_PP_TRI_PERF"},
157 {R200_PP_TXCBLEND_8
, 32, "R200_PP_AFS_0"}, /* 85 */
158 {R200_PP_TXCBLEND_0
, 32, "R200_PP_AFS_1"},
159 {R200_PP_TFACTOR_0
, 8, "R200_ATF_TFACTOR"},
160 {R200_PP_TXFILTER_0
, 8, "R200_PP_TXCTLALL_0"},
161 {R200_PP_TXFILTER_1
, 8, "R200_PP_TXCTLALL_1"},
162 {R200_PP_TXFILTER_2
, 8, "R200_PP_TXCTLALL_2"},
163 {R200_PP_TXFILTER_3
, 8, "R200_PP_TXCTLALL_3"},
164 {R200_PP_TXFILTER_4
, 8, "R200_PP_TXCTLALL_4"},
165 {R200_PP_TXFILTER_5
, 8, "R200_PP_TXCTLALL_5"},
166 {R200_VAP_PVS_CNTL_1
, 2, "R200_VAP_PVS_CNTL"},
169 /* =============================================================
170 * State initialization
173 void r200PrintDirty( r200ContextPtr rmesa
, const char *msg
)
175 struct radeon_state_atom
*l
;
177 fprintf(stderr
, msg
);
178 fprintf(stderr
, ": ");
180 foreach(l
, &rmesa
->hw
.atomlist
) {
181 if (l
->dirty
|| rmesa
->hw
.all_dirty
)
182 fprintf(stderr
, "%s, ", l
->name
);
185 fprintf(stderr
, "\n");
188 static int cmdpkt( int id
)
190 drm_radeon_cmd_header_t h
;
192 h
.packet
.cmd_type
= RADEON_CMD_PACKET
;
193 h
.packet
.packet_id
= id
;
197 static int cmdvec( int offset
, int stride
, int count
)
199 drm_radeon_cmd_header_t h
;
201 h
.vectors
.cmd_type
= RADEON_CMD_VECTORS
;
202 h
.vectors
.offset
= offset
;
203 h
.vectors
.stride
= stride
;
204 h
.vectors
.count
= count
;
208 /* warning: the count here is divided by 4 compared to other cmds
209 (so it doesn't exceed the char size)! */
210 static int cmdveclinear( int offset
, int count
)
212 drm_radeon_cmd_header_t h
;
214 h
.veclinear
.cmd_type
= RADEON_CMD_VECLINEAR
;
215 h
.veclinear
.addr_lo
= offset
& 0xff;
216 h
.veclinear
.addr_hi
= (offset
& 0xff00) >> 8;
217 h
.veclinear
.count
= count
;
221 static int cmdscl( int offset
, int stride
, int count
)
223 drm_radeon_cmd_header_t h
;
225 h
.scalars
.cmd_type
= RADEON_CMD_SCALARS
;
226 h
.scalars
.offset
= offset
;
227 h
.scalars
.stride
= stride
;
228 h
.scalars
.count
= count
;
232 static int cmdscl2( int offset
, int stride
, int count
)
234 drm_radeon_cmd_header_t h
;
236 h
.scalars
.cmd_type
= RADEON_CMD_SCALARS2
;
237 h
.scalars
.offset
= offset
- 0x100;
238 h
.scalars
.stride
= stride
;
239 h
.scalars
.count
= count
;
243 #define CHECK( NM, FLAG ) \
244 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom) \
246 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
248 return (FLAG) ? atom->cmd_size : 0; \
251 #define TCL_CHECK( NM, FLAG ) \
252 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom) \
254 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
255 return (!rmesa->radeon.TclFallback && !ctx->VertexProgram._Enabled && (FLAG)) ? atom->cmd_size : 0; \
258 #define TCL_OR_VP_CHECK( NM, FLAG ) \
259 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom ) \
261 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
262 return (!rmesa->radeon.TclFallback && (FLAG)) ? atom->cmd_size : 0; \
265 #define VP_CHECK( NM, FLAG ) \
266 static int check_##NM( GLcontext *ctx, struct radeon_state_atom *atom ) \
268 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
270 return (!rmesa->radeon.TclFallback && ctx->VertexProgram._Enabled && (FLAG)) ? atom->cmd_size : 0; \
273 CHECK( always
, GL_TRUE
)
274 CHECK( never
, GL_FALSE
)
275 CHECK( tex_any
, ctx
->Texture
._EnabledUnits
)
276 CHECK( tf
, (ctx
->Texture
._EnabledUnits
&& !ctx
->ATIFragmentShader
._Enabled
) );
277 CHECK( tex_pair
, (rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
| rmesa
->state
.texture
.unit
[atom
->idx
& ~1].unitneeded
) )
278 CHECK( tex
, rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
)
279 CHECK( pix_zero
, !ctx
->ATIFragmentShader
._Enabled
)
280 CHECK( texenv
, (rmesa
->state
.envneeded
& (1 << (atom
->idx
)) && !ctx
->ATIFragmentShader
._Enabled
) )
281 CHECK( afs_pass1
, (ctx
->ATIFragmentShader
._Enabled
&& (ctx
->ATIFragmentShader
.Current
->NumPasses
> 1)) )
282 CHECK( afs
, ctx
->ATIFragmentShader
._Enabled
)
283 CHECK( tex_cube
, rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
& TEXTURE_CUBE_BIT
)
284 TCL_CHECK( tcl_fog
, ctx
->Fog
.Enabled
)
285 TCL_CHECK( tcl
, GL_TRUE
)
286 TCL_CHECK( tcl_tex
, rmesa
->state
.texture
.unit
[atom
->idx
].unitneeded
)
287 TCL_CHECK( tcl_lighting
, ctx
->Light
.Enabled
)
288 TCL_CHECK( tcl_light
, ctx
->Light
.Enabled
&& ctx
->Light
.Light
[atom
->idx
].Enabled
)
289 TCL_OR_VP_CHECK( tcl_ucp
, (ctx
->Transform
.ClipPlanesEnabled
& (1 << (atom
->idx
))) )
290 TCL_OR_VP_CHECK( tcl_or_vp
, GL_TRUE
)
291 VP_CHECK( tcl_vp
, GL_TRUE
)
292 VP_CHECK( tcl_vp_size
, ctx
->VertexProgram
.Current
->Base
.NumNativeInstructions
> 64 )
293 VP_CHECK( tcl_vpp_size
, ctx
->VertexProgram
.Current
->Base
.NumNativeParameters
> 96 )
296 static void ctx_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
298 r200ContextPtr r200
= R200_CONTEXT(ctx
);
299 BATCH_LOCALS(&r200
->radeon
);
300 struct radeon_renderbuffer
*rrb
;
303 uint32_t dwords
= atom
->cmd_size
;
304 GLframebuffer
*fb
= r200
->radeon
.dri
.drawable
->driverPrivate
;
306 /* output the first 7 bytes of context */
307 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
308 OUT_BATCH_TABLE(atom
->cmd
, 5);
310 rrb
= r200
->radeon
.state
.depth
.rrb
;
312 OUT_BATCH(atom
->cmd
[CTX_RB3D_DEPTHOFFSET
]);
313 OUT_BATCH(atom
->cmd
[CTX_RB3D_DEPTHPITCH
]);
315 zbpitch
= (rrb
->pitch
/ rrb
->cpp
);
316 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
320 OUT_BATCH(atom
->cmd
[CTX_RB3D_ZSTENCILCNTL
]);
321 OUT_BATCH(atom
->cmd
[CTX_CMD_1
]);
322 OUT_BATCH(atom
->cmd
[CTX_PP_CNTL
]);
323 OUT_BATCH(atom
->cmd
[CTX_RB3D_CNTL
]);
325 rrb
= r200
->radeon
.state
.color
.rrb
;
326 if (r200
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
) {
327 rrb
= (struct radeon_renderbuffer
*)fb
->Attachment
[BUFFER_BACK_LEFT
].Renderbuffer
;
329 if (!rrb
|| !rrb
->bo
) {
330 OUT_BATCH(atom
->cmd
[CTX_RB3D_COLOROFFSET
]);
332 OUT_BATCH_RELOC(0, rrb
->bo
, 0, 0, RADEON_GEM_DOMAIN_VRAM
, 0);
335 OUT_BATCH(atom
->cmd
[CTX_CMD_2
]);
337 if (!rrb
|| !rrb
->bo
) {
338 OUT_BATCH(atom
->cmd
[CTX_RB3D_COLORPITCH
]);
340 cbpitch
= (rrb
->pitch
/ rrb
->cpp
);
345 if (r200
->radeon
.sarea
->tiling_enabled
)
346 cbpitch
|= R200_COLOR_TILE_ENABLE
;
350 if (atom
->cmd_size
== CTX_STATE_SIZE_NEWDRM
)
351 OUT_BATCH_TABLE((atom
->cmd
+ 14), 4);
357 static void tex_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
359 r200ContextPtr r200
= R200_CONTEXT(ctx
);
360 BATCH_LOCALS(&r200
->radeon
);
361 uint32_t dwords
= atom
->cmd_size
;
363 radeonTexObj
*t
= r200
->state
.texture
.unit
[i
].texobj
;
365 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
366 OUT_BATCH_TABLE(atom
->cmd
, 10);
367 if (t
&& !t
->image_override
) {
368 OUT_BATCH_RELOC(t
->tile_bits
, t
->mt
->bo
, 0,
369 RADEON_GEM_DOMAIN_VRAM
, 0, 0);
372 OUT_BATCH(atom
->cmd
[10]);
378 static void cube_emit(GLcontext
*ctx
, struct radeon_state_atom
*atom
)
380 r200ContextPtr r200
= R200_CONTEXT(ctx
);
381 BATCH_LOCALS(&r200
->radeon
);
382 uint32_t dwords
= atom
->cmd_size
;
384 radeonTexObj
*t
= r200
->state
.texture
.unit
[i
].texobj
;
387 BEGIN_BATCH_NO_AUTOSTATE(dwords
);
388 OUT_BATCH_TABLE(atom
->cmd
, 3);
390 fprintf(stderr
,"total size is %d\n", t
->mt
->totalsize
);
391 if (t
&& !t
->image_override
) {
392 size
= t
->mt
->totalsize
/ 6;
393 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
394 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 2, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
395 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 3, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
396 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 4, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
397 OUT_BATCH_RELOC(0, t
->mt
->bo
, size
* 5, RADEON_GEM_DOMAIN_VRAM
, 0, 0);
402 /* Initialize the context's hardware state.
404 void r200InitState( r200ContextPtr rmesa
)
406 GLcontext
*ctx
= rmesa
->radeon
.glCtx
;
407 GLuint color_fmt
, depth_fmt
, i
;
408 GLint drawPitch
, drawOffset
;
410 switch ( rmesa
->radeon
.radeonScreen
->cpp
) {
412 color_fmt
= R200_COLOR_FORMAT_RGB565
;
415 color_fmt
= R200_COLOR_FORMAT_ARGB8888
;
418 fprintf( stderr
, "Error: Unsupported pixel depth... exiting\n" );
422 rmesa
->radeon
.state
.color
.clear
= 0x00000000;
424 switch ( ctx
->Visual
.depthBits
) {
426 rmesa
->radeon
.state
.depth
.clear
= 0x0000ffff;
427 rmesa
->radeon
.state
.depth
.scale
= 1.0 / (GLfloat
)0xffff;
428 depth_fmt
= R200_DEPTH_FORMAT_16BIT_INT_Z
;
429 rmesa
->radeon
.state
.stencil
.clear
= 0x00000000;
432 rmesa
->radeon
.state
.depth
.clear
= 0x00ffffff;
433 rmesa
->radeon
.state
.depth
.scale
= 1.0 / (GLfloat
)0xffffff;
434 depth_fmt
= R200_DEPTH_FORMAT_24BIT_INT_Z
;
435 rmesa
->radeon
.state
.stencil
.clear
= 0xffff0000;
438 fprintf( stderr
, "Error: Unsupported depth %d... exiting\n",
439 ctx
->Visual
.depthBits
);
443 /* Only have hw stencil when depth buffer is 24 bits deep */
444 rmesa
->radeon
.state
.stencil
.hwBuffer
= ( ctx
->Visual
.stencilBits
> 0 &&
445 ctx
->Visual
.depthBits
== 24 );
447 rmesa
->radeon
.Fallback
= 0;
449 if ( ctx
->Visual
.doubleBufferMode
&& rmesa
->radeon
.sarea
->pfCurrentPage
== 0 ) {
450 drawOffset
= rmesa
->radeon
.radeonScreen
->backOffset
;
451 drawPitch
= rmesa
->radeon
.radeonScreen
->backPitch
;
453 drawOffset
= rmesa
->radeon
.radeonScreen
->frontOffset
;
454 drawPitch
= rmesa
->radeon
.radeonScreen
->frontPitch
;
457 if ( ctx
->Visual
.doubleBufferMode
&& rmesa
->sarea
->pfCurrentPage
== 0 ) {
458 rmesa
->radeon
.state
.color
.drawOffset
= rmesa
->radeon
.radeonScreen
->backOffset
;
459 rmesa
->radeon
.state
.color
.drawPitch
= rmesa
->radeon
.radeonScreen
->backPitch
;
461 rmesa
->radeon
.state
.color
.drawOffset
= rmesa
->radeon
.radeonScreen
->frontOffset
;
462 rmesa
->radeon
.state
.color
.drawPitch
= rmesa
->radeon
.radeonScreen
->frontPitch
;
465 rmesa
->state
.pixel
.readOffset
= rmesa
->radeon
.state
.color
.drawOffset
;
466 rmesa
->state
.pixel
.readPitch
= rmesa
->radeon
.state
.color
.drawPitch
;
469 rmesa
->hw
.max_state_size
= 0;
471 #define ALLOC_STATE( ATOM, CHK, SZ, NM, IDX ) \
473 rmesa->hw.ATOM.cmd_size = SZ; \
474 rmesa->hw.ATOM.cmd = (GLuint *)CALLOC(SZ * sizeof(int)); \
475 rmesa->hw.ATOM.lastcmd = (GLuint *)CALLOC(SZ * sizeof(int)); \
476 rmesa->hw.ATOM.name = NM; \
477 rmesa->hw.ATOM.idx = IDX; \
478 rmesa->hw.ATOM.check = check_##CHK; \
479 rmesa->hw.ATOM.dirty = GL_FALSE; \
480 rmesa->hw.max_state_size += SZ * sizeof(int); \
484 /* Allocate state buffers:
486 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
)
487 ALLOC_STATE( ctx
, always
, CTX_STATE_SIZE_NEWDRM
, "CTX/context", 0 );
489 ALLOC_STATE( ctx
, always
, CTX_STATE_SIZE_OLDDRM
, "CTX/context", 0 );
491 rmesa
->hw
.ctx
.emit
= ctx_emit
;
492 ALLOC_STATE( set
, always
, SET_STATE_SIZE
, "SET/setup", 0 );
493 ALLOC_STATE( lin
, always
, LIN_STATE_SIZE
, "LIN/line", 0 );
494 ALLOC_STATE( msk
, always
, MSK_STATE_SIZE
, "MSK/mask", 0 );
495 ALLOC_STATE( vpt
, always
, VPT_STATE_SIZE
, "VPT/viewport", 0 );
496 ALLOC_STATE( vtx
, always
, VTX_STATE_SIZE
, "VTX/vertex", 0 );
497 ALLOC_STATE( vap
, always
, VAP_STATE_SIZE
, "VAP/vap", 0 );
498 ALLOC_STATE( vte
, always
, VTE_STATE_SIZE
, "VTE/vte", 0 );
499 ALLOC_STATE( msc
, always
, MSC_STATE_SIZE
, "MSC/misc", 0 );
500 ALLOC_STATE( cst
, always
, CST_STATE_SIZE
, "CST/constant", 0 );
501 ALLOC_STATE( zbs
, always
, ZBS_STATE_SIZE
, "ZBS/zbias", 0 );
502 ALLOC_STATE( tf
, tf
, TF_STATE_SIZE
, "TF/tfactor", 0 );
503 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
504 if (rmesa
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R200
) {
505 /* make sure texture units 0/1 are emitted pair-wise for r200 t0 hang workaround */
506 ALLOC_STATE( tex
[0], tex_pair
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-0", 0 );
507 ALLOC_STATE( tex
[1], tex_pair
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-1", 1 );
508 ALLOC_STATE( tam
, tex_any
, TAM_STATE_SIZE
, "TAM/tam", 0 );
511 ALLOC_STATE( tex
[0], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-0", 0 );
512 ALLOC_STATE( tex
[1], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-1", 1 );
513 ALLOC_STATE( tam
, never
, TAM_STATE_SIZE
, "TAM/tam", 0 );
515 ALLOC_STATE( tex
[2], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-2", 2 );
516 ALLOC_STATE( tex
[3], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-3", 3 );
517 ALLOC_STATE( tex
[4], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-4", 4 );
518 ALLOC_STATE( tex
[5], tex
, TEX_STATE_SIZE_NEWDRM
, "TEX/tex-5", 5 );
519 ALLOC_STATE( atf
, afs
, ATF_STATE_SIZE
, "ATF/tfactor", 0 );
520 ALLOC_STATE( afs
[0], afs_pass1
, AFS_STATE_SIZE
, "AFS/afsinst-0", 0 );
521 ALLOC_STATE( afs
[1], afs
, AFS_STATE_SIZE
, "AFS/afsinst-1", 1 );
524 if (rmesa
->radeon
.radeonScreen
->chip_family
== CHIP_FAMILY_R200
) {
525 ALLOC_STATE( tex
[0], tex_pair
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-0", 0 );
526 ALLOC_STATE( tex
[1], tex_pair
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-1", 1 );
527 ALLOC_STATE( tam
, tex_any
, TAM_STATE_SIZE
, "TAM/tam", 0 );
530 ALLOC_STATE( tex
[0], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-0", 0 );
531 ALLOC_STATE( tex
[1], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-1", 1 );
532 ALLOC_STATE( tam
, never
, TAM_STATE_SIZE
, "TAM/tam", 0 );
534 ALLOC_STATE( tex
[2], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-2", 2 );
535 ALLOC_STATE( tex
[3], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-3", 3 );
536 ALLOC_STATE( tex
[4], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-4", 4 );
537 ALLOC_STATE( tex
[5], tex
, TEX_STATE_SIZE_OLDDRM
, "TEX/tex-5", 5 );
538 ALLOC_STATE( atf
, never
, ATF_STATE_SIZE
, "TF/tfactor", 0 );
539 ALLOC_STATE( afs
[0], never
, AFS_STATE_SIZE
, "AFS/afsinst-0", 0 );
540 ALLOC_STATE( afs
[1], never
, AFS_STATE_SIZE
, "AFS/afsinst-1", 1 );
543 for (i
= 0; i
< 5; i
++)
544 rmesa
->hw
.tex
[i
].emit
= tex_emit
;
545 if (rmesa
->radeon
.radeonScreen
->drmSupportsCubeMapsR200
) {
546 ALLOC_STATE( cube
[0], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-0", 0 );
547 ALLOC_STATE( cube
[1], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-1", 1 );
548 ALLOC_STATE( cube
[2], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-2", 2 );
549 ALLOC_STATE( cube
[3], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-3", 3 );
550 ALLOC_STATE( cube
[4], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-4", 4 );
551 ALLOC_STATE( cube
[5], tex_cube
, CUBE_STATE_SIZE
, "CUBE/tex-5", 5 );
552 for (i
= 0; i
< 5; i
++)
553 rmesa
->hw
.cube
[i
].emit
= cube_emit
;
556 ALLOC_STATE( cube
[0], never
, CUBE_STATE_SIZE
, "CUBE/tex-0", 0 );
557 ALLOC_STATE( cube
[1], never
, CUBE_STATE_SIZE
, "CUBE/tex-1", 1 );
558 ALLOC_STATE( cube
[2], never
, CUBE_STATE_SIZE
, "CUBE/tex-2", 2 );
559 ALLOC_STATE( cube
[3], never
, CUBE_STATE_SIZE
, "CUBE/tex-3", 3 );
560 ALLOC_STATE( cube
[4], never
, CUBE_STATE_SIZE
, "CUBE/tex-4", 4 );
561 ALLOC_STATE( cube
[5], never
, CUBE_STATE_SIZE
, "CUBE/tex-5", 5 );
564 if (rmesa
->radeon
.radeonScreen
->drmSupportsVertexProgram
) {
565 ALLOC_STATE( pvs
, tcl_vp
, PVS_STATE_SIZE
, "PVS/pvscntl", 0 );
566 ALLOC_STATE( vpi
[0], tcl_vp
, VPI_STATE_SIZE
, "VP/vertexprog-0", 0 );
567 ALLOC_STATE( vpi
[1], tcl_vp_size
, VPI_STATE_SIZE
, "VP/vertexprog-1", 1 );
568 ALLOC_STATE( vpp
[0], tcl_vp
, VPP_STATE_SIZE
, "VPP/vertexparam-0", 0 );
569 ALLOC_STATE( vpp
[1], tcl_vpp_size
, VPP_STATE_SIZE
, "VPP/vertexparam-1", 1 );
572 ALLOC_STATE( pvs
, never
, PVS_STATE_SIZE
, "PVS/pvscntl", 0 );
573 ALLOC_STATE( vpi
[0], never
, VPI_STATE_SIZE
, "VP/vertexprog-0", 0 );
574 ALLOC_STATE( vpi
[1], never
, VPI_STATE_SIZE
, "VP/vertexprog-1", 1 );
575 ALLOC_STATE( vpp
[0], never
, VPP_STATE_SIZE
, "VPP/vertexparam-0", 0 );
576 ALLOC_STATE( vpp
[1], never
, VPP_STATE_SIZE
, "VPP/vertexparam-1", 1 );
578 /* FIXME: this atom has two commands, we need only one (ucp_vert_blend) for vp */
579 ALLOC_STATE( tcl
, tcl_or_vp
, TCL_STATE_SIZE
, "TCL/tcl", 0 );
580 ALLOC_STATE( msl
, tcl
, MSL_STATE_SIZE
, "MSL/matrix-select", 0 );
581 ALLOC_STATE( tcg
, tcl
, TCG_STATE_SIZE
, "TCG/texcoordgen", 0 );
582 ALLOC_STATE( mtl
[0], tcl_lighting
, MTL_STATE_SIZE
, "MTL0/material0", 0 );
583 ALLOC_STATE( mtl
[1], tcl_lighting
, MTL_STATE_SIZE
, "MTL1/material1", 1 );
584 ALLOC_STATE( grd
, tcl_or_vp
, GRD_STATE_SIZE
, "GRD/guard-band", 0 );
585 ALLOC_STATE( fog
, tcl_fog
, FOG_STATE_SIZE
, "FOG/fog", 0 );
586 ALLOC_STATE( glt
, tcl_lighting
, GLT_STATE_SIZE
, "GLT/light-global", 0 );
587 ALLOC_STATE( eye
, tcl_lighting
, EYE_STATE_SIZE
, "EYE/eye-vector", 0 );
588 ALLOC_STATE( mat
[R200_MTX_MV
], tcl
, MAT_STATE_SIZE
, "MAT/modelview", 0 );
589 ALLOC_STATE( mat
[R200_MTX_IMV
], tcl
, MAT_STATE_SIZE
, "MAT/it-modelview", 0 );
590 ALLOC_STATE( mat
[R200_MTX_MVP
], tcl
, MAT_STATE_SIZE
, "MAT/modelproject", 0 );
591 ALLOC_STATE( mat
[R200_MTX_TEX0
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat0", 0 );
592 ALLOC_STATE( mat
[R200_MTX_TEX1
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat1", 1 );
593 ALLOC_STATE( mat
[R200_MTX_TEX2
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat2", 2 );
594 ALLOC_STATE( mat
[R200_MTX_TEX3
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat3", 3 );
595 ALLOC_STATE( mat
[R200_MTX_TEX4
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat4", 4 );
596 ALLOC_STATE( mat
[R200_MTX_TEX5
], tcl_tex
, MAT_STATE_SIZE
, "MAT/texmat5", 5 );
597 ALLOC_STATE( ucp
[0], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-0", 0 );
598 ALLOC_STATE( ucp
[1], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-1", 1 );
599 ALLOC_STATE( ucp
[2], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-2", 2 );
600 ALLOC_STATE( ucp
[3], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-3", 3 );
601 ALLOC_STATE( ucp
[4], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-4", 4 );
602 ALLOC_STATE( ucp
[5], tcl_ucp
, UCP_STATE_SIZE
, "UCP/userclip-5", 5 );
603 ALLOC_STATE( lit
[0], tcl_light
, LIT_STATE_SIZE
, "LIT/light-0", 0 );
604 ALLOC_STATE( lit
[1], tcl_light
, LIT_STATE_SIZE
, "LIT/light-1", 1 );
605 ALLOC_STATE( lit
[2], tcl_light
, LIT_STATE_SIZE
, "LIT/light-2", 2 );
606 ALLOC_STATE( lit
[3], tcl_light
, LIT_STATE_SIZE
, "LIT/light-3", 3 );
607 ALLOC_STATE( lit
[4], tcl_light
, LIT_STATE_SIZE
, "LIT/light-4", 4 );
608 ALLOC_STATE( lit
[5], tcl_light
, LIT_STATE_SIZE
, "LIT/light-5", 5 );
609 ALLOC_STATE( lit
[6], tcl_light
, LIT_STATE_SIZE
, "LIT/light-6", 6 );
610 ALLOC_STATE( lit
[7], tcl_light
, LIT_STATE_SIZE
, "LIT/light-7", 7 );
611 ALLOC_STATE( pix
[0], pix_zero
, PIX_STATE_SIZE
, "PIX/pixstage-0", 0 );
612 ALLOC_STATE( pix
[1], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-1", 1 );
613 ALLOC_STATE( pix
[2], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-2", 2 );
614 ALLOC_STATE( pix
[3], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-3", 3 );
615 ALLOC_STATE( pix
[4], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-4", 4 );
616 ALLOC_STATE( pix
[5], texenv
, PIX_STATE_SIZE
, "PIX/pixstage-5", 5 );
617 if (rmesa
->radeon
.radeonScreen
->drmSupportsTriPerf
) {
618 ALLOC_STATE( prf
, always
, PRF_STATE_SIZE
, "PRF/performance-tri", 0 );
621 ALLOC_STATE( prf
, never
, PRF_STATE_SIZE
, "PRF/performance-tri", 0 );
623 if (rmesa
->radeon
.radeonScreen
->drmSupportsPointSprites
) {
624 ALLOC_STATE( spr
, always
, SPR_STATE_SIZE
, "SPR/pointsprite", 0 );
625 ALLOC_STATE( ptp
, tcl
, PTP_STATE_SIZE
, "PTP/pointparams", 0 );
628 ALLOC_STATE (spr
, never
, SPR_STATE_SIZE
, "SPR/pointsprite", 0 );
629 ALLOC_STATE (ptp
, never
, PTP_STATE_SIZE
, "PTP/pointparams", 0 );
632 r200SetUpAtomList( rmesa
);
634 /* Fill in the packet headers:
636 rmesa
->hw
.ctx
.cmd
[CTX_CMD_0
] = cmdpkt(RADEON_EMIT_PP_MISC
);
637 rmesa
->hw
.ctx
.cmd
[CTX_CMD_1
] = cmdpkt(RADEON_EMIT_PP_CNTL
);
638 rmesa
->hw
.ctx
.cmd
[CTX_CMD_2
] = cmdpkt(RADEON_EMIT_RB3D_COLORPITCH
);
639 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
)
640 rmesa
->hw
.ctx
.cmd
[CTX_CMD_3
] = cmdpkt(R200_EMIT_RB3D_BLENDCOLOR
);
641 rmesa
->hw
.lin
.cmd
[LIN_CMD_0
] = cmdpkt(RADEON_EMIT_RE_LINE_PATTERN
);
642 rmesa
->hw
.lin
.cmd
[LIN_CMD_1
] = cmdpkt(RADEON_EMIT_SE_LINE_WIDTH
);
643 rmesa
->hw
.msk
.cmd
[MSK_CMD_0
] = cmdpkt(RADEON_EMIT_RB3D_STENCILREFMASK
);
644 rmesa
->hw
.vpt
.cmd
[VPT_CMD_0
] = cmdpkt(RADEON_EMIT_SE_VPORT_XSCALE
);
645 rmesa
->hw
.set
.cmd
[SET_CMD_0
] = cmdpkt(RADEON_EMIT_SE_CNTL
);
646 rmesa
->hw
.msc
.cmd
[MSC_CMD_0
] = cmdpkt(RADEON_EMIT_RE_MISC
);
647 rmesa
->hw
.cst
.cmd
[CST_CMD_0
] = cmdpkt(R200_EMIT_PP_CNTL_X
);
648 rmesa
->hw
.cst
.cmd
[CST_CMD_1
] = cmdpkt(R200_EMIT_RB3D_DEPTHXY_OFFSET
);
649 rmesa
->hw
.cst
.cmd
[CST_CMD_2
] = cmdpkt(R200_EMIT_RE_AUX_SCISSOR_CNTL
);
650 rmesa
->hw
.cst
.cmd
[CST_CMD_3
] = cmdpkt(R200_EMIT_RE_SCISSOR_TL_0
);
651 rmesa
->hw
.cst
.cmd
[CST_CMD_4
] = cmdpkt(R200_EMIT_SE_VAP_CNTL_STATUS
);
652 rmesa
->hw
.cst
.cmd
[CST_CMD_5
] = cmdpkt(R200_EMIT_RE_POINTSIZE
);
653 rmesa
->hw
.cst
.cmd
[CST_CMD_6
] = cmdpkt(R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0
);
654 rmesa
->hw
.tam
.cmd
[TAM_CMD_0
] = cmdpkt(R200_EMIT_PP_TAM_DEBUG3
);
655 rmesa
->hw
.tf
.cmd
[TF_CMD_0
] = cmdpkt(R200_EMIT_TFACTOR_0
);
656 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
657 rmesa
->hw
.atf
.cmd
[ATF_CMD_0
] = cmdpkt(R200_EMIT_ATF_TFACTOR
);
658 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCTLALL_0
);
659 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_0
);
660 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCTLALL_1
);
661 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_1
);
662 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCTLALL_2
);
663 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_2
);
664 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCTLALL_3
);
665 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_3
);
666 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCTLALL_4
);
667 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_4
);
668 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCTLALL_5
);
669 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_1_NEWDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_5
);
671 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXFILTER_0
);
672 rmesa
->hw
.tex
[0].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_0
);
673 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXFILTER_1
);
674 rmesa
->hw
.tex
[1].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_1
);
675 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXFILTER_2
);
676 rmesa
->hw
.tex
[2].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_2
);
677 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXFILTER_3
);
678 rmesa
->hw
.tex
[3].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_3
);
679 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXFILTER_4
);
680 rmesa
->hw
.tex
[4].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_4
);
681 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXFILTER_5
);
682 rmesa
->hw
.tex
[5].cmd
[TEX_CMD_1_OLDDRM
] = cmdpkt(R200_EMIT_PP_TXOFFSET_5
);
684 rmesa
->hw
.afs
[0].cmd
[AFS_CMD_0
] = cmdpkt(R200_EMIT_PP_AFS_0
);
685 rmesa
->hw
.afs
[1].cmd
[AFS_CMD_0
] = cmdpkt(R200_EMIT_PP_AFS_1
);
686 rmesa
->hw
.pvs
.cmd
[PVS_CMD_0
] = cmdpkt(R200_EMIT_VAP_PVS_CNTL
);
687 rmesa
->hw
.cube
[0].cmd
[CUBE_CMD_0
] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_0
);
688 rmesa
->hw
.cube
[0].cmd
[CUBE_CMD_1
] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_0
);
689 rmesa
->hw
.cube
[1].cmd
[CUBE_CMD_0
] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_1
);
690 rmesa
->hw
.cube
[1].cmd
[CUBE_CMD_1
] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_1
);
691 rmesa
->hw
.cube
[2].cmd
[CUBE_CMD_0
] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_2
);
692 rmesa
->hw
.cube
[2].cmd
[CUBE_CMD_1
] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_2
);
693 rmesa
->hw
.cube
[3].cmd
[CUBE_CMD_0
] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_3
);
694 rmesa
->hw
.cube
[3].cmd
[CUBE_CMD_1
] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_3
);
695 rmesa
->hw
.cube
[4].cmd
[CUBE_CMD_0
] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_4
);
696 rmesa
->hw
.cube
[4].cmd
[CUBE_CMD_1
] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_4
);
697 rmesa
->hw
.cube
[5].cmd
[CUBE_CMD_0
] = cmdpkt(R200_EMIT_PP_CUBIC_FACES_5
);
698 rmesa
->hw
.cube
[5].cmd
[CUBE_CMD_1
] = cmdpkt(R200_EMIT_PP_CUBIC_OFFSETS_5
);
699 rmesa
->hw
.pix
[0].cmd
[PIX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCBLEND_0
);
700 rmesa
->hw
.pix
[1].cmd
[PIX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCBLEND_1
);
701 rmesa
->hw
.pix
[2].cmd
[PIX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCBLEND_2
);
702 rmesa
->hw
.pix
[3].cmd
[PIX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCBLEND_3
);
703 rmesa
->hw
.pix
[4].cmd
[PIX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCBLEND_4
);
704 rmesa
->hw
.pix
[5].cmd
[PIX_CMD_0
] = cmdpkt(R200_EMIT_PP_TXCBLEND_5
);
705 rmesa
->hw
.zbs
.cmd
[ZBS_CMD_0
] = cmdpkt(RADEON_EMIT_SE_ZBIAS_FACTOR
);
706 rmesa
->hw
.tcl
.cmd
[TCL_CMD_0
] = cmdpkt(R200_EMIT_TCL_LIGHT_MODEL_CTL_0
);
707 rmesa
->hw
.tcl
.cmd
[TCL_CMD_1
] = cmdpkt(R200_EMIT_TCL_UCP_VERT_BLEND_CTL
);
708 rmesa
->hw
.tcg
.cmd
[TCG_CMD_0
] = cmdpkt(R200_EMIT_TEX_PROC_CTL_2
);
709 rmesa
->hw
.msl
.cmd
[MSL_CMD_0
] = cmdpkt(R200_EMIT_MATRIX_SELECT_0
);
710 rmesa
->hw
.vap
.cmd
[VAP_CMD_0
] = cmdpkt(R200_EMIT_VAP_CTL
);
711 rmesa
->hw
.vtx
.cmd
[VTX_CMD_0
] = cmdpkt(R200_EMIT_VTX_FMT_0
);
712 rmesa
->hw
.vtx
.cmd
[VTX_CMD_1
] = cmdpkt(R200_EMIT_OUTPUT_VTX_COMP_SEL
);
713 rmesa
->hw
.vtx
.cmd
[VTX_CMD_2
] = cmdpkt(R200_EMIT_SE_VTX_STATE_CNTL
);
714 rmesa
->hw
.vte
.cmd
[VTE_CMD_0
] = cmdpkt(R200_EMIT_VTE_CNTL
);
715 rmesa
->hw
.prf
.cmd
[PRF_CMD_0
] = cmdpkt(R200_EMIT_PP_TRI_PERF_CNTL
);
716 rmesa
->hw
.spr
.cmd
[SPR_CMD_0
] = cmdpkt(R200_EMIT_TCL_POINT_SPRITE_CNTL
);
717 rmesa
->hw
.mtl
[0].cmd
[MTL_CMD_0
] =
718 cmdvec( R200_VS_MAT_0_EMISS
, 1, 16 );
719 rmesa
->hw
.mtl
[0].cmd
[MTL_CMD_1
] =
720 cmdscl2( R200_SS_MAT_0_SHININESS
, 1, 1 );
721 rmesa
->hw
.mtl
[1].cmd
[MTL_CMD_0
] =
722 cmdvec( R200_VS_MAT_1_EMISS
, 1, 16 );
723 rmesa
->hw
.mtl
[1].cmd
[MTL_CMD_1
] =
724 cmdscl2( R200_SS_MAT_1_SHININESS
, 1, 1 );
726 rmesa
->hw
.vpi
[0].cmd
[VPI_CMD_0
] =
727 cmdveclinear( R200_PVS_PROG0
, 64 );
728 rmesa
->hw
.vpi
[1].cmd
[VPI_CMD_0
] =
729 cmdveclinear( R200_PVS_PROG1
, 64 );
730 rmesa
->hw
.vpp
[0].cmd
[VPP_CMD_0
] =
731 cmdveclinear( R200_PVS_PARAM0
, 96 );
732 rmesa
->hw
.vpp
[1].cmd
[VPP_CMD_0
] =
733 cmdveclinear( R200_PVS_PARAM1
, 96 );
735 rmesa
->hw
.grd
.cmd
[GRD_CMD_0
] =
736 cmdscl( R200_SS_VERT_GUARD_CLIP_ADJ_ADDR
, 1, 4 );
737 rmesa
->hw
.fog
.cmd
[FOG_CMD_0
] =
738 cmdvec( R200_VS_FOG_PARAM_ADDR
, 1, 4 );
739 rmesa
->hw
.glt
.cmd
[GLT_CMD_0
] =
740 cmdvec( R200_VS_GLOBAL_AMBIENT_ADDR
, 1, 4 );
741 rmesa
->hw
.eye
.cmd
[EYE_CMD_0
] =
742 cmdvec( R200_VS_EYE_VECTOR_ADDR
, 1, 4 );
744 rmesa
->hw
.mat
[R200_MTX_MV
].cmd
[MAT_CMD_0
] =
745 cmdvec( R200_VS_MATRIX_0_MV
, 1, 16);
746 rmesa
->hw
.mat
[R200_MTX_IMV
].cmd
[MAT_CMD_0
] =
747 cmdvec( R200_VS_MATRIX_1_INV_MV
, 1, 16);
748 rmesa
->hw
.mat
[R200_MTX_MVP
].cmd
[MAT_CMD_0
] =
749 cmdvec( R200_VS_MATRIX_2_MVP
, 1, 16);
750 rmesa
->hw
.mat
[R200_MTX_TEX0
].cmd
[MAT_CMD_0
] =
751 cmdvec( R200_VS_MATRIX_3_TEX0
, 1, 16);
752 rmesa
->hw
.mat
[R200_MTX_TEX1
].cmd
[MAT_CMD_0
] =
753 cmdvec( R200_VS_MATRIX_4_TEX1
, 1, 16);
754 rmesa
->hw
.mat
[R200_MTX_TEX2
].cmd
[MAT_CMD_0
] =
755 cmdvec( R200_VS_MATRIX_5_TEX2
, 1, 16);
756 rmesa
->hw
.mat
[R200_MTX_TEX3
].cmd
[MAT_CMD_0
] =
757 cmdvec( R200_VS_MATRIX_6_TEX3
, 1, 16);
758 rmesa
->hw
.mat
[R200_MTX_TEX4
].cmd
[MAT_CMD_0
] =
759 cmdvec( R200_VS_MATRIX_7_TEX4
, 1, 16);
760 rmesa
->hw
.mat
[R200_MTX_TEX5
].cmd
[MAT_CMD_0
] =
761 cmdvec( R200_VS_MATRIX_8_TEX5
, 1, 16);
763 for (i
= 0 ; i
< 8; i
++) {
764 rmesa
->hw
.lit
[i
].cmd
[LIT_CMD_0
] =
765 cmdvec( R200_VS_LIGHT_AMBIENT_ADDR
+ i
, 8, 24 );
766 rmesa
->hw
.lit
[i
].cmd
[LIT_CMD_1
] =
767 cmdscl( R200_SS_LIGHT_DCD_ADDR
+ i
, 8, 7 );
770 for (i
= 0 ; i
< 6; i
++) {
771 rmesa
->hw
.ucp
[i
].cmd
[UCP_CMD_0
] =
772 cmdvec( R200_VS_UCP_ADDR
+ i
, 1, 4 );
775 rmesa
->hw
.ptp
.cmd
[PTP_CMD_0
] =
776 cmdvec( R200_VS_PNT_SPRITE_VPORT_SCALE
, 1, 4 );
777 rmesa
->hw
.ptp
.cmd
[PTP_CMD_1
] =
778 cmdvec( R200_VS_PNT_SPRITE_ATT_CONST
, 1, 12 );
780 /* Initial Harware state:
782 rmesa
->hw
.ctx
.cmd
[CTX_PP_MISC
] = (R200_ALPHA_TEST_PASS
783 /* | R200_RIGHT_HAND_CUBE_OGL*/);
785 rmesa
->hw
.ctx
.cmd
[CTX_PP_FOG_COLOR
] = (R200_FOG_VERTEX
|
786 R200_FOG_USE_SPEC_ALPHA
);
788 rmesa
->hw
.ctx
.cmd
[CTX_RE_SOLID_COLOR
] = 0x00000000;
790 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
791 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
792 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
794 if (rmesa
->radeon
.radeonScreen
->drmSupportsBlendColor
) {
795 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_BLENDCOLOR
] = 0x00000000;
796 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ABLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
797 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
798 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
799 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CBLENDCNTL
] = (R200_COMB_FCN_ADD_CLAMP
|
800 (R200_BLEND_GL_ONE
<< R200_SRC_BLEND_SHIFT
) |
801 (R200_BLEND_GL_ZERO
<< R200_DST_BLEND_SHIFT
));
804 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHOFFSET
] =
805 rmesa
->radeon
.radeonScreen
->depthOffset
+ rmesa
->radeon
.radeonScreen
->fbLocation
;
807 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHPITCH
] =
808 ((rmesa
->radeon
.radeonScreen
->depthPitch
&
809 R200_DEPTHPITCH_MASK
) |
810 R200_DEPTH_ENDIAN_NO_SWAP
);
812 if (rmesa
->using_hyperz
)
813 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_DEPTHPITCH
] |= R200_DEPTH_HYPERZ
;
815 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] = (depth_fmt
|
817 R200_STENCIL_TEST_ALWAYS
|
818 R200_STENCIL_FAIL_KEEP
|
819 R200_STENCIL_ZPASS_KEEP
|
820 R200_STENCIL_ZFAIL_KEEP
|
821 R200_Z_WRITE_ENABLE
);
823 if (rmesa
->using_hyperz
) {
824 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_ZSTENCILCNTL
] |= R200_Z_COMPRESSION_ENABLE
|
825 R200_Z_DECOMPRESSION_ENABLE
;
826 /* if (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R200)
827 rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_HIERARCHY_ENABLE;*/
830 rmesa
->hw
.ctx
.cmd
[CTX_PP_CNTL
] = (R200_ANTI_ALIAS_NONE
831 | R200_TEX_BLEND_0_ENABLE
);
833 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] = color_fmt
;
834 switch ( driQueryOptioni( &rmesa
->radeon
.optionCache
, "dither_mode" ) ) {
835 case DRI_CONF_DITHER_XERRORDIFFRESET
:
836 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_DITHER_INIT
;
838 case DRI_CONF_DITHER_ORDERED
:
839 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_SCALE_DITHER_ENABLE
;
842 if ( driQueryOptioni( &rmesa
->radeon
.optionCache
, "round_mode" ) ==
843 DRI_CONF_ROUND_ROUND
)
844 rmesa
->radeon
.state
.color
.roundEnable
= R200_ROUND_ENABLE
;
846 rmesa
->radeon
.state
.color
.roundEnable
= 0;
847 if ( driQueryOptioni (&rmesa
->radeon
.optionCache
, "color_reduction" ) ==
848 DRI_CONF_COLOR_REDUCTION_DITHER
)
849 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= R200_DITHER_ENABLE
;
851 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_CNTL
] |= rmesa
->radeon
.state
.color
.roundEnable
;
854 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_COLOROFFSET
] = ((rmesa
->radeon
.state
.color
.drawOffset
+
855 rmesa
->radeon
.radeonScreen
->fbLocation
)
856 & R200_COLOROFFSET_MASK
);
858 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_COLORPITCH
] = ((rmesa
->radeon
.state
.color
.drawPitch
&
859 R200_COLORPITCH_MASK
) |
860 R200_COLOR_ENDIAN_NO_SWAP
);
862 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_COLOROFFSET
] = ((drawOffset
+
863 rmesa
->radeon
.radeonScreen
->fbLocation
)
864 & R200_COLOROFFSET_MASK
);
866 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_COLORPITCH
] = ((drawPitch
&
867 R200_COLORPITCH_MASK
) |
868 R200_COLOR_ENDIAN_NO_SWAP
);
870 /* (fixed size) sarea is initialized to zero afaics so can omit version check. Phew! */
871 if (rmesa
->radeon
.sarea
->tiling_enabled
) {
872 rmesa
->hw
.ctx
.cmd
[CTX_RB3D_COLORPITCH
] |= R200_COLOR_TILE_ENABLE
;
875 rmesa
->hw
.prf
.cmd
[PRF_PP_TRI_PERF
] = R200_TRI_CUTOFF_MASK
- R200_TRI_CUTOFF_MASK
*
876 driQueryOptionf (&rmesa
->radeon
.optionCache
,"texture_blend_quality");
877 rmesa
->hw
.prf
.cmd
[PRF_PP_PERF_CNTL
] = 0;
879 rmesa
->hw
.set
.cmd
[SET_SE_CNTL
] = (R200_FFACE_CULL_CCW
|
882 R200_FLAT_SHADE_VTX_LAST
|
883 R200_DIFFUSE_SHADE_GOURAUD
|
884 R200_ALPHA_SHADE_GOURAUD
|
885 R200_SPECULAR_SHADE_GOURAUD
|
886 R200_FOG_SHADE_GOURAUD
|
887 R200_DISC_FOG_SHADE_GOURAUD
|
888 R200_VTX_PIX_CENTER_OGL
|
889 R200_ROUND_MODE_TRUNC
|
890 R200_ROUND_PREC_8TH_PIX
);
892 rmesa
->hw
.set
.cmd
[SET_RE_CNTL
] = (R200_PERSPECTIVE_ENABLE
|
893 R200_SCISSOR_ENABLE
);
895 rmesa
->hw
.lin
.cmd
[LIN_RE_LINE_PATTERN
] = ((1 << 16) | 0xffff);
897 rmesa
->hw
.lin
.cmd
[LIN_RE_LINE_STATE
] =
898 ((0 << R200_LINE_CURRENT_PTR_SHIFT
) |
899 (1 << R200_LINE_CURRENT_COUNT_SHIFT
));
901 rmesa
->hw
.lin
.cmd
[LIN_SE_LINE_WIDTH
] = (1 << 4);
903 rmesa
->hw
.msk
.cmd
[MSK_RB3D_STENCILREFMASK
] =
904 ((0x00 << R200_STENCIL_REF_SHIFT
) |
905 (0xff << R200_STENCIL_MASK_SHIFT
) |
906 (0xff << R200_STENCIL_WRITEMASK_SHIFT
));
908 rmesa
->hw
.msk
.cmd
[MSK_RB3D_ROPCNTL
] = R200_ROP_COPY
;
909 rmesa
->hw
.msk
.cmd
[MSK_RB3D_PLANEMASK
] = 0xffffffff;
911 rmesa
->hw
.tam
.cmd
[TAM_DEBUG3
] = 0;
913 rmesa
->hw
.msc
.cmd
[MSC_RE_MISC
] =
914 ((0 << R200_STIPPLE_X_OFFSET_SHIFT
) |
915 (0 << R200_STIPPLE_Y_OFFSET_SHIFT
) |
916 R200_STIPPLE_BIG_BIT_ORDER
);
919 rmesa
->hw
.cst
.cmd
[CST_PP_CNTL_X
] = 0;
920 rmesa
->hw
.cst
.cmd
[CST_RB3D_DEPTHXY_OFFSET
] = 0;
921 rmesa
->hw
.cst
.cmd
[CST_RE_AUX_SCISSOR_CNTL
] = 0x0;
922 rmesa
->hw
.cst
.cmd
[CST_RE_SCISSOR_TL_0
] = 0;
923 rmesa
->hw
.cst
.cmd
[CST_RE_SCISSOR_BR_0
] = 0;
924 rmesa
->hw
.cst
.cmd
[CST_SE_VAP_CNTL_STATUS
] =
925 #ifdef MESA_BIG_ENDIAN
931 if (!(rmesa
->radeon
.radeonScreen
->chip_flags
& RADEON_CHIPSET_TCL
)) {
933 rmesa
->hw
.cst
.cmd
[CST_SE_VAP_CNTL_STATUS
] |= (1<<8);
936 rmesa
->hw
.cst
.cmd
[CST_RE_POINTSIZE
] =
937 (((GLuint
)(ctx
->Const
.MaxPointSize
* 16.0)) << R200_MAXPOINTSIZE_SHIFT
) | 0x10;
938 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_0
] =
939 (0x0 << R200_VERTEX_POSITION_ADDR__SHIFT
);
940 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_1
] =
941 (0x02 << R200_VTX_COLOR_0_ADDR__SHIFT
) |
942 (0x03 << R200_VTX_COLOR_1_ADDR__SHIFT
);
943 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_2
] =
944 (0x06 << R200_VTX_TEX_0_ADDR__SHIFT
) |
945 (0x07 << R200_VTX_TEX_1_ADDR__SHIFT
) |
946 (0x08 << R200_VTX_TEX_2_ADDR__SHIFT
) |
947 (0x09 << R200_VTX_TEX_3_ADDR__SHIFT
);
948 rmesa
->hw
.cst
.cmd
[CST_SE_TCL_INPUT_VTX_3
] =
949 (0x0A << R200_VTX_TEX_4_ADDR__SHIFT
) |
950 (0x0B << R200_VTX_TEX_5_ADDR__SHIFT
);
953 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XSCALE
] = 0x00000000;
954 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_XOFFSET
] = 0x00000000;
955 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YSCALE
] = 0x00000000;
956 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_YOFFSET
] = 0x00000000;
957 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZSCALE
] = 0x00000000;
958 rmesa
->hw
.vpt
.cmd
[VPT_SE_VPORT_ZOFFSET
] = 0x00000000;
960 for ( i
= 0 ; i
< ctx
->Const
.MaxTextureUnits
; i
++ ) {
961 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFILTER
] = R200_BORDER_MODE_OGL
;
962 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFORMAT
] =
963 ((i
<< R200_TXFORMAT_ST_ROUTE_SHIFT
) | /* <-- note i */
964 (2 << R200_TXFORMAT_WIDTH_SHIFT
) |
965 (2 << R200_TXFORMAT_HEIGHT_SHIFT
));
966 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_BORDER_COLOR
] = 0;
967 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXFORMAT_X
] =
968 (/* R200_TEXCOORD_PROJ | */
969 0x100000); /* Small default bias */
970 if (rmesa
->radeon
.radeonScreen
->drmSupportsFragShader
) {
971 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXOFFSET_NEWDRM
] =
972 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
973 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_CUBIC_FACES
] = 0;
974 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXMULTI_CTL
] = 0;
977 rmesa
->hw
.tex
[i
].cmd
[TEX_PP_TXOFFSET_OLDDRM
] =
978 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
981 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_FACES
] = 0;
982 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F1
] =
983 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
984 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F2
] =
985 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
986 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F3
] =
987 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
988 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F4
] =
989 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
990 rmesa
->hw
.cube
[i
].cmd
[CUBE_PP_CUBIC_OFFSET_F5
] =
991 rmesa
->radeon
.radeonScreen
->texOffset
[RADEON_LOCAL_TEX_HEAP
];
993 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXCBLEND
] =
994 (R200_TXC_ARG_A_ZERO
|
995 R200_TXC_ARG_B_ZERO
|
996 R200_TXC_ARG_C_DIFFUSE_COLOR
|
999 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXCBLEND2
] =
1000 ((i
<< R200_TXC_TFACTOR_SEL_SHIFT
) |
1002 R200_TXC_CLAMP_0_1
|
1003 R200_TXC_OUTPUT_REG_R0
);
1005 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXABLEND
] =
1006 (R200_TXA_ARG_A_ZERO
|
1007 R200_TXA_ARG_B_ZERO
|
1008 R200_TXA_ARG_C_DIFFUSE_ALPHA
|
1011 rmesa
->hw
.pix
[i
].cmd
[PIX_PP_TXABLEND2
] =
1012 ((i
<< R200_TXA_TFACTOR_SEL_SHIFT
) |
1014 R200_TXA_CLAMP_0_1
|
1015 R200_TXA_OUTPUT_REG_R0
);
1018 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_0
] = 0;
1019 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_1
] = 0;
1020 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_2
] = 0;
1021 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_3
] = 0;
1022 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_4
] = 0;
1023 rmesa
->hw
.tf
.cmd
[TF_TFACTOR_5
] = 0;
1025 rmesa
->hw
.vap
.cmd
[VAP_SE_VAP_CNTL
] =
1026 (R200_VAP_TCL_ENABLE
|
1027 (0x9 << R200_VAP_VF_MAX_VTX_NUM__SHIFT
));
1029 rmesa
->hw
.vte
.cmd
[VTE_SE_VTE_CNTL
] =
1030 (R200_VPORT_X_SCALE_ENA
|
1031 R200_VPORT_Y_SCALE_ENA
|
1032 R200_VPORT_Z_SCALE_ENA
|
1033 R200_VPORT_X_OFFSET_ENA
|
1034 R200_VPORT_Y_OFFSET_ENA
|
1035 R200_VPORT_Z_OFFSET_ENA
|
1036 /* FIXME: Turn on for tex rect only */
1037 R200_VTX_ST_DENORMALIZED
|
1041 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_0
] = 0;
1042 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_1
] = 0;
1043 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_VTXFMT_0
] =
1044 ((R200_VTX_Z0
| R200_VTX_W0
|
1045 (R200_VTX_FP_RGBA
<< R200_VTX_COLOR_0_SHIFT
)));
1046 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_VTXFMT_1
] = 0;
1047 rmesa
->hw
.vtx
.cmd
[VTX_TCL_OUTPUT_COMPSEL
] = (R200_OUTPUT_XYZW
);
1048 rmesa
->hw
.vtx
.cmd
[VTX_STATE_CNTL
] = R200_VSC_UPDATE_USER_COLOR_0_ENABLE
;
1051 /* Matrix selection */
1052 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_0
] =
1053 (R200_MTX_MV
<< R200_MODELVIEW_0_SHIFT
);
1055 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_1
] =
1056 (R200_MTX_IMV
<< R200_IT_MODELVIEW_0_SHIFT
);
1058 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_2
] =
1059 (R200_MTX_MVP
<< R200_MODELPROJECT_0_SHIFT
);
1061 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_3
] =
1062 ((R200_MTX_TEX0
<< R200_TEXMAT_0_SHIFT
) |
1063 (R200_MTX_TEX1
<< R200_TEXMAT_1_SHIFT
) |
1064 (R200_MTX_TEX2
<< R200_TEXMAT_2_SHIFT
) |
1065 (R200_MTX_TEX3
<< R200_TEXMAT_3_SHIFT
));
1067 rmesa
->hw
.msl
.cmd
[MSL_MATRIX_SELECT_4
] =
1068 ((R200_MTX_TEX4
<< R200_TEXMAT_4_SHIFT
) |
1069 (R200_MTX_TEX5
<< R200_TEXMAT_5_SHIFT
));
1072 /* General TCL state */
1073 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL_0
] =
1074 (R200_SPECULAR_LIGHTS
|
1075 R200_DIFFUSE_SPECULAR_COMBINE
|
1076 R200_LOCAL_LIGHT_VEC_GL
|
1077 R200_LM0_SOURCE_MATERIAL_0
<< R200_FRONT_SHININESS_SOURCE_SHIFT
|
1078 R200_LM0_SOURCE_MATERIAL_1
<< R200_BACK_SHININESS_SOURCE_SHIFT
);
1080 rmesa
->hw
.tcl
.cmd
[TCL_LIGHT_MODEL_CTL_1
] =
1081 ((R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_EMISSIVE_SOURCE_SHIFT
) |
1082 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_AMBIENT_SOURCE_SHIFT
) |
1083 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_DIFFUSE_SOURCE_SHIFT
) |
1084 (R200_LM1_SOURCE_MATERIAL_0
<< R200_FRONT_SPECULAR_SOURCE_SHIFT
) |
1085 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_EMISSIVE_SOURCE_SHIFT
) |
1086 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_AMBIENT_SOURCE_SHIFT
) |
1087 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_DIFFUSE_SOURCE_SHIFT
) |
1088 (R200_LM1_SOURCE_MATERIAL_1
<< R200_BACK_SPECULAR_SOURCE_SHIFT
));
1090 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_0
] = 0; /* filled in via callbacks */
1091 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_1
] = 0;
1092 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_2
] = 0;
1093 rmesa
->hw
.tcl
.cmd
[TCL_PER_LIGHT_CTL_3
] = 0;
1095 rmesa
->hw
.tcl
.cmd
[TCL_UCP_VERT_BLEND_CTL
] =
1096 (R200_UCP_IN_CLIP_SPACE
|
1097 R200_CULL_FRONT_IS_CCW
);
1099 /* Texgen/Texmat state */
1100 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_2
] = 0x00ffffff;
1101 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_3
] =
1102 ((0 << R200_TEXGEN_0_INPUT_TEX_SHIFT
) |
1103 (1 << R200_TEXGEN_1_INPUT_TEX_SHIFT
) |
1104 (2 << R200_TEXGEN_2_INPUT_TEX_SHIFT
) |
1105 (3 << R200_TEXGEN_3_INPUT_TEX_SHIFT
) |
1106 (4 << R200_TEXGEN_4_INPUT_TEX_SHIFT
) |
1107 (5 << R200_TEXGEN_5_INPUT_TEX_SHIFT
));
1108 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_0
] = 0;
1109 rmesa
->hw
.tcg
.cmd
[TCG_TEX_PROC_CTL_1
] =
1110 ((0 << R200_TEXGEN_0_INPUT_SHIFT
) |
1111 (1 << R200_TEXGEN_1_INPUT_SHIFT
) |
1112 (2 << R200_TEXGEN_2_INPUT_SHIFT
) |
1113 (3 << R200_TEXGEN_3_INPUT_SHIFT
) |
1114 (4 << R200_TEXGEN_4_INPUT_SHIFT
) |
1115 (5 << R200_TEXGEN_5_INPUT_SHIFT
));
1116 rmesa
->hw
.tcg
.cmd
[TCG_TEX_CYL_WRAP_CTL
] = 0;
1119 for (i
= 0 ; i
< 8; i
++) {
1120 struct gl_light
*l
= &ctx
->Light
.Light
[i
];
1121 GLenum p
= GL_LIGHT0
+ i
;
1122 *(float *)&(rmesa
->hw
.lit
[i
].cmd
[LIT_RANGE_CUTOFF
]) = FLT_MAX
;
1124 ctx
->Driver
.Lightfv( ctx
, p
, GL_AMBIENT
, l
->Ambient
);
1125 ctx
->Driver
.Lightfv( ctx
, p
, GL_DIFFUSE
, l
->Diffuse
);
1126 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPECULAR
, l
->Specular
);
1127 ctx
->Driver
.Lightfv( ctx
, p
, GL_POSITION
, NULL
);
1128 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_DIRECTION
, NULL
);
1129 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_EXPONENT
, &l
->SpotExponent
);
1130 ctx
->Driver
.Lightfv( ctx
, p
, GL_SPOT_CUTOFF
, &l
->SpotCutoff
);
1131 ctx
->Driver
.Lightfv( ctx
, p
, GL_CONSTANT_ATTENUATION
,
1132 &l
->ConstantAttenuation
);
1133 ctx
->Driver
.Lightfv( ctx
, p
, GL_LINEAR_ATTENUATION
,
1134 &l
->LinearAttenuation
);
1135 ctx
->Driver
.Lightfv( ctx
, p
, GL_QUADRATIC_ATTENUATION
,
1136 &l
->QuadraticAttenuation
);
1137 *(float *)&(rmesa
->hw
.lit
[i
].cmd
[LIT_ATTEN_XXX
]) = 0.0;
1140 ctx
->Driver
.LightModelfv( ctx
, GL_LIGHT_MODEL_AMBIENT
,
1141 ctx
->Light
.Model
.Ambient
);
1143 TNL_CONTEXT(ctx
)->Driver
.NotifyMaterialChange( ctx
);
1145 for (i
= 0 ; i
< 6; i
++) {
1146 ctx
->Driver
.ClipPlane( ctx
, GL_CLIP_PLANE0
+ i
, NULL
);
1149 ctx
->Driver
.Fogfv( ctx
, GL_FOG_MODE
, NULL
);
1150 ctx
->Driver
.Fogfv( ctx
, GL_FOG_DENSITY
, &ctx
->Fog
.Density
);
1151 ctx
->Driver
.Fogfv( ctx
, GL_FOG_START
, &ctx
->Fog
.Start
);
1152 ctx
->Driver
.Fogfv( ctx
, GL_FOG_END
, &ctx
->Fog
.End
);
1153 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COLOR
, ctx
->Fog
.Color
);
1154 ctx
->Driver
.Fogfv( ctx
, GL_FOG_COORDINATE_SOURCE_EXT
, NULL
);
1156 rmesa
->hw
.grd
.cmd
[GRD_VERT_GUARD_CLIP_ADJ
] = IEEE_ONE
;
1157 rmesa
->hw
.grd
.cmd
[GRD_VERT_GUARD_DISCARD_ADJ
] = IEEE_ONE
;
1158 rmesa
->hw
.grd
.cmd
[GRD_HORZ_GUARD_CLIP_ADJ
] = IEEE_ONE
;
1159 rmesa
->hw
.grd
.cmd
[GRD_HORZ_GUARD_DISCARD_ADJ
] = IEEE_ONE
;
1161 rmesa
->hw
.eye
.cmd
[EYE_X
] = 0;
1162 rmesa
->hw
.eye
.cmd
[EYE_Y
] = 0;
1163 rmesa
->hw
.eye
.cmd
[EYE_Z
] = IEEE_ONE
;
1164 rmesa
->hw
.eye
.cmd
[EYE_RESCALE_FACTOR
] = IEEE_ONE
;
1166 rmesa
->hw
.spr
.cmd
[SPR_POINT_SPRITE_CNTL
] =
1167 R200_PS_SE_SEL_STATE
| R200_PS_MULT_CONST
;
1169 /* ptp_eye is presumably used to calculate the attenuation wrt a different
1170 location? In any case, since point attenuation triggers _needeyecoords,
1171 it is constant. Probably ignored as long as R200_PS_USE_MODEL_EYE_VEC
1173 rmesa
->hw
.ptp
.cmd
[PTP_EYE_X
] = 0;
1174 rmesa
->hw
.ptp
.cmd
[PTP_EYE_Y
] = 0;
1175 rmesa
->hw
.ptp
.cmd
[PTP_EYE_Z
] = IEEE_ONE
| 0x80000000; /* -1.0 */
1176 rmesa
->hw
.ptp
.cmd
[PTP_EYE_3
] = 0;
1177 /* no idea what the ptp_vport_scale values are good for, except the
1178 PTSIZE one - hopefully doesn't matter */
1179 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_0
] = IEEE_ONE
;
1180 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_1
] = IEEE_ONE
;
1181 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_PTSIZE
] = IEEE_ONE
;
1182 rmesa
->hw
.ptp
.cmd
[PTP_VPORT_SCALE_3
] = IEEE_ONE
;
1183 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_QUAD
] = 0;
1184 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_LIN
] = 0;
1185 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_CON
] = IEEE_ONE
;
1186 rmesa
->hw
.ptp
.cmd
[PTP_ATT_CONST_3
] = 0;
1187 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_MIN
] = IEEE_ONE
;
1188 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_MAX
] = 0x44ffe000; /* 2047 */
1189 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_2
] = 0;
1190 rmesa
->hw
.ptp
.cmd
[PTP_CLAMP_3
] = 0;
1192 r200LightingSpaceChange( ctx
);
1194 rmesa
->hw
.all_dirty
= GL_TRUE
;
1196 rcommonInitCmdBuf(&rmesa
->radeon
, rmesa
->hw
.max_state_size
);