Skip to content

Commit 3b9638c

Browse files
committed
Big Mess
1 parent c050ef1 commit 3b9638c

File tree

15 files changed

+419
-195
lines changed

15 files changed

+419
-195
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
"--header-insertion=never",
55
"--compile-commands-dir=${workspaceFolder}/.cxx/tools/standardDebug/arm64-v8a/",
66
"--query-driver=**"
7-
]
7+
],
8+
"cSpell.enabled": false
89
}

client/application.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,7 +1489,7 @@ application::application(application_info info) :
14891489
spdlog::debug("Config path: {}", config_path.native());
14901490
spdlog::debug("Cache path: {}", cache_path.native());
14911491

1492-
#ifndef __ANDROID_LIB__
1492+
// #ifndef __ANDROID_LIB__
14931493
try
14941494
{
14951495
initialize();
@@ -1500,7 +1500,7 @@ application::application(application_info info) :
15001500
cleanup();
15011501
throw;
15021502
}
1503-
#endif
1503+
// #endif
15041504
}
15051505

15061506
#ifdef __ANDROID_LIB__

client/lib.cpp

Lines changed: 142 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,18 @@ const XrSessionCreateInfo * UnityLib::sessionCreateInfo;
1919
PFN_xrGetInstanceProcAddr UnityLib::s_xrGetInstanceProcAddr = nullptr;
2020
// std::vector<XrCompositionLayerBaseHeader *> empty_layers; // Default empty vector
2121
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;
2332
// std::vector<XrCompositionLayerBaseHeader> UnityLib::rendered_layers_safe;
24-
static std::vector<XrCompositionLayerBaseHeader> rendered_layers_safe;
33+
// static std::vector<XrCompositionLayerBaseHeader> rendered_layers_safe;
2534
static XrCompositionLayerBaseHeader single_layer;
2635
XrFrameEndInfo UnityLib::modifiedFrameEndInfo;
2736
PFN_xrEndFrame UnityLib::s_xrEndFrame = nullptr;
@@ -31,11 +40,15 @@ PFN_xrWaitFrame UnityLib::s_xrWaitFrame = nullptr;
3140
XrFrameState * UnityLib::framestate = nullptr;
3241
std::mutex UnityLib::render_mtx;
3342
std::mutex UnityLib::render_mtx2;
43+
std::mutex UnityLib::special_render_mtx;
3444
std::mutex UnityLib::app_thread_mtx;
3545
std::condition_variable UnityLib::app_thread_cv;
3646
bool UnityLib::app_thread_flag = false;
3747
std::thread UnityLib::application_thread;
3848

49+
XrCompositionLayerBaseHeader UnityLib::g_layerStorage[6];
50+
size_t UnityLib::g_numLayers = 0;
51+
3952
// Private constructor to prevent direct instantiation
4053
UnityLib::UnityLib()
4154
{
@@ -154,7 +167,9 @@ XRAPI_ATTR XrResult XRAPI_CALL UnityLib::intercepted_xrWaitFrame(
154167
// render_mtx2.unlock();
155168
// }
156169

157-
app->run_lib(frameState);
170+
// app->run_lib(frameState);
171+
172+
framestate = frameState;
158173

159174
return result;
160175
}
@@ -163,77 +178,145 @@ XRAPI_ATTR XrResult XRAPI_CALL UnityLib::intercepted_xrEndFrame(
163178
XrSession session,
164179
const XrFrameEndInfo * frameEndInfo)
165180
{
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)
171274
// {
172-
// rendered_layers_safe = rendered_layers; // TODO Make thread safe etc
173-
// doOnce = true;
275+
// special_layers.push_back(frameEndInfo->layers[i]);
174276
// }
175277

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();
179282

180-
// for (uint32_t i = 0; i < UnityLib::layers.size(); ++i)
283+
// XrResult result;
284+
// try
181285
// {
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+
// }
184290

185-
// layers.clear();
291+
// result = s_xrEndFrame(session, &modifiedFrameEndInfo);
186292

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+
// }
189297

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();
192303

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+
// }
194308

195-
// for (uint32_t i = 0; i < rendered_layers_safe.size(); ++i)
309+
// // render_mtx.unlock();
310+
// }
311+
// catch (std::exception & e)
196312
// {
197-
// layers.push_back(&rendered_layers_safe[i]);
313+
// spdlog::error("xrEndFrame threw error: {}", e.what());
198314
// }
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 (...)
210316
// {
211-
// spdlog::info("Layer [{}]: Type: {}, Address: {}", i, static_cast<int>(layers[i]->type), reinterpret_cast<void *>(layers[i]));
317+
// spdlog::error("xrEndFrame threw error");
212318
// }
213319

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-
237320
return result;
238321
}
239322

client/lib.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class UnityLib
2626
static uint64_t g_systemId;
2727
static uint64_t g_session;
2828

29+
2930
// JNI related
3031
static JNIEnv * jnienv;
3132
static AAssetManager * assetManager;
@@ -34,16 +35,30 @@ class UnityLib
3435
static const XrSessionCreateInfo * sessionCreateInfo;
3536
static PFN_xrGetInstanceProcAddr s_xrGetInstanceProcAddr;
3637
static std::vector<XrCompositionLayerBaseHeader *> layers;
37-
// static std::vector<XrCompositionLayerBaseHeader> rendered_layers;
38+
static std::vector<const XrCompositionLayerBaseHeader *> special_layers;
39+
static std::vector<std::unique_ptr<XrCompositionLayerBaseHeader>> very_special_layers;
40+
static std::vector<std::unique_ptr<XrCompositionLayerBaseHeader>> noDisplayLayers;
41+
static std::unique_ptr<XrSpace> space;
42+
static std::unique_ptr<std::pair<XrViewStateFlags, std::vector<XrView>>> flag_views;
43+
// std::vector<XrCompositionLayerBaseHeader *> special_layers;
44+
static std::vector<std::shared_ptr<XrCompositionLayerBaseHeader>> persistent_layers;
45+
static std::vector<XrCompositionLayerBaseHeader> rendered_layers;
3846
static XrFrameEndInfo modifiedFrameEndInfo;
3947
static PFN_xrEndFrame s_xrEndFrame;
4048
static PFN_xrCreateSession s_xrCreateSession;
4149
static PFN_xrCreateVulkanInstanceKHR s_xrCreateVulkanInstanceKHR;
4250
static PFN_xrWaitFrame s_xrWaitFrame;
4351
static XrFrameState * framestate;
52+
static XrFrameEndInfo* frameEndinfo;
53+
static XrResult result;
54+
static XrSession session;
55+
56+
static XrCompositionLayerBaseHeader g_layerStorage[6];
57+
static size_t g_numLayers;
4458

4559
static std::mutex render_mtx;
4660
static std::mutex render_mtx2;
61+
static std::mutex special_render_mtx;
4762

4863
void debugLog(std::string message);
4964
void setupOpenXRHooks();

0 commit comments

Comments
 (0)