From ff51653ffdb5c29452273775190fde321d0fafb6 Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Fri, 6 Oct 2023 21:56:38 +0100 Subject: [PATCH] c/render: Refactor gfx mesh shader allocation and dispatch --- src/xrt/compositor/main/comp_renderer.c | 33 ++++----- src/xrt/compositor/render/render_gfx.c | 78 ++++++++++++++------ src/xrt/compositor/render/render_interface.h | 27 +++++-- 3 files changed, 94 insertions(+), 44 deletions(-) diff --git a/src/xrt/compositor/main/comp_renderer.c b/src/xrt/compositor/main/comp_renderer.c index 6fdab768a..fd59857ae 100644 --- a/src/xrt/compositor/main/comp_renderer.c +++ b/src/xrt/compositor/main/comp_renderer.c @@ -810,11 +810,12 @@ do_gfx_mesh(struct comp_renderer *r, VkResult ret; /* - * Reserve UBOs and fill in any data a head of time, if we ever want to - * copy UBO data this lets us do that easily write a copy command before - * the other gfx commands. + * Reserve UBOs, create descriptor sets, and fill in any data a head of + * time, if we ever want to copy UBO data this lets us do that easily + * write a copy command before the other gfx commands. */ - struct render_sub_alloc ubos[2]; + + VkDescriptorSet descriptor_sets[2] = XRT_STRUCT_INIT; for (uint32_t i = 0; i < 2; i++) { struct render_gfx_mesh_ubo_data data = { @@ -822,13 +823,13 @@ do_gfx_mesh(struct comp_renderer *r, .post_transform = src_norm_rects[i], }; - ret = render_sub_alloc_ubo_alloc_and_write( // - vk, // vk_bundle - &rr->ubo_tracker, // rsat - &data, // ptr - sizeof(data), // size - &ubos[i]); // out_rsa - VK_CHK_WITH_GOTO(ret, "render_sub_alloc_ubo_alloc_and_write", err_no_memory); + ret = render_gfx_mesh_alloc_and_write( // + rr, // + &data, // + src_samplers[i], // + src_image_views[i], // + &descriptor_sets[i]); // + VK_CHK_WITH_GOTO(ret, "render_gfx_mesh_alloc", err_no_memory); } @@ -846,12 +847,10 @@ do_gfx_mesh(struct comp_renderer *r, i, // view_index &viewport_datas[i]); // viewport_data - render_gfx_distortion( // - rr, // - i, // - &ubos[i], // - src_samplers[i], // - src_image_views[i]); // + render_gfx_mesh_draw( // + rr, // rr + i, // mesh_index + descriptor_sets[i]); // descriptor_set render_gfx_end_view(rr); } diff --git a/src/xrt/compositor/render/render_gfx.c b/src/xrt/compositor/render/render_gfx.c index 6bc505eec..726869d53 100644 --- a/src/xrt/compositor/render/render_gfx.c +++ b/src/xrt/compositor/render/render_gfx.c @@ -714,35 +714,71 @@ render_gfx_end_view(struct render_gfx *rr) assert(rr->rtr != NULL); } +XRT_CHECK_RESULT VkResult +render_gfx_mesh_alloc_and_write(struct render_gfx *rr, + const struct render_gfx_mesh_ubo_data *data, + VkSampler src_sampler, + VkImageView src_image_view, + VkDescriptorSet *out_descriptor_set) +{ + VkDescriptorSet descriptor_set = VK_NULL_HANDLE; + struct render_sub_alloc ubo = XRT_STRUCT_INIT; + struct vk_bundle *vk = vk_from_rr(rr); + struct render_resources *r = rr->r; + VkResult ret; + + + /* + * Allocate and upload data. + */ + + ret = render_sub_alloc_ubo_alloc_and_write( // + vk, // vk_bundle + &rr->ubo_tracker, // rsat + data, // ptr + sizeof(*data), // size + &ubo); // out_rsa + VK_CHK_AND_RET(ret, "render_sub_alloc_ubo_alloc_and_write"); + + + /* + * Create and fill out destriptor. + */ + + ret = vk_create_descriptor_set( // + vk, // vk_bundle + r->mesh.descriptor_pool, // descriptor_pool + r->mesh.descriptor_set_layout, // descriptor_set_layout + &descriptor_set); // descriptor_set + VK_CHK_AND_RET(ret, "vk_create_descriptor_set"); + + update_mesh_discriptor_set( // + vk, // vk_bundle + r->mesh.src_binding, // src_binding + src_sampler, // sampler + src_image_view, // image_view + r->mesh.ubo_binding, // ubo_binding + ubo.buffer, // buffer + ubo.offset, // offset + ubo.size, // size + descriptor_set); // descriptor_set + + *out_descriptor_set = descriptor_set; + + return VK_SUCCESS; +} + void -render_gfx_distortion( - struct render_gfx *rr, uint32_t view_index, struct render_sub_alloc *ubo, VkSampler sampler, VkImageView image_view) +render_gfx_mesh_draw(struct render_gfx *rr, uint32_t mesh_index, VkDescriptorSet descriptor_set) { struct vk_bundle *vk = vk_from_rr(rr); struct render_resources *r = rr->r; - assert(view_index == rr->current_view); - - struct render_gfx_view *v = &rr->views[view_index]; - - VkDescriptorSet descriptor_set = v->mesh.descriptor_set; - /* * Descriptors and pipeline. */ - update_mesh_discriptor_set( // - vk, // vk_bundle - r->mesh.src_binding, // src_binding - sampler, // sampler - image_view, // image_view - r->mesh.ubo_binding, // ubo_binding - ubo->buffer, // buffer - ubo->offset, // offset - ubo->size, // size - descriptor_set); // descriptor_set - VkDescriptorSet descriptor_sets[1] = {descriptor_set}; vk->vkCmdBindDescriptorSets( // r->cmd, // commandBuffer @@ -789,9 +825,9 @@ render_gfx_distortion( vk->vkCmdDrawIndexed( // r->cmd, // commandBuffer - r->mesh.index_counts[view_index], // indexCount + r->mesh.index_counts[mesh_index], // indexCount 1, // instanceCount - r->mesh.index_offsets[view_index], // firstIndex + r->mesh.index_offsets[mesh_index], // firstIndex 0, // vertexOffset 0); // firstInstance } else { diff --git a/src/xrt/compositor/render/render_interface.h b/src/xrt/compositor/render/render_interface.h index 65a660e0c..3939ec744 100644 --- a/src/xrt/compositor/render/render_interface.h +++ b/src/xrt/compositor/render/render_interface.h @@ -891,16 +891,31 @@ void render_gfx_end_view(struct render_gfx *rr); /*! - * Dispatch one mesh shader instance into the current view. + * Allocate needed resources for one mesh shader dispatch, will also update the + * descriptor set, ubo will be filled out with the given @p data argument. + * + * Uses the @ref render_sub_alloc_tracker of the @ref render_gfx and the + * descriptor pool of @ref render_resources, both of which will be reset once + * closed, so don't save any reference to these objects beyond the frame. + * + * @public @memberof render_gfx + */ +XRT_CHECK_RESULT VkResult +render_gfx_mesh_alloc_and_write(struct render_gfx *rr, + const struct render_gfx_mesh_ubo_data *data, + VkSampler src_sampler, + VkImageView src_image_view, + VkDescriptorSet *out_descriptor_set); + +/*! + * Dispatch one mesh shader instance, using the give @p mesh_index as source for + * mesh geometry. * * @public @memberof render_gfx */ void -render_gfx_distortion(struct render_gfx *rr, - uint32_t view_index, - struct render_sub_alloc *ubo, - VkSampler sampler, - VkImageView image_view); +render_gfx_mesh_draw(struct render_gfx *rr, uint32_t mesh_index, VkDescriptorSet descriptor_set); + /*! * @}