pnozz_accel.c revision f55eacde
1/* 2 * SBus Weitek P9100 hardware acceleration support 3 * 4 * Copyright (C) 2005 Michael Lorenz 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * MICHAEL LORENZ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 20 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 */ 23/* $NetBSD: pnozz_accel.c,v 1.3 2021/05/27 04:48:10 jdc Exp $ */ 24 25#ifdef HAVE_CONFIG_H 26#include "config.h" 27#endif 28 29#include "pnozz.h" 30#include "pnozz_regs.h" 31#include "dgaproc.h" 32 33static CARD32 PnozzCopyROP[] = { 34 /*GXclear*/ 0, 35 /*GXand*/ ROP_SRC & ROP_DST, 36 /*GXandReverse*/ ROP_SRC & (~ROP_DST), 37 /*GXcopy*/ ROP_SRC, 38 /*GXandInverted*/ (~ROP_SRC) & ROP_DST, 39 /*GXnoop*/ ROP_DST, 40 /*GXxor*/ ROP_SRC ^ ROP_DST, 41 /*GXor*/ ROP_SRC | ROP_DST, 42 /*GXnor*/ (~ROP_SRC) & (~ROP_DST), 43 /*GXequiv*/ (~ROP_SRC) ^ ROP_DST, 44 /*GXinvert*/ (~ROP_DST), 45 /*GXorReverse*/ ROP_SRC | (~ROP_DST), 46 /*GXcopyInverted*/ (~ROP_SRC), 47 /*GXorInverted*/ (~ROP_SRC) | ROP_DST, 48 /*GXnand*/ (~ROP_SRC) | (~ROP_DST), 49 /*GXset*/ ROP_SET 50}; 51 52static CARD32 PnozzDrawROP[] = { 53 /*GXclear*/ 0, 54 /*GXand*/ ROP_PAT & ROP_DST, 55 /*GXandReverse*/ ROP_PAT & (~ROP_DST), 56 /*GXcopy*/ ROP_PAT, 57 /*GXandInverted*/ (~ROP_PAT) & ROP_DST, 58 /*GXnoop*/ ROP_DST, 59 /*GXxor*/ ROP_PAT ^ ROP_DST, 60 /*GXor*/ ROP_PAT | ROP_DST, 61 /*GXnor*/ (~ROP_PAT) & (~ROP_DST), 62 /*GXequiv*/ (~ROP_PAT) ^ ROP_DST, 63 /*GXinvert*/ (~ROP_DST), 64 /*GXorReverse*/ ROP_PAT | (~ROP_DST), 65 /*GXcopyInverted*/ (~ROP_PAT), 66 /*GXorInverted*/ (~ROP_PAT) | ROP_DST, 67 /*GXnand*/ (~ROP_PAT) | (~ROP_DST), 68 /*GXset*/ ROP_PAT 69}; 70 71/* DGA stuff */ 72 73static Bool Pnozz_OpenFramebuffer(ScrnInfoPtr pScrn, char **, 74 unsigned char **mem, int *, int *, int *); 75static Bool Pnozz_SetMode(ScrnInfoPtr, DGAModePtr); 76static void Pnozz_SetViewport(ScrnInfoPtr, int, int, int); 77static int Pnozz_GetViewport(ScrnInfoPtr); 78static void Pnozz_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); 79static void Pnozz_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); 80 81static void PnozzSync(ScrnInfoPtr); 82 83static DGAFunctionRec Pnozz_DGAFuncs = { 84 Pnozz_OpenFramebuffer, 85 NULL, 86 Pnozz_SetMode, 87 Pnozz_SetViewport, 88 Pnozz_GetViewport, 89 PnozzSync, 90 Pnozz_FillRect, 91 Pnozz_BlitRect, 92 NULL 93}; 94 95 96CARD32 MaxClip, junk; 97 98void 99PnozzSync(ScrnInfoPtr pScrn) 100{ 101 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 102 while((pnozz_read_4(pPnozz, ENGINE_STATUS) & 103 (ENGINE_BUSY | BLITTER_BUSY)) !=0 ); 104} 105 106/* 107 * Both the framebuffer and the colour registers are apparently little endian. 108 * For framebuffer accesses we can just turn on byte swapping, for the colour 109 * registers we need to juggle bytes ourselves. 110 */ 111 112void 113pnozz_write_colour(PnozzPtr pPnozz, int reg, CARD32 colour) 114{ 115 CARD32 c2; 116 117 switch(pPnozz->depthshift) 118 { 119 case 0: 120 c2 = (colour << 8 | colour); 121 pnozz_write_4(pPnozz, reg, c2 << 16 | c2); 122 break; 123 case 1: 124 c2 = ((colour & 0xff) << 8) | ((colour & 0xff00) >> 8); 125 c2 |= c2 << 16; 126 pnozz_write_4(pPnozz, reg, c2); 127 break; 128 case 2: 129 c2 = ((colour & 0x00ff00ff) << 8) | ((colour & 0xff00ff00) >> 8); 130 c2 = (( c2 & 0xffff0000) >> 16) | ((c2 & 0x0000ffff) << 16); 131 pnozz_write_4(pPnozz, reg, c2); 132 break; 133 } 134} 135 136static void unClip(PnozzPtr pPnozz) 137{ 138 pnozz_write_4(pPnozz, WINDOW_OFFSET, 0); 139 pnozz_write_4(pPnozz, WINDOW_MIN, 0); 140 pnozz_write_4(pPnozz, WINDOW_MAX, MaxClip); 141 pnozz_write_4(pPnozz, BYTE_CLIP_MIN, 0); 142 pnozz_write_4(pPnozz, BYTE_CLIP_MAX, MaxClip); 143} 144 145void 146PnozzInitEngine(PnozzPtr pPnozz) 147{ 148 unClip(pPnozz); 149 pnozz_write_4(pPnozz, DRAW_MODE, 0); 150 pnozz_write_4(pPnozz, PLANE_MASK, 0xffffffff); 151 pnozz_write_4(pPnozz, PATTERN0, 0xffffffff); 152 pnozz_write_4(pPnozz, PATTERN1, 0xffffffff); 153 pnozz_write_4(pPnozz, PATTERN2, 0xffffffff); 154 pnozz_write_4(pPnozz, PATTERN3, 0xffffffff); 155} 156 157static void 158PnozzSetupForScreenToScreenCopy( 159 ScrnInfoPtr pScrn, 160 int xdir, 161 int ydir, 162 int rop, 163 unsigned int planemask, 164 int TransparencyColour 165) 166{ 167 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 168 PnozzSync(pScrn); 169 170 pnozz_write_4(pPnozz, RASTER_OP, (PnozzCopyROP[rop] & 0xff)); 171 pnozz_write_4(pPnozz, PLANE_MASK, planemask); 172} 173 174/* 175 * the drawing engine is weird. Even though BLIT and QUAD commands use the 176 * same registers to program coordinates there's an important difference - 177 * horizontal coordinates for QUAD commands are in pixels, for BLIT commands 178 * and the byte clipping registers they're IN BYTES. 179 */ 180static void 181PnozzSubsequentScreenToScreenCopy 182( 183 ScrnInfoPtr pScrn, 184 int xSrc, 185 int ySrc, 186 int xDst, 187 int yDst, 188 int w, 189 int h 190) 191{ 192 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 193 CARD32 src, dst, srcw, dstw; 194 195 src = (((xSrc << pPnozz->depthshift) & 0x1fff) << 16) | (ySrc & 0x1fff); 196 dst = (((xDst << pPnozz->depthshift) & 0x1fff) << 16) | (yDst & 0x1fff); 197 srcw = ((((xSrc + w) << pPnozz->depthshift) - 1) << 16) | 198 ((ySrc + h - 1) & 0x1fff); 199 dstw = ((((xDst + w) << pPnozz->depthshift) - 1) << 16) | 200 ((yDst + h - 1) & 0x1fff); 201 202 PnozzSync(pScrn); 203 204 pnozz_write_4(pPnozz, ABS_XY0, src); 205 pnozz_write_4(pPnozz, ABS_XY1, srcw); 206 pnozz_write_4(pPnozz, ABS_XY2, dst); 207 pnozz_write_4(pPnozz, ABS_XY3, dstw); 208 junk = pnozz_read_4(pPnozz, COMMAND_BLIT); 209} 210 211static void 212PnozzSetupForSolidFill 213( 214 ScrnInfoPtr pScrn, 215 int colour, 216 int rop, 217 unsigned int planemask 218) 219{ 220 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 221 CARD32 c2; 222 223 PnozzSync(pScrn); 224 225 pnozz_write_colour(pPnozz, FOREGROUND_COLOR, colour); 226 pnozz_write_4(pPnozz, RASTER_OP, PnozzDrawROP[rop] & 0xff); 227 pnozz_write_4(pPnozz, PLANE_MASK, planemask); 228 pnozz_write_4(pPnozz, COORD_INDEX, 0); 229} 230 231static void 232PnozzSubsequentSolidFillRect 233( 234 ScrnInfoPtr pScrn, 235 int x, 236 int y, 237 int w, 238 int h 239) 240{ 241 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 242 243 PnozzSync(pScrn); 244 pnozz_write_4(pPnozz, RECT_RTW_XY, ((x & 0x1fff) << 16) | 245 (y & 0x1fff)); 246 pnozz_write_4(pPnozz, RECT_RTP_XY, (((w & 0x1fff) << 16) | 247 (h & 0x1fff))); 248 junk = pnozz_read_4(pPnozz, COMMAND_QUAD); 249} 250 251#ifdef HAVE_XAA_H 252 253static void 254PnozzSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 255 int fg, int bg, 256 int rop, 257 unsigned int planemask) 258{ 259 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 260 261 PnozzSync(pScrn); 262 263 if (bg == -1) { 264 /* transparent */ 265 pnozz_write_colour(pPnozz, FOREGROUND_COLOR, fg); 266 pnozz_write_4(pPnozz, RASTER_OP, PnozzDrawROP[rop] | ROP_PIX1_TRANS); 267 } else { 268 /* 269 * this doesn't make any sense to me either, but for some reason the 270 * chip applies the foreground colour to 0 pixels and background to 1 271 * when set to this sort of ROP. The old XF 3.3 driver source claimed 272 * that the chip doesn't support opaque colour expansion at all. 273 */ 274 pnozz_write_colour(pPnozz, FOREGROUND_COLOR, bg); 275 pnozz_write_colour(pPnozz, BACKGROUND_COLOR, fg); 276 277 pnozz_write_4(pPnozz, RASTER_OP, PnozzCopyROP[rop] & 0xff); 278 } 279 280 pnozz_write_4(pPnozz, PLANE_MASK, planemask); 281 pnozz_write_4(pPnozz, COORD_INDEX, 0); 282} 283 284static void 285PnozzSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 286 int x, int y, int w, int h, 287 int skipleft ) 288{ 289 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 290 CARD32 rest = w & 0x1f; 291 292 pnozz_write_4(pPnozz, ABS_X0, x); 293 pnozz_write_4(pPnozz, ABS_XY1, (x << 16) | (y & 0xFFFFL)); 294 pnozz_write_4(pPnozz, ABS_X2, (x + w)); 295 pnozz_write_4(pPnozz, ABS_Y3, 1); 296 297 pPnozz->words = (w >> 5); /* whole words to write */ 298 299 if (rest > 0) { 300 pPnozz->last_word = (rest - 1) << 2; 301 } else 302 pPnozz->last_word = -1; 303} 304 305static void 306PnozzSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 307{ 308 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 309#define PIXEL_1_FULL (PIXEL_1 + (31 << 2)) 310 CARD32 *buf; 311 volatile CARD32 *pix = ((volatile CARD32 *)(pPnozz->fbc + PIXEL_1_FULL)); 312 int i = 0; 313 314 PnozzSync(pScrn); 315 buf = (CARD32 *)pPnozz->buffers[bufno]; 316 junk = *(volatile CARD32 *)(pPnozz->fb + PIXEL_1_FULL); 317 for (i = 0; i < pPnozz->words; i++) 318 *pix = buf[i]; 319 if (pPnozz->last_word >= 0) 320 *(volatile CARD32 *)(pPnozz->fbc + PIXEL_1 + pPnozz->last_word) = 321 buf[i]; 322} 323 324static void 325PnozzSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, 326 unsigned int planemask) 327{ 328 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 329 330 PnozzSync(pScrn); 331 332 pnozz_write_colour(pPnozz, FOREGROUND_COLOR, color); 333 pnozz_write_4(pPnozz, RASTER_OP, (PnozzDrawROP[rop] & 0xff) | ROP_OVERSIZE); 334 335 pnozz_write_4(pPnozz, PLANE_MASK, planemask); 336 pnozz_write_4(pPnozz, COORD_INDEX, 0); 337 338} 339 340static void 341PnozzSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, int x1, int y1, int x2, 342 int y2, int flags) 343{ 344 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 345 346 PnozzSync(pScrn); 347 348 /* 349 * XXX we're blatantly ignoring the flags parameter which could tell us not 350 * to draw the last point. Xsun simply reads it from the framebuffer and 351 * puts it back after drawing the line but that would mean we have to wait 352 * until the line is actually drawn. On the other hand - line drawing is 353 * pretty fast so we won't lose too much speed 354 */ 355 pnozz_write_4(pPnozz, LINE_RTW_XY, (x1 << 16) | y1); 356 pnozz_write_4(pPnozz, LINE_RTW_XY, (x2 << 16) | y2); 357 junk = pnozz_read_4(pPnozz, COMMAND_QUAD); 358} 359 360static void 361PnozzSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int pat0, int pat1, 362 int fg, int bg, int rop, unsigned int planemask) 363{ 364 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 365 CARD32 pat; 366 367 PnozzSync(pScrn); 368 369 if (bg == -1) { 370 pnozz_write_4(pPnozz, RASTER_OP, 371 (PnozzDrawROP[rop] & 0xff) | ROP_NO_SOLID | ROP_TRANS); 372 } else { 373 pnozz_write_colour(pPnozz, COLOR_0, bg); 374 pnozz_write_4(pPnozz, RASTER_OP, 375 (PnozzDrawROP[rop] & 0xff) | ROP_NO_SOLID); 376 } 377 pnozz_write_colour(pPnozz, COLOR_1, fg); 378 pnozz_write_4(pPnozz, PLANE_MASK, planemask); 379 pat = (pat0 & 0xff000000) | ((pat0 >> 8) & 0x00ffff00) | 380 ((pat0 >> 16) & 0x000000ff); 381 pnozz_write_4(pPnozz, PATTERN0, pat); 382 pat = ((pat0 << 8) & 0x00ffff00) | ((pat0 << 16) & 0xff000000) | 383 (pat0 & 0x000000ff); 384 pnozz_write_4(pPnozz, PATTERN1, pat); 385 pat = (pat1 & 0xff000000) | ((pat1 >> 8) & 0x00ffff00) | 386 ((pat1 >> 16) & 0x000000ff); 387 pnozz_write_4(pPnozz, PATTERN2, pat); 388 pat = ((pat1 << 8) & 0x00ffff00) | ((pat1 << 16) & 0xff000000) | 389 (pat1 & 0x000000ff); 390 pnozz_write_4(pPnozz, PATTERN3, pat); 391 pnozz_write_4(pPnozz, COORD_INDEX, 0); 392} 393 394static void 395PnozzSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, 396 int patx, int paty, int x, int y, int w, int h) 397{ 398 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 399 400 PnozzSync(pScrn); 401 pnozz_write_4(pPnozz, PATTERN_ORIGIN_X, patx); 402 pnozz_write_4(pPnozz, PATTERN_ORIGIN_Y, paty); 403 pnozz_write_4(pPnozz, RECT_RTW_XY, ((x & 0x1fff) << 16) | 404 (y & 0x1fff)); 405 pnozz_write_4(pPnozz, RECT_RTP_XY, (((w & 0x1fff) << 16) | 406 (h & 0x1fff))); 407 junk = pnozz_read_4(pPnozz, COMMAND_QUAD); 408 409} 410 411static void 412PnozzSetClippingRectangle(ScrnInfoPtr pScrn, int left, int top, int right, 413 int bottom) 414{ 415 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 416 CARD32 cmin, cmax; 417 418 cmin = (left << 16) | top; 419 cmax = (right << 16) | bottom; 420 421 pnozz_write_4(pPnozz, WINDOW_MIN, cmin); 422 pnozz_write_4(pPnozz, WINDOW_MAX, cmax); 423 424 cmin = ((left << pPnozz->depthshift) << 16) | top; 425 cmax = ((right << pPnozz->depthshift) << 16) | bottom; 426 427 pnozz_write_4(pPnozz, BYTE_CLIP_MIN, cmin); 428 pnozz_write_4(pPnozz, BYTE_CLIP_MAX, cmax); 429} 430 431static void 432PnozzDisableClipping(ScrnInfoPtr pScrn) 433{ 434 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 435 436 pnozz_write_4(pPnozz, WINDOW_MIN, 0); 437 pnozz_write_4(pPnozz, WINDOW_MAX, MaxClip); 438 pnozz_write_4(pPnozz, BYTE_CLIP_MIN, 0); 439 pnozz_write_4(pPnozz, BYTE_CLIP_MAX, MaxClip); 440} 441 442static void 443PnozzSetupForImageWrite(ScrnInfoPtr pScrn, int rop, unsigned int planemask, 444 int trans_color, int depth, int bpp) 445{ 446 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 447 448 pnozz_write_4(pPnozz, RASTER_OP, PnozzCopyROP[rop] & 0xff); 449 pnozz_write_4(pPnozz, PLANE_MASK, planemask); 450 pnozz_write_4(pPnozz, COORD_INDEX, 0); 451 452 xf86Msg(X_ERROR, "setup for image write\n"); 453} 454 455static void 456PnozzImageWriteRect(ScrnInfoPtr pScrn, int x, int y, int wi, int he, int skip) 457{ 458 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 459 volatile CARD32 junk; 460 461 pnozz_write_4(pPnozz, ABS_X0, x); 462 pnozz_write_4(pPnozz, ABS_XY1, (x << 16) | y); 463 pnozz_write_4(pPnozz, ABS_X2, x + wi); 464 pnozz_write_4(pPnozz, ABS_Y3, 1); 465 junk = *(volatile CARD32 *)(pPnozz->fb + PIXEL_8); 466} 467 468/* 469 * TODO: 470 * - CPU to VRAM colour blits 471 */ 472 473int 474PnozzAccelInit(ScrnInfoPtr pScrn) 475{ 476 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 477 XAAInfoRecPtr pXAAInfo = pPnozz->pXAA; 478 479 pXAAInfo->Flags = LINEAR_FRAMEBUFFER | PIXMAP_CACHE | OFFSCREEN_PIXMAPS; 480 pXAAInfo->maxOffPixWidth = pPnozz->width; 481 pXAAInfo->maxOffPixHeight = pPnozz->maxheight; 482 MaxClip = ((pPnozz->scanlinesize & 0xffff) << 16) | (pPnozz->maxheight); 483 484 PnozzInitEngine(pPnozz); 485 486#if 1 487 { 488 CARD32 src, srcw, junk; 489 src = 0; 490 srcw = pPnozz->width << 16 | pPnozz->height; 491 492 /* Blit the screen black. For aesthetic reasons. */ 493 494 PnozzSync(pScrn); 495 pnozz_write_4(pPnozz, FOREGROUND_COLOR, 0x00000000); 496 pnozz_write_4(pPnozz, BACKGROUND_COLOR, 0xffffffff); 497 pnozz_write_4(pPnozz, RASTER_OP, ROP_PAT); 498 pnozz_write_4(pPnozz, COORD_INDEX, 0); 499 pnozz_write_4(pPnozz, RECT_RTW_XY, src); 500 pnozz_write_4(pPnozz, RECT_RTW_XY, srcw); 501 junk = pnozz_read_4(pPnozz, COMMAND_QUAD); 502 PnozzSync(pScrn); 503 } 504#endif 505 506 /* Sync */ 507 pXAAInfo->Sync = PnozzSync; 508 509 /* Screen-to-screen copy */ 510 pXAAInfo->ScreenToScreenCopyFlags = NO_TRANSPARENCY; 511 pXAAInfo->SetupForScreenToScreenCopy = PnozzSetupForScreenToScreenCopy; 512 pXAAInfo->SubsequentScreenToScreenCopy = 513 PnozzSubsequentScreenToScreenCopy; 514 515 /* Solid fills */ 516 pXAAInfo->SetupForSolidFill = PnozzSetupForSolidFill; 517 pXAAInfo->SubsequentSolidFillRect = PnozzSubsequentSolidFillRect; 518 519 /* colour expansion */ 520 pXAAInfo->ScanlineCPUToScreenColorExpandFillFlags = 521 /*LEFT_EDGE_CLIPPING|*/SCANLINE_PAD_DWORD; 522 pXAAInfo->NumScanlineColorExpandBuffers = 2; 523 pPnozz->buffers[0] = (unsigned char *)pPnozz->Buffer; 524 pPnozz->buffers[1] = (unsigned char *)&pPnozz->Buffer[pPnozz->scanlinesize]; 525 pXAAInfo->ScanlineColorExpandBuffers = pPnozz->buffers; 526 pXAAInfo->SetupForScanlineCPUToScreenColorExpandFill = 527 PnozzSetupForCPUToScreenColorExpandFill; 528 pXAAInfo->SubsequentScanlineCPUToScreenColorExpandFill = 529 PnozzSubsequentScanlineCPUToScreenColorExpandFill; 530 pXAAInfo->SubsequentColorExpandScanline = 531 PnozzSubsequentColorExpandScanline; 532 533 /* line drawing */ 534 pXAAInfo->SetupForSolidLine = PnozzSetupForSolidLine; 535 pXAAInfo->SubsequentSolidTwoPointLine = PnozzSubsequentSolidTwoPointLine; 536 pXAAInfo->SolidLineFlags = BIT_ORDER_IN_BYTE_MSBFIRST; 537 538 /* clipping */ 539 pXAAInfo->SetClippingRectangle = PnozzSetClippingRectangle; 540 pXAAInfo->DisableClipping = PnozzDisableClipping; 541 pXAAInfo->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY | 542 HARDWARE_CLIP_SOLID_FILL | 543 HARDWARE_CLIP_MONO_8x8_FILL | 544 /*HARDWARE_CLIP_COLOR_8x8_FILL |*/ 545 HARDWARE_CLIP_SOLID_LINE; 546 547 /* 8x8 mono pattern fills */ 548 pXAAInfo->Mono8x8PatternFillFlags = HARDWARE_PATTERN_PROGRAMMED_BITS | 549 HARDWARE_PATTERN_SCREEN_ORIGIN | HARDWARE_PATTERN_PROGRAMMED_ORIGIN; 550 pXAAInfo->SetupForMono8x8PatternFill = PnozzSetupForMono8x8PatternFill; 551 pXAAInfo->SubsequentMono8x8PatternFillRect = 552 PnozzSubsequentMono8x8PatternFillRect; 553 554 /* image uploads */ 555 pXAAInfo->ImageWriteBase = pPnozz->fbc + PIXEL_8; 556 pXAAInfo->ImageWriteRange = 4; 557 pXAAInfo->ImageWriteFlags = /*CPU_TRANSFER_BASE_FIXED |*/ CPU_TRANSFER_PAD_DWORD | 558 NO_TRANSPARENCY; 559 pXAAInfo->SetupForImageWrite = PnozzSetupForImageWrite; 560 pXAAInfo->SubsequentImageWriteRect = PnozzImageWriteRect; 561 562 return 0; 563} 564 565#endif /* HAVE_XAA_H */ 566 567Bool 568PnozzDGAInit(ScreenPtr pScreen) 569{ 570 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; 571 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 572 DGAModePtr mode; 573 int result; 574 575 mode = xnfcalloc(sizeof(DGAModeRec), 1); 576 if (mode == NULL) { 577 xf86Msg(X_WARNING, "%s: DGA setup failed, cannot allocate memory\n", 578 pPnozz->psdp->device); 579 return FALSE; 580 } 581 582 mode->mode = pScrn->modes; 583 mode->flags = DGA_PIXMAP_AVAILABLE | DGA_CONCURRENT_ACCESS; 584 if(!pPnozz->NoAccel) { 585 mode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT; 586 } 587 588 mode->imageWidth = mode->pixmapWidth = mode->viewportWidth = 589 pScrn->virtualX; 590 mode->imageHeight = mode->pixmapHeight = mode->viewportHeight = 591 pScrn->virtualY; 592 593 mode->bytesPerScanline = mode->imageWidth; 594 595 mode->byteOrder = pScrn->imageByteOrder; 596 mode->depth = 8; 597 mode->bitsPerPixel = 8; 598 mode->red_mask = pScrn->mask.red; 599 mode->green_mask = pScrn->mask.green; 600 mode->blue_mask = pScrn->mask.blue; 601 602 mode->visualClass = PseudoColor; 603 mode->address = pPnozz->fb; 604 605 result = DGAInit(pScreen, &Pnozz_DGAFuncs, mode, 1); 606 607 if (result) { 608 xf86Msg(X_INFO, "%s: DGA initialized\n", 609 pPnozz->psdp->device); 610 return TRUE; 611 } else { 612 xf86Msg(X_WARNING, "%s: DGA setup failed\n", 613 pPnozz->psdp->device); 614 return FALSE; 615 } 616} 617 618static Bool 619Pnozz_OpenFramebuffer(ScrnInfoPtr pScrn, char **name, 620 unsigned char **mem, 621 int *size, int *offset, 622 int *extra) 623{ 624 PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn); 625 626 *name = pPnozz->psdp->device; 627 628 *mem = (unsigned char*)0; 629 *size = pPnozz->vidmem; 630 *offset = 0; 631 *extra = 0; 632 633 return TRUE; 634} 635 636static Bool 637Pnozz_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode) 638{ 639 /* 640 * Nothing to do, we currently only support one mode 641 * and we are always in it. 642 */ 643 return TRUE; 644} 645 646static void 647Pnozz_SetViewport(ScrnInfoPtr pScrn, int x, int y, int flags) 648{ 649 /* We don't support viewports, so... */ 650} 651 652static int 653Pnozz_GetViewport(ScrnInfoPtr pScrn) 654{ 655 /* No viewports, none pending... */ 656 return 0; 657} 658 659static void 660Pnozz_FillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned long color) 661{ 662 663 PnozzSetupForSolidFill(pScrn, color, GXset, 8); 664 PnozzSubsequentSolidFillRect(pScrn, x, y, w, h); 665} 666 667static void 668Pnozz_BlitRect(ScrnInfoPtr pScrn, int srcx, int srcy, 669 int w, int h, int dstx, int dsty) 670{ 671 672 PnozzSetupForScreenToScreenCopy(pScrn, 0, 0, GXcopy, 8, 0); 673 PnozzSubsequentScreenToScreenCopy(pScrn, srcx, srcy, dstx, dsty, w, h); 674} 675