The open source OpenXR runtime

c/main: Remove the command buffer in layer renderer

This makes it so that we only use one command buffer
for the entire frame, which gives us a nice speed up.

+18 -43
+1 -29
src/xrt/compositor/main/comp_layer_renderer.c
··· 404 404 math_matrix_4x4_identity(&self->mat_eye_view[i]); 405 405 } 406 406 407 - VkResult ret = vk_cmd_pool_init(vk, &self->pool, 0); 408 - if (ret != VK_SUCCESS) { 409 - VK_ERROR(vk, "vk_cmd_pool_init: %s", vk_result_string(ret)); 410 - return false; 411 - } 412 - 413 407 414 408 if (!_init_descriptor_layout(self)) 415 409 return false; ··· 534 528 535 529 void 536 530 comp_layer_renderer_draw(struct comp_layer_renderer *self, 531 + VkCommandBuffer cmd_buffer, 537 532 struct render_gfx_target_resources *rtr_left, 538 533 struct render_gfx_target_resources *rtr_right) 539 534 { 540 535 COMP_TRACE_MARKER(); 541 - VkResult ret; 542 536 543 537 struct vk_bundle *vk = self->vk; 544 - struct vk_cmd_pool *pool = &self->pool; 545 - 546 - // Writing and submitting commands. 547 - vk_cmd_pool_lock(pool); 548 - 549 - VkCommandBuffer cmd_buffer; 550 - ret = vk_cmd_pool_create_and_begin_cmd_buffer_locked(vk, pool, 0, &cmd_buffer); 551 - if (ret != VK_SUCCESS) { 552 - vk_cmd_pool_unlock(pool); 553 - return; 554 - } 555 538 556 539 VkExtent2D extent = rtr_left->extent; 557 540 assert(extent.width == rtr_right->extent.width); ··· 567 550 } else { 568 551 _render_stereo(self, vk, cmd_buffer, extent, framebuffers, &background_color_active); 569 552 } 570 - 571 - // Done writing commands, submit to queue, waits for command to finish. 572 - ret = vk_cmd_pool_end_submit_wait_and_free_cmd_buffer_locked(vk, pool, cmd_buffer); 573 - 574 - // Done submitting commands. 575 - vk_cmd_pool_unlock(pool); 576 - 577 - // Check results from submit. 578 - vk_check_error("vk_submit_cmd_buffer", ret, ); 579 553 } 580 554 581 555 void ··· 616 590 vk_buffer_destroy(&self->vertex_buffer, vk); 617 591 618 592 vk->vkDestroyPipelineCache(vk->device, self->pipeline_cache, NULL); 619 - 620 - vk_cmd_pool_destroy(vk, &self->pool); 621 593 622 594 free(self); 623 595 *ptr_clr = NULL;
+1 -2
src/xrt/compositor/main/comp_layer_renderer.h
··· 20 20 { 21 21 struct vk_bundle *vk; 22 22 23 - struct vk_cmd_pool pool; 24 - 25 23 //! Render pass used to create all pipelines. 26 24 struct render_gfx_render_pass *rgrp; 27 25 ··· 78 76 */ 79 77 void 80 78 comp_layer_renderer_draw(struct comp_layer_renderer *self, 79 + VkCommandBuffer cmd_buffer, 81 80 struct render_gfx_target_resources *rtr_left, 82 81 struct render_gfx_target_resources *rtr_right); 83 82
+16 -12
src/xrt/compositor/main/comp_renderer.c
··· 273 273 struct xrt_view *r_v = &r->c->xdev->hmd->views[1]; 274 274 275 275 276 - /* 277 - * Begin 278 - */ 279 - 280 - render_gfx_begin(rr); 281 - 282 276 283 277 /* 284 278 * Update ··· 365 359 */ 366 360 367 361 render_gfx_end_target(rr); 368 - 369 - // Make the command buffer usable. 370 - render_gfx_end(rr); 371 362 } 372 363 373 364 /*! ··· 937 928 struct render_gfx_target_resources *rtr = &r->rtr_array[r->acquired_buffer]; 938 929 bool one_projection_layer_fast_path = c->base.slot.one_projection_layer_fast_path; 939 930 931 + // Need to be begin for all paths. 932 + render_gfx_begin(rr); 933 + 940 934 // No fast path, standard layer renderer path. 941 935 if (!one_projection_layer_fast_path) { 942 - // We mark here to include the layer rendering in the GPU time. 943 - comp_target_mark_submit(ct, c->frame.rendering.id, os_monotonic_get_ns()); 944 - 945 936 renderer_get_view_projection(r); 946 937 comp_layer_renderer_draw( // 947 938 r->lr, // 939 + c->nr.cmd, // 948 940 &r->scratch_targets[0], // 949 941 &r->scratch_targets[1]); // 950 942 ··· 964 956 }; 965 957 966 958 renderer_build_rendering(r, rr, rtr, src_samplers, src_image_views, src_norm_rects); 959 + 960 + // Make the command buffer usable. 961 + render_gfx_end(rr); 967 962 968 963 renderer_submit_queue(r, rr->r->cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); 969 964 965 + // We mark afterwards to not include CPU time spent. 966 + comp_target_mark_submit(ct, c->frame.rendering.id, os_monotonic_get_ns()); 967 + 970 968 return; 971 969 } 972 970 ··· 994 992 995 993 do_gfx_mesh_and_proj(r, rr, rtr, layer, lvd, rvd); 996 994 995 + // Make the command buffer usable. 996 + render_gfx_end(rr); 997 + 997 998 renderer_submit_queue(r, rr->r->cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); 998 999 999 1000 // We mark afterwards to not include CPU time spent. ··· 1011 1012 c->base.slot.fovs[1] = rvd->fov; 1012 1013 1013 1014 do_gfx_mesh_and_proj(r, rr, rtr, layer, lvd, rvd); 1015 + 1016 + // Make the command buffer usable. 1017 + render_gfx_end(rr); 1014 1018 1015 1019 renderer_submit_queue(r, rr->r->cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); 1016 1020