Быстрое векторизованное преобразование из RGB в BGRA

В ответ на некоторые предыдущие вопросы о преобразовании 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
6
задан Paul R 27 September 2011 в 09:39
поделиться