564,14 → 564,13 |
return ERR_PARAM; |
|
/* if "hardware acceleration present" and |
"destinastion is primary screen or local videomemory" and |
"source is primary screen or local videomemory" |
"destinastion is primary screen or local videomemory" |
*/ |
if( (srv_hw2d != 0) && |
( (dst_pixmap == (void*)-1) || |
( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) && |
( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) /* && |
( (src_pixmap == (void*)-1) || |
( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) ) |
( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) */ ) |
{ |
ioctl_t io; |
pxblit_t *blit = (pxblit_t*)&dst_pixmap; |
579,7 → 578,8 |
if((int)dst_pixmap != -1) |
blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle; |
|
if((int)src_pixmap != -1) |
if( (int)src_pixmap != -1 && |
(src_pixmap->flags & PX_MEM_MASK) != PX_MEM_SYSTEM) |
blit->src_pixmap = (pixmap_t*)src_pixmap->handle; |
|
io.handle = srv_hw2d; |
705,6 → 705,9 |
return call_service(&io); |
}; |
|
dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ; |
src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ; |
|
src_clip.xmin = 0; |
src_clip.ymin = 0; |
src_clip.xmax = src_pixmap->width-1; |
722,8 → 725,6 |
{ |
__m64 clr_key; |
|
dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ; |
src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ; |
|
color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x]; |
color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x]; |
766,4 → 767,106 |
return ERR_OK; |
} |
|
unsigned long long m_0080 = 0x0080008000800080ULL; |
|
int BlitAlpha(pixmap_t *dst_pixmap, int dst_x, int dst_y, |
pixmap_t *src_pixmap, int src_x, int src_y, |
int width, int height, u32_t alpha) |
{ |
clip_t src_clip, dst_clip; |
|
if( (srv_hw2d != 0) && |
( (dst_pixmap == (void*)-1) || |
( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) && |
( (src_pixmap == (void*)-1) || |
( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) ) |
{ |
ioctl_t io; |
pxblit_t *blit = (pxblit_t*)&dst_pixmap; |
|
if((int)dst_pixmap != -1) |
blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle; |
|
if((int)src_pixmap != -1) |
blit->src_pixmap = (pixmap_t*)src_pixmap->handle; |
|
io.handle = srv_hw2d; |
io.io_code = PX_BLIT_ALPHA; |
io.input = blit; |
io.inp_size = 9; |
io.output = NULL; |
io.out_size = 0; |
|
return call_service(&io); |
}; |
|
dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ; |
src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ; |
|
src_clip.xmin = 0; |
src_clip.ymin = 0; |
src_clip.xmax = src_pixmap->width-1; |
src_clip.ymax = src_pixmap->height-1; |
|
dst_clip.xmin = 0; |
dst_clip.ymin = 0; |
dst_clip.xmax = dst_pixmap->width-1; |
dst_clip.ymax = dst_pixmap->height-1; |
|
|
if( !blit_clip(&dst_clip, &dst_x, &dst_y, |
&src_clip, &src_x, &src_y, |
&width, &height) ) |
{ |
__m64 m_alpha; |
__m64 m_one_alpha; |
|
color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x]; |
color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x]; |
|
m_alpha = _mm_cvtsi32_si64((alpha << 16) | alpha); |
m_alpha = _mm_unpacklo_pi32(m_alpha, m_alpha); |
m_one_alpha = _mm_subs_pu16((__m64)0x00FF00FF00FF00FFULL, m_alpha); |
|
while( height-- ) |
{ |
int w = width; |
color_t *tmp_src = src_addr; |
color_t *tmp_dst = dst_addr; |
|
src_addr += src_pixmap->pitch/4; |
dst_addr += dst_pixmap->pitch/4; |
|
while( w-- ) |
{ |
__asm__ __volatile__ ( |
"movd (%0), %%mm0 \n\t" |
"pxor %%mm1, %%mm1 \n\t" |
"punpcklbw %%mm1, %%mm0 \n\t" |
"pmullw %[clr_key], %%mm0 \n\t" |
// "paddw %[m_0080], %%mm0 \n\t" |
|
"movd (%1), %%mm2 \n\t" |
"punpcklbw %%mm1, %%mm2 \n\t" |
"pmullw %[m_one_alpha], %%mm2 \n\t" |
// "paddw %[m_0080], %%mm2 \n\t" |
|
"paddw %%mm2, %%mm0 \n\t" |
"psrlw $8, %%mm0 \n\t" |
"packuswb %%mm0, %%mm0 \n\t" |
"movd %%mm0, (%1)" |
:: "r" (tmp_src), |
"r" (tmp_dst), |
[clr_key] "y" (m_alpha), |
[m_one_alpha] "y" (m_one_alpha) |
:"memory","mm0", "mm1", "mm2"); |
|
tmp_src++; |
tmp_dst++; |
}; |
// if( w && (*tmp_src != alpha) ) |
// *tmp_dst = *tmp_src; |
}; |
}; |
return ERR_OK; |
} |