Add VK_KHR_workgroup_memory_explicit_layout maximum size tests
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Sat, 5 Dec 2020 05:08:57 +0000 (20:08 -0900)
committerAlexander Galazin <alexander.galazin@arm.com>
Mon, 15 Feb 2021 13:44:59 +0000 (14:44 +0100)
Dynamic generation of shaders based on properties reported by devices
is not allowed in the CTS, and in this case we can't use a
specialization constant as the array size.  So the test have a few
variants with common maximum values.

Component: Vulkan
VK-GL-CTS Issue: 2524
New Tests: dEQP-VK.compute.workgroup_memory_explicit_layout.size.*

Change-Id: Ic960d22277b0a7bff428eae99e1f3107d9b4c85e

android/cts/master/vk-master-2020-03-01.txt
android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/compute/vktComputeWorkgroupMemoryExplicitLayoutTests.cpp
external/vulkancts/mustpass/master/vk-default.txt

index 13decde..78ec0e8 100644 (file)
@@ -204607,6 +204607,13 @@ dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_27_uint8_t_28
 dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_28_uint8_t_29
 dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_29_uint8_t_30
 dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_30_uint8_t_31
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.8
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.64
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.4096
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.16384
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.32768
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.49152
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.65536
 dEQP-VK.image.store.with_format.1d.b10g11r11_ufloat_pack32
 dEQP-VK.image.store.with_format.1d.r32g32_sfloat
 dEQP-VK.image.store.with_format.1d.r16g16_sfloat
index 0ca154d..b35abe8 100644 (file)
@@ -521429,6 +521429,13 @@ dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_27_uint8_t_28
 dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_28_uint8_t_29
 dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_29_uint8_t_30
 dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_30_uint8_t_31
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.8
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.64
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.4096
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.16384
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.32768
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.49152
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.65536
 dEQP-VK.image.store.with_format.1d.r32g32b32a32_sfloat
 dEQP-VK.image.store.with_format.1d.r16g16b16a16_sfloat
 dEQP-VK.image.store.with_format.1d.r32_sfloat
index a00a485..8a03b5b 100644 (file)
@@ -1211,6 +1211,118 @@ void AddPaddingTests(tcu::TestCaseGroup* group)
        }
 }
 
+class SizeTest : public vkt::TestCase
+{
+public:
+       SizeTest(tcu::TestContext& testCtx, deUint32 size)
+               : TestCase(testCtx, de::toString(size), de::toString(size))
+               , m_size(size)
+       {
+               DE_ASSERT(size % 8 == 0);
+       }
+
+       virtual void checkSupport(Context& context) const;
+       void initPrograms(SourceCollections& sourceCollections) const;
+
+       class Instance : public vkt::TestInstance
+       {
+       public:
+               Instance(Context& context)
+                       : TestInstance(context)
+               {
+               }
+
+               tcu::TestStatus iterate(void)
+               {
+                       return runCompute(m_context, 1u);
+               }
+       };
+
+       TestInstance* createInstance(Context& context) const
+       {
+               return new Instance(context);
+       }
+
+private:
+       deUint32 m_size;
+};
+
+void SizeTest::checkSupport(Context& context) const
+{
+       context.requireDeviceFunctionality("VK_KHR_workgroup_memory_explicit_layout");
+       context.requireDeviceFunctionality("VK_KHR_spirv_1_4");
+
+       if (context.getDeviceProperties().limits.maxComputeSharedMemorySize < m_size)
+               TCU_THROW(NotSupportedError, "Not enough shared memory supported.");
+}
+
+void SizeTest::initPrograms(SourceCollections& sourceCollections) const
+{
+       using namespace glu;
+
+       std::ostringstream src;
+
+       src << "#version 450\n";
+       src << "#extension GL_EXT_shared_memory_block : enable\n";
+       src << "#extension GL_EXT_shader_explicit_arithmetic_types : enable\n";
+       src << "layout(local_size_x = 8, local_size_y = 1, local_size_z = 1) in;\n";
+
+       for (deUint32 i = 0; i < 8; ++i)
+               src << "shared B" << i << " { uint32_t words[" << (m_size / 4) << "]; } b" << i << ";\n";
+
+       src << "layout(set = 0, binding = 0) buffer Result { uint result; };\n";
+
+       src     << "void main() {\n";
+       src << "  int index = int(gl_LocalInvocationIndex);\n";
+       src << "  int size = " << (m_size / 4) << ";\n";
+
+       src << "  if (index == 0) for (int x = 0; x < size; x++) b0.words[x] = 0xFFFF;\n";
+       src << "  barrier();\n";
+
+       src << "  for (int x = 0; x < size; x++) {\n";
+       src << "    if (x % 8 != index) continue;\n";
+       for (deUint32 i = 0; i < 8; ++i)
+               src << "    if (index == " << i << ") b" << i << ".words[x] = (x << 3) | " << i << ";\n";
+       src << "  }\n";
+
+       src << "  barrier();\n";
+       src << "  if (index != 0) return;\n";
+
+       src << "  int r = size;\n";
+       src << "  for (int x = 0; x < size; x++) {\n";
+       src << "    int expected = (x << 3) | (x % 8);\n";
+       src << "    if (b0.words[x] == expected) r--;\n";
+       src << "  }\n";
+       src << "  result = r;\n";
+       src << "}\n";
+
+       sourceCollections.glslSources.add("comp")
+               << ComputeSource(src.str())
+               << vk::ShaderBuildOptions(sourceCollections.usedVulkanVersion, vk::SPIRV_VERSION_1_4,
+                                                                 vk::ShaderBuildOptions::Flags(0u));
+}
+
+void AddSizeTests(tcu::TestCaseGroup* group)
+{
+       deUint32 sizes[] =
+       {
+               8u,
+               64u,
+               4096u,
+
+               // Dynamic generation of shaders based on properties reported
+               // by devices is not allowed in the CTS, so let's create a few
+               // variants based on common known maximum sizes.
+               16384u,
+               32768u,
+               49152u,
+               65536u,
+       };
+
+       for (deUint32 i = 0; i < DE_LENGTH_OF_ARRAY(sizes); ++i)
+               group->addChild(new SizeTest(group->getTestContext(), sizes[i]));
+}
+
 } // anonymous
 
 tcu::TestCaseGroup* createWorkgroupMemoryExplicitLayoutTests(tcu::TestContext& testCtx)
@@ -1229,6 +1341,10 @@ tcu::TestCaseGroup* createWorkgroupMemoryExplicitLayoutTests(tcu::TestContext& t
        AddPaddingTests(padding);
        tests->addChild(padding);
 
+       tcu::TestCaseGroup* size = new tcu::TestCaseGroup(testCtx, "size", "Test blocks of various sizes");
+       AddSizeTests(size);
+       tests->addChild(size);
+
        return tests.release();
 }
 
index 5245ab3..55498d3 100644 (file)
@@ -521465,6 +521465,13 @@ dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_27_uint8_t_28
 dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_28_uint8_t_29
 dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_29_uint8_t_30
 dEQP-VK.compute.workgroup_memory_explicit_layout.padding.uint8_t_30_uint8_t_31
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.8
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.64
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.4096
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.16384
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.32768
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.49152
+dEQP-VK.compute.workgroup_memory_explicit_layout.size.65536
 dEQP-VK.image.store.with_format.1d.r32g32b32a32_sfloat
 dEQP-VK.image.store.with_format.1d.r16g16b16a16_sfloat
 dEQP-VK.image.store.with_format.1d.r32_sfloat