Subversion Repositories Kolibri OS

Rev

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