@@ -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
19221921bool 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);
61756172error:
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
2048120478static
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
2049120490static
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
2055020529static
@@ -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