···810810 VkResult ret;
811811812812 /*
813813- * Reserve UBOs and fill in any data a head of time, if we ever want to
814814- * copy UBO data this lets us do that easily write a copy command before
815815- * the other gfx commands.
813813+ * Reserve UBOs, create descriptor sets, and fill in any data a head of
814814+ * time, if we ever want to copy UBO data this lets us do that easily
815815+ * write a copy command before the other gfx commands.
816816 */
817817- struct render_sub_alloc ubos[2];
817817+818818+ VkDescriptorSet descriptor_sets[2] = XRT_STRUCT_INIT;
818819 for (uint32_t i = 0; i < 2; i++) {
819820820821 struct render_gfx_mesh_ubo_data data = {
···822823 .post_transform = src_norm_rects[i],
823824 };
824825825825- ret = render_sub_alloc_ubo_alloc_and_write( //
826826- vk, // vk_bundle
827827- &rr->ubo_tracker, // rsat
828828- &data, // ptr
829829- sizeof(data), // size
830830- &ubos[i]); // out_rsa
831831- VK_CHK_WITH_GOTO(ret, "render_sub_alloc_ubo_alloc_and_write", err_no_memory);
826826+ ret = render_gfx_mesh_alloc_and_write( //
827827+ rr, //
828828+ &data, //
829829+ src_samplers[i], //
830830+ src_image_views[i], //
831831+ &descriptor_sets[i]); //
832832+ VK_CHK_WITH_GOTO(ret, "render_gfx_mesh_alloc", err_no_memory);
832833 }
833834834835···846847 i, // view_index
847848 &viewport_datas[i]); // viewport_data
848849849849- render_gfx_distortion( //
850850- rr, //
851851- i, //
852852- &ubos[i], //
853853- src_samplers[i], //
854854- src_image_views[i]); //
850850+ render_gfx_mesh_draw( //
851851+ rr, // rr
852852+ i, // mesh_index
853853+ descriptor_sets[i]); // descriptor_set
855854856855 render_gfx_end_view(rr);
857856 }
···891891render_gfx_end_view(struct render_gfx *rr);
892892893893/*!
894894- * Dispatch one mesh shader instance into the current view.
894894+ * Allocate needed resources for one mesh shader dispatch, will also update the
895895+ * descriptor set, ubo will be filled out with the given @p data argument.
896896+ *
897897+ * Uses the @ref render_sub_alloc_tracker of the @ref render_gfx and the
898898+ * descriptor pool of @ref render_resources, both of which will be reset once
899899+ * closed, so don't save any reference to these objects beyond the frame.
900900+ *
901901+ * @public @memberof render_gfx
902902+ */
903903+XRT_CHECK_RESULT VkResult
904904+render_gfx_mesh_alloc_and_write(struct render_gfx *rr,
905905+ const struct render_gfx_mesh_ubo_data *data,
906906+ VkSampler src_sampler,
907907+ VkImageView src_image_view,
908908+ VkDescriptorSet *out_descriptor_set);
909909+910910+/*!
911911+ * Dispatch one mesh shader instance, using the give @p mesh_index as source for
912912+ * mesh geometry.
895913 *
896914 * @public @memberof render_gfx
897915 */
898916void
899899-render_gfx_distortion(struct render_gfx *rr,
900900- uint32_t view_index,
901901- struct render_sub_alloc *ubo,
902902- VkSampler sampler,
903903- VkImageView image_view);
917917+render_gfx_mesh_draw(struct render_gfx *rr, uint32_t mesh_index, VkDescriptorSet descriptor_set);
918918+904919905920/*!
906921 * @}