我正在开发一个iOS应用程序,该应用程序需要相当快地从RGB-> BGRA转换图像。如果可能的话,我想使用NEON内部函数。有没有比简单分配组件更快的方法?

void neonPermuteRGBtoBGRA(unsigned char* src, unsigned char* dst, int numPix)
{
    numPix /= 8; //process 8 pixels at a time

    uint8x8_t alpha = vdup_n_u8 (0xff);

    for (int i=0; i<numPix; i++)
    {
        uint8x8x3_t rgb  = vld3_u8 (src);
        uint8x8x4_t bgra;

        bgra.val[0] = rgb.val[2]; //these lines are slow
        bgra.val[1] = rgb.val[1]; //these lines are slow
        bgra.val[2] = rgb.val[0]; //these lines are slow

        bgra.val[3] = alpha;

        vst4_u8(dst, bgra);

        src += 8*3;
        dst += 8*4;
    }


}

最佳答案

ARMCC的拆卸也不是那么快:

  • 没有使用最适当的说明
  • 它将VFP指令与NEON指令混合在一起,每次
  • 都会造成巨大的打ic

    试试这个 :
      mov r2, r2, lsr #3
      vmov.u8, d3, #0xff
    loop:
      vld3.8 {d0-d2}, [r0]!
      subs r2, r2, #1
      vswp d0, d2
      vst4.8 {d0-d3}, [r1]!
      bgt loop
    
      bx lr
    

    我建议的代码也没有完全优化,但是进一步的“真实”优化会严重损害可读性。所以我在这里停止。

    关于arm - 使用ARM NEON内部函数添加alpha和置换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11890997/

    10-11 15:15