1
mirror of https://github.com/mpv-player/mpv synced 2024-10-30 04:46:41 +01:00

vo_gpu: vulkan: optimize redundant pipeline barriers

Using renderpass layout transitions is more optimal and doesn't require
a redundant pipeline barrier.

Since our render passes are static and don't change throughout the
lifetime of a ra_renderpass, we unfortunately don't have much
flexibility here - so just hard-code SHADER_READ_ONLY_OPTIMAL as the
output format as this will be the most common case.

We also can't short-circuit the transition when we need to preserve the
framebuffer contents, since that depends on the current layout; so we
still use an explicit tex_barrier in this case. (Most optimal for this
scenario would be an input attachment anyway)
This commit is contained in:
Niklas Haas 2017-09-26 23:47:20 +02:00
parent dc5fcced23
commit 0ba6c7d73f

View File

@ -256,8 +256,9 @@ static VkResult vk_create_render_pass(VkDevice dev, const struct ra_format *fmt,
.loadOp = load_fbo ? VK_ATTACHMENT_LOAD_OP_LOAD .loadOp = load_fbo ? VK_ATTACHMENT_LOAD_OP_LOAD
: VK_ATTACHMENT_LOAD_OP_DONT_CARE, : VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.storeOp = VK_ATTACHMENT_STORE_OP_STORE, .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, .initialLayout = load_fbo ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, : VK_IMAGE_LAYOUT_UNDEFINED,
.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
}, },
.subpassCount = 1, .subpassCount = 1,
.pSubpasses = &(VkSubpassDescription) { .pSubpasses = &(VkSubpassDescription) {
@ -1463,9 +1464,13 @@ static void vk_renderpass_run(struct ra *ra,
vkCmdBindVertexBuffers(cmd->buf, 0, 1, &buf_vk->slice.buf, vkCmdBindVertexBuffers(cmd->buf, 0, 1, &buf_vk->slice.buf,
&buf_vk->slice.mem.offset); &buf_vk->slice.mem.offset);
if (pass->params.enable_blend) {
// Normally this transition is handled implicitly by the renderpass,
// but if we need to preserve the FBO we have to do it manually.
tex_barrier(cmd, tex_vk, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, tex_barrier(cmd, tex_vk, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, false); VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, false);
}
VkViewport viewport = { VkViewport viewport = {
.x = params->viewport.x0, .x = params->viewport.x0,
@ -1492,6 +1497,11 @@ static void vk_renderpass_run(struct ra *ra,
vkCmdBeginRenderPass(cmd->buf, &binfo, VK_SUBPASS_CONTENTS_INLINE); vkCmdBeginRenderPass(cmd->buf, &binfo, VK_SUBPASS_CONTENTS_INLINE);
vkCmdDraw(cmd->buf, params->vertex_count, 1, 0, 0); vkCmdDraw(cmd->buf, params->vertex_count, 1, 0, 0);
vkCmdEndRenderPass(cmd->buf); vkCmdEndRenderPass(cmd->buf);
// The renderPass implicitly transitions the texture to this layout
tex_vk->current_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
tex_vk->current_access = VK_ACCESS_SHADER_READ_BIT;
tex_vk->current_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
break; break;
} }
default: abort(); default: abort();