[Bf-blender-cvs] [cd2926fb05b] master: Fix T103412: Resolve selection outline rendering with Metal backend on AMD.

Jason Fielder noreply at git.blender.org
Mon Jan 23 17:24:58 CET 2023


Commit: cd2926fb05b0179a405a5406d6b87f5bff36d15a
Author: Jason Fielder
Date:   Mon Jan 23 16:57:26 2023 +0100
Branches: master
https://developer.blender.org/rBcd2926fb05b0179a405a5406d6b87f5bff36d15a

Fix T103412: Resolve selection outline rendering with Metal backend on AMD.

AMD GPUs do not appear to produce consistent results with other GPUs when using textureGather in the Metal backend. Disabling for now to ensure correct function of outline rendering.

This may require an additional sub-pixel offset in the texture sampling calls, to achieve correct behaviour.

Authored by Apple: Michael Parkin-White

Ref T103412
Ref T96261

Reviewed By: fclem

Maniphest Tasks: T103412, T96261

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

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

M	source/blender/draw/engines/overlay/shaders/overlay_outline_detect_frag.glsl
M	source/blender/gpu/metal/mtl_backend.mm
M	source/blender/gpu/metal/mtl_capabilities.hh
M	source/blender/gpu/metal/mtl_shader_generator.mm

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

diff --git a/source/blender/draw/engines/overlay/shaders/overlay_outline_detect_frag.glsl b/source/blender/draw/engines/overlay/shaders/overlay_outline_detect_frag.glsl
index 18914b0276f..b6d68628811 100644
--- a/source/blender/draw/engines/overlay/shaders/overlay_outline_detect_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/overlay_outline_detect_frag.glsl
@@ -254,7 +254,11 @@ void main()
   edge_case += int(has_edge_neg_y) * YNEG;
 
   if (edge_case == ALL || edge_case == NONE) {
+    /* NOTE(Metal): Discards are not explicit returns in Metal. We should also return to avoid
+     * erroneous derivatives which can manifest during texture sampling in
+     * non-uniform-control-flow. */
     discard;
+    return;
   }
 
   if (!doAntiAliasing) {
diff --git a/source/blender/gpu/metal/mtl_backend.mm b/source/blender/gpu/metal/mtl_backend.mm
index e6bd8456605..432db09005e 100644
--- a/source/blender/gpu/metal/mtl_backend.mm
+++ b/source/blender/gpu/metal/mtl_backend.mm
@@ -358,6 +358,9 @@ void MTLBackend::capabilities_init(MTLContext *ctx)
       supportsFamily:MTLGPUFamilyMacCatalyst1];
   MTLBackend::capabilities.supports_family_mac_catalyst2 = [device
       supportsFamily:MTLGPUFamilyMacCatalyst2];
+  /* NOTE(Metal): Texture gather is supported on AMD, but results are non consistent
+   * with Apple Silicon GPUs. Disabling for now to avoid erroneous rendering. */
+  MTLBackend::capabilities.supports_texture_gather = [device hasUnifiedMemory];
 
   /* Common Global Capabilities. */
   GCaps.max_texture_size = ([device supportsFamily:MTLGPUFamilyApple3] ||
diff --git a/source/blender/gpu/metal/mtl_capabilities.hh b/source/blender/gpu/metal/mtl_capabilities.hh
index 36536438bf5..7e6b12cba43 100644
--- a/source/blender/gpu/metal/mtl_capabilities.hh
+++ b/source/blender/gpu/metal/mtl_capabilities.hh
@@ -36,6 +36,7 @@ struct MTLCapabilities {
   bool supports_memory_barriers = false;
   bool supports_sampler_border_color = false;
   bool supports_argument_buffers_tier2 = false;
+  bool supports_texture_gather = false;
 
   /* GPU Family */
   bool supports_family_mac1 = false;
diff --git a/source/blender/gpu/metal/mtl_shader_generator.mm b/source/blender/gpu/metal/mtl_shader_generator.mm
index fbdf9422ced..880016589fc 100644
--- a/source/blender/gpu/metal/mtl_shader_generator.mm
+++ b/source/blender/gpu/metal/mtl_shader_generator.mm
@@ -569,10 +569,16 @@ bool MTLShader::generate_msl_from_glsl(const shader::ShaderCreateInfo *info)
   /* Concatenate msl_shader_defines to provide functionality mapping
    * from GLSL to MSL. Also include additional GPU defines for
    * optional high-level feature support. */
-  const std::string msl_defines_string =
+  std::string msl_defines_string =
       "#define GPU_ARB_texture_cube_map_array 1\n\
-    #define GPU_ARB_shader_draw_parameters 1\n\
-    #define GPU_ARB_texture_gather 1\n";
+      #define GPU_ARB_shader_draw_parameters 1\n";
+
+  /* NOTE(Metal): textureGather appears to not function correctly on non-Apple-silicon GPUs.
+   * Manifests as selection outlines not showing up (T103412). Disable texture gather if
+   * not suitable for use. */
+  if (MTLBackend::get_capabilities().supports_texture_gather) {
+    msl_defines_string += "#define GPU_ARB_texture_gather 1\n";
+  }
 
   shd_builder_->glsl_vertex_source_ = msl_defines_string + shd_builder_->glsl_vertex_source_;
   if (!msl_iface.uses_transform_feedback) {



More information about the Bf-blender-cvs mailing list