Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2020-04-03 14:34:12 +0300
committerBrecht Van Lommel <brecht@blender.org>2020-04-07 14:19:52 +0300
commitd2a07c7b78ae902af532013308e0e304dc77dd3a (patch)
tree12f4013e0620a1f80d2e33c6f063abe7f594dbbd /source/blender/blenloader
parent44e5f7a8cfc01771563d4ae663b1d2df3c4aeb7e (diff)
Cleanup: delay creating datamap until it's actually needed
Differential Revision: https://developer.blender.org/D7328
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r--source/blender/blenloader/intern/readfile.c54
1 files changed, 19 insertions, 35 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index a5a872a84d0..92ac722f1d1 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -9499,7 +9499,7 @@ static BHead *read_libblock(FileData *fd,
}
/* Read libblock struct. */
- BHead *first_bhead = bhead;
+ BHead *id_bhead = bhead;
ID *id = read_struct(fd, bhead, "lib block");
if (id == NULL) {
return blo_bhead_next(fd, bhead);
@@ -9531,20 +9531,6 @@ static BHead *read_libblock(FileData *fd,
}
}
- /* read libblock */
- BHead *id_bhead = bhead;
-
- if (id_bhead->code != ID_LINK_PLACEHOLDER) {
- /* need a name for the mallocN, just for debugging and sane prints on leaks */
- const char *allocname = dataname(idcode);
-
- /* read all data into fd->datamap */
- /* TODO: for the undo case instead of building oldnewmap here we could just quickly check the
- * bheads... could save some more ticks. Probably not worth it though, bottleneck is full
- * depsgraph rebuild and evaluate, not actual file reading. */
- bhead = read_data_into_datamap(fd, id_bhead, allocname);
- }
-
/* Restore existing datablocks for undo. */
const bool do_partial_undo = (fd->skip_flags & BLO_READ_SKIP_UNDO_OLD_MAIN) == 0;
@@ -9553,8 +9539,8 @@ static BHead *read_libblock(FileData *fd,
bool do_id_swap = false;
if (fd->memfile != NULL) {
- if (id_bhead->code != ID_LINK_PLACEHOLDER) {
- const bool is_identical = read_libblock_is_identical(fd, first_bhead);
+ if (bhead->code != ID_LINK_PLACEHOLDER) {
+ const bool is_identical = read_libblock_is_identical(fd, id_bhead);
DEBUG_PRINTF("%s: ID %s is unchanged: %d\n", __func__, id->name, is_identical);
BLI_assert(fd->old_idmap != NULL || !do_partial_undo);
@@ -9603,8 +9589,8 @@ static BHead *read_libblock(FileData *fd,
if (can_finalize_and_return) {
DEBUG_PRINTF("Re-using existing ID %s instead of newly read one\n", id_old->name);
- oldnewmap_insert(fd->libmap, id_bhead->old, id_old, id_bhead->code);
- oldnewmap_insert(fd->libmap, id_old, id_old, id_bhead->code);
+ oldnewmap_insert(fd->libmap, bhead->old, id_old, bhead->code);
+ oldnewmap_insert(fd->libmap, id_old, id_old, bhead->code);
if (r_id) {
*r_id = id_old;
@@ -9639,9 +9625,8 @@ static BHead *read_libblock(FileData *fd,
}
MEM_freeN(id);
- oldnewmap_clear(fd->datamap);
- return bhead;
+ return blo_bhead_next(fd, bhead);
}
}
@@ -9659,8 +9644,7 @@ static BHead *read_libblock(FileData *fd,
* those. Besides maybe custom properties, no other ID should have pointers to those
* anyway...
* And linked IDs are handled separately as well. */
- do_id_swap = !ELEM(idcode, ID_WM, ID_SCR, ID_WS) &&
- !(id_bhead->code == ID_LINK_PLACEHOLDER);
+ do_id_swap = !ELEM(idcode, ID_WM, ID_SCR, ID_WS) && !(bhead->code == ID_LINK_PLACEHOLDER);
}
}
@@ -9676,8 +9660,8 @@ static BHead *read_libblock(FileData *fd,
/* for ID_LINK_PLACEHOLDER check */
ID *id_target = do_id_swap ? id_old : id;
- oldnewmap_insert(fd->libmap, id_bhead->old, id_target, id_bhead->code);
- oldnewmap_insert(fd->libmap, id_old, id_target, id_bhead->code);
+ oldnewmap_insert(fd->libmap, bhead->old, id_target, bhead->code);
+ oldnewmap_insert(fd->libmap, id_old, id_target, bhead->code);
BLI_addtail(lb, id);
@@ -9689,8 +9673,8 @@ static BHead *read_libblock(FileData *fd,
* to be done still. */
int id_tag = tag | LIB_TAG_NEED_LINK | LIB_TAG_NEW;
- if (id_bhead->code == ID_LINK_PLACEHOLDER) {
- /* Tag to get replaced by the actual linked datablock. */
+ /* Read placeholder for linked datablock. */
+ if (bhead->code == ID_LINK_PLACEHOLDER) {
id_tag |= LIB_TAG_ID_LINK_PLACEHOLDER;
if (placeholder_set_indirect_extern) {
@@ -9701,16 +9685,16 @@ static BHead *read_libblock(FileData *fd,
id_tag |= LIB_TAG_EXTERN;
}
}
- }
-
- /* Read datablock contents. */
- const bool success = direct_link_id(fd, main, id_tag, id, id_old);
- /* For placeholders we are done here. */
- if (id_bhead->code == ID_LINK_PLACEHOLDER) {
- return blo_bhead_next(fd, id_bhead);
+ direct_link_id(fd, main, id_tag, id, id_old);
+ return blo_bhead_next(fd, bhead);
}
+ /* Read datablock contents.
+ * Use convenient malloc name for debugging and better memory link prints. */
+ const char *allocname = dataname(idcode);
+ bhead = read_data_into_datamap(fd, bhead, allocname);
+ const bool success = direct_link_id(fd, main, id_tag, id, id_old);
oldnewmap_clear(fd->datamap);
if (!success) {
@@ -9755,7 +9739,7 @@ static BHead *read_libblock(FileData *fd,
id);
}
- return (bhead);
+ return bhead;
}
/** \} */