The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

c/main: Add code to defer render target initialization

authored by

Maxim Kizub and committed by
Jakob Bornecrantz
f5a06f9c 8efb5540

+55 -10
+52 -10
src/xrt/compositor/main/comp_compositor.c
··· 115 115 * 116 116 */ 117 117 118 + static bool 119 + compositor_init_window_post_vulkan(struct comp_compositor *c); 120 + static bool 121 + compositor_init_swapchain(struct comp_compositor *c); 122 + static bool 123 + compositor_init_renderer(struct comp_compositor *c); 124 + 118 125 static xrt_result_t 119 126 compositor_begin_session(struct xrt_compositor *xc, enum xrt_view_type type) 120 127 { 121 128 struct comp_compositor *c = comp_compositor(xc); 122 129 COMP_DEBUG(c, "BEGIN_SESSION"); 130 + 131 + // clang-format off 132 + if (c->deferred_surface) { 133 + if (!compositor_init_window_post_vulkan(c) || 134 + !compositor_init_swapchain(c) || 135 + !compositor_init_renderer(c)) { 136 + COMP_ERROR(c, "Failed to init compositor %p", (void *)c); 137 + c->base.base.base.destroy(&c->base.base.base); 138 + 139 + return XRT_ERROR_VULKAN; 140 + } 141 + comp_target_set_title(c->target, WINDOW_TITLE); 142 + comp_renderer_add_debug_vars(c->r); 143 + } 144 + // clang-format on 145 + 123 146 return XRT_SUCCESS; 124 147 } 125 148 ··· 128 151 { 129 152 struct comp_compositor *c = comp_compositor(xc); 130 153 COMP_DEBUG(c, "END_SESSION"); 154 + 155 + if (c->deferred_surface) { 156 + // Make sure we don't have anything to destroy. 157 + comp_swapchain_garbage_collect(&c->base.cscgc); 158 + comp_renderer_destroy(&c->r); 159 + #ifdef XRT_FEATURE_WINDOW_PEEK 160 + comp_window_peek_destroy(&c->peek); 161 + #endif 162 + comp_target_destroy(&c->target); 163 + } 164 + 131 165 return XRT_SUCCESS; 132 166 } 133 167 ··· 1229 1263 !compositor_check_vulkan_caps(c) || 1230 1264 !compositor_init_window_pre_vulkan(c) || 1231 1265 !compositor_init_vulkan(c) || 1232 - !compositor_init_render_resources(c) || 1233 - !compositor_init_window_post_vulkan(c) || 1234 - !compositor_init_swapchain(c) || 1235 - !compositor_init_renderer(c)) { 1266 + !compositor_init_render_resources(c)) { 1236 1267 COMP_ERROR(c, "Failed to init compositor %p", (void *)c); 1237 1268 c->base.base.base.destroy(&c->base.base.base); 1238 1269 1239 1270 return XRT_ERROR_VULKAN; 1240 1271 } 1272 + 1273 + if (!c->deferred_surface) { 1274 + if (!compositor_init_window_post_vulkan(c) || 1275 + !compositor_init_swapchain(c) || 1276 + !compositor_init_renderer(c)) { 1277 + COMP_ERROR(c, "Failed to init compositor %p", (void*)c); 1278 + c->base.base.base.destroy(&c->base.base.base); 1279 + 1280 + return XRT_ERROR_VULKAN; 1281 + } 1282 + comp_target_set_title(c->target, WINDOW_TITLE); 1283 + } 1241 1284 // clang-format on 1242 - 1243 - comp_target_set_title(c->target, WINDOW_TITLE); 1244 1285 1245 1286 COMP_DEBUG(c, "Done %p", (void *)c); 1246 1287 ··· 1317 1358 sys_info->num_refresh_rates = 1; 1318 1359 sys_info->refresh_rates[0] = (float)(1. / time_ns_to_s(c->settings.nominal_frame_interval_ns)); 1319 1360 1320 - 1321 - 1322 - comp_renderer_add_debug_vars(c->r); 1361 + // Needs to be delayed until after compositor's u_var has been setup. 1362 + if (!c->deferred_surface) { 1363 + comp_renderer_add_debug_vars(c->r); 1364 + } 1323 1365 1324 1366 c->state = COMP_STATE_READY; 1325 1367 ··· 1328 1370 xrt_result_t xret = u_pa_factory_create(&upaf); 1329 1371 assert(xret == XRT_SUCCESS && upaf != NULL); 1330 1372 1331 - return comp_multi_create_system_compositor(&c->base.base, upaf, sys_info, true, out_xsysc); 1373 + return comp_multi_create_system_compositor(&c->base.base, upaf, sys_info, !c->deferred_surface, out_xsysc); 1332 1374 }
+3
src/xrt/compositor/main/comp_compositor.h
··· 133 133 //! Temporarily disable ATW 134 134 bool atw_off; 135 135 } debug; 136 + 137 + //! If true, part of the compositor startup will be delayed until a session is started 138 + bool deferred_surface; 136 139 }; 137 140 138 141