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