@@ -8154,6 +8154,7 @@ bool flecs_defer_end(
8154
8154
ecs_stage_t *dst_stage = flecs_stage_from_world(&world);
8155
8155
ecs_commands_t *commands = stage->cmd;
8156
8156
ecs_vec_t *queue = &commands->queue;
8157
+
8157
8158
if (ecs_vec_count(queue)) {
8158
8159
ecs_cmd_t *cmds = ecs_vec_first(queue);
8159
8160
int32_t i, count = ecs_vec_count(queue);
@@ -20479,72 +20480,54 @@ int32_t flecs_relation_depth(
20479
20480
20480
20481
20481
20482
static
20482
- ecs_cmd_t* flecs_cmd_alloc (
20483
+ ecs_cmd_t* flecs_cmd_new (
20483
20484
ecs_stage_t *stage)
20484
20485
{
20485
20486
ecs_cmd_t *cmd = ecs_vec_append_t(&stage->allocator, &stage->cmd->queue,
20486
20487
ecs_cmd_t);
20487
- ecs_os_zeromem(cmd);
20488
+ cmd->is._1.value = NULL;
20489
+ cmd->next_for_entity = 0;
20490
+ cmd->entry = NULL;
20488
20491
return cmd;
20489
20492
}
20490
20493
20491
20494
static
20492
- ecs_cmd_t* flecs_cmd_new (
20495
+ ecs_cmd_t* flecs_cmd_new_batched (
20493
20496
ecs_stage_t *stage,
20494
- ecs_entity_t e,
20495
- bool is_delete,
20496
- bool can_batch)
20497
+ ecs_entity_t e)
20497
20498
{
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);
20499
+ ecs_vec_t *cmds = &stage->cmd->queue;
20500
+ ecs_cmd_entry_t *entry = flecs_sparse_get_any_t(
20501
+ &stage->cmd->entries, ecs_cmd_entry_t, e);
20503
20502
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);
20503
+ int32_t cur = ecs_vec_count(cmds);
20504
+ ecs_cmd_t *cmd = flecs_cmd_new(stage);
20505
+ if (entry) {
20506
+ if (entry->first == -1) {
20507
+ /* Existing but invalidated entry */
20532
20508
entry->first = cur;
20509
+ cmd->entry = entry;
20510
+ } else {
20511
+ int32_t last = entry->last;
20512
+ ecs_cmd_t *arr = ecs_vec_first_t(cmds, ecs_cmd_t);
20513
+ ecs_assert(arr[last].entity == e, ECS_INTERNAL_ERROR, NULL);
20514
+ ecs_cmd_t *last_op = &arr[last];
20515
+ last_op->next_for_entity = cur;
20516
+ if (last == entry->first) {
20517
+ /* Flip sign bit so flush logic can tell which command
20518
+ * is the first for an entity */
20519
+ last_op->next_for_entity *= -1;
20520
+ }
20533
20521
}
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;
20522
+ } else {
20523
+ cmd->entry = entry = flecs_sparse_ensure_fast_t(
20524
+ &stage->cmd->entries, ecs_cmd_entry_t, e);
20525
+ entry->first = cur;
20545
20526
}
20546
20527
20547
- return flecs_cmd_alloc(stage);
20528
+ entry->last = cur;
20529
+
20530
+ return cmd;
20548
20531
}
20549
20532
20550
20533
static
@@ -20646,7 +20629,7 @@ bool flecs_defer_modified(
20646
20629
ecs_id_t id)
20647
20630
{
20648
20631
if (flecs_defer_cmd(stage)) {
20649
- ecs_cmd_t *cmd = flecs_cmd_new (stage, entity, false, true );
20632
+ ecs_cmd_t *cmd = flecs_cmd_new_batched (stage, entity);
20650
20633
if (cmd) {
20651
20634
cmd->kind = EcsCmdModified;
20652
20635
cmd->id = id;
@@ -20664,13 +20647,11 @@ bool flecs_defer_clone(
20664
20647
bool clone_value)
20665
20648
{
20666
20649
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
- }
20650
+ ecs_cmd_t *cmd = flecs_cmd_new(stage);
20651
+ cmd->kind = EcsCmdClone;
20652
+ cmd->id = src;
20653
+ cmd->entity = entity;
20654
+ cmd->is._1.clone_value = clone_value;
20674
20655
return true;
20675
20656
}
20676
20657
return false;
@@ -20683,13 +20664,11 @@ bool flecs_defer_path(
20683
20664
const char *name)
20684
20665
{
20685
20666
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
- }
20667
+ ecs_cmd_t *cmd = flecs_cmd_new(stage);
20668
+ cmd->kind = EcsCmdPath;
20669
+ cmd->entity = entity;
20670
+ cmd->id = parent;
20671
+ cmd->is._1.value = ecs_os_strdup(name);
20693
20672
return true;
20694
20673
}
20695
20674
return false;
@@ -20700,11 +20679,9 @@ bool flecs_defer_delete(
20700
20679
ecs_entity_t entity)
20701
20680
{
20702
20681
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
- }
20682
+ ecs_cmd_t *cmd = flecs_cmd_new(stage);
20683
+ cmd->kind = EcsCmdDelete;
20684
+ cmd->entity = entity;
20708
20685
return true;
20709
20686
}
20710
20687
return false;
@@ -20715,11 +20692,9 @@ bool flecs_defer_clear(
20715
20692
ecs_entity_t entity)
20716
20693
{
20717
20694
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
- }
20695
+ ecs_cmd_t *cmd = flecs_cmd_new_batched(stage, entity);
20696
+ cmd->kind = EcsCmdClear;
20697
+ cmd->entity = entity;
20723
20698
return true;
20724
20699
}
20725
20700
return false;
@@ -20731,7 +20706,7 @@ bool flecs_defer_on_delete_action(
20731
20706
ecs_entity_t action)
20732
20707
{
20733
20708
if (flecs_defer_cmd(stage)) {
20734
- ecs_cmd_t *cmd = flecs_cmd_alloc (stage);
20709
+ ecs_cmd_t *cmd = flecs_cmd_new (stage);
20735
20710
cmd->kind = EcsCmdOnDeleteAction;
20736
20711
cmd->id = id;
20737
20712
cmd->entity = action;
@@ -20747,12 +20722,10 @@ bool flecs_defer_enable(
20747
20722
bool enable)
20748
20723
{
20749
20724
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
- }
20725
+ ecs_cmd_t *cmd = flecs_cmd_new(stage);
20726
+ cmd->kind = enable ? EcsCmdEnable : EcsCmdDisable;
20727
+ cmd->entity = entity;
20728
+ cmd->id = id;
20756
20729
return true;
20757
20730
}
20758
20731
return false;
@@ -20777,14 +20750,12 @@ bool flecs_defer_bulk_new(
20777
20750
*ids_out = ids;
20778
20751
20779
20752
/* 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
-
20753
+ ecs_cmd_t *cmd = flecs_cmd_new(stage);
20754
+ cmd->kind = EcsCmdBulkNew;
20755
+ cmd->id = id;
20756
+ cmd->is._n.entities = ids;
20757
+ cmd->is._n.count = count;
20758
+ cmd->entity = 0;
20788
20759
return true;
20789
20760
}
20790
20761
return false;
@@ -20797,12 +20768,10 @@ bool flecs_defer_add(
20797
20768
{
20798
20769
if (flecs_defer_cmd(stage)) {
20799
20770
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
- }
20771
+ ecs_cmd_t *cmd = flecs_cmd_new_batched(stage, entity);
20772
+ cmd->kind = EcsCmdAdd;
20773
+ cmd->id = id;
20774
+ cmd->entity = entity;
20806
20775
return true;
20807
20776
}
20808
20777
return false;
@@ -20815,12 +20784,10 @@ bool flecs_defer_remove(
20815
20784
{
20816
20785
if (flecs_defer_cmd(stage)) {
20817
20786
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
- }
20787
+ ecs_cmd_t *cmd = flecs_cmd_new_batched(stage, entity);
20788
+ cmd->kind = EcsCmdRemove;
20789
+ cmd->id = id;
20790
+ cmd->entity = entity;
20824
20791
return true;
20825
20792
}
20826
20793
return false;
@@ -20836,17 +20803,7 @@ void* flecs_defer_set(
20836
20803
void *value,
20837
20804
bool need_value)
20838
20805
{
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
- }
20806
+ ecs_cmd_t *cmd = flecs_cmd_new_batched(stage, entity);
20850
20807
20851
20808
/* Find type info for id */
20852
20809
const ecs_type_info_t *ti = NULL;
@@ -20977,7 +20934,7 @@ void* flecs_defer_set(
20977
20934
* already deleted. */
20978
20935
return cmd_value;
20979
20936
}
20980
- cmd = flecs_cmd_alloc (stage);
20937
+ cmd = flecs_cmd_new (stage);
20981
20938
}
20982
20939
20983
20940
if (!existing) {
@@ -21011,11 +20968,7 @@ void flecs_enqueue(
21011
20968
ecs_stage_t *stage,
21012
20969
ecs_event_desc_t *desc)
21013
20970
{
21014
- ecs_cmd_t *cmd = flecs_cmd_new(stage, desc->entity, false, false);
21015
- if (!cmd) {
21016
- return; /* Entity was deleted */
21017
- }
21018
-
20971
+ ecs_cmd_t *cmd = flecs_cmd_new(stage);
21019
20972
cmd->kind = EcsCmdEvent;
21020
20973
cmd->entity = desc->entity;
21021
20974
0 commit comments