[Bf-blender-cvs] [942a748d5d5] master: Eevee: Merge shadow map processing into one drawcall per light

Clément Foucault noreply at git.blender.org
Tue Jun 4 18:43:09 CEST 2019


Commit: 942a748d5d5d3d03c09ae2b0b0767f1b1eb16147
Author: Clément Foucault
Date:   Tue Jun 4 18:26:36 2019 +0200
Branches: master
https://developer.blender.org/rB942a748d5d5d3d03c09ae2b0b0767f1b1eb16147

Eevee: Merge shadow map processing into one drawcall per light

This removes a lot of framebuffer configuration and binding.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_data.c
M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/lights_lib.glsl
M	source/blender/draw/engines/eevee/shaders/shadow_copy_frag.glsl
A	source/blender/draw/engines/eevee/shaders/shadow_process_geom.glsl
A	source/blender/draw/engines/eevee/shaders/shadow_process_vert.glsl
M	source/blender/draw/engines/eevee/shaders/shadow_store_frag.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index b31cb7bf770..ade1ec5d53b 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -200,6 +200,8 @@ data_to_c_simple(engines/eevee/shaders/prepass_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/prepass_vert.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/shadow_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/shadow_vert.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/shadow_process_vert.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/shadow_process_geom.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/shadow_store_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/shadow_copy_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/bsdf_lut_frag.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index 0ce271275d0..b792f93ced2 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -38,8 +38,10 @@ void EEVEE_view_layer_data_free(void *storage)
   DRW_UBO_FREE_SAFE(sldata->shadow_render_ubo);
   GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_target_fb);
   GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_store_fb);
+  GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_copy_fb);
   GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_target_fb);
   GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_store_fb);
+  GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_copy_fb);
   DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_target);
   DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_blur);
   DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_pool);
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 0c2512904f9..c3a9c4bba41 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -49,6 +49,8 @@ static struct {
 
 extern char datatoc_shadow_vert_glsl[];
 extern char datatoc_shadow_frag_glsl[];
+extern char datatoc_shadow_process_vert_glsl[];
+extern char datatoc_shadow_process_geom_glsl[];
 extern char datatoc_shadow_store_frag_glsl[];
 extern char datatoc_shadow_copy_frag_glsl[];
 extern char datatoc_concentric_samples_lib_glsl[];
@@ -185,26 +187,30 @@ void EEVEE_lights_init(EEVEE_ViewLayerData *sldata)
 
   /* only compile the ones needed. reduce startup time. */
   if ((sh_method == SHADOW_ESM) && !e_data.shadow_copy_cube_sh[SHADOW_ESM]) {
-    e_data.shadow_copy_cube_sh[SHADOW_ESM] = DRW_shader_create_fullscreen(
-        datatoc_shadow_copy_frag_glsl,
-        "#define ESM\n"
-        "#define COPY\n");
-    e_data.shadow_copy_cascade_sh[SHADOW_ESM] = DRW_shader_create_fullscreen(
-        datatoc_shadow_copy_frag_glsl,
-        "#define ESM\n"
-        "#define COPY\n"
-        "#define CSM\n");
+    e_data.shadow_copy_cube_sh[SHADOW_ESM] = DRW_shader_create(datatoc_shadow_process_vert_glsl,
+                                                               datatoc_shadow_process_geom_glsl,
+                                                               datatoc_shadow_copy_frag_glsl,
+                                                               "#define ESM\n"
+                                                               "#define COPY\n");
+    e_data.shadow_copy_cascade_sh[SHADOW_ESM] = DRW_shader_create(datatoc_shadow_process_vert_glsl,
+                                                                  datatoc_shadow_process_geom_glsl,
+                                                                  datatoc_shadow_copy_frag_glsl,
+                                                                  "#define ESM\n"
+                                                                  "#define COPY\n"
+                                                                  "#define CSM\n");
   }
   else if ((sh_method == SHADOW_VSM) && !e_data.shadow_copy_cube_sh[SHADOW_VSM]) {
-    e_data.shadow_copy_cube_sh[SHADOW_VSM] = DRW_shader_create_fullscreen(
-        datatoc_shadow_copy_frag_glsl,
-        "#define VSM\n"
-        "#define COPY\n");
-    e_data.shadow_copy_cascade_sh[SHADOW_VSM] = DRW_shader_create_fullscreen(
-        datatoc_shadow_copy_frag_glsl,
-        "#define VSM\n"
-        "#define COPY\n"
-        "#define CSM\n");
+    e_data.shadow_copy_cube_sh[SHADOW_VSM] = DRW_shader_create(datatoc_shadow_process_vert_glsl,
+                                                               datatoc_shadow_process_geom_glsl,
+                                                               datatoc_shadow_copy_frag_glsl,
+                                                               "#define VSM\n"
+                                                               "#define COPY\n");
+    e_data.shadow_copy_cascade_sh[SHADOW_VSM] = DRW_shader_create(datatoc_shadow_process_vert_glsl,
+                                                                  datatoc_shadow_process_geom_glsl,
+                                                                  datatoc_shadow_copy_frag_glsl,
+                                                                  "#define VSM\n"
+                                                                  "#define COPY\n"
+                                                                  "#define CSM\n");
   }
 }
 
@@ -239,7 +245,10 @@ static GPUShader *eevee_lights_get_store_sh(int shadow_method, bool high_blur, b
     char *define_str = BLI_dynstr_get_cstring(ds_frag);
     BLI_dynstr_free(ds_frag);
 
-    *shader = DRW_shader_create_fullscreen(store_shadow_shader_str, define_str);
+    *shader = DRW_shader_create(datatoc_shadow_process_vert_glsl,
+                                datatoc_shadow_process_geom_glsl,
+                                store_shadow_shader_str,
+                                define_str);
 
     MEM_freeN(store_shadow_shader_str);
     MEM_freeN(define_str);
@@ -256,14 +265,13 @@ static DRWPass *eevee_lights_cube_store_pass_get(EEVEE_PassList *psl,
   bool high_blur = shadow_samples_len > 16;
   DRWPass **pass = (high_blur) ? &psl->shadow_cube_store_pass : &psl->shadow_cube_store_high_pass;
   if (*pass == NULL) {
-    EEVEE_LightsInfo *linfo = sldata->lights;
     *pass = DRW_pass_create("Shadow Cube Storage Pass", DRW_STATE_WRITE_COLOR);
     GPUShader *shader = eevee_lights_get_store_sh(shadow_method, high_blur, false);
     DRWShadingGroup *grp = DRW_shgroup_create(shader, *pass);
     DRW_shgroup_uniform_texture_ref(grp, "shadowTexture", &sldata->shadow_cube_blur);
     DRW_shgroup_uniform_block(grp, "shadow_render_block", sldata->shadow_render_ubo);
-    DRW_shgroup_uniform_float(grp, "shadowFilterSize", &linfo->filter_size, 1);
-    DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
+
+    DRW_shgroup_call_procedural_triangles(grp, NULL, 6);
   }
   return *pass;
 }
@@ -277,15 +285,13 @@ static DRWPass *eevee_lights_cascade_store_pass_get(EEVEE_PassList *psl,
   DRWPass **pass = (high_blur) ? &psl->shadow_cascade_store_pass :
                                  &psl->shadow_cascade_store_high_pass;
   if (*pass == NULL) {
-    EEVEE_LightsInfo *linfo = sldata->lights;
     *pass = DRW_pass_create("Shadow Cascade Storage Pass", DRW_STATE_WRITE_COLOR);
     GPUShader *shader = eevee_lights_get_store_sh(shadow_method, high_blur, true);
     DRWShadingGroup *grp = DRW_shgroup_create(shader, *pass);
     DRW_shgroup_uniform_texture_ref(grp, "shadowTexture", &sldata->shadow_cascade_blur);
     DRW_shgroup_uniform_block(grp, "shadow_render_block", sldata->shadow_render_ubo);
-    DRW_shgroup_uniform_int(grp, "cascadeId", &linfo->current_shadow_cascade, 1);
-    DRW_shgroup_uniform_float(grp, "shadowFilterSize", &linfo->filter_size, 1);
-    DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
+
+    DRW_shgroup_call_procedural_triangles(grp, NULL, MAX_CASCADE_NUM);
   }
   return *pass;
 }
@@ -325,9 +331,8 @@ void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
                                               psl->shadow_cube_copy_pass);
     DRW_shgroup_uniform_texture_ref(grp, "shadowTexture", &sldata->shadow_cube_target);
     DRW_shgroup_uniform_block(grp, "shadow_render_block", sldata->shadow_render_ubo);
-    DRW_shgroup_uniform_float(grp, "shadowFilterSize", &linfo->filter_size, 1);
-    DRW_shgroup_uniform_int(grp, "faceId", &linfo->current_shadow_face, 1);
-    DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
+
+    DRW_shgroup_call_procedural_triangles(grp, NULL, 6);
   }
 
   {
@@ -337,9 +342,8 @@ void EEVEE_lights_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
                                               psl->shadow_cascade_copy_pass);
     DRW_shgroup_uniform_texture_ref(grp, "shadowTexture", &sldata->shadow_cascade_target);
     DRW_shgroup_uniform_block(grp, "shadow_render_block", sldata->shadow_render_ubo);
-    DRW_shgroup_uniform_float(grp, "shadowFilterSize", &linfo->filter_size, 1);
-    DRW_shgroup_uniform_int(grp, "cascadeId", &linfo->current_shadow_cascade, 1);
-    DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
+
+    DRW_shgroup_call_procedural_triangles(grp, NULL, MAX_CASCADE_NUM);
   }
 
   {
@@ -589,6 +593,10 @@ void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
     sldata->shadow_cube_blur = DRW_texture_create_cube(
         linfo->shadow_cube_size, shadow_pool_format, DRW_TEX_FILTER, NULL);
   }
+  GPU_framebuffer_ensure_config(
+      &sldata->shadow_cube_copy_fb,
+      {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(sldata->shadow_cube_blur)});
+
   if (!sldata->shadow_cube_pool) {
     sldata->shadow_cube_pool = DRW_texture_create_2d_array(linfo->shadow_cube_store_size,
                                                            linfo->shadow_cube_store_size,
@@ -618,6 +626,10 @@ void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
                                                               DRW_TEX_FILTER,
                                                               NULL);
   }
+  GPU_framebuffer_ensure_config(
+      &sldata->shadow_cascade_copy_fb,
+      {GPU_ATTACHME

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list