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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to