>From 58be83c34eb5b360412049c6fde0b5b85c329da9 Mon Sep 17 00:00:00 2001 From: kui zheng <kui.zh...@arm.com> Date: Wed, 16 Nov 2011 16:25:04 +0800 Subject: [PATCH] generic: Add NEON version of Sacc_to_Aop_rgb16
Signed-off-by: kui zheng <kui.zh...@arm.com> --- src/gfx/generic/generic.c | 2 + src/gfx/generic/generic_neon.h | 113 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 0 deletions(-) diff --git a/src/gfx/generic/generic.c b/src/gfx/generic/generic.c index d6b3b5c..edc1664 100644 --- a/src/gfx/generic/generic.c +++ b/src/gfx/generic/generic.c @@ -9660,6 +9660,8 @@ static void gInit_NEON( void ) /********************************* Sop_PFI_to_Dacc ****************************/ Sop_PFI_to_Dacc[DFB_PIXELFORMAT_INDEX(DSPF_RGB16)] = Sop_rgb16_to_Dacc_NEON; Sop_PFI_to_Dacc[DFB_PIXELFORMAT_INDEX(DSPF_ARGB )] = Sop_argb_to_Dacc_NEON; +/********************************* Sacc_to_Aop_PFI ****************************/ + Sacc_to_Aop_PFI[DFB_PIXELFORMAT_INDEX(DSPF_RGB16)] = Sacc_to_Aop_rgb16_NEON; /********************************* misc accumulator operations ****************/ SCacc_add_to_Dacc = SCacc_add_to_Dacc_NEON; Sacc_add_to_Dacc = Sacc_add_to_Dacc_NEON; diff --git a/src/gfx/generic/generic_neon.h b/src/gfx/generic/generic_neon.h index 6498638..907dc44 100644 --- a/src/gfx/generic/generic_neon.h +++ b/src/gfx/generic/generic_neon.h @@ -380,3 +380,116 @@ static void Sacc_add_to_Dacc_NEON ( GenefxState *gfxs ) } } +/* + * NEON version of Sacc_to_Aop_rgb16 + */ +static void Sacc_to_Aop_rgb16_NEON ( GenefxState *gfxs ) +{ + int w = gfxs->length; + GenefxAccumulator *S = gfxs->Sacc; + u16 *D = gfxs->Aop[0]; + int Dstep = gfxs->Astep; + unsigned int loop; + unsigned int single; + u32 mask = 0xFF00FF00; + u32 color = 0x00FF00FF; + int i, j; + +#define PIXEL_OUT( a, r, g, b ) PIXEL_RGB16( r, g, b ) + +#define PIXEL( x ) PIXEL_OUT( ((x).RGB.a & 0xFF00) ? 0xFF : (x).RGB.a, \ + ((x).RGB.r & 0xFF00) ? 0xFF : (x).RGB.r, \ + ((x).RGB.g & 0xFF00) ? 0xFF : (x).RGB.g, \ + ((x).RGB.b & 0xFF00) ? 0xFF : (x).RGB.b ) + + if (Dstep != 1) { + while (w--) { + if (!(S->RGB.a & 0xF000)) + *D = PIXEL( *S ); + + S++; + D += Dstep; + } + return; + } + + if ((long)D & 2) { + if (!(S->RGB.a & 0xF000)) + *D = PIXEL( *S ); + S++; + D++; + w--; + } + + loop = w >> 3; + single = w & 0x7; + while(loop){ + for (i=0; i<8; i++) { + if ((S[i].RGB.a & 0xF000)) { + break; + } + } + if (i < 8) { + for (j=0; j<i; j++) + D[j] = PIXEL( S[j] ); + for (j=i+1; j<8; j++) { + if (!(S[j].RGB.a & 0xF000)) + D[j] = PIXEL( S[j] ); + } + } else { + __asm__ __volatile__ ( + "mov r4, %[S] \n\t" + "pld [r4, #0xC0] \n\t" + "pld [r4, #0x100] \n\t" + "vld4.16 {d0, d2, d4, d6}, [r4]! \n\t" + "vld4.16 {d1, d3, d5, d7}, [r4] \n\t" + "vdup.32 q3, %[mask] \n\t" + "vdup.32 q4, %[color] \n\t" + /* b */ + "vtst.16 q5, q0, q3 \n\t" + "vceq.u16 q6, q5, #0 \n\t" + "vand.16 q5, q4, q5 \n\t" + "vand.16 q6, q0, q6 \n\t" + "vorr.16 q0, q5, q6 \n\t" + "vshr.u16 q0, q0, #3 \n\t" + /* g */ + "vtst.16 q5, q1, q3 \n\t" + "vceq.u16 q6, q5, #0 \n\t" + "vand.16 q5, q4, q5 \n\t" + "vand.16 q6, q1, q6 \n\t" + "vorr.16 q1, q5, q6 \n\t" + "vshr.u16 q1, q1, #2 \n\t" + "vshl.u16 q1, q1, #5 \n\t" + /* r */ + "vtst.16 q5, q2, q3 \n\t" + "vceq.u16 q6, q5, #0 \n\t" + "vand.16 q5, q4, q5 \n\t" + "vand.16 q6, q2, q6 \n\t" + "vorr.16 q2, q5, q6 \n\t" + "vshr.u16 q2, q2, #3 \n\t" + "vshl.u16 q2, q2, #11 \n\t" + /* rgb */ + "vorr.16 q1, q1, q2 \n\t" + "vorr.16 q0, q0, q1 \n\t" + "vst1.16 {d0, d1}, [%[D]] " + : + : [D] "r" (D), [S] "r" (S), [mask] "r" (mask), [color] "r" (color) + : "memory", "r4", "d0", "d1", "d2", "d3", "d4","d5", "d6", + "d7", "d8", "d9", "d10", "d11", "d12", "d13" + ); + }//else + S += 8; + D += 8; + loop--; + }// end of loop + + while (single){ + if (!(S->RGB.a & 0xF000)) { + *D = PIXEL( *S ); + } + S++; + D++; + single--; + } +} + -- 1.7.1 -- IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
0007-generic-Add-NEON-version-of-Sacc_to_Aop_rgb16.patch
Description: 0007-generic-Add-NEON-version-of-Sacc_to_Aop_rgb16.patch
_______________________________________________ directfb-dev mailing list directfb-dev@directfb.org http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev