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