Przeglądaj źródła

LibSoftGPU: Use `AK::SIMD::exp_approximate` instead of `::exp`

The approximate version is properly vectorized and results in fewer
stalls than the `::exp` version.
Jelle Raaijmakers 2 lat temu
rodzic
commit
f54d9c0a61
1 zmienionych plików z 3 dodań i 4 usunięć
  1. 3 4
      Userland/Libraries/LibSoftGPU/Device.cpp

+ 3 - 4
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();