From 7de994113cf7e6d9db123e5daf2680faa75e82de Mon Sep 17 00:00:00 2001 From: Marcin Hajder Date: Tue, 10 Feb 2026 08:46:27 +0100 Subject: [PATCH] Corrected validation error related to release of VkDeviceMemory while it is still binded to VkImage --- .../vulkan/test_vulkan_interop_image.cpp | 116 ++++++++++-------- 1 file changed, 65 insertions(+), 51 deletions(-) diff --git a/test_conformance/vulkan/test_vulkan_interop_image.cpp b/test_conformance/vulkan/test_vulkan_interop_image.cpp index 0dc2fa8a73..680287ee1b 100644 --- a/test_conformance/vulkan/test_vulkan_interop_image.cpp +++ b/test_conformance/vulkan/test_vulkan_interop_image.cpp @@ -451,47 +451,51 @@ int run_test_with_two_queue( ROUND_UP(vkImage2D.getSize(), vkImage2D.getAlignment()); } - VulkanImage2DList vkImage2DList( - num2DImages, vkDevice, vkFormat, width, height, - *vulkanImageTiling, numMipLevels, - vkExternalMemoryHandleType); + std::unique_ptr vkImage2DList{ + new VulkanImage2DList( + num2DImages, vkDevice, vkFormat, width, + height, *vulkanImageTiling, numMipLevels, + vkExternalMemoryHandleType) + }; for (size_t bIdx = 0; bIdx < num2DImages; bIdx++) { vkImage2DListDeviceMemory1.push_back( new VulkanDeviceMemory( - vkDevice, vkImage2DList[bIdx], + vkDevice, (*vkImage2DList)[bIdx], memoryType, vkExternalMemoryHandleType)); vkImage2DListDeviceMemory1[bIdx]->bindImage( - vkImage2DList[bIdx], 0); + (*vkImage2DList)[bIdx], 0); externalMemory1.push_back( new clExternalMemoryImage( *vkImage2DListDeviceMemory1[bIdx], vkExternalMemoryHandleType, context, totalImageMemSize, width, height, 0, - vkImage2DList[bIdx], deviceId)); + (*vkImage2DList)[bIdx], deviceId)); } VulkanImageViewList vkImage2DViewList( - vkDevice, vkImage2DList); - VulkanImage2DList vkImage2DList2( - num2DImages, vkDevice, vkFormat, width, height, - *vulkanImageTiling, numMipLevels, - vkExternalMemoryHandleType); + vkDevice, (*vkImage2DList)); + std::unique_ptr vkImage2DList2{ + new VulkanImage2DList( + num2DImages, vkDevice, vkFormat, width, + height, *vulkanImageTiling, numMipLevels, + vkExternalMemoryHandleType) + }; for (size_t bIdx = 0; bIdx < num2DImages; bIdx++) { vkImage2DListDeviceMemory2.push_back( new VulkanDeviceMemory( - vkDevice, vkImage2DList2[bIdx], + vkDevice, (*vkImage2DList2)[bIdx], memoryType, vkExternalMemoryHandleType)); vkImage2DListDeviceMemory2[bIdx]->bindImage( - vkImage2DList2[bIdx], 0); + (*vkImage2DList2)[bIdx], 0); externalMemory2.push_back( new clExternalMemoryImage( *vkImage2DListDeviceMemory2[bIdx], vkExternalMemoryHandleType, context, totalImageMemSize, width, height, 0, - vkImage2DList2[bIdx], deviceId)); + (*vkImage2DList2)[bIdx], deviceId)); } cl_mem external_mem_image1[5]; @@ -517,18 +521,18 @@ int run_test_with_two_queue( vkImage2DViewList); vkCopyCommandBuffer.begin(); vkCopyCommandBuffer.pipelineBarrier( - vkImage2DList, + (*vkImage2DList), VULKAN_IMAGE_LAYOUT_UNDEFINED, VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); for (size_t i2DIdx = 0; - i2DIdx < vkImage2DList.size(); i2DIdx++) + i2DIdx < vkImage2DList->size(); i2DIdx++) { vkCopyCommandBuffer.copyBufferToImage( - vkSrcBuffer, vkImage2DList[i2DIdx], + vkSrcBuffer, (*vkImage2DList)[i2DIdx], VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); } vkCopyCommandBuffer.pipelineBarrier( - vkImage2DList, + (*vkImage2DList), VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VULKAN_IMAGE_LAYOUT_GENERAL); vkCopyCommandBuffer.end(); @@ -554,22 +558,23 @@ int run_test_with_two_queue( if (useSingleImageKernel) { for (size_t i2DIdx = 0; - i2DIdx < vkImage2DList.size(); + i2DIdx < vkImage2DList->size(); i2DIdx++) { vkDescriptorSet.update( 1, vkImage2DViewList[i2DIdx]); vkCopyCommandBuffer.begin(); vkCopyCommandBuffer.pipelineBarrier( - vkImage2DList, + (*vkImage2DList), VULKAN_IMAGE_LAYOUT_UNDEFINED, VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); vkCopyCommandBuffer.copyBufferToImage( - vkSrcBuffer, vkImage2DList[i2DIdx], + vkSrcBuffer, + (*vkImage2DList)[i2DIdx], VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); vkCopyCommandBuffer.pipelineBarrier( - vkImage2DList, + (*vkImage2DList), VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VULKAN_IMAGE_LAYOUT_GENERAL); vkCopyCommandBuffer.end(); @@ -591,7 +596,7 @@ int run_test_with_two_queue( / 2), 1); vkShaderCommandBuffer.end(); - if (i2DIdx < vkImage2DList.size() - 1) + if (i2DIdx < vkImage2DList->size() - 1) { vkQueue.submit( vkShaderCommandBuffer); @@ -807,6 +812,8 @@ int run_test_with_two_queue( break; } } + vkImage2DList.reset(nullptr); + vkImage2DList2.reset(nullptr); for (uint32_t i = 0; i < num2DImages; i++) { delete vkImage2DListDeviceMemory1[i]; @@ -1068,52 +1075,56 @@ int run_test_with_one_queue( ROUND_UP(vkImage2D.getSize(), vkImage2D.getAlignment()); } - VulkanImage2DList vkImage2DList( - num2DImages, vkDevice, vkFormat, width, height, - *vulkanImageTiling, numMipLevels, - vkExternalMemoryHandleType); - for (size_t bIdx = 0; bIdx < vkImage2DList.size(); + std::unique_ptr vkImage2DList{ + new VulkanImage2DList( + num2DImages, vkDevice, vkFormat, width, + height, *vulkanImageTiling, numMipLevels, + vkExternalMemoryHandleType) + }; + for (size_t bIdx = 0; bIdx < vkImage2DList->size(); bIdx++) { // Create list of Vulkan device memories and // bind the list of Vulkan images. vkImage2DListDeviceMemory1.push_back( new VulkanDeviceMemory( - vkDevice, vkImage2DList[bIdx], + vkDevice, (*vkImage2DList)[bIdx], memoryType, vkExternalMemoryHandleType)); vkImage2DListDeviceMemory1[bIdx]->bindImage( - vkImage2DList[bIdx], 0); + (*vkImage2DList)[bIdx], 0); externalMemory1.push_back( new clExternalMemoryImage( *vkImage2DListDeviceMemory1[bIdx], vkExternalMemoryHandleType, context, totalImageMemSize, width, height, 0, - vkImage2DList[bIdx], deviceId)); + (*vkImage2DList)[bIdx], deviceId)); } VulkanImageViewList vkImage2DViewList( - vkDevice, vkImage2DList); - - VulkanImage2DList vkImage2DList2( - num2DImages, vkDevice, vkFormat, width, height, - *vulkanImageTiling, numMipLevels, - vkExternalMemoryHandleType); - for (size_t bIdx = 0; bIdx < vkImage2DList2.size(); + vkDevice, *vkImage2DList); + + std::unique_ptr vkImage2DList2{ + new VulkanImage2DList( + num2DImages, vkDevice, vkFormat, width, + height, *vulkanImageTiling, numMipLevels, + vkExternalMemoryHandleType) + }; + for (size_t bIdx = 0; bIdx < vkImage2DList2->size(); bIdx++) { vkImage2DListDeviceMemory2.push_back( new VulkanDeviceMemory( - vkDevice, vkImage2DList2[bIdx], + vkDevice, (*vkImage2DList2)[bIdx], memoryType, vkExternalMemoryHandleType)); vkImage2DListDeviceMemory2[bIdx]->bindImage( - vkImage2DList2[bIdx], 0); + (*vkImage2DList2)[bIdx], 0); externalMemory2.push_back( new clExternalMemoryImage( *vkImage2DListDeviceMemory2[bIdx], vkExternalMemoryHandleType, context, totalImageMemSize, width, height, 0, - vkImage2DList2[bIdx], deviceId)); + (*vkImage2DList2)[bIdx], deviceId)); } cl_mem external_mem_image1[4]; @@ -1139,18 +1150,18 @@ int run_test_with_one_queue( vkImage2DViewList); vkCopyCommandBuffer.begin(); vkCopyCommandBuffer.pipelineBarrier( - vkImage2DList, + *vkImage2DList, VULKAN_IMAGE_LAYOUT_UNDEFINED, VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); for (size_t i2DIdx = 0; - i2DIdx < vkImage2DList.size(); i2DIdx++) + i2DIdx < vkImage2DList->size(); i2DIdx++) { vkCopyCommandBuffer.copyBufferToImage( - vkSrcBuffer, vkImage2DList[i2DIdx], + vkSrcBuffer, (*vkImage2DList)[i2DIdx], VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); } vkCopyCommandBuffer.pipelineBarrier( - vkImage2DList, + (*vkImage2DList), VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VULKAN_IMAGE_LAYOUT_GENERAL); vkCopyCommandBuffer.end(); @@ -1176,22 +1187,23 @@ int run_test_with_one_queue( if (useSingleImageKernel) { for (size_t i2DIdx = 0; - i2DIdx < vkImage2DList.size(); + i2DIdx < vkImage2DList->size(); i2DIdx++) { vkDescriptorSet.update( 1, vkImage2DViewList[i2DIdx]); vkCopyCommandBuffer.begin(); vkCopyCommandBuffer.pipelineBarrier( - vkImage2DList, + (*vkImage2DList), VULKAN_IMAGE_LAYOUT_UNDEFINED, VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); vkCopyCommandBuffer.copyBufferToImage( - vkSrcBuffer, vkImage2DList[i2DIdx], + vkSrcBuffer, + (*vkImage2DList)[i2DIdx], VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); vkCopyCommandBuffer.pipelineBarrier( - vkImage2DList, + (*vkImage2DList), VULKAN_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VULKAN_IMAGE_LAYOUT_GENERAL); vkCopyCommandBuffer.end(); @@ -1213,7 +1225,7 @@ int run_test_with_one_queue( / 2), 1); vkShaderCommandBuffer.end(); - if (i2DIdx < vkImage2DList.size() - 1) + if (i2DIdx < vkImage2DList->size() - 1) { vkQueue.submit( vkShaderCommandBuffer); @@ -1360,6 +1372,8 @@ int run_test_with_one_queue( break; } } + vkImage2DList.reset(nullptr); + vkImage2DList2.reset(nullptr); for (uint32_t i = 0; i < num2DImages; i++) { delete vkImage2DListDeviceMemory1[i];