[Bf-blender-cvs] [c476c36e400] master: Workbench Simplification Refactor

Clément Foucault noreply at git.blender.org
Wed Mar 11 17:14:23 CET 2020


Commit: c476c36e400883d929a7149def8dcb6ad6157a86
Author: Clément Foucault
Date:   Wed Mar 11 17:07:43 2020 +0100
Branches: master
https://developer.blender.org/rBc476c36e400883d929a7149def8dcb6ad6157a86

Workbench Simplification Refactor

This patch is (almost) a complete rewrite of workbench engine.
The features remain unchanged but the code quality is greatly improved.
Hair shading is brighter but also more correct.

This also introduce the concept of `DRWShaderLibrary` to make a simple
include system inside the GLSL files.

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

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

M	source/blender/blenlib/intern/BLI_memblock.c
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/overlay/overlay_wireframe.c
D	source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_effect_cavity_frag.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_effect_fxaa_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_vert.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_ghost_resolve_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_image_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_matcap_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
D	source/blender/draw/engines/workbench/shaders/workbench_object_outline_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_prepass_hair_vert.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_shader_interface_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_shadow_debug_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
D	source/blender/draw/engines/workbench/solid_mode.c
D	source/blender/draw/engines/workbench/transparent_mode.c
M	source/blender/draw/engines/workbench/workbench_data.c
D	source/blender/draw/engines/workbench/workbench_deferred.c
D	source/blender/draw/engines/workbench/workbench_effect_aa.c
A	source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
A	source/blender/draw/engines/workbench/workbench_effect_cavity.c
M	source/blender/draw/engines/workbench/workbench_effect_dof.c
D	source/blender/draw/engines/workbench/workbench_effect_fxaa.c
A	source/blender/draw/engines/workbench/workbench_effect_outline.c
D	source/blender/draw/engines/workbench/workbench_effect_taa.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_engine.h
D	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_materials.c
A	source/blender/draw/engines/workbench/workbench_opaque.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_render.c
A	source/blender/draw/engines/workbench/workbench_shader.c
A	source/blender/draw/engines/workbench/workbench_shadow.c
D	source/blender/draw/engines/workbench/workbench_studiolight.c
A	source/blender/draw/engines/workbench/workbench_transparent.c
M	source/blender/draw/engines/workbench/workbench_volume.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/intern/draw_hair.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_shader.c
M	source/blender/draw/intern/draw_manager_texture.c
M	source/blender/gpu/shaders/gpu_shader_common_obinfos_lib.glsl
M	source/blender/makesdna/DNA_view3d_enums.h

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

diff --git a/source/blender/blenlib/intern/BLI_memblock.c b/source/blender/blenlib/intern/BLI_memblock.c
index ee9ea15835b..b532202ebaa 100644
--- a/source/blender/blenlib/intern/BLI_memblock.c
+++ b/source/blender/blenlib/intern/BLI_memblock.c
@@ -191,10 +191,14 @@ void *BLI_memblock_iterstep(BLI_memblock_iter *iter)
   return ptr;
 }
 
-/* Direct access. elem is element index inside the chosen chunk. */
+/* Direct access. elem is element index inside the chosen chunk.
+ * Double usage: You can set chunk to 0 and set the absolute elem index.
+ * The correct chunk will be retrieve. */
 void *BLI_memblock_elem_get(BLI_memblock *mblk, int chunk, int elem)
 {
   BLI_assert(chunk < mblk->chunk_len);
-  BLI_assert(elem < (mblk->chunk_size / mblk->elem_size));
+  int elem_per_chunk = mblk->chunk_size / mblk->elem_size;
+  chunk += elem / elem_per_chunk;
+  elem = elem % elem_per_chunk;
   return (char *)(mblk->chunk_list[chunk]) + mblk->elem_size * elem;
 }
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 1f04739644e..fe03a32fd07 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -97,19 +97,18 @@ set(SRC
   engines/eevee/eevee_subsurface.c
   engines/eevee/eevee_temporal_sampling.c
   engines/eevee/eevee_volumes.c
-  engines/workbench/solid_mode.c
-  engines/workbench/transparent_mode.c
   engines/workbench/workbench_data.c
-  engines/workbench/workbench_deferred.c
-  engines/workbench/workbench_effect_aa.c
+  engines/workbench/workbench_effect_antialiasing.c
+  engines/workbench/workbench_effect_cavity.c
   engines/workbench/workbench_effect_dof.c
-  engines/workbench/workbench_effect_fxaa.c
-  engines/workbench/workbench_effect_taa.c
+  engines/workbench/workbench_effect_outline.c
   engines/workbench/workbench_engine.c
-  engines/workbench/workbench_forward.c
   engines/workbench/workbench_materials.c
+  engines/workbench/workbench_opaque.c
   engines/workbench/workbench_render.c
-  engines/workbench/workbench_studiolight.c
+  engines/workbench/workbench_shader.c
+  engines/workbench/workbench_shadow.c
+  engines/workbench/workbench_transparent.c
   engines/workbench/workbench_volume.c
   engines/external/external_engine.c
   engines/gpencil/gpencil_antialiasing.c
@@ -247,28 +246,32 @@ data_to_c_simple(engines/eevee/shaders/volumetric_scatter_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.glsl SRC)
 
 data_to_c_simple(engines/workbench/shaders/workbench_cavity_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_cavity_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_common_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_composite_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_curvature_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_deferred_composite_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_deferred_background_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_cavity_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_effect_dof_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_effect_fxaa_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_outline_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_smaa_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_smaa_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_effect_taa_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_forward_composite_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_forward_depth_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_ghost_resolve_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_object_outline_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_curvature_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_image_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_matcap_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_material_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_merge_infront_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_shadow_vert.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_shadow_geom.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_prepass_hair_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_shader_interface_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_caps_geom.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_shadow_debug_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_volume_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_shadow_geom.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_shadow_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_transparent_accum_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_transparent_resolve_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_volume_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_volume_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_world_light_lib.glsl SRC)
 
 data_to_c_simple(intern/shaders/common_colormanagement_lib.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index cfa0fa9eb1a..740ca42800e 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -381,9 +381,6 @@ static void OVERLAY_cache_finish(void *vedata)
 
     DRW_texture_ensure_fullscreen_2d(&dtxl->depth_in_front, GPU_DEPTH24_STENCIL8, 0);
 
-    GPU_framebuffer_ensure_config(
-        &dfbl->default_fb,
-        {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
     GPU_framebuffer_ensure_config(
         &dfbl->in_front_fb,
         {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c
index 722055c36f0..6b0e5e0b72e 100644
--- a/source/blender/draw/engines/overlay/overlay_wireframe.c
+++ b/source/blender/draw/engines/overlay/overlay_wireframe.c
@@ -68,22 +68,17 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata)
                                      OVERLAY_shader_wireframe();
 
   for (int xray = 0; xray < (is_material_shmode ? 1 : 2); xray++) {
-    /* Only do stencil test if stencil buffer is written by the render engine. */
-    DRWState stencil_state = is_material_shmode ? 0 : DRW_STATE_STENCIL_EQUAL;
     DRWState state = DRW_STATE_FIRST_VERTEX_CONVENTION | DRW_STATE_WRITE_COLOR |
                      DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
     DRWPass *pass;
-    uint stencil_mask;
 
     if (xray == 0) {
-      DRW_PASS_CREATE(psl->wireframe_ps, state | stencil_state | pd->clipping_state);
+      DRW_PASS_CREATE(psl->wireframe_ps, state | pd->clipping_state);
       pass = psl->wireframe_ps;
-      stencil_mask = 0xFF;
     }
     else {
       DRW_PASS_CREATE(psl->wireframe_xray_ps, state | pd->clipping_state);
       pass = psl->wireframe_xray_ps;
-      stencil_mask = 0x00;
     }
 
     for (int use_coloring = 0; use_coloring < 2; use_coloring++) {
@@ -94,17 +89,14 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata)
       DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0);
       DRW_shgroup_uniform_bool_copy(grp, "isObjectColor", is_object_color);
       DRW_shgroup_uniform_bool_copy(grp, "isRandomColor", is_random_color);
-      DRW_shgroup_stencil_mask(grp, stencil_mask);
 
       pd->wires_all_grp[xray][use_coloring] = grp = DRW_shgroup_create(wires_sh, pass);
       DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 1.0f);
-      DRW_shgroup_stencil_mask(grp, stencil_mask);
     }
 
     pd->wires_sculpt_grp[xray] = grp = DRW_shgroup_create(wires_sh, pass);
     DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 10.0f);
     DRW_shgroup_uniform_bool_copy(grp, "useColoring", false);
-    DRW_shgroup_stencil_mask(grp, stencil_mask);
   }
 
   if (is_material_shmode) {
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
deleted file mode 100644
index a0e04f252e2..00000000000
--- a/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
+++ /dev/null
@@ -1,81 +0,0 @@
-out vec4 fragColor;
-
-uniform sampler2D depthBuffer;
-uniform sampler2D colorBuffer;
-uniform sampler2D normalBuffer;
-uniform usampler2D objectId;
-
-uniform vec2 invertedViewportSize;
-uniform mat4 WinMatrix; /* inverse WinMatrix */
-
-uniform vec4 viewvecs[3];
-uniform vec4 ssao_params;
-uniform vec4 ssao_settings;
-uniform vec2 curvature_settings;
-uniform sampler2D ssao_jitter;
-
-layout(std140) uniform samples_block
-{
-  vec4 ssao_samples[500];
-};
-
-#define ssao_samples_num ssao_params.x
-#define jitter_tilling ssao_params.yz
-#define ssao_iteration ssao_params.w
-
-#define ssao_distance ssao_settings.x
-#define ssao_factor_cavity ssao_settings.y
-#define ssao_factor_edge ssao_settings.z
-#define ssao_attenuation ssao_settings.w
-
-vec3 get_view_space_from_depth(in vec2 uvcoords, in float depth)
-{
-  if (WinMatrix[3][3] == 0.0) {
-    /* Perspective */
-    float d = 2.0 * depth - 1.0;
-
-    float zview = -WinMatrix[3][2] / (d + WinMatrix[2][2]);
-
-    return zview * (viewvecs[0].xyz + vec3(uvcoords, 0.0) * 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list