diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl index 5038dff87d8..dae20e9c833 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl @@ -41,6 +41,7 @@ void main(void) /* Outside of bokeh shape. Try to avoid overloading ROPs. */ if (max_v4(shapes) == 0.0) { discard; + return; } if (!no_scatter_occlusion) { diff --git a/source/blender/draw/engines/eevee/shaders/effect_reflection_resolve_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_reflection_resolve_frag.glsl index 4776475f9ea..de3a22b37dd 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_reflection_resolve_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_reflection_resolve_frag.glsl @@ -226,6 +226,7 @@ void main() if (depth == 1.0) { discard; + return; } ivec2 texel = ivec2(gl_FragCoord.xy); @@ -235,6 +236,7 @@ void main() if (max_v3(brdf) <= 0.0) { discard; + return; } FragDepth = depth; diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_frag.glsl index b225ebc6351..8a90cea8d13 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_frag.glsl @@ -9,6 +9,7 @@ void main() /* Discard outside the circle. */ if (dist_sqr > 1.0) { discard; + return; } vec3 view_nor = vec3(quadCoord, sqrt(max(0.0, 1.0 - dist_sqr))); diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_grid_display_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_grid_display_frag.glsl index 27c44d00a51..ae67992efd3 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_grid_display_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_grid_display_frag.glsl @@ -8,6 +8,7 @@ void main() /* Discard outside the circle. */ if (dist_sqr > 1.0) { discard; + return; } vec3 view_nor = vec3(quadCoord, sqrt(max(0.0, 1.0 - dist_sqr))); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_depth_of_field_scatter_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_depth_of_field_scatter_frag.glsl index cfb7fd2568b..85a235123ab 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_depth_of_field_scatter_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_depth_of_field_scatter_frag.glsl @@ -37,6 +37,7 @@ void main() /* Outside of bokeh shape. Try to avoid overloading ROPs. */ if (max_v4(shapes) == 0.0) { discard; + return; } if (!no_scatter_occlusion) { diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_depth_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_depth_frag.glsl index 183aac1e546..f35e9135996 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_depth_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_depth_frag.glsl @@ -80,6 +80,7 @@ void main() float transparency = avg(g_transmittance); if (transparency > random_threshold) { discard; + return; } #endif diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_antialiasing_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_antialiasing_frag.glsl index bbea8747ed0..791bbfabf49 100644 --- a/source/blender/draw/engines/gpencil/shaders/gpencil_antialiasing_frag.glsl +++ b/source/blender/draw/engines/gpencil/shaders/gpencil_antialiasing_frag.glsl @@ -10,6 +10,7 @@ void main() /* Discard if there is no edge. */ if (dot(out_edges, float2(1.0, 1.0)) == 0.0) { discard; + return; } #elif SMAA_STAGE == 1 diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl index d0dcea34c6e..0aeae6a729c 100644 --- a/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl +++ b/source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl @@ -104,6 +104,7 @@ void main() if (fragColor.a < 0.001) { discard; + return; } } @@ -114,6 +115,7 @@ void main() float scene_depth = texture(gpSceneDepthTexture, uvs).r; if (gl_FragCoord.z > scene_depth) { discard; + return; } /* FIXME(fclem): Grrr. This is bad for performance but it's the easiest way to not get @@ -121,6 +123,7 @@ void main() float mask = texture(gpMaskTexture, uvs).r; if (mask < 0.001) { discard; + return; } /* We override the fragment depth using the fragment shader to ensure a constant value. diff --git a/source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl b/source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl index 23c2c1c2685..0bc34c80558 100644 --- a/source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl +++ b/source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl @@ -15,6 +15,7 @@ void main() float depth = texelFetch(depth_texture, uvs_clamped, 0).r; if (depth == 1.0) { discard; + return; } vec4 tex_color = texelFetch(imageTexture, uvs_clamped - offset, 0); diff --git a/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_gpencil_frag.glsl b/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_gpencil_frag.glsl index 2b7c3f06769..c5d6bae390b 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_gpencil_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_gpencil_frag.glsl @@ -18,6 +18,7 @@ void main() gp_interp.thickness.x, gp_interp.hardness) < 0.001) { discard; + return; } if (!gpStrokeOrder3d) { diff --git a/source/blender/draw/engines/overlay/shaders/overlay_particle_frag.glsl b/source/blender/draw/engines/overlay/shaders/overlay_particle_frag.glsl index a2bcca7b820..ea73f7fae27 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_particle_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_particle_frag.glsl @@ -8,6 +8,7 @@ void main() if (dist > 0.5) { discard; + return; } /* Nice sphere falloff. */ float intensity = sqrt(1.0 - dist * 2.0) * 0.5 + 0.5; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_point_varying_color_frag.glsl b/source/blender/draw/engines/overlay/shaders/overlay_point_varying_color_frag.glsl index b0da035ef09..ce7629105b1 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_point_varying_color_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_point_varying_color_frag.glsl @@ -8,6 +8,7 @@ void main() /* Round point with jaggy edges. */ if (dist_squared > rad_squared) { discard; + return; } #if defined(VERT) diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl index d3eb1a500ba..9e1e2fbac95 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl @@ -7,6 +7,7 @@ void main() * If we could get rid of it would be nice because of performance drain of discard. */ if (edgeStart.r == -1.0) { discard; + return; } #ifndef SELECT_EDGES diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl index 8b9e3f968ea..dbb21896de7 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl @@ -9,6 +9,7 @@ void main() /* Discard if there is no edge. */ if (dot(out_edges, float2(1.0, 1.0)) == 0.0) { discard; + return; } #elif SMAA_STAGE == 1 diff --git a/source/blender/draw/intern/shaders/common_smaa_lib.glsl b/source/blender/draw/intern/shaders/common_smaa_lib.glsl index 1b8a8202166..d20f1812e00 100644 --- a/source/blender/draw/intern/shaders/common_smaa_lib.glsl +++ b/source/blender/draw/intern/shaders/common_smaa_lib.glsl @@ -777,8 +777,10 @@ float2 SMAALumaEdgeDetectionPS(float2 texcoord, # ifndef SMAA_NO_DISCARD # ifdef GPU_FRAGMENT_SHADER // Then discard if there is no edge: - if (dot(edges, float2(1.0, 1.0)) == 0.0) + if (dot(edges, float2(1.0, 1.0)) == 0.0) { discard; + return float2(0.0, 0.0); + } # endif # endif @@ -847,8 +849,10 @@ float2 SMAAColorEdgeDetectionPS(float2 texcoord, # ifndef SMAA_NO_DISCARD # ifdef GPU_FRAGMENT_SHADER // Then discard if there is no edge: - if (dot(edges, float2(1.0, 1.0)) == 0.0) + if (dot(edges, float2(1.0, 1.0)) == 0.0) { discard; + return float2(0.0, 0.0); + } # endif # endif @@ -895,8 +899,10 @@ float2 SMAADepthEdgeDetectionPS(float2 texcoord, float4 offset[3], SMAATexture2D float2 edges = step(SMAA_DEPTH_THRESHOLD, delta); # ifdef GPU_FRAGMENT_SHADER - if (dot(edges, float2(1.0, 1.0)) == 0.0) + if (dot(edges, float2(1.0, 1.0)) == 0.0) { discard; + return float2(0.0, 0.0); + } # endif return edges;