[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