Subversion Repositories Kolibri OS

Rev

Rev 3266 | Rev 3290 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3266 Rev 3277
Line 640... Line 640...
640
 
640
 
Line 641... Line 641...
641
    return 0;
641
    return 0;
642
};
642
};
Line -... Line 643...
-
 
643
 
-
 
644
typedef struct
-
 
645
{
-
 
646
    int left;
-
 
647
    int top;
-
 
648
    int right;
-
 
649
    int bottom;
-
 
650
}rect_t;
-
 
651
 
-
 
652
struct drm_i915_mask {
-
 
653
    __u32 handle;
-
 
654
    __u32 bo_size;
-
 
655
    __u32 bo_pitch;
-
 
656
    __u32 bo_map;
-
 
657
};
-
 
658
 
-
 
659
#define CURRENT_TASK             (0x80003000)
-
 
660
 
-
 
661
static u32_t get_display_map()
-
 
662
{
-
 
663
    u32_t   addr;
-
 
664
 
-
 
665
    addr = (u32_t)os_display;
-
 
666
    addr+= sizeof(display_t);            /*  shoot me  */
-
 
667
    return *(u32_t*)addr;
-
 
668
}
-
 
669
 
-
 
670
void  FASTCALL GetWindowRect(rect_t *rc)__asm__("GetWindowRect");
-
 
671
 
-
 
672
int i915_mask_update(struct drm_device *dev, void *data,
-
 
673
            struct drm_file *file)
-
 
674
{
-
 
675
    struct drm_i915_mask *mask = data;
-
 
676
    struct drm_gem_object *obj;
-
 
677
    static unsigned int mask_seqno[256];
-
 
678
    rect_t winrc;
-
 
679
    u32    slot;
-
 
680
    int    ret;
-
 
681
 
-
 
682
    obj = drm_gem_object_lookup(dev, file, mask->handle);
-
 
683
    if (obj == NULL)
-
 
684
        return -ENOENT;
-
 
685
 
-
 
686
    if (!obj->filp) {
-
 
687
        drm_gem_object_unreference_unlocked(obj);
-
 
688
        return -EINVAL;
-
 
689
    }
-
 
690
 
-
 
691
    GetWindowRect(&winrc);
-
 
692
    {
-
 
693
        static warn_count;
-
 
694
 
-
 
695
        if(warn_count < 1)
-
 
696
        {
-
 
697
            printf("left %d top %d right %d bottom %d\n",
-
 
698
                    winrc.left, winrc.top, winrc.right, winrc.bottom);
-
 
699
            printf("mask pitch %d data %p\n", mask->bo_pitch, mask->bo_size);
-
 
700
            warn_count++;
-
 
701
        };
-
 
702
    };
-
 
703
 
-
 
704
    slot = *((u8*)CURRENT_TASK);
-
 
705
 
-
 
706
    if( mask_seqno[slot] != os_display->mask_seqno)
-
 
707
    {
-
 
708
        u8* src_offset;
-
 
709
        u8* dst_offset;
-
 
710
        u32 ifl;
-
 
711
 
-
 
712
        ret = i915_mutex_lock_interruptible(dev);
-
 
713
        if (ret)
-
 
714
            return ret;
-
 
715
 
-
 
716
        ret = i915_gem_object_set_to_cpu_domain(to_intel_bo(obj), true);
-
 
717
        if(ret !=0 )
-
 
718
        {
-
 
719
            dbgprintf("%s fail\n", __FUNCTION__);
-
 
720
            return ret;
-
 
721
        };
-
 
722
 
-
 
723
//        printf("width %d height %d\n", winrc.right, winrc.bottom);
-
 
724
 
-
 
725
//        slot = 0x01;
-
 
726
 
-
 
727
 
-
 
728
        src_offset = (u8*)( winrc.top*os_display->width + winrc.left);
-
 
729
        src_offset+= get_display_map();
-
 
730
        dst_offset = (u8*)mask->bo_map;
-
 
731
 
-
 
732
        u32_t tmp_h = winrc.bottom - winrc.top;
-
 
733
 
-
 
734
        ifl = safe_cli();
-
 
735
        {
-
 
736
            mask_seqno[slot] = os_display->mask_seqno;
-
 
737
 
-
 
738
            slot|= (slot<<8)|(slot<<16)|(slot<<24);
-
 
739
 
-
 
740
            __asm__ __volatile__ (
-
 
741
                "movd       %[slot],   %%xmm6    \n"
-
 
742
            "punpckldq  %%xmm6, %%xmm6            \n"
-
 
743
            "punpcklqdq %%xmm6, %%xmm6            \n"
-
 
744
            :: [slot]  "m" (slot)
-
 
745
            :"xmm6");
-
 
746
 
-
 
747
            while( tmp_h--)
-
 
748
            {
-
 
749
                int tmp_w = mask->bo_pitch;
-
 
750
 
-
 
751
                u8* tmp_src = src_offset;
-
 
752
                u8* tmp_dst = dst_offset;
-
 
753
 
-
 
754
                src_offset+= os_display->width;
-
 
755
                dst_offset+= mask->bo_pitch;
-
 
756
 
-
 
757
//            while( tmp_w--)
-
 
758
//            {
-
 
759
//                *(tmp_src) = (*tmp_dst==slot)?0x1:0x00;
-
 
760
//                tmp_src++;
-
 
761
//                tmp_dst++;
-
 
762
//            };
-
 
763
                while(tmp_w >= 64)
-
 
764
                {
-
 
765
                    __asm__ __volatile__ (
-
 
766
                    "movdqu     (%0),   %%xmm0            \n"
-
 
767
                    "movdqu   16(%0),   %%xmm1            \n"
-
 
768
                    "movdqu   32(%0),   %%xmm2            \n"
-
 
769
                    "movdqu   48(%0),   %%xmm3            \n"
-
 
770
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
-
 
771
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
-
 
772
                    "pcmpeqb    %%xmm6, %%xmm2            \n"
-
 
773
                    "pcmpeqb    %%xmm6, %%xmm3            \n"
-
 
774
                    "movdqa     %%xmm0,   (%%edi)         \n"
-
 
775
                    "movdqa     %%xmm1, 16(%%edi)         \n"
-
 
776
                    "movdqa     %%xmm2, 32(%%edi)         \n"
-
 
777
                    "movdqa     %%xmm3, 48(%%edi)         \n"
-
 
778
 
-
 
779
                    :: "r" (tmp_src), "D" (tmp_dst)
-
 
780
                    :"xmm0","xmm1","xmm2","xmm3");
-
 
781
                    tmp_w -= 64;
-
 
782
                    tmp_src += 64;
-
 
783
                    tmp_dst += 64;
-
 
784
                }
-
 
785
 
-
 
786
                if( tmp_w >= 32 )
-
 
787
                {
-
 
788
                    __asm__ __volatile__ (
-
 
789
                    "movdqu     (%0),   %%xmm0            \n"
-
 
790
                    "movdqu   16(%0),   %%xmm1            \n"
-
 
791
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
-
 
792
                    "pcmpeqb    %%xmm6, %%xmm1            \n"
-
 
793
                    "movdqa     %%xmm0,   (%%edi)         \n"
-
 
794
                    "movdqa     %%xmm1, 16(%%edi)         \n"
-
 
795
 
-
 
796
                    :: "r" (tmp_src), "D" (tmp_dst)
-
 
797
                    :"xmm0","xmm1");
-
 
798
                    tmp_w -= 32;
-
 
799
                    tmp_src += 32;
-
 
800
                    tmp_dst += 32;
-
 
801
                }
-
 
802
 
-
 
803
                while( tmp_w > 0 )
-
 
804
                {
-
 
805
                    __asm__ __volatile__ (
-
 
806
                    "movdqu     (%0),   %%xmm0            \n"
-
 
807
                    "pcmpeqb    %%xmm6, %%xmm0            \n"
-
 
808
                    "movdqa     %%xmm0,   (%%edi)         \n"
-
 
809
                    :: "r" (tmp_src), "D" (tmp_dst)
-
 
810
                    :"xmm0");
-
 
811
                    tmp_w -= 16;
-
 
812
                    tmp_src += 16;
-
 
813
                    tmp_dst += 16;
-
 
814
                }
-
 
815
            };
-
 
816
        };
-
 
817
        safe_sti(ifl);
-
 
818
    }
-
 
819
 
-
 
820
    drm_gem_object_unreference(obj);
-
 
821
 
-
 
822
    mutex_unlock(&dev->struct_mutex);
-
 
823
 
-
 
824
    return 0;
-
 
825
}
-
 
826
 
Line 643... Line 827...
643
 
827
 
Line 644... Line 828...
644
 
828