From 593345a3b1cc902313062a22867051cfa39fca3f Mon Sep 17 00:00:00 2001 From: jp9000 Date: Tue, 24 Jul 2018 02:28:43 -0700 Subject: [PATCH] libobs: Only update scene item texture on frame tick Instead of updating the scene item texture any time update_item_transform() is called, only update it when obs_scene_item::update_transform is called. Prevents having to lock the graphics mutex needlessly. --- libobs/obs-scene.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 70fe0aa65..7f65879a6 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -332,7 +332,7 @@ static inline uint32_t calc_cy(const struct obs_scene_item *item, return (crop_cy > height) ? 2 : (height - crop_cy); } -static void update_item_transform(struct obs_scene_item *item) +static void update_item_transform(struct obs_scene_item *item, bool update_tex) { uint32_t width; uint32_t height; @@ -411,6 +411,9 @@ static void update_item_transform(struct obs_scene_item *item) calldata_set_ptr(¶ms, "item", item); signal_parent(item->parent, "item_transform", ¶ms); + if (!update_tex) + return; + if (item->item_render && !item_texture_enabled(item)) { obs_enter_graphics(); gs_texrender_destroy(item->item_render); @@ -595,7 +598,7 @@ static void update_transforms_and_prune_sources(obs_scene_t *scene, if (os_atomic_load_bool(&item->update_transform) || source_size_changed(item)) { - update_item_transform(item); + update_item_transform(item, true); rebuild_group = true; } @@ -759,7 +762,7 @@ static void scene_load_item(struct obs_scene *scene, obs_data_t *item_data) obs_source_release(source); - update_item_transform(item); + update_item_transform(item, false); } static void scene_load(void *data, obs_data_t *settings) @@ -2296,7 +2299,7 @@ static void remove_group_transform(obs_sceneitem_t *group, get_ungrouped_transform(group, &item->pos, &item->scale, &item->rot); - update_item_transform(item); + update_item_transform(item, false); } static void apply_group_transform(obs_sceneitem_t *item, obs_sceneitem_t *group) @@ -2322,7 +2325,7 @@ static void apply_group_transform(obs_sceneitem_t *item, obs_sceneitem_t *group) item->scale.y = vec4_len(&mat.y); item->rot -= group->rot; - update_item_transform(item); + update_item_transform(item, false); } static bool resize_scene_base(obs_scene_t *scene, @@ -2364,7 +2367,7 @@ static bool resize_scene_base(obs_scene_t *scene, item = scene->first_item; while (item) { vec2_sub(&item->pos, &item->pos, minv); - update_item_transform(item); + update_item_transform(item, false); item = item->next; } @@ -2419,7 +2422,7 @@ static void resize_group(obs_sceneitem_t *group) os_atomic_set_bool(&group->update_group_resize, false); - update_item_transform(group); + update_item_transform(group, false); } obs_sceneitem_t *obs_scene_add_group(obs_scene_t *scene, const char *name)