Merge vk-gl-cts/vulkan-cts-1.2.6 into vk-gl-cts/vulkan-cts-1.2.7
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / synchronization / vktSynchronizationOperation.cpp
index 1eec8b0..c825e8b 100644 (file)
@@ -911,9 +911,11 @@ public:
                flushAlloc(vk, device, alloc);
 
                // Staging image
+               const auto& imgResource = m_resource.getImage();
                m_image = de::MovePtr<Image>(new Image(
                        vk, device, allocator,
-                       makeImageCreateInfo(m_resource.getImage().imageType, m_resource.getImage().extent, m_resource.getImage().format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
+                       makeImageCreateInfo(imgResource.imageType, imgResource.extent, imgResource.format,
+                                                               (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT), VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL),
                        MemoryRequirement::Any));
        }
 
@@ -1099,11 +1101,13 @@ public:
        {
                const InstanceInterface&        vki                             = m_context.getInstanceInterface();
                const VkPhysicalDevice          physDevice              = m_context.getPhysicalDevice();
-               const VkFormatProperties        formatProps             = getPhysicalDeviceFormatProperties(vki, physDevice, m_resource.getImage().format);
+               const auto&                                     imgResource             = m_resource.getImage();
+               const VkFormatProperties        formatProps             = getPhysicalDeviceFormatProperties(vki, physDevice, imgResource.format);
+               const auto&                                     features                = ((imgResource.tiling == VK_IMAGE_TILING_LINEAR) ? formatProps.linearTilingFeatures : formatProps.optimalTilingFeatures);
                const VkFormatFeatureFlags      requiredFlags   = (VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT);
 
                // SRC and DST blit is required because both images are using the same format.
-               if ((formatProps.optimalTilingFeatures & requiredFlags) != requiredFlags)
+               if ((features & requiredFlags) != requiredFlags)
                        TCU_THROW(NotSupportedError, "Format doesn't support blits");
        }
 
@@ -1284,11 +1288,13 @@ public:
 
                const InstanceInterface&        vki                             = m_context.getInstanceInterface();
                const VkPhysicalDevice          physDevice              = m_context.getPhysicalDevice();
-               const VkFormatProperties        formatProps             = getPhysicalDeviceFormatProperties(vki, physDevice, m_inResource.getImage().format);
+               const auto&                                     imgResource             = m_inResource.getImage();
+               const VkFormatProperties        formatProps             = getPhysicalDeviceFormatProperties(vki, physDevice, imgResource.format);
+               const auto&                                     features                = ((imgResource.tiling == VK_IMAGE_TILING_LINEAR) ? formatProps.linearTilingFeatures : formatProps.optimalTilingFeatures);
                const VkFormatFeatureFlags      requiredFlags   = (VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT);
 
                // SRC and DST blit is required because both images are using the same format.
-               if ((formatProps.optimalTilingFeatures & requiredFlags) != requiredFlags)
+               if ((features & requiredFlags) != requiredFlags)
                        TCU_THROW(NotSupportedError, "Format doesn't support blits");
        }
 
@@ -1515,7 +1521,8 @@ public:
                m_colorImageSubresourceRange    = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
                m_colorImageExtent                              = makeExtent3D(16u, 16u, 1u);
                m_colorAttachmentImage                  = de::MovePtr<Image>(new Image(vk, device, allocator,
-                       makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_colorImageExtent, m_colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT),
+                       makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_colorImageExtent, m_colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
+                                                               VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL),
                        MemoryRequirement::Any));
 
                // Pipeline
@@ -1834,7 +1841,8 @@ public:
                requireFeaturesForSSBOAccess(m_context, m_stage);
 
                // Some storage image formats may not be supported
-               requireStorageImageSupport(vki, physDevice, m_resource.getImage().format);
+               const auto& imgResource = m_resource.getImage();
+               requireStorageImageSupport(vki, physDevice, imgResource.format, imgResource.tiling);
 
                m_hostBuffer = de::MovePtr<Buffer>(new Buffer(
                        vk, device, allocator, makeBufferCreateInfo(m_hostBufferSizeBytes, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT),
@@ -1854,7 +1862,8 @@ public:
                {
                        m_image = de::MovePtr<Image>(new Image(vk, device, allocator,
                                makeImageCreateInfo(m_resource.getImage().imageType, m_resource.getImage().extent, m_resource.getImage().format,
-                                                                       VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT),
+                                                                       (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT),
+                                                                       VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL),
                                MemoryRequirement::Any));
 
                        if (m_mode == ACCESS_MODE_READ)
@@ -2608,7 +2617,8 @@ public:
                requireFeaturesForSSBOAccess(m_context, m_stage);
 
                // Some storage image formats may not be supported
-               requireStorageImageSupport(vki, physDevice, m_inResource.getImage().format);
+               const auto& imgResource = m_inResource.getImage();
+               requireStorageImageSupport(vki, physDevice, imgResource.format, imgResource.tiling);
 
                // Image resources
                {
@@ -2827,7 +2837,8 @@ public:
                const VkPhysicalDeviceFeatures  features        = getPhysicalDeviceFeatures(vki, physDevice);
                Allocator&                                              allocator       = m_context.getAllocator();
 
-               requireStorageImageSupport(vki, physDevice, m_resource.getImage().format);
+               const auto& imgResource = m_resource.getImage();
+               requireStorageImageSupport(vki, physDevice, imgResource.format, imgResource.tiling);
                if (!features.shaderStorageImageMultisample)
                        TCU_THROW(NotSupportedError, "Using multisample images as storage is not supported");
 
@@ -3104,7 +3115,11 @@ public:
 
                // Copy destination image.
                m_image = de::MovePtr<Image>(new Image(
-                       vk, device, allocator, makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_imageExtent, format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT), MemoryRequirement::Any));
+                       vk, device, allocator,
+                       makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_imageExtent, format,
+                                                               (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
+                                                               VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL),
+                       MemoryRequirement::Any));
 
                // Image data will be copied here, so it can be read on the host.
                m_hostBuffer = de::MovePtr<Buffer>(new Buffer(
@@ -3424,7 +3439,10 @@ public:
 
                // Source data image
                m_image = de::MovePtr<Image>(new Image(
-                       vk, device, allocator, makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_imageExtent, format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT), MemoryRequirement::Any));
+                       vk, device, allocator,
+                       makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_imageExtent, format, (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
+                                                               VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL),
+                       MemoryRequirement::Any));
        }
 
        void recordCommands (const VkCommandBuffer cmdBuffer)
@@ -4379,7 +4397,8 @@ public:
                m_colorImageSubresourceRange    = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
                m_colorImageExtent                              = makeExtent3D(16u, 16u, 1u);
                m_colorAttachmentImage                  = de::MovePtr<Image>(new Image(vk, device, allocator,
-                       makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_colorImageExtent, m_colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT),
+                       makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_colorImageExtent, m_colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
+                                                               VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL),
                        MemoryRequirement::Any));
 
                // Pipeline
@@ -4924,7 +4943,8 @@ public:
                m_colorImageSubresourceRange            = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
                m_colorImageExtent                                      = makeExtent3D(16u, 16u, 1u);
                m_colorAttachmentImage                          = de::MovePtr<Image>(new Image(vk, device, allocator,
-                       makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_colorImageExtent, m_colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT),
+                       makeImageCreateInfo(VK_IMAGE_TYPE_2D, m_colorImageExtent, m_colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
+                                                               VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL),
                        MemoryRequirement::Any));
 
                // Pipeline
@@ -5228,26 +5248,29 @@ Resource::Resource (OperationContext& context, const ResourceDescription& desc,
 
        if (m_type == RESOURCE_TYPE_BUFFER || m_type == RESOURCE_TYPE_INDEX_BUFFER || isIndirectBuffer(m_type))
        {
-               m_bufferData.offset                                     = 0u;
-               m_bufferData.size                                       = static_cast<VkDeviceSize>(desc.size.x());
-               VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(m_bufferData.size, usage);
+               m_bufferData = de::MovePtr<BufferResource>(new BufferResource(DE_NULL, 0u, static_cast<VkDeviceSize>(desc.size.x())));
+               VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(m_bufferData->size, usage);
                bufferCreateInfo.sharingMode            = sharingMode;
                if (queueFamilyIndex.size() > 0)
                {
                        bufferCreateInfo.queueFamilyIndexCount  = static_cast<deUint32>(queueFamilyIndex.size());
                        bufferCreateInfo.pQueueFamilyIndices    = &queueFamilyIndex[0];
                }
-               m_buffer                        = de::MovePtr<Buffer>(new Buffer(vk, device, allocator, bufferCreateInfo, MemoryRequirement::Any));
-               m_bufferData.handle     = **m_buffer;
+               m_buffer                                = de::MovePtr<Buffer>(new Buffer(vk, device, allocator, bufferCreateInfo, MemoryRequirement::Any));
+               m_bufferData->handle    = **m_buffer;
        }
        else if (m_type == RESOURCE_TYPE_IMAGE)
        {
-               m_imageData.extent                              = makeExtent3D(desc.size.x(), std::max(1, desc.size.y()), std::max(1, desc.size.z()));
-               m_imageData.imageType                   = desc.imageType;
-               m_imageData.format                              = desc.imageFormat;
-               m_imageData.subresourceRange    = makeImageSubresourceRange(desc.imageAspect, 0u, 1u, 0u, 1u);
-               m_imageData.subresourceLayers   = makeImageSubresourceLayers(desc.imageAspect, 0u, 0u, 1u);
-               VkImageCreateInfo imageInfo             = makeImageCreateInfo(m_imageData.imageType, m_imageData.extent, m_imageData.format, usage, desc.imageSamples);
+               m_imageData = de::MovePtr<ImageResource>(new ImageResource(
+                       DE_NULL,
+                       makeExtent3D(desc.size.x(), std::max(1, desc.size.y()), std::max(1, desc.size.z())),
+                       desc.imageType,
+                       desc.imageFormat,
+                       makeImageSubresourceRange(desc.imageAspect, 0u, 1u, 0u, 1u),
+                       makeImageSubresourceLayers(desc.imageAspect, 0u, 0u, 1u),
+                       vk::VK_IMAGE_TILING_OPTIMAL
+               ));
+               VkImageCreateInfo imageInfo             = makeImageCreateInfo(m_imageData->imageType, m_imageData->extent, m_imageData->format, usage, desc.imageSamples, m_imageData->tiling);
                imageInfo.sharingMode                   = sharingMode;
                if (queueFamilyIndex.size() > 0)
                {
@@ -5265,7 +5288,7 @@ Resource::Resource (OperationContext& context, const ResourceDescription& desc,
                        TCU_THROW(NotSupportedError, "Requested sample count is not supported");
 
                m_image                                                 = de::MovePtr<Image>(new Image(vk, device, allocator, imageInfo, MemoryRequirement::Any));
-               m_imageData.handle                              = **m_image;
+               m_imageData->handle                             = **m_image;
        }
        else
                DE_ASSERT(0);
@@ -5276,14 +5299,11 @@ Resource::Resource (ResourceType                                type,
                                        de::MovePtr<vk::Allocation>     allocation,
                                        vk::VkDeviceSize                        offset,
                                        vk::VkDeviceSize                        size)
-       : m_type        (type)
-       , m_buffer      (new Buffer(buffer, allocation))
+       : m_type                (type)
+       , m_buffer              (new Buffer(buffer, allocation))
+       , m_bufferData  (de::MovePtr<BufferResource>(new BufferResource(m_buffer->get(), offset, size)))
 {
        DE_ASSERT(type != RESOURCE_TYPE_IMAGE);
-
-       m_bufferData.handle     = m_buffer->get();
-       m_bufferData.offset     = offset;
-       m_bufferData.size       = size;
 }
 
 Resource::Resource (vk::Move<vk::VkImage>                      image,
@@ -5292,16 +5312,12 @@ Resource::Resource (vk::Move<vk::VkImage>                       image,
                                        vk::VkImageType                                 imageType,
                                        vk::VkFormat                                    format,
                                        vk::VkImageSubresourceRange             subresourceRange,
-                                       vk::VkImageSubresourceLayers    subresourceLayers)
-       : m_type        (RESOURCE_TYPE_IMAGE)
-       , m_image       (new Image(image, allocation))
+                                       vk::VkImageSubresourceLayers    subresourceLayers,
+                                       vk::VkImageTiling                               tiling)
+       : m_type                (RESOURCE_TYPE_IMAGE)
+       , m_image               (new Image(image, allocation))
+       , m_imageData   (de::MovePtr<ImageResource>(new ImageResource(m_image->get(), extent, imageType, format, subresourceRange, subresourceLayers, tiling)))
 {
-       m_imageData.handle                              = m_image->get();
-       m_imageData.extent                              = extent;
-       m_imageData.imageType                   = imageType;
-       m_imageData.format                              = format;
-       m_imageData.subresourceRange    = subresourceRange;
-       m_imageData.subresourceLayers   = subresourceLayers;
 }
 
 vk::VkDeviceMemory Resource::getMemory (void) const