Track Radeon driver symlinks in Git.
[mesa.git] / src / mesa / drivers / dri / r300 / r300_cmdbuf.c
1 /*
2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
3
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.
7
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:
15
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.
19
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.
27
28 **************************************************************************/
29
30 /**
31 * \file
32 *
33 * \author Nicolai Haehnle <prefect_@gmx.net>
34 */
35
36 #include "main/glheader.h"
37 #include "main/state.h"
38 #include "main/imports.h"
39 #include "main/macros.h"
40 #include "main/context.h"
41 #include "main/simple_list.h"
42 #include "swrast/swrast.h"
43
44 #include "drm.h"
45 #include "radeon_drm.h"
46
47 #include "r300_context.h"
48 #include "r300_ioctl.h"
49 #include "radeon_reg.h"
50 #include "r300_reg.h"
51 #include "r300_cmdbuf.h"
52 #include "r300_emit.h"
53 #include "radeon_bocs_wrapper.h"
54 #include "radeon_mipmap_tree.h"
55 #include "r300_state.h"
56 #include "radeon_reg.h"
57
58 /** # of dwords reserved for additional instructions that may need to be written
59 * during flushing.
60 */
61 #define SPACE_FOR_FLUSHING 4
62
63 static unsigned packet0_count(r300ContextPtr r300, uint32_t *pkt)
64 {
65 if (r300->radeon.radeonScreen->kernel_mm) {
66 return ((((*pkt) >> 16) & 0x3FFF) + 1);
67 } else {
68 drm_r300_cmd_header_t *t = (drm_r300_cmd_header_t*)pkt;
69 return t->packet0.count;
70 }
71 }
72
73 #define vpu_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->vpu.count)
74 #define r500fp_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->r500fp.count)
75
76 void emit_vpu(GLcontext *ctx, struct radeon_state_atom * atom)
77 {
78 r300ContextPtr r300 = R300_CONTEXT(ctx);
79 BATCH_LOCALS(&r300->radeon);
80 drm_r300_cmd_header_t cmd;
81 uint32_t addr, ndw, i;
82
83 if (!r300->radeon.radeonScreen->kernel_mm) {
84 uint32_t dwords;
85 dwords = (*atom->check) (ctx, atom);
86 BEGIN_BATCH_NO_AUTOSTATE(dwords);
87 OUT_BATCH_TABLE(atom->cmd, dwords);
88 END_BATCH();
89 return;
90 }
91
92 cmd.u = atom->cmd[0];
93 addr = (cmd.vpu.adrhi << 8) | cmd.vpu.adrlo;
94 ndw = cmd.vpu.count * 4;
95 if (ndw) {
96
97 if (r300->vap_flush_needed) {
98 BEGIN_BATCH_NO_AUTOSTATE(15 + ndw);
99
100 /* flush processing vertices */
101 OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0);
102 OUT_BATCH_REGVAL(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
103 OUT_BATCH_REGVAL(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
104 OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0xffffff);
105 OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG, 0);
106 r300->vap_flush_needed = GL_FALSE;
107 } else {
108 BEGIN_BATCH_NO_AUTOSTATE(5 + ndw);
109 }
110 OUT_BATCH_REGVAL(R300_VAP_PVS_VECTOR_INDX_REG, addr);
111 OUT_BATCH(CP_PACKET0(R300_VAP_PVS_UPLOAD_DATA, ndw-1) | RADEON_ONE_REG_WR);
112 for (i = 0; i < ndw; i++) {
113 OUT_BATCH(atom->cmd[i+1]);
114 }
115 OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG, 0);
116 END_BATCH();
117 }
118 }
119
120 void emit_r500fp(GLcontext *ctx, struct radeon_state_atom * atom)
121 {
122 r300ContextPtr r300 = R300_CONTEXT(ctx);
123 BATCH_LOCALS(&r300->radeon);
124 drm_r300_cmd_header_t cmd;
125 uint32_t addr, ndw, i, sz;
126 int type, clamp, stride;
127
128 if (!r300->radeon.radeonScreen->kernel_mm) {
129 uint32_t dwords;
130 dwords = (*atom->check) (ctx, atom);
131 BEGIN_BATCH_NO_AUTOSTATE(dwords);
132 OUT_BATCH_TABLE(atom->cmd, dwords);
133 END_BATCH();
134 return;
135 }
136
137 cmd.u = atom->cmd[0];
138 sz = cmd.r500fp.count;
139 addr = ((cmd.r500fp.adrhi_flags & 1) << 8) | cmd.r500fp.adrlo;
140 type = !!(cmd.r500fp.adrhi_flags & R500FP_CONSTANT_TYPE);
141 clamp = !!(cmd.r500fp.adrhi_flags & R500FP_CONSTANT_CLAMP);
142
143 addr |= (type << 16);
144 addr |= (clamp << 17);
145
146 stride = type ? 4 : 6;
147
148 ndw = sz * stride;
149 if (ndw) {
150
151 BEGIN_BATCH_NO_AUTOSTATE(3 + ndw);
152 OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_INDEX, 0));
153 OUT_BATCH(addr);
154 OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_DATA, ndw-1) | RADEON_ONE_REG_WR);
155 for (i = 0; i < ndw; i++) {
156 OUT_BATCH(atom->cmd[i+1]);
157 }
158 END_BATCH();
159 }
160 }
161
162 static void emit_tex_offsets(GLcontext *ctx, struct radeon_state_atom * atom)
163 {
164 r300ContextPtr r300 = R300_CONTEXT(ctx);
165 BATCH_LOCALS(&r300->radeon);
166 int numtmus = packet0_count(r300, r300->hw.tex.offset.cmd);
167 int notexture = 0;
168
169 if (numtmus) {
170 int i;
171
172 for(i = 0; i < numtmus; ++i) {
173 radeonTexObj *t = r300->hw.textures[i];
174
175 if (!t)
176 notexture = 1;
177 }
178
179 if (r300->radeon.radeonScreen->kernel_mm && notexture) {
180 return;
181 }
182 for(i = 0; i < numtmus; ++i) {
183 radeonTexObj *t = r300->hw.textures[i];
184 if (t && !t->image_override) {
185 BEGIN_BATCH_NO_AUTOSTATE(4);
186 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
187 OUT_BATCH_RELOC(t->tile_bits, t->mt->bo, 0,
188 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
189 END_BATCH();
190 } else if (!t) {
191 /* Texture unit hasn't a texture bound nothings to do */
192 } else { /* override cases */
193 if (t->bo) {
194 BEGIN_BATCH_NO_AUTOSTATE(4);
195 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
196 OUT_BATCH_RELOC(t->tile_bits, t->bo, 0,
197 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
198 END_BATCH();
199 } else if (!r300->radeon.radeonScreen->kernel_mm) {
200 BEGIN_BATCH_NO_AUTOSTATE(2);
201 OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
202 OUT_BATCH(t->override_offset);
203 END_BATCH();
204 } else {
205 /* Texture unit hasn't a texture bound nothings to do */
206 }
207 }
208 }
209 }
210 }
211
212 void r300_emit_scissor(GLcontext *ctx)
213 {
214 r300ContextPtr r300 = R300_CONTEXT(ctx);
215 BATCH_LOCALS(&r300->radeon);
216 unsigned x1, y1, x2, y2;
217 struct radeon_renderbuffer *rrb;
218
219 if (!r300->radeon.radeonScreen->driScreen->dri2.enabled) {
220 return;
221 }
222 rrb = radeon_get_colorbuffer(&r300->radeon);
223 if (!rrb || !rrb->bo) {
224 fprintf(stderr, "no rrb\n");
225 return;
226 }
227 if (r300->radeon.state.scissor.enabled) {
228 x1 = r300->radeon.state.scissor.rect.x1;
229 y1 = r300->radeon.state.scissor.rect.y1;
230 x2 = r300->radeon.state.scissor.rect.x2 - 1;
231 y2 = r300->radeon.state.scissor.rect.y2 - 1;
232 } else {
233 x1 = 0;
234 y1 = 0;
235 x2 = rrb->base.Width - 1;
236 y2 = rrb->base.Height - 1;
237 }
238 if (r300->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV515) {
239 x1 += R300_SCISSORS_OFFSET;
240 y1 += R300_SCISSORS_OFFSET;
241 x2 += R300_SCISSORS_OFFSET;
242 y2 += R300_SCISSORS_OFFSET;
243 }
244 BEGIN_BATCH_NO_AUTOSTATE(3);
245 OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL, 2);
246 OUT_BATCH((x1 << R300_SCISSORS_X_SHIFT)|(y1 << R300_SCISSORS_Y_SHIFT));
247 OUT_BATCH((x2 << R300_SCISSORS_X_SHIFT)|(y2 << R300_SCISSORS_Y_SHIFT));
248 END_BATCH();
249 }
250
251 static void emit_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
252 {
253 r300ContextPtr r300 = R300_CONTEXT(ctx);
254 BATCH_LOCALS(&r300->radeon);
255 struct radeon_renderbuffer *rrb;
256 uint32_t cbpitch;
257 uint32_t offset = r300->radeon.state.color.draw_offset;
258 uint32_t dw = 6;
259 int i;
260
261 rrb = radeon_get_colorbuffer(&r300->radeon);
262 if (!rrb || !rrb->bo) {
263 fprintf(stderr, "no rrb\n");
264 return;
265 }
266
267 if (RADEON_DEBUG & DEBUG_STATE)
268 fprintf(stderr,"rrb is %p %d %dx%d\n", rrb, offset, rrb->base.Width, rrb->base.Height);
269 cbpitch = (rrb->pitch / rrb->cpp);
270 if (rrb->cpp == 4)
271 cbpitch |= R300_COLOR_FORMAT_ARGB8888;
272 else switch (rrb->base._ActualFormat) {
273 case GL_RGB5:
274 cbpitch |= R300_COLOR_FORMAT_RGB565;
275 break;
276 case GL_RGBA4:
277 cbpitch |= R300_COLOR_FORMAT_ARGB4444;
278 break;
279 case GL_RGB5_A1:
280 cbpitch |= R300_COLOR_FORMAT_ARGB1555;
281 break;
282 }
283
284 if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE)
285 cbpitch |= R300_COLOR_TILE_ENABLE;
286
287 if (r300->radeon.radeonScreen->kernel_mm)
288 dw += 2;
289 BEGIN_BATCH_NO_AUTOSTATE(dw);
290 OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0, 1);
291 OUT_BATCH_RELOC(offset, rrb->bo, offset, 0, RADEON_GEM_DOMAIN_VRAM, 0);
292 OUT_BATCH_REGSEQ(R300_RB3D_COLORPITCH0, 1);
293 if (!r300->radeon.radeonScreen->kernel_mm)
294 OUT_BATCH(cbpitch);
295 else
296 OUT_BATCH_RELOC(cbpitch, rrb->bo, cbpitch, 0, RADEON_GEM_DOMAIN_VRAM, 0);
297 END_BATCH();
298 if (r300->radeon.radeonScreen->driScreen->dri2.enabled) {
299 if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
300 BEGIN_BATCH_NO_AUTOSTATE(3);
301 OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL, 2);
302 OUT_BATCH(0);
303 OUT_BATCH(((rrb->base.Width - 1) << R300_SCISSORS_X_SHIFT) |
304 ((rrb->base.Height - 1) << R300_SCISSORS_Y_SHIFT));
305 END_BATCH();
306 BEGIN_BATCH_NO_AUTOSTATE(16);
307 for (i = 0; i < 4; i++) {
308 OUT_BATCH_REGSEQ(R300_SC_CLIPRECT_TL_0 + (i * 8), 2);
309 OUT_BATCH((0 << R300_CLIPRECT_X_SHIFT) | (0 << R300_CLIPRECT_Y_SHIFT));
310 OUT_BATCH(((rrb->base.Width - 1) << R300_CLIPRECT_X_SHIFT) | ((rrb->base.Height - 1) << R300_CLIPRECT_Y_SHIFT));
311 }
312 OUT_BATCH_REGSEQ(R300_SC_CLIP_RULE, 1);
313 OUT_BATCH(0xAAAA);
314 OUT_BATCH_REGSEQ(R300_SC_SCREENDOOR, 1);
315 OUT_BATCH(0xffffff);
316 END_BATCH();
317 } else {
318 BEGIN_BATCH_NO_AUTOSTATE(3);
319 OUT_BATCH_REGSEQ(R300_SC_SCISSORS_TL, 2);
320 OUT_BATCH((R300_SCISSORS_OFFSET << R300_SCISSORS_X_SHIFT) |
321 (R300_SCISSORS_OFFSET << R300_SCISSORS_Y_SHIFT));
322 OUT_BATCH(((rrb->base.Width + R300_SCISSORS_OFFSET - 1) << R300_SCISSORS_X_SHIFT) |
323 ((rrb->base.Height + R300_SCISSORS_OFFSET - 1) << R300_SCISSORS_Y_SHIFT));
324 END_BATCH();
325 BEGIN_BATCH_NO_AUTOSTATE(16);
326 for (i = 0; i < 4; i++) {
327 OUT_BATCH_REGSEQ(R300_SC_CLIPRECT_TL_0 + (i * 8), 2);
328 OUT_BATCH((R300_SCISSORS_OFFSET << R300_CLIPRECT_X_SHIFT) | (R300_SCISSORS_OFFSET << R300_CLIPRECT_Y_SHIFT));
329 OUT_BATCH(((R300_SCISSORS_OFFSET + rrb->base.Width - 1) << R300_CLIPRECT_X_SHIFT) |
330 ((R300_SCISSORS_OFFSET + rrb->base.Height - 1) << R300_CLIPRECT_Y_SHIFT));
331 }
332 OUT_BATCH_REGSEQ(R300_SC_CLIP_RULE, 1);
333 OUT_BATCH(0xAAAA);
334 OUT_BATCH_REGSEQ(R300_SC_SCREENDOOR, 1);
335 OUT_BATCH(0xffffff);
336 END_BATCH();
337 }
338 }
339 }
340
341 static void emit_zb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
342 {
343 r300ContextPtr r300 = R300_CONTEXT(ctx);
344 BATCH_LOCALS(&r300->radeon);
345 struct radeon_renderbuffer *rrb;
346 uint32_t zbpitch;
347 uint32_t dw;
348
349 rrb = radeon_get_depthbuffer(&r300->radeon);
350 if (!rrb)
351 return;
352
353 zbpitch = (rrb->pitch / rrb->cpp);
354 if (!r300->radeon.radeonScreen->kernel_mm) {
355 if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE) {
356 zbpitch |= R300_DEPTHMACROTILE_ENABLE;
357 }
358 if (rrb->bo->flags & RADEON_BO_FLAGS_MICRO_TILE){
359 zbpitch |= R300_DEPTHMICROTILE_TILED;
360 }
361 }
362
363 dw = 6;
364 if (r300->radeon.radeonScreen->kernel_mm)
365 dw += 2;
366 BEGIN_BATCH_NO_AUTOSTATE(dw);
367 OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1);
368 OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
369 OUT_BATCH_REGSEQ(R300_ZB_DEPTHPITCH, 1);
370 if (!r300->radeon.radeonScreen->kernel_mm)
371 OUT_BATCH(zbpitch);
372 else
373 OUT_BATCH_RELOC(cbpitch, rrb->bo, zbpitch, 0, RADEON_GEM_DOMAIN_VRAM, 0);
374 END_BATCH();
375 }
376
377 static void emit_gb_misc(GLcontext *ctx, struct radeon_state_atom * atom)
378 {
379 r300ContextPtr r300 = R300_CONTEXT(ctx);
380 BATCH_LOCALS(&r300->radeon);
381 if (!r300->radeon.radeonScreen->driScreen->dri2.enabled) {
382 BEGIN_BATCH_NO_AUTOSTATE(4);
383 OUT_BATCH(atom->cmd[0]);
384 OUT_BATCH(atom->cmd[1]);
385 OUT_BATCH(atom->cmd[2]);
386 OUT_BATCH(atom->cmd[3]);
387 END_BATCH();
388 }
389 }
390
391 static void emit_threshold_misc(GLcontext *ctx, struct radeon_state_atom * atom)
392 {
393 r300ContextPtr r300 = R300_CONTEXT(ctx);
394 BATCH_LOCALS(&r300->radeon);
395 if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
396 BEGIN_BATCH_NO_AUTOSTATE(3);
397 OUT_BATCH(atom->cmd[0]);
398 OUT_BATCH(atom->cmd[1]);
399 OUT_BATCH(atom->cmd[2]);
400 END_BATCH();
401 }
402 }
403
404 static void emit_shade_misc(GLcontext *ctx, struct radeon_state_atom * atom)
405 {
406 r300ContextPtr r300 = R300_CONTEXT(ctx);
407 BATCH_LOCALS(&r300->radeon);
408
409 if (!r300->radeon.radeonScreen->driScreen->dri2.enabled) {
410 BEGIN_BATCH_NO_AUTOSTATE(2);
411 OUT_BATCH(atom->cmd[0]);
412 OUT_BATCH(atom->cmd[1]);
413 END_BATCH();
414 }
415 }
416
417 static void emit_zstencil_format(GLcontext *ctx, struct radeon_state_atom * atom)
418 {
419 r300ContextPtr r300 = R300_CONTEXT(ctx);
420 BATCH_LOCALS(&r300->radeon);
421 struct radeon_renderbuffer *rrb;
422 uint32_t format = 0;
423
424 rrb = radeon_get_depthbuffer(&r300->radeon);
425 if (!rrb)
426 format = 0;
427 else {
428 if (rrb->cpp == 2)
429 format = R300_DEPTHFORMAT_16BIT_INT_Z;
430 else if (rrb->cpp == 4)
431 format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
432 }
433
434 OUT_BATCH(atom->cmd[0]);
435 atom->cmd[1] &= ~0xf;
436 atom->cmd[1] |= format;
437 OUT_BATCH(atom->cmd[1]);
438 OUT_BATCH(atom->cmd[2]);
439 OUT_BATCH(atom->cmd[3]);
440 OUT_BATCH(atom->cmd[4]);
441 }
442
443 static int check_always(GLcontext *ctx, struct radeon_state_atom *atom)
444 {
445 return atom->cmd_size;
446 }
447
448 static int check_variable(GLcontext *ctx, struct radeon_state_atom *atom)
449 {
450 r300ContextPtr r300 = R300_CONTEXT(ctx);
451 int cnt;
452 if (atom->cmd[0] == CP_PACKET2) {
453 return 0;
454 }
455 cnt = packet0_count(r300, atom->cmd);
456 return cnt ? cnt + 1 : 0;
457 }
458
459 int check_vpu(GLcontext *ctx, struct radeon_state_atom *atom)
460 {
461 int cnt;
462
463 cnt = vpu_count(atom->cmd);
464 return cnt ? (cnt * 4) + 1 : 0;
465 }
466
467 int check_r500fp(GLcontext *ctx, struct radeon_state_atom *atom)
468 {
469 int cnt;
470
471 cnt = r500fp_count(atom->cmd);
472 return cnt ? (cnt * 6) + 1 : 0;
473 }
474
475 int check_r500fp_const(GLcontext *ctx, struct radeon_state_atom *atom)
476 {
477 int cnt;
478
479 cnt = r500fp_count(atom->cmd);
480 return cnt ? (cnt * 4) + 1 : 0;
481 }
482
483 #define ALLOC_STATE( ATOM, CHK, SZ, IDX ) \
484 do { \
485 r300->hw.ATOM.cmd_size = (SZ); \
486 r300->hw.ATOM.cmd = (uint32_t*)CALLOC((SZ) * sizeof(uint32_t)); \
487 r300->hw.ATOM.name = #ATOM; \
488 r300->hw.ATOM.idx = (IDX); \
489 r300->hw.ATOM.check = check_##CHK; \
490 r300->hw.ATOM.dirty = GL_FALSE; \
491 r300->radeon.hw.max_state_size += (SZ); \
492 insert_at_tail(&r300->radeon.hw.atomlist, &r300->hw.ATOM); \
493 } while (0)
494 /**
495 * Allocate memory for the command buffer and initialize the state atom
496 * list. Note that the initial hardware state is set by r300InitState().
497 */
498 void r300InitCmdBuf(r300ContextPtr r300)
499 {
500 int mtu;
501 int has_tcl;
502 int is_r500 = 0;
503
504 has_tcl = r300->options.hw_tcl_enabled;
505
506 if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
507 is_r500 = 1;
508
509 r300->radeon.hw.max_state_size = 2 + 2; /* reserve extra space for WAIT_IDLE and tex cache flush */
510
511 mtu = r300->radeon.glCtx->Const.MaxTextureUnits;
512 if (RADEON_DEBUG & DEBUG_TEXTURE) {
513 fprintf(stderr, "Using %d maximum texture units..\n", mtu);
514 }
515
516 /* Setup the atom linked list */
517 make_empty_list(&r300->radeon.hw.atomlist);
518 r300->radeon.hw.atomlist.name = "atom-list";
519
520 /* Initialize state atoms */
521 ALLOC_STATE(vpt, always, R300_VPT_CMDSIZE, 0);
522 r300->hw.vpt.cmd[R300_VPT_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_SE_VPORT_XSCALE, 6);
523 ALLOC_STATE(vap_cntl, always, R300_VAP_CNTL_SIZE, 0);
524 r300->hw.vap_cntl.cmd[R300_VAP_CNTL_FLUSH] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PVS_STATE_FLUSH_REG, 1);
525 r300->hw.vap_cntl.cmd[R300_VAP_CNTL_FLUSH_1] = 0;
526 r300->hw.vap_cntl.cmd[R300_VAP_CNTL_CMD] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_CNTL, 1);
527 if (is_r500 && !r300->radeon.radeonScreen->kernel_mm) {
528 ALLOC_STATE(vap_index_offset, always, 2, 0);
529 r300->hw.vap_index_offset.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R500_VAP_INDEX_OFFSET, 1);
530 r300->hw.vap_index_offset.cmd[1] = 0;
531 }
532 ALLOC_STATE(vte, always, 3, 0);
533 r300->hw.vte.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SE_VTE_CNTL, 2);
534 ALLOC_STATE(vap_vf_max_vtx_indx, always, 3, 0);
535 r300->hw.vap_vf_max_vtx_indx.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_VF_MAX_VTX_INDX, 2);
536 ALLOC_STATE(vap_cntl_status, always, 2, 0);
537 r300->hw.vap_cntl_status.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_CNTL_STATUS, 1);
538 ALLOC_STATE(vir[0], variable, R300_VIR_CMDSIZE, 0);
539 r300->hw.vir[0].cmd[R300_VIR_CMD_0] =
540 cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PROG_STREAM_CNTL_0, 1);
541 ALLOC_STATE(vir[1], variable, R300_VIR_CMDSIZE, 1);
542 r300->hw.vir[1].cmd[R300_VIR_CMD_0] =
543 cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PROG_STREAM_CNTL_EXT_0, 1);
544 ALLOC_STATE(vic, always, R300_VIC_CMDSIZE, 0);
545 r300->hw.vic.cmd[R300_VIC_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_VTX_STATE_CNTL, 2);
546 ALLOC_STATE(vap_psc_sgn_norm_cntl, always, 2, 0);
547 r300->hw.vap_psc_sgn_norm_cntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PSC_SGN_NORM_CNTL, SGN_NORM_ZERO_CLAMP_MINUS_ONE);
548
549 if (has_tcl) {
550 ALLOC_STATE(vap_clip_cntl, always, 2, 0);
551 r300->hw.vap_clip_cntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_CLIP_CNTL, 1);
552 ALLOC_STATE(vap_clip, always, 5, 0);
553 r300->hw.vap_clip.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_VAP_GB_VERT_CLIP_ADJ, 4);
554 ALLOC_STATE(vap_pvs_vtx_timeout_reg, always, 2, 0);
555 r300->hw.vap_pvs_vtx_timeout_reg.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, VAP_PVS_VTX_TIMEOUT_REG, 1);
556 }
557
558 ALLOC_STATE(vof, always, R300_VOF_CMDSIZE, 0);
559 r300->hw.vof.cmd[R300_VOF_CMD_0] =
560 cmdpacket0(r300->radeon.radeonScreen, R300_VAP_OUTPUT_VTX_FMT_0, 2);
561
562 if (has_tcl) {
563 ALLOC_STATE(pvs, always, R300_PVS_CMDSIZE, 0);
564 r300->hw.pvs.cmd[R300_PVS_CMD_0] =
565 cmdpacket0(r300->radeon.radeonScreen, R300_VAP_PVS_CODE_CNTL_0, 3);
566 }
567
568 ALLOC_STATE(gb_enable, always, 2, 0);
569 r300->hw.gb_enable.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GB_ENABLE, 1);
570 ALLOC_STATE(gb_misc, always, R300_GB_MISC_CMDSIZE, 0);
571 r300->hw.gb_misc.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GB_MSPOS0, 3);
572 r300->hw.gb_misc.emit = emit_gb_misc;
573 ALLOC_STATE(gb_misc2, always, R300_GB_MISC2_CMDSIZE, 0);
574 r300->hw.gb_misc2.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, 0x401C, 2);
575 ALLOC_STATE(txe, always, R300_TXE_CMDSIZE, 0);
576 r300->hw.txe.cmd[R300_TXE_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_TX_ENABLE, 1);
577 ALLOC_STATE(ga_point_s0, always, 5, 0);
578 r300->hw.ga_point_s0.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_POINT_S0, 4);
579 ALLOC_STATE(ga_triangle_stipple, always, 2, 0);
580 r300->hw.ga_triangle_stipple.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_TRIANGLE_STIPPLE, 1);
581 ALLOC_STATE(ps, always, R300_PS_CMDSIZE, 0);
582 r300->hw.ps.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_POINT_SIZE, 1);
583 ALLOC_STATE(ga_point_minmax, always, 4, 0);
584 r300->hw.ga_point_minmax.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_POINT_MINMAX, 3);
585 ALLOC_STATE(lcntl, always, 2, 0);
586 r300->hw.lcntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_LINE_CNTL, 1);
587 ALLOC_STATE(ga_line_stipple, always, 4, 0);
588 r300->hw.ga_line_stipple.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_LINE_STIPPLE_VALUE, 3);
589 ALLOC_STATE(shade, always, 2, 0);
590 r300->hw.shade.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_ENHANCE, 1);
591 r300->hw.shade.emit = emit_shade_misc;
592 ALLOC_STATE(shade2, always, 4, 0);
593 r300->hw.shade2.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, 0x4278, 3);
594 ALLOC_STATE(polygon_mode, always, 4, 0);
595 r300->hw.polygon_mode.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_POLY_MODE, 3);
596 ALLOC_STATE(fogp, always, 3, 0);
597 r300->hw.fogp.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_GA_FOG_SCALE, 2);
598 ALLOC_STATE(zbias_cntl, always, 2, 0);
599 r300->hw.zbias_cntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SU_TEX_WRAP, 1);
600 ALLOC_STATE(zbs, always, R300_ZBS_CMDSIZE, 0);
601 r300->hw.zbs.cmd[R300_ZBS_CMD_0] =
602 cmdpacket0(r300->radeon.radeonScreen, R300_SU_POLY_OFFSET_FRONT_SCALE, 4);
603 ALLOC_STATE(occlusion_cntl, always, 2, 0);
604 r300->hw.occlusion_cntl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SU_POLY_OFFSET_ENABLE, 1);
605 ALLOC_STATE(cul, always, R300_CUL_CMDSIZE, 0);
606 r300->hw.cul.cmd[R300_CUL_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_SU_CULL_MODE, 1);
607 ALLOC_STATE(su_depth_scale, always, 3, 0);
608 r300->hw.su_depth_scale.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SU_DEPTH_SCALE, 2);
609 ALLOC_STATE(rc, always, R300_RC_CMDSIZE, 0);
610 r300->hw.rc.cmd[R300_RC_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_COUNT, 2);
611 if (is_r500) {
612 ALLOC_STATE(ri, variable, R500_RI_CMDSIZE, 0);
613 r300->hw.ri.cmd[R300_RI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R500_RS_IP_0, 16);
614 ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0);
615 r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R500_RS_INST_0, 1);
616 } else {
617 ALLOC_STATE(ri, variable, R300_RI_CMDSIZE, 0);
618 r300->hw.ri.cmd[R300_RI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_IP_0, 8);
619 ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0);
620 r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_INST_0, 1);
621 }
622 ALLOC_STATE(sc_hyperz, always, 3, 0);
623 r300->hw.sc_hyperz.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SC_HYPERZ, 2);
624 ALLOC_STATE(sc_screendoor, always, 2, 0);
625 r300->hw.sc_screendoor.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_SC_SCREENDOOR, 1);
626 ALLOC_STATE(us_out_fmt, always, 6, 0);
627 r300->hw.us_out_fmt.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_OUT_FMT, 5);
628
629 if (is_r500) {
630 ALLOC_STATE(fp, always, R500_FP_CMDSIZE, 0);
631 r300->hw.fp.cmd[R500_FP_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R500_US_CONFIG, 2);
632 r300->hw.fp.cmd[R500_FP_CNTL] = R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO;
633 r300->hw.fp.cmd[R500_FP_CMD_1] = cmdpacket0(r300->radeon.radeonScreen, R500_US_CODE_ADDR, 3);
634 r300->hw.fp.cmd[R500_FP_CMD_2] = cmdpacket0(r300->radeon.radeonScreen, R500_US_FC_CTRL, 1);
635 r300->hw.fp.cmd[R500_FP_FC_CNTL] = 0; /* FIXME when we add flow control */
636
637 ALLOC_STATE(r500fp, r500fp, R500_FPI_CMDSIZE, 0);
638 r300->hw.r500fp.cmd[R300_FPI_CMD_0] =
639 cmdr500fp(r300->radeon.radeonScreen, 0, 0, 0, 0);
640 r300->hw.r500fp.emit = emit_r500fp;
641 ALLOC_STATE(r500fp_const, r500fp_const, R500_FPP_CMDSIZE, 0);
642 r300->hw.r500fp_const.cmd[R300_FPI_CMD_0] =
643 cmdr500fp(r300->radeon.radeonScreen, 0, 0, 1, 0);
644 r300->hw.r500fp_const.emit = emit_r500fp;
645 } else {
646 ALLOC_STATE(fp, always, R300_FP_CMDSIZE, 0);
647 r300->hw.fp.cmd[R300_FP_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_CONFIG, 3);
648 r300->hw.fp.cmd[R300_FP_CMD_1] = cmdpacket0(r300->radeon.radeonScreen, R300_US_CODE_ADDR_0, 4);
649
650 ALLOC_STATE(fpt, variable, R300_FPT_CMDSIZE, 0);
651 r300->hw.fpt.cmd[R300_FPT_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_TEX_INST_0, 0);
652
653 ALLOC_STATE(fpi[0], variable, R300_FPI_CMDSIZE, 0);
654 r300->hw.fpi[0].cmd[R300_FPI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_ALU_RGB_INST_0, 1);
655 ALLOC_STATE(fpi[1], variable, R300_FPI_CMDSIZE, 1);
656 r300->hw.fpi[1].cmd[R300_FPI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_ALU_RGB_ADDR_0, 1);
657 ALLOC_STATE(fpi[2], variable, R300_FPI_CMDSIZE, 2);
658 r300->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_ALU_ALPHA_INST_0, 1);
659 ALLOC_STATE(fpi[3], variable, R300_FPI_CMDSIZE, 3);
660 r300->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_US_ALU_ALPHA_ADDR_0, 1);
661 ALLOC_STATE(fpp, variable, R300_FPP_CMDSIZE, 0);
662 r300->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_PFS_PARAM_0_X, 0);
663 }
664 ALLOC_STATE(fogs, always, R300_FOGS_CMDSIZE, 0);
665 r300->hw.fogs.cmd[R300_FOGS_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_FG_FOG_BLEND, 1);
666 ALLOC_STATE(fogc, always, R300_FOGC_CMDSIZE, 0);
667 r300->hw.fogc.cmd[R300_FOGC_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_FG_FOG_COLOR_R, 3);
668 ALLOC_STATE(at, always, R300_AT_CMDSIZE, 0);
669 r300->hw.at.cmd[R300_AT_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_FG_ALPHA_FUNC, 2);
670 ALLOC_STATE(fg_depth_src, always, 2, 0);
671 r300->hw.fg_depth_src.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_FG_DEPTH_SRC, 1);
672 ALLOC_STATE(rb3d_cctl, always, 2, 0);
673 r300->hw.rb3d_cctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_CCTL, 1);
674 ALLOC_STATE(bld, always, R300_BLD_CMDSIZE, 0);
675 r300->hw.bld.cmd[R300_BLD_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_CBLEND, 2);
676 ALLOC_STATE(cmk, always, R300_CMK_CMDSIZE, 0);
677 r300->hw.cmk.cmd[R300_CMK_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, RB3D_COLOR_CHANNEL_MASK, 1);
678 if (is_r500) {
679 ALLOC_STATE(blend_color, always, 3, 0);
680 r300->hw.blend_color.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R500_RB3D_CONSTANT_COLOR_AR, 2);
681 } else {
682 ALLOC_STATE(blend_color, always, 2, 0);
683 r300->hw.blend_color.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_BLEND_COLOR, 1);
684 }
685 ALLOC_STATE(rop, always, 2, 0);
686 r300->hw.rop.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_ROPCNTL, 1);
687 ALLOC_STATE(cb, always, R300_CB_CMDSIZE, 0);
688 r300->hw.cb.emit = &emit_cb_offset;
689 ALLOC_STATE(rb3d_dither_ctl, always, 10, 0);
690 r300->hw.rb3d_dither_ctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_DITHER_CTL, 9);
691 ALLOC_STATE(rb3d_aaresolve_ctl, always, 2, 0);
692 r300->hw.rb3d_aaresolve_ctl.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_RB3D_AARESOLVE_CTL, 1);
693 ALLOC_STATE(rb3d_discard_src_pixel_lte_threshold, always, 3, 0);
694 r300->hw.rb3d_discard_src_pixel_lte_threshold.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD, 2);
695 r300->hw.rb3d_discard_src_pixel_lte_threshold.emit = emit_threshold_misc;
696 ALLOC_STATE(zs, always, R300_ZS_CMDSIZE, 0);
697 r300->hw.zs.cmd[R300_ZS_CMD_0] =
698 cmdpacket0(r300->radeon.radeonScreen, R300_ZB_CNTL, 3);
699
700 ALLOC_STATE(zstencil_format, always, 5, 0);
701 r300->hw.zstencil_format.cmd[0] =
702 cmdpacket0(r300->radeon.radeonScreen, R300_ZB_FORMAT, 4);
703 r300->hw.zstencil_format.emit = emit_zstencil_format;
704
705 ALLOC_STATE(zb, always, R300_ZB_CMDSIZE, 0);
706 r300->hw.zb.emit = emit_zb_offset;
707 ALLOC_STATE(zb_depthclearvalue, always, 2, 0);
708 r300->hw.zb_depthclearvalue.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_ZB_DEPTHCLEARVALUE, 1);
709 ALLOC_STATE(zb_zmask, always, 3, 0);
710 r300->hw.zb_zmask.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_ZB_ZMASK_OFFSET, 2);
711 ALLOC_STATE(zb_hiz_offset, always, 2, 0);
712 r300->hw.zb_hiz_offset.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_ZB_HIZ_OFFSET, 1);
713 ALLOC_STATE(zb_hiz_pitch, always, 2, 0);
714 r300->hw.zb_hiz_pitch.cmd[0] = cmdpacket0(r300->radeon.radeonScreen, R300_ZB_HIZ_PITCH, 1);
715
716 /* VPU only on TCL */
717 if (has_tcl) {
718 int i;
719 ALLOC_STATE(vpi, vpu, R300_VPI_CMDSIZE, 0);
720 r300->hw.vpi.cmd[0] =
721 cmdvpu(r300->radeon.radeonScreen, R300_PVS_CODE_START, 0);
722 r300->hw.vpi.emit = emit_vpu;
723
724 if (is_r500) {
725 ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0);
726 r300->hw.vpp.cmd[0] =
727 cmdvpu(r300->radeon.radeonScreen, R500_PVS_CONST_START, 0);
728 r300->hw.vpp.emit = emit_vpu;
729
730 ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0);
731 r300->hw.vps.cmd[0] =
732 cmdvpu(r300->radeon.radeonScreen, R500_POINT_VPORT_SCALE_OFFSET, 1);
733 r300->hw.vps.emit = emit_vpu;
734
735 for (i = 0; i < 6; i++) {
736 ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
737 r300->hw.vpucp[i].cmd[0] =
738 cmdvpu(r300->radeon.radeonScreen,
739 R500_PVS_UCP_START + i, 1);
740 r300->hw.vpucp[i].emit = emit_vpu;
741 }
742 } else {
743 ALLOC_STATE(vpp, vpu, R300_VPP_CMDSIZE, 0);
744 r300->hw.vpp.cmd[0] =
745 cmdvpu(r300->radeon.radeonScreen, R300_PVS_CONST_START, 0);
746 r300->hw.vpp.emit = emit_vpu;
747
748 ALLOC_STATE(vps, vpu, R300_VPS_CMDSIZE, 0);
749 r300->hw.vps.cmd[0] =
750 cmdvpu(r300->radeon.radeonScreen, R300_POINT_VPORT_SCALE_OFFSET, 1);
751 r300->hw.vps.emit = emit_vpu;
752
753 for (i = 0; i < 6; i++) {
754 ALLOC_STATE(vpucp[i], vpu, R300_VPUCP_CMDSIZE, 0);
755 r300->hw.vpucp[i].cmd[0] =
756 cmdvpu(r300->radeon.radeonScreen,
757 R300_PVS_UCP_START + i, 1);
758 r300->hw.vpucp[i].emit = emit_vpu;
759 }
760 }
761 }
762
763 /* Textures */
764 ALLOC_STATE(tex.filter, variable, mtu + 1, 0);
765 r300->hw.tex.filter.cmd[R300_TEX_CMD_0] =
766 cmdpacket0(r300->radeon.radeonScreen, R300_TX_FILTER0_0, 0);
767
768 ALLOC_STATE(tex.filter_1, variable, mtu + 1, 0);
769 r300->hw.tex.filter_1.cmd[R300_TEX_CMD_0] =
770 cmdpacket0(r300->radeon.radeonScreen, R300_TX_FILTER1_0, 0);
771
772 ALLOC_STATE(tex.size, variable, mtu + 1, 0);
773 r300->hw.tex.size.cmd[R300_TEX_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_TX_SIZE_0, 0);
774
775 ALLOC_STATE(tex.format, variable, mtu + 1, 0);
776 r300->hw.tex.format.cmd[R300_TEX_CMD_0] =
777 cmdpacket0(r300->radeon.radeonScreen, R300_TX_FORMAT_0, 0);
778
779 ALLOC_STATE(tex.pitch, variable, mtu + 1, 0);
780 r300->hw.tex.pitch.cmd[R300_TEX_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_TX_FORMAT2_0, 0);
781
782 ALLOC_STATE(tex.offset, variable, 1, 0);
783 r300->hw.tex.offset.cmd[R300_TEX_CMD_0] =
784 cmdpacket0(r300->radeon.radeonScreen, R300_TX_OFFSET_0, 0);
785 r300->hw.tex.offset.emit = &emit_tex_offsets;
786
787 ALLOC_STATE(tex.chroma_key, variable, mtu + 1, 0);
788 r300->hw.tex.chroma_key.cmd[R300_TEX_CMD_0] =
789 cmdpacket0(r300->radeon.radeonScreen, R300_TX_CHROMA_KEY_0, 0);
790
791 ALLOC_STATE(tex.border_color, variable, mtu + 1, 0);
792 r300->hw.tex.border_color.cmd[R300_TEX_CMD_0] =
793 cmdpacket0(r300->radeon.radeonScreen, R300_TX_BORDER_COLOR_0, 0);
794
795 r300->radeon.hw.is_dirty = GL_TRUE;
796 r300->radeon.hw.all_dirty = GL_TRUE;
797
798 rcommonInitCmdBuf(&r300->radeon);
799 }