The open source OpenXR runtime
0
fork

Configure Feed

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

c/render: Refactor gfx mesh shader allocation and dispatch

+87 -37
+16 -17
src/xrt/compositor/main/comp_renderer.c
··· 810 810 VkResult ret; 811 811 812 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. 813 + * Reserve UBOs, create descriptor sets, and fill in any data a head of 814 + * time, if we ever want to copy UBO data this lets us do that easily 815 + * write a copy command before the other gfx commands. 816 816 */ 817 - struct render_sub_alloc ubos[2]; 817 + 818 + VkDescriptorSet descriptor_sets[2] = XRT_STRUCT_INIT; 818 819 for (uint32_t i = 0; i < 2; i++) { 819 820 820 821 struct render_gfx_mesh_ubo_data data = { ··· 822 823 .post_transform = src_norm_rects[i], 823 824 }; 824 825 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); 826 + ret = render_gfx_mesh_alloc_and_write( // 827 + rr, // 828 + &data, // 829 + src_samplers[i], // 830 + src_image_views[i], // 831 + &descriptor_sets[i]); // 832 + VK_CHK_WITH_GOTO(ret, "render_gfx_mesh_alloc", err_no_memory); 832 833 } 833 834 834 835 ··· 846 847 i, // view_index 847 848 &viewport_datas[i]); // viewport_data 848 849 849 - render_gfx_distortion( // 850 - rr, // 851 - i, // 852 - &ubos[i], // 853 - src_samplers[i], // 854 - src_image_views[i]); // 850 + render_gfx_mesh_draw( // 851 + rr, // rr 852 + i, // mesh_index 853 + descriptor_sets[i]); // descriptor_set 855 854 856 855 render_gfx_end_view(rr); 857 856 }
+50 -14
src/xrt/compositor/render/render_gfx.c
··· 714 714 assert(rr->rtr != NULL); 715 715 } 716 716 717 - void 718 - render_gfx_distortion( 719 - struct render_gfx *rr, uint32_t view_index, struct render_sub_alloc *ubo, VkSampler sampler, VkImageView image_view) 717 + XRT_CHECK_RESULT VkResult 718 + render_gfx_mesh_alloc_and_write(struct render_gfx *rr, 719 + const struct render_gfx_mesh_ubo_data *data, 720 + VkSampler src_sampler, 721 + VkImageView src_image_view, 722 + VkDescriptorSet *out_descriptor_set) 720 723 { 724 + VkDescriptorSet descriptor_set = VK_NULL_HANDLE; 725 + struct render_sub_alloc ubo = XRT_STRUCT_INIT; 721 726 struct vk_bundle *vk = vk_from_rr(rr); 722 727 struct render_resources *r = rr->r; 728 + VkResult ret; 723 729 724 - assert(view_index == rr->current_view); 725 730 726 - struct render_gfx_view *v = &rr->views[view_index]; 731 + /* 732 + * Allocate and upload data. 733 + */ 727 734 728 - VkDescriptorSet descriptor_set = v->mesh.descriptor_set; 735 + ret = render_sub_alloc_ubo_alloc_and_write( // 736 + vk, // vk_bundle 737 + &rr->ubo_tracker, // rsat 738 + data, // ptr 739 + sizeof(*data), // size 740 + &ubo); // out_rsa 741 + VK_CHK_AND_RET(ret, "render_sub_alloc_ubo_alloc_and_write"); 729 742 730 743 731 744 /* 732 - * Descriptors and pipeline. 745 + * Create and fill out destriptor. 733 746 */ 734 747 748 + ret = vk_create_descriptor_set( // 749 + vk, // vk_bundle 750 + r->mesh.descriptor_pool, // descriptor_pool 751 + r->mesh.descriptor_set_layout, // descriptor_set_layout 752 + &descriptor_set); // descriptor_set 753 + VK_CHK_AND_RET(ret, "vk_create_descriptor_set"); 754 + 735 755 update_mesh_discriptor_set( // 736 756 vk, // vk_bundle 737 757 r->mesh.src_binding, // src_binding 738 - sampler, // sampler 739 - image_view, // image_view 758 + src_sampler, // sampler 759 + src_image_view, // image_view 740 760 r->mesh.ubo_binding, // ubo_binding 741 - ubo->buffer, // buffer 742 - ubo->offset, // offset 743 - ubo->size, // size 761 + ubo.buffer, // buffer 762 + ubo.offset, // offset 763 + ubo.size, // size 744 764 descriptor_set); // descriptor_set 765 + 766 + *out_descriptor_set = descriptor_set; 767 + 768 + return VK_SUCCESS; 769 + } 770 + 771 + void 772 + render_gfx_mesh_draw(struct render_gfx *rr, uint32_t mesh_index, VkDescriptorSet descriptor_set) 773 + { 774 + struct vk_bundle *vk = vk_from_rr(rr); 775 + struct render_resources *r = rr->r; 776 + 777 + 778 + /* 779 + * Descriptors and pipeline. 780 + */ 745 781 746 782 VkDescriptorSet descriptor_sets[1] = {descriptor_set}; 747 783 vk->vkCmdBindDescriptorSets( // ··· 789 825 790 826 vk->vkCmdDrawIndexed( // 791 827 r->cmd, // commandBuffer 792 - r->mesh.index_counts[view_index], // indexCount 828 + r->mesh.index_counts[mesh_index], // indexCount 793 829 1, // instanceCount 794 - r->mesh.index_offsets[view_index], // firstIndex 830 + r->mesh.index_offsets[mesh_index], // firstIndex 795 831 0, // vertexOffset 796 832 0); // firstInstance 797 833 } else {
+21 -6
src/xrt/compositor/render/render_interface.h
··· 891 891 render_gfx_end_view(struct render_gfx *rr); 892 892 893 893 /*! 894 - * Dispatch one mesh shader instance into the current view. 894 + * Allocate needed resources for one mesh shader dispatch, will also update the 895 + * descriptor set, ubo will be filled out with the given @p data argument. 896 + * 897 + * Uses the @ref render_sub_alloc_tracker of the @ref render_gfx and the 898 + * descriptor pool of @ref render_resources, both of which will be reset once 899 + * closed, so don't save any reference to these objects beyond the frame. 900 + * 901 + * @public @memberof render_gfx 902 + */ 903 + XRT_CHECK_RESULT VkResult 904 + render_gfx_mesh_alloc_and_write(struct render_gfx *rr, 905 + const struct render_gfx_mesh_ubo_data *data, 906 + VkSampler src_sampler, 907 + VkImageView src_image_view, 908 + VkDescriptorSet *out_descriptor_set); 909 + 910 + /*! 911 + * Dispatch one mesh shader instance, using the give @p mesh_index as source for 912 + * mesh geometry. 895 913 * 896 914 * @public @memberof render_gfx 897 915 */ 898 916 void 899 - render_gfx_distortion(struct render_gfx *rr, 900 - uint32_t view_index, 901 - struct render_sub_alloc *ubo, 902 - VkSampler sampler, 903 - VkImageView image_view); 917 + render_gfx_mesh_draw(struct render_gfx *rr, uint32_t mesh_index, VkDescriptorSet descriptor_set); 918 + 904 919 905 920 /*! 906 921 * @}