在之前关于将RGB转换为RGBA和ARGB转换为BGR的一些问题的跟进中,我希望能够通过SSE加速RGB到BGRA的转换。假设使用32位机器,并且想要使用内置函数。我遇到了困难,无法对齐源缓冲区和目标缓冲区以使用128位寄存器,并寻求其他精明的矢量化解决方案。
需要进行矢量化的例程如下...
这个例程主要用于处理大型纹理(512KB),因此如果我可以并行化某些操作,可能有利于一次处理更多的像素。当然,我需要进行性能分析。 :)
需要进行矢量化的例程如下...
void RGB8ToBGRX8(int w, const void *in, void *out)
{
int i;
int width = w;
const unsigned char *src= (const unsigned char*) in;
unsigned int *dst= (unsigned int*) out;
unsigned int invalue, outvalue;
for (i=0; i<width; i++, src+=3, dst++)
{
invalue = src[0];
outvalue = (invalue<<16);
invalue = src[1];
outvalue |= (invalue<<8);
invalue = src[2];
outvalue |= (invalue);
*dst = outvalue | 0xff000000;
}
}
这个例程主要用于处理大型纹理(512KB),因此如果我可以并行化某些操作,可能有利于一次处理更多的像素。当然,我需要进行性能分析。 :)
编辑:
我的编译参数...
gcc -O2 main.c