@@ -1916,8 +1916,7 @@ void* flecs_defer_set(
1916
1916
ecs_entity_t entity,
1917
1917
ecs_entity_t component,
1918
1918
ecs_size_t size,
1919
- void *value,
1920
- bool need_value);
1919
+ void *value);
1921
1920
1922
1921
bool flecs_defer_end(
1923
1922
ecs_world_t *world,
@@ -6143,8 +6142,7 @@ void* ecs_get_mut_id(
6143
6142
6144
6143
ecs_stage_t *stage = flecs_stage_from_world(&world);
6145
6144
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);
6148
6146
}
6149
6147
6150
6148
ecs_record_t *r = flecs_entities_get(world, entity);
@@ -6170,8 +6168,7 @@ void* ecs_get_mut_modified_id(
6170
6168
ecs_stage_t *stage = flecs_stage_from_world(&world);
6171
6169
ecs_check(flecs_defer_cmd(stage), ECS_INVALID_PARAMETER, NULL);
6172
6170
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);
6175
6172
error:
6176
6173
return NULL;
6177
6174
}
@@ -6405,8 +6402,7 @@ void* ecs_emplace_id(
6405
6402
ecs_stage_t *stage = flecs_stage_from_world(&world);
6406
6403
6407
6404
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);
6410
6406
}
6411
6407
6412
6408
ecs_record_t *r = flecs_entities_get(world, entity);
@@ -6496,7 +6492,7 @@ void flecs_copy_ptr_w_id(
6496
6492
{
6497
6493
if (flecs_defer_cmd(stage)) {
6498
6494
flecs_defer_set(world, stage, EcsCmdSet, entity, id,
6499
- flecs_utosize(size), ptr, false );
6495
+ flecs_utosize(size), ptr);
6500
6496
return;
6501
6497
}
6502
6498
@@ -6542,7 +6538,7 @@ void flecs_move_ptr_w_id(
6542
6538
{
6543
6539
if (flecs_defer_cmd(stage)) {
6544
6540
flecs_defer_set(world, stage, cmd_kind, entity, id,
6545
- flecs_utosize(size), ptr, false );
6541
+ flecs_utosize(size), ptr);
6546
6542
return;
6547
6543
}
6548
6544
@@ -8154,6 +8150,7 @@ bool flecs_defer_end(
8154
8150
ecs_stage_t *dst_stage = flecs_stage_from_world(&world);
8155
8151
ecs_commands_t *commands = stage->cmd;
8156
8152
ecs_vec_t *queue = &commands->queue;
8153
+
8157
8154
if (ecs_vec_count(queue)) {
8158
8155
ecs_cmd_t *cmds = ecs_vec_first(queue);
8159
8156
int32_t i, count = ecs_vec_count(queue);
@@ -20479,72 +20476,54 @@ int32_t flecs_relation_depth(
20479
20476
20480
20477
20481
20478
static
20482
- ecs_cmd_t* flecs_cmd_alloc (
20479
+ ecs_cmd_t* flecs_cmd_new (
20483
20480
ecs_stage_t *stage)
20484
20481
{
20485
20482
ecs_cmd_t *cmd = ecs_vec_append_t(&stage->allocator, &stage->cmd->queue,
20486
20483
ecs_cmd_t);
20487
- ecs_os_zeromem(cmd);
20484
+ cmd->is._1.value = NULL;
20485
+ cmd->next_for_entity = 0;
20486
+ cmd->entry = NULL;
20488
20487
return cmd;
20489
20488
}
20490
20489
20491
20490
static
20492
- ecs_cmd_t* flecs_cmd_new (
20491
+ ecs_cmd_t* flecs_cmd_new_batched (
20493
20492
ecs_stage_t *stage,
20494
- ecs_entity_t e,
20495
- bool is_delete,
20496
- bool can_batch)
20493
+ ecs_entity_t e)
20497
20494
{
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);
20503
20498
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 */
20532
20504
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
+ }
20533
20517
}
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;
20545
20522
}
20546
20523
20547
- return flecs_cmd_alloc(stage);
20524
+ entry->last = cur;
20525
+
20526
+ return cmd;
20548
20527
}
20549
20528
20550
20529
static
@@ -20646,7 +20625,7 @@ bool flecs_defer_modified(
20646
20625
ecs_id_t id)
20647
20626
{
20648
20627
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);
20650
20629
if (cmd) {
20651
20630
cmd->kind = EcsCmdModified;
20652
20631
cmd->id = id;
@@ -20664,13 +20643,11 @@ bool flecs_defer_clone(
20664
20643
bool clone_value)
20665
20644
{
20666
20645
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;
20674
20651
return true;
20675
20652
}
20676
20653
return false;
@@ -20683,13 +20660,11 @@ bool flecs_defer_path(
20683
20660
const char *name)
20684
20661
{
20685
20662
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);
20693
20668
return true;
20694
20669
}
20695
20670
return false;
@@ -20700,11 +20675,9 @@ bool flecs_defer_delete(
20700
20675
ecs_entity_t entity)
20701
20676
{
20702
20677
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;
20708
20681
return true;
20709
20682
}
20710
20683
return false;
@@ -20715,11 +20688,9 @@ bool flecs_defer_clear(
20715
20688
ecs_entity_t entity)
20716
20689
{
20717
20690
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;
20723
20694
return true;
20724
20695
}
20725
20696
return false;
@@ -20731,7 +20702,7 @@ bool flecs_defer_on_delete_action(
20731
20702
ecs_entity_t action)
20732
20703
{
20733
20704
if (flecs_defer_cmd(stage)) {
20734
- ecs_cmd_t *cmd = flecs_cmd_alloc (stage);
20705
+ ecs_cmd_t *cmd = flecs_cmd_new (stage);
20735
20706
cmd->kind = EcsCmdOnDeleteAction;
20736
20707
cmd->id = id;
20737
20708
cmd->entity = action;
@@ -20747,12 +20718,10 @@ bool flecs_defer_enable(
20747
20718
bool enable)
20748
20719
{
20749
20720
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;
20756
20725
return true;
20757
20726
}
20758
20727
return false;
@@ -20777,14 +20746,12 @@ bool flecs_defer_bulk_new(
20777
20746
*ids_out = ids;
20778
20747
20779
20748
/* 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;
20788
20755
return true;
20789
20756
}
20790
20757
return false;
@@ -20797,12 +20764,10 @@ bool flecs_defer_add(
20797
20764
{
20798
20765
if (flecs_defer_cmd(stage)) {
20799
20766
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;
20806
20771
return true;
20807
20772
}
20808
20773
return false;
@@ -20815,12 +20780,10 @@ bool flecs_defer_remove(
20815
20780
{
20816
20781
if (flecs_defer_cmd(stage)) {
20817
20782
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;
20824
20787
return true;
20825
20788
}
20826
20789
return false;
@@ -20833,20 +20796,9 @@ void* flecs_defer_set(
20833
20796
ecs_entity_t entity,
20834
20797
ecs_id_t id,
20835
20798
ecs_size_t size,
20836
- void *value,
20837
- bool need_value)
20799
+ void *value)
20838
20800
{
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);
20850
20802
20851
20803
/* Find type info for id */
20852
20804
const ecs_type_info_t *ti = NULL;
@@ -20977,7 +20929,7 @@ void* flecs_defer_set(
20977
20929
* already deleted. */
20978
20930
return cmd_value;
20979
20931
}
20980
- cmd = flecs_cmd_alloc (stage);
20932
+ cmd = flecs_cmd_new (stage);
20981
20933
}
20982
20934
20983
20935
if (!existing) {
@@ -21011,11 +20963,7 @@ void flecs_enqueue(
21011
20963
ecs_stage_t *stage,
21012
20964
ecs_event_desc_t *desc)
21013
20965
{
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);
21019
20967
cmd->kind = EcsCmdEvent;
21020
20968
cmd->entity = desc->entity;
21021
20969
0 commit comments