|
Packit |
030a23 |
/*
|
|
Packit |
030a23 |
* Copyright © 2007 Luca Barbato
|
|
Packit |
030a23 |
*
|
|
Packit |
030a23 |
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
Packit |
030a23 |
* documentation for any purpose is hereby granted without fee, provided that
|
|
Packit |
030a23 |
* the above copyright notice appear in all copies and that both that
|
|
Packit |
030a23 |
* copyright notice and this permission notice appear in supporting
|
|
Packit |
030a23 |
* documentation, and that the name of Luca Barbato not be used in advertising or
|
|
Packit |
030a23 |
* publicity pertaining to distribution of the software without specific,
|
|
Packit |
030a23 |
* written prior permission. Luca Barbato makes no representations about the
|
|
Packit |
030a23 |
* suitability of this software for any purpose. It is provided "as is"
|
|
Packit |
030a23 |
* without express or implied warranty.
|
|
Packit |
030a23 |
*
|
|
Packit |
030a23 |
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
|
Packit |
030a23 |
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
Packit |
030a23 |
* FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
Packit |
030a23 |
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
Packit |
030a23 |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
|
Packit |
030a23 |
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
|
Packit |
030a23 |
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
Packit |
030a23 |
* SOFTWARE.
|
|
Packit |
030a23 |
*
|
|
Packit |
030a23 |
* Author: Luca Barbato (lu_zero@gentoo.org)
|
|
Packit |
030a23 |
*
|
|
Packit |
030a23 |
* Based on fbmmx.c by Owen Taylor, Søren Sandmann and Nicholas Miell
|
|
Packit |
030a23 |
*/
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
030a23 |
#include <config.h>
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
#include "pixman-private.h"
|
|
Packit |
030a23 |
#include "pixman-combine32.h"
|
|
Packit |
030a23 |
#include "pixman-inlines.h"
|
|
Packit |
030a23 |
#include <altivec.h>
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define AVV(x...) {x}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static vector unsigned int mask_ff000000;
|
|
Packit |
030a23 |
static vector unsigned int mask_red;
|
|
Packit |
030a23 |
static vector unsigned int mask_green;
|
|
Packit |
030a23 |
static vector unsigned int mask_blue;
|
|
Packit |
030a23 |
static vector unsigned int mask_565_fix_rb;
|
|
Packit |
030a23 |
static vector unsigned int mask_565_fix_g;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
splat_alpha (vector unsigned int pix)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
return vec_perm (pix, pix,
|
|
Packit |
030a23 |
(vector unsigned char)AVV (
|
|
Packit |
030a23 |
0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04,
|
|
Packit |
030a23 |
0x08, 0x08, 0x08, 0x08, 0x0C, 0x0C, 0x0C, 0x0C));
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
return vec_perm (pix, pix,
|
|
Packit |
030a23 |
(vector unsigned char)AVV (
|
|
Packit |
030a23 |
0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07,
|
|
Packit |
030a23 |
0x0B, 0x0B, 0x0B, 0x0B, 0x0F, 0x0F, 0x0F, 0x0F));
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
splat_pixel (vector unsigned int pix)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
return vec_perm (pix, pix,
|
|
Packit |
030a23 |
(vector unsigned char)AVV (
|
|
Packit |
030a23 |
0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,
|
|
Packit |
030a23 |
0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03));
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
pix_multiply (vector unsigned int p, vector unsigned int a)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned short hi, lo, mod;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* unpack to short */
|
|
Packit |
030a23 |
hi = (vector unsigned short)
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
vec_mergeh ((vector unsigned char)AVV (0),
|
|
Packit |
030a23 |
(vector unsigned char)p);
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
vec_mergeh ((vector unsigned char) p,
|
|
Packit |
030a23 |
(vector unsigned char) AVV (0));
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
mod = (vector unsigned short)
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
vec_mergeh ((vector unsigned char)AVV (0),
|
|
Packit |
030a23 |
(vector unsigned char)a);
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
vec_mergeh ((vector unsigned char) a,
|
|
Packit |
030a23 |
(vector unsigned char) AVV (0));
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
hi = vec_mladd (hi, mod, (vector unsigned short)
|
|
Packit |
030a23 |
AVV (0x0080, 0x0080, 0x0080, 0x0080,
|
|
Packit |
030a23 |
0x0080, 0x0080, 0x0080, 0x0080));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
hi = vec_adds (hi, vec_sr (hi, vec_splat_u16 (8)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
hi = vec_sr (hi, vec_splat_u16 (8));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* unpack to short */
|
|
Packit |
030a23 |
lo = (vector unsigned short)
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
vec_mergel ((vector unsigned char)AVV (0),
|
|
Packit |
030a23 |
(vector unsigned char)p);
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
vec_mergel ((vector unsigned char) p,
|
|
Packit |
030a23 |
(vector unsigned char) AVV (0));
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
mod = (vector unsigned short)
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
vec_mergel ((vector unsigned char)AVV (0),
|
|
Packit |
030a23 |
(vector unsigned char)a);
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
vec_mergel ((vector unsigned char) a,
|
|
Packit |
030a23 |
(vector unsigned char) AVV (0));
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
lo = vec_mladd (lo, mod, (vector unsigned short)
|
|
Packit |
030a23 |
AVV (0x0080, 0x0080, 0x0080, 0x0080,
|
|
Packit |
030a23 |
0x0080, 0x0080, 0x0080, 0x0080));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
lo = vec_adds (lo, vec_sr (lo, vec_splat_u16 (8)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
lo = vec_sr (lo, vec_splat_u16 (8));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return (vector unsigned int)vec_packsu (hi, lo);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
pix_add (vector unsigned int a, vector unsigned int b)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
return (vector unsigned int)vec_adds ((vector unsigned char)a,
|
|
Packit |
030a23 |
(vector unsigned char)b);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
pix_add_mul (vector unsigned int x,
|
|
Packit |
030a23 |
vector unsigned int a,
|
|
Packit |
030a23 |
vector unsigned int y,
|
|
Packit |
030a23 |
vector unsigned int b)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned int t1, t2;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
t1 = pix_multiply (x, a);
|
|
Packit |
030a23 |
t2 = pix_multiply (y, b);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return pix_add (t1, t2);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
negate (vector unsigned int src)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
return vec_nor (src, src);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* dest*~srca + src */
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
over (vector unsigned int src,
|
|
Packit |
030a23 |
vector unsigned int srca,
|
|
Packit |
030a23 |
vector unsigned int dest)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned char tmp = (vector unsigned char)
|
|
Packit |
030a23 |
pix_multiply (dest, negate (srca));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
tmp = vec_adds ((vector unsigned char)src, tmp);
|
|
Packit |
030a23 |
return (vector unsigned int)tmp;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* in == pix_multiply */
|
|
Packit |
030a23 |
#define in_over(src, srca, mask, dest) \
|
|
Packit |
030a23 |
over (pix_multiply (src, mask), \
|
|
Packit |
030a23 |
pix_multiply (srca, mask), dest)
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define COMPUTE_SHIFT_MASK(source) \
|
|
Packit |
030a23 |
source ## _mask = vec_lvsl (0, source);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define COMPUTE_SHIFT_MASKS(dest, source) \
|
|
Packit |
030a23 |
source ## _mask = vec_lvsl (0, source);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define COMPUTE_SHIFT_MASKC(dest, source, mask) \
|
|
Packit |
030a23 |
mask ## _mask = vec_lvsl (0, mask); \
|
|
Packit |
030a23 |
source ## _mask = vec_lvsl (0, source);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define LOAD_VECTOR(source) \
|
|
Packit |
030a23 |
do \
|
|
Packit |
030a23 |
{ \
|
|
Packit |
030a23 |
vector unsigned char tmp1, tmp2; \
|
|
Packit |
030a23 |
tmp1 = (typeof(tmp1))vec_ld (0, source); \
|
|
Packit |
030a23 |
tmp2 = (typeof(tmp2))vec_ld (15, source); \
|
|
Packit |
030a23 |
v ## source = (typeof(v ## source)) \
|
|
Packit |
030a23 |
vec_perm (tmp1, tmp2, source ## _mask); \
|
|
Packit |
030a23 |
} while (0)
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define LOAD_VECTORS(dest, source) \
|
|
Packit |
030a23 |
do \
|
|
Packit |
030a23 |
{ \
|
|
Packit |
030a23 |
LOAD_VECTOR(source); \
|
|
Packit |
030a23 |
v ## dest = (typeof(v ## dest))vec_ld (0, dest); \
|
|
Packit |
030a23 |
} while (0)
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define LOAD_VECTORSC(dest, source, mask) \
|
|
Packit |
030a23 |
do \
|
|
Packit |
030a23 |
{ \
|
|
Packit |
030a23 |
LOAD_VECTORS(dest, source); \
|
|
Packit |
030a23 |
LOAD_VECTOR(mask); \
|
|
Packit |
030a23 |
} while (0)
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define DECLARE_SRC_MASK_VAR vector unsigned char src_mask
|
|
Packit |
030a23 |
#define DECLARE_MASK_MASK_VAR vector unsigned char mask_mask
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Now the COMPUTE_SHIFT_{MASK, MASKS, MASKC} below are just no-op.
|
|
Packit |
030a23 |
* They are defined that way because little endian altivec can do unaligned
|
|
Packit |
030a23 |
* reads natively and have no need for constructing the permutation pattern
|
|
Packit |
030a23 |
* variables.
|
|
Packit |
030a23 |
*/
|
|
Packit |
030a23 |
#define COMPUTE_SHIFT_MASK(source)
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define COMPUTE_SHIFT_MASKS(dest, source)
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define COMPUTE_SHIFT_MASKC(dest, source, mask)
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
# define LOAD_VECTOR(source) \
|
|
Packit |
030a23 |
v ## source = *((typeof(v ## source)*)source);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
# define LOAD_VECTORS(dest, source) \
|
|
Packit |
030a23 |
LOAD_VECTOR(source); \
|
|
Packit |
030a23 |
LOAD_VECTOR(dest); \
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
# define LOAD_VECTORSC(dest, source, mask) \
|
|
Packit |
030a23 |
LOAD_VECTORS(dest, source); \
|
|
Packit |
030a23 |
LOAD_VECTOR(mask); \
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define DECLARE_SRC_MASK_VAR
|
|
Packit |
030a23 |
#define DECLARE_MASK_MASK_VAR
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#endif /* WORDS_BIGENDIAN */
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define LOAD_VECTORSM(dest, source, mask) \
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, source, mask); \
|
|
Packit |
030a23 |
v ## source = pix_multiply (v ## source, \
|
|
Packit |
030a23 |
splat_alpha (v ## mask));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define STORE_VECTOR(dest) \
|
|
Packit |
030a23 |
vec_st ((vector unsigned int) v ## dest, 0, dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* load 4 pixels from a 16-byte boundary aligned address */
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
load_128_aligned (const uint32_t* src)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
return *((vector unsigned int *) src);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* load 4 pixels from a unaligned address */
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
load_128_unaligned (const uint32_t* src)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned int vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASK (src);
|
|
Packit |
030a23 |
LOAD_VECTOR (src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return vsrc;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* save 4 pixels on a 16-byte boundary aligned address */
|
|
Packit |
030a23 |
static force_inline void
|
|
Packit |
030a23 |
save_128_aligned (uint32_t* data,
|
|
Packit |
030a23 |
vector unsigned int vdata)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
STORE_VECTOR(data)
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
create_mask_1x32_128 (const uint32_t *src)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned int vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASK (src);
|
|
Packit |
030a23 |
LOAD_VECTOR (src);
|
|
Packit |
030a23 |
return vec_splat(vsrc, 0);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
create_mask_32_128 (uint32_t mask)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
return create_mask_1x32_128(&mask);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
unpacklo_128_16x8 (vector unsigned int data1, vector unsigned int data2)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned char lo;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* unpack to short */
|
|
Packit |
030a23 |
lo = (vector unsigned char)
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
vec_mergel ((vector unsigned char) data2,
|
|
Packit |
030a23 |
(vector unsigned char) data1);
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
vec_mergel ((vector unsigned char) data1,
|
|
Packit |
030a23 |
(vector unsigned char) data2);
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return (vector unsigned int) lo;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
unpackhi_128_16x8 (vector unsigned int data1, vector unsigned int data2)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned char hi;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* unpack to short */
|
|
Packit |
030a23 |
hi = (vector unsigned char)
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
vec_mergeh ((vector unsigned char) data2,
|
|
Packit |
030a23 |
(vector unsigned char) data1);
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
vec_mergeh ((vector unsigned char) data1,
|
|
Packit |
030a23 |
(vector unsigned char) data2);
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return (vector unsigned int) hi;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
unpacklo_128_8x16 (vector unsigned int data1, vector unsigned int data2)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned short lo;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* unpack to char */
|
|
Packit |
030a23 |
lo = (vector unsigned short)
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
vec_mergel ((vector unsigned short) data2,
|
|
Packit |
030a23 |
(vector unsigned short) data1);
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
vec_mergel ((vector unsigned short) data1,
|
|
Packit |
030a23 |
(vector unsigned short) data2);
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return (vector unsigned int) lo;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
unpackhi_128_8x16 (vector unsigned int data1, vector unsigned int data2)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned short hi;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* unpack to char */
|
|
Packit |
030a23 |
hi = (vector unsigned short)
|
|
Packit |
030a23 |
#ifdef WORDS_BIGENDIAN
|
|
Packit |
030a23 |
vec_mergeh ((vector unsigned short) data2,
|
|
Packit |
030a23 |
(vector unsigned short) data1);
|
|
Packit |
030a23 |
#else
|
|
Packit |
030a23 |
vec_mergeh ((vector unsigned short) data1,
|
|
Packit |
030a23 |
(vector unsigned short) data2);
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return (vector unsigned int) hi;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline void
|
|
Packit |
030a23 |
unpack_128_2x128 (vector unsigned int data1, vector unsigned int data2,
|
|
Packit |
030a23 |
vector unsigned int* data_lo, vector unsigned int* data_hi)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*data_lo = unpacklo_128_16x8(data1, data2);
|
|
Packit |
030a23 |
*data_hi = unpackhi_128_16x8(data1, data2);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline void
|
|
Packit |
030a23 |
unpack_128_2x128_16 (vector unsigned int data1, vector unsigned int data2,
|
|
Packit |
030a23 |
vector unsigned int* data_lo, vector unsigned int* data_hi)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*data_lo = unpacklo_128_8x16(data1, data2);
|
|
Packit |
030a23 |
*data_hi = unpackhi_128_8x16(data1, data2);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
unpack_565_to_8888 (vector unsigned int lo)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned int r, g, b, rb, t;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
r = vec_and (vec_sl(lo, create_mask_32_128(8)), mask_red);
|
|
Packit |
030a23 |
g = vec_and (vec_sl(lo, create_mask_32_128(5)), mask_green);
|
|
Packit |
030a23 |
b = vec_and (vec_sl(lo, create_mask_32_128(3)), mask_blue);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
rb = vec_or (r, b);
|
|
Packit |
030a23 |
t = vec_and (rb, mask_565_fix_rb);
|
|
Packit |
030a23 |
t = vec_sr (t, create_mask_32_128(5));
|
|
Packit |
030a23 |
rb = vec_or (rb, t);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
t = vec_and (g, mask_565_fix_g);
|
|
Packit |
030a23 |
t = vec_sr (t, create_mask_32_128(6));
|
|
Packit |
030a23 |
g = vec_or (g, t);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return vec_or (rb, g);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline int
|
|
Packit |
030a23 |
is_opaque (vector unsigned int x)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t cmp_result;
|
|
Packit |
030a23 |
vector bool int ffs = vec_cmpeq(x, x);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
cmp_result = vec_all_eq(x, ffs);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return (cmp_result & 0x8888) == 0x8888;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline int
|
|
Packit |
030a23 |
is_zero (vector unsigned int x)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t cmp_result;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
cmp_result = vec_all_eq(x, (vector unsigned int) AVV(0));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return cmp_result == 0xffff;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline int
|
|
Packit |
030a23 |
is_transparent (vector unsigned int x)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t cmp_result;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
cmp_result = vec_all_eq(x, (vector unsigned int) AVV(0));
|
|
Packit |
030a23 |
return (cmp_result & 0x8888) == 0x8888;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline uint32_t
|
|
Packit |
030a23 |
core_combine_over_u_pixel_vmx (uint32_t src, uint32_t dst)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
a = ALPHA_8(src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (a == 0xff)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
return src;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else if (src)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4(dst, (~a & MASK), src);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return dst;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline uint32_t
|
|
Packit |
030a23 |
combine1 (const uint32_t *ps, const uint32_t *pm)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = *ps;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (pm)
|
|
Packit |
030a23 |
UN8x4_MUL_UN8(s, ALPHA_8(*pm));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline vector unsigned int
|
|
Packit |
030a23 |
combine4 (const uint32_t* ps, const uint32_t* pm)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned int src, msk;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (pm)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
msk = load_128_unaligned(pm);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (is_transparent(msk))
|
|
Packit |
030a23 |
return (vector unsigned int) AVV(0);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src = load_128_unaligned(ps);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (pm)
|
|
Packit |
030a23 |
src = pix_multiply(src, msk);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return src;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_over_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = over (vsrc, splat_alpha (vsrc), vdest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_over_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t ia;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s);
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = over (vsrc, splat_alpha (vsrc), vdest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t ia;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s);
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_over_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_over_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_over_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_over_reverse_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (s, ia, d);
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = over (vdest, splat_alpha (vdest), vsrc);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t ia = ALPHA_8 (~dest[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (s, ia, d);
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_over_reverse_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (s, ia, d);
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = over (vdest, splat_alpha (vdest), vsrc);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t ia = ALPHA_8 (~dest[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (s, ia, d);
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_over_reverse_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_over_reverse_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_over_reverse_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_in_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (*dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, a);
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vsrc, splat_alpha (vdest));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (dest[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, a);
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_in_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (*dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vsrc, splat_alpha (vdest));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (dest[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_in_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_in_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_in_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_in_reverse_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (*src++);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vdest, splat_alpha (vsrc));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (src[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_in_reverse_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t a = *src++;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, m);
|
|
Packit |
030a23 |
a = ALPHA_8 (a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vdest, splat_alpha (vsrc));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t a = src[i];
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, m);
|
|
Packit |
030a23 |
a = ALPHA_8 (a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_in_reverse_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_in_reverse_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_in_reverse_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_out_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (~(*dest));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vsrc, splat_alpha (negate (vdest)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (~dest[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_out_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (~(*dest));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vsrc, splat_alpha (negate (vdest)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (~dest[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_out_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_out_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_out_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_out_reverse_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (~(*src++));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vdest, splat_alpha (negate (vsrc)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t a = ALPHA_8 (~src[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_out_reverse_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t a = *src++;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, m);
|
|
Packit |
030a23 |
a = ALPHA_8 (~a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vdest, splat_alpha (negate (vsrc)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t a = src[i];
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, m);
|
|
Packit |
030a23 |
a = ALPHA_8 (~a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_out_reverse_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_out_reverse_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_out_reverse_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_atop_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t dest_a = ALPHA_8 (d);
|
|
Packit |
030a23 |
uint32_t src_ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_a, d, src_ia);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add_mul (vsrc, splat_alpha (vdest),
|
|
Packit |
030a23 |
vdest, splat_alpha (negate (vsrc)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t dest_a = ALPHA_8 (d);
|
|
Packit |
030a23 |
uint32_t src_ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_a, d, src_ia);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_atop_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t dest_a = ALPHA_8 (d);
|
|
Packit |
030a23 |
uint32_t src_ia;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src_ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_a, d, src_ia);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add_mul (vsrc, splat_alpha (vdest),
|
|
Packit |
030a23 |
vdest, splat_alpha (negate (vsrc)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t dest_a = ALPHA_8 (d);
|
|
Packit |
030a23 |
uint32_t src_ia;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src_ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_a, d, src_ia);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_atop_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_atop_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_atop_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_atop_reverse_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t src_a = ALPHA_8 (s);
|
|
Packit |
030a23 |
uint32_t dest_ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add_mul (vdest, splat_alpha (vsrc),
|
|
Packit |
030a23 |
vsrc, splat_alpha (negate (vdest)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t src_a = ALPHA_8 (s);
|
|
Packit |
030a23 |
uint32_t dest_ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_atop_reverse_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t src_a;
|
|
Packit |
030a23 |
uint32_t dest_ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src_a = ALPHA_8 (s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add_mul (vdest, splat_alpha (vsrc),
|
|
Packit |
030a23 |
vsrc, splat_alpha (negate (vdest)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t src_a;
|
|
Packit |
030a23 |
uint32_t dest_ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src_a = ALPHA_8 (s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_atop_reverse_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_atop_reverse_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_atop_reverse_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_xor_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t src_ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
uint32_t dest_ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_ia);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add_mul (vsrc, splat_alpha (negate (vdest)),
|
|
Packit |
030a23 |
vdest, splat_alpha (negate (vsrc)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t src_ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
uint32_t dest_ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_ia);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_xor_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t src_ia;
|
|
Packit |
030a23 |
uint32_t dest_ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src_ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_ia);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add_mul (vsrc, splat_alpha (negate (vdest)),
|
|
Packit |
030a23 |
vdest, splat_alpha (negate (vsrc)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t src_ia;
|
|
Packit |
030a23 |
uint32_t dest_ia = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src_ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_ia);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_xor_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_xor_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_xor_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_add_u_no_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_ADD_UN8x4 (d, s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKS (dest, src);
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORS (dest, src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add (vsrc, vdest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_ADD_UN8x4 (d, s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_add_u_mask (uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t *src,
|
|
Packit |
030a23 |
const uint32_t *mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (*mask++);
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
UN8x4_ADD_UN8x4 (d, s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSM (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add (vsrc, vdest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t m = ALPHA_8 (mask[i]);
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
UN8x4_ADD_UN8x4 (d, s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_add_u (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
vmx_combine_add_u_mask (dest, src, mask, width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
vmx_combine_add_u_no_mask (dest, src, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_src_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vsrc, vmask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_over_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4 (d, ~a, s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = in_over (vsrc, splat_alpha (vsrc), vmask, vdest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4 (d, ~a, s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_over_reverse_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t ida = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (s, ida, d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = over (vdest, splat_alpha (vdest), pix_multiply (vsrc, vmask));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t ida = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (s, ida, d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_in_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (*dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (pix_multiply (vsrc, vmask), splat_alpha (vdest));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (dest[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_in_reverse_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (*src++);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (vdest, pix_multiply (vmask, splat_alpha (vsrc)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (src[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (d, a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_out_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (
|
|
Packit |
030a23 |
pix_multiply (vsrc, vmask), splat_alpha (negate (vdest)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_out_reverse_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (d, ~a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_multiply (
|
|
Packit |
030a23 |
vdest, negate (pix_multiply (vmask, splat_alpha (vsrc))));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (d, ~a);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_atop_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask, vsrca;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ~a, s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vsrca = splat_alpha (vsrc);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vsrc = pix_multiply (vsrc, vmask);
|
|
Packit |
030a23 |
vmask = pix_multiply (vmask, vsrca);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add_mul (vsrc, splat_alpha (vdest),
|
|
Packit |
030a23 |
negate (vmask), vdest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ~a, s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_atop_reverse_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, a, s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add_mul (vdest,
|
|
Packit |
030a23 |
pix_multiply (vmask, splat_alpha (vsrc)),
|
|
Packit |
030a23 |
pix_multiply (vsrc, vmask),
|
|
Packit |
030a23 |
negate (splat_alpha (vdest)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, a, s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_xor_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ~a, s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = d;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add_mul (vdest,
|
|
Packit |
030a23 |
negate (pix_multiply (vmask, splat_alpha (vsrc))),
|
|
Packit |
030a23 |
pix_multiply (vsrc, vmask),
|
|
Packit |
030a23 |
negate (splat_alpha (vdest)));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
uint32_t sa = ALPHA_8 (s);
|
|
Packit |
030a23 |
uint32_t da = ALPHA_8 (~d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (a, sa);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ~a, s, da);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_combine_add_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_op_t op,
|
|
Packit |
030a23 |
uint32_t * dest,
|
|
Packit |
030a23 |
const uint32_t * src,
|
|
Packit |
030a23 |
const uint32_t * mask,
|
|
Packit |
030a23 |
int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
vector unsigned int vdest, vsrc, vmask;
|
|
Packit |
030a23 |
DECLARE_SRC_MASK_VAR;
|
|
Packit |
030a23 |
DECLARE_MASK_MASK_VAR;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (width && ((uintptr_t)dest & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = *mask++;
|
|
Packit |
030a23 |
uint32_t s = *src++;
|
|
Packit |
030a23 |
uint32_t d = *dest;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_ADD_UN8x4 (s, d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*dest++ = s;
|
|
Packit |
030a23 |
width--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
COMPUTE_SHIFT_MASKC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* printf ("%s\n",__PRETTY_FUNCTION__); */
|
|
Packit |
030a23 |
for (i = width / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
LOAD_VECTORSC (dest, src, mask);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vdest = pix_add (pix_multiply (vsrc, vmask), vdest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
STORE_VECTOR (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
dest += 4;
|
|
Packit |
030a23 |
mask += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = width % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t a = mask[i];
|
|
Packit |
030a23 |
uint32_t s = src[i];
|
|
Packit |
030a23 |
uint32_t d = dest[i];
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, a);
|
|
Packit |
030a23 |
UN8x4_ADD_UN8x4 (s, d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest[i] = s;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_composite_over_n_8_8888 (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_composite_info_t *info)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_COMPOSITE_ARGS (info);
|
|
Packit |
030a23 |
uint32_t src, srca;
|
|
Packit |
030a23 |
uint32_t *dst_line, *dst;
|
|
Packit |
030a23 |
uint8_t *mask_line;
|
|
Packit |
030a23 |
int dst_stride, mask_stride;
|
|
Packit |
030a23 |
int32_t w;
|
|
Packit |
030a23 |
uint32_t m, d, s, ia;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vector unsigned int vsrc, valpha, vmask, vdst;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src = _pixman_image_get_solid (imp, src_image, dest_image->bits.format);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
srca = ALPHA_8(src);
|
|
Packit |
030a23 |
if (src == 0)
|
|
Packit |
030a23 |
return;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1);
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
mask_image, mask_x, mask_y, uint8_t, mask_stride, mask_line, 1);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vsrc = (vector unsigned int) {src, src, src, src};
|
|
Packit |
030a23 |
valpha = splat_alpha(vsrc);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (height--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
const uint8_t *pm = mask_line;
|
|
Packit |
030a23 |
dst = dst_line;
|
|
Packit |
030a23 |
dst_line += dst_stride;
|
|
Packit |
030a23 |
mask_line += mask_stride;
|
|
Packit |
030a23 |
w = width;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w && (uintptr_t)dst & 15)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
s = src;
|
|
Packit |
030a23 |
m = *pm++;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (m)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
d = *dst;
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s);
|
|
Packit |
030a23 |
*dst = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
dst++;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 4)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
m = *((uint32_t*)pm);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (srca == 0xff && m == 0xffffffff)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
save_128_aligned(dst, vsrc);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else if (m)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vmask = splat_pixel((vector unsigned int) {m, m, m, m});
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* dst is 16-byte aligned */
|
|
Packit |
030a23 |
vdst = in_over (vsrc, valpha, vmask, load_128_aligned (dst));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
save_128_aligned(dst, vdst);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
w -= 4;
|
|
Packit |
030a23 |
dst += 4;
|
|
Packit |
030a23 |
pm += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
s = src;
|
|
Packit |
030a23 |
m = *pm++;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (m)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
d = *dst;
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (s, m);
|
|
Packit |
030a23 |
ia = ALPHA_8 (~s);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s);
|
|
Packit |
030a23 |
*dst = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
dst++;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_bool_t
|
|
Packit |
030a23 |
vmx_fill (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
uint32_t * bits,
|
|
Packit |
030a23 |
int stride,
|
|
Packit |
030a23 |
int bpp,
|
|
Packit |
030a23 |
int x,
|
|
Packit |
030a23 |
int y,
|
|
Packit |
030a23 |
int width,
|
|
Packit |
030a23 |
int height,
|
|
Packit |
030a23 |
uint32_t filler)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t byte_width;
|
|
Packit |
030a23 |
uint8_t *byte_line;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vector unsigned int vfiller;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (bpp == 8)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint8_t b;
|
|
Packit |
030a23 |
uint16_t w;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
stride = stride * (int) sizeof (uint32_t) / 1;
|
|
Packit |
030a23 |
byte_line = (uint8_t *)(((uint8_t *)bits) + stride * y + x);
|
|
Packit |
030a23 |
byte_width = width;
|
|
Packit |
030a23 |
stride *= 1;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
b = filler & 0xff;
|
|
Packit |
030a23 |
w = (b << 8) | b;
|
|
Packit |
030a23 |
filler = (w << 16) | w;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else if (bpp == 16)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
stride = stride * (int) sizeof (uint32_t) / 2;
|
|
Packit |
030a23 |
byte_line = (uint8_t *)(((uint16_t *)bits) + stride * y + x);
|
|
Packit |
030a23 |
byte_width = 2 * width;
|
|
Packit |
030a23 |
stride *= 2;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
filler = (filler & 0xffff) * 0x00010001;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else if (bpp == 32)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
stride = stride * (int) sizeof (uint32_t) / 4;
|
|
Packit |
030a23 |
byte_line = (uint8_t *)(((uint32_t *)bits) + stride * y + x);
|
|
Packit |
030a23 |
byte_width = 4 * width;
|
|
Packit |
030a23 |
stride *= 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
return FALSE;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vfiller = create_mask_1x32_128(&filler);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (height--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int w;
|
|
Packit |
030a23 |
uint8_t *d = byte_line;
|
|
Packit |
030a23 |
byte_line += stride;
|
|
Packit |
030a23 |
w = byte_width;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (w >= 1 && ((uintptr_t)d & 1))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*(uint8_t *)d = filler;
|
|
Packit |
030a23 |
w -= 1;
|
|
Packit |
030a23 |
d += 1;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 2 && ((uintptr_t)d & 3))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*(uint16_t *)d = filler;
|
|
Packit |
030a23 |
w -= 2;
|
|
Packit |
030a23 |
d += 2;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 4 && ((uintptr_t)d & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*(uint32_t *)d = filler;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
w -= 4;
|
|
Packit |
030a23 |
d += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 128)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 4);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 8);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 12);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 16);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 20);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 24);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 28);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
d += 128;
|
|
Packit |
030a23 |
w -= 128;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (w >= 64)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 4);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 8);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 12);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
d += 64;
|
|
Packit |
030a23 |
w -= 64;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (w >= 32)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d);
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d + 4);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
d += 32;
|
|
Packit |
030a23 |
w -= 32;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (w >= 16)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vec_st(vfiller, 0, (uint32_t *) d);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
d += 16;
|
|
Packit |
030a23 |
w -= 16;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 4)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*(uint32_t *)d = filler;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
w -= 4;
|
|
Packit |
030a23 |
d += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (w >= 2)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*(uint16_t *)d = filler;
|
|
Packit |
030a23 |
w -= 2;
|
|
Packit |
030a23 |
d += 2;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (w >= 1)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*(uint8_t *)d = filler;
|
|
Packit |
030a23 |
w -= 1;
|
|
Packit |
030a23 |
d += 1;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return TRUE;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_composite_src_x888_8888 (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_composite_info_t *info)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_COMPOSITE_ARGS (info);
|
|
Packit |
030a23 |
uint32_t *dst_line, *dst;
|
|
Packit |
030a23 |
uint32_t *src_line, *src;
|
|
Packit |
030a23 |
int32_t w;
|
|
Packit |
030a23 |
int dst_stride, src_stride;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1);
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
src_image, src_x, src_y, uint32_t, src_stride, src_line, 1);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (height--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
dst = dst_line;
|
|
Packit |
030a23 |
dst_line += dst_stride;
|
|
Packit |
030a23 |
src = src_line;
|
|
Packit |
030a23 |
src_line += src_stride;
|
|
Packit |
030a23 |
w = width;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w && (uintptr_t)dst & 15)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*dst++ = *src++ | 0xff000000;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 16)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned int vmx_src1, vmx_src2, vmx_src3, vmx_src4;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vmx_src1 = load_128_unaligned (src);
|
|
Packit |
030a23 |
vmx_src2 = load_128_unaligned (src + 4);
|
|
Packit |
030a23 |
vmx_src3 = load_128_unaligned (src + 8);
|
|
Packit |
030a23 |
vmx_src4 = load_128_unaligned (src + 12);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
save_128_aligned (dst, vec_or (vmx_src1, mask_ff000000));
|
|
Packit |
030a23 |
save_128_aligned (dst + 4, vec_or (vmx_src2, mask_ff000000));
|
|
Packit |
030a23 |
save_128_aligned (dst + 8, vec_or (vmx_src3, mask_ff000000));
|
|
Packit |
030a23 |
save_128_aligned (dst + 12, vec_or (vmx_src4, mask_ff000000));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dst += 16;
|
|
Packit |
030a23 |
src += 16;
|
|
Packit |
030a23 |
w -= 16;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*dst++ = *src++ | 0xff000000;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_composite_over_n_8888 (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_composite_info_t *info)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_COMPOSITE_ARGS (info);
|
|
Packit |
030a23 |
uint32_t *dst_line, *dst;
|
|
Packit |
030a23 |
uint32_t src, ia;
|
|
Packit |
030a23 |
int i, w, dst_stride;
|
|
Packit |
030a23 |
vector unsigned int vdst, vsrc, via;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src = _pixman_image_get_solid (imp, src_image, dest_image->bits.format);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (src == 0)
|
|
Packit |
030a23 |
return;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vsrc = (vector unsigned int){src, src, src, src};
|
|
Packit |
030a23 |
via = negate (splat_alpha (vsrc));
|
|
Packit |
030a23 |
ia = ALPHA_8 (~src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (height--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
dst = dst_line;
|
|
Packit |
030a23 |
dst_line += dst_stride;
|
|
Packit |
030a23 |
w = width;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w && ((uintptr_t)dst & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t d = *dst;
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, src);
|
|
Packit |
030a23 |
*dst++ = d;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = w / 4; i > 0; i--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vdst = pix_multiply (load_128_aligned (dst), via);
|
|
Packit |
030a23 |
save_128_aligned (dst, pix_add (vsrc, vdst));
|
|
Packit |
030a23 |
dst += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = w % 4; --i >= 0;)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t d = dst[i];
|
|
Packit |
030a23 |
UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, src);
|
|
Packit |
030a23 |
dst[i] = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_composite_over_8888_8888 (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_composite_info_t *info)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_COMPOSITE_ARGS (info);
|
|
Packit |
030a23 |
int dst_stride, src_stride;
|
|
Packit |
030a23 |
uint32_t *dst_line, *dst;
|
|
Packit |
030a23 |
uint32_t *src_line, *src;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1);
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
src_image, src_x, src_y, uint32_t, src_stride, src_line, 1);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dst = dst_line;
|
|
Packit |
030a23 |
src = src_line;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (height--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vmx_combine_over_u (imp, op, dst, src, NULL, width);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dst += dst_stride;
|
|
Packit |
030a23 |
src += src_stride;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_composite_over_n_8888_8888_ca (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_composite_info_t *info)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_COMPOSITE_ARGS (info);
|
|
Packit |
030a23 |
uint32_t src, ia;
|
|
Packit |
030a23 |
uint32_t *dst_line, d;
|
|
Packit |
030a23 |
uint32_t *mask_line, m;
|
|
Packit |
030a23 |
uint32_t pack_cmp;
|
|
Packit |
030a23 |
int dst_stride, mask_stride;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vector unsigned int vsrc, valpha, vmask, vdest;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
src = _pixman_image_get_solid (imp, src_image, dest_image->bits.format);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (src == 0)
|
|
Packit |
030a23 |
return;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1);
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
mask_image, mask_x, mask_y, uint32_t, mask_stride, mask_line, 1);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vsrc = (vector unsigned int) {src, src, src, src};
|
|
Packit |
030a23 |
valpha = splat_alpha(vsrc);
|
|
Packit |
030a23 |
ia = ALPHA_8 (src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (height--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int w = width;
|
|
Packit |
030a23 |
const uint32_t *pm = (uint32_t *)mask_line;
|
|
Packit |
030a23 |
uint32_t *pd = (uint32_t *)dst_line;
|
|
Packit |
030a23 |
uint32_t s;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dst_line += dst_stride;
|
|
Packit |
030a23 |
mask_line += mask_stride;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w && (uintptr_t)pd & 15)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
s = src;
|
|
Packit |
030a23 |
m = *pm++;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (m)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
d = *pd;
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, m);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (m, ia);
|
|
Packit |
030a23 |
m = ~m;
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4 (d, m, s);
|
|
Packit |
030a23 |
*pd = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pd++;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 4)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
/* pm is NOT necessarily 16-byte aligned */
|
|
Packit |
030a23 |
vmask = load_128_unaligned (pm);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pack_cmp = vec_all_eq(vmask, (vector unsigned int) AVV(0));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* if all bits in mask are zero, pack_cmp is not 0 */
|
|
Packit |
030a23 |
if (pack_cmp == 0)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
/* pd is 16-byte aligned */
|
|
Packit |
030a23 |
vdest = in_over (vsrc, valpha, vmask, load_128_aligned (pd));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
save_128_aligned(pd, vdest);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pd += 4;
|
|
Packit |
030a23 |
pm += 4;
|
|
Packit |
030a23 |
w -= 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
s = src;
|
|
Packit |
030a23 |
m = *pm++;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (m)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
d = *pd;
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4 (s, m);
|
|
Packit |
030a23 |
UN8x4_MUL_UN8 (m, ia);
|
|
Packit |
030a23 |
m = ~m;
|
|
Packit |
030a23 |
UN8x4_MUL_UN8x4_ADD_UN8x4 (d, m, s);
|
|
Packit |
030a23 |
*pd = d;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pd++;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_composite_add_8_8 (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_composite_info_t *info)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_COMPOSITE_ARGS (info);
|
|
Packit |
030a23 |
uint8_t *dst_line, *dst;
|
|
Packit |
030a23 |
uint8_t *src_line, *src;
|
|
Packit |
030a23 |
int dst_stride, src_stride;
|
|
Packit |
030a23 |
int32_t w;
|
|
Packit |
030a23 |
uint16_t t;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
src_image, src_x, src_y, uint8_t, src_stride, src_line, 1);
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
dest_image, dest_x, dest_y, uint8_t, dst_stride, dst_line, 1);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (height--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
dst = dst_line;
|
|
Packit |
030a23 |
src = src_line;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dst_line += dst_stride;
|
|
Packit |
030a23 |
src_line += src_stride;
|
|
Packit |
030a23 |
w = width;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Small head */
|
|
Packit |
030a23 |
while (w && (uintptr_t)dst & 3)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
t = (*dst) + (*src++);
|
|
Packit |
030a23 |
*dst++ = t | (0 - (t >> 8));
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vmx_combine_add_u (imp, op,
|
|
Packit |
030a23 |
(uint32_t*)dst, (uint32_t*)src, NULL, w >> 2);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Small tail */
|
|
Packit |
030a23 |
dst += w & 0xfffc;
|
|
Packit |
030a23 |
src += w & 0xfffc;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
w &= 3;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
t = (*dst) + (*src++);
|
|
Packit |
030a23 |
*dst++ = t | (0 - (t >> 8));
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
vmx_composite_add_8888_8888 (pixman_implementation_t *imp,
|
|
Packit |
030a23 |
pixman_composite_info_t *info)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_COMPOSITE_ARGS (info);
|
|
Packit |
030a23 |
uint32_t *dst_line, *dst;
|
|
Packit |
030a23 |
uint32_t *src_line, *src;
|
|
Packit |
030a23 |
int dst_stride, src_stride;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
src_image, src_x, src_y, uint32_t, src_stride, src_line, 1);
|
|
Packit |
030a23 |
PIXMAN_IMAGE_GET_LINE (
|
|
Packit |
030a23 |
dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (height--)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
dst = dst_line;
|
|
Packit |
030a23 |
dst_line += dst_stride;
|
|
Packit |
030a23 |
src = src_line;
|
|
Packit |
030a23 |
src_line += src_stride;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vmx_combine_add_u (imp, op, dst, src, NULL, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static force_inline void
|
|
Packit |
030a23 |
scaled_nearest_scanline_vmx_8888_8888_OVER (uint32_t* pd,
|
|
Packit |
030a23 |
const uint32_t* ps,
|
|
Packit |
030a23 |
int32_t w,
|
|
Packit |
030a23 |
pixman_fixed_t vx,
|
|
Packit |
030a23 |
pixman_fixed_t unit_x,
|
|
Packit |
030a23 |
pixman_fixed_t src_width_fixed,
|
|
Packit |
030a23 |
pixman_bool_t fully_transparent_src)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t s, d;
|
|
Packit |
030a23 |
const uint32_t* pm = NULL;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vector unsigned int vsrc, vdst;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (fully_transparent_src)
|
|
Packit |
030a23 |
return;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Align dst on a 16-byte boundary */
|
|
Packit |
030a23 |
while (w && ((uintptr_t)pd & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
d = *pd;
|
|
Packit |
030a23 |
s = combine1 (ps + pixman_fixed_to_int (vx), pm);
|
|
Packit |
030a23 |
vx += unit_x;
|
|
Packit |
030a23 |
while (vx >= 0)
|
|
Packit |
030a23 |
vx -= src_width_fixed;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*pd++ = core_combine_over_u_pixel_vmx (s, d);
|
|
Packit |
030a23 |
if (pm)
|
|
Packit |
030a23 |
pm++;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 4)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vector unsigned int tmp;
|
|
Packit |
030a23 |
uint32_t tmp1, tmp2, tmp3, tmp4;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
tmp1 = *(ps + pixman_fixed_to_int (vx));
|
|
Packit |
030a23 |
vx += unit_x;
|
|
Packit |
030a23 |
while (vx >= 0)
|
|
Packit |
030a23 |
vx -= src_width_fixed;
|
|
Packit |
030a23 |
tmp2 = *(ps + pixman_fixed_to_int (vx));
|
|
Packit |
030a23 |
vx += unit_x;
|
|
Packit |
030a23 |
while (vx >= 0)
|
|
Packit |
030a23 |
vx -= src_width_fixed;
|
|
Packit |
030a23 |
tmp3 = *(ps + pixman_fixed_to_int (vx));
|
|
Packit |
030a23 |
vx += unit_x;
|
|
Packit |
030a23 |
while (vx >= 0)
|
|
Packit |
030a23 |
vx -= src_width_fixed;
|
|
Packit |
030a23 |
tmp4 = *(ps + pixman_fixed_to_int (vx));
|
|
Packit |
030a23 |
vx += unit_x;
|
|
Packit |
030a23 |
while (vx >= 0)
|
|
Packit |
030a23 |
vx -= src_width_fixed;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
tmp[0] = tmp1;
|
|
Packit |
030a23 |
tmp[1] = tmp2;
|
|
Packit |
030a23 |
tmp[2] = tmp3;
|
|
Packit |
030a23 |
tmp[3] = tmp4;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
vsrc = combine4 ((const uint32_t *) &tmp, pm);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (is_opaque (vsrc))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
save_128_aligned (pd, vsrc);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else if (!is_zero (vsrc))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vdst = over(vsrc, splat_alpha(vsrc), load_128_aligned (pd));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
save_128_aligned (pd, vdst);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
w -= 4;
|
|
Packit |
030a23 |
pd += 4;
|
|
Packit |
030a23 |
if (pm)
|
|
Packit |
030a23 |
pm += 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
d = *pd;
|
|
Packit |
030a23 |
s = combine1 (ps + pixman_fixed_to_int (vx), pm);
|
|
Packit |
030a23 |
vx += unit_x;
|
|
Packit |
030a23 |
while (vx >= 0)
|
|
Packit |
030a23 |
vx -= src_width_fixed;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*pd++ = core_combine_over_u_pixel_vmx (s, d);
|
|
Packit |
030a23 |
if (pm)
|
|
Packit |
030a23 |
pm++;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
FAST_NEAREST_MAINLOOP (vmx_8888_8888_cover_OVER,
|
|
Packit |
030a23 |
scaled_nearest_scanline_vmx_8888_8888_OVER,
|
|
Packit |
030a23 |
uint32_t, uint32_t, COVER)
|
|
Packit |
030a23 |
FAST_NEAREST_MAINLOOP (vmx_8888_8888_none_OVER,
|
|
Packit |
030a23 |
scaled_nearest_scanline_vmx_8888_8888_OVER,
|
|
Packit |
030a23 |
uint32_t, uint32_t, NONE)
|
|
Packit |
030a23 |
FAST_NEAREST_MAINLOOP (vmx_8888_8888_pad_OVER,
|
|
Packit |
030a23 |
scaled_nearest_scanline_vmx_8888_8888_OVER,
|
|
Packit |
030a23 |
uint32_t, uint32_t, PAD)
|
|
Packit |
030a23 |
FAST_NEAREST_MAINLOOP (vmx_8888_8888_normal_OVER,
|
|
Packit |
030a23 |
scaled_nearest_scanline_vmx_8888_8888_OVER,
|
|
Packit |
030a23 |
uint32_t, uint32_t, NORMAL)
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static const pixman_fast_path_t vmx_fast_paths[] =
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, solid, null, a8r8g8b8, vmx_composite_over_n_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, solid, null, x8r8g8b8, vmx_composite_over_n_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, vmx_composite_over_8888_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, vmx_composite_over_8888_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, vmx_composite_over_8888_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, vmx_composite_over_8888_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, vmx_composite_over_n_8_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, vmx_composite_over_n_8_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, vmx_composite_over_n_8_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, vmx_composite_over_n_8_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, vmx_composite_over_n_8888_8888_ca),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, vmx_composite_over_n_8888_8888_ca),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, vmx_composite_over_n_8888_8888_ca),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, vmx_composite_over_n_8888_8888_ca),
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* PIXMAN_OP_ADD */
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, vmx_composite_add_8_8),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, null, a8r8g8b8, vmx_composite_add_8888_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, null, a8b8g8r8, vmx_composite_add_8888_8888),
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* PIXMAN_OP_SRC */
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, vmx_composite_src_x888_8888),
|
|
Packit |
030a23 |
PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, vmx_composite_src_x888_8888),
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, vmx_8888_8888),
|
|
Packit |
030a23 |
SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, vmx_8888_8888),
|
|
Packit |
030a23 |
SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, vmx_8888_8888),
|
|
Packit |
030a23 |
SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, vmx_8888_8888),
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
{ PIXMAN_OP_NONE },
|
|
Packit |
030a23 |
};
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static uint32_t *
|
|
Packit |
030a23 |
vmx_fetch_x8r8g8b8 (pixman_iter_t *iter, const uint32_t *mask)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int w = iter->width;
|
|
Packit |
030a23 |
vector unsigned int ff000000 = mask_ff000000;
|
|
Packit |
030a23 |
uint32_t *dst = iter->buffer;
|
|
Packit |
030a23 |
uint32_t *src = (uint32_t *)iter->bits;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
iter->bits += iter->stride;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w && ((uintptr_t)dst) & 0x0f)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*dst++ = (*src++) | 0xff000000;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 4)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
save_128_aligned(dst, vec_or(load_128_unaligned(src), ff000000));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dst += 4;
|
|
Packit |
030a23 |
src += 4;
|
|
Packit |
030a23 |
w -= 4;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*dst++ = (*src++) | 0xff000000;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return iter->buffer;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static uint32_t *
|
|
Packit |
030a23 |
vmx_fetch_a8 (pixman_iter_t *iter, const uint32_t *mask)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int w = iter->width;
|
|
Packit |
030a23 |
uint32_t *dst = iter->buffer;
|
|
Packit |
030a23 |
uint8_t *src = iter->bits;
|
|
Packit |
030a23 |
vector unsigned int vmx0, vmx1, vmx2, vmx3, vmx4, vmx5, vmx6;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
iter->bits += iter->stride;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w && (((uintptr_t)dst) & 15))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*dst++ = *(src++) << 24;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w >= 16)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
vmx0 = load_128_unaligned((uint32_t *) src);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
unpack_128_2x128((vector unsigned int) AVV(0), vmx0, &vmx1, &vmx2);
|
|
Packit |
030a23 |
unpack_128_2x128_16((vector unsigned int) AVV(0), vmx1, &vmx3, &vmx4);
|
|
Packit |
030a23 |
unpack_128_2x128_16((vector unsigned int) AVV(0), vmx2, &vmx5, &vmx6);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
save_128_aligned(dst, vmx6);
|
|
Packit |
030a23 |
save_128_aligned((dst + 4), vmx5);
|
|
Packit |
030a23 |
save_128_aligned((dst + 8), vmx4);
|
|
Packit |
030a23 |
save_128_aligned((dst + 12), vmx3);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dst += 16;
|
|
Packit |
030a23 |
src += 16;
|
|
Packit |
030a23 |
w -= 16;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while (w)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*dst++ = *(src++) << 24;
|
|
Packit |
030a23 |
w--;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return iter->buffer;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#define IMAGE_FLAGS \
|
|
Packit |
030a23 |
(FAST_PATH_STANDARD_FLAGS | FAST_PATH_ID_TRANSFORM | \
|
|
Packit |
030a23 |
FAST_PATH_BITS_IMAGE | FAST_PATH_SAMPLES_COVER_CLIP_NEAREST)
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static const pixman_iter_info_t vmx_iters[] =
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
{ PIXMAN_x8r8g8b8, IMAGE_FLAGS, ITER_NARROW,
|
|
Packit |
030a23 |
_pixman_iter_init_bits_stride, vmx_fetch_x8r8g8b8, NULL
|
|
Packit |
030a23 |
},
|
|
Packit |
030a23 |
{ PIXMAN_a8, IMAGE_FLAGS, ITER_NARROW,
|
|
Packit |
030a23 |
_pixman_iter_init_bits_stride, vmx_fetch_a8, NULL
|
|
Packit |
030a23 |
},
|
|
Packit |
030a23 |
{ PIXMAN_null },
|
|
Packit |
030a23 |
};
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_implementation_t *
|
|
Packit |
030a23 |
_pixman_implementation_create_vmx (pixman_implementation_t *fallback)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_implementation_t *imp = _pixman_implementation_create (fallback, vmx_fast_paths);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* VMX constants */
|
|
Packit |
030a23 |
mask_ff000000 = create_mask_32_128 (0xff000000);
|
|
Packit |
030a23 |
mask_red = create_mask_32_128 (0x00f80000);
|
|
Packit |
030a23 |
mask_green = create_mask_32_128 (0x0000fc00);
|
|
Packit |
030a23 |
mask_blue = create_mask_32_128 (0x000000f8);
|
|
Packit |
030a23 |
mask_565_fix_rb = create_mask_32_128 (0x00e000e0);
|
|
Packit |
030a23 |
mask_565_fix_g = create_mask_32_128 (0x0000c000);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Set up function pointers */
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_OVER] = vmx_combine_over_u;
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_OVER_REVERSE] = vmx_combine_over_reverse_u;
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_IN] = vmx_combine_in_u;
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_IN_REVERSE] = vmx_combine_in_reverse_u;
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_OUT] = vmx_combine_out_u;
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_OUT_REVERSE] = vmx_combine_out_reverse_u;
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_ATOP] = vmx_combine_atop_u;
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_ATOP_REVERSE] = vmx_combine_atop_reverse_u;
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_XOR] = vmx_combine_xor_u;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
imp->combine_32[PIXMAN_OP_ADD] = vmx_combine_add_u;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_SRC] = vmx_combine_src_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_OVER] = vmx_combine_over_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_OVER_REVERSE] = vmx_combine_over_reverse_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_IN] = vmx_combine_in_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_IN_REVERSE] = vmx_combine_in_reverse_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_OUT] = vmx_combine_out_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_OUT_REVERSE] = vmx_combine_out_reverse_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_ATOP] = vmx_combine_atop_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_ATOP_REVERSE] = vmx_combine_atop_reverse_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_XOR] = vmx_combine_xor_ca;
|
|
Packit |
030a23 |
imp->combine_32_ca[PIXMAN_OP_ADD] = vmx_combine_add_ca;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
imp->fill = vmx_fill;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
imp->iter_info = vmx_iters;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return imp;
|
|
Packit |
030a23 |
}
|