maintenance4: Add maxBufferSize limit tests
authorPiotr Byszewski <piotr.byszewski@mobica.com>
Wed, 14 Jul 2021 07:52:10 +0000 (09:52 +0200)
committerPeter Kohaut <peter.kohaut@gmail.com>
Sun, 5 Sep 2021 22:10:16 +0000 (00:10 +0200)
Verify that VkBuffer with maxBufferSize can be created
for both normal and sparse buffers.

Components: Vulkan

VK-GL-CTS issue: 2996

Affets:
dEQP-VK.api.buffer.basic.*

Change-Id: I439a4f9ab0d809367054e711dc128a3c2aabecf9

android/cts/master/vk-master-2021-03-01/api.txt
android/cts/master/vk-master/api.txt
external/vulkancts/modules/vulkan/api/vktApiBufferTests.cpp
external/vulkancts/mustpass/master/vk-default/api.txt

index 18e3d87..f517288 100644 (file)
@@ -63,6 +63,8 @@ dEQP-VK.api.object_management.private_data.command_pool
 dEQP-VK.api.object_management.private_data.command_pool_transient
 dEQP-VK.api.object_management.private_data.command_buffer_primary
 dEQP-VK.api.object_management.private_data.command_buffer_secondary
+dEQP-VK.api.buffer.basic.max_size
+dEQP-VK.api.buffer.basic.max_size_sparse
 dEQP-VK.api.buffer.basic.size_max_uint64
 dEQP-VK.api.command_buffers.record_many_draws_primary_1
 dEQP-VK.api.command_buffers.record_many_draws_primary_2
index 4ed63f6..2f5aa54 100644 (file)
@@ -7237,6 +7237,8 @@ dEQP-VK.api.buffer.dedicated_alloc.index.create.zero
 dEQP-VK.api.buffer.dedicated_alloc.vertex.indirect.create.zero
 dEQP-VK.api.buffer.dedicated_alloc.vertex.create.zero
 dEQP-VK.api.buffer.dedicated_alloc.indirect.create.zero
+dEQP-VK.api.buffer.basic.max_size
+dEQP-VK.api.buffer.basic.max_size_sparse
 dEQP-VK.api.buffer.basic.size_max_uint64
 dEQP-VK.api.buffer_marker.graphics.external_host_mem.top_of_pipe.sequential.4
 dEQP-VK.api.buffer_marker.graphics.external_host_mem.top_of_pipe.sequential.64
index 97cf062..a806c63 100644 (file)
@@ -658,19 +658,29 @@ void createBufferUsageCases (tcu::TestCaseGroup& testGroup, const deUint32 first
        }
 }
 
-tcu::TestStatus testOverlyLargeBuffer(Context& context, deUint64 bufferSize)
+struct LargeBufferParameters
+{
+       deUint64                                bufferSize;
+       bool                                    useMaxBufferSize;
+       VkBufferCreateFlags             flags;
+};
+
+tcu::TestStatus testLargeBuffer(Context& context, LargeBufferParameters params)
 {
        const DeviceInterface&  vk                                      = context.getDeviceInterface();
        const VkDevice                  vkDevice                        = context.getDevice();
        const deUint32                  queueFamilyIndex        = context.getUniversalQueueFamilyIndex();
        VkBuffer                                rawBuffer                       = DE_NULL;
 
+       if (params.useMaxBufferSize)
+               params.bufferSize = context.getMaintenance4Properties().maxBufferSize;
+
        VkBufferCreateInfo bufferParams =
        {
                VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,   // VkStructureType                      sType;
                DE_NULL,                                                                // const void*                          pNext;
-               0u,                                                                             // VkBufferCreateFlags          flags;
-               bufferSize,                                                             // VkDeviceSize                         size;
+               params.flags,                                                   // VkBufferCreateFlags          flags;
+               params.bufferSize,                                              // VkDeviceSize                         size;
                VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,             // VkBufferUsageFlags           usage;
                VK_SHARING_MODE_EXCLUSIVE,                              // VkSharingMode                        sharingMode;
                1u,                                                                             // uint32_t                                     queueFamilyIndexCount;
@@ -686,7 +696,7 @@ tcu::TestStatus testOverlyLargeBuffer(Context& context, deUint64 bufferSize)
                vk.getBufferMemoryRequirements(vkDevice, rawBuffer, &memoryRequirements);
                vk.destroyBuffer(vkDevice, rawBuffer, DE_NULL);
 
-               if (memoryRequirements.size >= bufferSize)
+               if (memoryRequirements.size >= params.bufferSize)
                        return tcu::TestStatus::pass("Pass");
                return tcu::TestStatus::fail("Fail");
        }
@@ -701,6 +711,15 @@ tcu::TestStatus testOverlyLargeBuffer(Context& context, deUint64 bufferSize)
        return tcu::TestStatus::fail("Fail");
 }
 
+void checkMaintenance4Support(Context& context, LargeBufferParameters params)
+{
+       context.requireDeviceFunctionality("VK_KHR_maintenance4");
+
+       const VkPhysicalDeviceFeatures& physicalDeviceFeatures = getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice());
+       if ((params.flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) && !physicalDeviceFeatures.sparseBinding)
+               TCU_THROW(NotSupportedError, "Sparse bindings feature is not supported");
+}
+
 } // anonymous
 
  tcu::TestCaseGroup* createBufferTests (tcu::TestContext& testCtx)
@@ -721,7 +740,27 @@ tcu::TestStatus testOverlyLargeBuffer(Context& context, deUint64 bufferSize)
 
        {
                de::MovePtr<tcu::TestCaseGroup> basicTests(new tcu::TestCaseGroup(testCtx, "basic", "Basic buffer tests."));
-               addFunctionCase(basicTests.get(), "size_max_uint64", "Creating a ULLONG_MAX buffer and verify that it either succeeds or returns one of the allowed errors.", testOverlyLargeBuffer, std::numeric_limits<deUint64>::max());
+               addFunctionCase(basicTests.get(), "max_size", "Creating buffer using maxBufferSize limit.",
+                                               checkMaintenance4Support, testLargeBuffer, LargeBufferParameters
+                                               {
+                                                       0u,
+                                                       true,
+                                                       0u
+                                               });
+               addFunctionCase(basicTests.get(), "max_size_sparse", "Creating sparse buffer using maxBufferSize limit.",
+                                               checkMaintenance4Support, testLargeBuffer, LargeBufferParameters
+                                               {
+                                                       0u,
+                                                       true,
+                                                       VK_BUFFER_CREATE_SPARSE_BINDING_BIT
+                                               });
+               addFunctionCase(basicTests.get(), "size_max_uint64", "Creating a ULLONG_MAX buffer and verify that it either succeeds or returns one of the allowed errors.",
+                                               testLargeBuffer, LargeBufferParameters
+                                               {
+                                                       std::numeric_limits<deUint64>::max(),
+                                                       false,
+                                                       0u
+                                               });
                buffersTests->addChild(basicTests.release());
        }
 
index 402abd1..c0655d6 100644 (file)
@@ -7235,6 +7235,8 @@ dEQP-VK.api.buffer.dedicated_alloc.index.create.zero
 dEQP-VK.api.buffer.dedicated_alloc.vertex.indirect.create.zero
 dEQP-VK.api.buffer.dedicated_alloc.vertex.create.zero
 dEQP-VK.api.buffer.dedicated_alloc.indirect.create.zero
+dEQP-VK.api.buffer.basic.max_size
+dEQP-VK.api.buffer.basic.max_size_sparse
 dEQP-VK.api.buffer.basic.size_max_uint64
 dEQP-VK.api.buffer_marker.graphics.external_host_mem.top_of_pipe.sequential.4
 dEQP-VK.api.buffer_marker.graphics.external_host_mem.top_of_pipe.sequential.64