mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-03-03 21:26:36 +00:00
c/main: Remove the command buffer in layer renderer
This makes it so that we only use one command buffer for the entire frame, which gives us a nice speed up.
This commit is contained in:
parent
ce4e11686e
commit
4893638ccd
src/xrt/compositor/main
|
@ -404,12 +404,6 @@ _init(struct comp_layer_renderer *self,
|
|||
math_matrix_4x4_identity(&self->mat_eye_view[i]);
|
||||
}
|
||||
|
||||
VkResult ret = vk_cmd_pool_init(vk, &self->pool, 0);
|
||||
if (ret != VK_SUCCESS) {
|
||||
VK_ERROR(vk, "vk_cmd_pool_init: %s", vk_result_string(ret));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (!_init_descriptor_layout(self))
|
||||
return false;
|
||||
|
@ -534,24 +528,13 @@ _render_stereo(struct comp_layer_renderer *self,
|
|||
|
||||
void
|
||||
comp_layer_renderer_draw(struct comp_layer_renderer *self,
|
||||
VkCommandBuffer cmd_buffer,
|
||||
struct render_gfx_target_resources *rtr_left,
|
||||
struct render_gfx_target_resources *rtr_right)
|
||||
{
|
||||
COMP_TRACE_MARKER();
|
||||
VkResult ret;
|
||||
|
||||
struct vk_bundle *vk = self->vk;
|
||||
struct vk_cmd_pool *pool = &self->pool;
|
||||
|
||||
// Writing and submitting commands.
|
||||
vk_cmd_pool_lock(pool);
|
||||
|
||||
VkCommandBuffer cmd_buffer;
|
||||
ret = vk_cmd_pool_create_and_begin_cmd_buffer_locked(vk, pool, 0, &cmd_buffer);
|
||||
if (ret != VK_SUCCESS) {
|
||||
vk_cmd_pool_unlock(pool);
|
||||
return;
|
||||
}
|
||||
|
||||
VkExtent2D extent = rtr_left->extent;
|
||||
assert(extent.width == rtr_right->extent.width);
|
||||
|
@ -567,15 +550,6 @@ comp_layer_renderer_draw(struct comp_layer_renderer *self,
|
|||
} else {
|
||||
_render_stereo(self, vk, cmd_buffer, extent, framebuffers, &background_color_active);
|
||||
}
|
||||
|
||||
// Done writing commands, submit to queue, waits for command to finish.
|
||||
ret = vk_cmd_pool_end_submit_wait_and_free_cmd_buffer_locked(vk, pool, cmd_buffer);
|
||||
|
||||
// Done submitting commands.
|
||||
vk_cmd_pool_unlock(pool);
|
||||
|
||||
// Check results from submit.
|
||||
vk_check_error("vk_submit_cmd_buffer", ret, );
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -617,8 +591,6 @@ comp_layer_renderer_destroy(struct comp_layer_renderer **ptr_clr)
|
|||
|
||||
vk->vkDestroyPipelineCache(vk->device, self->pipeline_cache, NULL);
|
||||
|
||||
vk_cmd_pool_destroy(vk, &self->pool);
|
||||
|
||||
free(self);
|
||||
*ptr_clr = NULL;
|
||||
}
|
||||
|
|
|
@ -20,8 +20,6 @@ struct comp_layer_renderer
|
|||
{
|
||||
struct vk_bundle *vk;
|
||||
|
||||
struct vk_cmd_pool pool;
|
||||
|
||||
//! Render pass used to create all pipelines.
|
||||
struct render_gfx_render_pass *rgrp;
|
||||
|
||||
|
@ -78,6 +76,7 @@ comp_layer_renderer_destroy(struct comp_layer_renderer **ptr_clr);
|
|||
*/
|
||||
void
|
||||
comp_layer_renderer_draw(struct comp_layer_renderer *self,
|
||||
VkCommandBuffer cmd_buffer,
|
||||
struct render_gfx_target_resources *rtr_left,
|
||||
struct render_gfx_target_resources *rtr_right);
|
||||
|
||||
|
|
|
@ -273,12 +273,6 @@ renderer_build_rendering(struct comp_renderer *r,
|
|||
struct xrt_view *r_v = &r->c->xdev->hmd->views[1];
|
||||
|
||||
|
||||
/*
|
||||
* Begin
|
||||
*/
|
||||
|
||||
render_gfx_begin(rr);
|
||||
|
||||
|
||||
/*
|
||||
* Update
|
||||
|
@ -365,9 +359,6 @@ renderer_build_rendering(struct comp_renderer *r,
|
|||
*/
|
||||
|
||||
render_gfx_end_target(rr);
|
||||
|
||||
// Make the command buffer usable.
|
||||
render_gfx_end(rr);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -937,14 +928,15 @@ dispatch_graphics(struct comp_renderer *r, struct render_gfx *rr)
|
|||
struct render_gfx_target_resources *rtr = &r->rtr_array[r->acquired_buffer];
|
||||
bool one_projection_layer_fast_path = c->base.slot.one_projection_layer_fast_path;
|
||||
|
||||
// Need to be begin for all paths.
|
||||
render_gfx_begin(rr);
|
||||
|
||||
// No fast path, standard layer renderer path.
|
||||
if (!one_projection_layer_fast_path) {
|
||||
// We mark here to include the layer rendering in the GPU time.
|
||||
comp_target_mark_submit(ct, c->frame.rendering.id, os_monotonic_get_ns());
|
||||
|
||||
renderer_get_view_projection(r);
|
||||
comp_layer_renderer_draw( //
|
||||
r->lr, //
|
||||
c->nr.cmd, //
|
||||
&r->scratch_targets[0], //
|
||||
&r->scratch_targets[1]); //
|
||||
|
||||
|
@ -965,8 +957,14 @@ dispatch_graphics(struct comp_renderer *r, struct render_gfx *rr)
|
|||
|
||||
renderer_build_rendering(r, rr, rtr, src_samplers, src_image_views, src_norm_rects);
|
||||
|
||||
// Make the command buffer usable.
|
||||
render_gfx_end(rr);
|
||||
|
||||
renderer_submit_queue(r, rr->r->cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
|
||||
|
||||
// We mark afterwards to not include CPU time spent.
|
||||
comp_target_mark_submit(ct, c->frame.rendering.id, os_monotonic_get_ns());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -994,6 +992,9 @@ dispatch_graphics(struct comp_renderer *r, struct render_gfx *rr)
|
|||
|
||||
do_gfx_mesh_and_proj(r, rr, rtr, layer, lvd, rvd);
|
||||
|
||||
// Make the command buffer usable.
|
||||
render_gfx_end(rr);
|
||||
|
||||
renderer_submit_queue(r, rr->r->cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
|
||||
|
||||
// We mark afterwards to not include CPU time spent.
|
||||
|
@ -1012,6 +1013,9 @@ dispatch_graphics(struct comp_renderer *r, struct render_gfx *rr)
|
|||
|
||||
do_gfx_mesh_and_proj(r, rr, rtr, layer, lvd, rvd);
|
||||
|
||||
// Make the command buffer usable.
|
||||
render_gfx_end(rr);
|
||||
|
||||
renderer_submit_queue(r, rr->r->cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
|
||||
|
||||
// We mark afterwards to not include CPU time spent.
|
||||
|
|
Loading…
Reference in a new issue