libobs: Defer and refactor scene item transform update
Defers updating the scene item transform to the graphics thread to reduce the number of transform update calls.
This commit is contained in:
@@ -382,6 +382,8 @@ static void update_item_transform(struct obs_scene_item *item)
|
||||
calldata_init_fixed(¶ms, stack, sizeof(stack));
|
||||
calldata_set_ptr(¶ms, "item", item);
|
||||
signal_parent(item->parent, "item_transform", ¶ms);
|
||||
|
||||
os_atomic_set_bool(&item->update_transform, false);
|
||||
}
|
||||
|
||||
static inline bool source_size_changed(struct obs_scene_item *item)
|
||||
@@ -521,6 +523,33 @@ static void scene_video_tick(void *data, float seconds)
|
||||
UNUSED_PARAMETER(seconds);
|
||||
}
|
||||
|
||||
/* assumes video lock */
|
||||
static void update_transforms_and_prune_sources(obs_scene_t *scene,
|
||||
struct darray *remove_items)
|
||||
{
|
||||
struct obs_scene_item *item = scene->first_item;
|
||||
|
||||
while (item) {
|
||||
if (obs_source_removed(item->source)) {
|
||||
struct obs_scene_item *del_item = item;
|
||||
item = item->next;
|
||||
|
||||
remove_without_release(del_item);
|
||||
darray_push_back(sizeof(struct obs_scene_item*),
|
||||
remove_items, &del_item);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (os_atomic_load_bool(&item->update_transform) ||
|
||||
source_size_changed(item)) {
|
||||
|
||||
update_item_transform(item);
|
||||
}
|
||||
|
||||
item = item->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void scene_video_render(void *data, gs_effect_t *effect)
|
||||
{
|
||||
DARRAY(struct obs_scene_item*) remove_items;
|
||||
@@ -530,24 +559,12 @@ static void scene_video_render(void *data, gs_effect_t *effect)
|
||||
da_init(remove_items);
|
||||
|
||||
video_lock(scene);
|
||||
item = scene->first_item;
|
||||
|
||||
gs_blend_state_push();
|
||||
gs_reset_blend_state();
|
||||
|
||||
item = scene->first_item;
|
||||
while (item) {
|
||||
if (obs_source_removed(item->source)) {
|
||||
struct obs_scene_item *del_item = item;
|
||||
item = item->next;
|
||||
|
||||
remove_without_release(del_item);
|
||||
da_push_back(remove_items, &del_item);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (source_size_changed(item))
|
||||
update_item_transform(item);
|
||||
|
||||
if (item->user_visible)
|
||||
render_item(item);
|
||||
|
||||
@@ -1551,7 +1568,7 @@ void obs_sceneitem_set_pos(obs_sceneitem_t *item, const struct vec2 *pos)
|
||||
{
|
||||
if (item) {
|
||||
vec2_copy(&item->pos, pos);
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1559,7 +1576,7 @@ void obs_sceneitem_set_rot(obs_sceneitem_t *item, float rot)
|
||||
{
|
||||
if (item) {
|
||||
item->rot = rot;
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1567,7 +1584,7 @@ void obs_sceneitem_set_scale(obs_sceneitem_t *item, const struct vec2 *scale)
|
||||
{
|
||||
if (item) {
|
||||
vec2_copy(&item->scale, scale);
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1575,7 +1592,7 @@ void obs_sceneitem_set_alignment(obs_sceneitem_t *item, uint32_t alignment)
|
||||
{
|
||||
if (item) {
|
||||
item->align = alignment;
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1671,7 +1688,7 @@ void obs_sceneitem_set_bounds_type(obs_sceneitem_t *item,
|
||||
{
|
||||
if (item) {
|
||||
item->bounds_type = type;
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1680,7 +1697,7 @@ void obs_sceneitem_set_bounds_alignment(obs_sceneitem_t *item,
|
||||
{
|
||||
if (item) {
|
||||
item->bounds_align = alignment;
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1688,7 +1705,7 @@ void obs_sceneitem_set_bounds(obs_sceneitem_t *item, const struct vec2 *bounds)
|
||||
{
|
||||
if (item) {
|
||||
item->bounds = *bounds;
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1755,7 +1772,7 @@ void obs_sceneitem_set_info(obs_sceneitem_t *item,
|
||||
item->bounds_type = info->bounds_type;
|
||||
item->bounds_align = info->bounds_alignment;
|
||||
item->bounds = info->bounds;
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1966,7 +1983,7 @@ void obs_sceneitem_set_crop(obs_sceneitem_t *item,
|
||||
if (item->crop.bottom < 0) item->crop.bottom = 0;
|
||||
obs_leave_graphics();
|
||||
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
|
||||
void obs_sceneitem_get_crop(const obs_sceneitem_t *item,
|
||||
@@ -2000,7 +2017,7 @@ void obs_sceneitem_set_scale_filter(obs_sceneitem_t *item,
|
||||
|
||||
obs_leave_graphics();
|
||||
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
|
||||
enum obs_scale_type obs_sceneitem_get_scale_filter(
|
||||
@@ -2024,7 +2041,7 @@ void obs_sceneitem_defer_update_end(obs_sceneitem_t *item)
|
||||
return;
|
||||
|
||||
if (os_atomic_dec_long(&item->defer_update) == 0)
|
||||
update_item_transform(item);
|
||||
os_atomic_set_bool(&item->update_transform, true);
|
||||
}
|
||||
|
||||
int64_t obs_sceneitem_get_id(const obs_sceneitem_t *item)
|
||||
|
Reference in New Issue
Block a user