| 217 | } |
| 218 | |
| 219 | void VulkanTexture::MakeImageLayoutTransition(VkCommandBuffer commandBuffer, VkImageLayout newLayout, |
| 220 | VkPipelineStageFlags srcStageMask, |
| 221 | VkPipelineStageFlags dstStageMask) const |
| 222 | { |
| 223 | VkAccessFlags srcAccessMask = 0; |
| 224 | VkAccessFlags dstAccessMask = 0; |
| 225 | |
| 226 | VkPipelineStageFlags const noAccessMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | |
| 227 | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; |
| 228 | VkPipelineStageFlags srcRemainingMask = srcStageMask & ~noAccessMask; |
| 229 | VkPipelineStageFlags dstRemainingMask = dstStageMask & ~noAccessMask; |
| 230 | |
| 231 | auto const srcTestAndRemoveBit = [&](VkPipelineStageFlagBits stageBit, VkAccessFlags accessBits) |
| 232 | { |
| 233 | if (srcStageMask & stageBit) |
| 234 | { |
| 235 | srcAccessMask |= accessBits; |
| 236 | srcRemainingMask &= ~stageBit; |
| 237 | } |
| 238 | }; |
| 239 | |
| 240 | srcTestAndRemoveBit(VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT); |
| 241 | |
| 242 | srcTestAndRemoveBit(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT); |
| 243 | |
| 244 | srcTestAndRemoveBit(VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, VK_ACCESS_SHADER_READ_BIT); |
| 245 | |
| 246 | srcTestAndRemoveBit(VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, |
| 247 | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT); |
| 248 | |
| 249 | srcTestAndRemoveBit(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT); |
| 250 | |
| 251 | srcTestAndRemoveBit(VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, |
| 252 | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT); |
| 253 | |
| 254 | CHECK(srcRemainingMask == 0, ("Not implemented transition for src pipeline stage")); |
| 255 | |
| 256 | auto const dstTestAndRemoveBit = [&](VkPipelineStageFlagBits stageBit, VkAccessFlags accessBits) |
| 257 | { |
| 258 | if (dstStageMask & stageBit) |
| 259 | { |
| 260 | dstAccessMask |= accessBits; |
| 261 | dstRemainingMask &= ~stageBit; |
| 262 | } |
| 263 | }; |
| 264 | |
| 265 | dstTestAndRemoveBit(VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT); |
| 266 | |
| 267 | dstTestAndRemoveBit(VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, |
| 268 | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT); |
| 269 | |
| 270 | dstTestAndRemoveBit(VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, VK_ACCESS_SHADER_READ_BIT); |
| 271 | |
| 272 | dstTestAndRemoveBit(VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, |
| 273 | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT); |
| 274 | |
| 275 | dstTestAndRemoveBit(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT); |
| 276 |
no outgoing calls
no test coverage detected