Commit: fa64dfa449d4c66b0cae55ebbafba18a3e6c7534 Author: Bastien Montagne Date: Thu Jun 15 11:05:32 2017 +0200 Branches: id_copy_refactor https://developer.blender.org/rBfa64dfa449d4c66b0cae55ebbafba18a3e6c7534
On second thought, avoid adding new stuff to ID. We can extend ID->tag and store there our few alloc-related tags. =================================================================== M source/blender/blenkernel/BKE_library.h M source/blender/blenkernel/intern/library.c M source/blender/blenloader/intern/readfile.c M source/blender/blenloader/intern/writefile.c M source/blender/makesdna/DNA_ID.h =================================================================== diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index 3765ae97ebc..4273aafd7d8 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -54,10 +54,32 @@ size_t BKE_libblock_get_alloc_info(short type, const char **name); void *BKE_libblock_alloc_notest(short type); void *BKE_libblock_alloc(struct Main *bmain, short type, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); void BKE_libblock_init_empty(struct ID *id); + +/** + * New copy logic options. + */ +enum { + /* *** Generic options (should be handled by all ID types copying). *** */ + /* Create copy outside of any main database - similar to 'localize' functions of materials etc. */ + LIB_ID_COPY_NO_MAIN = 1 << 0, + LIB_ID_COPY_NO_USER_REFCOUNT = 1 << 1, /* Do not affect user refcount of datablocks used by copied one. */ + LIB_ID_COPY_NO_DEG_TAG = 1 << 2, /* Do not tag duplicated ID for update in depsgraph. */ + /* Assume given 'newid' already points to allocated memory for whole datablock (ID + data) - USE WITH CAUTION! */ + LIB_ID_COPY_NO_ALLOCATE = 1 << 3, + + /* Specific options to some ID types or usages, may be ignored by unrelated ID copying functions. */ + LIB_ID_COPY_NO_PROXY_CLEAR = 1 << 16, /* Object only, needed by make_local code. */ + LIB_ID_COPY_NO_PREVIEW = 1 << 17, /* Do not copy preview data, when supported. */ + LIB_ID_COPY_CACHES = 1 << 18, /* Copy runtime data caches. */ + /* XXX TODO Do we want to keep that? would rather try to get rid of it... */ + LIB_ID_COPY_ACTIONS = 1 << 19, /* EXCEPTION! Deep-copy actions used by animdata of copied ID. */ +}; + void BKE_libblock_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, const int flag); void *BKE_libblock_copy(struct Main *bmain, const struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); void *BKE_libblock_copy_nolib(const struct ID *id, const bool do_action) ATTR_NONNULL(); void BKE_libblock_copy_data(struct ID *id, const struct ID *id_from, const bool do_action); + void BKE_libblock_rename(struct Main *bmain, struct ID *id, const char *name) ATTR_NONNULL(); void BLI_libblock_ensure_unique_name(struct Main *bmain, const char *name) ATTR_NONNULL(); diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index db459905eba..a1d0f12bed3 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -1159,7 +1159,15 @@ void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int fla /* TODO we can remove that one later and bring its code here. */ BKE_libblock_copy_data(idn, id, (flag & LIB_ID_COPY_ACTIONS) != 0); - idn->copy_tag = flag & (LIB_ID_COPY_NO_MAIN | LIB_ID_COPY_NO_USER_REFCOUNT | LIB_ID_COPY_NO_ALLOCATE); + if ((flag & LIB_ID_COPY_NO_MAIN) != 0) { + idn->tag |= LIB_TAG_FREE_NO_MAIN; + } + if ((flag & LIB_ID_COPY_NO_USER_REFCOUNT) != 0) { + idn->tag |= LIB_TAG_FREE_NO_USER_REFCOUNT; + } + if ((flag & LIB_ID_COPY_NO_ALLOCATE) != 0) { + idn->tag |= LIB_TAG_FREE_NO_ALLOCATED; + } if ((flag & LIB_ID_COPY_NO_DEG_TAG) == 0 && (flag & LIB_ID_COPY_NO_MAIN) == 0) { DAG_id_type_tag(bmain, GS(idn->name)); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 3c38a122787..f224f0b5633 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8221,7 +8221,6 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, const short return blo_nextbhead(fd, bhead); id->tag = tag | LIB_TAG_NEED_LINK; - id->copy_tag = 0; id->lib = main->curlib; id->us = ID_FAKE_USERS(id); id->icon_id = 0; diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 236fe2289aa..0336f28ed85 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -3842,7 +3842,7 @@ static bool write_file_handle( for (; id; id = id->next) { /* We should never attempt to write non-regular IDs (i.e. all kind of temp/runtime ones). */ - BLI_assert(id->copy_tag == 0); + BLI_assert((id->tag & (LIB_TAG_FREE_NO_MAIN | LIB_TAG_FREE_NO_USER_REFCOUNT | LIB_TAG_FREE_NO_ALLOCATED)) == 0); switch ((ID_Type)GS(id->name)) { case ID_WM: diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 1023afdd205..857b7478481 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -127,17 +127,10 @@ typedef struct ID { /** * LIB_TAG_... tags (runtime only, cleared at read time). */ - short tag; - short pad_s1; + int tag; int us; int icon_id; IDProperty *properties; - /** - * LIB_ID_COPY_... options (should be NULL/empty when ID is not temp/runtime-only one). - * Also used by freeing code to know what to do (unlink used IDs, remove from main, ...). - */ - int copy_tag; - int pad_i1; } ID; /** @@ -356,33 +349,13 @@ enum { LIB_TAG_ID_RECALC_DATA = 1 << 13, LIB_TAG_ANIM_NO_RECALC = 1 << 14, LIB_TAG_ID_RECALC_ALL = (LIB_TAG_ID_RECALC | LIB_TAG_ID_RECALC_DATA), -}; -/** - * id->copy_tag (runtime-only). - * - * Those flags keep track of special options used when copying that ID from another one (or, in some case, - * from special creation options). - * - * They are mostly here for two things: - * * Detect attempt to write in .blend file temp/runtime only IDs (id->copy_tag should be void for regular datablocks). - * * Simplify freeing, since they should tell whether ID has to be removed from main, whether it should be unlinked, etc. - */ -enum { - /* *** Generic options (should be handled by all ID types copying). *** */ - /* Create copy outside of any main database - similar to 'localize' functions of materials etc. */ - LIB_ID_COPY_NO_MAIN = 1 << 0, - LIB_ID_COPY_NO_USER_REFCOUNT = 1 << 1, /* Do not affect user refcount of datablocks used by copied one. */ - LIB_ID_COPY_NO_DEG_TAG = 1 << 2, /* Do not tag duplicated ID for update in depsgraph. */ - /* Assume given 'newid' already points to allocated memory for whole datablock (ID + data) - USE WITH CAUTION! */ - LIB_ID_COPY_NO_ALLOCATE = 1 << 3, - - /* Specific options to some ID types or usages, may be ignored by unrelated ID copying functions. */ - LIB_ID_COPY_NO_PROXY_CLEAR = 1 << 16, /* Object only, needed by make_local code. */ - LIB_ID_COPY_NO_PREVIEW = 1 << 17, /* Do not copy preview data, when supported. */ - LIB_ID_COPY_CACHES = 1 << 18, /* Copy runtime data caches. */ - /* XXX TODO Do we want to keep that? would rather try to get rid of it... */ - LIB_ID_COPY_ACTIONS = 1 << 19, /* EXCEPTION! Deep-copy actions used by animdata of copied ID. */ + /* RESET_NEVER tag datablock for freeing behavior (usually set when copying real one into temp/runtime one). */ + LIB_TAG_FREE_NO_MAIN = 1 << 16, /* Datablock is not listed in Main database. */ + LIB_TAG_FREE_NO_USER_REFCOUNT = 1 << 17, /* Datablock does not refcount usages of other IDs. */ + /* Datablock was not allocated by standard system (BKE_libblock_alloc), do not free its memory + * (usual type-specific freeing is called though). */ + LIB_TAG_FREE_NO_ALLOCATED = 1 << 18, }; /* To filter ID types (filter_id) */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs