[Bf-blender-cvs] [e05b7c16165] temp-eeveelightcache: DRW: Refactor ObjectEngineData into DrawData

Clément Foucault noreply at git.blender.org
Fri Jun 22 17:46:42 CEST 2018


Commit: e05b7c16165681883ebf0f1cc8a705182af2b052
Author: Clément Foucault
Date:   Fri Jun 22 17:21:39 2018 +0200
Branches: temp-eeveelightcache
https://developer.blender.org/rBe05b7c16165681883ebf0f1cc8a705182af2b052

DRW: Refactor ObjectEngineData into DrawData

This is because we will use it to store the update flags from the depsgraph.

Use a similar system as AnimationData where the struct is inserted at a
fixed position after the ID struct.

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

M	source/blender/blenkernel/BKE_world.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/world.c
M	source/blender/blenloader/CMakeLists.txt
M	source/blender/blenloader/intern/readfile.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_flush.cc
M	source/blender/draw/DRW_engine.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.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 fe8aa8694af..28f5f97073b 100644
--- a/source/blender/blenkernel/BKE_world.h
+++ b/source/blender/blenkernel/BKE_world.h
@@ -44,11 +44,5 @@ 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 5ca9b9d2203..e50d801dad4 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -418,6 +418,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);
 
@@ -448,13 +450,6 @@ void BKE_object_free(Object *ob)
 		ob->soft = NULL;
 	}
 
-	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);
@@ -1203,7 +1198,6 @@ 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(&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..66390631a55 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);
@@ -163,10 +167,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/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt
index 2c6f6f3edfb..eb916941721 100644
--- a/source/blender/blenloader/CMakeLists.txt
+++ b/source/blender/blenloader/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
 	../blenlib
 	../blentranslation
 	../depsgraph
+	../draw
 	../imbuf
 	../makesdna
 	../makesrna
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 8432da01680..1426237fab1 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -157,6 +157,8 @@
 #include "BKE_colortools.h"
 #include "BKE_workspace.h"
 
+#include "DRW_engine.h"
+
 #include "DEG_depsgraph.h"
 
 #include "NOD_common.h"
@@ -2340,6 +2342,11 @@ static void direct_link_id(FileData *fd, ID *id)
 		id->override_static = newdataadr(fd, id->override_static);
 		link_list_ex(fd, &id->override_static->properties, direct_link_id_override_property_cb);
 	}
+
+	DrawDataList *drawdata = DRW_drawdatalist_from_id(id);
+	if (drawdata) {
+		BLI_listbase_clear(drawdata);
+	}
 }
 
 /* ************ READ CurveMapping *************** */
@@ -5571,7 +5578,6 @@ static void direct_link_object(FileData *fd, Object *ob)
 	ob->derivedFinal = NULL;
 	BKE_object_runtime_reset(ob);
 	BLI_listbase_clear(&ob->gpulamp);
-	BLI_listbase_clear(&ob->drawdata);
 	link_list(fd, &ob->pc_ids);
 
 	/* Runtime curve data  */
diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt
index 8f6eee244f7..df221ef73d7 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 d4a115cfb8b..329becdb1bb 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -838,9 +838,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_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index e9f11f8e089..cba4a0d207d 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"
@@ -216,12 +218,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 d8bc8795224..ab2001dcb6a 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -143,4 +143,7 @@ void DRW_gawain_render_context_disable(void *re_gwn_context);
 
 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/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 42e214e185f..3e3a202a24c 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -44,6 +44,7 @@
 #include "DNA_lamp_types.h"
 #include "DNA_material_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_world_types.h"
 
 #include "GPU_framebuffer.h"
 #include "GPU_texture.h"
@@ -466,16 +467,14 @@ void **DRW_view_layer_engine_data_ensure_ex(
 void **DRW_view_layer_engine_data_ensure(
         DrawEngineType *engine_type, void (*callback)(void *storage));
 
-/* Objects */
-ObjectEngineData *DRW_object_engine_data_get(Object *ob, DrawEngineType *engine_type);
-ObjectEngineData *DRW_object_engine_data_ensure(
-        Object *ob,
+/* DrawData */
+DrawData *DRW_drawdata_get(ID *ib, DrawEngineType *engine_type);
+DrawData *DRW_drawdata_ensure(
+        ID *id,
         DrawEngineType *engine_type,
         size_t size,
-        ObjectEngineDataInitCb init_cb,
-        ObjectEngineDataFreeCb free_cb);
-struct LampEngineData *DRW_lamp_engine_data_ensure(Object *ob, struct RenderEngineType *engine_type);
-void DRW_lamp_engine_data_free(struct LampEngineData *led);
+        DrawDataInitCb init_cb,
+        DrawDataFreeCb free_cb);
 
 /* Settings */
 bool DRW_object_is_renderable(struct Object *ob);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index cc145f3a91d..4afcc411c4a 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -44,6 +44,7 @@
 #include "DNA_camera_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_world_types.h"
 
 #include "ED_space_api.h"
 #include "ED_screen.h"
@@ -729,34 +730,100 @@ void **DRW_view_layer_engine_data_ensure(DrawEngineType *engine_type, void (*cal
 
 /* -------------------------------------------------------------------- */
 
-/** \name Objects (DRW_object)
+/** \name Draw Data (DRW_drawdata)
  * \{ */
 
-ObjectEngineData *DRW_object_engine_data_get(Object *ob, DrawEngineType *engine_type)
+/* Used for DRW_drawdata_from_id()
+ * All ID-datablocks which have their own 'local' DrawData
+ * should have the same arrangement in their structs.
+ */
+typedef struct IdDdtTemplate {
+	ID id;
+	struct AnimData *adt;
+	DrawDataList drawdata;
+} IdDdtTemplate;
+
+/* Check if ID can have AnimData */
+static bool id_type_can_have_drawdata(const short id_type)
+{
+	/* Only some ID-blocks have this info for now */
+	/* TODO: finish adding this for the other blocktypes */
+	switch (id_type) {
+		/* has DrawData */
+		case ID_OB:
+		case ID_WO:
+			return true;
+
+		/* no DrawData */
+		default:
+			return false;
+	}
+}
+
+static bool id_can_have_drawdata(const ID *id)
+{
+	/* sanity check */
+	if (id == NULL)
+		return false;
+
+	return id_type_can_have_drawdata(GS(id->name));
+}
+
+/* Get DrawData from the given ID-block. In order for this to work, we assume that
+ * the DrawData pointer is stored in the struct in the same fashion as in IdDdtTemplate.
+ */
+DrawDataList *DRW_drawdatalist_from_id(ID *id)
 {
-	for (ObjectEngineData *oed = ob->drawdata.first; oed; oed = oed->next) {
-		if (oed->engine_type == engine_type) {
-			return oed;
+	/* only some ID-blocks have this info for now, so we cast the
+	 * types that do to be of type IdDdtTemplate, and extract the
+	 * DrawData that way
+	 */
+	if (id_can_have_drawdata(id)) {
+		IdDdtTemplate *idt = (IdDdtTemplate *)id;
+		return &idt->drawdata;
+	}
+	else
+		return NULL;
+}
+
+DrawData *DRW_drawdata_get(ID *id, DrawEngineType *engine_ty

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list