91
89
insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.lit[i]);
92
90
for (i = 0; i < 6; ++i)
93
91
insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.ucp[i]);
94
if (rmesa->radeon.radeonScreen->kernel_mm)
95
insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.stp);
92
insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.stp);
96
93
insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.eye);
97
94
insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.grd);
98
95
insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.fog);
254
238
#if RADEON_OLD_PACKETS
255
239
BEGIN_BATCH_NO_AUTOSTATE(2+ELTS_BUFSZ(align_min_nr)/4);
256
240
OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM, 0);
257
if (!rmesa->radeon.radeonScreen->kernel_mm) {
258
OUT_BATCH_RELOC(rmesa->ioctl.vertex_offset, rmesa->ioctl.bo, rmesa->ioctl.vertex_offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
260
OUT_BATCH(rmesa->ioctl.vertex_offset);
241
OUT_BATCH(rmesa->ioctl.vertex_offset);
262
242
OUT_BATCH(rmesa->ioctl.vertex_max);
263
243
OUT_BATCH(vertex_format);
264
244
OUT_BATCH(primitive |
343
323
OUT_BATCH_PACKET3(RADEON_CP_PACKET3_3D_LOAD_VBPNTR, sz - 1);
346
if (!rmesa->radeon.radeonScreen->kernel_mm) {
347
for (i = 0; i + 1 < nr; i += 2) {
348
OUT_BATCH((rmesa->radeon.tcl.aos[i].components << 0) |
349
(rmesa->radeon.tcl.aos[i].stride << 8) |
350
(rmesa->radeon.tcl.aos[i + 1].components << 16) |
351
(rmesa->radeon.tcl.aos[i + 1].stride << 24));
353
voffset = rmesa->radeon.tcl.aos[i + 0].offset +
354
offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
355
OUT_BATCH_RELOC(voffset,
356
rmesa->radeon.tcl.aos[i].bo,
358
RADEON_GEM_DOMAIN_GTT,
360
voffset = rmesa->radeon.tcl.aos[i + 1].offset +
361
offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
362
OUT_BATCH_RELOC(voffset,
363
rmesa->radeon.tcl.aos[i+1].bo,
365
RADEON_GEM_DOMAIN_GTT,
370
OUT_BATCH((rmesa->radeon.tcl.aos[nr - 1].components << 0) |
371
(rmesa->radeon.tcl.aos[nr - 1].stride << 8));
372
voffset = rmesa->radeon.tcl.aos[nr - 1].offset +
373
offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
374
OUT_BATCH_RELOC(voffset,
375
rmesa->radeon.tcl.aos[nr - 1].bo,
377
RADEON_GEM_DOMAIN_GTT,
381
327
for (i = 0; i + 1 < nr; i += 2) {
382
328
OUT_BATCH((rmesa->radeon.tcl.aos[i].components << 0) |
383
329
(rmesa->radeon.tcl.aos[i].stride << 8) |
433
379
#define RADEON_MAX_CLEARS 256
435
static void radeonKernelClear(struct gl_context *ctx, GLuint flags)
437
r100ContextPtr rmesa = R100_CONTEXT(ctx);
438
__DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon);
439
drm_radeon_sarea_t *sarea = rmesa->radeon.sarea;
442
GLint cx, cy, cw, ch;
444
radeonEmitState(&rmesa->radeon);
446
LOCK_HARDWARE( &rmesa->radeon );
448
/* compute region after locking: */
449
cx = ctx->DrawBuffer->_Xmin;
450
cy = ctx->DrawBuffer->_Ymin;
451
cw = ctx->DrawBuffer->_Xmax - cx;
452
ch = ctx->DrawBuffer->_Ymax - cy;
454
/* Flip top to bottom */
456
cy = dPriv->y + dPriv->h - cy - ch;
458
/* Throttle the number of clear ioctls we do.
462
drm_radeon_getparam_t gp;
464
gp.param = RADEON_PARAM_LAST_CLEAR;
465
gp.value = (int *)&clear;
466
ret = drmCommandWriteRead( rmesa->radeon.dri.fd,
467
DRM_RADEON_GETPARAM, &gp, sizeof(gp) );
470
fprintf( stderr, "%s: drm_radeon_getparam_t: %d\n", __FUNCTION__, ret );
474
if ( sarea->last_clear - clear <= RADEON_MAX_CLEARS ) {
478
if ( rmesa->radeon.do_usleeps ) {
479
UNLOCK_HARDWARE( &rmesa->radeon );
481
LOCK_HARDWARE( &rmesa->radeon );
485
/* Send current state to the hardware */
486
rcommonFlushCmdBufLocked( &rmesa->radeon, __FUNCTION__ );
488
for ( i = 0 ; i < dPriv->numClipRects ; ) {
489
GLint nr = MIN2( i + RADEON_NR_SAREA_CLIPRECTS, dPriv->numClipRects );
490
drm_clip_rect_t *box = dPriv->pClipRects;
491
drm_clip_rect_t *b = rmesa->radeon.sarea->boxes;
492
drm_radeon_clear_t clear;
493
drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];
496
if (cw != dPriv->w || ch != dPriv->h) {
497
/* clear subregion */
498
for ( ; i < nr ; i++ ) {
501
GLint w = box[i].x2 - x;
502
GLint h = box[i].y2 - y;
504
if ( x < cx ) w -= cx - x, x = cx;
505
if ( y < cy ) h -= cy - y, y = cy;
506
if ( x + w > cx + cw ) w = cx + cw - x;
507
if ( y + h > cy + ch ) h = cy + ch - y;
508
if ( w <= 0 ) continue;
509
if ( h <= 0 ) continue;
519
/* clear whole buffer */
520
for ( ; i < nr ; i++ ) {
526
rmesa->radeon.sarea->nbox = n;
529
clear.clear_color = rmesa->radeon.state.color.clear;
530
clear.clear_depth = rmesa->radeon.state.depth.clear;
531
clear.color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
532
clear.depth_mask = rmesa->radeon.state.stencil.clear;
533
clear.depth_boxes = depth_boxes;
536
b = rmesa->radeon.sarea->boxes;
537
for ( ; n >= 0 ; n-- ) {
538
depth_boxes[n].f[CLEAR_X1] = (float)b[n].x1;
539
depth_boxes[n].f[CLEAR_Y1] = (float)b[n].y1;
540
depth_boxes[n].f[CLEAR_X2] = (float)b[n].x2;
541
depth_boxes[n].f[CLEAR_Y2] = (float)b[n].y2;
542
depth_boxes[n].f[CLEAR_DEPTH] =
543
(float)rmesa->radeon.state.depth.clear;
546
ret = drmCommandWrite( rmesa->radeon.dri.fd, DRM_RADEON_CLEAR,
547
&clear, sizeof(drm_radeon_clear_t));
550
UNLOCK_HARDWARE( &rmesa->radeon );
551
fprintf( stderr, "DRM_RADEON_CLEAR: return = %d\n", ret );
555
UNLOCK_HARDWARE( &rmesa->radeon );
558
381
static void radeonClear( struct gl_context *ctx, GLbitfield mask )
560
383
r100ContextPtr rmesa = R100_CONTEXT(ctx);
561
__DRIdrawable *dPriv = radeon_get_drawable(&rmesa->radeon);
562
384
GLuint flags = 0;
563
GLuint color_mask = 0;
564
385
GLuint orig_mask = mask;
566
387
if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_FRONT_RIGHT)) {
571
392
fprintf( stderr, "radeonClear\n");
575
LOCK_HARDWARE( &rmesa->radeon );
576
UNLOCK_HARDWARE( &rmesa->radeon );
577
if ( dPriv->numClipRects == 0 )
581
395
radeon_firevertices(&rmesa->radeon);
583
397
if ( mask & BUFFER_BIT_FRONT_LEFT ) {
584
398
flags |= RADEON_FRONT;
585
color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
586
399
mask &= ~BUFFER_BIT_FRONT_LEFT;
589
402
if ( mask & BUFFER_BIT_BACK_LEFT ) {
590
403
flags |= RADEON_BACK;
591
color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
592
404
mask &= ~BUFFER_BIT_BACK_LEFT;