i8320 用NEON做RGB565转RGBA

用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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值