@@ -19,9 +19,18 @@ const XrSessionCreateInfo * UnityLib::sessionCreateInfo;
19
19
PFN_xrGetInstanceProcAddr UnityLib::s_xrGetInstanceProcAddr = nullptr ;
20
20
// std::vector<XrCompositionLayerBaseHeader *> empty_layers; // Default empty vector
21
21
std::vector<XrCompositionLayerBaseHeader *> UnityLib::layers;
22
- // std::vector<XrCompositionLayerBaseHeader> UnityLib::rendered_layers;
22
+ std::vector<const XrCompositionLayerBaseHeader *> UnityLib::special_layers;
23
+ std::vector<std::unique_ptr<XrCompositionLayerBaseHeader>> UnityLib::very_special_layers;
24
+ std::vector<std::unique_ptr<XrCompositionLayerBaseHeader>> UnityLib::noDisplayLayers;
25
+ std::vector<std::shared_ptr<XrCompositionLayerBaseHeader>> UnityLib::persistent_layers;
26
+ std::unique_ptr<XrSpace> UnityLib::space;
27
+ XrFrameEndInfo * UnityLib::frameEndinfo;
28
+ XrResult UnityLib::result;
29
+ XrSession UnityLib::session;
30
+ std::unique_ptr<std::pair<XrViewStateFlags, std::vector<XrView>>> UnityLib::flag_views;
31
+ std::vector<XrCompositionLayerBaseHeader> UnityLib::rendered_layers;
23
32
// std::vector<XrCompositionLayerBaseHeader> UnityLib::rendered_layers_safe;
24
- static std::vector<XrCompositionLayerBaseHeader> rendered_layers_safe;
33
+ // static std::vector<XrCompositionLayerBaseHeader> rendered_layers_safe;
25
34
static XrCompositionLayerBaseHeader single_layer;
26
35
XrFrameEndInfo UnityLib::modifiedFrameEndInfo;
27
36
PFN_xrEndFrame UnityLib::s_xrEndFrame = nullptr ;
@@ -31,11 +40,15 @@ PFN_xrWaitFrame UnityLib::s_xrWaitFrame = nullptr;
31
40
XrFrameState * UnityLib::framestate = nullptr ;
32
41
std::mutex UnityLib::render_mtx;
33
42
std::mutex UnityLib::render_mtx2;
43
+ std::mutex UnityLib::special_render_mtx;
34
44
std::mutex UnityLib::app_thread_mtx;
35
45
std::condition_variable UnityLib::app_thread_cv;
36
46
bool UnityLib::app_thread_flag = false ;
37
47
std::thread UnityLib::application_thread;
38
48
49
+ XrCompositionLayerBaseHeader UnityLib::g_layerStorage[6 ];
50
+ size_t UnityLib::g_numLayers = 0 ;
51
+
39
52
// Private constructor to prevent direct instantiation
40
53
UnityLib::UnityLib ()
41
54
{
@@ -154,7 +167,9 @@ XRAPI_ATTR XrResult XRAPI_CALL UnityLib::intercepted_xrWaitFrame(
154
167
// render_mtx2.unlock();
155
168
// }
156
169
157
- app->run_lib (frameState);
170
+ // app->run_lib(frameState);
171
+
172
+ framestate = frameState;
158
173
159
174
return result;
160
175
}
@@ -163,77 +178,145 @@ XRAPI_ATTR XrResult XRAPI_CALL UnityLib::intercepted_xrEndFrame(
163
178
XrSession session,
164
179
const XrFrameEndInfo * frameEndInfo)
165
180
{
166
- // Add rendered layers
167
- // layers.insert(layers.end(), UnityLib::rendered_layers.begin(), UnityLib::rendered_layers.end());
168
-
169
- // static bool doOnce = false;
170
- // if (!doOnce)
181
+ UnityLib::frameEndinfo = &const_cast <XrFrameEndInfo &>(*frameEndInfo);
182
+ UnityLib::session = session;
183
+ app->run_lib (framestate);
184
+
185
+
186
+
187
+ // // // Add rendered layers
188
+ // // layers.insert(layers.end(), UnityLib::rendered_layers.begin(), UnityLib::rendered_layers.end());
189
+
190
+ // // // static bool doOnce = false;
191
+ // // // if (!doOnce)
192
+ // // // {
193
+ // // // rendered_layers_safe = rendered_layers; // TODO Make thread safe etc
194
+ // // // doOnce = true;
195
+ // // // }
196
+
197
+ // // // spdlog::info("layers: {}", UnityLib::layers.size());
198
+
199
+ // // // render_mtx2.lock();
200
+
201
+ // // // for (uint32_t i = 0; i < UnityLib::layers.size(); ++i)
202
+ // // // {
203
+ // // // spdlog::info("Layer [{}]: Type: {}, Address: {}", i, static_cast<int>(UnityLib::layers[i]->type), reinterpret_cast<void *>(UnityLib::layers[i]));
204
+ // // // }
205
+
206
+ // // layers.clear();
207
+
208
+ // // // render_mtx2.unlock();
209
+ // // // render_mtx.unlock();
210
+
211
+ // // // single_layer = *const_cast<XrCompositionLayerBaseHeader *>(frameEndInfo->layers[0]);
212
+ // // // layers.push_back(&single_layer);
213
+
214
+ // // // layers.push_back(const_cast<XrCompositionLayerBaseHeader *>(frameEndInfo->layers[0]));
215
+
216
+ // // for (uint32_t i = 0; i < rendered_layers.size(); ++i)
217
+ // // {
218
+ // // spdlog::info("Planned Layer [{}]: Type: {}", i, static_cast<int>(rendered_layers[i].type));
219
+ // // layers.push_back(&rendered_layers[i]); // Problematic?
220
+ // // }
221
+
222
+ // // Create a local vector to hold all layer data as copies
223
+ // // std::vector<XrCompositionLayerBaseHeader> local_layers;
224
+
225
+ // // Copy rendered_layers into local_layers
226
+ // // local_layers.insert(local_layers.end(), rendered_layers.begin(), rendered_layers.end());
227
+
228
+ // // Copy frameEndInfo->layers into local_layers
229
+ // // for (uint32_t i = 0; i < frameEndInfo->layerCount; ++i)
230
+ // // {
231
+ // // local_layers.push_back(*frameEndInfo->layers[i]);
232
+ // // }
233
+
234
+ // // // Create a vector of pointers to the objects in local_layers
235
+ // // std::vector<const XrCompositionLayerBaseHeader *> layer_pointers;
236
+ // // // layer_pointers.reserve(frameEndInfo->layerCount + g_numLayers);
237
+ // // for (uint32_t i = 0; i < frameEndInfo->layerCount; ++i)
238
+ // // {
239
+ // // spdlog::info("Original Layer [{}]: Type: {}", i, static_cast<int>(frameEndInfo->layers[i]->type));
240
+ // // layer_pointers.push_back(frameEndInfo->layers[i]);
241
+ // // }
242
+ // // for (uint32_t i = 0; i < g_numLayers; ++i)
243
+ // // {
244
+ // // spdlog::info("Generated Layer [{}]: Type: {}, Address: {}", i, static_cast<int>(g_layerStorage[i].type), reinterpret_cast<void *>(&g_layerStorage[i]));
245
+ // // // layer_pointers.push_back(&g_layerStorage[i]);
246
+ // // }
247
+ // // // for (const auto& layer : local_layers)
248
+ // // // {
249
+ // // // layer_pointers.push_back(&layer);
250
+ // // // }
251
+
252
+ // // for (uint32_t i = 0; i < modifiedFrameEndInfo.layerCount; ++i)
253
+ // // {
254
+ // // spdlog::info("Layer [{}]: Type: {}", i, static_cast<int>(modifiedFrameEndInfo.layers[i]->type));
255
+ // // }
256
+
257
+ // // for (uint32_t i = 0; i < frameEndInfo->layerCount; ++i)
258
+ // // {
259
+ // // layers.push_back(const_cast<XrCompositionLayerBaseHeader *>(frameEndInfo->layers[i]));
260
+ // // }
261
+
262
+ // // modifiedFrameEndInfo = *frameEndInfo;
263
+ // // // spdlog::info("Actual layer count: {}", modifiedFrameEndInfo.layerCount);
264
+ // // // spdlog::info("Calculated layer count: {}", (uint32_t)layers.size());
265
+ // // modifiedFrameEndInfo.layerCount = (uint32_t)layers.size();
266
+ // // modifiedFrameEndInfo.layers = layers.data();
267
+
268
+ // // for (uint32_t i = 0; i < layers.size(); ++i)
269
+ // // {
270
+ // // spdlog::info("Layer [{}]: Type: {}, Address: {}", i, static_cast<int>(layers[i]->type), reinterpret_cast<void *>(layers[i]));
271
+ // // }
272
+
273
+ // for (uint32_t i = 0; i < frameEndInfo->layerCount; ++i)
171
274
// {
172
- // rendered_layers_safe = rendered_layers; // TODO Make thread safe etc
173
- // doOnce = true;
275
+ // special_layers.push_back(frameEndInfo->layers[i]);
174
276
// }
175
277
176
- // spdlog::info("layers: {}", UnityLib::layers.size());
177
-
178
- // render_mtx2.lock();
278
+ // // Update modifiedFrameEndInfo with the pointer to the array of pointers
279
+ // modifiedFrameEndInfo = *frameEndInfo;
280
+ // modifiedFrameEndInfo.layerCount = static_cast<uint32_t>(special_layers.size());
281
+ // modifiedFrameEndInfo.layers = special_layers.data();
179
282
180
- // for (uint32_t i = 0; i < UnityLib::layers.size(); ++i)
283
+ // XrResult result;
284
+ // try
181
285
// {
182
- // spdlog::info("Layer [{}]: Type: {}, Address: {}", i, static_cast<int>(UnityLib::layers[i]->type), reinterpret_cast<void *>(UnityLib::layers[i]));
183
- // }
286
+ // for (uint32_t i = 0; i < modifiedFrameEndInfo.layerCount; ++i)
287
+ // {
288
+ // spdlog::info("A Layer [{}]: Type: {}", i, static_cast<int>(modifiedFrameEndInfo.layers[i]->type));
289
+ // }
184
290
185
- // layers.clear( );
291
+ // result = s_xrEndFrame(session, &modifiedFrameEndInfo );
186
292
187
- // render_mtx2.unlock();
188
- // render_mtx.unlock();
293
+ // for (uint32_t i = 0; i < modifiedFrameEndInfo.layerCount; ++i)
294
+ // {
295
+ // spdlog::info("B Layer [{}]: Type: {}", i, static_cast<int>(modifiedFrameEndInfo.layers[i]->type));
296
+ // }
189
297
190
- // single_layer = *const_cast<XrCompositionLayerBaseHeader *>(frameEndInfo->layers[0]);
191
- // layers.push_back(&single_layer);
298
+ // // for (uint32_t i = 0; i < special_layers.size(); ++i)
299
+ // // {
300
+ // // FreeCompositionLayer(special_layers[i]);
301
+ // // }
302
+ // special_layers.clear();
192
303
193
- // layers.push_back(const_cast<XrCompositionLayerBaseHeader *>(frameEndInfo->layers[0]));
304
+ // if (XR_FAILED(result))
305
+ // {
306
+ // spdlog::error("xrEndFrame failed with error: {}", xr::to_string(result));
307
+ // }
194
308
195
- // for (uint32_t i = 0; i < rendered_layers_safe.size(); ++i)
309
+ // // render_mtx.unlock();
310
+ // }
311
+ // catch (std::exception & e)
196
312
// {
197
- // layers.push_back(&rendered_layers_safe[i] );
313
+ // spdlog::error("xrEndFrame threw error: {}", e.what() );
198
314
// }
199
-
200
- for (uint32_t i = 0 ; i < frameEndInfo->layerCount ; ++i)
201
- {
202
- layers.push_back (const_cast <XrCompositionLayerBaseHeader *>(frameEndInfo->layers [i]));
203
- }
204
-
205
- modifiedFrameEndInfo = *frameEndInfo;
206
- modifiedFrameEndInfo.layerCount = (uint32_t )layers.size ();
207
- modifiedFrameEndInfo.layers = layers.data ();
208
-
209
- // for (uint32_t i = 0; i < layers.size(); ++i)
315
+ // catch (...)
210
316
// {
211
- // spdlog::info("Layer [{}]: Type: {}, Address: {}", i, static_cast<int>(layers[i]->type), reinterpret_cast<void *>(layers[i]) );
317
+ // spdlog::error("xrEndFrame threw error" );
212
318
// }
213
319
214
- XrResult result;
215
- try
216
- {
217
- result = s_xrEndFrame (session, &modifiedFrameEndInfo);
218
-
219
- if (XR_FAILED (result))
220
- {
221
- spdlog::error (" xrEndFrame failed with error: {}" , xr::to_string (result));
222
- }
223
-
224
- // render_mtx.unlock();
225
- }
226
- catch (std::exception & e)
227
- {
228
- spdlog::error (" xrEndFrame threw error: {}" , e.what ());
229
- }
230
- catch (...)
231
- {
232
- spdlog::error (" xrEndFrame threw error" );
233
- }
234
-
235
- UnityLib::layers.clear ();
236
-
237
320
return result;
238
321
}
239
322
0 commit comments