Problem is, I don’t know how to do TRANSFER_DST_OPTIMAL => DEPTH_STENCIL_READ_ONLY_OPTIMAL transition.
My transitions code is based on vulkan tutorial here: [Depth buffering - Vulkan Tutorial]
which doesn’t cover this case…
So could anybody pls. help me to find correct combination of src\dst access & src\dst stage flags for this transition?
I tried to use combinations for other transitions - my app just crashing, no messages from verification layers…
P.S.
Alternativly, if there is a way to create 1x1 depth image without layout transitions - I’m also all ears…
If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define an image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
So image should be created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, despite you’re NOT going to use it as depth-stencil attachment…
You don’t have to use that usage if you’re not going to attach it to a render pass. But you do need the correct usage bits, the ones that fit the usage you intend to use it for. If you’re reading from it within a shader, then there are usage bits for that.
First layout transition Vulkan.ImageLayout.Undefined => Vulkan.ImageLayout.TransferDstOptimal - works regardless DepthStencilAttachment flag.
But then, after I copy buffer data to image, and trying to change layout Vulkan.ImageLayout.TransferDstOptimal => Vulkan.ImageLayout.DepthStencilReadOnlyOptimal without Vulkan.ImageUsageFlags.DepthStencilAttachment - it fails.
What “fails”? Vulkan doesn’t generally give out error messages. So, are you talking about a validation layer failure? If so, what’s the error message from the layer? If not, what exactly does “fails” mean?
Sorry, probably I should have provided more context…
So I’m using C# and VulkanSharp wrapper which I have forked and migrated to .NET 6.0.
I’m using VK_LAYER_KHRONOS_validation validation layer.
By “fails” I mean - I have an exception of type System.ExecutionEngineException with callstack looking like this:
--------------------------------
at Vulkan.Interop.NativeMethods.vkCmdPipelineBarrier(IntPtr, Vulkan.PipelineStageFlags, Vulkan.PipelineStageFlags, Vulkan.DependencyFlags, UInt32, Vulkan.Interop.MemoryBarrier*, UInt32, Vulkan.Interop.BufferMemoryBarrier*, UInt32, Vulkan.Interop.ImageMemoryBarrier*)
--------------------------------
at Vulkan.CommandBuffer.CmdPipelineBarrier(Vulkan.PipelineStageFlags, Vulkan.PipelineStageFlags, Vulkan.DependencyFlags, Vulkan.MemoryBarrier, Vulkan.BufferMemoryBarrier, Vulkan.ImageMemoryBarrier)
at Ice.Graphics.VkSharp.ImageBuffer+<>c__DisplayClass55_0.<ChangeLayout>b__0(Vulkan.CommandBuffer)
at Ice.Graphics.VkSharp.ApiCommandBuffer.ExecOnce(System.Action`1<Vulkan.CommandBuffer>)
at Ice.Graphics.VkSharp.ImageBuffer.ChangeLayout(Vulkan.ImageLayout, Vulkan.ImageLayout, System.Nullable`1<Vulkan.ImageAspectFlags>)
Everything starts with Ice. - it’s mine abstraction layer code…
No other messages from system or validation layer.
And that happens quite often to me - lack of debug info I mean.
P.S.
Anyway, the problem is solved by adding VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT to image usage flags.
It’s really helpfull to try to explain the problem to another person.