4
4
// ////////////////////////////////////////////////////////////////////
5
5
6
6
#include " stdafx.h"
7
+
7
8
#include " EngineAPI.h"
8
9
#include " XR_IOConsole.h"
9
10
10
- #include " xrCore/ModuleLookup.hpp"
11
11
#include " xrCore/xr_token.h"
12
+ #include " xrCore/ModuleLookup.hpp"
12
13
#include " xrCore/Threading/ParallelForEach.hpp"
13
14
14
15
#include " xrScriptEngine/ScriptExporter.hpp"
15
16
17
+ #include < array>
18
+
16
19
extern xr_vector<xr_token> VidQualityToken;
17
20
18
21
constexpr pcstr GET_RENDERER_MODULE_FUNC = " GetRendererModule" ;
19
22
20
- constexpr pcstr r4_library = " xrRender_R4" ;
21
- constexpr pcstr gl_library = " xrRender_GL" ;
23
+ using GetRendererModule = RendererModule*();
22
24
23
- constexpr pcstr RENDER_LIBRARIES[] =
25
+ struct RendererDesc
24
26
{
25
- r4_library,
26
- gl_library
27
+ pcstr libraryName;
28
+ XRay::Module handle;
29
+ RendererModule* module;
27
30
};
28
31
32
+ std::array<RendererDesc, 2 > g_render_modules =
33
+ {{
34
+ { " xrRender_R4" , nullptr , nullptr },
35
+ { " xrRender_GL" , nullptr , nullptr },
36
+ }};
37
+
29
38
// ////////////////////////////////////////////////////////////////////
30
39
// Construction/Destruction
31
40
// ////////////////////////////////////////////////////////////////////
@@ -99,56 +108,40 @@ void CEngineAPI::SelectRenderer()
99
108
Log (" Selected renderer:" , selected_mode);
100
109
}
101
110
102
- void CEngineAPI::Initialize (void )
111
+ void CEngineAPI::Initialize (GameModule* game )
103
112
{
104
113
ZoneScoped;
105
114
106
115
SelectRenderer ();
107
116
108
- hGame = XRay::LoadModule (" xrGame" );
109
117
if (!CanSkipGameModuleLoading ())
110
118
{
111
- R_ASSERT2 (hGame->IsLoaded (), " ! Game DLL raised exception during loading or there is no game DLL at all" );
112
-
113
- pCreate = (Factory_Create*)hGame->GetProcAddress (" xrFactory_Create" );
119
+ gameModule = game;
120
+ gameModule->initialize (pCreate, pDestroy);
114
121
R_ASSERT (pCreate);
115
-
116
- pDestroy = (Factory_Destroy*)hGame->GetProcAddress (" xrFactory_Destroy" );
117
122
R_ASSERT (pDestroy);
118
-
119
- pInitializeGame = (InitializeGameLibraryProc)hGame->GetProcAddress (" initialize_library" );
120
- R_ASSERT (pInitializeGame);
121
-
122
- pFinalizeGame = (FinalizeGameLibraryProc)hGame->GetProcAddress (" finalize_library" );
123
- R_ASSERT (pFinalizeGame);
124
-
125
- pInitializeGame ();
126
123
}
127
124
128
125
CloseUnusedLibraries ();
129
126
}
130
127
131
- void CEngineAPI::Destroy (void )
128
+ void CEngineAPI::Destroy ()
132
129
{
133
130
ZoneScoped;
134
- if (pFinalizeGame)
135
- pFinalizeGame ();
136
131
137
- pInitializeGame = nullptr ;
138
- pFinalizeGame = nullptr ;
132
+ if (gameModule)
133
+ gameModule->finalize ();
134
+
139
135
pCreate = nullptr ;
140
136
pDestroy = nullptr ;
141
137
142
- hGame = nullptr ;
143
-
144
- renderers.clear ();
145
138
XRC.r_clear_compact ();
146
139
}
147
140
148
141
void CEngineAPI::CloseUnusedLibraries ()
149
142
{
150
143
ZoneScoped;
151
- for (RendererDesc& desc : renderers )
144
+ for (RendererDesc& desc : g_render_modules )
152
145
{
153
146
if (desc.module != selectedRenderer)
154
147
desc.handle = nullptr ;
@@ -162,35 +155,29 @@ void CEngineAPI::CreateRendererList()
162
155
163
156
ZoneScoped;
164
157
165
- const auto loadLibrary = [&](pcstr library ) -> bool
158
+ const auto loadLibrary = [&](RendererDesc& desc ) -> bool
166
159
{
167
- auto handle = XRay::LoadModule (library );
160
+ auto handle = XRay::LoadModule (desc. libraryName );
168
161
if (!handle->IsLoaded ())
169
162
return false ;
170
163
171
- const auto getModule = ( GetRendererModule) handle->GetProcAddress (GET_RENDERER_MODULE_FUNC);
164
+ const auto getModule = reinterpret_cast < GetRendererModule*>( handle->GetProcAddress (GET_RENDERER_MODULE_FUNC) );
172
165
RendererModule* module = getModule ? getModule () : nullptr ;
173
166
if (!module)
174
167
return false ;
175
168
176
- renderers.emplace_back (RendererDesc ({ library, std::move (handle), module }));
169
+ desc.handle = std::move (handle);
170
+ desc.module = module;
177
171
return true ;
178
172
};
179
173
180
174
if (GEnv.isDedicatedServer )
181
175
{
182
- #if defined(XR_PLATFORM_WINDOWS)
183
- R_ASSERT2 (loadLibrary (r4_library), " Dedicated server needs xrRender_R1 to work" );
184
- #else
185
- R_ASSERT2 (loadLibrary (gl_library), " Dedicated server needs xrRender_GL to work" );
186
- #endif
176
+ R_ASSERT2 (loadLibrary (g_render_modules[0 ]), " Dedicated server needs xrRender to work" );
187
177
}
188
178
else
189
179
{
190
- for (cpcstr library : RENDER_LIBRARIES)
191
- {
192
- loadLibrary (library);
193
- }
180
+ std::for_each (std::begin (g_render_modules), std::end (g_render_modules), loadLibrary);
194
181
}
195
182
196
183
std::mutex mutex;
@@ -221,7 +208,7 @@ void CEngineAPI::CreateRendererList()
221
208
}
222
209
};
223
210
224
- xr_parallel_for_each (renderers , obtainModes);
211
+ xr_parallel_for_each (g_render_modules , obtainModes);
225
212
226
213
auto & modes = VidQualityToken;
227
214
Msg (" Available render modes[%d]:" , modes.size ());
0 commit comments