This implements the update cache described in T95401. The cache is currently only used for drawing strokes and sculpting (using the push brush). **Note: Making use of the cache throughout grease pencil will have to be done incrementally in other patches. ** The update cache stores what elements have changed in the original data-block since the last time the eval object was updated. Additionally, the update cache can store multiple updates to the data and minimizes the number of elements that need to be copied. Elements can be tagged using `BKE_gpencil_tag_full_update` and `BKE_gpencil_tag_light_update`. A full update means that the element itself will be copied but also all of the content inside. E.g. when a layer is tagged for a full update, the layer, all the frames inside the layer and all the strokes inside the frames will be copied. A light update means that only the properties of the element are copied without any of the content. E.g. if a layer is tagged with a light update, it will copy the layer name, opacity, transform, etc. When the update cache is in use (e.g. elements have been tagged) then the depsgraph will not trigger a copy-on-write, but an update-on-write. This means that the update cache will be used to determine what elements have changed and then only those elements will be copied over to the eval object. If the update cache is empty or the data block was tagged with a full update, we always fall back to a copy-on-write. Currently, the update cache is only used by the active depsgraph. This is because we need to free the update cache after an update-on-write so it's reset and we need to make sure it is not freed or read by other depsgraphs. Co-authored-by: @yann-lty This patch was contributed by The SPA Studios. Reviewed By: sergey, antoniov, #dependency_graph, pepeland, mendio Maniphest Tasks: T95401 Differential Revision: https://developer.blender.org/D13984
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2019 Blender Foundation.
|
|
* All rights reserved.
|
|
*/
|
|
|
|
/** \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_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"
|
|
#include "intern/eval/deg_eval_runtime_backup_gpencil.h"
|
|
|
|
namespace blender {
|
|
namespace 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-write. 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-write 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 deg
|
|
} // namespace blender
|