[Bf-blender-cvs] [8af983ba78e] master: EEVEE-Next: Reduce image bindings.

Jeroen Bakker noreply at git.blender.org
Tue Aug 16 15:10:22 CEST 2022


Commit: 8af983ba78ecc28e35bcccbb9095526c1165f41c
Author: Jeroen Bakker
Date:   Tue Aug 16 15:10:09 2022 +0200
Branches: master
https://developer.blender.org/rB8af983ba78ecc28e35bcccbb9095526c1165f41c

EEVEE-Next: Reduce image bindings.

This change combines the diffuse/specular light passes into a single texture
array, freeing up an image binding for cryptomatte.

When diffuse/specular light pass and/or requested a
texture array will be allocated. Only when specular light is requested 2 images will always be allocated. This increases the
memory overhead when viewing the specular light renderpass in the viewport. For final rendering it is a common scenario that none
or both are requested.

Reviewed By: fclem

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

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

M	source/blender/draw/engines/eevee_next/eevee_film.cc
M	source/blender/draw/engines/eevee_next/eevee_pipeline.cc
M	source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc
M	source/blender/draw/engines/eevee_next/eevee_renderbuffers.hh
M	source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
M	source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl
M	source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl
M	source/blender/draw/engines/eevee_next/shaders/eevee_surf_world_frag.glsl
M	source/blender/draw/engines/eevee_next/shaders/infos/eevee_film_info.hh
M	source/blender/draw/engines/eevee_next/shaders/infos/eevee_material_info.hh

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

diff --git a/source/blender/draw/engines/eevee_next/eevee_film.cc b/source/blender/draw/engines/eevee_next/eevee_film.cc
index b3fbe088471..ae41bd204d0 100644
--- a/source/blender/draw/engines/eevee_next/eevee_film.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_film.cc
@@ -389,9 +389,8 @@ void Film::sync()
   DRW_shgroup_uniform_texture_ref(grp, "combined_tx", &combined_final_tx_);
   DRW_shgroup_uniform_texture_ref(grp, "normal_tx", &rbuffers.normal_tx);
   DRW_shgroup_uniform_texture_ref(grp, "vector_tx", &rbuffers.vector_tx);
-  DRW_shgroup_uniform_texture_ref(grp, "diffuse_light_tx", &rbuffers.diffuse_light_tx);
+  DRW_shgroup_uniform_texture_ref(grp, "light_tx", &rbuffers.light_tx);
   DRW_shgroup_uniform_texture_ref(grp, "diffuse_color_tx", &rbuffers.diffuse_color_tx);
-  DRW_shgroup_uniform_texture_ref(grp, "specular_light_tx", &rbuffers.specular_light_tx);
   DRW_shgroup_uniform_texture_ref(grp, "specular_color_tx", &rbuffers.specular_color_tx);
   DRW_shgroup_uniform_texture_ref(grp, "volume_light_tx", &rbuffers.volume_light_tx);
   DRW_shgroup_uniform_texture_ref(grp, "emission_tx", &rbuffers.emission_tx);
diff --git a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc
index 9260d71b887..d9ac39f4fb9 100644
--- a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc
@@ -43,9 +43,8 @@ void WorldPipeline::sync(GPUMaterial *gpumat)
   DRW_shgroup_storage_block_ref(grp, "aov_buf", &inst_.film.aovs_info);
   /* RenderPasses. Cleared by background (even if bad practice). */
   DRW_shgroup_uniform_image_ref(grp, "rp_normal_img", &rbufs.normal_tx);
-  DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_light_img", &rbufs.diffuse_light_tx);
+  DRW_shgroup_uniform_image_ref(grp, "rp_light_img", &rbufs.light_tx);
   DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_color_img", &rbufs.diffuse_color_tx);
-  DRW_shgroup_uniform_image_ref(grp, "rp_specular_light_img", &rbufs.specular_light_tx);
   DRW_shgroup_uniform_image_ref(grp, "rp_specular_color_img", &rbufs.specular_color_tx);
   DRW_shgroup_uniform_image_ref(grp, "rp_emission_img", &rbufs.emission_tx);
   /* To allow opaque pass rendering over it. */
@@ -122,9 +121,8 @@ DRWShadingGroup *ForwardPipeline::material_opaque_add(::Material *blender_mat, G
   DRW_shgroup_storage_block_ref(grp, "aov_buf", &inst_.film.aovs_info);
   /* RenderPasses. */
   DRW_shgroup_uniform_image_ref(grp, "rp_normal_img", &rbufs.normal_tx);
-  DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_light_img", &rbufs.diffuse_light_tx);
+  DRW_shgroup_uniform_image_ref(grp, "rp_light_img", &rbufs.light_tx);
   DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_color_img", &rbufs.diffuse_color_tx);
-  DRW_shgroup_uniform_image_ref(grp, "rp_specular_light_img", &rbufs.specular_light_tx);
   DRW_shgroup_uniform_image_ref(grp, "rp_specular_color_img", &rbufs.specular_color_tx);
   DRW_shgroup_uniform_image_ref(grp, "rp_emission_img", &rbufs.emission_tx);
 
@@ -206,9 +204,8 @@ DRWShadingGroup *ForwardPipeline::material_transparent_add(::Material *blender_m
     DRW_shgroup_storage_block_ref(grp, "aov_buf", &inst_.film.aovs_info);
     /* RenderPasses. */
     DRW_shgroup_uniform_image_ref(grp, "rp_normal_img", &rbufs.normal_tx);
-    DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_light_img", &rbufs.diffuse_light_tx);
+    DRW_shgroup_uniform_image_ref(grp, "rp_light_img", &rbufs.light_tx);
     DRW_shgroup_uniform_image_ref(grp, "rp_diffuse_color_img", &rbufs.diffuse_color_tx);
-    DRW_shgroup_uniform_image_ref(grp, "rp_specular_light_img", &rbufs.specular_light_tx);
     DRW_shgroup_uniform_image_ref(grp, "rp_specular_color_img", &rbufs.specular_color_tx);
     DRW_shgroup_uniform_image_ref(grp, "rp_emission_img", &rbufs.emission_tx);
   }
diff --git a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc
index b69fde7b26c..dd7da0d8f76 100644
--- a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc
@@ -26,9 +26,11 @@ namespace blender::eevee {
 
 void RenderBuffers::acquire(int2 extent)
 {
+  const eViewLayerEEVEEPassType enabled_passes = inst_.film.enabled_passes_get();
+
   auto pass_extent = [&](eViewLayerEEVEEPassType pass_bit) -> int2 {
     /* Use dummy texture for disabled passes. Allows correct bindings. */
-    return (inst_.film.enabled_passes_get() & pass_bit) ? extent : int2(1);
+    return (enabled_passes & pass_bit) ? extent : int2(1);
   };
 
   eGPUTextureFormat color_format = GPU_RGBA16F;
@@ -38,17 +40,22 @@ void RenderBuffers::acquire(int2 extent)
   depth_tx.acquire(extent, GPU_DEPTH24_STENCIL8);
   combined_tx.acquire(extent, color_format);
 
-  bool do_vector_render_pass = (inst_.film.enabled_passes_get() & EEVEE_RENDER_PASS_VECTOR) ||
+  bool do_vector_render_pass = (enabled_passes & EEVEE_RENDER_PASS_VECTOR) ||
                                (inst_.motion_blur.postfx_enabled() && !inst_.is_viewport());
+  uint32_t max_light_color_layer = max_ii(enabled_passes & EEVEE_RENDER_PASS_DIFFUSE_LIGHT ?
+                                              RENDER_PASS_LAYER_DIFFUSE_LIGHT :
+                                              -1,
+                                          enabled_passes & EEVEE_RENDER_PASS_SPECULAR_LIGHT ?
+                                              RENDER_PASS_LAYER_SPECULAR_LIGHT :
+                                              -1) +
+                                   1;
   /* Only RG16F when only doing only reprojection or motion blur. */
   eGPUTextureFormat vector_format = do_vector_render_pass ? GPU_RGBA16F : GPU_RG16F;
   /* TODO(fclem): Make vector pass allocation optional if no TAA or motion blur is needed. */
   vector_tx.acquire(extent, vector_format);
 
   normal_tx.acquire(pass_extent(EEVEE_RENDER_PASS_NORMAL), color_format);
-  diffuse_light_tx.acquire(pass_extent(EEVEE_RENDER_PASS_DIFFUSE_LIGHT), color_format);
   diffuse_color_tx.acquire(pass_extent(EEVEE_RENDER_PASS_DIFFUSE_COLOR), color_format);
-  specular_light_tx.acquire(pass_extent(EEVEE_RENDER_PASS_SPECULAR_LIGHT), color_format);
   specular_color_tx.acquire(pass_extent(EEVEE_RENDER_PASS_SPECULAR_COLOR), color_format);
   volume_light_tx.acquire(pass_extent(EEVEE_RENDER_PASS_VOLUME_LIGHT), color_format);
   emission_tx.acquire(pass_extent(EEVEE_RENDER_PASS_EMIT), color_format);
@@ -56,6 +63,10 @@ void RenderBuffers::acquire(int2 extent)
   shadow_tx.acquire(pass_extent(EEVEE_RENDER_PASS_SHADOW), float_format);
   ambient_occlusion_tx.acquire(pass_extent(EEVEE_RENDER_PASS_AO), float_format);
 
+  light_tx.ensure_2d_array(color_format,
+                           max_light_color_layer > 0 ? extent : int2(1),
+                           max_ii(1, max_light_color_layer));
+
   const AOVsInfoData &aovs = inst_.film.aovs_info;
   aov_color_tx.ensure_2d_array(
       color_format, (aovs.color_len > 0) ? extent : int2(1), max_ii(1, aovs.color_len));
@@ -70,9 +81,7 @@ void RenderBuffers::release()
 
   normal_tx.release();
   vector_tx.release();
-  diffuse_light_tx.release();
   diffuse_color_tx.release();
-  specular_light_tx.release();
   specular_color_tx.release();
   volume_light_tx.release();
   emission_tx.release();
diff --git a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.hh b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.hh
index 787f5604aa4..0b761d618cc 100644
--- a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.hh
@@ -28,9 +28,7 @@ class RenderBuffers {
   // TextureFromPool mist_tx; /* Derived from depth_tx during accumulation. */
   TextureFromPool normal_tx;
   TextureFromPool vector_tx;
-  TextureFromPool diffuse_light_tx;
   TextureFromPool diffuse_color_tx;
-  TextureFromPool specular_light_tx;
   TextureFromPool specular_color_tx;
   TextureFromPool volume_light_tx;
   TextureFromPool emission_tx;
@@ -39,6 +37,7 @@ class RenderBuffers {
   TextureFromPool ambient_occlusion_tx;
   // TextureFromPool cryptomatte_tx; /* TODO */
   /* TODO(fclem): Use texture from pool once they support texture array. */
+  Texture light_tx;
   Texture aov_color_tx;
   Texture aov_value_tx;
 
diff --git a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
index 3facb904a57..a0829bc49aa 100644
--- a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
@@ -291,6 +291,17 @@ static inline float film_filter_weight(float filter_radius, float sample_distanc
 
 /** \} */
 
+/* -------------------------------------------------------------------- */
+/** \name Render passes
+ * \{ */
+
+enum eRenderPassLayerIndex : uint32_t {
+  RENDER_PASS_LAYER_DIFFUSE_LIGHT = 0u,
+  RENDER_PASS_LAYER_SPECULAR_LIGHT = 1u,
+};
+
+/** \} */
+
 /* -------------------------------------------------------------------- */
 /** \name Arbitrary Output Variables
  * \{ */
diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl
index bf6293d5561..964c078036b 100644
--- a/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl
+++ b/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl
@@ -105,12 +105,18 @@ void film_sample_accum(FilmSample samp, int pass_id, sampler2D tex, inout float
   accum += texelFetch(tex, samp.texel, 0).x * samp.weight;
 }
 
-void film_sample_accum(FilmSample samp, int pass_id, sampler2DArray tex, inout vec4 accum)
+void film_sample_accum(
+    FilmSample samp, int pass_id, uint layer, sampler2DArray tex, inout vec4 accum)
 {
   if (pass_id == -1) {
     return;
   }
-  accum += texelFetch(tex, ivec3(samp.texel, pass_id), 0) * samp.weight;
+  accum += texelFetch(tex, ivec3(samp.texel, layer), 0) * samp.weight;
+}
+
+void film_sample_accum(FilmSample samp, int pass_id, sampler2DArray tex, inout vec4 accum)
+{
+  film_sample_accum(samp, pass_id, pass_id, tex, accum);
 }
 
 void film_sample_accum(FilmSam

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list