The open source OpenXR runtime
0
fork

Configure Feed

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

c/client: Remove acquire_release_fence completely

The barriers are a completely GPU affair no need to syncronize with the host.

+18 -33
+18 -32
src/xrt/compositor/client/comp_vk_client.c
··· 228 228 struct client_vk_compositor *c = sc->c; 229 229 struct vk_bundle *vk = &c->vk; 230 230 231 - for (uint32_t i = 0; i < sc->base.base.image_count; i++) { 232 - 233 - VkResult ret = vk->vkWaitForFences(vk->device, 1, &sc->acquire_release_fence[i], true, MS_TO_NS(500)); 234 - if (vk_has_error(ret, "vkWaitForFences", __FILE__, __LINE__)) { 235 - // don't really care, we are going to destroy anyway, just make sure it's not used anymore 236 - vk->vkDeviceWaitIdle(vk->device); 237 - } 231 + // Make sure images are not used anymore. 232 + vk->vkDeviceWaitIdle(vk->device); 238 233 234 + for (uint32_t i = 0; i < sc->base.base.image_count; i++) { 239 235 if (sc->base.images[i] != VK_NULL_HANDLE) { 240 236 vk->vkDestroyImage(vk->device, sc->base.images[i], NULL); 241 237 sc->base.images[i] = VK_NULL_HANDLE; ··· 261 257 struct client_vk_swapchain *sc = client_vk_swapchain(xsc); 262 258 struct vk_bundle *vk = &sc->c->vk; 263 259 260 + uint32_t index = 0; 261 + 264 262 // Pipe down call into native swapchain. 265 - xrt_result_t xret = xrt_swapchain_acquire_image(&sc->xscn->base, out_index); 263 + xrt_result_t xret = xrt_swapchain_acquire_image(&sc->xscn->base, &index); 266 264 if (xret != XRT_SUCCESS) { 267 265 return xret; 268 266 } 269 267 270 268 VkResult ret; 271 269 272 - ret = vk->vkWaitForFences(vk->device, 1, &sc->acquire_release_fence[*out_index], true, MS_TO_NS(500)); 273 - vk_check_error("vkWaitForFences", ret, XRT_ERROR_VULKAN); 274 270 275 - ret = vk->vkResetFences(vk->device, 1, &sc->acquire_release_fence[*out_index]); 276 - vk_check_error("vkResetFences", ret, XRT_ERROR_VULKAN); 271 + COMP_TRACE_IDENT(submit); 277 272 278 273 // Acquire ownership and complete layout transition 279 274 VkSubmitInfo submitInfo = { 280 275 .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, 281 276 .commandBufferCount = 1, 282 - .pCommandBuffers = &sc->acquire[*out_index], 277 + .pCommandBuffers = &sc->acquire[index], 283 278 }; 284 279 285 - ret = vk_locked_submit(vk, vk->queue, 1, &submitInfo, sc->acquire_release_fence[*out_index]); 280 + // Note we do not submit a fence here, it's not needed. 281 + ret = vk_locked_submit(vk, vk->queue, 1, &submitInfo, VK_NULL_HANDLE); 286 282 if (ret != VK_SUCCESS) { 287 283 VK_ERROR(vk, "Could not submit to queue: %d", ret); 288 284 return XRT_ERROR_FAILED_TO_SUBMIT_VULKAN_COMMANDS; 289 285 } 286 + 287 + // Finally done. 288 + *out_index = index; 290 289 291 290 return XRT_SUCCESS; 292 291 } ··· 313 312 VkResult ret; 314 313 315 314 { 316 - COMP_TRACE_IDENT("fence"); 317 - 318 - ret = vk->vkWaitForFences(vk->device, 1, &sc->acquire_release_fence[index], true, MS_TO_NS(500)); 319 - vk_check_error("vkWaitForFences", ret, XRT_ERROR_VULKAN); 320 - 321 - vk->vkResetFences(vk->device, 1, &sc->acquire_release_fence[index]); 322 - vk_check_error("vkResetFences", ret, XRT_ERROR_VULKAN); 323 - } 324 - 325 - { 326 - COMP_TRACE_IDENT("submit"); 315 + COMP_TRACE_IDENT(submit); 327 316 328 317 // Release ownership and begin layout transition 329 318 VkSubmitInfo submitInfo = { ··· 332 321 .pCommandBuffers = &sc->release[index], 333 322 }; 334 323 335 - ret = vk_locked_submit(vk, vk->queue, 1, &submitInfo, sc->acquire_release_fence[index]); 324 + // Note we do not submit a fence here, it's not needed. 325 + ret = vk_locked_submit(vk, vk->queue, 1, &submitInfo, VK_NULL_HANDLE); 336 326 if (ret != VK_SUCCESS) { 337 327 VK_ERROR(vk, "Could not submit to queue: %d", ret); 338 328 return XRT_ERROR_FAILED_TO_SUBMIT_VULKAN_COMMANDS; 339 329 } 340 330 } 331 + 332 + COMP_TRACE_IDENT(release_image); 341 333 342 334 // Pipe down call into native swapchain. 343 335 return xrt_swapchain_release_image(&sc->xscn->base, index); ··· 755 747 VK_ERROR(vk, "vkEndCommandBuffer: %s", vk_result_string(ret)); 756 748 return XRT_ERROR_VULKAN; 757 749 } 758 - 759 - VkFenceCreateInfo fence_create_info = { 760 - .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, 761 - .flags = VK_FENCE_CREATE_SIGNALED_BIT, 762 - }; 763 - vk->vkCreateFence(vk->device, &fence_create_info, NULL, &sc->acquire_release_fence[i]); 764 750 } 765 751 766 752 *out_xsc = &sc->base.base;
-1
src/xrt/compositor/client/comp_vk_client.h
··· 50 50 // Prerecorded swapchain image ownership/layout transition barriers 51 51 VkCommandBuffer acquire[XRT_MAX_SWAPCHAIN_IMAGES]; 52 52 VkCommandBuffer release[XRT_MAX_SWAPCHAIN_IMAGES]; 53 - VkFence acquire_release_fence[XRT_MAX_SWAPCHAIN_IMAGES]; 54 53 }; 55 54 56 55 /*!