From f54d9c0a613dd8f7ba9b2a0873fd50cb9efda06d Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Fri, 17 Feb 2023 17:08:51 +0100 Subject: [PATCH] LibSoftGPU: Use `AK::SIMD::exp_approximate` instead of `::exp` The approximate version is properly vectorized and results in fewer stalls than the `::exp` version. --- Userland/Libraries/LibSoftGPU/Device.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibSoftGPU/Device.cpp b/Userland/Libraries/LibSoftGPU/Device.cpp index ece3abebc1e..846ca34c7af 100644 --- a/Userland/Libraries/LibSoftGPU/Device.cpp +++ b/Userland/Libraries/LibSoftGPU/Device.cpp @@ -39,7 +39,7 @@ static i64 g_num_quads; using AK::abs; using AK::SIMD::any; -using AK::SIMD::exp; +using AK::SIMD::exp_approximate; using AK::SIMD::expand4; using AK::SIMD::f32x4; using AK::SIMD::i32x4; @@ -1277,7 +1277,6 @@ ALWAYS_INLINE void Device::shade_fragments(PixelQuad& quad) // Calculate fog // Math from here: https://opengl-notes.readthedocs.io/en/latest/topics/texturing/aliasing.html - // FIXME: exponential fog is not vectorized, we should add a SIMD exp function that calculates an approximation. if (m_options.fog_enabled) { f32x4 factor; switch (m_options.fog_mode) { @@ -1286,12 +1285,12 @@ ALWAYS_INLINE void Device::shade_fragments(PixelQuad& quad) break; case GPU::FogMode::Exp: { auto argument = -m_options.fog_density * quad.fog_depth; - factor = exp(argument); + factor = exp_approximate(argument); } break; case GPU::FogMode::Exp2: { auto argument = m_options.fog_density * quad.fog_depth; argument *= -argument; - factor = exp(argument); + factor = exp_approximate(argument); } break; default: VERIFY_NOT_REACHED();