diff --git a/gfx/wr/swgl/build.rs b/gfx/wr/swgl/build.rs
--- a/gfx/wr/swgl/build.rs
+++ b/gfx/wr/swgl/build.rs
@@ -147,10 +147,11 @@
     let shader_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap() + "/../webrender/res";
 
     let shader_flags = ShaderFeatureFlags::GL
         | ShaderFeatureFlags::DUAL_SOURCE_BLENDING
         | ShaderFeatureFlags::ADVANCED_BLEND_EQUATION
+        | ShaderFeatureFlags::DITHERING
         | ShaderFeatureFlags::DEBUG;
     let mut shaders: Vec<String> = Vec::new();
     for (name, features) in get_shader_features(shader_flags) {
         shaders.extend(features.iter().map(|f| {
             if f.is_empty() {
diff --git a/gfx/wr/webrender/res/brush_linear_gradient.glsl b/gfx/wr/webrender/res/brush_linear_gradient.glsl
--- a/gfx/wr/webrender/res/brush_linear_gradient.glsl
+++ b/gfx/wr/webrender/res/brush_linear_gradient.glsl
@@ -79,17 +79,23 @@
 
     return Fragment(color);
 }
 
 #ifdef SWGL_DRAW_SPAN
+#ifdef WR_FEATURE_DITHERING
+void swgl_drawSpanRGBA8() {
+    return;
+}
+#else
 void swgl_drawSpanRGBA8() {
     int address = swgl_validateGradient(sGpuBufferF, get_gpu_buffer_uv(v_gradient_address.x), int(GRADIENT_ENTRIES + 2.0));
     if (address < 0) {
         return;
     }
 
     swgl_commitLinearGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, true, v_gradient_repeat.x != 0.0,
                                    v_pos, v_scale_dir, v_start_offset.x);
 }
 #endif
+#endif
 
 #endif
diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/renderer/init.rs
--- a/gfx/wr/webrender/src/renderer/init.rs
+++ b/gfx/wr/webrender/src/renderer/init.rs
@@ -222,11 +222,11 @@
     fn default() -> Self {
         WebRenderOptions {
             resource_override_path: None,
             use_optimized_shaders: false,
             enable_aa: true,
-            enable_dithering: false,
+            enable_dithering: true,
             debug_flags: DebugFlags::empty(),
             max_recorded_profiles: 0,
             precache_flags: ShaderPrecacheFlags::empty(),
             enable_subpixel_aa: false,
             clear_color: ColorF::new(1.0, 1.0, 1.0, 1.0),
--- a/gfx/wr/webrender/build.rs
+++ b/gfx/wr/webrender/build.rs
@@ -150,11 +150,10 @@
         ) {
             flags.remove(ShaderFeatureFlags::TEXTURE_EXTERNAL_ESSL1);
         }
         // The optimizer cannot handle the required EXT_YUV_target extension
         flags.remove(ShaderFeatureFlags::TEXTURE_EXTERNAL_BT709);
-        flags.remove(ShaderFeatureFlags::DITHERING);
 
         for (shader_name, configs) in get_shader_features(flags) {
             for config in configs {
                 shaders.push(ShaderOptimizationInput {
                     shader_name,
diff --git a/gfx/wr/webrender/res/shared.glsl b/gfx/wr/webrender/res/shared.glsl
index f9c093f8486dbd481f2520762f80ace257c294f6..904f9991e917423e11563d862bbd185725523573 100644
--- a/gfx/wr/webrender/res/shared.glsl
+++ b/gfx/wr/webrender/res/shared.glsl
@@ -226,6 +226,7 @@ uniform __samplerExternal2DY2YEXT sColor1;
 uniform __samplerExternal2DY2YEXT sColor2;
 #endif
 
+#define WR_FEATURE_DITHERING
 #ifdef WR_FEATURE_DITHERING
 uniform sampler2D sDither;
 #endif
diff --git a/gfx/wr/webrender/res/gradient.glsl b/gfx/wr/webrender/res/gradient.glsl
index 6ed2e6987135e04a70fcc908c089bf225ffdb255..09a4acdf3f53a53e123510fdc5aea8b9b8c4d91e 100644
--- a/gfx/wr/webrender/res/gradient.glsl
+++ b/gfx/wr/webrender/res/gradient.glsl
@@ -11,6 +11,7 @@ flat varying mediump vec2 v_gradient_repeat;
 
 #ifdef WR_FRAGMENT_SHADER
 
+#define WR_FEATURE_DITHERING
 #ifdef WR_FEATURE_DITHERING
 vec4 dither(vec4 color) {
     const int matrix_mask = 7;

