diff options
-rw-r--r-- | Userland/Libraries/LibSoftGPU/Device.cpp | 33 | ||||
-rw-r--r-- | Userland/Libraries/LibSoftGPU/Device.h | 2 |
2 files changed, 20 insertions, 15 deletions
diff --git a/Userland/Libraries/LibSoftGPU/Device.cpp b/Userland/Libraries/LibSoftGPU/Device.cpp index 6d90f2df18..14279127f5 100644 --- a/Userland/Libraries/LibSoftGPU/Device.cpp +++ b/Userland/Libraries/LibSoftGPU/Device.cpp @@ -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) diff --git a/Userland/Libraries/LibSoftGPU/Device.h b/Userland/Libraries/LibSoftGPU/Device.h index 94f84fd879..fb5ef3c4ea 100644 --- a/Userland/Libraries/LibSoftGPU/Device.h +++ b/Userland/Libraries/LibSoftGPU/Device.h @@ -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; |