The open source OpenXR runtime
0
fork

Configure Feed

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

c/render: Use sub-allocation for mesh shader UBOs

+46 -26
+38 -3
src/xrt/compositor/main/comp_renderer.c
··· 806 806 VkImageView src_image_views[2], 807 807 const struct xrt_normalized_rect src_norm_rects[2]) 808 808 { 809 + struct vk_bundle *vk = &r->c->base.vk; 810 + VkResult ret; 811 + 812 + /* 813 + * Reserve UBOs and fill in any data a head of time, if we ever want to 814 + * copy UBO data this lets us do that easily write a copy command before 815 + * the other gfx commands. 816 + */ 817 + struct render_sub_alloc ubos[2]; 818 + for (uint32_t i = 0; i < 2; i++) { 819 + 820 + struct render_gfx_mesh_ubo_data data = { 821 + .vertex_rot = vertex_rots[i], 822 + .post_transform = src_norm_rects[i], 823 + }; 824 + 825 + ret = render_sub_alloc_ubo_alloc_and_write( // 826 + vk, // vk_bundle 827 + &rr->ubo_tracker, // rsat 828 + &data, // ptr 829 + sizeof(data), // size 830 + &ubos[i]); // out_rsa 831 + VK_CHK_WITH_GOTO(ret, "render_sub_alloc_ubo_alloc_and_write", err_no_memory); 832 + } 833 + 834 + 835 + /* 836 + * Do command writing here. 837 + */ 838 + 809 839 render_gfx_begin_target( // 810 840 rr, // 811 841 rtr); // ··· 819 849 render_gfx_distortion( // 820 850 rr, // 821 851 i, // 822 - &vertex_rots[i], // 852 + &ubos[i], // 823 853 src_samplers[i], // 824 - src_image_views[i], // 825 - &src_norm_rects[i]); // 854 + src_image_views[i]); // 826 855 827 856 render_gfx_end_view(rr); 828 857 } 829 858 830 859 render_gfx_end_target(rr); 860 + 861 + return; 862 + 863 + err_no_memory: 864 + // Allocator reset at end of frame, nothing to clean up. 865 + VK_ERROR(vk, "Could not allocate all UBOs for frame, that's really strange and shouldn't happen!"); 831 866 } 832 867 833 868 /*!
+6 -20
src/xrt/compositor/render/render_gfx.c
··· 356 356 VkImageView image_view, 357 357 uint32_t ubo_binding, 358 358 VkBuffer buffer, 359 + VkDeviceSize offset, 359 360 VkDeviceSize size, 360 361 VkDescriptorSet descriptor_set) 361 362 { ··· 367 368 368 369 VkDescriptorBufferInfo buffer_info = { 369 370 .buffer = buffer, 370 - .offset = 0, 371 + .offset = offset, 371 372 .range = size, 372 373 }; 373 374 ··· 714 715 } 715 716 716 717 void 717 - render_gfx_distortion(struct render_gfx *rr, 718 - uint32_t view_index, 719 - const struct xrt_matrix_2x2 *vertex_rot, 720 - VkSampler sampler, 721 - VkImageView image_view, 722 - const struct xrt_normalized_rect *src_rect) 718 + render_gfx_distortion( 719 + struct render_gfx *rr, uint32_t view_index, struct render_sub_alloc *ubo, VkSampler sampler, VkImageView image_view) 723 720 { 724 721 struct vk_bundle *vk = vk_from_rr(rr); 725 722 struct render_resources *r = rr->r; ··· 728 725 729 726 struct render_gfx_view *v = &rr->views[view_index]; 730 727 731 - struct render_buffer *ubo = &r->mesh.ubos[view_index]; 732 728 VkDescriptorSet descriptor_set = v->mesh.descriptor_set; 733 729 734 - /* 735 - * UBO data. 736 - */ 737 - 738 - struct render_gfx_mesh_ubo_data data = { 739 - .vertex_rot = *vertex_rot, 740 - .post_transform = *src_rect, 741 - }; 742 - 743 - render_buffer_write(vk, ubo, &data, sizeof(struct render_gfx_mesh_ubo_data)); 744 - 745 730 746 731 /* 747 732 * Descriptors and pipeline. ··· 754 739 image_view, // image_view 755 740 r->mesh.ubo_binding, // ubo_binding 756 741 ubo->buffer, // buffer 757 - VK_WHOLE_SIZE, // size 742 + ubo->offset, // offset 743 + ubo->size, // size 758 744 descriptor_set); // descriptor_set 759 745 760 746 VkDescriptorSet descriptor_sets[1] = {descriptor_set};
+2 -3
src/xrt/compositor/render/render_interface.h
··· 898 898 void 899 899 render_gfx_distortion(struct render_gfx *rr, 900 900 uint32_t view_index, 901 - const struct xrt_matrix_2x2 *vertex_rot, 901 + struct render_sub_alloc *ubo, 902 902 VkSampler sampler, 903 - VkImageView image_view, 904 - const struct xrt_normalized_rect *src_rect); 903 + VkImageView image_view); 905 904 906 905 /*! 907 906 * @}