| 289 | } // namespace sugoi |
| 290 | |
| 291 | skr::task::event_t sugoi::scheduler_t::schedule_ecs_job(sugoi_query_t* query, EIndex batchSize, sugoi_system_callback_t callback, void* u, |
| 292 | sugoi_system_lifetime_callback_t init, sugoi_system_lifetime_callback_t teardown, sugoi_resource_operation_t* resources) |
| 293 | { |
| 294 | query->storage->build_queries(); |
| 295 | skr::task::event_t result; |
| 296 | SkrZoneScopedN("SchedualECSJob"); |
| 297 | |
| 298 | SKR_ASSERT(is_main_thread(query->storage)); |
| 299 | SKR_ASSERT(query->parameters.length < 32); |
| 300 | llvm_vecsmall::SmallVector<sugoi_group_t*, 64> groups; |
| 301 | auto add_group = [&](sugoi_group_t* group) { |
| 302 | groups.push_back(group); |
| 303 | }; |
| 304 | auto& params = query->parameters; |
| 305 | query->storage->query_groups(query->filter, query->meta, SUGOI_LAMBDA(add_group)); |
| 306 | struct task_t { |
| 307 | uint32_t groupIndex; |
| 308 | uint32_t startIndex; |
| 309 | sugoi_chunk_view_t view; |
| 310 | }; |
| 311 | struct SharedData |
| 312 | { |
| 313 | sugoi_query_t* query; |
| 314 | sugoi_group_t** groups; |
| 315 | uint32_t groupCount; |
| 316 | std::bitset<32>* readonly; |
| 317 | sugoi_type_index_t* localTypes; |
| 318 | std::bitset<32>* atomic; |
| 319 | std::bitset<32>* randomAccess; |
| 320 | bool hasRandomWrite; |
| 321 | bool hasWriteChunkComponent; |
| 322 | EIndex entityCount; |
| 323 | sugoi_system_callback_t callback; |
| 324 | void* userdata; |
| 325 | skr::stl_vector<task_t> tasks; |
| 326 | }; |
| 327 | SharedData* job = nullptr; |
| 328 | skr::SPtr<SharedData> sharedData; |
| 329 | |
| 330 | auto groupCount = (uint32_t)groups.size(); |
| 331 | { |
| 332 | SkrZoneScopedN("AllocateSharedData"); |
| 333 | struct_arena_t<SharedData> arena; |
| 334 | arena.record(&SharedData::groups, groupCount); |
| 335 | arena.record(&SharedData::localTypes, groupCount * params.length); |
| 336 | arena.record(&SharedData::readonly, groupCount); |
| 337 | arena.record(&SharedData::atomic, groupCount); |
| 338 | arena.record(&SharedData::randomAccess, groupCount); |
| 339 | job = arena.end(); |
| 340 | job->groups = arena.get(&SharedData::groups, groupCount); |
| 341 | job->localTypes = arena.get(&SharedData::localTypes, groupCount * params.length); |
| 342 | job->readonly = arena.get(&SharedData::readonly, groupCount); |
| 343 | job->atomic = arena.get(&SharedData::atomic, groupCount); |
| 344 | job->randomAccess = arena.get(&SharedData::randomAccess, groupCount); |
| 345 | } |
| 346 | job->groupCount = groupCount; |
| 347 | job->hasRandomWrite = !query->subqueries.empty(); |
| 348 | job->hasWriteChunkComponent = false; |
no test coverage detected