Rev 883 | Go to most recent revision | Show entire file | Ignore 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 571... | Line 660... | ||
571 | clip_t src_clip, dst_clip; |
660 | clip_t src_clip, dst_clip; |
572 | 661 | ||
Line 573... | Line 662... | ||
573 | local_pixmap_t *srcpixmap; |
662 | local_pixmap_t *srcpixmap; |
Line 574... | Line 663... | ||
574 | local_pixmap_t *dstpixmap; |
663 | local_pixmap_t *dstpixmap; |
575 | 664 | ||
Line 576... | Line 665... | ||
576 | //dbgprintf("Pixblit src: %x dst: %x\n",blit->srcpix, blit->dstpix); |
665 | //dbgprintf("Pixblit src: %x dst: %x\n",blit->srcpix, blit->dstpix); |
Line 577... | Line 666... | ||
577 | 666 | ||
578 | dstpixmap = (blit->dstpix == (void*)-1) ? &scr_pixmap : blit->dstpix ; |
667 | dstpixmap = (blit->dstpix == (void*)-1) ? &scr_pixmap : blit->dstpix ; |
579 | srcpixmap = (blit->srcpix == (void*)-1) ? &scr_pixmap : blit->srcpix ; |
668 | srcpixmap = (blit->srcpix == (void*)-1) ? &scr_pixmap : blit->srcpix ; |
580 | 669 | ||
Line 581... | Line 670... | ||
581 | //dbgprintf("srcpixmap: %x dstpixmap: %x\n",srcpixmap, dstpixmap); |
670 | //dbgprintf("srcpixmap: %x dstpixmap: %x\n",srcpixmap, dstpixmap); |
582 | 671 | ||
583 | //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height); |
672 | //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height); |
584 | //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); |
673 | //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); |
Line 585... | Line 674... | ||
585 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
674 | //dbgprintf("srcpitch: %x dstpitch: %x\n", |
586 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
675 | // srcpixmap->pitch_offset,dstpixmap->pitch_offset); |
587 | 676 | ||
588 | src_clip.xmin = 0; |
677 | src_clip.xmin = 0; |
Line 589... | Line 678... | ||
589 | src_clip.ymin = 0; |
678 | src_clip.ymin = 0; |
590 | src_clip.xmax = srcpixmap->width-1; |
679 | src_clip.xmax = srcpixmap->width-1; |
591 | src_clip.ymax = srcpixmap->height-1; |
680 | src_clip.ymax = srcpixmap->height-1; |
592 | 681 | ||
593 | dst_clip.xmin = 0; |
682 | dst_clip.xmin = 0; |
594 | dst_clip.ymin = 0; |
683 | dst_clip.ymin = 0; |
Line -... | Line 684... | ||
- | 684 | dst_clip.xmax = dstpixmap->width-1; |
|
- | 685 | dst_clip.ymax = dstpixmap->height-1; |
|
- | 686 | ||
- | 687 | if( !blit_clip(&dst_clip, &blit->dst_x, &blit->dst_y, |
|
- | 688 | &src_clip, &blit->src_x, &blit->src_y, |
|
- | 689 | &blit->w, &blit->h) ) |
|
- | 690 | { |
|
- | 691 | u32_t *ring, write; |
|
595 | dst_clip.xmax = dstpixmap->width-1; |
692 | u32_t ifl; |
Line 596... | Line 693... | ||
596 | dst_clip.ymax = dstpixmap->height-1; |
693 | |
Line 597... | Line 694... | ||
597 | 694 | if( (srcpixmap->flags & PX_MEM_MASK)==PX_MEM_SYSTEM) |
|
Line 630... | Line 727... | ||
630 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
727 | OUTREG(R5XX_DST_HEIGHT_WIDTH,(blit->h<<16)|blit->w); |
631 | 728 | ||
632 | #else |
729 | #else |
Line 633... | Line 730... | ||
633 | BEGIN_RING(7); |
730 | BEGIN_RING(7); |
634 | 731 | ||
Line 635... | Line 732... | ||
635 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
732 | OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); |
Line 636... | Line 733... | ||
636 | 733 | ||
637 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
734 | OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | |
638 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
735 | RADEON_GMC_DST_PITCH_OFFSET_CNTL | |
639 | RADEON_GMC_BRUSH_NONE | |
736 | RADEON_GMC_BRUSH_NONE | |
640 | RADEON_GMC_DST_32BPP | |
737 | RADEON_GMC_DST_32BPP | |
641 | RADEON_GMC_SRC_DATATYPE_COLOR | |
738 | RADEON_GMC_SRC_DATATYPE_COLOR | |
642 | RADEON_DP_SRC_SOURCE_MEMORY | |
739 | RADEON_DP_SRC_SOURCE_MEMORY | |
643 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
740 | R5XX_GMC_CLR_CMP_CNTL_DIS | |
644 | R5XX_GMC_WR_MSK_DIS | |
741 | R5XX_GMC_WR_MSK_DIS | |
645 | R5XX_ROP3_S |
742 | R5XX_ROP3_S |
646 | ); |
743 | ); |
647 | 744 | ||
648 | OUT_RING(srcpixmap->pitch_offset); |
745 | OUT_RING(srcpixmap->pitch_offset); |
649 | OUT_RING(dstpixmap->pitch_offset); |
746 | OUT_RING(dstpixmap->pitch_offset); |
650 | 747 | ||
651 | OUT_RING((blit->src_x<<16)|blit->src_y); |
748 | OUT_RING((blit->src_x<<16)|blit->src_y); |
652 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
749 | OUT_RING((blit->dst_x<<16)|blit->dst_y); |
653 | OUT_RING((blit->w<<16)|blit->h); |
750 | OUT_RING((blit->w<<16)|blit->h); |
Line 654... | Line 751... | ||
654 | COMMIT_RING(); |
751 | COMMIT_RING(); |
655 | 752 | ||
656 | #endif |
753 | #endif |
657 | safe_sti(ifl); |
754 | safe_sti(ifl); |
658 | }; |
755 | }; |