diff --git a/distr/flecs.c b/distr/flecs.c index 77e55d7988..ce30b18099 100644 --- a/distr/flecs.c +++ b/distr/flecs.c @@ -28150,8 +28150,6 @@ struct ecs_pipeline_state_t { ecs_entity_t last_system; /* Last system run by pipeline */ int32_t match_count; /* Used to track if rebuild is necessary */ int32_t rebuild_count; /* Number of pipeline rebuilds */ - ecs_iter_t *iters; /* Iterator for worker(s) */ - int32_t iter_count; /* Members for continuing pipeline iteration after pipeline rebuild */ ecs_pipeline_op_t *cur_op; /* Current pipeline op */ @@ -62670,7 +62668,6 @@ static void flecs_pipeline_state_free( ecs_allocator_t *a = &world->allocator; ecs_vec_fini_t(a, &p->ops, ecs_pipeline_op_t); ecs_vec_fini_t(a, &p->systems, ecs_system_t*); - ecs_os_free(p->iters); ecs_os_free(p); } } @@ -63162,12 +63159,6 @@ bool flecs_pipeline_update( bool rebuilt = flecs_pipeline_build(world, pq); if (start_of_frame) { - /* Initialize iterators */ - int32_t i, count = pq->iter_count; - for (i = 0; i < count; i ++) { - ecs_world_t *stage = ecs_get_stage(world, i); - pq->iters[i] = ecs_query_iter(stage, pq->query); - } pq->cur_op = ecs_vec_first_t(&pq->ops, ecs_pipeline_op_t); pq->cur_i = 0; } else { @@ -74939,8 +74930,6 @@ void flecs_pipeline_memory_get( ECS_SIZEOF(ecs_pipeline_op_t); result->bytes_pipelines += ecs_vec_size(&ps->systems) * ECS_SIZEOF(ecs_entity_t); - result->bytes_pipelines += ps->iter_count * - ECS_SIZEOF(ecs_iter_t); } } } @@ -85716,12 +85705,16 @@ ecs_iter_t flecs_query_iter( flecs_query_cache_iter_init(&it, qit, impl); + ecs_size_t vars_size = var_count * ECS_SIZEOF(ecs_var_t); + ecs_size_t written_size = op_count * ECS_SIZEOF(ecs_write_flags_t); + char *scratch = flecs_iter_calloc( + &it, vars_size + written_size, ECS_ALIGNOF(ecs_var_t)); if (var_count) { - qit->vars = flecs_iter_calloc_n(&it, ecs_var_t, var_count); + qit->vars = (ecs_var_t*)(void*)scratch; } + qit->written = (ecs_write_flags_t*)(void*)(scratch + vars_size); - if (op_count) { - qit->written = flecs_iter_calloc_n(&it, ecs_write_flags_t, op_count); + if (impl->ops || !impl->cache) { qit->op_ctx = flecs_iter_calloc_n(&it, ecs_query_op_ctx_t, op_count); } diff --git a/distr/flecs_no_addons.c b/distr/flecs_no_addons.c index e564967f63..f73b0fcb59 100644 --- a/distr/flecs_no_addons.c +++ b/distr/flecs_no_addons.c @@ -23907,8 +23907,6 @@ struct ecs_pipeline_state_t { ecs_entity_t last_system; /* Last system run by pipeline */ int32_t match_count; /* Used to track if rebuild is necessary */ int32_t rebuild_count; /* Number of pipeline rebuilds */ - ecs_iter_t *iters; /* Iterator for worker(s) */ - int32_t iter_count; /* Members for continuing pipeline iteration after pipeline rebuild */ ecs_pipeline_op_t *cur_op; /* Current pipeline op */ @@ -48017,12 +48015,16 @@ ecs_iter_t flecs_query_iter( flecs_query_cache_iter_init(&it, qit, impl); + ecs_size_t vars_size = var_count * ECS_SIZEOF(ecs_var_t); + ecs_size_t written_size = op_count * ECS_SIZEOF(ecs_write_flags_t); + char *scratch = flecs_iter_calloc( + &it, vars_size + written_size, ECS_ALIGNOF(ecs_var_t)); if (var_count) { - qit->vars = flecs_iter_calloc_n(&it, ecs_var_t, var_count); + qit->vars = (ecs_var_t*)(void*)scratch; } + qit->written = (ecs_write_flags_t*)(void*)(scratch + vars_size); - if (op_count) { - qit->written = flecs_iter_calloc_n(&it, ecs_write_flags_t, op_count); + if (impl->ops || !impl->cache) { qit->op_ctx = flecs_iter_calloc_n(&it, ecs_query_op_ctx_t, op_count); } diff --git a/src/addons/pipeline/pipeline.c b/src/addons/pipeline/pipeline.c index 3a1943c03f..921a6b248a 100644 --- a/src/addons/pipeline/pipeline.c +++ b/src/addons/pipeline/pipeline.c @@ -19,7 +19,6 @@ static void flecs_pipeline_state_free( ecs_allocator_t *a = &world->allocator; ecs_vec_fini_t(a, &p->ops, ecs_pipeline_op_t); ecs_vec_fini_t(a, &p->systems, ecs_system_t*); - ecs_os_free(p->iters); ecs_os_free(p); } } @@ -511,12 +510,6 @@ bool flecs_pipeline_update( bool rebuilt = flecs_pipeline_build(world, pq); if (start_of_frame) { - /* Initialize iterators */ - int32_t i, count = pq->iter_count; - for (i = 0; i < count; i ++) { - ecs_world_t *stage = ecs_get_stage(world, i); - pq->iters[i] = ecs_query_iter(stage, pq->query); - } pq->cur_op = ecs_vec_first_t(&pq->ops, ecs_pipeline_op_t); pq->cur_i = 0; } else { diff --git a/src/addons/pipeline/pipeline.h b/src/addons/pipeline/pipeline.h index e7543bacfd..a68e4f9a5a 100644 --- a/src/addons/pipeline/pipeline.h +++ b/src/addons/pipeline/pipeline.h @@ -27,8 +27,6 @@ struct ecs_pipeline_state_t { ecs_entity_t last_system; /* Last system run by pipeline */ int32_t match_count; /* Used to track if rebuild is necessary */ int32_t rebuild_count; /* Number of pipeline rebuilds */ - ecs_iter_t *iters; /* Iterator for worker(s) */ - int32_t iter_count; /* Members for continuing pipeline iteration after pipeline rebuild */ ecs_pipeline_op_t *cur_op; /* Current pipeline op */ diff --git a/src/addons/stats/memory.c b/src/addons/stats/memory.c index b953c19aba..dddfd75d81 100644 --- a/src/addons/stats/memory.c +++ b/src/addons/stats/memory.c @@ -791,8 +791,6 @@ void flecs_pipeline_memory_get( ECS_SIZEOF(ecs_pipeline_op_t); result->bytes_pipelines += ecs_vec_size(&ps->systems) * ECS_SIZEOF(ecs_entity_t); - result->bytes_pipelines += ps->iter_count * - ECS_SIZEOF(ecs_iter_t); } } } diff --git a/src/query/engine/eval_iter.c b/src/query/engine/eval_iter.c index b9192a4051..ba6a83087b 100644 --- a/src/query/engine/eval_iter.c +++ b/src/query/engine/eval_iter.c @@ -543,12 +543,16 @@ ecs_iter_t flecs_query_iter( flecs_query_cache_iter_init(&it, qit, impl); + ecs_size_t vars_size = var_count * ECS_SIZEOF(ecs_var_t); + ecs_size_t written_size = op_count * ECS_SIZEOF(ecs_write_flags_t); + char *scratch = flecs_iter_calloc( + &it, vars_size + written_size, ECS_ALIGNOF(ecs_var_t)); if (var_count) { - qit->vars = flecs_iter_calloc_n(&it, ecs_var_t, var_count); + qit->vars = (ecs_var_t*)(void*)scratch; } + qit->written = (ecs_write_flags_t*)(void*)(scratch + vars_size); - if (op_count) { - qit->written = flecs_iter_calloc_n(&it, ecs_write_flags_t, op_count); + if (impl->ops || !impl->cache) { qit->op_ctx = flecs_iter_calloc_n(&it, ecs_query_op_ctx_t, op_count); }