Cleanup: remove redundant doxygen \file argument
[blender.git] / source / blender / depsgraph / intern / eval / deg_eval_copy_on_write.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 20137Blender Foundation.
17  * All rights reserved.
18  */
19
20 /** \file \ingroup depsgraph
21  */
22
23 #pragma once
24
25 #include <stddef.h>
26
27 struct ID;
28
29 /* Uncomment this to have verbose log about original and CoW pointers
30  * logged, with detailed information when they are allocated, expanded
31  * and remapped.
32  */
33 // #define DEG_DEBUG_COW_POINTERS
34
35 #ifdef DEG_DEBUG_COW_POINTERS
36 #  define DEG_COW_PRINT(format, ...) printf(format, __VA_ARGS__);
37 #else
38 #  define DEG_COW_PRINT(format, ...)
39 #endif
40
41 struct Depsgraph;
42
43 namespace DEG {
44
45 struct Depsgraph;
46 struct DepsgraphNodeBuilder;
47 struct IDNode;
48
49 /* Get fully expanded (ready for use) copy-on-write datablock for the given
50  * original datablock.
51  */
52 ID *deg_expand_copy_on_write_datablock(const struct Depsgraph *depsgraph,
53                                        const IDNode *id_node,
54                                        DepsgraphNodeBuilder *node_builder = NULL,
55                                        bool create_placeholders = false);
56 ID *deg_expand_copy_on_write_datablock(const struct Depsgraph *depsgraph,
57                                        struct ID *id_orig,
58                                        DepsgraphNodeBuilder *node_builder = NULL,
59                                        bool create_placeholders = false);
60
61 /* Makes sure given CoW datablock is brought back to state of the original
62  * datablock.
63  */
64 ID *deg_update_copy_on_write_datablock(const struct Depsgraph *depsgraph,
65                                        const IDNode *id_node);
66 ID *deg_update_copy_on_write_datablock(const struct Depsgraph *depsgraph,
67                                        struct ID *id_orig);
68
69 /* Helper function which frees memory used by copy-on-written databnlock. */
70 void deg_free_copy_on_write_datablock(struct ID *id_cow);
71
72 /* Callback function for depsgraph operation node which ensures copy-on-write
73  * datablock is ready for use by further evaluation routines.
74  */
75 void deg_evaluate_copy_on_write(struct ::Depsgraph *depsgraph,
76                                 const struct IDNode *id_node);
77
78 /* Check that given ID is properly expanded and does not have any shallow
79  * copies inside.
80   */
81 bool deg_validate_copy_on_write_datablock(ID *id_cow);
82
83 /* Tag given ID block as being copy-on-wtritten. */
84 void deg_tag_copy_on_write_id(struct ID *id_cow, const struct ID *id_orig);
85
86 /* Check whether ID datablock is expanded.
87  *
88  * TODO(sergey): Make it an inline function or a macro.
89  */
90 bool deg_copy_on_write_is_expanded(const struct ID *id_cow);
91
92 /* Check whether copy-on-write datablock is needed for given ID.
93  *
94  * There are some exceptions on datablocks which are covered by dependency graph
95  * but which we don't want to start duplicating.
96  *
97  * This includes images.
98  */
99 bool deg_copy_on_write_is_needed(const ID *id_orig);
100
101 }  // namespace DEG