i8320 用NEON做RGB565转RGBA

来源:互联网 发布:虚拟展示软件 编辑:程序博客网 时间:2024/06/08 08:27

用NEON做RGB565转RGBA
做GBA模拟器,因为后端要用glTexImage2D加载视频buffer的内容,
不幸的是opengles库做格式转换奇慢。如果让glTexImage2D加载RGB565格式的视频,
游戏帧数一下掉到只有10来帧。用NEON加速后,上升到45帧左右。
void neon_convert (uint8_t * dest, uint8_t * src, int n)
{
    n/=8;
    int i;
    for(i=0;i<n;i++) {
        uint16x8_t rgb=vld1q_u16((uint16_t*)src);
        uint16x8_t gb, b;
        uint8x8x4_t res;

        res.val[3] = vdup_n_u8 (255);
        gb = vshrq_n_u16 (rgb, 5);
        b = vshrq_n_u16 (rgb, 5 + 6);

        res.val[2] = vmovn_u16 (rgb);  /* get low 5 bits */
        res.val[1] = vmovn_u16 (gb);   /* get mid 6 bits */
        res.val[0] = vmovn_u16 (b);    /* get top 5 bits */

        res.val[0] = vshl_n_u8 (res.val[0], 3); /* shift to top */
        res.val[1] = vshl_n_u8 (res.val[1], 2); /* shift to top */
        res.val[2] = vshl_n_u8 (res.val[2], 3); /* shift to top */

        res.val[0] = vsri_n_u8 (res.val[0], res.val[0], 5);
        res.val[1] = vsri_n_u8 (res.val[1], res.val[1], 6);
        res.val[2] = vsri_n_u8 (res.val[2], res.val[2], 5);
        vst4_u8 (dest, res);

        src  += 8*2;
        dest += 8*4;
    }
}