Rev 883 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 883 | Rev 1002 | ||
---|---|---|---|
Line 565... | Line 565... | ||
565 | }; |
565 | }; |
566 | 566 | ||
567 | 567 | ||
Line -... | Line 568... | ||
- | 568 | #define ADDRREG(addr) ((volatile u32_t *)(rhd.MMIOBase + (addr))) |
|
- | 569 | ||
- | 570 | ||
- | 571 | static int blit_host(u32_t dstpitch, int dstx, int dsty, |
|
- | 572 | u32_t src, int srcx, int srcy, |
|
- | 573 | int w, int h, int srcpitch) |
|
- | 574 | { |
|
- | 575 | u32_t ifl; |
|
- | 576 | color_t *src_addr; |
|
- | 577 | ||
- | 578 | ifl = safe_cli(); |
|
- | 579 | ||
- | 580 | #if R300_PIO |
|
- | 581 | ||
- | 582 | R5xxFIFOWait(5); |
|
- | 583 | ||
- | 584 | OUTREG(R5XX_DP_GUI_MASTER_CNTL, |
|
- | 585 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
|
- | 586 | // RADEON_GMC_DST_CLIPPING | |
|
- | 587 | RADEON_GMC_BRUSH_NONE | |
|
- | 588 | RADEON_GMC_DST_32BPP | |
|
- | 589 | RADEON_GMC_SRC_DATATYPE_COLOR | |
|
- | 590 | RADEON_DP_SRC_SOURCE_HOST_DATA | |
|
- | 591 | // RADEON_GMC_BYTE_MSB_TO_LSB | |
|
- | 592 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
|
- | 593 | R5XX_GMC_WR_MSK_DIS | |
|
- | 594 | R5XX_ROP3_S |
|
- | 595 | ); |
|
- | 596 | ||
- | 597 | OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | |
|
- | 598 | R5XX_DST_Y_TOP_TO_BOTTOM); |
|
- | 599 | ||
- | 600 | OUTREG(R5XX_DST_PITCH_OFFSET, dstpitch); |
|
- | 601 | ||
- | 602 | // OUTREG(RADEON_SC_TOP_LEFT, (y << 16) | ((x+skipleft) & 0xffff)); |
|
- | 603 | // OUTREG(RADEON_SC_BOTTOM_RIGHT, ((y+h) << 16) | ((x+w) & 0xffff)); |
|
- | 604 | ||
- | 605 | OUTREG(RADEON_DST_Y_X, (dsty << 16) | (dstx & 0xffff)); |
|
- | 606 | OUTREG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | w); |
|
- | 607 | ||
- | 608 | ||
- | 609 | src_addr = &((color_t*)src)[srcpitch*srcy/4+srcx]; |
|
- | 610 | ||
- | 611 | while ( h-- ) |
|
- | 612 | { |
|
- | 613 | color_t *tmp_src = src_addr; |
|
- | 614 | src_addr += srcpitch/4; |
|
- | 615 | ||
- | 616 | int left = w; |
|
- | 617 | ||
- | 618 | while( left ) |
|
- | 619 | { |
|
- | 620 | volatile u32_t *d; |
|
- | 621 | ||
- | 622 | if( left > 8 ) |
|
- | 623 | { |
|
- | 624 | int i; |
|
- | 625 | ||
- | 626 | R5xxFIFOWait(8); |
|
- | 627 | d = ADDRREG(RADEON_HOST_DATA0); |
|
- | 628 | ||
- | 629 | /* Unrolling doesn't improve performance */ |
|
- | 630 | for ( i = 0; i < 8; i++) |
|
- | 631 | *d++ = *tmp_src++; |
|
- | 632 | left -= 8; |
|
- | 633 | } |
|
- | 634 | else |
|
- | 635 | { |
|
- | 636 | R5xxFIFOWait(left); |
|
- | 637 | ||
- | 638 | if( h ) |
|
- | 639 | d = ADDRREG(RADEON_HOST_DATA7) - (left - 1); |
|
- | 640 | else |
|
- | 641 | d = ADDRREG(RADEON_HOST_DATA_LAST) - (left - 1); |
|
- | 642 | ||
- | 643 | for ( ; left; --left) |
|
- | 644 | *d++ = *tmp_src++; |
|
- | 645 | left = 0; |
|
- | 646 | }; |
|
- | 647 | }; |
|
- | 648 | }; |
|
- | 649 | ||
- | 650 | #endif |
|
- | 651 | ||
- | 652 | safe_sti(ifl); |
|
- | 653 | ||
- | 654 | return ERR_OK; |
|
- | 655 | } |
|
- | 656 | ||
Line 568... | Line 657... | ||
568 | 657 | ||
569 | int Blit(io_blit_t *blit) |
658 | int Blit(io_blit_t *blit) |
570 | { |
659 | { |
Line 602... | Line 691... | ||
602 | u32_t *ring, write; |
691 | u32_t *ring, write; |
603 | u32_t ifl; |
692 | u32_t ifl; |
604 | 693 | ||
605 | ifl = safe_cli(); |
694 | if( (srcpixmap->flags & PX_MEM_MASK)==PX_MEM_SYSTEM) |
Line -... | Line 695... | ||
- | 695 | return blit_host(dstpixmap->pitch_offset, |
|
- | 696 | blit->dst_x, blit->dst_y, |
|
- | 697 | srcpixmap->mapped, |
|
- | 698 | blit->src_x, blit->src_y, |
|
- | 699 | blit->w, blit->h, |
|
- | 700 | srcpixmap->pitch); |
|
- | 701 | ||
- | 702 | ifl = safe_cli(); |
|
606 | 703 | ||
Line 607... | Line 704... | ||
607 | #if R300_PIO |
704 | #if R300_PIO |
Line 608... | Line 705... | ||
608 | 705 |