From 917da3c1deb4ef10b4fa8480bbc2c53d81ecb61a Mon Sep 17 00:00:00 2001 From: Markus Stange Date: Thu, 21 Sep 2017 15:57:51 -0400 Subject: [PATCH] Add workarounds for a driver bug that seems to cause shaders to be miscompiled. Fixes #1368. Fixes #1728. --- webrender/res/prim_shared.glsl | 4 +++- webrender/res/ps_angle_gradient.glsl | 2 +- webrender/res/ps_radial_gradient.glsl | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/webrender/res/prim_shared.glsl b/webrender/res/prim_shared.glsl index 05ed3382d6..a119e01292 100644 --- a/webrender/res/prim_shared.glsl +++ b/webrender/res/prim_shared.glsl @@ -281,7 +281,9 @@ Glyph fetch_glyph(int specific_prim_address, glyph_index / 2; vec4 data = fetch_from_resource_cache_1(glyph_address); // Select XY or ZW based on glyph index. - vec2 glyph = mix(data.xy, data.zw, bvec2(glyph_index % 2 == 1)); + // We use "!= 0" instead of "== 1" here in order to work around a driver + // bug with equality comparisons on integers. + vec2 glyph = mix(data.xy, data.zw, bvec2(glyph_index % 2 != 0)); // In subpixel mode, the subpixel offset has already been // accounted for while rasterizing the glyph. diff --git a/webrender/res/ps_angle_gradient.glsl b/webrender/res/ps_angle_gradient.glsl index fdf9bce752..392a414938 100644 --- a/webrender/res/ps_angle_gradient.glsl +++ b/webrender/res/ps_angle_gradient.glsl @@ -42,7 +42,7 @@ void main(void) { vGradientAddress = prim.specific_prim_address + VECS_PER_GRADIENT; // Whether to repeat the gradient instead of clamping. - vGradientRepeat = float(int(gradient.extend_mode.x) == EXTEND_MODE_REPEAT); + vGradientRepeat = float(int(gradient.extend_mode.x) != EXTEND_MODE_CLAMP); } #endif diff --git a/webrender/res/ps_radial_gradient.glsl b/webrender/res/ps_radial_gradient.glsl index c043a4d18e..ba985de9bd 100644 --- a/webrender/res/ps_radial_gradient.glsl +++ b/webrender/res/ps_radial_gradient.glsl @@ -52,7 +52,7 @@ void main(void) { vGradientAddress = prim.specific_prim_address + VECS_PER_GRADIENT; // Whether to repeat the gradient instead of clamping. - vGradientRepeat = float(int(gradient.start_end_radius_ratio_xy_extend_mode.w) == EXTEND_MODE_REPEAT); + vGradientRepeat = float(int(gradient.start_end_radius_ratio_xy_extend_mode.w) != EXTEND_MODE_CLAMP); } #endif