[Bf-blender-cvs] [4d18250a2ae] arcpatch-D16436: Metal: Add support for Workbench Shadows.

Jason Fielder noreply at git.blender.org
Thu Dec 8 23:00:14 CET 2022


Commit: 4d18250a2ae13c73859c7ea7ccc789523da1cfd2
Author: Jason Fielder
Date:   Thu Dec 8 22:24:52 2022 +0100
Branches: arcpatch-D16436
https://developer.blender.org/rB4d18250a2ae13c73859c7ea7ccc789523da1cfd2

Metal: Add support for Workbench Shadows.

Implementing non-geometry-shader path for rendering stencil shadows, used by the workbench engine. Patch also contains a few small modifications to Create-info to ensure usage of gl_FragDepth is explicitly specified. This is required for testing of the patch.

Authored by Apple: Michael Parkin-White

Ref T96261

Reviewed By: fclem

Maniphest Tasks: T96261

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

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/gpencil/shaders/infos/gpencil_info.hh
M	source/blender/draw/engines/image/shaders/infos/engine_image_info.hh
M	source/blender/draw/engines/overlay/shaders/infos/overlay_armature_info.hh
M	source/blender/draw/engines/overlay/shaders/infos/overlay_outline_info.hh
M	source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh
M	source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
M	source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
A	source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_vert_no_geom.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_shadow_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
M	source/blender/gpu/metal/mtl_batch.mm
M	source/blender/gpu/metal/mtl_shader_generator.mm
M	source/blender/gpu/metal/mtl_state.mm

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 5902dc18165..3193adbf526 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -474,9 +474,11 @@ set(GLSL_SRC
   engines/workbench/shaders/workbench_prepass_pointcloud_vert.glsl
   engines/workbench/shaders/workbench_prepass_vert.glsl
   engines/workbench/shaders/workbench_shadow_caps_geom.glsl
+  engines/workbench/shaders/workbench_shadow_caps_vert_no_geom.glsl
   engines/workbench/shaders/workbench_shadow_debug_frag.glsl
   engines/workbench/shaders/workbench_shadow_geom.glsl
   engines/workbench/shaders/workbench_shadow_vert.glsl
+  engines/workbench/shaders/workbench_shadow_vert_no_geom.glsl
   engines/workbench/shaders/workbench_transparent_accum_frag.glsl
   engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
   engines/workbench/shaders/workbench_volume_frag.glsl
diff --git a/source/blender/draw/engines/gpencil/shaders/infos/gpencil_info.hh b/source/blender/draw/engines/gpencil/shaders/infos/gpencil_info.hh
index da2776254e6..19fe29c6d38 100644
--- a/source/blender/draw/engines/gpencil/shaders/infos/gpencil_info.hh
+++ b/source/blender/draw/engines/gpencil/shaders/infos/gpencil_info.hh
@@ -43,6 +43,7 @@ GPU_SHADER_CREATE_INFO(gpencil_geometry)
     .vertex_out(gpencil_geometry_iface)
     .vertex_source("gpencil_vert.glsl")
     .fragment_source("gpencil_frag.glsl")
+    .depth_write(DepthWrite::ANY)
     .additional_info("draw_gpencil");
 
 /** \} */
@@ -79,6 +80,7 @@ GPU_SHADER_CREATE_INFO(gpencil_depth_merge)
     .sampler(0, ImageType::DEPTH_2D, "depthBuf")
     .vertex_source("gpencil_depth_merge_vert.glsl")
     .fragment_source("gpencil_depth_merge_frag.glsl")
+    .depth_write(DepthWrite::ANY)
     .additional_info("draw_view");
 
 /** \} */
diff --git a/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh b/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh
index 5804ca6c5a0..4ab714e0689 100644
--- a/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh
+++ b/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh
@@ -29,4 +29,5 @@ GPU_SHADER_CREATE_INFO(image_engine_depth_shader)
     .vertex_source("image_engine_depth_vert.glsl")
     .fragment_source("image_engine_depth_frag.glsl")
     .additional_info("draw_modelmat")
+    .depth_write(DepthWrite::ANY)
     .do_static_compilation(true);
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 caa18ece122..547bb52e9a2 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
@@ -49,7 +49,8 @@ GPU_SHADER_CREATE_INFO(overlay_armature_sphere_solid)
     .vertex_out(overlay_armature_sphere_solid_iface)
     .vertex_source("overlay_armature_sphere_solid_vert.glsl")
     .fragment_source("overlay_armature_sphere_solid_frag.glsl")
-    .additional_info("overlay_frag_output", "overlay_armature_common", "draw_globals");
+    .additional_info("overlay_frag_output", "overlay_armature_common", "draw_globals")
+    .depth_write(DepthWrite::ANY);
 
 GPU_SHADER_CREATE_INFO(overlay_armature_sphere_solid_clipped)
     .do_static_compilation(true)
diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_outline_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_outline_info.hh
index abf9e873b29..39e0559d937 100644
--- a/source/blender/draw/engines/overlay/shaders/infos/overlay_outline_info.hh
+++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_outline_info.hh
@@ -72,7 +72,8 @@ GPU_SHADER_CREATE_INFO(overlay_outline_prepass_gpencil)
     /* Using uint because 16bit uint can contain more ids than int. */
     .fragment_out(0, Type::UINT, "out_object_id")
     .fragment_source("overlay_outline_prepass_gpencil_frag.glsl")
-    .additional_info("draw_gpencil", "draw_resource_handle", "draw_globals");
+    .additional_info("draw_gpencil", "draw_resource_handle", "draw_globals")
+    .depth_write(DepthWrite::ANY);
 
 GPU_SHADER_CREATE_INFO(overlay_outline_prepass_gpencil_clipped)
     .do_static_compilation(true)
diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh
index 1899b191741..a5cec41c01a 100644
--- a/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh
+++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh
@@ -27,7 +27,8 @@ GPU_SHADER_CREATE_INFO(overlay_wireframe)
     .fragment_source("overlay_wireframe_frag.glsl")
     .fragment_out(0, Type::VEC4, "fragColor")
     .fragment_out(1, Type::VEC4, "lineOutput")
-    .additional_info("draw_mesh", "draw_object_infos", "draw_globals");
+    .additional_info("draw_mesh", "draw_object_infos", "draw_globals")
+    .depth_write(DepthWrite::ANY);
 
 GPU_SHADER_CREATE_INFO(overlay_wireframe_clipped)
     .do_static_compilation(true)
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
index e5ba0390244..8322d6891b7 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
@@ -7,4 +7,5 @@ GPU_SHADER_CREATE_INFO(workbench_merge_infront)
     .sampler(0, ImageType::DEPTH_2D, "depthBuffer")
     .fragment_source("workbench_merge_infront_frag.glsl")
     .additional_info("draw_fullscreen")
+    .depth_write(DepthWrite::ANY)
     .do_static_compilation(true);
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
index c66e4d61233..3d86ef6e78c 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
@@ -13,12 +13,17 @@ GPU_SHADER_INTERFACE_INFO(workbench_shadow_iface, "vData")
 
 GPU_SHADER_CREATE_INFO(workbench_shadow_common)
     .vertex_in(0, Type::VEC3, "pos")
-    .vertex_out(workbench_shadow_iface)
     .push_constant(Type::FLOAT, "lightDistance")
     .push_constant(Type::VEC3, "lightDirection")
-    .vertex_source("workbench_shadow_vert.glsl")
     .additional_info("draw_mesh");
 
+/* `workbench_shadow_vert.glsl` only used by geometry shader path.
+ * Vertex output iface not needed by non-geometry shader variants,
+ * as only gl_Position is returned. */
+GPU_SHADER_CREATE_INFO(workbench_shadow_common_geom)
+    .vertex_out(workbench_shadow_iface)
+    .vertex_source("workbench_shadow_vert.glsl");
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -26,13 +31,25 @@ GPU_SHADER_CREATE_INFO(workbench_shadow_common)
  * \{ */
 
 GPU_SHADER_CREATE_INFO(workbench_shadow_manifold)
+    .additional_info("workbench_shadow_common_geom")
     .geometry_layout(PrimitiveIn::LINES_ADJACENCY, PrimitiveOut::TRIANGLE_STRIP, 4, 1)
     .geometry_source("workbench_shadow_geom.glsl");
 
 GPU_SHADER_CREATE_INFO(workbench_shadow_no_manifold)
+    .additional_info("workbench_shadow_common_geom")
     .geometry_layout(PrimitiveIn::LINES_ADJACENCY, PrimitiveOut::TRIANGLE_STRIP, 4, 2)
     .geometry_source("workbench_shadow_geom.glsl");
 
+GPU_SHADER_CREATE_INFO(workbench_shadow_manifold_no_geom)
+    .vertex_source("workbench_shadow_vert_no_geom.glsl")
+    /* Inject SSBO vertex fetch declaration using 2 output triangles. */
+    .define("VAR_MANIFOLD", "\n#pragma USE_SSBO_VERTEX_FETCH(TriangleList, 6)");
+
+GPU_SHADER_CREATE_INFO(workbench_shadow_no_manifold_no_geom)
+    .vertex_source("workbench_shadow_vert_no_geom.glsl")
+    /* Inject SSBO vertex fetch declaration using 4 output triangles. */
+    .define("VAR_NO_MANIFOLD", "\n#pragma USE_SSBO_VERTEX_FETCH(TriangleList, 12)");
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -40,9 +57,13 @@ GPU_SHADER_CREATE_INFO(workbench_shadow_no_manifold)
  * \{ */
 
 GPU_SHADER_CREATE_INFO(workbench_shadow_caps)
+    .additional_info("workbench_shadow_common_geom")
     .geometry_layout(PrimitiveIn::TRIANGLES, PrimitiveOut::TRIANGLE_STRIP, 3, 2)
     .geometry_source("workbench_shadow_caps_geom.glsl");
 
+GPU_SHADER_CREATE_INFO(workbench_shadow_caps_no_geom)
+    .vertex_source("workbench_shadow_caps_vert_no_geom.glsl");
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_vert_no_geom.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_vert_no_geom.glsl
new file mode 100644
index 00000000000..8f21b55fa18
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_caps_vert_no_geom.glsl
@@ -0,0 +1,105 @@
+#pragma BLENDER_REQUIRE(common_view_lib.glsl)
+#pragma USE_SSBO_VERTEX_FETCH(TriangleList, 6)
+
+#ifdef DOUBLE_MANIFOLD
+#  define vert_len 6 /* Triangle Strip with 6 verts = 4 triangles = 12 verts*/
+#  define emit_triangle_count 2
+#else
+#  define vert_len 6 /* Triangle Strip with 6 verts = 4 triangles = 12 verts*/
+#  define emit_triangle_count 2
+#endif
+
+struct VertexData {
+  vec3 pos;           /* local position */
+  vec4 frontPosition; /* final ndc position */
+  vec4 backPosition;
+};
+
+/* Input geometry triangle list. */
+VertexData vData[3] = {};
+
+#define DISCARD_VERTEX \
+  gl_Position = vec4(0.0); \
+  return;
+
+vec4 get_pos(int v, bool backface)
+{
+  return (backface) ? vData[v].backPosition : vData[v].frontPosition;
+}
+
+void emit_cap(const bool front, bool reversed, int triangle_vertex_id)
+{
+  /* Inverse. */
+  ivec2 idx = (reversed) ? ivec2(2, 1) : ivec2(1, 2);
+
+  /* Output position depending on vertex ID. */
+  switch (triangle_vertex_id) {
+    case 0: {
+      gl_Position = (front) ? vData[0].frontPosition : vData[0].backPosition;
+    } break;
+


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list