Rev 882 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 882 | Rev 1002 | ||
---|---|---|---|
Line 562... | Line 562... | ||
562 | if( ( width <= 0 ) || ( height<=0 ) ) |
562 | if( ( width <= 0 ) || ( height<=0 ) ) |
563 | return ERR_PARAM; |
563 | return ERR_PARAM; |
Line 564... | Line 564... | ||
564 | 564 | ||
565 | /* if "hardware acceleration present" and |
565 | /* if "hardware acceleration present" and |
566 | "destinastion is primary screen or local videomemory" and |
- | |
567 | "source is primary screen or local videomemory" |
566 | "destinastion is primary screen or local videomemory" |
568 | */ |
567 | */ |
569 | if( (srv_hw2d != 0) && |
568 | if( (srv_hw2d != 0) && |
570 | ( (dst_pixmap == (void*)-1) || |
569 | ( (dst_pixmap == (void*)-1) || |
571 | ( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) && |
570 | ( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) /* && |
572 | ( (src_pixmap == (void*)-1) || |
571 | ( (src_pixmap == (void*)-1) || |
573 | ( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) ) |
572 | ( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) */ ) |
574 | { |
573 | { |
575 | ioctl_t io; |
574 | ioctl_t io; |
Line 576... | Line 575... | ||
576 | pxblit_t *blit = (pxblit_t*)&dst_pixmap; |
575 | pxblit_t *blit = (pxblit_t*)&dst_pixmap; |
577 | 576 | ||
Line 578... | Line 577... | ||
578 | if((int)dst_pixmap != -1) |
577 | if((int)dst_pixmap != -1) |
- | 578 | blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle; |
|
579 | blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle; |
579 | |
Line 580... | Line 580... | ||
580 | 580 | if( (int)src_pixmap != -1 && |
|
581 | if((int)src_pixmap != -1) |
581 | (src_pixmap->flags & PX_MEM_MASK) != PX_MEM_SYSTEM) |
582 | blit->src_pixmap = (pixmap_t*)src_pixmap->handle; |
582 | blit->src_pixmap = (pixmap_t*)src_pixmap->handle; |
Line 703... | Line 703... | ||
703 | 703 | ||
Line 704... | Line 704... | ||
704 | return call_service(&io); |
704 | return call_service(&io); |
705 | }; |
705 | }; |
Line -... | Line 706... | ||
- | 706 | ||
- | 707 | dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ; |
|
- | 708 | src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ; |
|
706 | 709 | ||
707 | src_clip.xmin = 0; |
710 | src_clip.xmin = 0; |
708 | src_clip.ymin = 0; |
711 | src_clip.ymin = 0; |
709 | src_clip.xmax = src_pixmap->width-1; |
712 | src_clip.xmax = src_pixmap->width-1; |
Line 720... | Line 723... | ||
720 | &width, &height) ) |
723 | &width, &height) ) |
721 | { |
724 | { |
722 | __m64 clr_key; |
725 | __m64 clr_key; |
723 | 726 | ||
Line 724... | Line -... | ||
724 | dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ; |
- | |
725 | src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ; |
- | |
Line 726... | Line 727... | ||
726 | 727 | ||
727 | color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x]; |
728 | color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x]; |
Line 728... | Line 729... | ||
728 | color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x]; |
729 | color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x]; |
Line 764... | Line 765... | ||
764 | }; |
765 | }; |
765 | return ERR_OK; |
766 | return ERR_OK; |
766 | }=0>=>=0>=>=0>=>><>><>><>><>>>>> |
767 | } |
767 | 768 | ||
Line -... | Line 769... | ||
- | 769 | unsigned long long m_0080 = 0x0080008000800080ULL; |
|
- | 770 | ||
- | 771 | int BlitAlpha(pixmap_t *dst_pixmap, int dst_x, int dst_y, |
|
- | 772 | pixmap_t *src_pixmap, int src_x, int src_y, |
|
- | 773 | int width, int height, u32_t alpha) |
|
- | 774 | { |
|
- | 775 | clip_t src_clip, dst_clip; |
|
- | 776 | ||
- | 777 | if( (srv_hw2d != 0) && |
|
- | 778 | ( (dst_pixmap == (void*)-1) || |
|
- | 779 | ( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) && |
|
- | 780 | ( (src_pixmap == (void*)-1) || |
|
- | 781 | ( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) ) |
|
- | 782 | { |
|
- | 783 | ioctl_t io; |
|
- | 784 | pxblit_t *blit = (pxblit_t*)&dst_pixmap; |
|
- | 785 | ||
- | 786 | if((int)dst_pixmap != -1) |
|
- | 787 | blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle; |
|
- | 788 | ||
- | 789 | if((int)src_pixmap != -1) |
|
- | 790 | blit->src_pixmap = (pixmap_t*)src_pixmap->handle; |
|
- | 791 | ||
- | 792 | io.handle = srv_hw2d; |
|
- | 793 | io.io_code = PX_BLIT_ALPHA; |
|
- | 794 | io.input = blit; |
|
- | 795 | io.inp_size = 9; |
|
- | 796 | io.output = NULL; |
|
- | 797 | io.out_size = 0; |
|
- | 798 | ||
- | 799 | return call_service(&io); |
|
- | 800 | }; |
|
- | 801 | ||
- | 802 | dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ; |
|
- | 803 | src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ; |
|
- | 804 | ||
- | 805 | src_clip.xmin = 0; |
|
- | 806 | src_clip.ymin = 0; |
|
- | 807 | src_clip.xmax = src_pixmap->width-1; |
|
- | 808 | src_clip.ymax = src_pixmap->height-1; |
|
- | 809 | ||
- | 810 | dst_clip.xmin = 0; |
|
- | 811 | dst_clip.ymin = 0; |
|
- | 812 | dst_clip.xmax = dst_pixmap->width-1; |
|
- | 813 | dst_clip.ymax = dst_pixmap->height-1; |
|
- | 814 | ||
- | 815 | ||
- | 816 | if( !blit_clip(&dst_clip, &dst_x, &dst_y, |
|
- | 817 | &src_clip, &src_x, &src_y, |
|
- | 818 | &width, &height) ) |
|
- | 819 | { |
|
- | 820 | __m64 m_alpha; |
|
- | 821 | __m64 m_one_alpha; |
|
Line -... | Line 822... | ||
- | 822 | ||
- | 823 | color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x]; |
|
- | 824 | color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x]; |
|
- | 825 | ||
- | 826 | m_alpha = _mm_cvtsi32_si64((alpha << 16) | alpha); |
|
- | 827 | m_alpha = _mm_unpacklo_pi32(m_alpha, m_alpha); |
|
- | 828 | m_one_alpha = _mm_subs_pu16((__m64)0x00FF00FF00FF00FFULL, m_alpha); |
|
- | 829 | ||
- | 830 | while( height-- ) |
|
- | 831 | { |
|
- | 832 | int w = width; |
|
- | 833 | color_t *tmp_src = src_addr; |
|
- | 834 | color_t *tmp_dst = dst_addr; |
|
- | 835 | ||
- | 836 | src_addr += src_pixmap->pitch/4; |
|
- | 837 | dst_addr += dst_pixmap->pitch/4; |
|
- | 838 | ||
- | 839 | while( w-- ) |
|
- | 840 | { |
|
- | 841 | __asm__ __volatile__ ( |
|
- | 842 | "movd (%0), %%mm0 \n\t" |
|
- | 843 | "pxor %%mm1, %%mm1 \n\t" |
|
- | 844 | "punpcklbw %%mm1, %%mm0 \n\t" |
|
- | 845 | "pmullw %[clr_key], %%mm0 \n\t" |
|
- | 846 | // "paddw %[m_0080], %%mm0 \n\t" |
|
- | 847 | ||
- | 848 | "movd (%1), %%mm2 \n\t" |
|
- | 849 | "punpcklbw %%mm1, %%mm2 \n\t" |
|
- | 850 | "pmullw %[m_one_alpha], %%mm2 \n\t" |
|
- | 851 | // "paddw %[m_0080], %%mm2 \n\t" |
|
- | 852 | ||
- | 853 | "paddw %%mm2, %%mm0 \n\t" |
|
- | 854 | "psrlw $8, %%mm0 \n\t" |
|
- | 855 | "packuswb %%mm0, %%mm0 \n\t" |
|
- | 856 | "movd %%mm0, (%1)" |
|
- | 857 | :: "r" (tmp_src), |
|
- | 858 | "r" (tmp_dst), |
|
- | 859 | [clr_key] "y" (m_alpha), |
|
- | 860 | [m_one_alpha] "y" (m_one_alpha) |
|
- | 861 | :"memory","mm0", "mm1", "mm2"); |
|
- | 862 | ||
- | 863 | tmp_src++; |
|
- | 864 | tmp_dst++; |
|
- | 865 | }; |
|
- | 866 | // if( w && (*tmp_src != alpha) ) |
|
- | 867 | // *tmp_dst = *tmp_src; |
|
- | 868 | }; |
|
- | 869 | }; |
|
- | 870 | return ERR_OK; |