[Bf-blender-cvs] [8703db393bf] master: Metal: Ensure explicit return after discard to eliminate differences in behaviour between GPUs.

Jason Fielder noreply at git.blender.org
Tue Feb 7 01:03:08 CET 2023


Commit: 8703db393bfb5290777c59ef29b43d485bcfb80e
Author: Jason Fielder
Date:   Tue Feb 7 00:57:54 2023 +0100
Branches: master
https://developer.blender.org/rB8703db393bfb5290777c59ef29b43d485bcfb80e

Metal: Ensure explicit return after discard to eliminate differences in behaviour between GPUs.

Discard is not always treated as an explicit return and flow control can continue for required derivative calculations. This behaviour is different in Metal vs OpenGL. Adding return after discards ensures consistency in expectation as behaviour is well-defined.

Authored by Apple: Michael Parkin-White

Ref T96261

Reviewed By: fclem

Maniphest Tasks: T96261

Differential Revision: https://developer.blender.org/D17199

===================================================================

M	source/blender/draw/engines/eevee/shaders/effect_dof_scatter_frag.glsl
M	source/blender/draw/engines/eevee/shaders/effect_reflection_resolve_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lightprobe_grid_display_frag.glsl
M	source/blender/draw/engines/eevee_next/shaders/eevee_depth_of_field_scatter_frag.glsl
M	source/blender/draw/engines/eevee_next/shaders/eevee_surf_depth_frag.glsl
M	source/blender/draw/engines/gpencil/shaders/gpencil_antialiasing_frag.glsl
M	source/blender/draw/engines/gpencil/shaders/gpencil_frag.glsl
M	source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl
M	source/blender/draw/engines/overlay/shaders/overlay_outline_prepass_gpencil_frag.glsl
M	source/blender/draw/engines/overlay/shaders/overlay_particle_frag.glsl
M	source/blender/draw/engines/overlay/shaders/overlay_point_varying_color_frag.glsl
M	source/blender/draw/engines/overlay/shaders/overlay_wireframe_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
M	source/blender/draw/intern/shaders/common_smaa_lib.glsl

===================================================================

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;



More information about the Bf-blender-cvs mailing list