Cleaned up image layout transition function, comments (refs #187)

This commit is contained in:
saschawillems 2016-06-21 21:05:38 +02:00
parent 82242e61de
commit 1b376da279

View file

@ -126,81 +126,94 @@ namespace vkTools
imageMemoryBarrier.subresourceRange = subresourceRange; imageMemoryBarrier.subresourceRange = subresourceRange;
// Source layouts (old) // Source layouts (old)
// Source access mask controls actions that have to be finished on the old layout
// Undefined layout // before it will be transitioned to the new layout
// Only allowed as initial layout! switch (oldImageLayout)
// Make sure any writes to the image have been finished
if (oldImageLayout == VK_IMAGE_LAYOUT_PREINITIALIZED)
{ {
imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; case VK_IMAGE_LAYOUT_UNDEFINED:
} // Image layout is undefined (or does not matter)
// Only valid as initial layout
// No flags required, listed only for completeness
imageMemoryBarrier.srcAccessMask = 0;
break;
// Old layout is color attachment case VK_IMAGE_LAYOUT_PREINITIALIZED:
// Make sure any writes to the color buffer have been finished // Image is preinitialized
if (oldImageLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) // Only valid as initial layout for linear images, preserves memory contents
{ // Make sure host writes have been finished
imageMemoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
} break;
// Old layout is depth/stencil attachment case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
// Make sure any writes to the depth/stencil buffer have been finished // Image is a color attachment
if (oldImageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) // Make sure any writes to the color buffer have been finished
{ imageMemoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
imageMemoryBarrier.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; break;
}
// Old layout is transfer source case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
// Make sure any reads from the image have been finished // Image is a depth/stencil attachment
if (oldImageLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) // Make sure any writes to the depth/stencil buffer have been finished
{ imageMemoryBarrier.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; break;
}
// Old layout is shader read (sampler, input attachment) case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
// Make sure any shader reads from the image have been finished // Image is a transfer source
if (oldImageLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) // Make sure any reads from the image have been finished
{ imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
imageMemoryBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT; break;
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
// Image is a transfer destination
// Make sure any writes to the image have been finished
imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
break;
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
// Image is read by a shader
// Make sure any shader reads from the image have been finished
imageMemoryBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
break;
} }
// Target layouts (new) // Target layouts (new)
// Destination access mask controls the dependency for the new image layout
// New layout is transfer destination (copy, blit) switch (newImageLayout)
// Make sure any copyies to the image have been finished
if (newImageLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
{ {
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
// Image will be used as a transfer destination
// Make sure any writes to the image have been finished
imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
} break;
// New layout is transfer source (copy, blit) case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
// Make sure any reads from and writes to the image have been finished // Image will be used as a transfer source
if (newImageLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) // Make sure any reads from and writes to the image have been finished
{
imageMemoryBarrier.srcAccessMask = imageMemoryBarrier.srcAccessMask | VK_ACCESS_TRANSFER_READ_BIT; imageMemoryBarrier.srcAccessMask = imageMemoryBarrier.srcAccessMask | VK_ACCESS_TRANSFER_READ_BIT;
imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
} break;
// New layout is color attachment case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
// Make sure any writes to the color buffer hav been finished // Image will be used as a color attachment
if (newImageLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) // Make sure any writes to the color buffer have been finished
{
imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
} imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
break;
// New layout is depth attachment case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
// Make sure any writes to depth/stencil buffer have been finished // Image layout will be used as a depth/stencil attachment
if (newImageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) // Make sure any writes to depth/stencil buffer have been finished
{
imageMemoryBarrier.dstAccessMask = imageMemoryBarrier.dstAccessMask | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; imageMemoryBarrier.dstAccessMask = imageMemoryBarrier.dstAccessMask | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
} break;
// New layout is shader read (sampler, input attachment) case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
// Make sure any writes to the image have been finished // Image will be read in a shader (sampler, input attachment)
if (newImageLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) // Make sure any writes to the image have been finished
{ if (imageMemoryBarrier.srcAccessMask == 0)
imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; {
imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
}
imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
break;
} }
// Put barrier on top // Put barrier on top