MCPcopy Create free account
hub / github.com/Aleksoid1978/VideoRenderer / CopyFrameRGB48_SSSE3

Function CopyFrameRGB48_SSSE3

Source/Helper.cpp:567–598  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

565}
566
567void CopyFrameRGB48_SSSE3(const UINT lines, BYTE* dst, UINT dst_pitch, const BYTE* src, int src_pitch)
568{
569 UINT line_pixels = abs(src_pitch) / 6;
570 UINT line_pixels8 = line_pixels & ~(8u - 1);
571
572 __m128i mask = _mm_setr_epi8(0, 1, 2, 3, 4, 5, -1, -1, 6, 7, 8, 9, 10, 11, -1, -1);
573
574 for (UINT y = 0; y < lines; ++y) {
575 __m128i *src128 = (__m128i*)src;
576 __m128i *dst128 = (__m128i*)dst;
577 for (UINT i = 0; i < line_pixels8; i += 8) {
578 __m128i sa = _mm_load_si128(src128);
579 __m128i sb = _mm_load_si128(src128 + 1);
580 __m128i sc = _mm_load_si128(src128 + 2);
581
582 __m128i val = _mm_shuffle_epi8(sa, mask);
583 _mm_store_si128(dst128, val);
584 val = _mm_shuffle_epi8(_mm_alignr_epi8(sb, sa, 12), mask);
585 _mm_store_si128(dst128 + 1, val);
586 val = _mm_shuffle_epi8(_mm_alignr_epi8(sc, sb, 8), mask);
587 _mm_store_si128(dst128 + 2, val);
588 val = _mm_shuffle_epi8(_mm_alignr_epi8(sc, sc, 4), mask);
589 _mm_store_si128(dst128 + 3, val);
590
591 src128 += 3;
592 dst128 += 4;
593 }
594
595 src += src_pitch;
596 dst += dst_pitch;
597 }
598}
599
600void CopyFrameBGR48(const UINT lines, BYTE* dst, UINT dst_pitch, const BYTE* src, int src_pitch)
601{

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected