小型のLCDに画像を表示するためにcairoのメモリバッファに書いて、それをSPIでLCDに転送しています。
LCDに転送する前にRGB24からRBG16に変換していました。
for (x = 0; x < data->width * 4; ++x) {
#if BYTE_ORDER == BIG_ENDIAN
color = (*(framedata + 1) >> 3) << 11;
color |= (*(framedata + 2) >> 2) << 5;
color |= *(framedata + 3) >> 3;
#else
color = (*(framedata + 2) >> 3) << 11;
color |= (*(framedata + 1) >> 2) << 5;
color |= *(framedata + 0) >> 3;
#endif
framedata += 4;
txbuf[i] = color >> 8;
++i;
txbuf[i] = color & 0xff;
++i;
こういう処理ってSIMDで出来るのかもしれませんが、MIPS DSPでコピペできるような適当なコードが見つかりません。またAtherosの24KにはDSPがありません。
はたと考えました。そもそもcairoのsurfaceをRGB16で作れば変換しなくてもいいはずです。
cairo_image_surface_create()のパラメータをCAIRO_FORMAT_RGB24からCAIRO_FORMAT_RGB16_565に変換して、コピーのコードを以下のようにしてみました。
#if BYTE_ORDER == BIG_ENDIAN
txbuf[i] = *framedata++;
txbuf[i + 1] = *framedata++;
#else
txbuf[i + 1] = *framedata++;
txbuf[i] = *framedata++;
#endif
i += 2;
SPIの転送がボトルネックで劇的には早くなりません。