mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-06 16:45:03 +00:00
LibSoftGPU: Update coverage bits after alpha testing
Also skip the test for the `::Always` alpha test function in the hot loop. This test function is very unlikely to be set, so leave that up to `::test_alpha()`.
This commit is contained in:
committed by
Andreas Kling
parent
1a338844fa
commit
421a80bf43
@@ -431,8 +431,13 @@ ALWAYS_INLINE void Device::rasterize(Gfx::IntRect& render_bounds, CB1 set_covera
|
||||
set_quad_attributes(quad);
|
||||
shade_fragments(quad);
|
||||
|
||||
if (m_options.enable_alpha_test && m_options.alpha_test_func != GPU::AlphaTestFunction::Always && !test_alpha(quad))
|
||||
continue;
|
||||
// Alpha testing
|
||||
if (m_options.enable_alpha_test) {
|
||||
test_alpha(quad);
|
||||
coverage_bits = maskbits(quad.mask);
|
||||
if (coverage_bits == 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
// Write to depth buffer
|
||||
if (m_options.enable_depth_test && m_options.enable_depth_write)
|
||||
@@ -1269,37 +1274,37 @@ ALWAYS_INLINE void Device::shade_fragments(PixelQuad& quad)
|
||||
quad.out_color.set_w(quad.out_color.w() * quad.coverage);
|
||||
}
|
||||
|
||||
ALWAYS_INLINE bool Device::test_alpha(PixelQuad& quad)
|
||||
ALWAYS_INLINE void Device::test_alpha(PixelQuad& quad)
|
||||
{
|
||||
auto const alpha = quad.out_color.w();
|
||||
auto const ref_value = expand4(m_options.alpha_test_ref_value);
|
||||
|
||||
switch (m_options.alpha_test_func) {
|
||||
case GPU::AlphaTestFunction::Less:
|
||||
quad.mask &= alpha < ref_value;
|
||||
case GPU::AlphaTestFunction::Always:
|
||||
quad.mask &= expand4(~0);
|
||||
break;
|
||||
case GPU::AlphaTestFunction::Equal:
|
||||
quad.mask &= alpha == ref_value;
|
||||
break;
|
||||
case GPU::AlphaTestFunction::LessOrEqual:
|
||||
quad.mask &= alpha <= ref_value;
|
||||
break;
|
||||
case GPU::AlphaTestFunction::Greater:
|
||||
quad.mask &= alpha > ref_value;
|
||||
break;
|
||||
case GPU::AlphaTestFunction::NotEqual:
|
||||
quad.mask &= alpha != ref_value;
|
||||
break;
|
||||
case GPU::AlphaTestFunction::GreaterOrEqual:
|
||||
quad.mask &= alpha >= ref_value;
|
||||
break;
|
||||
case GPU::AlphaTestFunction::Less:
|
||||
quad.mask &= alpha < ref_value;
|
||||
break;
|
||||
case GPU::AlphaTestFunction::LessOrEqual:
|
||||
quad.mask &= alpha <= ref_value;
|
||||
break;
|
||||
case GPU::AlphaTestFunction::NotEqual:
|
||||
quad.mask &= alpha != ref_value;
|
||||
break;
|
||||
case GPU::AlphaTestFunction::Never:
|
||||
case GPU::AlphaTestFunction::Always:
|
||||
default:
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
return any(quad.mask);
|
||||
}
|
||||
|
||||
void Device::resize(Gfx::IntSize const& size)
|
||||
|
||||
Reference in New Issue
Block a user