[Bf-blender-cvs] [0e6d17edfeb] tmp-drw-callbatching: Workbench: Remove object_id and optimize material hash generation

Clément Foucault noreply at git.blender.org
Sat Aug 17 14:50:26 CEST 2019


Commit: 0e6d17edfeb9ede447b5bbe9e84fbb4c48175ac9
Author: Clément Foucault
Date:   Tue Jun 18 01:19:11 2019 +0200
Branches: tmp-drw-callbatching
https://developer.blender.org/rB0e6d17edfeb9ede447b5bbe9e84fbb4c48175ac9

Workbench: Remove object_id and optimize material hash generation

This greatly reduce shgroup count when rendering with outlines.
In my testcase (30K suzanes with random instancing, 5 materials) it went
from 27 to 39 fps (playback performance, no update).

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

M	source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
index c78b2182d04..34777ed31b0 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -8,8 +8,7 @@ uniform float alpha = 0.5;
 uniform vec2 invertedViewportSize;
 uniform vec4 viewvecs[3];
 
-uniform vec3 materialDiffuseColor;
-uniform vec3 materialSpecularColor;
+uniform vec4 materialColorAndMetal;
 uniform float materialRoughness;
 
 uniform float shadowMultiplier = 0.5;
@@ -41,17 +40,17 @@ layout(location = 1) out
 
 void main()
 {
-  vec4 diffuse_color;
+  vec4 base_color;
 
 #if defined(V3D_SHADING_TEXTURE_COLOR)
-  diffuse_color = workbench_sample_texture(image, uv_interp, imageNearest, imagePremultiplied);
-  if (diffuse_color.a < ImageTransparencyCutoff) {
+  base_color = workbench_sample_texture(image, uv_interp, imageNearest, imagePremultiplied);
+  if (base_color.a < ImageTransparencyCutoff) {
     discard;
   }
 #elif defined(V3D_SHADING_VERTEX_COLOR)
-  diffuse_color = vec4(vertexColor, 1.0);
+  base_color.rgb = vertexColor;
 #else
-  diffuse_color = vec4(materialDiffuseColor, 1.0);
+  base_color.rgb = materialColorAndMetal.rgb;
 #endif /* V3D_SHADING_TEXTURE_COLOR */
 
   vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
@@ -72,8 +71,17 @@ void main()
   vec3 shaded_color = matcap * diffuse_color.rgb;
 
 #elif defined(V3D_LIGHTING_STUDIO)
+#  ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
+  float metallic = materialColorAndMetal.a;
+  vec3 specular_color = mix(vec3(0.05), base_color.rgb, metallic);
+  vec3 diffuse_color = mix(base_color.rgb, vec3(0.0), metallic);
+#  else
+  vec3 specular_color = vec3(0.0);
+  vec3 diffuse_color = base_color.rgb;
+#  endif
+
   vec3 shaded_color = get_world_lighting(
-      world_data, diffuse_color.rgb, materialSpecularColor, materialRoughness, nor, I_vs);
+      world_data, diffuse_color, specular_color, materialRoughness, nor, I_vs);
 #endif
 
 #ifdef V3D_SHADING_SHADOW
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index ca45806d294..b5f95f2dcf8 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -1,6 +1,5 @@
 
-uniform vec3 materialDiffuseColor;
-uniform float materialMetallic;
+uniform vec4 materialColorAndMetal;
 uniform float materialRoughness;
 
 uniform sampler2D image;
@@ -47,7 +46,7 @@ void main()
 #  elif defined(V3D_SHADING_VERTEX_COLOR)
   color.rgb = vertexColor;
 #  else
-  color.rgb = materialDiffuseColor;
+  color.rgb = materialColorAndMetal.rgb;
 #  endif
 
 #  ifdef V3D_LIGHTING_MATCAP
@@ -55,7 +54,7 @@ void main()
   metallic = float(gl_FrontFacing);
   roughness = 0.0;
 #  else
-  metallic = materialMetallic;
+  metallic = materialColorAndMetal.a;
   roughness = materialRoughness;
 #  endif
 
@@ -63,7 +62,7 @@ void main()
   /* Add some variation to the hairs to avoid uniform look. */
   float hair_variation = hair_rand * 0.1;
   color = clamp(color - hair_variation, 0.0, 1.0);
-  metallic = clamp(materialMetallic - hair_variation, 0.0, 1.0);
+  metallic = clamp(materialColorAndMetal.a - hair_variation, 0.0, 1.0);
   roughness = clamp(materialRoughness - hair_variation, 0.0, 1.0);
 #  endif
 
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 7fab41a1480..cdbc94d2995 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -83,7 +83,6 @@ static struct {
   struct GPUTexture *composite_buffer_tx; /* ref only, not alloced */
 
   SceneDisplay display; /* world light direction for shadows */
-  int next_object_id;
 
   struct GPUUniformBuffer *sampling_ubo;
   struct GPUTexture *jitter_tx;
@@ -331,7 +330,6 @@ static struct GPUTexture *create_jitter_texture(int num_samples)
 static void workbench_init_object_data(DrawData *dd)
 {
   WORKBENCH_ObjectData *data = (WORKBENCH_ObjectData *)dd;
-  data->object_id = ((e_data.next_object_id++) & 0xff) + 1;
   data->shadow_bbox_dirty = true;
 }
 
@@ -380,11 +378,10 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
     workbench_effect_info_init(stl->effects);
   }
 
-  if (!e_data.next_object_id) {
+  if (!e_data.shadow_pass_sh) {
     WORKBENCH_DEFERRED_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg];
     memset(sh_data->prepass_sh_cache, 0, sizeof(sh_data->prepass_sh_cache));
     memset(e_data.composite_sh_cache, 0, sizeof(e_data.composite_sh_cache));
-    e_data.next_object_id = 1;
 #ifdef DEBUG_SHADOW_VOLUME
     const char *shadow_frag = datatoc_workbench_shadow_debug_frag_glsl;
 #else
@@ -863,18 +860,11 @@ static WORKBENCH_MaterialData *get_or_create_material_data(WORKBENCH_Data *vedat
   WORKBENCH_PassList *psl = vedata->psl;
   WORKBENCH_PrivateData *wpd = stl->g_data;
   WORKBENCH_MaterialData *material;
-  WORKBENCH_ObjectData *engine_object_data = (WORKBENCH_ObjectData *)DRW_drawdata_ensure(
-      &ob->id,
-      &draw_engine_workbench_solid,
-      sizeof(WORKBENCH_ObjectData),
-      &workbench_init_object_data,
-      NULL);
   WORKBENCH_MaterialData material_template;
   const bool is_ghost = (ob->dtx & OB_DRAWXRAY);
 
   /* Solid */
   workbench_material_update_data(wpd, ob, mat, &material_template, color_type);
-  material_template.object_id = OBJECT_ID_PASS_ENABLED(wpd) ? engine_object_data->object_id : 1;
   material_template.color_type = color_type;
   material_template.ima = ima;
   material_template.iuser = iuser;
@@ -894,8 +884,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(WORKBENCH_Data *vedat
         shader, (ob->dtx & OB_DRAWXRAY) ? psl->ghost_prepass_pass : psl->prepass_pass);
     workbench_material_copy(material, &material_template);
     DRW_shgroup_stencil_mask(material->shgrp, (ob->dtx & OB_DRAWXRAY) ? 0x00 : 0xFF);
-    DRW_shgroup_uniform_int(material->shgrp, "object_id", &material->object_id, 1);
-    workbench_material_shgroup_uniform(wpd, material->shgrp, material, ob, true, true, interp);
+    workbench_material_shgroup_uniform(wpd, material->shgrp, material, ob, true, interp);
     BLI_ghash_insert(wpd->material_hash, POINTER_FROM_UINT(hash), material);
   }
   return material;
@@ -938,8 +927,7 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o
           (ob->dtx & OB_DRAWXRAY) ? psl->ghost_prepass_hair_pass : psl->prepass_hair_pass,
           shader);
       DRW_shgroup_stencil_mask(shgrp, (ob->dtx & OB_DRAWXRAY) ? 0x00 : 0xFF);
-      DRW_shgroup_uniform_int(shgrp, "object_id", &material->object_id, 1);
-      workbench_material_shgroup_uniform(wpd, shgrp, material, ob, true, true, interp);
+      workbench_material_shgroup_uniform(wpd, shgrp, material, ob, true, interp);
     }
   }
 }
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index abc1feac75e..31ff383c597 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -63,8 +63,6 @@ static struct {
   struct GPUTexture *transparent_accum_tx;     /* ref only, not alloced */
   struct GPUTexture *transparent_revealage_tx; /* ref only, not alloced */
   struct GPUTexture *composite_buffer_tx;      /* ref only, not alloced */
-
-  int next_object_id;
 } e_data = {{{{NULL}}}};
 
 /* Shaders */
@@ -141,12 +139,6 @@ static char *workbench_build_forward_composite_frag(void)
   return str;
 }
 
-static void workbench_init_object_data(DrawData *dd)
-{
-  WORKBENCH_ObjectData *data = (WORKBENCH_ObjectData *)dd;
-  data->object_id = ((e_data.next_object_id++) & 0xff) + 1;
-}
-
 WORKBENCH_MaterialData *workbench_forward_get_or_create_material_data(WORKBENCH_Data *vedata,
                                                                       Object *ob,
                                                                       Material *mat,
@@ -161,18 +153,11 @@ WORKBENCH_MaterialData *workbench_forward_get_or_create_material_data(WORKBENCH_
   WORKBENCH_PassList *psl = vedata->psl;
   WORKBENCH_PrivateData *wpd = stl->g_data;
   WORKBENCH_MaterialData *material;
-  WORKBENCH_ObjectData *engine_object_data = (WORKBENCH_ObjectData *)DRW_drawdata_ensure(
-      &ob->id,
-      &draw_engine_workbench_solid,
-      sizeof(WORKBENCH_ObjectData),
-      &workbench_init_object_data,
-      NULL);
   WORKBENCH_MaterialData material_template;
   DRWShadingGroup *grp;
 
   /* Solid */
   workbench_material_update_data(wpd, ob, mat, &material_template, color_type);
-  material_template.object_id = OBJECT_ID_PASS_ENABLED(wpd) ? engine_object_data->object_id : 1;
   material_template.color_type = color_type;
   material_template.ima = ima;
   material_template.iuser = iuser;
@@ -211,7 +196,7 @@ WORKBENCH_MaterialData *workbench_forward_get_or_create_material_data(WORKBENCH_
       DRW_shgroup_uniform_float_copy(grp, "shadowFocus", wpd->shadow_focus);
     }
 
-    workbench_material_shgroup_uniform(wpd, grp, material, ob, false, false, interp);
+    workbench_material_shgroup_uniform(wpd, grp, material, ob, false, interp);
     material->shgrp = grp;
 
     /* Depth */
@@ -225,8 +210,6 @@ WORKBENCH_MaterialData *workbench_forward_get_or_create_material_data(WORKBENCH_
       material->shgrp_object_outline = DRW_shgroup_create(sh_data->object_outline_sh,
                                                           psl->object_outline_pass);
     }
-    material->object_id = engine_object_data->object_id;
-    DRW_shgroup_uniform_int(material->shgrp_object_outline, "object_id", &material->object_id, 1);
     if (draw_ctx->sh_cfg == GPU_SHADER_CFG_CLIPPED) {
       DRW_shgroup_state_enable(material->shgrp_object_outline, DRW_STATE_CLIP_PLANES);
     }
@@ -537,7 +520,7 @@ static void workbench_forward_cac

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list