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 |