The open source OpenXR runtime
0
fork

Configure Feed

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

c/render: Add scaffolding for sub-allocating UBOs

+60
+3
src/xrt/compositor/render/render_gfx.c
··· 534 534 &rr->views[1].mesh.descriptor_set); // descriptor_set 535 535 VK_CHK_WITH_RET(ret, "vk_create_descriptor_set", false); 536 536 537 + // Used to sub-allocate UBOs from, restart from scratch each frame. 538 + render_sub_alloc_tracker_init(&rr->ubo_tracker, &r->gfx.shared_ubo); 539 + 537 540 return true; 538 541 } 539 542
+15
src/xrt/compositor/render/render_interface.h
··· 388 388 389 389 struct 390 390 { 391 + /*! 392 + * Shared UBO buffer that we sub-allocate out of, this is to 393 + * have fewer buffers that the kernel needs to validate on 394 + * command submission time. 395 + * 396 + * https://registry.khronos.org/vulkan/site/guide/latest/memory_allocation.html 397 + */ 398 + struct render_buffer shared_ubo; 399 + } gfx; 400 + 401 + struct 402 + { 391 403 //! The binding index for the source texture. 392 404 uint32_t src_binding; 393 405 ··· 781 793 { 782 794 //! Resources that we are based on. 783 795 struct render_resources *r; 796 + 797 + //! Shared buffer that we sub-allocate UBOs from. 798 + struct render_sub_alloc_tracker ubo_tracker; 784 799 785 800 //! The current target we are rendering too, can change during command building. 786 801 struct render_gfx_target_resources *rtr;
+42
src/xrt/compositor/render/render_resources.c
··· 657 657 658 658 659 659 /* 660 + * Gfx. 661 + */ 662 + 663 + { 664 + VkBufferUsageFlags usage_flags = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; 665 + VkMemoryPropertyFlags memory_property_flags = // 666 + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | // 667 + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; // 668 + 669 + uint32_t num_buffers = 0; 670 + 671 + // Number of layer shader runs (views), number of layers, two UBOs per layer. 672 + num_buffers += RENDER_MAX_LAYER_RUNS * RENDER_MAX_LAYERS * 2; 673 + 674 + // Two mesh distortion runs with one UBO each. 675 + num_buffers += 2; 676 + 677 + // We currently use the aligmnent as max UBO size. 678 + static_assert(sizeof(struct render_gfx_mesh_ubo_data) <= RENDER_ALWAYS_SAFE_UBO_ALIGNMENT, "MAX"); 679 + 680 + // Calculate size. 681 + VkDeviceSize size = num_buffers * RENDER_ALWAYS_SAFE_UBO_ALIGNMENT; 682 + 683 + ret = render_buffer_init( // 684 + vk, // vk_bundle 685 + &r->gfx.shared_ubo, // buffer 686 + usage_flags, // usage_flags 687 + memory_property_flags, // memory_property_flags 688 + size); // size 689 + VK_CHK_WITH_RET(ret, "render_buffer_init", false); 690 + 691 + ret = render_buffer_map( // 692 + vk, // vk_bundle 693 + &r->gfx.shared_ubo); // buffer 694 + VK_CHK_WITH_RET(ret, "render_buffer_map", false); 695 + } 696 + 697 + 698 + /* 660 699 * Mesh static. 661 700 */ 662 701 ··· 961 1000 D(ImageView, r->mock.color.image_view); 962 1001 D(Image, r->mock.color.image); 963 1002 DF(Memory, r->mock.color.memory); 1003 + 1004 + render_buffer_close(vk, &r->gfx.shared_ubo); 1005 + 964 1006 D(DescriptorSetLayout, r->mesh.descriptor_set_layout); 965 1007 D(PipelineLayout, r->mesh.pipeline_layout); 966 1008 D(PipelineCache, r->pipeline_cache);