1 .function compositor_orc_splat_u32
7 .function compositor_orc_memcpy_u32
13 .function compositor_orc_memset_u16_2d
20 .function compositor_orc_blend_u8
38 .function compositor_orc_blend_u10
56 .function compositor_orc_blend_u12
74 .function compositor_orc_blend_u16
92 .function compositor_orc_blend_u10_swap
114 .function compositor_orc_blend_u12_swap
136 .function compositor_orc_blend_u16_swap
158 .function compositor_orc_blend_argb
170 .const 4 a_alpha 0x000000ff
177 x4 mullw a_wide, a_wide, alpha
178 x4 div255w a_wide, a_wide
181 x4 mullw s_wide, s_wide, a_wide
184 x4 subw a_wide, 0xff, a_wide
188 x4 mullw d_wide, d_wide, a_wide
190 x4 addw d_wide, d_wide, s_wide
191 x4 div255w d_wide, d_wide
196 .function compositor_orc_source_argb
207 .const 4 a_alpha 0x000000ff
208 .const 4 a_not_alpha 0xffffff00
215 x4 mullw a_wide, a_wide, alpha
216 x4 div255w a_wide, a_wide
218 andl t, t, a_not_alpha
225 .function compositor_orc_blend_bgra
238 .const 4 a_alpha 0xff000000
246 x4 mullw a_wide, a_wide, alpha
247 x4 div255w a_wide, a_wide
250 x4 mullw s_wide, s_wide, a_wide
253 x4 subw a_wide, 0xff, a_wide
257 x4 mullw d_wide, d_wide, a_wide
259 x4 addw d_wide, d_wide, s_wide
260 x4 div255w d_wide, d_wide
266 .function compositor_orc_source_bgra
277 .const 4 a_alpha 0xff000000
278 .const 4 a_not_alpha 0x00ffffff
285 x4 mullw a_wide, a_wide, alpha
286 x4 div255w a_wide, a_wide
288 andl t, t, a_not_alpha
295 .function compositor_orc_overlay_argb
309 .const 4 xfs 0xffffffff
310 .const 4 a_alpha 0x000000ff
311 .const 4 a_alpha_inv 0xffffff00
313 # calc source alpha as alpha_s = alpha_s * alpha / 255
318 x4 convubw alpha_s, a
319 x4 mullw alpha_s, alpha_s, alpha
320 x4 div255w alpha_s, alpha_s
322 x4 mullw s_wide, s_wide, alpha_s
324 # calc destination alpha as alpha_d = (255-alpha_s) * alpha_d / 255
326 x4 convubw alpha_s_inv, a
327 x4 subw alpha_s_inv, alpha_s_inv, alpha_s
332 x4 convubw alpha_d, a
333 x4 mullw alpha_d, alpha_d, alpha_s_inv
334 x4 div255w alpha_d, alpha_d
336 x4 mullw d_wide, d_wide, alpha_d
338 # calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_d*(255-alpha_s)/255
339 x4 addw d_wide, d_wide, s_wide
341 # calc the final destination alpha_d = alpha_s + alpha_d * (255-alpha_s)/255
342 x4 addw alpha_d, alpha_d, alpha_s
344 # now normalize the pix_d by the final alpha to make it associative
345 x4 divluw, d_wide, d_wide, alpha_d
347 # pack the new alpha into the correct spot
349 andl t, t, a_alpha_inv
356 .function compositor_orc_overlay_argb_addition
371 .const 4 xfs 0xffffffff
372 .const 4 a_alpha 0x000000ff
373 .const 4 a_alpha_inv 0xffffff00
375 # calc source alpha as alpha_s = alpha_s * alpha / 255
380 x4 convubw alpha_s, a
381 x4 mullw alpha_s, alpha_s, alpha
382 x4 div255w alpha_s, alpha_s
384 x4 mullw s_wide, s_wide, alpha_s
386 # calc destination alpha as alpha_factor = (255-alpha_s) * alpha_factor / factor
388 x4 convubw alpha_s_inv, a
389 x4 subw alpha_s_inv, alpha_s_inv, alpha_s
394 x4 convubw alpha_factor, a
395 x4 mullw alpha_factor, alpha_factor, alpha_s_inv
396 x4 div255w alpha_factor, alpha_factor
398 x4 mullw d_wide, d_wide, alpha_factor
400 # calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_factor*(255-alpha_s)/255
401 x4 addw d_wide, d_wide, s_wide
403 # calc the alpha factor alpha_factor = alpha_s + alpha_factor * (255-alpha_s)/255
404 x4 addw alpha_factor, alpha_factor, alpha_s
406 # now normalize the pix_d by the final alpha to make it associative
407 x4 divluw, d_wide, d_wide, alpha_factor
409 # calc the final global alpha_d = alpha_d + (alpha_s * (alpha / 255))
414 x4 convubw alpha_d, a
415 x4 addw alpha_d, alpha_d, alpha_s
417 # pack the new alpha into the correct spot
419 andl t, t, a_alpha_inv
425 .function compositor_orc_overlay_bgra
440 .const 4 xfs 0xffffffff
441 .const 4 a_alpha 0xff000000
442 .const 4 a_alpha_inv 0x00ffffff
444 # calc source alpha as alpha_s = alpha_s * alpha / 255
450 x4 convubw alpha_s, a
451 x4 mullw alpha_s, alpha_s, alpha
452 x4 div255w alpha_s, alpha_s
454 x4 mullw s_wide, s_wide, alpha_s
456 # calc destination alpha as alpha_d = (255-alpha_s) * alpha_d / 255
458 x4 convubw alpha_s_inv, a
459 x4 subw alpha_s_inv, alpha_s_inv, alpha_s
465 x4 convubw alpha_d, a
466 x4 mullw alpha_d, alpha_d, alpha_s_inv
467 x4 div255w alpha_d, alpha_d
469 x4 mullw d_wide, d_wide, alpha_d
471 # calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_d*(255-alpha_s)/255
472 x4 addw d_wide, d_wide, s_wide
474 # calc the final destination alpha_d = alpha_s + alpha_d * (255-alpha_s)/255
475 x4 addw alpha_d, alpha_d, alpha_s
477 # now normalize the pix_d by the final alpha to make it associative
478 x4 divluw, d_wide, d_wide, alpha_d
480 # pack the new alpha into the correct spot
482 andl t, t, a_alpha_inv
488 .function compositor_orc_overlay_bgra_addition
504 .const 4 xfs 0xffffffff
505 .const 4 a_alpha 0xff000000
506 .const 4 a_alpha_inv 0x00ffffff
508 # calc source alpha as alpha_s = alpha_s * alpha / 255
514 x4 convubw alpha_s, a
515 x4 mullw alpha_s, alpha_s, alpha
516 x4 div255w alpha_s, alpha_s
518 x4 mullw s_wide, s_wide, alpha_s
520 # calc destination alpha as alpha_factor = (255-alpha_s) * alpha_factor / 255
522 x4 convubw alpha_s_inv, a
523 x4 subw alpha_s_inv, alpha_s_inv, alpha_s
529 x4 convubw alpha_factor, a
530 x4 mullw alpha_factor, alpha_factor, alpha_s_inv
531 x4 div255w alpha_factor, alpha_factor
533 x4 mullw d_wide, d_wide, alpha_factor
535 # calc final pixel as pix_d = pix_s*alpha_s + pix_d*alpha_factor*(255-alpha_s)/255
536 x4 addw d_wide, d_wide, s_wide
538 # calc the final destination alpha_factor = alpha_s + alpha_factor * (255-alpha_s)/255
539 x4 addw alpha_factor, alpha_factor, alpha_s
541 # now normalize the pix_d by the final alpha to make it associative
542 x4 divluw, d_wide, d_wide, alpha_factor
544 # calc the final global alpha_d = alpha_d + (alpha_s * (alpha / 255))
550 x4 convubw alpha_d, a
551 x4 addw alpha_d, alpha_d, alpha_s
553 # pack the new alpha into the correct spot
555 andl t, t, a_alpha_inv