Skip to content

Commit 7a1ed4a

Browse files
committed
loongarch: add BlitRGBtoRGBPixelAlphaLSX opt
1 parent 66ac6f4 commit 7a1ed4a

File tree

1 file changed

+67
-2
lines changed

1 file changed

+67
-2
lines changed

src/video/SDL_blit_A.c

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,66 @@ static void BlitRGBtoRGBPixelAlphaMMX(SDL_BlitInfo *info)
412412

413413
#endif /* __MMX__ */
414414

415+
#if defined(__loongarch_sx)
416+
417+
static void
418+
BlitRGBtoRGBPixelAlphaLSX(SDL_BlitInfo * info)
419+
{
420+
int width = info->dst_w;
421+
int height = info->dst_h;
422+
Uint32 *srcp = (Uint32 *) info->src;
423+
int srcskip = info->src_skip >> 2;
424+
Uint32 *dstp = (Uint32 *) info->dst;
425+
int dstskip = info->dst_skip >> 2;
426+
SDL_PixelFormat *sf = info->src_fmt;
427+
Uint32 amask = sf->Amask;
428+
Uint32 ashift = sf->Ashift;
429+
Uint64 multmask, multmask2;
430+
431+
__m128i src1, src2, src3, dst1, alpha, alpha2;
432+
multmask = 0x00FF;
433+
multmask <<= (ashift * 2);
434+
multmask2 = 0x00FF00FF00FF00FFULL;
435+
436+
while (height--) {
437+
/* *INDENT-OFF* */
438+
DUFFS_LOOP4({
439+
Uint32 alpha1 = *srcp & amask;
440+
if (alpha1 == 0) {
441+
/* do nothing */
442+
} else if (alpha1 == amask) {
443+
*dstp = *srcp;
444+
} else {
445+
src1 = __lsx_vreplgr2vr_w(*srcp);
446+
src1 = __lsx_vinsgr2vr_w(src1, *dstp, 1);
447+
src2 = __lsx_vsllwil_hu_bu(src1, 0);
448+
449+
alpha = __lsx_vreplgr2vr_w(alpha1);
450+
alpha = __lsx_vsrl_d(alpha, __lsx_vreplgr2vr_d(ashift));
451+
alpha = __lsx_vilvl_h(alpha, alpha);
452+
alpha2 = __lsx_vilvl_w(alpha, alpha);
453+
alpha = __lsx_vor_v(alpha2, __lsx_vreplgr2vr_d(multmask));
454+
alpha2 = __lsx_vxor_v(alpha2, __lsx_vreplgr2vr_d(multmask2));
455+
456+
src3 = __lsx_vilvl_d(alpha2, alpha);
457+
src1 = __lsx_vmul_h(src2, src3);
458+
src1 = __lsx_vsrli_h(src1, 8);
459+
src2 = __lsx_vilvh_d(src1, src1);
460+
src1 = __lsx_vadd_h(src1, src2);
461+
dst1 = __lsx_vssrlni_bu_h(src1, src1, 0);
462+
__lsx_vstelm_w(dst1, dstp, 0, 0);
463+
}
464+
++srcp;
465+
++dstp;
466+
}, width);
467+
/* *INDENT-ON* */
468+
srcp += srcskip;
469+
dstp += dstskip;
470+
}
471+
}
472+
473+
#endif /* __loongarch_sx */
474+
415475
#ifdef SDL_ARM_SIMD_BLITTERS
416476
void BlitARGBto565PixelAlphaARMSIMDAsm(int32_t w, int32_t h, uint16_t *dst, int32_t dst_stride, uint32_t *src, int32_t src_stride);
417477

@@ -1456,7 +1516,7 @@ SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface *surface)
14561516

14571517
case 4:
14581518
if (sf->Rmask == df->Rmask && sf->Gmask == df->Gmask && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) {
1459-
#if defined(__MMX__) || defined(__3dNOW__)
1519+
#if defined(__MMX__) || defined(__3dNOW__) || defined(__loongarch_sx)
14601520
if (sf->Rshift % 8 == 0 && sf->Gshift % 8 == 0 && sf->Bshift % 8 == 0 && sf->Ashift % 8 == 0 && sf->Aloss == 0) {
14611521
#ifdef __3dNOW__
14621522
if (SDL_Has3DNow()) {
@@ -1467,9 +1527,14 @@ SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface *surface)
14671527
if (SDL_HasMMX()) {
14681528
return BlitRGBtoRGBPixelAlphaMMX;
14691529
}
1530+
#endif
1531+
#ifdef __loongarch_sx
1532+
if (SDL_HasLSX()) {
1533+
return BlitRGBtoRGBPixelAlphaLSX;
1534+
}
14701535
#endif
14711536
}
1472-
#endif /* __MMX__ || __3dNOW__ */
1537+
#endif /* __MMX__ || __3dNOW__ || __loongarch_sx*/
14731538
if (sf->Amask == 0xff000000) {
14741539
#ifdef SDL_ARM_NEON_BLITTERS
14751540
if (SDL_HasNEON()) {

0 commit comments

Comments
 (0)