zink: spec@ext_external_objects@vk-image-overwrite fail
Working on !23620 (merged) I made this test pass.
I think the problem is on the zink side though.
It starts by creating this image :
vkCreateImage(device, pCreateInfo, pAllocator, pImage) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0x558b7f591730
pCreateInfo: const VkImageCreateInfo* = 0x7ffdcfc16e10:
sType: VkStructureType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (14)
pNext: const void* = VkExternalMemoryImageCreateInfo
flags: VkImageCreateFlags = 8 (VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)
imageType: VkImageType = VK_IMAGE_TYPE_2D (1)
format: VkFormat = VK_FORMAT_A2R10G10B10_UINT_PACK32 (62)
extent: VkExtent3D = 0x7ffdcfc16e2c:
width: uint32_t = 160
height: uint32_t = 160
depth: uint32_t = 1
mipLevels: uint32_t = 1
arrayLayers: uint32_t = 1
samples: VkSampleCountFlagBits = 1 (VK_SAMPLE_COUNT_1_BIT)
tiling: VkImageTiling = VK_IMAGE_TILING_OPTIMAL (0)
usage: VkImageUsageFlags = 128 (VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)
sharingMode: VkSharingMode = VK_SHARING_MODE_EXCLUSIVE (0)
queueFamilyIndexCount: uint32_t = 0
pQueueFamilyIndices: const uint32_t* = UNUSED
initialLayout: VkImageLayout = VK_IMAGE_LAYOUT_UNDEFINED (0)
pNext: VkExternalMemoryImageCreateInfo = 0x7ffdcfc16df0:
sType: VkStructureType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO (1000072001)
pNext: const void* = NULL
handleTypes: VkExternalMemoryHandleTypeFlags = 1 (VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT)
pAllocator: const VkAllocationCallbacks* = NULL
pImage: VkImage* = 0x558b7fc02fd0
Binds memory M1
to it (memory requirement size=102400) and exports it to a file descriptor.
Creates another image :
vkCreateImage(device, pCreateInfo, pAllocator, pImage) returns VkResult VK_SUCCESS (0):
device: VkDevice = 0x558b7f43dcd0
pCreateInfo: const VkImageCreateInfo* = 0x7ffdcfc15600:
sType: VkStructureType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (14)
pNext: const void* = VkExternalMemoryImageCreateInfo
flags: VkImageCreateFlags = 0
imageType: VkImageType = VK_IMAGE_TYPE_2D (1)
format: VkFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32 (68)
extent: VkExtent3D = 0x7ffdcfc1561c:
width: uint32_t = 160
height: uint32_t = 160
depth: uint32_t = 1
mipLevels: uint32_t = 1
arrayLayers: uint32_t = 1
samples: VkSampleCountFlagBits = 1 (VK_SAMPLE_COUNT_1_BIT)
tiling: VkImageTiling = VK_IMAGE_TILING_OPTIMAL (0)
usage: VkImageUsageFlags = 151 (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)
sharingMode: VkSharingMode = VK_SHARING_MODE_EXCLUSIVE (0)
queueFamilyIndexCount: uint32_t = 0
pQueueFamilyIndices: const uint32_t* = UNUSED
initialLayout: VkImageLayout = VK_IMAGE_LAYOUT_UNDEFINED (0)
pNext: VkExternalMemoryImageCreateInfo = 0x7ffdcfc154a0:
sType: VkStructureType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO (1000072001)
pNext: const void* = NULL
handleTypes: VkExternalMemoryHandleTypeFlags = 513 (VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT | VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT)
pAllocator: const VkAllocationCallbacks* = NULL
pImage: VkImage* = 0x558b7fc04210
That image reports a memory size=163840
Then tries to create a memory from the file descriptor of M1
with size=163840 which fails because the buffer pointed to by the file descriptor is smaller.
I think this violate this VU :
* [[VUID-VkMemoryAllocateInfo-allocationSize-01742]]
If the parameters define an import operation, the external handle
specified was created by the Vulkan API, and the external handle type is
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, then the values of
allocationSize and memoryTypeIndex must match those
specified when the payload being imported was created
My recommendation would be to use similar parameters for imported/exported images. But I'm sure that's not that obvious...