diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-08-25 18:59:41 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-08-26 13:09:03 +0300 |
commit | c52db4c4cf526402bded49ae192fbb6e3191e687 (patch) | |
tree | 0e6eae892dedeb7158637063ba3dbb93ab7146e2 /source/blender/render | |
parent | ec66b3ef9b02f528e7111c1da2ad19aeda9ab659 (diff) |
Decouple highlighted tiles from RenderPart
Should be no visible change on user side.
Preparing for render parts removal as part of Cycles X project.
Differential Revision: https://developer.blender.org/D12317
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/engine.c | 83 | ||||
-rw-r--r-- | source/blender/render/intern/pipeline.c | 6 | ||||
-rw-r--r-- | source/blender/render/intern/render_types.h | 8 |
3 files changed, 72 insertions, 25 deletions
diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c index 1510587502b..481a6662cc0 100644 --- a/source/blender/render/intern/engine.c +++ b/source/blender/render/intern/engine.c @@ -291,6 +291,15 @@ static RenderPart *get_part_from_result(Render *re, RenderResult *result) return BLI_ghash_lookup(re->parts, &key); } +static HighlightedTile highlighted_tile_from_result_get(Render *re, RenderResult *result) +{ + HighlightedTile tile; + tile.rect = result->tilerect; + BLI_rcti_translate(&tile.rect, re->disprect.xmin, re->disprect.ymin); + + return tile; +} + RenderResult *RE_engine_begin_result( RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname) { @@ -426,6 +435,30 @@ void RE_engine_end_result( } } + if (re->engine && (re->engine->flag & RE_ENGINE_HIGHLIGHT_TILES)) { + BLI_mutex_lock(&re->highlighted_tiles_mutex); + + if (re->highlighted_tiles == NULL) { + re->highlighted_tiles = BLI_gset_new( + BLI_ghashutil_inthash_v4_p, BLI_ghashutil_inthash_v4_cmp, "highlighted tiles"); + } + + HighlightedTile tile = highlighted_tile_from_result_get(re, result); + if (highlight) { + void **tile_in_set; + if (!BLI_gset_ensure_p_ex(re->highlighted_tiles, &tile, &tile_in_set)) { + *tile_in_set = MEM_mallocN(sizeof(HighlightedTile), __func__); + memcpy(*tile_in_set, &tile, sizeof(tile)); + } + BLI_gset_add(re->highlighted_tiles, &tile); + } + else { + BLI_gset_remove(re->highlighted_tiles, &tile, MEM_freeN); + } + + BLI_mutex_unlock(&re->highlighted_tiles_mutex); + } + if (!cancel || merge_results) { if (re->result->do_exr_tile) { if (!cancel && merge_results) { @@ -597,43 +630,43 @@ rcti *RE_engine_get_current_tiles(Render *re, int *r_total_tiles, bool *r_needs_ rcti *tiles = tiles_static; int allocation_size = BLENDER_MAX_THREADS; - BLI_rw_mutex_lock(&re->partsmutex, THREAD_LOCK_READ); + BLI_mutex_lock(&re->highlighted_tiles_mutex); *r_needs_free = false; - if (!re->parts || (re->engine && (re->engine->flag & RE_ENGINE_HIGHLIGHT_TILES) == 0)) { + if (re->highlighted_tiles == NULL) { *r_total_tiles = 0; - BLI_rw_mutex_unlock(&re->partsmutex); + BLI_mutex_unlock(&re->highlighted_tiles_mutex); return NULL; } - GHashIterator pa_iter; - GHASH_ITER (pa_iter, re->parts) { - RenderPart *pa = BLI_ghashIterator_getValue(&pa_iter); - if (pa->status == PART_STATUS_IN_PROGRESS) { - if (total_tiles >= allocation_size) { - /* Just in case we're using crazy network rendering with more - * workers than BLENDER_MAX_THREADS. + GSET_FOREACH_BEGIN (HighlightedTile *, tile, re->highlighted_tiles) { + if (total_tiles >= allocation_size) { + /* Just in case we're using crazy network rendering with more + * workers than BLENDER_MAX_THREADS. + */ + allocation_size += allocation_step; + if (tiles == tiles_static) { + /* Can not realloc yet, tiles are pointing to a + * stack memory. */ - allocation_size += allocation_step; - if (tiles == tiles_static) { - /* Can not realloc yet, tiles are pointing to a - * stack memory. - */ - tiles = MEM_mallocN(allocation_size * sizeof(rcti), "current engine tiles"); - } - else { - tiles = MEM_reallocN(tiles, allocation_size * sizeof(rcti)); - } - *r_needs_free = true; + tiles = MEM_mallocN(allocation_size * sizeof(rcti), "current engine tiles"); } - tiles[total_tiles] = pa->disprect; - - total_tiles++; + else { + tiles = MEM_reallocN(tiles, allocation_size * sizeof(rcti)); + } + *r_needs_free = true; } + tiles[total_tiles] = tile->rect; + + total_tiles++; } - BLI_rw_mutex_unlock(&re->partsmutex); + GSET_FOREACH_END(); + + BLI_mutex_unlock(&re->highlighted_tiles_mutex); + *r_total_tiles = total_tiles; + return tiles; } diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c index 9ef52b4bf41..bf42adbab87 100644 --- a/source/blender/render/intern/pipeline.c +++ b/source/blender/render/intern/pipeline.c @@ -569,6 +569,7 @@ Render *RE_NewRender(const char *name) BLI_strncpy(re->name, name, RE_MAXNAME); BLI_rw_mutex_init(&re->resultmutex); BLI_rw_mutex_init(&re->partsmutex); + BLI_mutex_init(&re->highlighted_tiles_mutex); } RE_InitRenderCB(re); @@ -633,12 +634,17 @@ void RE_FreeRender(Render *re) BLI_rw_mutex_end(&re->resultmutex); BLI_rw_mutex_end(&re->partsmutex); + BLI_mutex_end(&re->highlighted_tiles_mutex); BLI_freelistN(&re->view_layers); BLI_freelistN(&re->r.views); BKE_curvemapping_free_data(&re->r.mblur_shutter_curve); + if (re->highlighted_tiles != NULL) { + BLI_gset_free(re->highlighted_tiles, MEM_freeN); + } + /* main dbase can already be invalid now, some database-free code checks it */ re->main = NULL; re->scene = NULL; diff --git a/source/blender/render/intern/render_types.h b/source/blender/render/intern/render_types.h index 50b684beba9..d2d2b499495 100644 --- a/source/blender/render/intern/render_types.h +++ b/source/blender/render/intern/render_types.h @@ -37,6 +37,7 @@ #include "RE_pipeline.h" struct GHash; +struct GSet; struct Main; struct Object; struct RenderEngine; @@ -59,6 +60,10 @@ typedef struct RenderPart { short status; } RenderPart; +typedef struct HighlightedTile { + rcti rect; +} HighlightedTile; + enum { /* PART_STATUS_NONE = 0, */ /* UNUSED */ PART_STATUS_IN_PROGRESS = 1, @@ -118,6 +123,9 @@ struct Render { ThreadRWMutex partsmutex; struct GHash *parts; + ThreadMutex highlighted_tiles_mutex; + struct GSet *highlighted_tiles; + /* render engine */ struct RenderEngine *engine; |