[Bf-blender-cvs] [e3e6dc41a77] master: Code cleanup EEVEE Render Passes

Jeroen Bakker noreply at git.blender.org
Tue Feb 18 12:23:38 CET 2020


Commit: e3e6dc41a77a2537b34e7f3699996b6b8a70542d
Author: Jeroen Bakker
Date:   Tue Feb 18 11:10:27 2020 +0100
Branches: master
https://developer.blender.org/rBe3e6dc41a77a2537b34e7f3699996b6b8a70542d

Code cleanup EEVEE Render Passes

The render passes didn't follow the DrawManager way of doing things. It added new geometry and shading groups during drawing. This would make it harder to migrate to Vulkan later on.

This change will re-implement this part by using uniform references.

Reviewed By: Clément Foucault

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

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

M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_renderpasses.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 1850324887c..bb3bb360d97 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -804,6 +804,11 @@ typedef struct EEVEE_PrivateData {
   /* Renderpasses */
   /* Bitmask containing the active render_passes */
   eScenePassType render_passes;
+  /* Uniform references that are referenced inside the `renderpass_pass`. They are updated
+   * to reuse the drawing pass and the shading group. */
+  int renderpass_type;
+  int renderpass_current_sample;
+  GPUTexture *renderpass_input;
 
   /** For rendering shadows. */
   struct DRWView *cube_views[6];
diff --git a/source/blender/draw/engines/eevee/eevee_renderpasses.c b/source/blender/draw/engines/eevee/eevee_renderpasses.c
index e3cdf98925c..44a6c41e170 100644
--- a/source/blender/draw/engines/eevee/eevee_renderpasses.c
+++ b/source/blender/draw/engines/eevee/eevee_renderpasses.c
@@ -88,6 +88,7 @@ void EEVEE_renderpasses_output_init(EEVEE_ViewLayerData *sldata,
   EEVEE_PassList *psl = vedata->psl;
   EEVEE_StorageList *stl = vedata->stl;
   EEVEE_PrivateData *g_data = stl->g_data;
+  DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
   const bool needs_post_processing = (g_data->render_passes &
                                       EEVEE_RENDERPASSES_WITH_POST_PROCESSING) > 0;
@@ -124,6 +125,15 @@ void EEVEE_renderpasses_output_init(EEVEE_ViewLayerData *sldata,
 
     /* Create Pass. */
     DRW_PASS_CREATE(psl->renderpass_pass, DRW_STATE_WRITE_COLOR);
+    DRWShadingGroup *grp = DRW_shgroup_create(e_data.postprocess_sh, psl->renderpass_pass);
+    /* We set a default texture as not all post processes uses the inputBuffer. */
+    g_data->renderpass_input = txl->color;
+    DRW_shgroup_uniform_texture_ref(grp, "inputBuffer", &g_data->renderpass_input);
+    DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+    DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
+    DRW_shgroup_uniform_int(grp, "currentSample", &g_data->renderpass_current_sample, 1);
+    DRW_shgroup_uniform_int(grp, "renderpassType", &g_data->renderpass_type, 1);
+    DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
   }
   else {
     /* Free unneeded memory */
@@ -142,73 +152,47 @@ void EEVEE_renderpasses_output_init(EEVEE_ViewLayerData *sldata,
  * Only invoke this function for passes that need post-processing.
  *
  * After invoking this function the active framebuffer is set to `vedata->fbl->renderpass_fb`. */
-void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *sldata,
+void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *UNUSED(sldata),
                                     EEVEE_Data *vedata,
                                     eScenePassType renderpass_type)
 {
   EEVEE_PassList *psl = vedata->psl;
   EEVEE_TextureList *txl = vedata->txl;
   EEVEE_StorageList *stl = vedata->stl;
-  EEVEE_FramebufferList *fbl = vedata->fbl;
+  EEVEE_PrivateData *g_data = stl->g_data;
   EEVEE_EffectsInfo *effects = stl->effects;
-  DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
   const int current_sample = effects->taa_current_sample;
-
-  DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.postprocess_sh, psl->renderpass_pass);
-  DRW_shgroup_uniform_int_copy(shgrp, "renderpassType", renderpass_type);
+  g_data->renderpass_current_sample = current_sample;
+  g_data->renderpass_type = renderpass_type;
 
   switch (renderpass_type) {
-    case SCE_PASS_Z: {
-      DRW_shgroup_uniform_block(shgrp, "common_block", sldata->common_ubo);
-      DRW_shgroup_uniform_texture_ref(shgrp, "depthBuffer", &dtxl->depth);
-      break;
-    }
-
     case SCE_PASS_AO: {
-      DRW_shgroup_uniform_block(shgrp, "common_block", sldata->common_ubo);
-      DRW_shgroup_uniform_texture_ref(shgrp, "inputBuffer", &txl->ao_accum);
-      DRW_shgroup_uniform_int_copy(shgrp, "currentSample", current_sample);
+      g_data->renderpass_input = txl->ao_accum;
       break;
     }
-
     case SCE_PASS_NORMAL: {
-      DRW_shgroup_uniform_block(shgrp, "common_block", sldata->common_ubo);
-      DRW_shgroup_uniform_texture_ref(shgrp, "inputBuffer", &effects->ssr_normal_input);
-      DRW_shgroup_uniform_texture_ref(shgrp, "depthBuffer", &dtxl->depth);
+      g_data->renderpass_input = effects->ssr_normal_input;
       break;
     }
-
     case SCE_PASS_MIST: {
-      DRW_shgroup_uniform_block(shgrp, "common_block", sldata->common_ubo);
-      DRW_shgroup_uniform_texture_ref(shgrp, "inputBuffer", &txl->mist_accum);
-      DRW_shgroup_uniform_int_copy(shgrp, "currentSample", current_sample);
+      g_data->renderpass_input = txl->mist_accum;
       break;
     }
-
     case SCE_PASS_SUBSURFACE_DIRECT: {
-      DRW_shgroup_uniform_texture_ref(shgrp, "inputBuffer", &txl->sss_dir_accum);
-      DRW_shgroup_uniform_int_copy(shgrp, "currentSample", current_sample);
+      g_data->renderpass_input = txl->sss_dir_accum;
       break;
     }
-
     case SCE_PASS_SUBSURFACE_COLOR: {
-      DRW_shgroup_uniform_texture_ref(shgrp, "inputBuffer", &txl->sss_col_accum);
-      DRW_shgroup_uniform_int_copy(shgrp, "currentSample", current_sample);
+      g_data->renderpass_input = txl->sss_col_accum;
       break;
     }
-
     default: {
       break;
     }
   }
-
-  DRW_shgroup_call(shgrp, DRW_cache_fullscreen_quad_get(), NULL);
-
-  /* only draw the shading group that has been added. This function can be called multiple times
-   * and the pass still hold the previous shading groups.*/
-  GPU_framebuffer_bind(fbl->renderpass_fb);
-  DRW_draw_pass_subset(psl->renderpass_pass, shgrp, shgrp);
+  GPU_framebuffer_bind(vedata->fbl->renderpass_fb);
+  DRW_draw_pass(psl->renderpass_pass);
 }
 
 void EEVEE_renderpasses_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)



More information about the Bf-blender-cvs mailing list