[Bf-blender-cvs] [2d28df783a0] master: GPU: Move Material index to nodetree evaluation

Clément Foucault noreply at git.blender.org
Tue May 14 11:01:13 CEST 2019


Commit: 2d28df783a029ee5b64da005b2fa400e4e8de976
Author: Clément Foucault
Date:   Sat May 11 14:37:27 2019 +0200
Branches: master
https://developer.blender.org/rB2d28df783a029ee5b64da005b2fa400e4e8de976

GPU: Move Material index to nodetree evaluation

This removes the need to pass the Material* all over the place in the draw
manager. Cleanup comming right after.

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

M	source/blender/draw/intern/draw_manager_shader.c
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_material.c
M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/nodes/shader/nodes/node_shader_object_info.c

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

diff --git a/source/blender/draw/intern/draw_manager_shader.c b/source/blender/draw/intern/draw_manager_shader.c
index b60a41ab0c9..186bbae5cad 100644
--- a/source/blender/draw/intern/draw_manager_shader.c
+++ b/source/blender/draw/intern/draw_manager_shader.c
@@ -394,6 +394,7 @@ GPUMaterial *DRW_shader_create_from_world(struct Scene *scene,
   if (mat == NULL) {
     scene = (Scene *)DEG_get_original_id(&DST.draw_ctx.scene->id);
     mat = GPU_material_from_nodetree(scene,
+                                     NULL,
                                      wo->nodetree,
                                      &wo->gpumaterial,
                                      engine_type,
@@ -430,6 +431,7 @@ GPUMaterial *DRW_shader_create_from_material(struct Scene *scene,
   if (mat == NULL) {
     scene = (Scene *)DEG_get_original_id(&DST.draw_ctx.scene->id);
     mat = GPU_material_from_nodetree(scene,
+                                     ma,
                                      ma->nodetree,
                                      &ma->gpumaterial,
                                      engine_type,
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 86c9764a68f..dd5292d9c58 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -177,6 +177,7 @@ GPUMaterial *GPU_material_from_nodetree_find(struct ListBase *gpumaterials,
                                              const void *engine_type,
                                              int options);
 GPUMaterial *GPU_material_from_nodetree(struct Scene *scene,
+                                        struct Material *ma,
                                         struct bNodeTree *ntree,
                                         struct ListBase *gpumaterials,
                                         const void *engine_type,
@@ -194,6 +195,7 @@ void GPU_materials_free(struct Main *bmain);
 struct Scene *GPU_material_scene(GPUMaterial *material);
 struct GPUPass *GPU_material_get_pass(GPUMaterial *material);
 struct ListBase *GPU_material_get_inputs(GPUMaterial *material);
+struct Material *GPU_material_get_material(GPUMaterial *material);
 eGPUMaterialStatus GPU_material_status(GPUMaterial *mat);
 
 struct GPUUniformBuffer *GPU_material_uniform_buffer_get(GPUMaterial *material);
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 6aa13b0d8ca..de9ed56abf5 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -231,6 +231,12 @@ ListBase *GPU_material_get_inputs(GPUMaterial *material)
   return &material->inputs;
 }
 
+/* Return can be NULL if it's a world material. */
+Material *GPU_material_get_material(GPUMaterial *material)
+{
+  return material->ma;
+}
+
 GPUUniformBuffer *GPU_material_uniform_buffer_get(GPUMaterial *material)
 {
   return material->ubo;
@@ -637,6 +643,7 @@ GPUMaterial *GPU_material_from_nodetree_find(ListBase *gpumaterials,
  * so only do this when they are needed.
  */
 GPUMaterial *GPU_material_from_nodetree(Scene *scene,
+                                        struct Material *ma,
                                         struct bNodeTree *ntree,
                                         ListBase *gpumaterials,
                                         const void *engine_type,
@@ -655,6 +662,7 @@ GPUMaterial *GPU_material_from_nodetree(Scene *scene,
 
   /* allocate material */
   GPUMaterial *mat = MEM_callocN(sizeof(GPUMaterial), "GPUMaterial");
+  mat->ma = ma;
   mat->scene = scene;
   mat->engine_type = engine_type;
   mat->options = options;
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 03999b2277c..023870125c9 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -3234,6 +3234,7 @@ void node_light_falloff(
 
 void node_object_info(mat4 obmat,
                       vec4 info,
+                      float mat_index,
                       out vec3 location,
                       out float object_index,
                       out float material_index,
@@ -3241,7 +3242,7 @@ void node_object_info(mat4 obmat,
 {
   location = obmat[3].xyz;
   object_index = info.x;
-  material_index = info.y;
+  material_index = mat_index;
   random = info.z;
 }
 
diff --git a/source/blender/nodes/shader/nodes/node_shader_object_info.c b/source/blender/nodes/shader/nodes/node_shader_object_info.c
index 5520f6f325f..118b8136693 100644
--- a/source/blender/nodes/shader/nodes/node_shader_object_info.c
+++ b/source/blender/nodes/shader/nodes/node_shader_object_info.c
@@ -35,13 +35,17 @@ static int node_shader_gpu_object_info(GPUMaterial *mat,
                                        GPUNodeStack *in,
                                        GPUNodeStack *out)
 {
+  Material *ma = GPU_material_get_material(mat);
+  /* Convert to float. */
+  float index = ma ? ma->index : 0;
   return GPU_stack_link(mat,
                         node,
                         "node_object_info",
                         in,
                         out,
                         GPU_builtin(GPU_OBJECT_MATRIX),
-                        GPU_builtin(GPU_OBJECT_INFO));
+                        GPU_builtin(GPU_OBJECT_INFO),
+                        GPU_constant(&index));
 }
 
 static void node_shader_exec_object_info(void *UNUSED(data),



More information about the Bf-blender-cvs mailing list