From 434f27ebdfa5e4c13e361d894ee4e8a56f6f86a7 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 17 Jul 2023 16:11:55 +0200 Subject: [PATCH] Refactor: Use C++ list internally in render pipeline Used for the global list of the Render structures. Using C++ container helps moving towards reliable "real" C++ structure for the Render, without worrying about the offset of the next/prev fields. Should be no functional changes on the user side. --- source/blender/render/intern/pipeline.cc | 25 +++++++++++---------- source/blender/render/intern/render_types.h | 1 - 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/source/blender/render/intern/pipeline.cc b/source/blender/render/intern/pipeline.cc index a8af9f1b03a..101eacfec3c 100644 --- a/source/blender/render/intern/pipeline.cc +++ b/source/blender/render/intern/pipeline.cc @@ -12,6 +12,7 @@ #include #include #include +#include #include "DNA_anim_types.h" #include "DNA_collection_types.h" @@ -127,8 +128,8 @@ /* here we store all renders */ static struct { - ListBase renderlist; -} RenderGlobal = {{nullptr, nullptr}}; + std::forward_list render_list; +} RenderGlobal; /** \} */ @@ -297,7 +298,7 @@ static bool render_scene_has_layers_to_render(Scene *scene, ViewLayer *single_la Render *RE_GetRender(const char *name) { /* search for existing renders */ - LISTBASE_FOREACH (Render *, re, &RenderGlobal.renderlist) { + for (Render *re : RenderGlobal.render_list) { if (STREQLEN(re->name, name, RE_MAXNAME)) { return re; } @@ -497,7 +498,7 @@ Render *RE_NewRender(const char *name) /* new render data struct */ re = MEM_cnew("new render"); - BLI_addtail(&RenderGlobal.renderlist, re); + RenderGlobal.render_list.push_front(re); STRNCPY(re->name, name); BLI_rw_mutex_init(&re->resultmutex); BLI_mutex_init(&re->engine_draw_mutex); @@ -585,14 +586,14 @@ void RE_FreeRender(Render *re) render_result_free(re->result); render_result_free(re->pushedresult); - BLI_remlink(&RenderGlobal.renderlist, re); + RenderGlobal.render_list.remove(re); MEM_freeN(re); } void RE_FreeAllRender() { - while (RenderGlobal.renderlist.first) { - RE_FreeRender(static_cast(RenderGlobal.renderlist.first)); + while (!RenderGlobal.render_list.empty()) { + RE_FreeRender(static_cast(RenderGlobal.render_list.front())); } #ifdef WITH_FREESTYLE @@ -603,7 +604,7 @@ void RE_FreeAllRender() void RE_FreeAllRenderResults() { - LISTBASE_FOREACH (Render *, re, &RenderGlobal.renderlist) { + for (Render *re : RenderGlobal.render_list) { render_result_free(re->result); render_result_free(re->pushedresult); @@ -615,7 +616,7 @@ void RE_FreeAllRenderResults() void RE_FreeAllPersistentData() { - LISTBASE_FOREACH (Render *, re, &RenderGlobal.renderlist) { + for (Render *re : RenderGlobal.render_list) { if (re->engine != nullptr) { BLI_assert(!(re->engine->flag & RE_ENGINE_RENDERING)); RE_engine_free(re->engine); @@ -644,7 +645,7 @@ static void re_gpu_texture_caches_free(Render *re) void RE_FreeGPUTextureCaches() { - LISTBASE_FOREACH (Render *, re, &RenderGlobal.renderlist) { + for (Render *re : RenderGlobal.render_list) { re_gpu_texture_caches_free(re); } } @@ -655,7 +656,7 @@ void RE_FreeUnusedGPUResources() wmWindowManager *wm = static_cast(G_MAIN->wm.first); - LISTBASE_FOREACH (Render *, re, &RenderGlobal.renderlist) { + for (Render *re : RenderGlobal.render_list) { bool do_free = true; LISTBASE_FOREACH (const wmWindow *, win, &wm->windows) { @@ -728,7 +729,7 @@ void RE_FreePersistentData(const Scene *scene) } } else { - LISTBASE_FOREACH (Render *, re, &RenderGlobal.renderlist) { + for (Render *re : RenderGlobal.render_list) { re_free_persistent_data(re); } } diff --git a/source/blender/render/intern/render_types.h b/source/blender/render/intern/render_types.h index ebbdee205e0..30a61ca1318 100644 --- a/source/blender/render/intern/render_types.h +++ b/source/blender/render/intern/render_types.h @@ -36,7 +36,6 @@ struct HighlightedTile { /* controls state of render, everything that's read-only during render stage */ struct Render { - struct Render *next, *prev; char name[RE_MAXNAME]; int slot;