[Bf-blender-cvs] [105452c1f57] tmp-eevee-aov: EEVEE AOV: Add support for 64 AOVs

Jeroen Bakker noreply at git.blender.org
Thu Sep 24 15:00:54 CEST 2020


Commit: 105452c1f5791fce1f1759eef54c28216ab8bb77
Author: Jeroen Bakker
Date:   Thu Sep 24 14:59:58 2020 +0200
Branches: tmp-eevee-aov
https://developer.blender.org/rB105452c1f5791fce1f1759eef54c28216ab8bb77

EEVEE AOV: Add support for 64 AOVs

Also adds fixes ShaderToColor node.

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

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

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

diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 12469c738e4..f579fd6c813 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -272,12 +272,6 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata,
       data = (EEVEE_RenderPassData){true, true, true, true, true, false, true, false, 0};
       sldata->renderpass_ubo.environment = GPU_uniformbuf_create_ex(
           sizeof(data), &data, "renderpass_ubo.environment");
-
-      for (int aov_index = 0; aov_index < MAX_AOVS; aov_index++) {
-        data = (EEVEE_RenderPassData){false, false, false, false, false, false, false, true, 0};
-        sldata->renderpass_ubo.aovs[aov_index] = GPU_uniformbuf_create_ex(
-            sizeof(data), &data, "renderpass_ubo.aovs");
-      }
     }
 
     /* Used combined pass by default. */
@@ -286,7 +280,7 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata,
     {
       g_data->num_aovs_used = 0;
       if ((stl->g_data->render_passes & EEVEE_RENDER_PASS_AOV) != 0) {
-        EEVEE_RenderPassData data = {false, false, false, false, false, false, false, true, 0};
+        EEVEE_RenderPassData data = {true, true, true, true, true, false, false, true, 0};
         if (stl->g_data->aov_name_hash == EEVEE_AOV_HASH_ALL) {
           ViewLayer *view_layer = draw_ctx->view_layer;
           int aov_index = 0;
@@ -296,17 +290,34 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata,
             }
             int aov_name_hash = BLI_hash_string(aov->name);
             data.renderPassAOVActive = aov_name_hash;
-            GPU_uniformbuf_update(sldata->renderpass_ubo.aovs[aov_index], &data);
+            if (sldata->renderpass_ubo.aovs[aov_index]) {
+              GPU_uniformbuf_update(sldata->renderpass_ubo.aovs[aov_index], &data);
+            }
+            else {
+              sldata->renderpass_ubo.aovs[aov_index] = GPU_uniformbuf_create_ex(
+                  sizeof(data), &data, "renderpass_ubo.aovs");
+            }
             aov_index++;
           }
           g_data->num_aovs_used = aov_index;
         }
         else {
+          /* Rendering a single AOV in the 3d viewport */
           data.renderPassAOVActive = stl->g_data->aov_name_hash;
-          GPU_uniformbuf_update(sldata->renderpass_ubo.aovs[0], &data);
+          if (sldata->renderpass_ubo.aovs[0]) {
+            GPU_uniformbuf_update(sldata->renderpass_ubo.aovs[0], &data);
+          }
+          else {
+            sldata->renderpass_ubo.aovs[0] = GPU_uniformbuf_create_ex(
+                sizeof(data), &data, "renderpass_ubo.aovs");
+          }
           g_data->num_aovs_used = 1;
         }
       }
+      /* Free AOV UBO's that are not in use. */
+      for (int aov_index = g_data->num_aovs_used; aov_index < MAX_AOVS; aov_index++) {
+        DRW_UBO_FREE_SAFE(sldata->renderpass_ubo.aovs[aov_index]);
+      }
     }
 
     /* HACK: EEVEE_material_get can create a new context. This can only be
@@ -1061,6 +1072,10 @@ void EEVEE_material_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
                                        sldata->renderpass_ubo.aovs[aov_index]);
       }
     }
+    /* Free unused aov textures. */
+    for (int aov_index = pd->num_aovs_used; aov_index < MAX_AOVS; aov_index++) {
+      DRW_TEXTURE_FREE_SAFE(txl->aov_surface_accum[aov_index]);
+    }
 
     /* Restore default. */
     pd->renderpass_ubo = sldata->renderpass_ubo.combined;
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index dd76f8040b0..7f59152e464 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -53,6 +53,7 @@ extern struct DrawEngineType draw_engine_eevee_type;
 #define MAX_SHADOW_CASCADE 8
 #define MAX_SHADOW_CUBE (MAX_SHADOW - MAX_CASCADE_NUM * MAX_SHADOW_CASCADE)
 #define MAX_BLOOM_STEP 16
+#define MAX_AOVS 64
 
 // #define DEBUG_SHADOW_DISTRIBUTION
 
@@ -165,7 +166,6 @@ BLI_INLINE bool eevee_hdri_preview_overlay_enabled(const View3D *v3d)
    EEVEE_RENDER_PASS_SPECULAR_COLOR | EEVEE_RENDER_PASS_SPECULAR_LIGHT | \
    EEVEE_RENDER_PASS_ENVIRONMENT | EEVEE_RENDER_PASS_AOV)
 #define EEVEE_AOV_HASH_ALL -1
-#define MAX_AOVS 8
 
 /* Material shader variations */
 enum {



More information about the Bf-blender-cvs mailing list