mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-25 03:01:03 +00:00
e757793b21
Remove some redundant operations (convubw) and use the correct variable, t2, in the orc_overlay_bgra function.
220 lines
4.2 KiB
Text
220 lines
4.2 KiB
Text
.function orc_splat_u32
|
|
.dest 4 d1 guint32
|
|
.param 4 p1 guint32
|
|
|
|
copyl d1, p1
|
|
|
|
.function orc_memcpy_u32
|
|
.dest 4 d1 guint32
|
|
.source 4 s1 guint32
|
|
|
|
copyl d1, s1
|
|
|
|
.function orc_blend_u8
|
|
.flags 2d
|
|
.dest 1 d1 guint8
|
|
.source 1 s1 guint8
|
|
.param 2 p1
|
|
.temp 2 t1
|
|
.temp 2 t2
|
|
.const 1 c1 8
|
|
|
|
convubw t1, d1
|
|
convubw t2, s1
|
|
subw t2, t2, t1
|
|
mullw t2, t2, p1
|
|
shlw t1, t1, c1
|
|
addw t2, t1, t2
|
|
shruw t2, t2, c1
|
|
convsuswb d1, t2
|
|
|
|
|
|
.function orc_blend_argb
|
|
.flags 2d
|
|
.dest 4 d guint8
|
|
.source 4 s guint8
|
|
.param 2 alpha
|
|
.temp 4 t
|
|
.temp 2 tw
|
|
.temp 1 tb
|
|
.temp 4 a
|
|
.temp 8 d_wide
|
|
.temp 8 s_wide
|
|
.temp 8 a_wide
|
|
.const 4 a_alpha 0x000000ff
|
|
|
|
loadl t, s
|
|
convlw tw, t
|
|
convwb tb, tw
|
|
splatbl a, tb
|
|
x4 convubw a_wide, a
|
|
x4 mullw a_wide, a_wide, alpha
|
|
x4 shruw a_wide, a_wide, 8
|
|
x4 convubw s_wide, t
|
|
loadl t, d
|
|
x4 convubw d_wide, t
|
|
x4 subw s_wide, s_wide, d_wide
|
|
x4 mullw s_wide, s_wide, a_wide
|
|
x4 div255w s_wide, s_wide
|
|
x4 addw d_wide, d_wide, s_wide
|
|
x4 convwb t, d_wide
|
|
orl t, t, a_alpha
|
|
storel d, t
|
|
|
|
.function orc_blend_bgra
|
|
.flags 2d
|
|
.dest 4 d guint8
|
|
.source 4 s guint8
|
|
.param 2 alpha
|
|
.temp 4 t
|
|
.temp 4 t2
|
|
.temp 2 tw
|
|
.temp 1 tb
|
|
.temp 4 a
|
|
.temp 8 d_wide
|
|
.temp 8 s_wide
|
|
.temp 8 a_wide
|
|
.const 4 a_alpha 0xff000000
|
|
|
|
loadl t, s
|
|
shrul t2, t, 24
|
|
convlw tw, t2
|
|
convwb tb, tw
|
|
splatbl a, tb
|
|
x4 convubw a_wide, a
|
|
x4 mullw a_wide, a_wide, alpha
|
|
x4 shruw a_wide, a_wide, 8
|
|
x4 convubw s_wide, t
|
|
loadl t, d
|
|
x4 convubw d_wide, t
|
|
x4 subw s_wide, s_wide, d_wide
|
|
x4 mullw s_wide, s_wide, a_wide
|
|
x4 div255w s_wide, s_wide
|
|
x4 addw d_wide, d_wide, s_wide
|
|
x4 convwb t, d_wide
|
|
orl t, t, a_alpha
|
|
storel d, t
|
|
|
|
|
|
.function orc_overlay_argb
|
|
.flags 2d
|
|
.dest 4 d guint8
|
|
.source 4 s guint8
|
|
.param 2 alpha
|
|
.temp 4 t
|
|
.temp 2 tw
|
|
.temp 1 tb
|
|
.temp 8 alpha_s
|
|
.temp 8 alpha_s_inv
|
|
.temp 8 alpha_d
|
|
.temp 4 a
|
|
.temp 8 d_wide
|
|
.temp 8 s_wide
|
|
.const 4 xfs 0xffffffff
|
|
.const 4 a_alpha 0x000000ff
|
|
.const 4 a_alpha_inv 0xffffff00
|
|
|
|
# calc source alpha as alpha_s = alpha_s * alpha / 256
|
|
loadl t, s
|
|
convlw tw, t
|
|
convwb tb, tw
|
|
splatbl a, tb
|
|
x4 convubw alpha_s, a
|
|
x4 mullw alpha_s, alpha_s, alpha
|
|
x4 shruw alpha_s, alpha_s, 8
|
|
x4 convubw s_wide, t
|
|
x4 mullw s_wide, s_wide, alpha_s
|
|
|
|
# calc destination alpha as alpha_d = (255-alpha_s) * alpha_d / 255
|
|
loadpl a, xfs
|
|
x4 convubw alpha_s_inv, a
|
|
x4 subw alpha_s_inv, alpha_s_inv, alpha_s
|
|
loadl t, d
|
|
convlw tw, t
|
|
convwb tb, tw
|
|
splatbl a, tb
|
|
x4 convubw alpha_d, a
|
|
x4 mullw alpha_d, alpha_d, alpha_s_inv
|
|
x4 div255w alpha_d, alpha_d
|
|
x4 convubw d_wide, t
|
|
x4 mullw d_wide, d_wide, alpha_d
|
|
|
|
# calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_d*(255-alpha_s)/255
|
|
x4 addw d_wide, d_wide, s_wide
|
|
|
|
# calc the final destination alpha_d = alpha_s + alpha_d * (255-alpha_s)/255
|
|
x4 addw alpha_d, alpha_d, alpha_s
|
|
|
|
# now normalize the pix_d by the final alpha to make it associative
|
|
x4 divluw, d_wide, d_wide, alpha_d
|
|
|
|
# pack the new alpha into the correct spot
|
|
x4 convwb t, d_wide
|
|
andl t, t, a_alpha_inv
|
|
x4 convwb a, alpha_d
|
|
andl a, a, a_alpha
|
|
orl t, t, a
|
|
storel d, t
|
|
|
|
.function orc_overlay_bgra
|
|
.flags 2d
|
|
.dest 4 d guint8
|
|
.source 4 s guint8
|
|
.param 2 alpha
|
|
.temp 4 t
|
|
.temp 4 t2
|
|
.temp 2 tw
|
|
.temp 1 tb
|
|
.temp 8 alpha_s
|
|
.temp 8 alpha_s_inv
|
|
.temp 8 alpha_d
|
|
.temp 4 a
|
|
.temp 8 d_wide
|
|
.temp 8 s_wide
|
|
.const 4 xfs 0xffffffff
|
|
.const 4 a_alpha 0xff000000
|
|
.const 4 a_alpha_inv 0x00ffffff
|
|
|
|
# calc source alpha as alpha_s = alpha_s * alpha / 256
|
|
loadl t, s
|
|
shrul t2, t, 24
|
|
convlw tw, t2
|
|
convwb tb, tw
|
|
splatbl a, tb
|
|
x4 convubw alpha_s, a
|
|
x4 mullw alpha_s, alpha_s, alpha
|
|
x4 shruw alpha_s, alpha_s, 8
|
|
x4 convubw s_wide, t
|
|
x4 mullw s_wide, s_wide, alpha_s
|
|
|
|
# calc destination alpha as alpha_d = (255-alpha_s) * alpha_d / 255
|
|
loadpl a, xfs
|
|
x4 convubw alpha_s_inv, a
|
|
x4 subw alpha_s_inv, alpha_s_inv, alpha_s
|
|
loadl t, d
|
|
shrul t2, t, 24
|
|
convlw tw, t2
|
|
convwb tb, tw
|
|
splatbl a, tb
|
|
x4 convubw alpha_d, a
|
|
x4 mullw alpha_d, alpha_d, alpha_s_inv
|
|
x4 div255w alpha_d, alpha_d
|
|
x4 convubw d_wide, t
|
|
x4 mullw d_wide, d_wide, alpha_d
|
|
|
|
# calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_d*(255-alpha_s)/255
|
|
x4 addw d_wide, d_wide, s_wide
|
|
|
|
# calc the final destination alpha_d = alpha_s + alpha_d * (255-alpha_s)/255
|
|
x4 addw alpha_d, alpha_d, alpha_s
|
|
|
|
# now normalize the pix_d by the final alpha to make it associative
|
|
x4 divluw, d_wide, d_wide, alpha_d
|
|
|
|
# pack the new alpha into the correct spot
|
|
x4 convwb t, d_wide
|
|
andl t, t, a_alpha_inv
|
|
x4 convwb a, alpha_d
|
|
andl a, a, a_alpha
|
|
orl t, t, a
|
|
storel d, t
|