summaryrefslogtreecommitdiffstats
path: root/video/out
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.xyz>2017-10-25 19:31:37 +0200
committerMartin Herkt <652892+lachs0r@users.noreply.github.com>2017-12-25 00:47:53 +0100
commit12c6700a3c770d74237ded74c307e4fd952a1d31 (patch)
tree3b8467ad9b1e014db83dac630c408e850778470c /video/out
parent019d594d0b4bf81f44dd4714da9ca6e68bdf0a28 (diff)
downloadmpv-12c6700a3c770d74237ded74c307e4fd952a1d31.tar.bz2
mpv-12c6700a3c770d74237ded74c307e4fd952a1d31.tar.xz
vo_gpu: vulkan: fix some image barrier oddities
A vulkan validation layer update pointed out that this was wrong; we still need to use the access type corresponding to the stage mask, even if it means our code won't be able to skip the pipeline barrier (which would be wrong anyway). In additiona to this, we're also not allowed to specify any source access mask when transitioning from top_of_pipe, which doesn't make any sense anyway.
Diffstat (limited to 'video/out')
-rw-r--r--video/out/vulkan/ra_vk.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/video/out/vulkan/ra_vk.c b/video/out/vulkan/ra_vk.c
index d18d4f84b0..1236fd632c 100644
--- a/video/out/vulkan/ra_vk.c
+++ b/video/out/vulkan/ra_vk.c
@@ -378,6 +378,7 @@ static void tex_barrier(struct ra *ra, struct vk_cmd *cmd, struct ra_tex *tex,
// If we're not using an event, then the source stage is irrelevant
// because we're coming from a different queue anyway, so we can
// safely set it to TOP_OF_PIPE.
+ imgBarrier.srcAccessMask = 0;
vkCmdPipelineBarrier(cmd->buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
stage, 0, 0, NULL, 0, NULL, 1, &imgBarrier);
}
@@ -922,8 +923,6 @@ struct ra_renderpass_vk {
VkRenderPass renderPass;
VkImageLayout initialLayout;
VkImageLayout finalLayout;
- VkAccessFlags initialAccess;
- VkAccessFlags finalAccess;
// Descriptor set (bindings)
VkDescriptorSetLayout dsLayout;
VkDescriptorPool dsPool;
@@ -1254,10 +1253,8 @@ static struct ra_renderpass *vk_renderpass_create(struct ra *ra,
// This is the most common case, so optimize towards it. In this case,
// the renderpass will take care of almost all layout transitions
- pass_vk->initialLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
- pass_vk->initialAccess = VK_ACCESS_SHADER_READ_BIT;
- pass_vk->finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
- pass_vk->finalAccess = VK_ACCESS_SHADER_READ_BIT;
+ pass_vk->initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ pass_vk->finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkAttachmentLoadOp loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
// If we're blending, then we need to explicitly load the previous
@@ -1268,7 +1265,6 @@ static struct ra_renderpass *vk_renderpass_create(struct ra *ra,
// If we're invalidating the target, we don't need to load or transition
if (pass->params.invalidate_target) {
pass_vk->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- pass_vk->initialAccess = 0;
loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
}
@@ -1605,9 +1601,8 @@ static void vk_renderpass_run(struct ra *ra,
vkCmdBindVertexBuffers(cmd->buf, 0, 1, &buf_vk->slice.buf,
&buf_vk->slice.mem.offset);
- // The renderpass expects the images to be in a certain layout
tex_barrier(ra, cmd, tex, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
- pass_vk->initialAccess, pass_vk->initialLayout,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, pass_vk->initialLayout,
pass->params.invalidate_target);
VkViewport viewport = {
@@ -1638,7 +1633,7 @@ static void vk_renderpass_run(struct ra *ra,
// The renderPass implicitly transitions the texture to this layout
tex_vk->current_layout = pass_vk->finalLayout;
- tex_vk->current_access = pass_vk->finalAccess;
+ tex_vk->current_access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
tex_signal(ra, cmd, tex, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
break;
}