1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-10 13:00:37 +00:00

Rewrite render code to be more cache and thread friendly.

This commit is contained in:
reduz
2021-01-04 09:33:25 -03:00
parent 9a2f18f8e7
commit 5d2a1d7892
12 changed files with 1167 additions and 919 deletions

View File

@@ -32,28 +32,31 @@
RendererStorage *RendererStorage::base_singleton = nullptr;
void RendererStorage::InstanceDependency::instance_notify_changed(bool p_aabb, bool p_dependencies) {
for (Map<InstanceBaseDependency *, uint32_t>::Element *E = instances.front(); E; E = E->next()) {
E->key()->dependency_changed(p_aabb, p_dependencies);
void RendererStorage::Dependency::changed_notify(DependencyChangedNotification p_notification) {
for (Map<DependencyTracker *, uint32_t>::Element *E = instances.front(); E; E = E->next()) {
if (E->key()->changed_callback) {
E->key()->changed_callback(p_notification, E->key());
}
}
}
void RendererStorage::InstanceDependency::instance_notify_deleted(RID p_deleted) {
for (Map<InstanceBaseDependency *, uint32_t>::Element *E = instances.front(); E; E = E->next()) {
E->key()->dependency_deleted(p_deleted);
void RendererStorage::Dependency::deleted_notify(const RID &p_rid) {
for (Map<DependencyTracker *, uint32_t>::Element *E = instances.front(); E; E = E->next()) {
if (E->key()->deleted_callback) {
E->key()->deleted_callback(p_rid, E->key());
}
}
for (Map<InstanceBaseDependency *, uint32_t>::Element *E = instances.front(); E; E = E->next()) {
for (Map<DependencyTracker *, uint32_t>::Element *E = instances.front(); E; E = E->next()) {
E->key()->dependencies.erase(this);
}
instances.clear();
}
RendererStorage::InstanceDependency::~InstanceDependency() {
RendererStorage::Dependency::~Dependency() {
#ifdef DEBUG_ENABLED
if (instances.size()) {
WARN_PRINT("Leaked instance dependency: Bug - did not call instance_notify_deleted when freeing.");
for (Map<InstanceBaseDependency *, uint32_t>::Element *E = instances.front(); E; E = E->next()) {
for (Map<DependencyTracker *, uint32_t>::Element *E = instances.front(); E; E = E->next()) {
E->key()->dependencies.erase(this);
}
}