Cleaned up image layout transition function, comments (refs #187)
This commit is contained in:
parent
82242e61de
commit
1b376da279
1 changed files with 69 additions and 56 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue