From: Antto Mäkinen Date: Tue, 31 May 2022 10:36:09 +0000 (+0300) Subject: Add coverage of indirect dispatches on the compute queue X-Git-Tag: upstream/1.3.5~232 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2d06a9e913a1026b8c93d25189870309e416116a;p=platform%2Fupstream%2FVK-GL-CTS.git Add coverage of indirect dispatches on the compute queue This commit adds variants of the existing tests for indirect dispatches that use a compute queue without graphics capabilities. VK-GL-CTS issue: 3525 New Tests: dEQP-VK.compute.indirect_dispatch.gen_in_compute.*_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.*_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.*_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.*_compute_only_queue Components: Vulkan Change-Id: I591483a32e2ee3ffc7c19b75068e439f5e49c078 --- diff --git a/android/cts/main/vk-master-2022-03-01/compute.txt b/android/cts/main/vk-master-2022-03-01/compute.txt index 61b4573..c0acf7b 100644 --- a/android/cts/main/vk-master-2022-03-01/compute.txt +++ b/android/cts/main/vk-master-2022-03-01/compute.txt @@ -8,6 +8,24 @@ dEQP-VK.compute.zero_initialize_workgroup_memory.shared_memory_blocks.workgroup_ dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.block dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.other_block dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.block_with_offset +dEQP-VK.compute.indirect_dispatch.upload_buffer.single_invocation_compute_only_queue +dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups_compute_only_queue +dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations_compute_only_queue +dEQP-VK.compute.indirect_dispatch.upload_buffer.small_offset_compute_only_queue +dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset_compute_only_queue +dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations_compute_only_queue +dEQP-VK.compute.indirect_dispatch.upload_buffer.empty_command_compute_only_queue +dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch_compute_only_queue +dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command_compute_only_queue +dEQP-VK.compute.indirect_dispatch.gen_in_compute.single_invocation_compute_only_queue +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups_compute_only_queue +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations_compute_only_queue +dEQP-VK.compute.indirect_dispatch.gen_in_compute.small_offset_compute_only_queue +dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset_compute_only_queue +dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations_compute_only_queue +dEQP-VK.compute.indirect_dispatch.gen_in_compute.empty_command_compute_only_queue +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch_compute_only_queue +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command_compute_only_queue dEQP-VK.compute.basic.empty_workgroup_x dEQP-VK.compute.basic.empty_workgroup_y dEQP-VK.compute.basic.empty_workgroup_z diff --git a/android/cts/main/vk-master/compute.txt b/android/cts/main/vk-master/compute.txt index 4c17798..7c5071e 100644 --- a/android/cts/main/vk-master/compute.txt +++ b/android/cts/main/vk-master/compute.txt @@ -4472,23 +4472,41 @@ dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.block dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.other_block dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.block_with_offset dEQP-VK.compute.indirect_dispatch.upload_buffer.single_invocation +dEQP-VK.compute.indirect_dispatch.upload_buffer.single_invocation_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups +dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations +dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.small_offset +dEQP-VK.compute.indirect_dispatch.upload_buffer.small_offset_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset +dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations +dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.empty_command +dEQP-VK.compute.indirect_dispatch.upload_buffer.empty_command_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch +dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command +dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.single_invocation +dEQP-VK.compute.indirect_dispatch.gen_in_compute.single_invocation_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.small_offset +dEQP-VK.compute.indirect_dispatch.gen_in_compute.small_offset_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset +dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations +dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.empty_command +dEQP-VK.compute.indirect_dispatch.gen_in_compute.empty_command_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command_compute_only_queue dEQP-VK.compute.device_group.dispatch_base dEQP-VK.compute.device_group.device_index dEQP-VK.compute.cooperative_matrix.length.float32_float32.buffer.rowmajor diff --git a/android/cts/main/vksc-main/compute.txt b/android/cts/main/vksc-main/compute.txt index 65b2ef6..7e3a7e6 100644 --- a/android/cts/main/vksc-main/compute.txt +++ b/android/cts/main/vksc-main/compute.txt @@ -638,23 +638,41 @@ dEQP-VKSC.compute.zero_initialize_workgroup_memory.repeat_pipeline.x_64_odd_repe dEQP-VKSC.compute.zero_initialize_workgroup_memory.repeat_pipeline.x_64_odd_repeat_8 dEQP-VKSC.compute.zero_initialize_workgroup_memory.repeat_pipeline.x_64_odd_repeat_16 dEQP-VKSC.compute.indirect_dispatch.upload_buffer.single_invocation +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.single_invocation_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multiple_groups +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multiple_groups_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.small_offset +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.small_offset_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.large_offset +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.large_offset_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.empty_command +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.empty_command_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multi_dispatch +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multi_dispatch_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.single_invocation +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.single_invocation_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multiple_groups +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multiple_groups_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.small_offset +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.small_offset_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.large_offset +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.large_offset_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.empty_command +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.empty_command_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multi_dispatch +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multi_dispatch_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command_compute_only_queue dEQP-VKSC.compute.device_group.dispatch_base dEQP-VKSC.compute.device_group.device_index dEQP-VKSC.compute.builtin_var.num_work_groups diff --git a/external/vulkancts/modules/vulkan/compute/vktComputeIndirectComputeDispatchTests.cpp b/external/vulkancts/modules/vulkan/compute/vktComputeIndirectComputeDispatchTests.cpp index b57ce9f..1efdaac 100644 --- a/external/vulkancts/modules/vulkan/compute/vktComputeIndirectComputeDispatchTests.cpp +++ b/external/vulkancts/modules/vulkan/compute/vktComputeIndirectComputeDispatchTests.cpp @@ -24,6 +24,7 @@ #include "vktComputeIndirectComputeDispatchTests.hpp" #include "vktComputeTestsUtil.hpp" +#include "vktCustomInstancesDevices.hpp" #include #include @@ -56,6 +57,9 @@ #include "deArrayUtil.hpp" #include "gluShaderUtil.hpp" +#include "tcuCommandLine.hpp" + +#include namespace vkt { @@ -63,6 +67,89 @@ namespace compute { namespace { +std::vector removeCoreExtensions (const std::vector& supportedExtensions, const std::vector& coreExtensions) +{ + std::vector nonCoreExtensions; + std::set excludedExtensions (coreExtensions.begin(), coreExtensions.end()); + + for (const auto & supportedExtension : supportedExtensions) + { + if (!de::contains(excludedExtensions, supportedExtension)) + nonCoreExtensions.push_back(supportedExtension); + } + + return nonCoreExtensions; +} + +// Creates a device that has a queue for compute capabilities without graphics. +vk::Move createCustomDevice (Context& context, uint32_t& queueFamilyIndex) +{ + const std::vector queueFamilies = getPhysicalDeviceQueueFamilyProperties(context.getInstanceInterface(), + context.getPhysicalDevice()); + + queueFamilyIndex = 0; + for (const auto &queueFamily: queueFamilies) + { + if (queueFamily.queueFlags & vk::VK_QUEUE_COMPUTE_BIT && !(queueFamily.queueFlags & vk::VK_QUEUE_GRAPHICS_BIT)) + break; + else + queueFamilyIndex++; + } + + // One queue family without a graphics bit should be found, since this is checked in checkSupport. + DE_ASSERT(queueFamilyIndex < queueFamilies.size()); + + const float queuePriority = 1.0f; + const vk::VkDeviceQueueCreateInfo deviceQueueCreateInfos[] = { + { + vk::VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + (vk::VkDeviceQueueCreateFlags)0u, // VkDeviceQueueCreateFlags flags; + context.getUniversalQueueFamilyIndex(), // uint32_t queueFamilyIndex; + 1u, // uint32_t queueCount; + &queuePriority, // const float* pQueuePriorities; + }, + { + vk::VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + (vk::VkDeviceQueueCreateFlags)0u, // VkDeviceQueueCreateFlags flags; + queueFamilyIndex, // uint32_t queueFamilyIndex; + 1u, // uint32_t queueCount; + &queuePriority, // const float* pQueuePriorities; + } + }; + + // context.getDeviceExtensions() returns supported device extension including extensions that have been promoted to + // Vulkan core. The core extensions must be removed from the list. + std::vector coreExtensions; + vk::getCoreDeviceExtensions(context.getUsedApiVersion(), coreExtensions); + std::vector nonCoreExtensions(removeCoreExtensions(context.getDeviceExtensions(), coreExtensions)); + + std::vector extensionNames; + extensionNames.reserve(nonCoreExtensions.size()); + for (const std::string& extension : nonCoreExtensions) + extensionNames.push_back(extension.c_str()); + + const auto& deviceFeatures2 = context.getDeviceFeatures2(); + + const vk::VkDeviceCreateInfo deviceCreateInfo = + { + vk::VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType; + &deviceFeatures2, // const void* pNext; + (vk::VkDeviceCreateFlags)0u, // VkDeviceCreateFlags flags; + DE_LENGTH_OF_ARRAY(deviceQueueCreateInfos), // uint32_t queueCreateInfoCount; + deviceQueueCreateInfos, // const VkDeviceQueueCreateInfo* pQueueCreateInfos; + 0u, // uint32_t enabledLayerCount; + DE_NULL, // const char* const* ppEnabledLayerNames; + static_cast(extensionNames.size()), // uint32_t enabledExtensionCount; + extensionNames.data(), // const char* const* ppEnabledExtensionNames; + DE_NULL, // const VkPhysicalDeviceFeatures* pEnabledFeatures; + }; + + return vkt::createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), + context.getPlatformInterface(), context.getInstance(), + context.getInstanceInterface(), context.getPhysicalDevice(), &deviceCreateInfo); +} enum { @@ -105,18 +192,21 @@ struct DispatchCaseDesc const char* description, const deUintptr bufferSize, const tcu::UVec3 workGroupSize, - const DispatchCommandsVec& dispatchCommands) + const DispatchCommandsVec& dispatchCommands, + const bool computeQueueOnly) : m_name (name) , m_description (description) , m_bufferSize (bufferSize) , m_workGroupSize (workGroupSize) - , m_dispatchCommands (dispatchCommands) {} + , m_dispatchCommands (dispatchCommands) + , m_computeOnlyQueue (computeQueueOnly) {} const char* m_name; const char* m_description; const deUintptr m_bufferSize; const tcu::UVec3 m_workGroupSize; const DispatchCommandsVec m_dispatchCommands; + const bool m_computeOnlyQueue; }; class IndirectDispatchInstanceBufferUpload : public vkt::TestInstance @@ -126,7 +216,8 @@ public: const std::string& name, const deUintptr bufferSize, const tcu::UVec3& workGroupSize, - const DispatchCommandsVec& dispatchCommands); + const DispatchCommandsVec& dispatchCommands, + const bool computeQueueOnly); virtual ~IndirectDispatchInstanceBufferUpload (void) {} @@ -143,10 +234,11 @@ protected: const std::string m_name; const vk::DeviceInterface& m_device_interface; - const vk::VkDevice m_device; + vk::VkDevice m_device; + vk::Move m_customDevice; - const vk::VkQueue m_queue; - const deUint32 m_queueFamilyIndex; + vk::VkQueue m_queue; + deUint32 m_queueFamilyIndex; const deUintptr m_bufferSize; const tcu::UVec3 m_workGroupSize; @@ -154,6 +246,7 @@ protected: vk::Allocator& m_allocator; + const bool m_computeQueueOnly; private: IndirectDispatchInstanceBufferUpload (const vkt::TestInstance&); IndirectDispatchInstanceBufferUpload& operator= (const vkt::TestInstance&); @@ -163,7 +256,8 @@ IndirectDispatchInstanceBufferUpload::IndirectDispatchInstanceBufferUpload (Cont const std::string& name, const deUintptr bufferSize, const tcu::UVec3& workGroupSize, - const DispatchCommandsVec& dispatchCommands) + const DispatchCommandsVec& dispatchCommands, + const bool computeQueueOnly) : vkt::TestInstance (context) , m_context (context) , m_name (name) @@ -175,6 +269,7 @@ IndirectDispatchInstanceBufferUpload::IndirectDispatchInstanceBufferUpload (Cont , m_workGroupSize (workGroupSize) , m_dispatchCommands (dispatchCommands) , m_allocator (context.getDefaultAllocator()) + , m_computeQueueOnly (computeQueueOnly) { } @@ -218,6 +313,17 @@ tcu::TestStatus IndirectDispatchInstanceBufferUpload::iterate (void) } } + if (m_computeQueueOnly) + { + // m_queueFamilyIndex will be updated in createCustomDevice() to match the requested queue type. + m_customDevice = createCustomDevice(m_context, m_queueFamilyIndex); + m_device = m_customDevice.get(); + + m_queue = getDeviceQueue(m_context.getDeviceInterface(), m_device, m_queueFamilyIndex, 0u); + m_allocator = vk::SimpleAllocator(m_device_interface, m_device, + vk::getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice())); + } + // Create result buffer const vk::VkDeviceSize resultBlockSize = getResultBlockAlignedSize(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), RESULT_BLOCK_BASE_SIZE); const vk::VkDeviceSize resultBufferSize = resultBlockSize * (deUint32)m_dispatchCommands.size(); @@ -375,12 +481,14 @@ public: virtual void initPrograms (vk::SourceCollections& programCollection) const; virtual TestInstance* createInstance (Context& context) const; + virtual void checkSupport (Context& context) const; protected: const deUintptr m_bufferSize; const tcu::UVec3 m_workGroupSize; const DispatchCommandsVec m_dispatchCommands; const glu::GLSLVersion m_glslVersion; + const bool m_computeOnlyQueue; private: IndirectDispatchCaseBufferUpload (const vkt::TestCase&); @@ -395,6 +503,7 @@ IndirectDispatchCaseBufferUpload::IndirectDispatchCaseBufferUpload (tcu::TestCon , m_workGroupSize (caseDesc.m_workGroupSize) , m_dispatchCommands (caseDesc.m_dispatchCommands) , m_glslVersion (glslVersion) + , m_computeOnlyQueue (caseDesc.m_computeOnlyQueue) { } @@ -431,18 +540,43 @@ void IndirectDispatchCaseBufferUpload::initPrograms (vk::SourceCollections& prog TestInstance* IndirectDispatchCaseBufferUpload::createInstance (Context& context) const { - return new IndirectDispatchInstanceBufferUpload(context, m_name, m_bufferSize, m_workGroupSize, m_dispatchCommands); + return new IndirectDispatchInstanceBufferUpload(context, m_name, m_bufferSize, m_workGroupSize, m_dispatchCommands, m_computeOnlyQueue); +} + +void IndirectDispatchCaseBufferUpload::checkSupport (Context& context) const +{ + // Find at least one queue family that supports compute queue but does NOT support graphics queue. + if (m_computeOnlyQueue) + { + bool foundQueue = false; + const std::vector queueFamilies = getPhysicalDeviceQueueFamilyProperties( + context.getInstanceInterface(), context.getPhysicalDevice()); + + for (const auto &queueFamily: queueFamilies) + { + if (queueFamily.queueFlags & vk::VK_QUEUE_COMPUTE_BIT && + !(queueFamily.queueFlags & vk::VK_QUEUE_GRAPHICS_BIT)) + { + foundQueue = true; + break; + } + } + if (!foundQueue) + TCU_THROW(NotSupportedError, "No queue family found that only supports compute queue."); + } } -class IndirectDispatchInstanceBufferGenerate : public IndirectDispatchInstanceBufferUpload + class IndirectDispatchInstanceBufferGenerate : public IndirectDispatchInstanceBufferUpload { public: IndirectDispatchInstanceBufferGenerate (Context& context, const std::string& name, const deUintptr bufferSize, const tcu::UVec3& workGroupSize, - const DispatchCommandsVec& dispatchCommands) - : IndirectDispatchInstanceBufferUpload(context, name, bufferSize, workGroupSize, dispatchCommands) {} + const DispatchCommandsVec& dispatchCommands, + const bool computeOnlyQueue) + + : IndirectDispatchInstanceBufferUpload(context, name, bufferSize, workGroupSize, dispatchCommands, computeOnlyQueue) {} virtual ~IndirectDispatchInstanceBufferGenerate (void) {} @@ -575,7 +709,7 @@ void IndirectDispatchCaseBufferGenerate::initPrograms (vk::SourceCollections& pr TestInstance* IndirectDispatchCaseBufferGenerate::createInstance (Context& context) const { - return new IndirectDispatchInstanceBufferGenerate(context, m_name, m_bufferSize, m_workGroupSize, m_dispatchCommands); + return new IndirectDispatchInstanceBufferGenerate(context, m_name, m_bufferSize, m_workGroupSize, m_dispatchCommands, m_computeOnlyQueue); } DispatchCommandsVec commandsVec (const DispatchCommand& cmd) @@ -623,35 +757,36 @@ DispatchCommandsVec commandsVec (const DispatchCommand& cmd0, tcu::TestCaseGroup* createIndirectComputeDispatchTests (tcu::TestContext& testCtx) { + static const DispatchCaseDesc s_dispatchCases[] = { DispatchCaseDesc("single_invocation", "Single invocation only from offset 0", INDIRECT_COMMAND_OFFSET, tcu::UVec3(1, 1, 1), - commandsVec(DispatchCommand(0, tcu::UVec3(1, 1, 1))) - ), + commandsVec(DispatchCommand(0, tcu::UVec3(1, 1, 1))), false + ), DispatchCaseDesc("multiple_groups", "Multiple groups dispatched from offset 0", INDIRECT_COMMAND_OFFSET, tcu::UVec3(1, 1, 1), - commandsVec(DispatchCommand(0, tcu::UVec3(2, 3, 5))) + commandsVec(DispatchCommand(0, tcu::UVec3(2, 3, 5))), false ), DispatchCaseDesc("multiple_groups_multiple_invocations", "Multiple groups of size 2x3x1 from offset 0", INDIRECT_COMMAND_OFFSET, tcu::UVec3(2, 3, 1), - commandsVec(DispatchCommand(0, tcu::UVec3(1, 2, 3))) + commandsVec(DispatchCommand(0, tcu::UVec3(1, 2, 3))), false ), DispatchCaseDesc("small_offset", "Small offset", 16 + INDIRECT_COMMAND_OFFSET, tcu::UVec3(1, 1, 1), - commandsVec(DispatchCommand(16, tcu::UVec3(1, 1, 1))) + commandsVec(DispatchCommand(16, tcu::UVec3(1, 1, 1))), false ), DispatchCaseDesc("large_offset", "Large offset", (2 << 20), tcu::UVec3(1, 1, 1), - commandsVec(DispatchCommand((1 << 20) + 12, tcu::UVec3(1, 1, 1))) + commandsVec(DispatchCommand((1 << 20) + 12, tcu::UVec3(1, 1, 1))), false ), DispatchCaseDesc("large_offset_multiple_invocations", "Large offset, multiple invocations", (2 << 20), tcu::UVec3(2, 3, 1), - commandsVec(DispatchCommand((1 << 20) + 12, tcu::UVec3(1, 2, 3))) + commandsVec(DispatchCommand((1 << 20) + 12, tcu::UVec3(1, 2, 3))), false ), DispatchCaseDesc("empty_command", "Empty command", INDIRECT_COMMAND_OFFSET, tcu::UVec3(1, 1, 1), - commandsVec(DispatchCommand(0, tcu::UVec3(0, 0, 0))) + commandsVec(DispatchCommand(0, tcu::UVec3(0, 0, 0))), false ), DispatchCaseDesc("multi_dispatch", "Dispatch multiple compute commands from single buffer", 1 << 10, tcu::UVec3(3, 1, 2), commandsVec(DispatchCommand(0, tcu::UVec3(1, 1, 1)), DispatchCommand(INDIRECT_COMMAND_OFFSET, tcu::UVec3(2, 1, 1)), DispatchCommand(104, tcu::UVec3(1, 3, 1)), DispatchCommand(40, tcu::UVec3(1, 1, 7)), - DispatchCommand(52, tcu::UVec3(1, 1, 4))) + DispatchCommand(52, tcu::UVec3(1, 1, 4))), false ), DispatchCaseDesc("multi_dispatch_reuse_command", "Dispatch multiple compute commands from single buffer", 1 << 10, tcu::UVec3(3, 1, 2), commandsVec(DispatchCommand(0, tcu::UVec3(1, 1, 1)), @@ -660,7 +795,7 @@ tcu::TestCaseGroup* createIndirectComputeDispatchTests (tcu::TestContext& testCt DispatchCommand(104, tcu::UVec3(1, 3, 1)), DispatchCommand(104, tcu::UVec3(1, 3, 1)), DispatchCommand(52, tcu::UVec3(1, 1, 4)), - DispatchCommand(52, tcu::UVec3(1, 1, 4))) + DispatchCommand(52, tcu::UVec3(1, 1, 4))), false ), }; @@ -671,7 +806,12 @@ tcu::TestCaseGroup* createIndirectComputeDispatchTests (tcu::TestContext& testCt for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_dispatchCases); ndx++) { - groupBufferUpload->addChild(new IndirectDispatchCaseBufferUpload(testCtx, s_dispatchCases[ndx], glu::GLSL_VERSION_310_ES)); + DispatchCaseDesc desc = s_dispatchCases[ndx]; + std::string computeName = std::string(desc.m_name) + std::string("_compute_only_queue"); + DispatchCaseDesc computeOnlyDesc = DispatchCaseDesc(computeName.c_str(), desc.m_description, desc.m_bufferSize, desc.m_workGroupSize, + desc.m_dispatchCommands, true); + groupBufferUpload->addChild(new IndirectDispatchCaseBufferUpload(testCtx, desc, glu::GLSL_VERSION_310_ES)); + groupBufferUpload->addChild(new IndirectDispatchCaseBufferUpload(testCtx, computeOnlyDesc, glu::GLSL_VERSION_310_ES)); } tcu::TestCaseGroup* const groupBufferGenerate = new tcu::TestCaseGroup(testCtx, "gen_in_compute", ""); @@ -679,7 +819,12 @@ tcu::TestCaseGroup* createIndirectComputeDispatchTests (tcu::TestContext& testCt for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_dispatchCases); ndx++) { - groupBufferGenerate->addChild(new IndirectDispatchCaseBufferGenerate(testCtx, s_dispatchCases[ndx], glu::GLSL_VERSION_310_ES)); + DispatchCaseDesc desc = s_dispatchCases[ndx]; + std::string computeName = std::string(desc.m_name) + std::string("_compute_only_queue"); + DispatchCaseDesc computeOnlyDesc = DispatchCaseDesc(computeName.c_str(), desc.m_description, desc.m_bufferSize, desc.m_workGroupSize, + desc.m_dispatchCommands, true); + groupBufferGenerate->addChild(new IndirectDispatchCaseBufferGenerate(testCtx, desc, glu::GLSL_VERSION_310_ES)); + groupBufferGenerate->addChild(new IndirectDispatchCaseBufferGenerate(testCtx, computeOnlyDesc, glu::GLSL_VERSION_310_ES)); } return indirectComputeDispatchTests.release(); diff --git a/external/vulkancts/mustpass/main/vk-default/compute.txt b/external/vulkancts/mustpass/main/vk-default/compute.txt index 4c17798..7c5071e 100644 --- a/external/vulkancts/mustpass/main/vk-default/compute.txt +++ b/external/vulkancts/mustpass/main/vk-default/compute.txt @@ -4472,23 +4472,41 @@ dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.block dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.other_block dEQP-VK.compute.workgroup_memory_explicit_layout.zero_ext.block_with_offset dEQP-VK.compute.indirect_dispatch.upload_buffer.single_invocation +dEQP-VK.compute.indirect_dispatch.upload_buffer.single_invocation_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups +dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations +dEQP-VK.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.small_offset +dEQP-VK.compute.indirect_dispatch.upload_buffer.small_offset_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset +dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations +dEQP-VK.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.empty_command +dEQP-VK.compute.indirect_dispatch.upload_buffer.empty_command_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch +dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch_compute_only_queue dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command +dEQP-VK.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.single_invocation +dEQP-VK.compute.indirect_dispatch.gen_in_compute.single_invocation_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.small_offset +dEQP-VK.compute.indirect_dispatch.gen_in_compute.small_offset_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset +dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations +dEQP-VK.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.empty_command +dEQP-VK.compute.indirect_dispatch.gen_in_compute.empty_command_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch_compute_only_queue dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command +dEQP-VK.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command_compute_only_queue dEQP-VK.compute.device_group.dispatch_base dEQP-VK.compute.device_group.device_index dEQP-VK.compute.cooperative_matrix.length.float32_float32.buffer.rowmajor diff --git a/external/vulkancts/mustpass/main/vksc-default/compute.txt b/external/vulkancts/mustpass/main/vksc-default/compute.txt index 65b2ef6..7e3a7e6 100644 --- a/external/vulkancts/mustpass/main/vksc-default/compute.txt +++ b/external/vulkancts/mustpass/main/vksc-default/compute.txt @@ -638,23 +638,41 @@ dEQP-VKSC.compute.zero_initialize_workgroup_memory.repeat_pipeline.x_64_odd_repe dEQP-VKSC.compute.zero_initialize_workgroup_memory.repeat_pipeline.x_64_odd_repeat_8 dEQP-VKSC.compute.zero_initialize_workgroup_memory.repeat_pipeline.x_64_odd_repeat_16 dEQP-VKSC.compute.indirect_dispatch.upload_buffer.single_invocation +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.single_invocation_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multiple_groups +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multiple_groups_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multiple_groups_multiple_invocations_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.small_offset +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.small_offset_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.large_offset +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.large_offset_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.large_offset_multiple_invocations_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.empty_command +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.empty_command_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multi_dispatch +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multi_dispatch_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command +dEQP-VKSC.compute.indirect_dispatch.upload_buffer.multi_dispatch_reuse_command_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.single_invocation +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.single_invocation_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multiple_groups +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multiple_groups_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multiple_groups_multiple_invocations_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.small_offset +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.small_offset_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.large_offset +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.large_offset_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.empty_command +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.empty_command_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multi_dispatch +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multi_dispatch_compute_only_queue dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command +dEQP-VKSC.compute.indirect_dispatch.gen_in_compute.multi_dispatch_reuse_command_compute_only_queue dEQP-VKSC.compute.device_group.dispatch_base dEQP-VKSC.compute.device_group.device_index dEQP-VKSC.compute.builtin_var.num_work_groups