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; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs