[Bf-blender-cvs] [873d7f7e14e] blender2.8: DrawData: Change drawdata to a generic struct shared accross ID types

Clément Foucault noreply at git.blender.org
Tue Jul 10 15:40:42 CEST 2018


Commit: 873d7f7e14e080f75e75ed7c6c07f326e588cecb
Author: Clément Foucault
Date:   Tue Jul 10 14:14:55 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB873d7f7e14e080f75e75ed7c6c07f326e588cecb

DrawData: Change drawdata to a generic struct shared accross ID types

This makes tagging much more generic and make the world updates more in
line with the new tagging system (Depsgraph).

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

M	source/blender/blenkernel/BKE_world.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/world.c
M	source/blender/depsgraph/CMakeLists.txt
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M	source/blender/depsgraph/intern/eval/deg_eval_flush.cc
M	source/blender/draw/DRW_engine.h
M	source/blender/draw/engines/eevee/eevee_data.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_private.h
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_private.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/object_mode.c
M	source/blender/editors/render/render_update.c
M	source/blender/makesdna/DNA_ID.h
M	source/blender/makesdna/DNA_object_types.h
M	source/blender/makesdna/DNA_world_types.h

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

diff --git a/source/blender/blenkernel/BKE_world.h b/source/blender/blenkernel/BKE_world.h
index f703fefec97..6a9a75828e5 100644
--- a/source/blender/blenkernel/BKE_world.h
+++ b/source/blender/blenkernel/BKE_world.h
@@ -44,10 +44,4 @@ struct World *BKE_world_copy(struct Main *bmain, const struct World *wrld);
 struct World *BKE_world_localize(struct World *wrld);
 void BKE_world_make_local(struct Main *bmain, struct World *wrld, const bool lib_local);
 
-/* Evaluation. */
-
-struct Depsgraph;
-
-void BKE_world_eval(struct Depsgraph *depsgraph, struct World *world);
-
 #endif
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index a7c13ab2a81..95e408f593e 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -424,6 +424,8 @@ void BKE_object_free(Object *ob)
 {
 	BKE_animdata_free((ID *)ob, false);
 
+	DRW_drawdata_free((ID *)ob);
+
 	/* BKE_<id>_free shall never touch to ID->us. Never ever. */
 	BKE_object_free_modifiers(ob, LIB_ID_CREATE_NO_USER_REFCOUNT);
 
@@ -451,13 +453,6 @@ void BKE_object_free(Object *ob)
 
 	sbFree(ob);
 
-	for (ObjectEngineData *oed = ob->drawdata.first; oed; oed = oed->next) {
-		if (oed->free != NULL) {
-			oed->free(oed);
-		}
-	}
-	BLI_freelistN(&ob->drawdata);
-
 	BKE_sculptsession_free(ob);
 
 	BLI_freelistN(&ob->pc_ids);
@@ -1210,7 +1205,7 @@ void BKE_object_copy_data(Main *UNUSED(bmain), Object *ob_dst, const Object *ob_
 	ob_dst->derivedFinal = NULL;
 
 	BLI_listbase_clear(&ob_dst->gpulamp);
-	BLI_listbase_clear(&ob_dst->drawdata);
+	BLI_listbase_clear((ListBase *)&ob_dst->drawdata);
 	BLI_listbase_clear(&ob_dst->pc_ids);
 
 	ob_dst->avs = ob_src->avs;
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 69096ad7a08..3e1a9a4f57b 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -53,6 +53,8 @@
 #include "BKE_node.h"
 #include "BKE_world.h"
 
+#include "DRW_engine.h"
+
 #include "DEG_depsgraph.h"
 
 #include "GPU_material.h"
@@ -62,6 +64,8 @@ void BKE_world_free(World *wrld)
 {
 	BKE_animdata_free((ID *)wrld, false);
 
+	DRW_drawdata_free((ID *)wrld);
+
 	/* is no lib link block, but world extension */
 	if (wrld->nodetree) {
 		ntreeFreeTree(wrld->nodetree);
@@ -119,6 +123,7 @@ void BKE_world_copy_data(Main *bmain, World *wrld_dst, const World *wrld_src, co
 	}
 
 	BLI_listbase_clear(&wrld_dst->gpumaterial);
+	BLI_listbase_clear((ListBase *)&wrld_dst->drawdata);
 
 	if ((flag & LIB_ID_COPY_NO_PREVIEW) == 0) {
 		BKE_previewimg_id_copy(&wrld_dst->id, &wrld_src->id);
@@ -154,6 +159,7 @@ World *BKE_world_localize(World *wrld)
 	wrldn->preview = NULL;
 
 	BLI_listbase_clear(&wrldn->gpumaterial);
+	BLI_listbase_clear((ListBase *)&wrldn->drawdata);
 
 	return wrldn;
 }
@@ -163,10 +169,3 @@ void BKE_world_make_local(Main *bmain, World *wrld, const bool lib_local)
 	BKE_id_make_local_generic(bmain, &wrld->id, true, lib_local);
 }
 
-void BKE_world_eval(struct Depsgraph *depsgraph, World *world)
-{
-	DEG_debug_print_eval(depsgraph, __func__, world->id.name, world);
-	if (!BLI_listbase_is_empty(&world->gpumaterial)) {
-		world->update_flag = 1;
-	}
-}
diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt
index 0673a3177b7..185a98f2a2b 100644
--- a/source/blender/depsgraph/CMakeLists.txt
+++ b/source/blender/depsgraph/CMakeLists.txt
@@ -28,6 +28,7 @@ set(INC
 	../blenkernel
 	../blenlib
 	../bmesh
+	../draw
 	../makesdna
 	../makesrna
 	../modifiers
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index cb455130d4c..ab7ddb507a0 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -873,9 +873,7 @@ void DepsgraphNodeBuilder::build_world(World *world)
 	/* world itself */
 	add_operation_node(&world->id,
 	                   DEG_NODE_TYPE_SHADING,
-	                   function_bind(BKE_world_eval,
-	                                 _1,
-	                                 get_cow_datablock(world)),
+	                   NULL,
 	                   DEG_OPCODE_WORLD_UPDATE);
 	/* world's nodetree */
 	if (world->nodetree != NULL) {
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index 447a8af6235..794cc22f4e3 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -70,6 +70,8 @@ extern "C" {
 #include "DNA_object_types.h"
 #include "DNA_particle_types.h"
 
+#include "DRW_engine.h"
+
 #ifdef NESTED_ID_NASTY_WORKAROUND
 #  include "DNA_curve_types.h"
 #  include "DNA_key_types.h"
@@ -713,7 +715,6 @@ typedef struct ObjectRuntimeBackup {
 	CurveCache *curve_cache;
 	Object_Runtime runtime;
 	short base_flag;
-	ListBase drawdata;
 } ObjectRuntimeBackup;
 
 /* Make a backup of object's evaluation runtime data, additionally
@@ -740,9 +741,6 @@ static void deg_backup_object_runtime(
 	object->curve_cache = NULL;
 	/* Make a backup of base flags. */
 	object_runtime_backup->base_flag = object->base_flag;
-	/* Make backup of object draw data.*/
-	object_runtime_backup->drawdata = object->drawdata;
-	BLI_listbase_clear(&object->drawdata);
 }
 
 static void deg_restore_object_runtime(
@@ -782,8 +780,6 @@ static void deg_restore_object_runtime(
 		object->curve_cache = object_runtime_backup->curve_cache;
 	}
 	object->base_flag = object_runtime_backup->base_flag;
-	/* Restore draw data. */
-	object->drawdata = object_runtime_backup->drawdata;
 }
 
 ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
@@ -812,6 +808,8 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 	 */
 	ListBase gpumaterial_backup;
 	ListBase *gpumaterial_ptr = NULL;
+	DrawDataList drawdata_backup;
+	DrawDataList *drawdata_ptr = NULL;
 	ObjectRuntimeBackup object_runtime_backup = {NULL};
 	if (check_datablock_expanded(id_cow)) {
 		switch (id_type) {
@@ -847,9 +845,11 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 				break;
 			}
 			case ID_OB:
-				deg_backup_object_runtime((Object *)id_cow,
-				                          &object_runtime_backup);
+			{
+				Object *ob = (Object *)id_cow;
+				deg_backup_object_runtime(ob, &object_runtime_backup);
 				break;
+			}
 			default:
 				break;
 		}
@@ -857,6 +857,11 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 			gpumaterial_backup = *gpumaterial_ptr;
 			gpumaterial_ptr->first = gpumaterial_ptr->last = NULL;
 		}
+		drawdata_ptr = DRW_drawdatalist_from_id(id_cow);
+		if (drawdata_ptr != NULL) {
+			drawdata_backup = *drawdata_ptr;
+			drawdata_ptr->first = drawdata_ptr->last = NULL;
+		}
 	}
 	deg_free_copy_on_write_datablock(id_cow);
 	deg_expand_copy_on_write_datablock(depsgraph, id_node);
@@ -864,6 +869,10 @@ ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
 	if (gpumaterial_ptr != NULL) {
 		*gpumaterial_ptr = gpumaterial_backup;
 	}
+	/* Restore DrawData. */
+	if (drawdata_ptr != NULL) {
+		*drawdata_ptr = drawdata_backup;
+	}
 	if (id_type == ID_OB) {
 		deg_restore_object_runtime((Object *)id_cow, &object_runtime_backup);
 	}
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index bd31931d0a9..16cb1b394f6 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
@@ -46,6 +46,8 @@
 
 extern "C" {
 #include "DNA_object_types.h"
+
+#include "DRW_engine.h"
 } /* extern "C" */
 
 #include "DEG_depsgraph.h"
@@ -219,12 +221,12 @@ BLI_INLINE OperationDepsNode *flush_schedule_children(
 
 void flush_engine_data_update(ID *id)
 {
-	if (GS(id->name) != ID_OB) {
+	DrawDataList *drawdata = DRW_drawdatalist_from_id(id);
+	if (drawdata == NULL) {
 		return;
 	}
-	Object *object = (Object *)id;
-	LISTBASE_FOREACH(ObjectEngineData *, engine_data, &object->drawdata) {
-		engine_data->recalc |= id->recalc;
+	LISTBASE_FOREACH(DrawData *, dd, drawdata) {
+		dd->recalc |= id->recalc;
 	}
 }
 
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index d126dcb71aa..d2a3bab9b20 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -138,4 +138,7 @@ void DRW_opengl_context_disable(void);
 
 void DRW_deferred_shader_remove(struct GPUMaterial *mat);
 
+struct DrawDataList *DRW_drawdatalist_from_id(struct ID *id);
+void DRW_drawdata_free(struct ID *id);
+
 #endif /* __DRW_ENGINE_H__ */
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index e9883cc3054..bf039871d52 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -91,9 +91,9 @@ EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void)
 
 /* Object data. */
 
-static void eevee_object_data_init(ObjectEngineData *engine_data)
+static void eevee_object_data_init(DrawData *dd)
 {
-	EEVEE_ObjectEngineData *eevee_data = (EEVEE_ObjectEngineData *)engine_data;
+	EEVEE_ObjectEngineData *eevee_data = (EEVEE_ObjectEngineData *)dd;
 	eevee_data->shadow_caster_id = -1;
 }
 
@@ -102,15 +102,15 @@ EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob)
 	if (ELEM(ob->type, OB_LIGHTPROBE, OB_LAMP)) {
 		return NULL;
 	}
-	return (EEVEE_ObjectEngineData *)DRW_object_engine_data_get(
-	        ob, &draw_engine_eevee_type);
+	return (EEVEE_ObjectEngineData *)DRW_drawdata_get(
+	        &ob->id, &draw_engine_eevee_type);
 }
 
 EEVEE_ObjectEngineData *EEVEE_object_data_ensure(Object *ob)
 {
 	BLI_assert(!ELEM(ob->type, OB_LIGHTPROBE, OB_LAMP));
-	return (EEVEE_ObjectEngineData *)DRW_object_engine_data_ensure(
-	        ob,
+	return (EEVEE_ObjectEngineData *)DRW_drawdata_ensure(
+	        &ob->id,
 	        &draw_engine_eevee_type,
 	        sizeof(EEVEE_ObjectEngineData),
 	        eevee_object_data_init,
@@ -119,18 +119,10 @@ EEVEE_ObjectEngineData *EEVEE_object_data_ensure(Object *ob)
 
 /

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list