[Bf-blender-cvs] [a83f2834c7e] master: Metal: Overlay UV Edge support.

Jason Fielder noreply at git.blender.org
Thu Dec 8 22:23:27 CET 2022


Commit: a83f2834c7e555ba85a6cf74a949ec3234849de5
Author: Jason Fielder
Date:   Thu Dec 8 22:22:50 2022 +0100
Branches: master
https://developer.blender.org/rBa83f2834c7e555ba85a6cf74a949ec3234849de5

Metal: Overlay UV Edge support.

Implemented geometry shader alternative for rendering of UV edges in Metal, as geometry shaders are unsupported.

Authored by Apple: Michael Parkin-White

Ref T96261

Reviewed By: fclem
Differential Revision: https://developer.blender.org/D16452

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

M	source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh
M	source/blender/draw/engines/overlay/shaders/overlay_edit_uv_edges_vert_no_geom.glsl
M	source/blender/gpu/intern/gpu_shader_create_info.cc
M	source/blender/gpu/intern/gpu_shader_create_info.hh
M	source/blender/gpu/metal/kernels/depth_2d_update_info.hh

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

diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh
index e1687b23c07..3e0492d024c 100644
--- a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh
+++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh
@@ -22,7 +22,9 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common)
     .vertex_source("overlay_edit_mesh_vert.glsl")
     .additional_info("draw_modelmat", "draw_globals");
 
+#ifdef WITH_METAL_BACKEND
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common_no_geom)
+    .metal_backend_only(true)
     .define("blender_srgb_to_framebuffer_space(a)", "a")
     .sampler(0, ImageType::DEPTH_2D, "depthTex")
     .fragment_out(0, Type::VEC4, "fragColor")
@@ -32,6 +34,7 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common_no_geom)
     .push_constant(Type::IVEC4, "dataMask")
     .vertex_source("overlay_edit_mesh_vert_no_geom.glsl")
     .additional_info("draw_modelmat", "draw_globals");
+#endif
 
 GPU_SHADER_INTERFACE_INFO(overlay_edit_mesh_vert_iface, "")
     .smooth(Type::VEC4, "finalColor")
@@ -73,8 +76,10 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge)
     .additional_info("overlay_edit_mesh_common");
 
 /* The Non-Geometry shader variant passes directly to fragment. */
+#ifdef WITH_METAL_BACKEND
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_no_geom)
-    // .do_static_compilation(true) /* TODO fix on GL */
+    .metal_backend_only(true)
+    .do_static_compilation(true)
     .define("EDGE")
     .vertex_in(0, Type::VEC3, "pos")
     .vertex_in(1, Type::UCHAR4, "data")
@@ -83,16 +88,20 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_no_geom)
     .vertex_out(overlay_edit_mesh_edge_geom_iface)
     .fragment_source("overlay_edit_mesh_frag.glsl")
     .additional_info("overlay_edit_mesh_common_no_geom");
+#endif
 
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_flat)
     .do_static_compilation(true)
     .define("FLAT")
     .additional_info("overlay_edit_mesh_edge");
 
+#ifdef WITH_METAL_BACKEND
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_flat_no_geom)
-    // .do_static_compilation(true) /* TODO fix on GL */
+    .metal_backend_only(true)
+    .do_static_compilation(true)
     .define("FLAT")
     .additional_info("overlay_edit_mesh_edge_no_geom");
+#endif
 
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_face)
     .do_static_compilation(true)
@@ -164,17 +173,23 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_clipped)
     .do_static_compilation(true)
     .additional_info("overlay_edit_mesh_edge", "drw_clipped");
 
+#ifdef WITH_METAL_BACKEND
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_clipped_no_geom)
-    // .do_static_compilation(true) /* TODO fix on GL */
+    .metal_backend_only(true)
+    .do_static_compilation(true)
     .additional_info("overlay_edit_mesh_edge_no_geom", "drw_clipped");
+#endif
 
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_flat_clipped)
     .do_static_compilation(true)
     .additional_info("overlay_edit_mesh_edge_flat", "drw_clipped");
 
+#ifdef WITH_METAL_BACKEND
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_flat_clipped_no_geom)
-    // .do_static_compilation(true) /* TODO fix on GL */
+    .metal_backend_only(true)
+    .do_static_compilation(true)
     .additional_info("overlay_edit_mesh_edge_flat_no_geom", "drw_clipped");
+#endif
 
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_face_clipped)
     .do_static_compilation(true)
@@ -215,7 +230,7 @@ GPU_SHADER_INTERFACE_INFO(overlay_edit_uv_geom_iface, "geom_out")
 
 GPU_SHADER_CREATE_INFO(overlay_edit_uv_edges_common)
     .vertex_in(0, Type::VEC2, "au")
-    .vertex_in(1, Type::UINT, "flag")
+    .vertex_in(1, Type::INT, "flag")
     .push_constant(Type::INT, "lineStyle")
     .push_constant(Type::BOOL, "doSmoothWire")
     .push_constant(Type::FLOAT, "alpha")
@@ -233,11 +248,14 @@ GPU_SHADER_CREATE_INFO(overlay_edit_uv_edges)
     .vertex_source("overlay_edit_uv_edges_vert.glsl")
     .geometry_source("overlay_edit_uv_edges_geom.glsl");
 
+#ifdef WITH_METAL_BACKEND
 GPU_SHADER_CREATE_INFO(overlay_edit_uv_edges_no_geom)
+    .metal_backend_only(true)
     .additional_info("overlay_edit_uv_edges_common")
-    // .do_static_compilation(true)
+    .do_static_compilation(true)
     .vertex_out(overlay_edit_uv_geom_iface)
     .vertex_source("overlay_edit_uv_edges_vert_no_geom.glsl");
+#endif
 
 GPU_SHADER_CREATE_INFO(overlay_edit_uv_edges_select)
     .do_static_compilation(true)
@@ -371,8 +389,10 @@ GPU_SHADER_CREATE_INFO(overlay_edit_curve_handle)
     .fragment_source("overlay_varying_color.glsl")
     .additional_info("draw_mesh", "draw_globals");
 
+#ifdef WITH_METAL_BACKEND
 GPU_SHADER_CREATE_INFO(overlay_edit_curve_handle_no_geom)
-    // .do_static_compilation(true) /* TODO fix on GL */
+    .metal_backend_only(true)
+    .do_static_compilation(true)
     .typedef_source("overlay_shader_shared.h")
     /* NOTE: Color already in Linear space. Which is what we want. */
     .define("srgbTarget", "false")
@@ -385,14 +405,18 @@ GPU_SHADER_CREATE_INFO(overlay_edit_curve_handle_no_geom)
     .vertex_source("overlay_edit_curve_handle_vert_no_geom.glsl")
     .fragment_source("overlay_varying_color.glsl")
     .additional_info("draw_mesh", "draw_globals");
+#endif
 
 GPU_SHADER_CREATE_INFO(overlay_edit_curve_handle_clipped)
     .do_static_compilation(true)
     .additional_info("overlay_edit_curve_handle", "drw_clipped");
 
+#ifdef WITH_METAL_BACKEND
 GPU_SHADER_CREATE_INFO(overlay_edit_curve_handle_clipped_no_geom)
-    // .do_static_compilation(true) /* TODO fix on GL */
+    .metal_backend_only(true)
+    .do_static_compilation(true)
     .additional_info("overlay_edit_curve_handle_no_geom", "drw_clipped");
+#endif
 
 GPU_SHADER_CREATE_INFO(overlay_edit_curve_point)
     .do_static_compilation(true)
diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_uv_edges_vert_no_geom.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_uv_edges_vert_no_geom.glsl
index e1cb1629e4a..d0a40743ba5 100644
--- a/source/blender/draw/engines/overlay/shaders/overlay_edit_uv_edges_vert_no_geom.glsl
+++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_uv_edges_vert_no_geom.glsl
@@ -45,14 +45,14 @@ void main()
   /* Vertex shader per input vertex. */
   vec3 world_pos0 = point_object_to_world(vec3(root_au0, 0.0));
   vec3 world_pos1 = point_object_to_world(vec3(root_au1, 0.0));
-  vec4 gl_pos0 = point_world_to_ndc(world_pos0);
-  vec4 gl_pos1 = point_world_to_ndc(world_pos1);
+  vec4 ndc_pos0 = point_world_to_ndc(world_pos0);
+  vec4 ndc_pos1 = point_world_to_ndc(world_pos1);
 
   /* Snap vertices to the pixel grid to reduce artifacts. */
   vec2 half_viewport_res = sizeViewport * 0.5;
   vec2 half_pixel_offset = sizeViewportInv * 0.5;
-  gl_pos0.xy = floor(gl_pos0.xy * half_viewport_res) / half_viewport_res + half_pixel_offset;
-  gl_pos1.xy = floor(gl_pos1.xy * half_viewport_res) / half_viewport_res + half_pixel_offset;
+  ndc_pos0.xy = floor(ndc_pos0.xy * half_viewport_res) / half_viewport_res + half_pixel_offset;
+  ndc_pos1.xy = floor(ndc_pos1.xy * half_viewport_res) / half_viewport_res + half_pixel_offset;
 
 #ifdef USE_EDGE_SELECT
   bool is_select0 = (root_flag0 & EDGE_UV_SELECT) != 0;
@@ -74,19 +74,19 @@ void main()
    * actual pixels are at 0.75, 1.0 is used for the background. */
   float depth0 = is_select0 ? 0.25 : 0.35;
   float depth1 = is_select1 ? 0.25 : 0.35;
-  gl_pos0.z = depth0;
-  gl_pos1.z = depth1;
+  ndc_pos0.z = depth0;
+  ndc_pos1.z = depth1;
 
   /* Avoid precision loss. */
-  vec2 stipplePos0 = 500.0 + 500.0 * (gl_pos0.xy / gl_pos0.w);
-  vec2 stipplePos1 = 500.0 + 500.0 * (gl_pos1.xy / gl_pos1.w);
+  vec2 stipplePos0 = 500.0 + 500.0 * (ndc_pos0.xy / ndc_pos0.w);
+  vec2 stipplePos1 = 500.0 + 500.0 * (ndc_pos1.xy / ndc_pos1.w);
   vec2 stippleStart0 = stipplePos0;
   vec2 stippleStart1 = stipplePos1;
 
   /* Geometry shader equivalent calculations. */
   vec2 ss_pos[2];
-  ss_pos[0] = gl_pos0.xy / gl_pos0.w;
-  ss_pos[1] = gl_pos1.xy / gl_pos1.w;
+  ss_pos[0] = ndc_pos0.xy / ndc_pos0.w;
+  ss_pos[1] = ndc_pos1.xy / ndc_pos1.w;
 
   float half_size = sizeEdge;
 
@@ -108,19 +108,19 @@ void main()
   switch (quad_vertex_id) {
     case 1: /* vertex A */
     case 3:
-      do_vertex(gl_pos1, selectionFac1, stippleStart1, stipplePos1, half_size, edge_ofs.xy);
+      do_vertex(ndc_pos1, selectionFac1, stippleStart1, stipplePos1, half_size, edge_ofs.xy);
       break;
     case 0: /* B */
-      do_vertex(gl_pos0, selectionFac0, stippleStart0, stipplePos0, half_size, edge_ofs.xy);
+      do_vertex(ndc_pos0, selectionFac0, stippleStart0, stipplePos0, half_size, edge_ofs.xy);
       break;
 
     case 2: /* C */
     case 4:
-      do_vertex(gl_pos0, selectionFac0, stippleStart0, stipplePos0, -half_size, -edge_ofs.xy);
+      do_vertex(ndc_pos0, selectionFac0, stippleStart0, stipplePos0, -half_size, -edge_ofs.xy);
       break;
 
     case 5: /* D */
-      do_vertex(gl_pos1, selectionFac1, stippleStart1, stipplePos1, -half_size, -edge_ofs.xy);
+      do_vertex(ndc_pos1, selectionFac1, stippleStart1, stipplePos1, -half_size, -edge_ofs.xy);
       break;
   }
 }
diff --git a/source/blender/gpu/intern/gpu_shader_create_info.cc b/source/blender/gpu/intern/gpu_shader_create_info.cc
index eca28abd876..d35ad4e9973 100644
--- a/source/blender/gpu/intern/gpu_shader_create_info.cc
+++ b/source/blender/gpu/intern/gpu_shader_create_info.cc
@@ -416,7 +416,8 @@ bool gpu_shader_create_info_compile_all()
   for (ShaderCreateInfo *info : g_create_infos->values()) {
     info->finalize();
     if (info->do_static_compilation_) {
-      if ((GPU_compute_shader_support() == false && info->compute_source_ != nullptr) ||
+      if ((info->metal_backend_only_ && GPU_backend_get_type() != GPU_BACKEND_METAL) ||
+          (GPU_compute_shader_support() == false && info->compute_source_ != nullptr) ||
           (GPU_geometry_shader_support() == false && info->geometry_source_ != nullptr) ||
           (GPU_shader_image_load_store_support() == false && info->has_resource_image()) ||
           (GPU_shader_storage_buffer_objects_support() == false && info->has_resource_storage())) {
diff --git a/sou

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list