| 183 | } |
| 184 | |
| 185 | void VKDevice::TransitionImageLayout( |
| 186 | VkCommandBuffer commandBuffer, |
| 187 | VkImage image, |
| 188 | VkFormat /*format*/, |
| 189 | VkImageLayout oldLayout, |
| 190 | VkImageLayout newLayout, |
| 191 | const TextureSubresource& subresource) |
| 192 | { |
| 193 | /* Initialize image memory barrier descriptor */ |
| 194 | VkImageMemoryBarrier barrier; |
| 195 | { |
| 196 | barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; |
| 197 | barrier.pNext = nullptr; |
| 198 | barrier.srcAccessMask = 0; |
| 199 | barrier.dstAccessMask = 0; |
| 200 | barrier.oldLayout = oldLayout; |
| 201 | barrier.newLayout = newLayout; |
| 202 | barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| 203 | barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| 204 | barrier.image = image; |
| 205 | barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; |
| 206 | barrier.subresourceRange.baseMipLevel = subresource.baseMipLevel; |
| 207 | barrier.subresourceRange.levelCount = subresource.numMipLevels; |
| 208 | barrier.subresourceRange.baseArrayLayer = subresource.baseArrayLayer; |
| 209 | barrier.subresourceRange.layerCount = subresource.numArrayLayers; |
| 210 | } |
| 211 | |
| 212 | /* Initialize pipeline state flags */ |
| 213 | VkPipelineStageFlags srcStageMask = 0; |
| 214 | VkPipelineStageFlags dstStageMask = 0; |
| 215 | |
| 216 | if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) |
| 217 | { |
| 218 | barrier.srcAccessMask = 0; |
| 219 | barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; |
| 220 | srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; |
| 221 | dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; |
| 222 | } |
| 223 | else if (oldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) |
| 224 | { |
| 225 | barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; |
| 226 | barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; |
| 227 | srcStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; |
| 228 | dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; |
| 229 | } |
| 230 | |
| 231 | /* Record image barrier command */ |
| 232 | vkCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, 0, 0, nullptr, 0, nullptr, 1, &barrier); |
| 233 | } |
| 234 | |
| 235 | void VKDevice::CopyBuffer( |
| 236 | VkCommandBuffer commandBuffer, |
no outgoing calls
no test coverage detected