From b0c86fa5130b49b5a9f19687cb25d3f20559ee0f Mon Sep 17 00:00:00 2001 From: Jeremy Hayes Date: Tue, 25 Oct 2016 17:32:23 -0600 Subject: demos: Add src and dst stages to set_image_layout Change-Id: I97ba1643e17bb97faa868123f5ef6e6f140a9b13 --- demos/cube.cpp | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) (limited to 'demos/cube.cpp') diff --git a/demos/cube.cpp b/demos/cube.cpp index a424f4d5..10878f29 100644 --- a/demos/cube.cpp +++ b/demos/cube.cpp @@ -1873,9 +1873,6 @@ struct Demo { } tex_obj->imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal; - set_image_layout(tex_obj->image, vk::ImageAspectFlagBits::eColor, - vk::ImageLayout::ePreinitialized, tex_obj->imageLayout, - vk::AccessFlagBits::eHostWrite); } void prepare_textures() { @@ -1893,6 +1890,12 @@ struct Demo { vk::ImageUsageFlagBits::eSampled, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); + // Nothing in the pipeline needs to be complete to start, and don't allow fragment + // shader to run until layout transition completes + set_image_layout(textures[i].image, vk::ImageAspectFlagBits::eColor, + vk::ImageLayout::ePreinitialized, textures[i].imageLayout, + vk::AccessFlagBits::eHostWrite, vk::PipelineStageFlagBits::eTopOfPipe, + vk::PipelineStageFlagBits::eFragmentShader); } else if (props.optimalTilingFeatures & vk::FormatFeatureFlagBits::eSampledImage) { /* Must use staging buffer to copy linear texture to optimized @@ -1913,13 +1916,19 @@ struct Demo { set_image_layout( staging_texture.image, vk::ImageAspectFlagBits::eColor, - staging_texture.imageLayout, - vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits::eShaderRead); + vk::ImageLayout::ePreinitialized, + vk::ImageLayout::eTransferSrcOptimal, + vk::AccessFlagBits::eHostWrite, + vk::PipelineStageFlagBits::eTopOfPipe, + vk::PipelineStageFlagBits::eTransfer); set_image_layout( textures[i].image, vk::ImageAspectFlagBits::eColor, - textures[i].imageLayout, - vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits::eShaderRead); + vk::ImageLayout::ePreinitialized, + vk::ImageLayout::eTransferDstOptimal, + vk::AccessFlagBits::eHostWrite, + vk::PipelineStageFlagBits::eTopOfPipe, + vk::PipelineStageFlagBits::eTransfer); auto const subresource = vk::ImageSubresourceLayers() @@ -1945,7 +1954,10 @@ struct Demo { set_image_layout(textures[i].image, vk::ImageAspectFlagBits::eColor, vk::ImageLayout::eTransferDstOptimal, - textures[i].imageLayout, vk::AccessFlagBits::eTransferWrite); + textures[i].imageLayout, + vk::AccessFlagBits::eTransferWrite, + vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eFragmentShader); flush_init_cmd(); @@ -2084,7 +2096,9 @@ struct Demo { void set_image_layout(vk::Image image, vk::ImageAspectFlags aspectMask, vk::ImageLayout oldLayout, vk::ImageLayout newLayout, - vk::AccessFlags srcAccessMask) { + vk::AccessFlags srcAccessMask, + vk::PipelineStageFlags src_stages, + vk::PipelineStageFlags dest_stages) { if (!cmd) { auto const cmd = vk::CommandBufferAllocateInfo() .setCommandPool(cmd_pool) @@ -2145,10 +2159,8 @@ struct Demo { .setSubresourceRange(vk::ImageSubresourceRange( aspectMask, 0, 1, 0, 1)); - cmd.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, - vk::PipelineStageFlagBits::eTopOfPipe, - vk::DependencyFlagBits(), 0, nullptr, 0, nullptr, 1, - &barrier); + cmd.pipelineBarrier(src_stages, dest_stages, vk::DependencyFlagBits(), + 0, nullptr, 0, nullptr, 1, &barrier); } void update_data_buffer() { -- cgit v1.2.3