Subversion Repositories Kolibri OS

Rev

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
     };