Well, i found some more issues, this time with sparse textures.
For sparse residency textures with any of the block compression formats, vkGetPhysicalDeviceSparseImageFormatProperties and vkGetImageSparseMemoryRequirements return a count of 0. Sparse compressed textures are clearly supported, vkGetPhysicalDeviceImageFormatProperties reports that they are supported and in fact i am able to create, sparse bind, layout transition, upload and sample them with the correct results. So it seems they are just advertised wrong by the two functions. I tested BC4, BC5 and BC7 2D textures with optimal tiling, sampled and transfer_dst usage, single sample and sparse residency.
In the fragment shader, the MinLod image operand for OpImageSampleImplicitLod has no effect. The feature shaderResourceMinLod is available and was used to create the device, the texture is only partly bound and filled, but the MinLod operand set to the lowest bound mipmap does not prevent the sampling of unbound mipmaps (indicated by the texture going black since my GPU supports residencyNonResidentStrict). Restricting VkSamplerCreateInfo::minLod for the used sampler directly avoids this. This issue is a little tricky because the SPIR-V code for the fragment shader comes from the VulkanSDK glslangValidator, which seems to generate invalid code by looking at the disassembly. Specifically, it does not generate OpCapability MinLod, even though it does add OpSourceExtension “GL_ARB_sparse_texture_clamp”, and it uses OpExecutionMode %4 OriginLowerLeft, which is invalid according to the Vulkan spec (the driver is ignoring this and uses upper left regardless). But the issue persisted even after manually fixing those two bugs in the SPIR-V code. The sampling itself works, just the MinLod operand is ignored.
Test system was again Win7 SP1 x64 with a GTX 970 with driver 356.45.
Again, if you need more information i’ll be glad to supply what i can.