SSE4: colorkey

Autor: Wojciech Muła
Dodany:3.05.2008

Color key — nakładanie obrazu na tło, z pominięciem pikseli obrazu o określonym kolorze.

MMX i SSE

Color key dla obrazów 32bpp, bez kanału alpha:

; xmm7 - 4 piksele o określonym kolorze (colorkey)
; eax  -> nakładany obraz
; ebx  -> tło

0:
        movdqa   %xmm7, %xmm2

        movdqa  (%eax), %xmm0   ; 4 piksele obrazu
        movdqa  (%ebx), %xmm1   ; 4 piksele tła

        pcmpeqd  %xmm0, %xmm2   ; xmm2 - maska: 0xffffffff dla pikseli równych colorkey

        pand     %xmm2, %xmm1   ; xmm1 - wyzerowanie pikseli tła mających zostać nadpisane
        pandn    %mmm0, %xmm2   ; xmm2 - piksele tła różne od colorkey

        por      %xmm1, %xmm2   ; xmm2 - połączone tło i obraz

        movdqa   %xmm2, (%ebx)

        ; pętla do 0b

SSE4

W SSE4 pojawiły się rozkazy BLEND i PBLEND realizujące funkcje przepisujące wybrane elementy z jednego wektora zapisanemu w rejestrze lub pamięci, do drugiego wektora zapisanego w rejestrze — a więc zastępują sekwencję trzech rozkazów PAND, PANDN i POR. Co prawda w SSE dostępne są instrukcje MASKMOVQ i MASKMOVDQU, jednak uaktualniają zawartość pamięci, nie rejestrów.

O przepisaniu elementu decyduje zapalenie bitu w masce bitowej; maski są albo zapisane w kodzie rozkazu jako stałe natychmiastowe, albo obliczane w trakcie działania programu i zawsze zapisane w rejestrze %xmm0.

Np. rozkaz PBLENDV %xmm_S, %xmm_D przepisuje wybrane bajty z %xmm_S do %xmm_D, na podstawie maski zapisanej w rejestrze %xmm0. Pod uwagę brane są najstarsze bity poszczególnych bajtów maski.

Przedstawiony wyżej program można wówczas skrócić:

; xmm7 - 4 piksele o określonym kolorze (colorkey)
; eax  -> nakładany obraz
; ebx  -> tło

0:
        movdqa   %xmm7, %xmm0

        movdqa  (%eax), %xmm2   ; 4 piksele obrazu
        movdqa  (%ebx), %xmm1   ; 4 piksele tła

        pcmpeqd  %xmm2, %xmm0   ; xmm0 - maska: 0xffffffff dla pikseli równych colorkey

        pblendvb %xmm2, %xmm1   ; xmm1 - połączone tło i obraz

        movdqa   %xmm1, (%ebx)

        ; pętla