[Bf-blender-cvs] [57a396cf4a6] tmp-eevee-aov: GPU: Added support for AOV Output node.

Jeroen Bakker noreply at git.blender.org
Wed Sep 23 17:21:55 CEST 2020


Commit: 57a396cf4a6216afb82a61f26415a6f22fd18e79
Author: Jeroen Bakker
Date:   Wed Sep 23 14:25:14 2020 +0200
Branches: tmp-eevee-aov
https://developer.blender.org/rB57a396cf4a6216afb82a61f26415a6f22fd18e79

GPU: Added support for AOV Output node.

Not connected to anything in EEVEE.

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

M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/renderpass_lib.glsl
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_codegen.c
M	source/blender/gpu/intern/gpu_material.c
M	source/blender/gpu/intern/gpu_material_library.c
M	source/blender/gpu/intern/gpu_node_graph.c
M	source/blender/gpu/intern/gpu_node_graph.h
A	source/blender/gpu/shaders/material/gpu_shader_material_output_aov.glsl

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

diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 10f3314c573..6aca5944053 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -430,7 +430,9 @@ typedef struct EEVEE_RenderPassData {
   int renderPassEmit;
   int renderPassSSSColor;
   int renderPassEnvironment;
-  int _pad[1];
+  int renderPassAOV;
+  int renderPassAOVActive;
+  int _pad[3];
 } EEVEE_RenderPassData;
 
 /* ************ LIGHT UBO ************* */
@@ -958,6 +960,8 @@ typedef struct EEVEE_PrivateData {
   /* Renderpasses */
   /* Bitmask containing the active render_passes */
   eViewLayerEEVEEPassType render_passes;
+  int aov_hash;
+
   /* Uniform references that are referenced inside the `renderpass_pass`. They are updated
    * to reuse the drawing pass and the shading group. */
   int renderpass_type;
diff --git a/source/blender/draw/engines/eevee/shaders/renderpass_lib.glsl b/source/blender/draw/engines/eevee/shaders/renderpass_lib.glsl
index 36cf3cecf40..8f1ad80d26a 100644
--- a/source/blender/draw/engines/eevee/shaders/renderpass_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/renderpass_lib.glsl
@@ -12,6 +12,8 @@ layout(std140) uniform renderpass_block
   bool renderPassEmit;
   bool renderPassSSSColor;
   bool renderPassEnvironment;
+  bool renderPassAOV;
+  int renderPassAOVActive;
 };
 
 /** \} */
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 2dd61a3548b..60c44a4e5bd 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -312,6 +312,7 @@ data_to_c_simple(shaders/material/gpu_shader_material_noise.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_normal.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_normal_map.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_object_info.glsl SRC)
+data_to_c_simple(shaders/material/gpu_shader_material_output_aov.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_output_material.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_output_world.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_particle_info.glsl SRC)
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 2f12625acac..1e8349665a6 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -171,6 +171,7 @@ GPUNodeLink *GPU_uniformbuf_link_out(struct GPUMaterial *mat,
                                      const int index);
 
 void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link);
+void GPU_material_add_output_link_aov(GPUMaterial *material, GPUNodeLink *link, int hash);
 
 void GPU_material_sss_profile_create(GPUMaterial *material,
                                      float radii[3],
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 2d76e793fc0..d530326dcd9 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -398,7 +398,7 @@ static void codegen_declare_tmps(DynStr *ds, GPUNodeGraph *graph)
   BLI_dynstr_append(ds, "\n");
 }
 
-static void codegen_call_functions(DynStr *ds, GPUNodeGraph *graph, GPUOutput *finaloutput)
+static void codegen_call_functions(DynStr *ds, GPUNodeGraph *graph)
 {
   LISTBASE_FOREACH (GPUNode *, node, &graph->nodes) {
     BLI_dynstr_appendf(ds, "  %s(", node->name);
@@ -493,8 +493,11 @@ static void codegen_call_functions(DynStr *ds, GPUNodeGraph *graph, GPUOutput *f
 
     BLI_dynstr_append(ds, ");\n");
   }
+}
 
-  BLI_dynstr_appendf(ds, "\n  return tmp%d;\n", finaloutput->id);
+static void codegen_final_output(DynStr *ds, GPUOutput *finaloutput)
+{
+  BLI_dynstr_appendf(ds, "return tmp%d;\n", finaloutput->id);
 }
 
 static char *code_generate_fragment(GPUMaterial *material,
@@ -577,7 +580,24 @@ static char *code_generate_fragment(GPUMaterial *material,
   }
 
   codegen_declare_tmps(ds, graph);
-  codegen_call_functions(ds, graph, graph->outlink->output);
+  codegen_call_functions(ds, graph);
+
+  BLI_dynstr_append(ds, "\tif (renderPassAOV) {\n");
+  bool first_aov = true;
+  LISTBASE_FOREACH (GPUNodeGraphOutputLink *, aovlink, &graph->outlink_aovs) {
+    BLI_dynstr_append(ds, "\t\t");
+    if (!first_aov) {
+      BLI_dynstr_append(ds, "else ");
+    }
+
+    BLI_dynstr_appendf(ds, "if (renderPassAOVActive == %d) {\n\t\t\t", aovlink->hash);
+    codegen_final_output(ds, aovlink->outlink->output);
+    BLI_dynstr_append(ds, "\t\t}\n");
+  }
+  BLI_dynstr_append(ds, "\t\treturn CLOSURE_DEFAULT;\n");
+  BLI_dynstr_append(ds, "\t} else {\n\t\t");
+  codegen_final_output(ds, graph->outlink->output);
+  BLI_dynstr_append(ds, "\t}\n");
 
   BLI_dynstr_append(ds, "}\n");
 
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 011d14673b4..e06eb55ad4d 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -591,6 +591,14 @@ void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link)
   }
 }
 
+void GPU_material_add_output_link_aov(GPUMaterial *material, GPUNodeLink *link, int hash)
+{
+  GPUNodeGraphOutputLink *aov_link = MEM_callocN(sizeof(GPUNodeGraphOutputLink), __func__);
+  aov_link->outlink = link;
+  aov_link->hash = hash;
+  BLI_addtail(&material->graph.outlink_aovs, aov_link);
+}
+
 GPUNodeGraph *gpu_material_node_graph(GPUMaterial *material)
 {
   return &material->graph;
diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c
index e0165e1fa83..496988c4ba9 100644
--- a/source/blender/gpu/intern/gpu_material_library.c
+++ b/source/blender/gpu/intern/gpu_material_library.c
@@ -84,6 +84,7 @@ extern char datatoc_gpu_shader_material_noise_glsl[];
 extern char datatoc_gpu_shader_material_normal_glsl[];
 extern char datatoc_gpu_shader_material_normal_map_glsl[];
 extern char datatoc_gpu_shader_material_object_info_glsl[];
+extern char datatoc_gpu_shader_material_output_aov_glsl[];
 extern char datatoc_gpu_shader_material_output_material_glsl[];
 extern char datatoc_gpu_shader_material_output_world_glsl[];
 extern char datatoc_gpu_shader_material_particle_info_glsl[];
@@ -354,6 +355,11 @@ static GPUMaterialLibrary gpu_shader_material_object_info_library = {
     .dependencies = {NULL},
 };
 
+static GPUMaterialLibrary gpu_shader_material_output_aov_library = {
+    .code = datatoc_gpu_shader_material_output_aov_glsl,
+    .dependencies = {NULL},
+};
+
 static GPUMaterialLibrary gpu_shader_material_output_material_library = {
     .code = datatoc_gpu_shader_material_output_material_glsl,
     .dependencies = {NULL},
@@ -619,6 +625,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = {
     &gpu_shader_material_normal_library,
     &gpu_shader_material_normal_map_library,
     &gpu_shader_material_object_info_library,
+    &gpu_shader_material_output_aov_library,
     &gpu_shader_material_output_material_library,
     &gpu_shader_material_output_world_library,
     &gpu_shader_material_particle_info_library,
diff --git a/source/blender/gpu/intern/gpu_node_graph.c b/source/blender/gpu/intern/gpu_node_graph.c
index c890d56994f..cbcf2b763ff 100644
--- a/source/blender/gpu/intern/gpu_node_graph.c
+++ b/source/blender/gpu/intern/gpu_node_graph.c
@@ -663,6 +663,7 @@ void gpu_node_graph_free_nodes(GPUNodeGraph *graph)
 /* Free both node graph and requested attributes and textures. */
 void gpu_node_graph_free(GPUNodeGraph *graph)
 {
+  BLI_freelistN(&graph->outlink_aovs);
   gpu_node_graph_free_nodes(graph);
 
   LISTBASE_FOREACH (GPUMaterialVolumeGrid *, grid, &graph->volume_grids) {
@@ -704,6 +705,9 @@ void gpu_node_graph_prune_unused(GPUNodeGraph *graph)
   }
 
   gpu_nodes_tag(graph->outlink);
+  LISTBASE_FOREACH (GPUNodeGraphOutputLink *, aovlink, &graph->outlink_aovs) {
+    gpu_nodes_tag(aovlink->outlink);
+  }
 
   for (GPUNode *node = graph->nodes.first, *next = NULL; node; node = next) {
     next = node->next;
diff --git a/source/blender/gpu/intern/gpu_node_graph.h b/source/blender/gpu/intern/gpu_node_graph.h
index 7265abf4d65..26f9d151450 100644
--- a/source/blender/gpu/intern/gpu_node_graph.h
+++ b/source/blender/gpu/intern/gpu_node_graph.h
@@ -135,12 +135,20 @@ typedef struct GPUInput {
   };
 } GPUInput;
 
+typedef struct GPUNodeGraphOutputLink {
+  struct GPUNodeGraphOutputLink *next, *prev;
+  int hash;
+  GPUNodeLink *outlink;
+} GPUNodeGraphOutputLink;
+
 typedef struct GPUNodeGraph {
   /* Nodes */
   ListBase nodes;
 
-  /* Output. */
+  /* Main Output. */
   GPUNodeLink *outlink;
+  /* List of GPUNodeGraphOutputLink */
+  ListBase outlink_aovs;
 
   /* Requested attributes and textures. */
   ListBase attributes;
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_output_aov.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_output_aov.glsl
new file mode 100644
index 00000000000..744c8bf3cc7
--- /dev/null
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_output_aov.glsl
@@ -0,0 +1,15 @@
+void node_output_aov_color(vec4 color, float value, out Closure result)
+{
+  result = CLOSURE_DEFAULT;
+#ifndef VOLUMETRICS
+  result.radiance = color.rgb;
+#endif
+}
+
+void node_output_aov_value(vec4 color, float value, out Closure result)
+{
+  result = CLOSURE_DEFAULT;
+#ifndef VOLUMETRICS
+  result.radiance = vec3(value);
+#endif
+}



More information about the Bf-blender-cvs mailing list