diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 4b44ebbf0..ca3cd9a12 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -925,10 +925,9 @@ static void scene_video_tick(void *data, float seconds) } /* assumes video lock */ -static void -update_transforms_and_prune_sources(obs_scene_t *scene, - obs_scene_item_ptr_array_t *remove_items, - obs_sceneitem_t *group_sceneitem) +static void update_transforms_and_prune_sources( + obs_scene_t *scene, obs_scene_item_ptr_array_t *remove_items, + obs_sceneitem_t *group_sceneitem, bool scene_size_changed) { struct obs_scene_item *item = scene->first_item; bool rebuild_group = @@ -951,12 +950,13 @@ update_transforms_and_prune_sources(obs_scene_t *scene, video_lock(group_scene); update_transforms_and_prune_sources(group_scene, - remove_items, item); + remove_items, item, + scene_size_changed); video_unlock(group_scene); } if (os_atomic_load_bool(&item->update_transform) || - source_size_changed(item)) { + source_size_changed(item) || scene_size_changed) { update_item_transform(item, true); rebuild_group = true; @@ -969,6 +969,19 @@ update_transforms_and_prune_sources(obs_scene_t *scene, resize_group(group_sceneitem); } +static inline bool scene_size_changed(obs_scene_t *scene) +{ + uint32_t width = scene_getwidth(scene); + uint32_t height = scene_getheight(scene); + + if (width == scene->last_width && height == scene->last_height) + return false; + + scene->last_width = width; + scene->last_height = height; + return true; +} + static void scene_video_render(void *data, gs_effect_t *effect) { obs_scene_item_ptr_array_t remove_items; @@ -980,7 +993,9 @@ static void scene_video_render(void *data, gs_effect_t *effect) video_lock(scene); if (!scene->is_group) { - update_transforms_and_prune_sources(scene, &remove_items, NULL); + bool size_changed = scene_size_changed(scene); + update_transforms_and_prune_sources(scene, &remove_items, NULL, + size_changed); } gs_blend_state_push(); @@ -4238,7 +4253,7 @@ void obs_scene_prune_sources(obs_scene_t *scene) da_init(remove_items); video_lock(scene); - update_transforms_and_prune_sources(scene, &remove_items, NULL); + update_transforms_and_prune_sources(scene, &remove_items, NULL, false); video_unlock(scene); for (size_t i = 0; i < remove_items.num; i++) diff --git a/libobs/obs-scene.h b/libobs/obs-scene.h index d78e96ad7..97ff2aff7 100644 --- a/libobs/obs-scene.h +++ b/libobs/obs-scene.h @@ -110,6 +110,9 @@ struct obs_scene { uint32_t cx; uint32_t cy; + uint32_t last_width; + uint32_t last_height; + int64_t id_counter; pthread_mutex_t video_mutex;