11#include " core.hh"
22
3+ #include " rt_entt_codegen/shared/parallel.hh"
34#include " ecsact/lang-support/lang-cc.hh"
45#include " rt_entt_codegen/shared/util.hh"
56#include " ecsact/cpp_codegen_plugin_util.hh"
67
78constexpr auto METHOD_BODY_TOP = R"(
8- auto& reg = ecsact::entt::get_registry(registry_id);
9- auto actions = ecsact::entt::actions_map{};
9+ auto& registry = ecsact::entt::get_registry(registry_id);
10+ auto actions_map = ecsact::entt::actions_map{};
1011)" ;
1112
13+ auto ecsact::rt_entt_codegen::core::print_parallel_system_execute (
14+ codegen_plugin_context& ctx,
15+ const ecsact_entt_details& details
16+ ) -> void {
17+ using ecsact::cc_lang_support::cpp_identifier;
18+ using ecsact::cpp_codegen_plugin_util::block;
19+ using ecsact::rt_entt_codegen::util::method_printer;
20+
21+ ctx.write (" template<std::size_t N>\n " );
22+ auto printer = //
23+ method_printer{ctx, " execute_parallel_cluster" } //
24+ .parameter (" ::entt::registry&" , " registry" )
25+ .parameter (" ecsact_system_execution_context*" , " parent_context" )
26+ .parameter (" std::array<exec_entry_t, N>" , " system_arr" )
27+ .return_type (" void" );
28+
29+ block (
30+ ctx,
31+ " std::for_each(std::execution::par_unseq, system_arr.begin(), "
32+ " system_arr.end(), [®istry](exec_entry_t pair)" ,
33+ [&]() {
34+ ctx.write (" auto fn_ptr = pair.first;\n " );
35+ ctx.write (" auto& actions_map = pair.second;\n " );
36+ ctx.write (" fn_ptr(registry, nullptr, actions_map);" );
37+ }
38+ );
39+ ctx.write (" );\n " );
40+ }
41+
1242auto ecsact::rt_entt_codegen::core::print_execute_systems ( //
1343 codegen_plugin_context& ctx,
1444 const ecsact_entt_details& details
@@ -33,7 +63,9 @@ auto ecsact::rt_entt_codegen::core::print_execute_systems( //
3363 ctx.indentation += 1 ;
3464 ctx.write (" \n " );
3565
36- ctx.write (" actions.collect(i, execution_count, execution_options_list);\n " );
66+ ctx.write ( //
67+ " actions_map.collect(i, execution_count, execution_options_list);\n "
68+ );
3769
3870 block (ctx, " if(execution_options_list != nullptr)" , [&] {
3971 ctx.write (
@@ -45,26 +77,65 @@ auto ecsact::rt_entt_codegen::core::print_execute_systems( //
4577 });
4678 });
4779
48- for (auto sys_like : details.top_execution_order ) {
49- auto cpp_decl_name = cpp_identifier (ecsact::meta::decl_full_name (sys_like));
80+ auto parallel_system_cluster =
81+ ecsact::rt_entt_codegen::parallel::get_parallel_execution_cluster (
82+ ctx,
83+ details,
84+ details.top_execution_order
85+ );
5086
51- if (details.is_action (sys_like)) {
52- ctx.write (
53- " ecsact::entt::execute_actions<" ,
54- cpp_decl_name,
55- " >(reg, actions.as_action_span<" ,
56- cpp_decl_name,
57- " >());\n "
58- );
59- } else if (details.is_system (sys_like)) {
60- ctx.write (
61- " ecsact::entt::execute_system<" ,
62- cpp_decl_name,
63- " >(reg, nullptr);\n "
64- );
65- } else {
66- ctx.write (" // ??? unhandled ??? " , cpp_decl_name, " \n " );
87+ for (const auto & systems_to_parallel : parallel_system_cluster) {
88+ if (systems_to_parallel.size () == 1 ) {
89+ auto sync_sys_id = systems_to_parallel[0 ];
90+
91+ auto sync_sys_name =
92+ cpp_identifier (ecsact::meta::decl_full_name (sync_sys_id));
93+
94+ if (details.is_action (sync_sys_id)) {
95+ ctx.write (std::format (
96+ " ecsact::entt::execute_actions<{}>(registry, {}, "
97+ " actions_map);\n " ,
98+ sync_sys_name,
99+ " nullptr"
100+ ));
101+ }
102+ if (details.is_system (sync_sys_id)) {
103+ ctx.write (std::format (
104+ " ecsact::entt::execute_system<{}>(registry, {}, "
105+ " actions_map);\n " ,
106+ sync_sys_name,
107+ " nullptr"
108+ ));
109+ }
110+ continue ;
111+ }
112+
113+ ctx.write (" execute_parallel_cluster(registry, nullptr, " );
114+ ctx.write (std::format (
115+ " std::array<exec_entry_t, {}> {{\n " ,
116+ systems_to_parallel.size ()
117+ ));
118+ for (const auto system_like_id : systems_to_parallel) {
119+ auto cpp_decl_name =
120+ cpp_identifier (ecsact::meta::decl_full_name (system_like_id));
121+
122+ if (details.is_action (system_like_id)) {
123+ ctx.write (
124+ " \t exec_entry_t{&ecsact::entt::execute_actions<" ,
125+ cpp_decl_name,
126+ " >, actions_map},\n "
127+ );
128+ } else if (details.is_system (system_like_id)) {
129+ ctx.write (
130+ " \t exec_entry_t{&ecsact::entt::execute_system<" ,
131+ cpp_decl_name,
132+ " >, actions_map},\n "
133+ );
134+ } else {
135+ ctx.write (" // ??? unhandled ??? " , cpp_decl_name, " \n " );
136+ }
67137 }
138+ ctx.write (" });\n " );
68139 }
69140
70141 ctx.write (" \n update_all_beforechange_storage(registry_id);\n " );
0 commit comments