Skip to content

Commit da0221e

Browse files
committed
Reduce branching in command batching code
1 parent 5b504ed commit da0221e

File tree

5 files changed

+164
-268
lines changed

5 files changed

+164
-268
lines changed

flecs.c

+80-132
Original file line numberDiff line numberDiff line change
@@ -1916,8 +1916,7 @@ void* flecs_defer_set(
19161916
ecs_entity_t entity,
19171917
ecs_entity_t component,
19181918
ecs_size_t size,
1919-
void *value,
1920-
bool need_value);
1919+
void *value);
19211920

19221921
bool flecs_defer_end(
19231922
ecs_world_t *world,
@@ -6143,8 +6142,7 @@ void* ecs_get_mut_id(
61436142

61446143
ecs_stage_t *stage = flecs_stage_from_world(&world);
61456144
if (flecs_defer_cmd(stage)) {
6146-
return flecs_defer_set(
6147-
world, stage, EcsCmdMut, entity, id, 0, NULL, true);
6145+
return flecs_defer_set(world, stage, EcsCmdMut, entity, id, 0, NULL);
61486146
}
61496147

61506148
ecs_record_t *r = flecs_entities_get(world, entity);
@@ -6170,8 +6168,7 @@ void* ecs_get_mut_modified_id(
61706168
ecs_stage_t *stage = flecs_stage_from_world(&world);
61716169
ecs_check(flecs_defer_cmd(stage), ECS_INVALID_PARAMETER, NULL);
61726170

6173-
return flecs_defer_set(
6174-
world, stage, EcsCmdSet, entity, id, 0, NULL, true);
6171+
return flecs_defer_set(world, stage, EcsCmdSet, entity, id, 0, NULL);
61756172
error:
61766173
return NULL;
61776174
}
@@ -6405,8 +6402,7 @@ void* ecs_emplace_id(
64056402
ecs_stage_t *stage = flecs_stage_from_world(&world);
64066403

64076404
if (flecs_defer_cmd(stage)) {
6408-
return flecs_defer_set(world, stage, EcsCmdEmplace, entity, id, 0, NULL,
6409-
true);
6405+
return flecs_defer_set(world, stage, EcsCmdEmplace, entity, id, 0, NULL);
64106406
}
64116407

64126408
ecs_record_t *r = flecs_entities_get(world, entity);
@@ -6496,7 +6492,7 @@ void flecs_copy_ptr_w_id(
64966492
{
64976493
if (flecs_defer_cmd(stage)) {
64986494
flecs_defer_set(world, stage, EcsCmdSet, entity, id,
6499-
flecs_utosize(size), ptr, false);
6495+
flecs_utosize(size), ptr);
65006496
return;
65016497
}
65026498

@@ -6542,7 +6538,7 @@ void flecs_move_ptr_w_id(
65426538
{
65436539
if (flecs_defer_cmd(stage)) {
65446540
flecs_defer_set(world, stage, cmd_kind, entity, id,
6545-
flecs_utosize(size), ptr, false);
6541+
flecs_utosize(size), ptr);
65466542
return;
65476543
}
65486544

@@ -8154,6 +8150,7 @@ bool flecs_defer_end(
81548150
ecs_stage_t *dst_stage = flecs_stage_from_world(&world);
81558151
ecs_commands_t *commands = stage->cmd;
81568152
ecs_vec_t *queue = &commands->queue;
8153+
81578154
if (ecs_vec_count(queue)) {
81588155
ecs_cmd_t *cmds = ecs_vec_first(queue);
81598156
int32_t i, count = ecs_vec_count(queue);
@@ -20479,72 +20476,54 @@ int32_t flecs_relation_depth(
2047920476

2048020477

2048120478
static
20482-
ecs_cmd_t* flecs_cmd_alloc(
20479+
ecs_cmd_t* flecs_cmd_new(
2048320480
ecs_stage_t *stage)
2048420481
{
2048520482
ecs_cmd_t *cmd = ecs_vec_append_t(&stage->allocator, &stage->cmd->queue,
2048620483
ecs_cmd_t);
20487-
ecs_os_zeromem(cmd);
20484+
cmd->is._1.value = NULL;
20485+
cmd->next_for_entity = 0;
20486+
cmd->entry = NULL;
2048820487
return cmd;
2048920488
}
2049020489

2049120490
static
20492-
ecs_cmd_t* flecs_cmd_new(
20491+
ecs_cmd_t* flecs_cmd_new_batched(
2049320492
ecs_stage_t *stage,
20494-
ecs_entity_t e,
20495-
bool is_delete,
20496-
bool can_batch)
20493+
ecs_entity_t e)
2049720494
{
20498-
if (e) {
20499-
ecs_vec_t *cmds = &stage->cmd->queue;
20500-
ecs_cmd_entry_t *first_entry = NULL;
20501-
ecs_cmd_entry_t *entry = flecs_sparse_try_t(
20502-
&stage->cmd->entries, ecs_cmd_entry_t, e);
20495+
ecs_vec_t *cmds = &stage->cmd->queue;
20496+
ecs_cmd_entry_t *entry = flecs_sparse_get_any_t(
20497+
&stage->cmd->entries, ecs_cmd_entry_t, e);
2050320498

20504-
int32_t cur = ecs_vec_count(cmds);
20505-
if (entry) {
20506-
if (entry->first == -1) {
20507-
/* Existing but invalidated entry */
20508-
entry->first = cur;
20509-
first_entry = entry;
20510-
} else {
20511-
int32_t last = entry->last;
20512-
if (entry->last == -1) {
20513-
/* Entity was deleted, don't insert command */
20514-
return NULL;
20515-
}
20516-
20517-
if (can_batch) {
20518-
ecs_cmd_t *arr = ecs_vec_first_t(cmds, ecs_cmd_t);
20519-
ecs_assert(arr[last].entity == e, ECS_INTERNAL_ERROR, NULL);
20520-
ecs_cmd_t *last_op = &arr[last];
20521-
last_op->next_for_entity = cur;
20522-
if (last == entry->first) {
20523-
/* Flip sign bit so flush logic can tell which command
20524-
* is the first for an entity */
20525-
last_op->next_for_entity *= -1;
20526-
}
20527-
}
20528-
}
20529-
} else if (can_batch || is_delete) {
20530-
first_entry = entry = flecs_sparse_ensure_fast_t(
20531-
&stage->cmd->entries, ecs_cmd_entry_t, e);
20499+
int32_t cur = ecs_vec_count(cmds);
20500+
ecs_cmd_t *cmd = flecs_cmd_new(stage);
20501+
if (entry) {
20502+
if (entry->first == -1) {
20503+
/* Existing but invalidated entry */
2053220504
entry->first = cur;
20505+
cmd->entry = entry;
20506+
} else {
20507+
int32_t last = entry->last;
20508+
ecs_cmd_t *arr = ecs_vec_first_t(cmds, ecs_cmd_t);
20509+
ecs_assert(arr[last].entity == e, ECS_INTERNAL_ERROR, NULL);
20510+
ecs_cmd_t *last_op = &arr[last];
20511+
last_op->next_for_entity = cur;
20512+
if (last == entry->first) {
20513+
/* Flip sign bit so flush logic can tell which command
20514+
* is the first for an entity */
20515+
last_op->next_for_entity *= -1;
20516+
}
2053320517
}
20534-
if (can_batch) {
20535-
entry->last = cur;
20536-
}
20537-
if (is_delete) {
20538-
/* Prevent insertion of more commands for entity */
20539-
entry->last = -1;
20540-
}
20541-
20542-
ecs_cmd_t *cmd = flecs_cmd_alloc(stage);
20543-
cmd->entry = first_entry;
20544-
return cmd;
20518+
} else {
20519+
cmd->entry = entry = flecs_sparse_ensure_fast_t(
20520+
&stage->cmd->entries, ecs_cmd_entry_t, e);
20521+
entry->first = cur;
2054520522
}
2054620523

20547-
return flecs_cmd_alloc(stage);
20524+
entry->last = cur;
20525+
20526+
return cmd;
2054820527
}
2054920528

2055020529
static
@@ -20646,7 +20625,7 @@ bool flecs_defer_modified(
2064620625
ecs_id_t id)
2064720626
{
2064820627
if (flecs_defer_cmd(stage)) {
20649-
ecs_cmd_t *cmd = flecs_cmd_new(stage, entity, false, true);
20628+
ecs_cmd_t *cmd = flecs_cmd_new_batched(stage, entity);
2065020629
if (cmd) {
2065120630
cmd->kind = EcsCmdModified;
2065220631
cmd->id = id;
@@ -20664,13 +20643,11 @@ bool flecs_defer_clone(
2066420643
bool clone_value)
2066520644
{
2066620645
if (flecs_defer_cmd(stage)) {
20667-
ecs_cmd_t *cmd = flecs_cmd_new(stage, entity, false, false);
20668-
if (cmd) {
20669-
cmd->kind = EcsCmdClone;
20670-
cmd->id = src;
20671-
cmd->entity = entity;
20672-
cmd->is._1.clone_value = clone_value;
20673-
}
20646+
ecs_cmd_t *cmd = flecs_cmd_new(stage);
20647+
cmd->kind = EcsCmdClone;
20648+
cmd->id = src;
20649+
cmd->entity = entity;
20650+
cmd->is._1.clone_value = clone_value;
2067420651
return true;
2067520652
}
2067620653
return false;
@@ -20683,13 +20660,11 @@ bool flecs_defer_path(
2068320660
const char *name)
2068420661
{
2068520662
if (stage->defer > 0) {
20686-
ecs_cmd_t *cmd = flecs_cmd_new(stage, entity, false, false);
20687-
if (cmd) {
20688-
cmd->kind = EcsCmdPath;
20689-
cmd->entity = entity;
20690-
cmd->id = parent;
20691-
cmd->is._1.value = ecs_os_strdup(name);
20692-
}
20663+
ecs_cmd_t *cmd = flecs_cmd_new(stage);
20664+
cmd->kind = EcsCmdPath;
20665+
cmd->entity = entity;
20666+
cmd->id = parent;
20667+
cmd->is._1.value = ecs_os_strdup(name);
2069320668
return true;
2069420669
}
2069520670
return false;
@@ -20700,11 +20675,9 @@ bool flecs_defer_delete(
2070020675
ecs_entity_t entity)
2070120676
{
2070220677
if (flecs_defer_cmd(stage)) {
20703-
ecs_cmd_t *cmd = flecs_cmd_new(stage, entity, true, false);
20704-
if (cmd) {
20705-
cmd->kind = EcsCmdDelete;
20706-
cmd->entity = entity;
20707-
}
20678+
ecs_cmd_t *cmd = flecs_cmd_new(stage);
20679+
cmd->kind = EcsCmdDelete;
20680+
cmd->entity = entity;
2070820681
return true;
2070920682
}
2071020683
return false;
@@ -20715,11 +20688,9 @@ bool flecs_defer_clear(
2071520688
ecs_entity_t entity)
2071620689
{
2071720690
if (flecs_defer_cmd(stage)) {
20718-
ecs_cmd_t *cmd = flecs_cmd_new(stage, entity, false, true);
20719-
if (cmd) {
20720-
cmd->kind = EcsCmdClear;
20721-
cmd->entity = entity;
20722-
}
20691+
ecs_cmd_t *cmd = flecs_cmd_new_batched(stage, entity);
20692+
cmd->kind = EcsCmdClear;
20693+
cmd->entity = entity;
2072320694
return true;
2072420695
}
2072520696
return false;
@@ -20731,7 +20702,7 @@ bool flecs_defer_on_delete_action(
2073120702
ecs_entity_t action)
2073220703
{
2073320704
if (flecs_defer_cmd(stage)) {
20734-
ecs_cmd_t *cmd = flecs_cmd_alloc(stage);
20705+
ecs_cmd_t *cmd = flecs_cmd_new(stage);
2073520706
cmd->kind = EcsCmdOnDeleteAction;
2073620707
cmd->id = id;
2073720708
cmd->entity = action;
@@ -20747,12 +20718,10 @@ bool flecs_defer_enable(
2074720718
bool enable)
2074820719
{
2074920720
if (flecs_defer_cmd(stage)) {
20750-
ecs_cmd_t *cmd = flecs_cmd_new(stage, entity, false, false);
20751-
if (cmd) {
20752-
cmd->kind = enable ? EcsCmdEnable : EcsCmdDisable;
20753-
cmd->entity = entity;
20754-
cmd->id = id;
20755-
}
20721+
ecs_cmd_t *cmd = flecs_cmd_new(stage);
20722+
cmd->kind = enable ? EcsCmdEnable : EcsCmdDisable;
20723+
cmd->entity = entity;
20724+
cmd->id = id;
2075620725
return true;
2075720726
}
2075820727
return false;
@@ -20777,14 +20746,12 @@ bool flecs_defer_bulk_new(
2077720746
*ids_out = ids;
2077820747

2077920748
/* Store data in op */
20780-
ecs_cmd_t *cmd = flecs_cmd_alloc(stage);
20781-
if (cmd) {
20782-
cmd->kind = EcsCmdBulkNew;
20783-
cmd->id = id;
20784-
cmd->is._n.entities = ids;
20785-
cmd->is._n.count = count;
20786-
}
20787-
20749+
ecs_cmd_t *cmd = flecs_cmd_new(stage);
20750+
cmd->kind = EcsCmdBulkNew;
20751+
cmd->id = id;
20752+
cmd->is._n.entities = ids;
20753+
cmd->is._n.count = count;
20754+
cmd->entity = 0;
2078820755
return true;
2078920756
}
2079020757
return false;
@@ -20797,12 +20764,10 @@ bool flecs_defer_add(
2079720764
{
2079820765
if (flecs_defer_cmd(stage)) {
2079920766
ecs_assert(id != 0, ECS_INTERNAL_ERROR, NULL);
20800-
ecs_cmd_t *cmd = flecs_cmd_new(stage, entity, false, true);
20801-
if (cmd) {
20802-
cmd->kind = EcsCmdAdd;
20803-
cmd->id = id;
20804-
cmd->entity = entity;
20805-
}
20767+
ecs_cmd_t *cmd = flecs_cmd_new_batched(stage, entity);
20768+
cmd->kind = EcsCmdAdd;
20769+
cmd->id = id;
20770+
cmd->entity = entity;
2080620771
return true;
2080720772
}
2080820773
return false;
@@ -20815,12 +20780,10 @@ bool flecs_defer_remove(
2081520780
{
2081620781
if (flecs_defer_cmd(stage)) {
2081720782
ecs_assert(id != 0, ECS_INTERNAL_ERROR, NULL);
20818-
ecs_cmd_t *cmd = flecs_cmd_new(stage, entity, false, true);
20819-
if (cmd) {
20820-
cmd->kind = EcsCmdRemove;
20821-
cmd->id = id;
20822-
cmd->entity = entity;
20823-
}
20783+
ecs_cmd_t *cmd = flecs_cmd_new_batched(stage, entity);
20784+
cmd->kind = EcsCmdRemove;
20785+
cmd->id = id;
20786+
cmd->entity = entity;
2082420787
return true;
2082520788
}
2082620789
return false;
@@ -20833,20 +20796,9 @@ void* flecs_defer_set(
2083320796
ecs_entity_t entity,
2083420797
ecs_id_t id,
2083520798
ecs_size_t size,
20836-
void *value,
20837-
bool need_value)
20799+
void *value)
2083820800
{
20839-
ecs_cmd_t *cmd = flecs_cmd_new(stage, entity, false, true);
20840-
if (!cmd) {
20841-
if (need_value) {
20842-
/* Entity is deleted by a previous command, but we still need to
20843-
* return a temporary storage to the application. */
20844-
cmd_kind = EcsCmdSkip;
20845-
} else {
20846-
/* No value needs to be returned, we can drop the command */
20847-
return NULL;
20848-
}
20849-
}
20801+
ecs_cmd_t *cmd = flecs_cmd_new_batched(stage, entity);
2085020802

2085120803
/* Find type info for id */
2085220804
const ecs_type_info_t *ti = NULL;
@@ -20977,7 +20929,7 @@ void* flecs_defer_set(
2097720929
* already deleted. */
2097820930
return cmd_value;
2097920931
}
20980-
cmd = flecs_cmd_alloc(stage);
20932+
cmd = flecs_cmd_new(stage);
2098120933
}
2098220934

2098320935
if (!existing) {
@@ -21011,11 +20963,7 @@ void flecs_enqueue(
2101120963
ecs_stage_t *stage,
2101220964
ecs_event_desc_t *desc)
2101320965
{
21014-
ecs_cmd_t *cmd = flecs_cmd_new(stage, desc->entity, false, false);
21015-
if (!cmd) {
21016-
return; /* Entity was deleted */
21017-
}
21018-
20966+
ecs_cmd_t *cmd = flecs_cmd_new(stage);
2101920967
cmd->kind = EcsCmdEvent;
2102020968
cmd->entity = desc->entity;
2102120969

0 commit comments

Comments
 (0)