В ответ на некоторые предыдущие вопросы о преобразовании RGB в RGBA и ARGB в BGR я хотел бы ускорить RGB до Преобразование BGRA с помощью SSE . Предположим, что на 32-битной машине вы хотите использовать встроенные функции . У меня возникли трудности с выравниванием исходных и целевых буферов для работы со 128-битными регистрами, и я ищу другие хитрые решения векторизации.
Процедура векторизации выглядит следующим образом ...
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;
}
}
Эта процедура используется в первую очередь для большие текстуры (512 КБ), поэтому, если я смогу распараллелить некоторые операции, может быть полезно обрабатывать больше пикселей за один раз. Конечно, мне понадобится профиль. :)
Изменить:
Мои аргументы компиляции ...
gcc -O2 main.c