mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-20 01:37:39 +03: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:
parent
1a338844fa
commit
421a80bf43
Notes:
sideshowbarker
2024-07-17 10:54:16 +09:00
Author: https://github.com/gmta Commit: https://github.com/SerenityOS/serenity/commit/421a80bf43 Pull-request: https://github.com/SerenityOS/serenity/pull/14044 Reviewed-by: https://github.com/Quaker762 ✅ Reviewed-by: https://github.com/sunverwerth ✅
@ -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)
|
||||
|
@ -93,7 +93,7 @@ private:
|
||||
void rasterize_triangle(Triangle&);
|
||||
void setup_blend_factors();
|
||||
void shade_fragments(PixelQuad&);
|
||||
bool test_alpha(PixelQuad&);
|
||||
void test_alpha(PixelQuad&);
|
||||
|
||||
RefPtr<FrameBuffer<GPU::ColorType, GPU::DepthType, GPU::StencilType>> m_frame_buffer {};
|
||||
GPU::RasterizerOptions m_options;
|
||||
|
Loading…
Reference in New Issue
Block a user