Skip to content

Commit 3451ca3

Browse files
committed
#841 fix issue with page/worker iterators and InOutNone
1 parent 2735e82 commit 3451ca3

6 files changed

Lines changed: 157 additions & 27 deletions

File tree

flecs.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51296,24 +51296,27 @@ ecs_iter_t ecs_page_iter(
5129651296
}
5129751297

5129851298
static
51299-
void offset_iter(
51299+
void flecs_offset_iter(
5130051300
ecs_iter_t *it,
5130151301
int32_t offset)
5130251302
{
5130351303
it->entities = &it->entities[offset];
5130451304

5130551305
int32_t t, field_count = it->field_count;
51306-
for (t = 0; t < field_count; t ++) {
51307-
void *ptrs = it->ptrs[t];
51308-
if (!ptrs) {
51309-
continue;
51310-
}
51306+
void **it_ptrs = it->ptrs;
51307+
if (it_ptrs) {
51308+
for (t = 0; t < field_count; t ++) {
51309+
void *ptrs = it_ptrs[t];
51310+
if (!ptrs) {
51311+
continue;
51312+
}
5131151313

51312-
if (it->sources[t]) {
51313-
continue;
51314-
}
51314+
if (it->sources[t]) {
51315+
continue;
51316+
}
5131551317

51316-
it->ptrs[t] = ECS_OFFSET(ptrs, offset * it->sizes[t]);
51318+
it->ptrs[t] = ECS_OFFSET(ptrs, offset * it->sizes[t]);
51319+
}
5131751320
}
5131851321
}
5131951322

@@ -51368,7 +51371,7 @@ bool ecs_page_next_instanced(
5136851371
it->offset += offset;
5136951372
count = it->count -= offset;
5137051373
iter->offset = 0;
51371-
offset_iter(it, offset);
51374+
flecs_offset_iter(it, offset);
5137251375
}
5137351376
}
5137451377

@@ -51498,7 +51501,7 @@ bool ecs_worker_next_instanced(
5149851501
it->instance_count = instances_per_worker;
5149951502
it->frame_offset += first;
5150051503

51501-
offset_iter(it, it->offset + first);
51504+
flecs_offset_iter(it, it->offset + first);
5150251505
it->count = per_worker;
5150351506

5150451507
if (ECS_BIT_IS_SET(it->flags, EcsIterIsInstanced)) {

flecs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23618,7 +23618,7 @@ struct observer_builder_i : filter_builder_i<Base, Components ...> {
2361823618
Base& ctx(void *ptr) {
2361923619
m_desc->ctx = ptr;
2362023620
return *this;
23621-
}
23621+
}
2362223622

2362323623
/** Set observer run callback */
2362423624
Base& run(ecs_iter_action_t action) {

src/iter.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -928,24 +928,27 @@ ecs_iter_t ecs_page_iter(
928928
}
929929

930930
static
931-
void offset_iter(
931+
void flecs_offset_iter(
932932
ecs_iter_t *it,
933933
int32_t offset)
934934
{
935935
it->entities = &it->entities[offset];
936936

937937
int32_t t, field_count = it->field_count;
938-
for (t = 0; t < field_count; t ++) {
939-
void *ptrs = it->ptrs[t];
940-
if (!ptrs) {
941-
continue;
942-
}
938+
void **it_ptrs = it->ptrs;
939+
if (it_ptrs) {
940+
for (t = 0; t < field_count; t ++) {
941+
void *ptrs = it_ptrs[t];
942+
if (!ptrs) {
943+
continue;
944+
}
943945

944-
if (it->sources[t]) {
945-
continue;
946-
}
946+
if (it->sources[t]) {
947+
continue;
948+
}
947949

948-
it->ptrs[t] = ECS_OFFSET(ptrs, offset * it->sizes[t]);
950+
it->ptrs[t] = ECS_OFFSET(ptrs, offset * it->sizes[t]);
951+
}
949952
}
950953
}
951954

@@ -1000,7 +1003,7 @@ bool ecs_page_next_instanced(
10001003
it->offset += offset;
10011004
count = it->count -= offset;
10021005
iter->offset = 0;
1003-
offset_iter(it, offset);
1006+
flecs_offset_iter(it, offset);
10041007
}
10051008
}
10061009

@@ -1130,7 +1133,7 @@ bool ecs_worker_next_instanced(
11301133
it->instance_count = instances_per_worker;
11311134
it->frame_offset += first;
11321135

1133-
offset_iter(it, it->offset + first);
1136+
flecs_offset_iter(it, it->offset + first);
11341137
it->count = per_worker;
11351138

11361139
if (ECS_BIT_IS_SET(it->flags, EcsIterIsInstanced)) {

test/api/project.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1436,7 +1436,11 @@
14361436
"count",
14371437
"iter_restore_stack_iter",
14381438
"interleaved_iter",
1439-
"get_first"
1439+
"get_first",
1440+
"page_iter_w_only_tag",
1441+
"worker_iter_w_only_tag",
1442+
"page_iter_w_inout_none",
1443+
"worker_iter_w_inout_none"
14401444
]
14411445
}, {
14421446
"id": "Pairs",

test/api/src/Iter.c

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,3 +1736,103 @@ void Iter_get_first() {
17361736

17371737
ecs_fini(world);
17381738
}
1739+
1740+
void Iter_page_iter_w_only_tag() {
1741+
ecs_world_t *world = ecs_mini();
1742+
1743+
ECS_TAG(world, Tag);
1744+
1745+
ecs_filter_t *f = ecs_filter(world, {
1746+
.terms = {{ Tag }}
1747+
});
1748+
1749+
ecs_new(world, Tag);
1750+
ecs_entity_t e2 = ecs_new(world, Tag);
1751+
1752+
ecs_iter_t it = ecs_filter_iter(world, f);
1753+
ecs_iter_t pit = ecs_page_iter(&it, 1, 0);
1754+
1755+
test_assert(ecs_page_next(&pit));
1756+
test_int(pit.count, 1);
1757+
test_uint(pit.entities[0], e2);
1758+
test_assert(!ecs_page_next(&pit));
1759+
1760+
ecs_filter_fini(f);
1761+
1762+
ecs_fini(world);
1763+
}
1764+
1765+
void Iter_worker_iter_w_only_tag() {
1766+
ecs_world_t *world = ecs_mini();
1767+
1768+
ECS_TAG(world, Tag);
1769+
1770+
ecs_filter_t *f = ecs_filter(world, {
1771+
.terms = {{ Tag }}
1772+
});
1773+
1774+
ecs_new(world, Tag);
1775+
ecs_entity_t e2 = ecs_new(world, Tag);
1776+
1777+
ecs_iter_t it = ecs_filter_iter(world, f);
1778+
ecs_iter_t pit = ecs_worker_iter(&it, 1, 2);
1779+
1780+
test_assert(ecs_worker_next(&pit));
1781+
test_int(pit.count, 1);
1782+
test_uint(pit.entities[0], e2);
1783+
test_assert(!ecs_worker_next(&pit));
1784+
1785+
ecs_filter_fini(f);
1786+
1787+
ecs_fini(world);
1788+
}
1789+
1790+
void Iter_page_iter_w_inout_none() {
1791+
ecs_world_t *world = ecs_mini();
1792+
1793+
ECS_COMPONENT(world, Position);
1794+
1795+
ecs_filter_t *f = ecs_filter(world, {
1796+
.terms = {{ ecs_id(Position), .inout = EcsInOutNone }}
1797+
});
1798+
1799+
ecs_new(world, Position);
1800+
ecs_entity_t e2 = ecs_new(world, Position);
1801+
1802+
ecs_iter_t it = ecs_filter_iter(world, f);
1803+
ecs_iter_t pit = ecs_page_iter(&it, 1, 0);
1804+
1805+
test_assert(ecs_page_next(&pit));
1806+
test_int(pit.count, 1);
1807+
test_uint(pit.entities[0], e2);
1808+
test_assert(!ecs_page_next(&pit));
1809+
1810+
ecs_filter_fini(f);
1811+
1812+
ecs_fini(world);
1813+
}
1814+
1815+
void Iter_worker_iter_w_inout_none() {
1816+
ecs_world_t *world = ecs_mini();
1817+
1818+
ECS_COMPONENT(world, Position);
1819+
1820+
ecs_filter_t *f = ecs_filter(world, {
1821+
.terms = {{ ecs_id(Position), .inout = EcsInOutNone }}
1822+
});
1823+
1824+
ecs_new(world, Position);
1825+
ecs_entity_t e2 = ecs_new(world, Position);
1826+
1827+
ecs_iter_t it = ecs_filter_iter(world, f);
1828+
ecs_iter_t pit = ecs_worker_iter(&it, 1, 2);
1829+
1830+
test_assert(ecs_worker_next(&pit));
1831+
test_int(pit.count, 1);
1832+
test_uint(pit.entities[0], e2);
1833+
test_assert(!ecs_worker_next(&pit));
1834+
1835+
ecs_filter_fini(f);
1836+
1837+
ecs_fini(world);
1838+
}

test/api/src/main.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1374,6 +1374,10 @@ void Iter_count(void);
13741374
void Iter_iter_restore_stack_iter(void);
13751375
void Iter_interleaved_iter(void);
13761376
void Iter_get_first(void);
1377+
void Iter_page_iter_w_only_tag(void);
1378+
void Iter_worker_iter_w_only_tag(void);
1379+
void Iter_page_iter_w_inout_none(void);
1380+
void Iter_worker_iter_w_inout_none(void);
13771381

13781382
// Testsuite 'Pairs'
13791383
void Pairs_type_w_one_pair(void);
@@ -7518,6 +7522,22 @@ bake_test_case Iter_testcases[] = {
75187522
{
75197523
"get_first",
75207524
Iter_get_first
7525+
},
7526+
{
7527+
"page_iter_w_only_tag",
7528+
Iter_page_iter_w_only_tag
7529+
},
7530+
{
7531+
"worker_iter_w_only_tag",
7532+
Iter_worker_iter_w_only_tag
7533+
},
7534+
{
7535+
"page_iter_w_inout_none",
7536+
Iter_page_iter_w_inout_none
7537+
},
7538+
{
7539+
"worker_iter_w_inout_none",
7540+
Iter_worker_iter_w_inout_none
75217541
}
75227542
};
75237543

@@ -11031,7 +11051,7 @@ static bake_test_suite suites[] = {
1103111051
"Iter",
1103211052
NULL,
1103311053
NULL,
11034-
28,
11054+
32,
1103511055
Iter_testcases
1103611056
},
1103711057
{

0 commit comments

Comments
 (0)