The depsgraph CoW mechanism is a bit of a misnomer. It creates an evaluated copy for data-blocks regardless of whether the copy will actually be written to. The point is to have physical separation between original and evaluated data. This is in contrast to the commonly used performance improvement of keeping a user count and copying data implicitly when it needs to be changed. In Blender code we call this "implicit sharing" instead. Importantly, the dependency graph has no idea about the _actual_ CoW behavior in Blender. Renaming this functionality in the despgraph removes some of the confusion that comes up when talking about this, and will hopefully make the depsgraph less confusing to understand initially too. Wording like "the evaluated copy" (as opposed to the original data-block) has also become common anyway. Pull Request: https://projects.blender.org/blender/blender/pulls/118338
63 lines
1.8 KiB
C++
63 lines
1.8 KiB
C++
/* SPDX-FileCopyrightText: 2019 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup depsgraph
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "DNA_ID.h"
|
|
|
|
#include "intern/eval/deg_eval_runtime_backup_animation.h"
|
|
#include "intern/eval/deg_eval_runtime_backup_gpencil.h"
|
|
#include "intern/eval/deg_eval_runtime_backup_movieclip.h"
|
|
#include "intern/eval/deg_eval_runtime_backup_object.h"
|
|
#include "intern/eval/deg_eval_runtime_backup_scene.h"
|
|
#include "intern/eval/deg_eval_runtime_backup_sound.h"
|
|
#include "intern/eval/deg_eval_runtime_backup_volume.h"
|
|
|
|
namespace blender::deg {
|
|
|
|
struct Depsgraph;
|
|
|
|
class RuntimeBackup {
|
|
public:
|
|
explicit RuntimeBackup(const Depsgraph *depsgraph);
|
|
|
|
/* NOTE: Will reset all runtime fields which has been backed up to nullptr. */
|
|
void init_from_id(ID *id);
|
|
|
|
/* Restore fields to the given ID. */
|
|
void restore_to_id(ID *id);
|
|
|
|
/* Denotes whether init_from_id did put anything into the backup storage.
|
|
* This will not be the case when init_from_id() is called for an ID which has never been
|
|
* copied-on-eval. In this case there is no need to backup or restore anything.
|
|
*
|
|
* It also allows to have restore() logic to be symmetrical to init() without need to worry
|
|
* that init() might not have happened.
|
|
*
|
|
* In practice this is used by audio system to lock audio while scene is going through
|
|
* copy-on-evaluation mechanism. */
|
|
bool have_backup;
|
|
|
|
/* Struct members of the ID pointer. */
|
|
struct {
|
|
void *py_instance;
|
|
} id_data;
|
|
|
|
AnimationBackup animation_backup;
|
|
SceneBackup scene_backup;
|
|
SoundBackup sound_backup;
|
|
ObjectRuntimeBackup object_backup;
|
|
DrawDataList drawdata_backup;
|
|
DrawDataList *drawdata_ptr;
|
|
MovieClipBackup movieclip_backup;
|
|
VolumeBackup volume_backup;
|
|
GPencilBackup gpencil_backup;
|
|
};
|
|
|
|
} // namespace blender::deg
|