[Bf-blender-cvs] [e6e740f3176] tmp-workbench-rewrite: Workbench: Refactor: Support Material data

Clément Foucault noreply at git.blender.org
Tue Mar 3 17:35:43 CET 2020


Commit: e6e740f31766e631d0be919d233f6fcaa610d8a1
Author: Clément Foucault
Date:   Fri Feb 28 17:30:15 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rBe6e740f31766e631d0be919d233f6fcaa610d8a1

Workbench: Refactor: Support Material data

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_opaque.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_shader.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager_data.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 8538defa7f1..a79a1c4cc0b 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -262,6 +262,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_forward_composite_frag.glsl
 data_to_c_simple(engines/workbench/shaders/workbench_forward_depth_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_ghost_resolve_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_material_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_object_outline_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_curvature_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index 008be393509..9e64796f757 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -10,10 +10,10 @@ struct WorldData {
   vec4 shadow_direction_vs;
   LightData lights[4];
   vec4 ambient_color;
-  int num_lights;
   int matcap_orientation;
   float curvature_ridge;
   float curvature_valley;
+  int _pad0;
 };
 
 layout(std140) uniform world_block
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
new file mode 100644
index 00000000000..aa3a0a30408
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
@@ -0,0 +1,21 @@
+
+layout(std140) uniform material_block
+{
+  vec4 mat_data[4096];
+};
+
+/* If set to -1, the resource handle is used instead. */
+uniform int material_index;
+
+void workbench_material_data_get(
+    int handle, out vec3 color, out float alpha, out float roughness, out float metallic)
+{
+  handle = (material_index != -1) ? material_index : handle;
+  vec4 data = mat_data[uint(handle) & 0xFFFu];
+  color = data.rgb;
+
+  uint encoded_data = floatBitsToUint(data.w);
+  alpha = float((encoded_data >> 16u) & 0xFFu) * (1.0 / 255.0);
+  roughness = float((encoded_data >> 8u) & 0xFFu) * (1.0 / 255.0);
+  metallic = float(encoded_data & 0xFFu) * (1.0 / 255.0);
+}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index c7e74a789ac..6875cb6bd94 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -1,6 +1,7 @@
 
 #pragma BLENDER_REQUIRE(common_view_lib.glsl)
 #pragma BLENDER_REQUIRE(workbench_common_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_material_lib.glsl)
 
 IN_OUT ShaderStageInterface
 {
@@ -32,11 +33,8 @@ void main()
 
   normal_interp = normalize(normal_object_to_view(nor));
 
-  // float metallic = materialColorAndMetal.a;
-  // float roughness = materialRoughness;
-
-  float metallic = 0.0;
-  float roughness = 0.0;
+  float alpha, metallic, roughness;
+  workbench_material_data_get(resource_handle, color_interp, alpha, roughness, metallic);
 
   if (metallic == -1.0) {
     /* Matcap Case. */
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index a2cc2a52b7e..08342f29c2a 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -22,69 +22,61 @@
 
 #include "workbench_private.h"
 
+#include "BLI_memblock.h"
+
 #include "DNA_userdef_types.h"
 
 #include "ED_view3d.h"
 
 #include "UI_resources.h"
 
-#include "GPU_batch.h"
+#include "GPU_uniformbuffer.h"
 
 /* -------------------------------------------------------------------- */
 /** \name World Data
  * \{ */
 
-static void workbench_world_data_free(DrawData *dd)
+GPUUniformBuffer *workbench_material_ubo_alloc(WORKBENCH_PrivateData *wpd)
 {
-  WORKBENCH_WorldData *data = (WORKBENCH_WorldData *)dd;
-  DRW_UBO_FREE_SAFE(data->world_ubo);
+  struct GPUUniformBuffer **ubo = BLI_memblock_alloc(wpd->material_ubo);
+  if (*ubo == NULL) {
+    *ubo = GPU_uniformbuffer_create(sizeof(WORKBENCH_UBO_Material) * MAX_MATERIAL, NULL, NULL);
+  }
+  return *ubo;
 }
 
-/* Ensure the availability of the world_ubo in the given WORKBENCH_PrivateData
- *
- * See T70167: Some platforms create threads to upload ubo's.
- *
- * Reuses the last previous created `world_ubo`. Due to limitations of
- * DrawData it will only be reused when there is a world attached to the Scene.
- * Future development: The best location would be to store it in the View3D.
- *
- * We don't cache the data itself as there was no indication that that lead to
- * an improvement.
- *
- * This functions also sets the `WORKBENCH_PrivateData.is_world_ubo_owner` that must
- * be respected.
- */
-static void workbench_world_data_ubo_ensure(const Scene *scene, WORKBENCH_PrivateData *wpd)
+static void workbench_ubo_free(void *elem)
 {
-  World *world = scene->world;
-  if (world) {
-    WORKBENCH_WorldData *engine_world_data = (WORKBENCH_WorldData *)DRW_drawdata_ensure(
-        &world->id,
-        &draw_engine_workbench_solid,
-        sizeof(WORKBENCH_WorldData),
-        NULL,
-        &workbench_world_data_free);
-
-    if (engine_world_data->world_ubo == NULL) {
-      engine_world_data->world_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_World),
-                                                              &wpd->world_data);
-    }
-    else {
-      DRW_uniformbuffer_update(engine_world_data->world_ubo, &wpd->world_data);
-    }
+  GPUUniformBuffer **ubo = elem;
+  DRW_UBO_FREE_SAFE(*ubo);
+}
 
-    /* Borrow world data ubo */
-    wpd->is_world_ubo_owner = false;
-    wpd->world_ubo = engine_world_data->world_ubo;
-  }
-  else {
-    /* there is no world so we cannot cache the UBO. */
-    BLI_assert(!wpd->world_ubo || wpd->is_world_ubo_owner);
-    if (!wpd->world_ubo) {
-      wpd->is_world_ubo_owner = true;
-      wpd->world_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_World), &wpd->world_data);
-    }
+static void workbench_view_layer_data_free(void *storage)
+{
+  WORKBENCH_ViewLayerData *vldata = (WORKBENCH_ViewLayerData *)storage;
+
+  DRW_UBO_FREE_SAFE(vldata->world_ubo);
+
+  BLI_memblock_destroy(vldata->material_ubo_data, NULL);
+  BLI_memblock_destroy(vldata->material_ubo, workbench_ubo_free);
+}
+
+static WORKBENCH_ViewLayerData *workbench_view_layer_data_ensure_ex(struct ViewLayer *view_layer)
+{
+  WORKBENCH_ViewLayerData **vldata = (WORKBENCH_ViewLayerData **)
+      DRW_view_layer_engine_data_ensure_ex(view_layer,
+                                           (DrawEngineType *)&workbench_view_layer_data_ensure_ex,
+                                           &workbench_view_layer_data_free);
+
+  if (*vldata == NULL) {
+    *vldata = MEM_callocN(sizeof(**vldata), "WORKBENCH_ViewLayerData");
+    size_t matbuf_size = sizeof(WORKBENCH_UBO_Material) * MAX_MATERIAL;
+    (*vldata)->material_ubo_data = BLI_memblock_create_ex(matbuf_size, matbuf_size * 2);
+    (*vldata)->material_ubo = BLI_memblock_create_ex(sizeof(void *), sizeof(void *) * 8);
+    (*vldata)->world_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_World), NULL);
   }
+
+  return *vldata;
 }
 
 static void workbench_world_data_update_shadow_direction_vs(WORKBENCH_PrivateData *wpd)
@@ -167,27 +159,33 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
 {
   const DRWContextState *draw_ctx = DRW_context_state_get();
   const Scene *scene = draw_ctx->scene;
-  // wpd->material_hash = BLI_ghash_ptr_new(__func__);
-  // wpd->material_transp_hash = BLI_ghash_ptr_new(__func__);
+  WORKBENCH_ViewLayerData *vldata = workbench_view_layer_data_ensure_ex(draw_ctx->view_layer);
+  RegionView3D *rv3d = draw_ctx->rv3d;
+  View3D *v3d = draw_ctx->v3d;
+
   wpd->preferences = &U;
   wpd->sh_cfg = draw_ctx->sh_cfg;
 
-  View3D *v3d = draw_ctx->v3d;
-  RegionView3D *rv3d = draw_ctx->rv3d;
+  wpd->world_ubo = vldata->world_ubo;
+
+  wpd->material_ubo_data = vldata->material_ubo_data;
+  wpd->material_ubo = vldata->material_ubo;
+  wpd->material_chunk_count = 1;
+  wpd->material_chunk_curr = 0;
+  wpd->material_index = 1;
+  /* Create default material ubo. */
+  wpd->material_ubo_data_curr = BLI_memblock_alloc(wpd->material_ubo_data);
+  wpd->material_ubo_curr = workbench_material_ubo_alloc(wpd);
 
   if (!v3d || (v3d->shading.type == OB_RENDER && BKE_scene_uses_blender_workbench(scene))) {
     wpd->shading = scene->display.shading;
     wpd->shading.xray_alpha = XRAY_ALPHA((&scene->display));
-    wpd->use_color_render_settings = true;
   }
   else {
     wpd->shading = v3d->shading;
     wpd->shading.xray_alpha = XRAY_ALPHA(v3d);
-    wpd->use_color_render_settings = false;
   }
 
-  wpd->use_color_management = BKE_scene_check_color_management_enabled(scene);
-
   if (wpd->shading.light == V3D_LIGHTING_MATCAP) {
     wpd->studio_light = BKE_studiolight_find(wpd->shading.matcap, STUDIOLIGHT_TYPE_MATCAP);
   }
@@ -200,6 +198,12 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
     wpd->studio_light = BKE_studiolight_find(wpd->shading.studio_light, STUDIOLIGHT_TYPE_STUDIO);
   }
 
+  const bool use_material_index = USE_MATERIAL_INDEX(wpd);
+
+  if (use_material_index) {
+    wpd->material_hash = BLI_ghash_ptr_new(__func__);
+  }
+
   float shadow_focus = scene->display.shadow_focus;
   /* Clamp to avoid overshadowing and shading errors. */
   CLAMP(shadow_focus, 0.0001f, 0.99999f);
@@ -227,9 +231,10 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   }
 
   workbench_world_data_update_shadow_direction_vs(wpd);
-  workbench_world_data_ubo_ensure(scene, wpd);
   workbench_viewvecs_update(wpd->world_data.viewvecs);
 
+  DRW_uniformbuffer_update(wpd->world_ubo, &wpd->world_data);
+
   /* Cavity settings */
   {
     const int ssao_samples = scene->display.matcap_ssao_sampl

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list