accelX.c revision bdcaa8d0
1/* 2 * file accelX.c 3 * 4 * accelerator functions for X 5 */ 6/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/rendition/accelX.c,v 1.10 2001/06/15 21:22:54 dawes Exp $ */ 7 8#ifdef HAVE_CONFIG_H 9#include "config.h" 10#endif 11 12/* 13 * includes 14 */ 15 16#include "rendition.h" 17#include "accel.h" 18#include "vboard.h" 19#include "vmodes.h" 20#include "vos.h" 21#include "v1kregs.h" 22#include "v1krisc.h" 23#include "v2kregs.h" 24#include "cmd2d.h" 25#include "vloaduc.h" 26 27#undef DEBUG 28 29/* 30 * defines 31 */ 32 33#define waitfifo(size) do { int _c=0; \ 34 while ((_c++<0xfffff)&&((verite_in8(iob+FIFOINFREE)&0x1f)<size)) /* if(!(_c%0xffff))ErrorF("#1# !0x%x! -- ",verite_in8(iob+FIFOINFREE)) */; \ 35 if (_c >= 0xfffff) { \ 36 ErrorF("RENDITION: Input fifo full (1) FIFO in == %d\n",verite_in8(iob+FIFOINFREE)&0x1f); \ 37 return; \ 38 } \ 39 } while (0) 40 41#define waitfifo2(size, rv) do { int _c=0; \ 42 while ((_c++<0xfffff)&&((verite_in8(iob+FIFOINFREE)&0x1f)<size)) /* if(!(_c%0xffff))ErrorF("#2# !0x%x! -- ",verite_in8(iob+FIFOINFREE)) */; \ 43 if (_c >= 0xfffff) { \ 44 ErrorF("RENDITION: Input fifo full (2) FIFO in ==%d\n",verite_in8(iob+FIFOINFREE)&0x1f); \ 45 RENDITIONAccelNone(pScreenInfo); \ 46 pRendition->board.accel=0; \ 47 return rv; \ 48 } \ 49 } while (0) 50 51#define P1(x) ((vu32)x) 52#define P2(x, y) ((((vu16)x)<<16)+((vu16)y)) 53 54/* 55 * local function prototypes 56 */ 57 58void RENDITIONSaveUcode(ScrnInfoPtr pScreenInfo); 59void RENDITIONRestoreUcode(ScrnInfoPtr pScreenInfo); 60 61void RENDITIONSyncV1000(ScrnInfoPtr pScreenInfo); 62 63void RENDITIONSetupForScreenToScreenCopy(ScrnInfoPtr pScreenInfo, 64 int xdir, int ydir, int rop, 65 unsigned int planemask, 66 int trans_color); 67 68void RENDITIONSubsequentScreenToScreenCopy(ScrnInfoPtr pScreenInfo, 69 int srcX, int srcY, 70 int dstX, int dstY, 71 int w, int h); 72 73 74void RENDITIONSetupForSolidFill(ScrnInfoPtr pScreenInfo, 75 int color, int rop, 76 unsigned int planemask); 77 78 79void RENDITIONSubsequentSolidFillRect(ScrnInfoPtr pScreenInfo, 80 int x, int y, int w, int h); 81 82 83void RENDITIONSubsequentTwoPointLine(ScrnInfoPtr pScreenInfo, 84 int x1, int y1, 85 int x2, int y2, 86 int bias); 87 88 89/* 90 * global data 91 */ 92 93static int Rop2Rop[]={ 94 ROP_ALLBITS0, ROP_AND_SD, ROP_AND_SND, ROP_S, 95 /* GXclear, GXand, GXandReverse, GXcopy, */ 96 ROP_AND_NSD, ROP_D, ROP_XOR_SD, ROP_OR_SD, 97 /* GXandInverted, GXnoop, GXxor, GXor, */ 98 ROP_NOR_SD, ROP_S, ROP_NOT_D, ROP_NOT_S, 99 /* suppose I have some problems understanding what invert and revers means <ml> 100 ROP_NOR_SD, ROP_S, ROP_NOT_S, ROP_NOT_D, */ 101 /* GXnor, GXequiv, GXinvert, GXorReverse, */ 102 ROP_NOT_S, ROP_XNOR_SD, ROP_NAND_SD, ROP_ALLBITS1 }; 103 /* GXcopyInverted, GXorInverted, GXnand, GXset */ 104 105 106 107/* 108 * functions 109 */ 110 111void 112RENDITIONAccelPreInit(ScrnInfoPtr pScreenInfo) 113{ 114 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 115 116#ifdef DEBUG 117 ErrorF("RENDITION: RENDITIONAccelPreInit called\n"); 118 sleep(1); 119#endif 120#if 1 121 if (RENDITIONLoadUcode(pScreenInfo)){ 122 ErrorF ("RENDITION: AccelPreInit - Warning. Loading of microcode failed!!\n"); 123 } 124#endif 125 pRendition->board.fbOffset += MC_SIZE; 126 127#ifdef DEBUG 128 ErrorF("RENDITION: Offset is now %d\n",pRendition->board.fbOffset); 129 sleep(2); 130#endif 131 132} 133 134void 135RENDITIONAccelXAAInit(ScreenPtr pScreen) 136{ 137 ScrnInfoPtr pScreenInfo = xf86Screens[pScreen->myNum]; 138 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 139 XAAInfoRecPtr pXAAinfo; 140 141 BoxRec AvailFBArea; 142 143#ifdef DEBUG 144 ErrorF("RENDITION: RENDITIONAccelInit called\n"); 145 sleep(2); 146#endif 147 148 pRendition->AccelInfoRec = pXAAinfo = XAACreateInfoRec(); 149 150 if(!pXAAinfo){ 151 xf86DrvMsg(pScreenInfo->scrnIndex,X_ERROR, 152 ("Failed to set up XAA structure!\n")); 153 return; 154 } 155 156 /* Here we fill in the XAA callback names */ 157 /* Sync is the only compulsary function */ 158 pXAAinfo->Sync = RENDITIONSyncV1000; 159 160 /* Here are the other functions & flags */ 161 pXAAinfo->Flags=DO_NOT_BLIT_STIPPLES| 162 LINEAR_FRAMEBUFFER| 163 PIXMAP_CACHE| 164 OFFSCREEN_PIXMAPS; 165 166 /* screen to screen copy */ 167#if 1 168 pXAAinfo->CopyAreaFlags=NO_TRANSPARENCY| 169 ONLY_TWO_BITBLT_DIRECTIONS; 170 pXAAinfo->SetupForScreenToScreenCopy= 171 RENDITIONSetupForScreenToScreenCopy; 172 pXAAinfo->SubsequentScreenToScreenCopy= 173 RENDITIONSubsequentScreenToScreenCopy; 174#endif 175 176#if 0 177 /* solid filled rectangles */ 178 pXAAinfo->SetupForSolidFill= 179 RENDITIONSetupForSolidFill; 180 pXAAinfo->SubsequentSolidFillRect= 181 RENDITIONSubsequentSolidFillRect; 182 183 /* line */ 184 xf86AccelInfoRec.SubsequentTwoPointLine = 185 RENDITIONSubsequentTwoPointLine; 186#endif /* #if 0 */ 187 188 verite_check_csucode(pScreenInfo); 189 190 if (RENDITIONLoadUcode(pScreenInfo)) return; 191 if (RENDITIONInitUcode(pScreenInfo)) return; 192 193 verite_check_csucode(pScreenInfo); 194 195 /* the remaining code was copied from s3verite_accel.c. 196 * we need to check it if it is suitable <ml> */ 197 198 /* make sure offscreen pixmaps aren't bigger than our address space */ 199 pXAAinfo->maxOffPixWidth = 2048; 200 pXAAinfo->maxOffPixHeight = 2048; 201 202 203 /* 204 * Finally, we set up the video memory space available to the pixmap 205 * cache. In this case, all memory from the end of the virtual screen to 206 * the end of video memory minus 64K (and any other memory which we 207 * already reserved like HW-Cursor), can be used. 208 */ 209 210 pXAAinfo->PixmapCacheFlags = DO_NOT_BLIT_STIPPLES; 211 AvailFBArea.x1 = 0; 212 AvailFBArea.y1 = 0; 213 AvailFBArea.x2 = pScreenInfo->displayWidth; 214 AvailFBArea.y2 = (((pScreenInfo->videoRam*1024) - 215 pRendition->board.fbOffset) / 216 ((pScreenInfo->displayWidth * pScreenInfo->bitsPerPixel) 217 / 8)); 218 xf86InitFBManager(pScreen, &AvailFBArea); 219 220 XAAInit(pScreen, pXAAinfo); 221 222 pRendition->board.accel=1; 223 224#ifdef DEBUG 225 ErrorF("RENDITION: RENDITIONAccelInit End\n"); 226 sleep(2); 227#endif 228} 229 230 231 232void 233RENDITIONAccelNone(ScrnInfoPtr pScreenInfo) 234{ 235 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 236 XAAInfoRecPtr pXAAinfo=pRendition->AccelInfoRec; 237 238#ifdef DEBUG 239 ErrorF("RENDITION: RENDITIONAccelNone called\n"); 240#endif 241 pXAAinfo->Flags=0; 242 pXAAinfo->Sync=NULL; 243 pXAAinfo->SetupForScreenToScreenCopy=NULL; 244 pXAAinfo->SubsequentScreenToScreenCopy=NULL; 245 pXAAinfo->SetupForSolidFill=NULL; 246 pXAAinfo->SubsequentSolidFillRect=NULL; 247 248#if 0 249 pXAAinfo->SubsequentTwoPointLine=NULL; 250#endif 251 252 XAADestroyInfoRec(pRendition->AccelInfoRec); 253 pRendition->AccelInfoRec=NULL; 254} 255 256 257 258int 259RENDITIONLoadUcode(ScrnInfoPtr pScreenInfo) 260{ 261 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 262 263 static int ucode_loaded=0; 264 265#ifdef DEBUG 266 ErrorF("RENDITION: RENDITIONLoadUcode called\n"); 267#endif 268 269 /* load or restore ucode */ 270 if (!ucode_loaded) { 271 if (0 != verite_initboard(pScreenInfo)) { 272 RENDITIONAccelNone(pScreenInfo); 273 pRendition->board.accel=0; 274 return 1; 275 } 276 RENDITIONSaveUcode(pScreenInfo); 277 } 278 else 279 RENDITIONRestoreUcode(pScreenInfo); 280 281 ErrorF ("Rendition: Ucode successfully %s\n", 282 (ucode_loaded ? "restored" : "loaded")); 283 284 ucode_loaded=1; 285 return 0; 286} 287 288 289int 290RENDITIONInitUcode(ScrnInfoPtr pScreenInfo) 291{ 292 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 293 IOADDRESS iob = pRendition->board.io_base; 294 295 if (0 == verite_getstride(pScreenInfo, NULL, 296 &pRendition->board.mode.stride0, 297 &pRendition->board.mode.stride1)) { 298 xf86DrvMsg(pScreenInfo->scrnIndex,X_ERROR, 299 ("Acceleration for this resolution not available\n")); 300 RENDITIONAccelNone(pScreenInfo); 301 pRendition->board.accel=0; 302 return 1; 303 } 304 else 305 ErrorF ("Rendition: Stride 0: %d, stride 1: %d\n", 306 pRendition->board.mode.stride0, 307 pRendition->board.mode.stride1); 308 309 /* NOTE: for 1152x864 only! 310 stride0=6; 311 stride1=1; 312 */ 313 314#ifdef DEBUG 315 ErrorF("#InitUcode(1)# FIFOIN_FREE 0x%x -- \n",verite_in8(iob+FIFOINFREE)); 316#endif 317 318 /* init the ucode */ 319 320 /* ... and start accelerator */ 321 v1k_flushicache(pScreenInfo); 322 v1k_start(pScreenInfo, pRendition->board.csucode_base); 323 324#ifdef DEBUG 325 ErrorF("#InitUcode(2)# FIFOIN_FREE 0x%x -- \n",verite_in8(iob+FIFOINFREE)); 326#endif 327 328 verite_out32(iob, 0); /* a0 - ucode init command */ 329 verite_out32(iob, 0); /* a1 - 1024 byte context store area */ 330 verite_out32(iob, 0); /* a2 */ 331 verite_out32(iob, pRendition->board.ucode_entry); 332 333#ifdef DEBUG 334 ErrorF("#InitUcode(3)# FIFOIN_FREE 0x%x -- \n",verite_in8(iob+FIFOINFREE)); 335#endif 336 337 waitfifo2(6, 1); 338 339#ifdef DEBUG 340 ErrorF("#InitUcode(4)# FIFOIN_FREE 0x%x -- \n",verite_in8(iob+FIFOINFREE)); 341#endif 342 343 verite_out32(iob, CMD_SETUP); 344 verite_out32(iob, P2(pRendition->board.mode.virtualwidth, 345 pRendition->board.mode.virtualheight)); 346 verite_out32(iob, P2(pRendition->board.mode.bitsperpixel, 347 pRendition->board.mode.pixelformat)); 348 verite_out32(iob, MC_SIZE); 349 350 verite_out32(iob, (pRendition->board.mode.virtualwidth)* 351 (pRendition->board.mode.bitsperpixel>>3)); 352 verite_out32(iob, (pRendition->board.mode.stride1<<12)| 353 (pRendition->board.mode.stride0<<8)); 354 355#ifdef DEBUG 356 ErrorF("#InitUcode(5)# FIFOIN_FREE 0x%x -- \n",verite_in8(iob+FIFOINFREE)); 357#endif 358 359#if 0 360 verite_out32(iob+0x60, 129); 361 ErrorF("RENDITION: PC at %x\n", verite_in32(iob+0x64)); 362#endif 363 364 return 0; 365} 366 367void 368RENDITIONRestoreUcode(ScrnInfoPtr pScreenInfo) 369{ 370 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 371 IOADDRESS iob = pRendition->board.io_base; 372 373 vu8 memend; 374 375#ifdef DEBUG 376 ErrorF("RENDITION: RENDITIONRestoreUcode called\n"); 377#endif 378 379#ifdef DEBUG 380 ErrorF("Restore...1\n"); 381 sleep(2); 382#endif 383 384 v1k_stop(pScreenInfo); 385 memend=verite_in8(iob+MEMENDIAN); 386 verite_out8(iob+MEMENDIAN, MEMENDIAN_NO); 387#if 1 388 memcpy(pRendition->board.vmem_base, pRendition->board.ucode_buffer, MC_SIZE); 389#else 390 /* SlowBcopy has inverted src and dst */ 391 xf86SlowBcopy(pRendition->board.ucode_buffer,pRendition->board.vmem_base,MC_SIZE); 392#endif 393 verite_out8(iob+MEMENDIAN, memend); 394 395 v1k_flushicache(pScreenInfo); 396 v1k_start(pScreenInfo, pRendition->board.csucode_base); 397 verite_out32(iob, 0); /* a0 - ucode init command */ 398 verite_out32(iob, 0); /* a1 - 1024 byte context store area */ 399 verite_out32(iob, 0); /* a2 */ 400 verite_out32(iob, pRendition->board.ucode_entry); 401 402#if 0 403 verite_out32(iob+0x60, 129); 404 ErrorF("RENDITION: PC at %x\n", verite_in32(iob+0x64)); 405#endif 406} 407 408 409 410void 411RENDITIONSaveUcode(ScrnInfoPtr pScreenInfo) 412{ 413 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 414 IOADDRESS iob = pRendition->board.io_base; 415 vu8 memend; 416 417#ifdef DEBUG 418 ErrorF("RENDITION: RENDITIONSaveUcode called\n"); 419 sleep(2); 420#endif 421 422 v1k_stop(pScreenInfo); 423 memend=verite_in8(iob+MEMENDIAN); 424 verite_out8(iob+MEMENDIAN, MEMENDIAN_NO); 425 426#if 1 427 memcpy(pRendition->board.ucode_buffer, pRendition->board.vmem_base, MC_SIZE); 428#else 429 /* SlowBcopy has inverted src and dst */ 430 xf86SlowBcopy(pRendition->board.vmem_base,pRendition->board.ucode_buffer,MC_SIZE); 431#endif 432 verite_out8(iob+MEMENDIAN, memend); 433 v1k_continue(pScreenInfo); 434} 435 436 437 438/* 439 * local functions 440 */ 441 442/* 443 * synchronization -- wait for RISC and pixel engine to become idle 444 */ 445void 446RENDITIONSyncV1000(ScrnInfoPtr pScreenInfo) 447{ 448 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 449 IOADDRESS iob = pRendition->board.io_base; 450 451 int c; 452 453#ifdef DEBUG 454 ErrorF("RENDITION: RENDITIONSyncV1000 called\n"); 455 456 ErrorF("#Sync (1)# FIFO_INFREE 0x%x -- \n",verite_in8(iob+FIFOINFREE)); 457 ErrorF("#Sync (1)# FIFO_OUTVALID 0x%x -- \n",verite_in8(iob+FIFOOUTVALID)); 458#endif 459 460 c=0; 461 /* empty output fifo, 462 i.e. if there is any valid data in the output fifo then read it */ 463 464 while ((c++<0xfffff) && ((verite_in8(iob+FIFOOUTVALID)&0x7)>0)) 465 (void)verite_in32(iob); 466 467/* if(!(c%0xffff))ErrorF("#F1# !0x%x! -- ",verite_in8(iob+FIFOOUTVALID)); */ 468 469 if (c >= 0xfffff) { 470 ErrorF("RENDITION: RISC synchronization failed (1) FIFO out == %d!\n", 471 verite_in8(iob+FIFOOUTVALID)&0x1f); 472 return; 473 } 474 475 /* sync RISC */ 476 waitfifo(2); 477 verite_out32(iob, CMD_GET_PIXEL); 478 verite_out32(iob, 0); 479 480 c=0; 481 while ((c++<0xfffff) && ((verite_in8(iob+FIFOOUTVALID)&0x7)>0)) 482 (void)verite_in32(iob); 483 484/* if(!(c%0xffff))ErrorF("#F2# !0x%x! -- ",verite_in8(iob+FIFOOUTVALID)); */ 485 486 487 if (c >= 0xfffff) { 488 ErrorF ("Rendition: RISC synchronization failed (2) FIFO out == %d!\n", 489 verite_in8(iob+FIFOOUTVALID)&0x1f); 490 return; 491 } 492 493 /* sync pixel engine using csucode -- I suppose this is quite slow <ml> */ 494 v1k_stop(pScreenInfo); 495 v1k_start(pScreenInfo, pRendition->board.csucode_base); 496 verite_out32(iob, 2); /* a0 - sync command */ 497 498 c=0; 499 while ((c++<0xfffff) && ((verite_in8(iob+FIFOOUTVALID)&0x7)>0)) 500 (void)verite_in32(iob); 501 502/* if(!(c%0xffff))ErrorF("#F3# !0x%x! -- ",verite_in8(iob+FIFOOUTVALID)); */ 503 504 if (c == 0xfffff) { 505 ErrorF ("Rendition: Pixel engine synchronization failed FIFO out == %d!\n", 506 verite_in8(iob+FIFOOUTVALID)&0x1f); 507 return; 508 } 509 510 /* restart the ucode */ 511 verite_out32(iob, 0); /* a0 - ucode init command */ 512 verite_out32(iob, 0); /* a1 - 1024 byte context store area */ 513 verite_out32(iob, 0); /* a2 */ 514 verite_out32(iob, pRendition->board.ucode_entry); 515 516 /* init the ucode */ 517 waitfifo(6); 518 verite_out32(iob, CMD_SETUP); 519 verite_out32(iob, P2(pRendition->board.mode.virtualwidth, 520 pRendition->board.mode.virtualheight)); 521 verite_out32(iob, P2(pRendition->board.mode.bitsperpixel, 522 pRendition->board.mode.pixelformat)); 523 verite_out32(iob, MC_SIZE); 524 525 verite_out32(iob, pRendition->board.mode.virtualwidth * 526 (pRendition->board.mode.bitsperpixel>>3)); 527 verite_out32(iob, (pRendition->board.mode.stride1<<12) | 528 (pRendition->board.mode.stride0<<8)); 529} 530 531 532 533/* 534 * screen to screen copy 535 */ 536void 537RENDITIONSetupForScreenToScreenCopy(ScrnInfoPtr pScreenInfo, 538 int xdir, int ydir, int rop, 539 unsigned planemask, int trans_color) 540{ 541 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 542 543#ifdef DEBUG 544 ErrorF("RENDITION: RENDITIONSetupForScreenToScreenCopy(" 545 "%2d, %2d, %2d, %u, %d) called\n", xdir, ydir, rop, planemask, trans_color); 546 ErrorF("RENDITION: rop is %x/%x\n", rop, Rop2Rop[rop]); 547#endif 548 549 pRendition->board.Rop=Rop2Rop[rop]; 550} 551 552void 553RENDITIONSubsequentScreenToScreenCopy(ScrnInfoPtr pScreenInfo, 554 int srcX, int srcY, 555 int dstX, int dstY, 556 int w, int h) 557{ 558 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 559 IOADDRESS iob = pRendition->board.io_base; 560 561 562#ifdef DEBUG 563 ErrorF("RENDITION: RENDITIONSubsequentScreenToScreenCopy(" 564 "%d, %d, %d, %d, %d, %d) called\n", srcX, srcY, dstX, dstY, w, h); 565#endif 566 567 568#if 1 /* def DEBUG */ 569 ErrorF("#ScreentoScreen# FIFO_INFREE 0x%x -- \n",verite_in8(iob+FIFOINFREE)); 570 ErrorF("#ScreentoScreen# FIFO_OUTVALID 0x%x -- \n",verite_in8(iob+FIFOOUTVALID)); 571#endif 572 573 waitfifo(5); 574 verite_out32(iob, CMD_SCREEN_BLT); 575 verite_out32(iob, pRendition->board.Rop); 576 verite_out32(iob, P2(srcX, srcY)); 577 verite_out32(iob, P2(w, h)); 578 verite_out32(iob, P2(dstX, dstY)); 579} 580 581 582 583/* 584 * solid filled rectangles 585 */ 586void 587RENDITIONSetupForSolidFill(ScrnInfoPtr pScreenInfo, 588 int color, int rop, 589 unsigned planemask) 590{ 591 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 592 593#ifdef DEBUG 594 ErrorF("RENDITION: RENDITIONSetupForSolidFill called\n"); 595 ErrorF("RENDITION: Rop is %x/%x\n", rop, Rop2Rop[rop]); 596#endif 597 598 pRendition->board.Rop=Rop2Rop[rop]; 599 pRendition->board.Color=color; 600 if (pRendition->board.mode.bitsperpixel < 32) 601 pRendition->board.Color|=(pRendition->board.Color<<16); 602 if (pRendition->board.mode.bitsperpixel < 16) 603 pRendition->board.Color|=(pRendition->board.Color<<8); 604} 605 606void 607RENDITIONSubsequentSolidFillRect(ScrnInfoPtr pScreenInfo, 608 int x, int y, int w, int h) 609{ 610 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 611 IOADDRESS iob = pRendition->board.io_base; 612 613 614#ifdef DEBUG 615 ErrorF("RENDITION: RENDITIONSubsequentSolidFillRect called\n"); 616#endif 617 618 waitfifo(4); 619#ifdef DEBUG 620 ErrorF("#SubsequentSolidFill# FIFO_INFREE 0x%x -- \n",verite_in8(iob+FIFOINFREE)); 621 ErrorF("#SubsequentSolidFill# FIFO_OUTVALID 0x%x -- \n",verite_in8(iob+FIFOOUTVALID)); 622 sleep(1); 623#endif 624 verite_out32(iob, P2(pRendition->board.Rop, CMD_RECT_SOLID_ROP)); 625 verite_out32(iob, pRendition->board.Color); 626 verite_out32(iob, P2(x, y)); 627 verite_out32(iob, P2(w, h)); 628} 629 630 631 632/* 633 * line 634 */ 635 636void 637RENDITIONSubsequentTwoPointLine(ScrnInfoPtr pScreenInfo, 638 int x1, int y1, 639 int x2, int y2, 640 int bias) 641{ 642 renditionPtr pRendition = RENDITIONPTR(pScreenInfo); 643 IOADDRESS iob = pRendition->board.io_base; 644 645 646#ifdef DEBUG 647 ErrorF("RENDITION: RENDITIONSubsequentTwoPointLine(" 648 "%d, %d, %d, %d, %d) called\n", x1, y1, x2, y2, bias); 649#endif 650 651 waitfifo(5); 652 verite_out32(iob, P2(1, CMD_LINE_SOLID)); 653 verite_out32(iob, pRendition->board.Rop); 654 verite_out32(iob, pRendition->board.Color); 655 verite_out32(iob, P2(x1, y1)); 656 verite_out32(iob, P2(x2, y2)); 657} 658 659/* 660 * end of file accelX.c 661 */ 662