Quick answer: Vulkan vkCmdBlitImage failing with layout mismatch on a specific mip level? Mip levels have independent layout state - transition each level explicitly.

Texture has 8 mip levels. Blit to level 3 fails because level 3 is in SHADER_READ_ONLY layout, not TRANSFER_DST.

Transition per mip

barrier.subresourceRange.baseMipLevel = 3;
barrier.subresourceRange.levelCount = 1;

Targeted transition. Only mip 3 changes layout.

Or transition all mips

baseMipLevel=0, levelCount=VK_REMAINING_MIP_LEVELS. Transitions everything; simpler if you don't track per-level state.

Or use ImageMemoryBarrier

One barrier per region needed. Image-wide transitions are convenient but coarser.

“Vulkan tracks layout per mip and per array layer. Granular state.”

Build a layout tracker for your engine. Mip-level state is too granular to remember by hand.

Related reading