[Bf-blender-cvs] [1514e1a5b7e] master: Metal: First set of Geometry Shader alternative implementations using SSBO vertex shader fetch.

Jason Fielder noreply at git.blender.org
Thu Sep 22 17:45:21 CEST 2022


Commit: 1514e1a5b7e15ec0c11cd40c2b9389982bd5d00e
Author: Jason Fielder
Date:   Thu Sep 22 17:40:45 2022 +0200
Branches: master
https://developer.blender.org/rB1514e1a5b7e15ec0c11cd40c2b9389982bd5d00e

Metal: First set of Geometry Shader alternative implementations using SSBO vertex shader fetch.

These implementations remove dependency on the Geometry pass by instead invoking one vertex shader instance for each expected output vertex, matching what a geometry shader would emit. Each vertex shader instance is then responsible for calculating the same output position based on its vertex_id as the logic would in the geometry shader version.

SSBO Vertex fetch enables full random-access into a vertex buffer by binding it as a read-only SSBO. This enables each instance to read neighbouring vertex data to perform contextual calculations as a geometry shader would, for cases where attribute Multiload is not supported.

Authored by Apple: Michael Parkin-White

Ref T96261

Reviewed By: fclem

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

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/shaders/infos/overlay_armature_info.hh
M	source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh
M	source/blender/draw/engines/overlay/shaders/infos/overlay_extra_info.hh
A	source/blender/draw/engines/overlay/shaders/overlay_armature_shape_outline_vert_no_geom.glsl
A	source/blender/draw/engines/overlay/shaders/overlay_edit_curve_handle_vert_no_geom.glsl
A	source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl
A	source/blender/draw/engines/overlay/shaders/overlay_motion_path_line_vert_no_geom.glsl
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/intern/gpu_shader_create_info.cc
M	source/blender/gpu/metal/mtl_shader.mm
A	source/blender/gpu/shaders/gpu_shader_3D_polyline_vert_no_geom.glsl
M	source/blender/gpu/shaders/infos/gpu_shader_3D_polyline_info.hh

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 8b61d8686cd..540041ed02a 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -555,6 +555,7 @@ set(GLSL_SRC
   engines/overlay/shaders/overlay_armature_envelope_solid_vert.glsl
   engines/overlay/shaders/overlay_armature_shape_outline_geom.glsl
   engines/overlay/shaders/overlay_armature_shape_outline_vert.glsl
+  engines/overlay/shaders/overlay_armature_shape_outline_vert_no_geom.glsl
   engines/overlay/shaders/overlay_armature_shape_solid_frag.glsl
   engines/overlay/shaders/overlay_armature_shape_solid_vert.glsl
   engines/overlay/shaders/overlay_armature_shape_wire_vert.glsl
@@ -572,6 +573,7 @@ set(GLSL_SRC
   engines/overlay/shaders/overlay_depth_only_vert.glsl
   engines/overlay/shaders/overlay_edit_curve_handle_geom.glsl
   engines/overlay/shaders/overlay_edit_curve_handle_vert.glsl
+  engines/overlay/shaders/overlay_edit_curve_handle_vert_no_geom.glsl
   engines/overlay/shaders/overlay_edit_curve_point_vert.glsl
   engines/overlay/shaders/overlay_edit_curve_wire_vert.glsl
   engines/overlay/shaders/overlay_edit_gpencil_canvas_vert.glsl
@@ -587,6 +589,7 @@ set(GLSL_SRC
   engines/overlay/shaders/overlay_edit_mesh_normal_vert.glsl
   engines/overlay/shaders/overlay_edit_mesh_skin_root_vert.glsl
   engines/overlay/shaders/overlay_edit_mesh_vert.glsl
+  engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl
   engines/overlay/shaders/overlay_edit_particle_point_vert.glsl
   engines/overlay/shaders/overlay_edit_particle_strand_vert.glsl
   engines/overlay/shaders/overlay_edit_uv_edges_frag.glsl
@@ -619,6 +622,7 @@ set(GLSL_SRC
   engines/overlay/shaders/overlay_motion_path_line_frag.glsl
   engines/overlay/shaders/overlay_motion_path_line_geom.glsl
   engines/overlay/shaders/overlay_motion_path_line_vert.glsl
+  engines/overlay/shaders/overlay_motion_path_line_vert_no_geom.glsl
   engines/overlay/shaders/overlay_motion_path_point_vert.glsl
   engines/overlay/shaders/overlay_outline_detect_frag.glsl
   engines/overlay/shaders/overlay_outline_prepass_curves_vert.glsl
diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_armature_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_armature_info.hh
index 9f2acceed97..0ab653ba29f 100644
--- a/source/blender/draw/engines/overlay/shaders/infos/overlay_armature_info.hh
+++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_armature_info.hh
@@ -69,6 +69,11 @@ GPU_SHADER_INTERFACE_INFO(overlay_armature_shape_outline_iface, "geom_in")
     .smooth(Type::VEC4, "vColSize")
     .flat(Type::INT, "inverted");
 
+GPU_SHADER_INTERFACE_INFO(overlay_armature_shape_outline_no_geom_iface, "")
+    .flat(Type::VEC4, "finalColor")
+    .flat(Type::VEC2, "edgeStart")
+    .no_perspective(Type::VEC2, "edgePos");
+
 GPU_SHADER_CREATE_INFO(overlay_armature_shape_outline)
     .do_static_compilation(true)
     .vertex_in(0, Type::VEC3, "pos")
@@ -84,10 +89,26 @@ GPU_SHADER_CREATE_INFO(overlay_armature_shape_outline)
     .fragment_source("overlay_armature_wire_frag.glsl")
     .additional_info("overlay_frag_output", "overlay_armature_common", "draw_globals");
 
+GPU_SHADER_CREATE_INFO(overlay_armature_shape_outline_no_geom)
+    .do_static_compilation(true)
+    .vertex_in(0, Type::VEC3, "pos")
+    .vertex_in(1, Type::VEC3, "snor")
+    /* Per instance. */
+    .vertex_in(2, Type::VEC4, "color")
+    .vertex_in(3, Type::MAT4, "inst_obmat")
+    .vertex_out(overlay_armature_shape_outline_no_geom_iface)
+    .vertex_source("overlay_armature_shape_outline_vert_no_geom.glsl")
+    .fragment_source("overlay_armature_wire_frag.glsl")
+    .additional_info("overlay_frag_output", "overlay_armature_common", "draw_globals");
+
 GPU_SHADER_CREATE_INFO(overlay_armature_shape_outline_clipped)
     .do_static_compilation(true)
     .additional_info("overlay_armature_shape_outline", "drw_clipped");
 
+GPU_SHADER_CREATE_INFO(overlay_armature_shape_outline_clipped_no_geom)
+    .do_static_compilation(true)
+    .additional_info("overlay_armature_shape_outline_no_geom", "drw_clipped");
+
 GPU_SHADER_INTERFACE_INFO(overlay_armature_shape_solid_iface, "")
     .smooth(Type::VEC4, "finalColor")
     .flat(Type::INT, "inverted");
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 9396a6d3f2f..92a35a049a4 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,6 +22,17 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common)
     .vertex_source("overlay_edit_mesh_vert.glsl")
     .additional_info("draw_modelmat", "draw_globals");
 
+GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common_no_geom)
+    .define("blender_srgb_to_framebuffer_space(a)", "a")
+    .sampler(0, ImageType::DEPTH_2D, "depthTex")
+    .fragment_out(0, Type::VEC4, "fragColor")
+    .push_constant(Type::BOOL, "selectFaces")
+    .push_constant(Type::BOOL, "selectEdges")
+    .push_constant(Type::FLOAT, "alpha")
+    .push_constant(Type::IVEC4, "dataMask")
+    .vertex_source("overlay_edit_mesh_vert_no_geom.glsl")
+    .additional_info("draw_modelmat", "draw_globals");
+
 GPU_SHADER_INTERFACE_INFO(overlay_edit_mesh_vert_iface, "")
     .smooth(Type::VEC4, "finalColor")
     .smooth(Type::FLOAT, "vertexCrease");
@@ -61,11 +72,28 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge)
     .fragment_source("overlay_edit_mesh_frag.glsl")
     .additional_info("overlay_edit_mesh_common");
 
+/* The Non-Geometry shader variant passes directly to fragment. */
+GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_no_geom)
+    .do_static_compilation(true)
+    .define("EDGE")
+    .vertex_in(0, Type::VEC3, "pos")
+    .vertex_in(1, Type::UCHAR4, "data")
+    .vertex_in(2, Type::VEC3_101010I2, "vnor")
+    .push_constant(Type::BOOL, "do_smooth_wire")
+    .vertex_out(overlay_edit_mesh_edge_geom_iface)
+    .fragment_source("overlay_edit_mesh_frag.glsl")
+    .additional_info("overlay_edit_mesh_common_no_geom");
+
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_flat)
     .do_static_compilation(true)
     .define("FLAT")
     .additional_info("overlay_edit_mesh_edge");
 
+GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_flat_no_geom)
+    .do_static_compilation(true)
+    .define("FLAT")
+    .additional_info("overlay_edit_mesh_edge_no_geom");
+
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_face)
     .do_static_compilation(true)
     .define("FACE")
@@ -136,10 +164,18 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_clipped)
     .do_static_compilation(true)
     .additional_info("overlay_edit_mesh_edge", "drw_clipped");
 
+GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_clipped_no_geom)
+    .do_static_compilation(true)
+    .additional_info("overlay_edit_mesh_edge_no_geom", "drw_clipped");
+
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_flat_clipped)
     .do_static_compilation(true)
     .additional_info("overlay_edit_mesh_edge_flat", "drw_clipped");
 
+GPU_SHADER_CREATE_INFO(overlay_edit_mesh_edge_flat_clipped_no_geom)
+    .do_static_compilation(true)
+    .additional_info("overlay_edit_mesh_edge_flat_no_geom", "drw_clipped");
+
 GPU_SHADER_CREATE_INFO(overlay_edit_mesh_face_clipped)
     .do_static_compilation(true)
     .additional_info("overlay_edit_mesh_face", "drw_clipped");
@@ -326,10 +362,29 @@ GPU_SHADER_CREATE_INFO(overlay_edit_curve_handle)
     .fragment_source("overlay_varying_color.glsl")
     .additional_info("draw_mesh", "draw_globals");
 
+GPU_SHADER_CREATE_INFO(overlay_edit_curve_handle_no_geom)
+    .do_static_compilation(true)
+    .typedef_source("overlay_shader_shared.h")
+    /* NOTE: Color already in Linear space. Which is what we want. */
+    .define("srgbTarget", "false")
+    .vertex_in(0, Type::VEC3, "pos")
+    .vertex_in(1, Type::INT, "data")
+    .vertex_out(overlay_edit_curve_handle_iface)
+    .push_constant(Type::BOOL, "showCurveHandles")
+    .push_constant(Type::INT, "curveHandleDisplay")
+    .fragment_out(0, Type::VEC4, "fragColor")
+    .vertex_source("overlay_edit_curve_handle_vert_no_geom.glsl")
+    .fragment_source("overlay_varying_color.glsl")
+    .additional_info("draw_mesh", "draw_globals");
+
 GPU_SHADER_CREATE_INFO(overlay_edit_curve_handle_clipped)
     .do_static_compilation(true)
     .additional_info("overlay_edit_curve_handle", "drw_clipped");
 
+GPU_SHADER_CREATE_INFO(overlay_edit_curve_handle_clipped_no_geom)
+    .do_static_compilation(true)
+    .additional_info("overlay_edit_curve_handle_no_geom", "drw_clipped");
+
 GPU_SHADER_CREATE_INFO(overlay_edit_curve_point)
     .do_static_compilation(true)
     .typedef_source("overlay_shader_shared.h")
diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_extra_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_extra_info.hh
index 5b50bbcaa55..4ebc83c27b0 100644
--- a/source/blender/draw/engines/overlay/shaders/infos/overlay_extra_info.hh
+++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_extra_info.hh
@@ -183,6 +183,9 @@ GPU_SHADER_INTERFACE_INFO(overlay_motion_path_line_iface, "interp")
     .flat(Type::VEC2, "ss_pos")
     .smooth(Type::VEC4, "color");
 
+GPU_SHADER_INTERFACE_INFO(overlay_motion_path_line_no_geom_iface, "interp")
+    .smooth(Type::VEC4, "color");
+
 GPU_SHADER_CREATE_INFO(overlay_motion_path_line)
     .do_static_compilation(true)
     .vertex_in(0, Type::VEC3, "pos")
@@ -199,10 +202,27 @@ GPU_SHADER_CREATE_INFO(overlay_motion_path_line)
     .fragment_source("overlay_motion_path_line_frag.glsl")
     .additional_info("draw_view", "draw_globals");
 
+GPU_SHADER_CREATE_INFO(overlay_motion_path_line_no_geom)
+    .do_static_compilation(true)
+    .vertex_in(0, Type::VEC3, "pos")
+    .push_constant(Type::IVEC4, "mpathLineSettings")
+    .push_constant(Type::BOOL, "selected")
+    .push_constant(Type::VEC3, "customColor")
+    .push_constant(Type::INT, "lineThickness") /* In pixels. */
+    .vertex_out(overlay_motion_path_line_no_geom_iface)
+    .fragment_out(0, Type::VEC4, "fragColor")
+    .vertex_source("overlay_motion_path_lin

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list