2
* $Id: ati_draw.c,v 1.36 2005/12/27 08:29:44 ajax Exp $
4
* Copyright ļæ½ 2003 Eric Anholt
6
* Permission to use, copy, modify, distribute, and sell this software and its
7
* documentation for any purpose is hereby granted without fee, provided that
8
* the above copyright notice appear in all copies and that both that
9
* copyright notice and this permission notice appear in supporting
10
* documentation, and that the name of Eric Anholt not be used in
11
* advertising or publicity pertaining to distribution of the software without
12
* specific, written prior permission. Eric Anholt makes no
13
* representations about the suitability of this software for any purpose. It
14
* is provided "as is" without express or implied warranty.
16
* ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18
* EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22
* PERFORMANCE OF THIS SOFTWARE.
24
/* $Header: /cvs/xorg/xserver/xorg/hw/kdrive/ati/ati_draw.c,v 1.36 2005/12/27 08:29:44 ajax Exp $ */
27
#include <kdrive-config.h>
35
CARD8 ATISolidRop[16] = {
36
/* GXclear */ 0x00, /* 0 */
37
/* GXand */ 0xa0, /* src AND dst */
38
/* GXandReverse */ 0x50, /* src AND NOT dst */
39
/* GXcopy */ 0xf0, /* src */
40
/* GXandInverted*/ 0x0a, /* NOT src AND dst */
41
/* GXnoop */ 0xaa, /* dst */
42
/* GXxor */ 0x5a, /* src XOR dst */
43
/* GXor */ 0xfa, /* src OR dst */
44
/* GXnor */ 0x05, /* NOT src AND NOT dst */
45
/* GXequiv */ 0xa5, /* NOT src XOR dst */
46
/* GXinvert */ 0x55, /* NOT dst */
47
/* GXorReverse */ 0xf5, /* src OR NOT dst */
48
/* GXcopyInverted*/ 0x0f, /* NOT src */
49
/* GXorInverted */ 0xaf, /* NOT src OR dst */
50
/* GXnand */ 0x5f, /* NOT src OR NOT dst */
51
/* GXset */ 0xff, /* 1 */
54
CARD8 ATIBltRop[16] = {
55
/* GXclear */ 0x00, /* 0 */
56
/* GXand */ 0x88, /* src AND dst */
57
/* GXandReverse */ 0x44, /* src AND NOT dst */
58
/* GXcopy */ 0xcc, /* src */
59
/* GXandInverted*/ 0x22, /* NOT src AND dst */
60
/* GXnoop */ 0xaa, /* dst */
61
/* GXxor */ 0x66, /* src XOR dst */
62
/* GXor */ 0xee, /* src OR dst */
63
/* GXnor */ 0x11, /* NOT src AND NOT dst */
64
/* GXequiv */ 0x99, /* NOT src XOR dst */
65
/* GXinvert */ 0x55, /* NOT dst */
66
/* GXorReverse */ 0xdd, /* src OR NOT dst */
67
/* GXcopyInverted*/ 0x33, /* NOT src */
68
/* GXorInverted */ 0xbb, /* NOT src OR dst */
69
/* GXnand */ 0x77, /* NOT src OR NOT dst */
70
/* GXset */ 0xff, /* 1 */
74
ATIScreenInfo *accel_atis;
75
/* If is_24bpp is set, then we are using the accelerator in 8-bit mode due
76
* to it being broken for 24bpp, so coordinates have to be multiplied by 3.
79
CARD32 settings, color, src_pitch_offset, dst_pitch_offset;
82
float sample_offsets_x[255];
83
float sample_offsets_y[255];
85
#define DRAW_USING_PACKET3 0
88
ATIDrawSetup(ScreenPtr pScreen)
90
KdScreenPriv(pScreen);
91
ATIScreenInfo(pScreenPriv);
92
ATICardInfo(pScreenPriv);
95
/* XXX: this shouldn't be necessary, but fixes some R128 composite
98
/*if (!atic->is_radeon) {
99
char *mmio = atic->reg_base;
101
MMIO_OUT32(mmio, R128_REG_PC_GUI_MODE,
106
OUT_REG(ATI_REG_DEFAULT_SC_BOTTOM_RIGHT,
107
ATI_DEFAULT_SC_RIGHT_MAX | ATI_DEFAULT_SC_BOTTOM_MAX);
110
if (!atic->is_radeon) {
111
/* Setup for R128 Composite */
113
OUT_REG(R128_REG_SCALE_3D_CNTL,
114
R128_SCALE_3D_TEXMAP_SHADE |
115
R128_SCALE_PIX_REPLICATE |
116
R128_TEX_CACHE_SPLIT |
117
R128_TEX_MAP_ALPHA_IN_TEXTURE |
118
R128_TEX_CACHE_LINE_SIZE_4QW);
119
OUT_REG(R128_REG_SETUP_CNTL,
120
R128_COLOR_SOLID_COLOR |
122
R128_TEXTURE_ST_MULT_W |
123
R128_STARTING_VERTEX_1 |
124
R128_ENDING_VERTEX_3 |
126
OUT_REG(R128_REG_PM4_VC_FPU_SETUP,
129
R128_FRONTFACE_SOLID |
130
R128_FPU_COLOR_SOLID |
131
R128_FPU_SUB_PIX_4BITS |
133
R128_TRAP_BITS_DISABLE |
136
R128_FLAT_SHADE_VERTEX_OGL |
137
R128_FPU_ROUND_TRUNCATE |
139
OUT_REG(R128_REG_PLANE_3D_MASK_C, 0xffffffff);
140
OUT_REG(R128_REG_CONSTANT_COLOR_C, 0xff000000);
141
OUT_REG(R128_REG_WINDOW_XY_OFFSET, 0x00000000);
143
} else if (!atic->is_r300) {
144
/* Setup for R100/R200 Composite */
146
OUT_REG(RADEON_REG_RE_TOP_LEFT, 0);
147
OUT_REG(RADEON_REG_RE_WIDTH_HEIGHT, 0xffffffff);
148
OUT_REG(RADEON_REG_RB3D_PLANEMASK, 0xffffffff);
149
OUT_REG(RADEON_REG_SE_CNTL,
150
RADEON_FFACE_CULL_CCW |
152
RADEON_VTX_PIX_CENTER_OGL);
157
OUT_REG(RADEON_REG_SE_CNTL_STATUS, RADEON_TCL_BYPASS);
158
OUT_REG(RADEON_REG_SE_COORD_FMT,
159
RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
160
RADEON_VTX_ST0_NONPARAMETRIC |
161
RADEON_VTX_ST1_NONPARAMETRIC |
162
RADEON_TEX1_W_ROUTING_USE_W0);
163
OUT_REG(RADEON_REG_RB3D_DSTCACHE_MODE,
164
RADEON_RB3D_DC_2D_CACHE_AUTOFLUSH |
165
RADEON_RB3D_DC_3D_CACHE_AUTOFLUSH);
169
/* XXX: The 0 below should be RADEON_TCL_BYPASS on
172
OUT_REG(R200_REG_SE_VAP_CNTL_STATUS, 0);
173
OUT_REG(R200_REG_PP_CNTL_X, 0);
174
OUT_REG(R200_REG_PP_TXMULTI_CTL_0, 0);
175
OUT_REG(R200_REG_SE_VTX_STATE_CNTL, 0);
176
OUT_REG(R200_REG_RE_CNTL, 0);
177
/* XXX: VTX_ST_DENORMALIZED is illegal for the case of
178
* repeating textures.
180
OUT_REG(R200_REG_SE_VTE_CNTL, R200_VTX_ST_DENORMALIZED);
181
OUT_REG(R200_REG_SE_VAP_CNTL,
182
R200_VAP_FORCE_W_TO_ONE |
183
R200_VAP_VF_MAX_VTX_NUM);
184
OUT_REG(R200_REG_RE_AUX_SCISSOR_CNTL, 0);
185
OUT_REG(RADEON_REG_RB3D_DSTCACHE_MODE,
186
RADEON_RB3D_DC_2D_CACHE_AUTOFLUSH |
187
RADEON_RB3D_DC_3D_CACHE_AUTOFLUSH |
188
R200_RB3D_DC_2D_CACHE_AUTOFREE |
189
R200_RB3D_DC_3D_CACHE_AUTOFREE);
196
ATIWaitMarker(ScreenPtr pScreen, int marker)
198
KdScreenPriv(pScreen);
199
ATIScreenInfo(pScreenPriv);
207
RadeonSwitchTo2D(ATIScreenInfo *atis)
213
OUT_REG(RADEON_REG_RB3D_DSTCACHE_CTLSTAT, RADEON_RB3D_DC_FLUSH);
214
OUT_REG(ATI_REG_WAIT_UNTIL,
215
RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
221
RadeonSwitchTo3D(ATIScreenInfo *atis)
227
OUT_REG(RADEON_REG_RB3D_DSTCACHE_CTLSTAT, RADEON_RB3D_DC_FLUSH);
228
/* We must wait for 3d to idle, in case source was just written as a dest. */
229
OUT_REG(ATI_REG_WAIT_UNTIL,
230
RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
237
ATIEnterDraw (PixmapPtr pPix, char *function)
240
KdScreenPriv(pPix->drawable.pScreen);
243
offset = ((CARD8 *)pPix->devPrivate.ptr -
244
pScreenPriv->screen->memory_base);
246
ErrorF ("Enter %s 0x%x (%dx%dx%d/%d)\n", function, offset,
247
pPix->drawable.width, pPix->drawable.height, pPix->drawable.depth,
248
pPix->drawable.bitsPerPixel);
250
ErrorF ("Enter %s\n", function);
254
ATILeaveDraw (PixmapPtr pPix, char *function)
257
KdScreenPriv(pPix->drawable.pScreen);
260
offset = ((CARD8 *)pPix->devPrivate.ptr -
261
pScreenPriv->screen->memory_base);
263
ErrorF ("Leave %s 0x%x\n", function, offset);
265
ErrorF ("Leave %s\n", function);
269
/* Assumes that depth 15 and 16 can be used as depth 16, which is okay since we
270
* require src and dest datatypes to be equal.
273
ATIGetDatatypeBpp(int bpp, CARD32 *type)
277
*type = R128_DATATYPE_CI8;
280
*type = R128_DATATYPE_RGB565;
283
*type = R128_DATATYPE_CI8;
286
*type = R128_DATATYPE_ARGB8888;
289
ATI_FALLBACK(("Unsupported bpp: %d\n", bpp));
295
ATIGetOffsetPitch(ATIScreenInfo *atis, int bpp, CARD32 *pitch_offset,
296
int offset, int pitch)
298
ATICardInfo *atic = atis->atic;
300
/* On the R128, depending on the bpp the screen can be set up so that it
301
* doesn't meet the pitchAlign requirement but can still be
302
* accelerated, so we check the specific pitch requirement of alignment
305
if (atic->is_radeon) {
306
if (pitch % atis->kaa.pitchAlign != 0)
307
ATI_FALLBACK(("Bad pitch 0x%08x\n", pitch));
308
*pitch_offset = ((pitch >> 6) << 22) | (offset >> 10);
311
if (pitch % bpp != 0)
312
ATI_FALLBACK(("Bad pitch 0x%08x\n", pitch));
313
*pitch_offset = ((pitch / bpp) << 21) | (offset >> 5);
316
if (offset % atis->kaa.offsetAlign != 0)
317
ATI_FALLBACK(("Bad offset 0x%08x\n", offset));
323
ATIGetPixmapOffsetPitch(PixmapPtr pPix, CARD32 *pitch_offset)
325
KdScreenPriv(pPix->drawable.pScreen);
326
ATIScreenInfo(pScreenPriv);
327
CARD32 pitch, offset;
330
bpp = pPix->drawable.bitsPerPixel;
334
offset = ((CARD8 *)pPix->devPrivate.ptr -
335
pScreenPriv->screen->memory_base);
336
pitch = pPix->devKind;
338
return ATIGetOffsetPitch(atis, bpp, pitch_offset, offset, pitch);
342
ATIPrepareSolid(PixmapPtr pPix, int alu, Pixel pm, Pixel fg)
344
KdScreenPriv(pPix->drawable.pScreen);
345
ATIScreenInfo(pScreenPriv);
346
ATICardInfo(pScreenPriv);
350
is_24bpp = (pPix->drawable.bitsPerPixel == 24);
354
/* Solid fills in fake-24bpp mode only work if the pixel color
355
* and planemask are all the same byte.
357
if ((fg & 0xffffff) != (((fg & 0xff) << 16) | ((fg >> 8) &
359
ATI_FALLBACK(("Can't do solid color 0x%08x in 24bpp\n",
361
if ((pm & 0xffffff) != (((pm & 0xff) << 16) | ((pm >> 8) &
363
ATI_FALLBACK(("Can't do planemask 0x%08x in 24bpp\n",
367
if (!ATIGetDatatypeBpp(pPix->drawable.bitsPerPixel, &datatype))
369
if (!ATIGetPixmapOffsetPitch(pPix, &dst_pitch_offset))
375
RadeonSwitchTo2D(atis);
378
ATI_GMC_DST_PITCH_OFFSET_CNTL |
379
ATI_GMC_BRUSH_SOLID_COLOR |
381
ATI_GMC_SRC_DATATYPE_COLOR |
382
(ATISolidRop[alu] << 16) |
383
ATI_GMC_CLR_CMP_CNTL_DIS |
384
R128_GMC_AUX_CLIP_DIS;
387
#if DRAW_USING_PACKET3
389
OUT_REG(ATI_REG_DEFAULT_SC_BOTTOM_RIGHT,
390
ATI_DEFAULT_SC_RIGHT_MAX | ATI_DEFAULT_SC_BOTTOM_MAX);
391
OUT_REG(ATI_REG_DP_WRITE_MASK, pm);
392
OUT_REG(ATI_REG_DP_CNTL, ATI_DST_X_LEFT_TO_RIGHT |
393
ATI_DST_Y_TOP_TO_BOTTOM);
397
OUT_REG(ATI_REG_DEFAULT_SC_BOTTOM_RIGHT,
398
ATI_DEFAULT_SC_RIGHT_MAX | ATI_DEFAULT_SC_BOTTOM_MAX);
399
OUT_REG(ATI_REG_DST_PITCH_OFFSET, dst_pitch_offset);
400
OUT_REG(ATI_REG_DP_GUI_MASTER_CNTL, settings);
401
OUT_REG(ATI_REG_DP_BRUSH_FRGD_CLR, fg);
402
OUT_REG(ATI_REG_DP_WRITE_MASK, pm);
403
OUT_REG(ATI_REG_DP_CNTL, ATI_DST_X_LEFT_TO_RIGHT |
404
ATI_DST_Y_TOP_TO_BOTTOM);
413
ATISolid(int x1, int y1, int x2, int y2)
416
ATIScreenInfo *atis = accel_atis;
423
#if DRAW_USING_PACKET3
425
OUT_RING(DMA_PACKET3(ATI_CCE_PACKET3_PAINT_MULTI, 5));
427
OUT_RING(dst_pitch_offset);
429
OUT_RING((x1 << 16) | y1);
430
OUT_RING(((x2 - x1) << 16) | (y2 - y1));
434
OUT_RING(DMA_PACKET0(ATI_REG_DST_Y_X, 2));
435
OUT_RING_REG(ATI_REG_DST_Y_X, (y1 << 16) | x1);
436
OUT_RING_REG(ATI_REG_DST_HEIGHT_WIDTH, ((y2 - y1) << 16) | (x2 - x1));
450
ATIPrepareCopy(PixmapPtr pSrc, PixmapPtr pDst, int dx, int dy, int alu, Pixel pm)
452
KdScreenPriv(pDst->drawable.pScreen);
453
ATIScreenInfo(pScreenPriv);
454
ATICardInfo(pScreenPriv);
460
is_24bpp = pDst->drawable.bitsPerPixel == 24;
463
if (is_24bpp && ((pm & 0xffffff) != (((pm & 0xff) << 16) | ((pm >> 8) &
465
ATI_FALLBACK(("Can't do planemask 0x%08x in 24bpp\n", pm));
467
if (!ATIGetDatatypeBpp(pDst->drawable.bitsPerPixel, &datatype))
469
if (!ATIGetPixmapOffsetPitch(pSrc, &src_pitch_offset))
471
if (!ATIGetPixmapOffsetPitch(pDst, &dst_pitch_offset))
476
RadeonSwitchTo2D(atis);
479
ATI_GMC_SRC_PITCH_OFFSET_CNTL |
480
ATI_GMC_DST_PITCH_OFFSET_CNTL |
483
ATI_GMC_SRC_DATATYPE_COLOR |
484
(ATIBltRop[alu] << 16) |
485
ATI_DP_SRC_SOURCE_MEMORY |
486
ATI_GMC_CLR_CMP_CNTL_DIS |
487
R128_GMC_AUX_CLIP_DIS;
489
#if DRAW_USING_PACKET3
491
OUT_REG(ATI_REG_DEFAULT_SC_BOTTOM_RIGHT,
492
ATI_DEFAULT_SC_RIGHT_MAX | ATI_DEFAULT_SC_BOTTOM_MAX);
493
OUT_REG(ATI_REG_DP_WRITE_MASK, pm);
494
OUT_REG(ATI_REG_DP_CNTL,
495
(dx >= 0 ? ATI_DST_X_LEFT_TO_RIGHT : 0) |
496
(dy >= 0 ? ATI_DST_Y_TOP_TO_BOTTOM : 0));
501
OUT_REG(ATI_REG_DEFAULT_SC_BOTTOM_RIGHT,
502
ATI_DEFAULT_SC_RIGHT_MAX | ATI_DEFAULT_SC_BOTTOM_MAX);
503
OUT_REG(ATI_REG_SRC_PITCH_OFFSET, src_pitch_offset);
504
OUT_REG(ATI_REG_DST_PITCH_OFFSET, dst_pitch_offset);
505
OUT_REG(ATI_REG_DP_GUI_MASTER_CNTL, settings);
506
OUT_REG(ATI_REG_DP_WRITE_MASK, pm);
507
OUT_REG(ATI_REG_DP_CNTL,
508
(dx >= 0 ? ATI_DST_X_LEFT_TO_RIGHT : 0) |
509
(dy >= 0 ? ATI_DST_Y_TOP_TO_BOTTOM : 0));
518
ATICopy(int srcX, int srcY, int dstX, int dstY, int w, int h)
520
ATIScreenInfo *atis = accel_atis;
529
#if !DRAW_USING_PACKET3
541
#if DRAW_USING_PACKET3
543
OUT_RING(DMA_PACKET3(ATI_CCE_PACKET3_BITBLT_MULTI, 6));
545
OUT_RING(src_pitch_offset);
546
OUT_RING(dst_pitch_offset);
547
OUT_RING((srcX << 16) | srcY);
548
OUT_RING((dstX << 16) | dstY);
549
OUT_RING((w << 16) | h);
553
OUT_RING(DMA_PACKET0(ATI_REG_SRC_Y_X, 3));
554
OUT_RING_REG(ATI_REG_SRC_Y_X, (srcY << 16) | srcX);
555
OUT_RING_REG(ATI_REG_DST_Y_X, (dstY << 16) | dstX);
556
OUT_RING_REG(ATI_REG_DST_HEIGHT_WIDTH, (h << 16) | w);
567
ATIUploadToScreen(PixmapPtr pDst, char *src, int src_pitch)
569
ScreenPtr pScreen = pDst->drawable.pScreen;
570
KdScreenPriv(pScreen);
571
ATIScreenInfo(pScreenPriv);
572
ATICardInfo(pScreenPriv);
573
int width, height, bpp, i, dwords;
574
int dst_pitch, dst_offset;
575
CARD32 dst_pitch_offset, datatype;
582
/* XXX: Hostdata uploads aren't working yet. */
585
dst_offset = ((CARD8 *)pDst->devPrivate.ptr -
586
pScreenPriv->screen->memory_base);
587
dst_pitch = pDst->devKind;
588
width = pDst->drawable.width;
589
height = pDst->drawable.height;
590
bpp = pDst->drawable.bitsPerPixel;
592
success = ATIGetDatatypeBpp(bpp, &datatype);
600
if (!ATIGetOffsetPitch(atis, bpp, &dst_pitch_offset, dst_offset,
604
if (src_pitch != (width * bpp / 8))
607
/* No PACKET3 packets when in PIO mode. */
611
dwords = (width * height * (bpp / 8) + 3) / 4;
613
/* Flush pixel cache so nothing being written to the destination
614
* previously gets mixed up with the hostdata blit.
616
if (atic->is_radeon) {
618
OUT_REG(RADEON_REG_RB3D_DSTCACHE_CTLSTAT, RADEON_RB3D_DC_FLUSH);
619
OUT_REG(ATI_REG_WAIT_UNTIL,
620
RADEON_WAIT_2D_IDLECLEAN |
621
RADEON_WAIT_3D_IDLECLEAN |
622
RADEON_WAIT_HOST_IDLECLEAN);
626
OUT_REG(R128_REG_PC_GUI_CTLSTAT,
627
R128_PC_FLUSH_GUI | R128_PC_RI_GUI);
632
OUT_RING(DMA_PACKET3(ATI_CCE_PACKET3_HOSTDATA_BLT, 7 + dwords));
633
OUT_RING(ATI_GMC_DST_PITCH_OFFSET_CNTL |
636
ATI_GMC_SRC_DATATYPE_COLOR |
637
(ATISolidRop[GXcopy] << 16) |
638
ATI_DP_SRC_SOURCE_HOST_DATA |
639
ATI_GMC_CLR_CMP_CNTL_DIS |
640
R128_GMC_AUX_CLIP_DIS |
642
OUT_RING(dst_pitch_offset);
643
OUT_RING(0xffffffff);
644
OUT_RING(0xffffffff);
645
OUT_RING((0 << 16) | 0);
646
OUT_RING((height << 16) | width);
650
for (i = 0; i < dwords; i++) {
652
OUT_RING(((CARD32 *)src)[i]);
656
if (atic->is_radeon) {
658
OUT_REG(RADEON_REG_RB3D_DSTCACHE_CTLSTAT,
659
RADEON_RB3D_DC_FLUSH_ALL);
660
OUT_REG(ATI_REG_WAIT_UNTIL,
661
RADEON_WAIT_2D_IDLECLEAN |
662
RADEON_WAIT_HOST_IDLECLEAN);
666
OUT_REG(R128_REG_PC_GUI_CTLSTAT, R128_PC_FLUSH_GUI);
670
kaaMarkSync(pScreen);
672
ErrorF("hostdata upload %d,%d %dbpp\n", width, height, bpp);
679
ATIUploadToScratch(PixmapPtr pSrc, PixmapPtr pDst)
681
KdScreenPriv(pSrc->drawable.pScreen);
682
ATICardInfo(pScreenPriv);
683
ATIScreenInfo(pScreenPriv);
684
int dst_pitch, src_pitch, w, i, size, bytes;
685
unsigned char *dst, *src;
689
/* Align width to log 2, useful for R128 composite. This should be a
690
* KAA flag we check for (and supported in kaa.c in general) since many
691
* older bits of hardware are going to want POT pitches.
693
w = pSrc->drawable.width;
694
if (atis->kaa.flags & KAA_OFFSCREEN_ALIGN_POT)
695
w = 1 << (ATILog2(w - 1) + 1);
696
dst_pitch = (w * pSrc->drawable.bitsPerPixel / 8 +
697
atis->kaa.pitchAlign - 1) & ~(atis->kaa.pitchAlign - 1);
699
size = dst_pitch * pSrc->drawable.height;
700
if (size > atis->scratch_area->size)
701
ATI_FALLBACK(("Pixmap too large for scratch (%d,%d)\n",
702
pSrc->drawable.width, pSrc->drawable.height));
704
atis->scratch_next = (atis->scratch_next + atis->kaa.offsetAlign - 1) &
705
~(atis->kaa.offsetAlign - 1);
706
if (atis->scratch_next + size > atis->scratch_area->offset +
707
atis->scratch_area->size) {
708
/* Only sync when we've used all of the scratch area. */
709
kaaWaitSync(pSrc->drawable.pScreen);
710
atis->scratch_next = atis->scratch_area->offset;
712
memcpy(pDst, pSrc, sizeof(*pDst));
713
pDst->devKind = dst_pitch;
714
pDst->devPrivate.ptr = pScreenPriv->screen->memory_base +
716
atis->scratch_next += size;
718
src = pSrc->devPrivate.ptr;
719
src_pitch = pSrc->devKind;
720
dst = pDst->devPrivate.ptr;
721
bytes = src_pitch < dst_pitch ? src_pitch : dst_pitch;
723
i = pSrc->drawable.height;
725
memcpy(dst, src, bytes);
730
/* Flush the pixel cache */
731
if (atic->is_radeon) {
733
OUT_REG(RADEON_REG_RB3D_DSTCACHE_CTLSTAT,
734
RADEON_RB3D_DC_FLUSH_ALL);
735
OUT_REG(ATI_REG_WAIT_UNTIL, RADEON_WAIT_HOST_IDLECLEAN);
739
OUT_REG(R128_REG_PC_GUI_CTLSTAT, R128_PC_FLUSH_ALL);
748
ATIBlockHandler(pointer blockData, OSTimePtr timeout, pointer readmask)
750
ScreenPtr pScreen = (ScreenPtr) blockData;
751
KdScreenPriv(pScreen);
752
ATIScreenInfo(pScreenPriv);
754
/* When the server is going to sleep, make sure that all DMA data has
757
if (atis->indirectBuffer)
758
ATIFlushIndirect(atis, 1);
762
ATIWakeupHandler(pointer blockData, int result, pointer readmask)
767
ATIDrawInit(ScreenPtr pScreen)
769
KdScreenPriv(pScreen);
770
ATIScreenInfo(pScreenPriv);
771
ATICardInfo(pScreenPriv);
773
ErrorF("Screen: %d/%d depth/bpp\n", pScreenPriv->screen->fb[0].depth,
774
pScreenPriv->screen->fb[0].bitsPerPixel);
776
RegisterBlockAndWakeupHandlers(ATIBlockHandler, ATIWakeupHandler,
780
atis->using_dri = ATIDRIScreenInit(pScreen);
783
memset(&atis->kaa, 0, sizeof(KaaScreenInfoRec));
784
atis->kaa.waitMarker = ATIWaitMarker;
785
atis->kaa.PrepareSolid = ATIPrepareSolid;
786
atis->kaa.Solid = ATISolid;
787
atis->kaa.DoneSolid = ATIDoneSolid;
788
atis->kaa.PrepareCopy = ATIPrepareCopy;
789
atis->kaa.Copy = ATICopy;
790
atis->kaa.DoneCopy = ATIDoneCopy;
791
/* Other acceleration will be hooked in in DrawEnable depending on
792
* what type of DMA gets initialized.
795
atis->kaa.flags = KAA_OFFSCREEN_PIXMAPS;
796
if (atic->is_radeon) {
797
atis->kaa.offsetAlign = 1024;
798
atis->kaa.pitchAlign = 64;
800
/* Rage 128 compositing wants power-of-two pitches. */
801
atis->kaa.flags |= KAA_OFFSCREEN_ALIGN_POT;
802
atis->kaa.offsetAlign = 32;
803
/* Pitch alignment is in sets of 8 pixels, and we need to cover
804
* 32bpp, so 32 bytes.
806
atis->kaa.pitchAlign = 32;
809
kaaInitTrapOffsets(8, sample_offsets_x, sample_offsets_y, 0.0, 0.0);
810
sample_count = (1 << 8) - 1;
812
if (!kaaDrawInit(pScreen, &atis->kaa))
819
ATIScratchSave(ScreenPtr pScreen, KdOffscreenArea *area)
821
KdScreenPriv(pScreen);
822
ATIScreenInfo(pScreenPriv);
824
atis->scratch_area = NULL;
828
ATIDrawEnable(ScreenPtr pScreen)
830
KdScreenPriv(pScreen);
831
ATIScreenInfo(pScreenPriv);
832
ATICardInfo(pScreenPriv);
834
ATIDMASetup(pScreen);
835
ATIDrawSetup(pScreen);
837
atis->scratch_area = NULL;
838
atis->kaa.PrepareBlend = NULL;
839
atis->kaa.Blend = NULL;
840
atis->kaa.DoneBlend = NULL;
841
atis->kaa.CheckComposite = NULL;
842
atis->kaa.PrepareComposite = NULL;
843
atis->kaa.Composite = NULL;
844
atis->kaa.DoneComposite = NULL;
845
atis->kaa.UploadToScreen = NULL;
846
atis->kaa.UploadToScratch = NULL;
848
/* We can't dispatch 3d commands in PIO mode. */
849
if (!atis->using_pio) {
850
if (!atic->is_radeon) {
851
atis->kaa.CheckComposite = R128CheckComposite;
852
atis->kaa.PrepareComposite = R128PrepareComposite;
853
atis->kaa.Composite = R128Composite;
854
atis->kaa.DoneComposite = R128DoneComposite;
855
} else if (atic->is_r100) {
856
atis->kaa.CheckComposite = R100CheckComposite;
857
atis->kaa.PrepareComposite = R100PrepareComposite;
858
atis->kaa.Composite = RadeonComposite;
859
atis->kaa.DoneComposite = RadeonDoneComposite;
860
} else if (atic->is_r200) {
861
atis->kaa.CheckComposite = R200CheckComposite;
862
atis->kaa.PrepareComposite = R200PrepareComposite;
863
atis->kaa.Composite = RadeonComposite;
864
atis->kaa.DoneComposite = RadeonDoneComposite;
868
if (atis->using_dri) {
869
if (!atic->is_radeon) {
870
/*atis->kaa.PrepareTrapezoids = R128PrepareTrapezoids;
871
atis->kaa.Trapezoids = R128Trapezoids;
872
atis->kaa.DoneTrapezoids = R128DoneTrapezoids;*/
873
} else if (atic->is_r100 || atic->is_r200) {
874
atis->kaa.PrepareTrapezoids = RadeonPrepareTrapezoids;
875
atis->kaa.Trapezoids = RadeonTrapezoids;
876
atis->kaa.DoneTrapezoids = RadeonDoneTrapezoids;
881
atis->kaa.UploadToScreen = ATIUploadToScreen;
883
/* Reserve a scratch area. It'll be used for storing glyph data during
884
* Composite operations, because glyphs aren't in real pixmaps and thus
887
atis->scratch_area = KdOffscreenAlloc(pScreen, 131072,
888
atis->kaa.offsetAlign, TRUE, ATIScratchSave, atis);
889
if (atis->scratch_area != NULL) {
890
atis->scratch_next = atis->scratch_area->offset;
891
atis->kaa.UploadToScratch = ATIUploadToScratch;
894
kaaMarkSync(pScreen);
898
ATIDrawDisable(ScreenPtr pScreen)
901
ATIDMATeardown(pScreen);
905
ATIDrawFini(ScreenPtr pScreen)
908
KdScreenPriv(pScreen);
909
ATIScreenInfo(pScreenPriv);
910
if (atis->using_dri) {
911
ATIDRICloseScreen(pScreen);
912
atis->using_dri = FALSE;
916
RemoveBlockAndWakeupHandlers(ATIBlockHandler, ATIWakeupHandler,
919
kaaDrawFini(pScreen);