Fixes capability checks in subgroup tests
Components: Vulkan
VK-GL-CTS Issue: 2517
Affects:
dEQP-VK.subgroups.vote.*
dEQP-VK.subgroups.vote.frag_helper.*
Change-Id: I49832e7fe34eddbc655ca4d5d7e155d311685c8a
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
index c6fd9b5..7d57e5a 100644
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
@@ -1337,6 +1337,47 @@
return features.shaderTessellationAndGeometryPointSize ? true : false;
}
+bool vkt::subgroups::is16BitUBOStorageSupported(Context& context) {
+ VkPhysicalDevice16BitStorageFeatures storage16bit;
+ deMemset(&storage16bit, 0, sizeof(storage16bit));
+ storage16bit.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR;
+ storage16bit.pNext = DE_NULL;
+
+ VkPhysicalDeviceFeatures2 features2;
+ deMemset(&features2, 0, sizeof(features2));
+ features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+ features2.pNext = &storage16bit;
+
+ const PlatformInterface& platformInterface = context.getPlatformInterface();
+ const VkInstance instance = context.getInstance();
+ const InstanceDriver instanceDriver(platformInterface, instance);
+
+ instanceDriver.getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &features2);
+ return bool(storage16bit.uniformAndStorageBuffer16BitAccess);
+}
+
+
+bool vkt::subgroups::is8BitUBOStorageSupported(Context& context) {
+
+ VkPhysicalDevice8BitStorageFeatures storage8bit;
+ deMemset(&storage8bit, 0, sizeof(storage8bit));
+ storage8bit.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR;
+ storage8bit.pNext = DE_NULL;
+
+ VkPhysicalDeviceFeatures2 features2;
+ deMemset(&features2, 0, sizeof(features2));
+ features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+ features2.pNext = &storage8bit;
+
+
+ const PlatformInterface& platformInterface = context.getPlatformInterface();
+ const VkInstance instance = context.getInstance();
+ const InstanceDriver instanceDriver(platformInterface, instance);
+
+ instanceDriver.getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &features2);
+ return bool(storage8bit.uniformAndStorageBuffer8BitAccess);
+}
+
bool vkt::subgroups::isFormatSupportedForDevice(Context& context, vk::VkFormat format)
{
VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures subgroupExtendedTypesFeatures;
@@ -1722,6 +1763,46 @@
}
}
+bool vkt::subgroups::isFormat8bitTy(VkFormat format)
+{
+ switch (format)
+ {
+ default:
+ return false;
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R8_UINT:
+ case VK_FORMAT_R8G8_UINT:
+ case VK_FORMAT_R8G8B8_UINT:
+ case VK_FORMAT_R8G8B8A8_UINT:
+ return true;
+ }
+}
+
+bool vkt::subgroups::isFormat16BitTy(VkFormat format)
+{
+ switch (format)
+ {
+ default:
+ return false;
+ case VK_FORMAT_R16_SFLOAT:
+ case VK_FORMAT_R16G16_SFLOAT:
+ case VK_FORMAT_R16G16B16_SFLOAT:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R16_UINT:
+ case VK_FORMAT_R16G16_UINT:
+ case VK_FORMAT_R16G16B16_UINT:
+ case VK_FORMAT_R16G16B16A16_UINT:
+ return true;
+ }
+}
+
void vkt::subgroups::setVertexShaderFrameBuffer (SourceCollections& programCollection)
{
/*
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
index 45dc7ae..2637c18 100644
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
@@ -141,6 +141,10 @@
bool isTessellationAndGeometryPointSizeSupported(Context& context);
+bool is16BitUBOStorageSupported(Context& context);
+
+bool is8BitUBOStorageSupported(Context& context);
+
bool isSubgroupBroadcastDynamicIdSupported(Context& context);
std::string getFormatNameForGLSL (vk::VkFormat format);
@@ -152,6 +156,8 @@
bool isFormatSigned (vk::VkFormat format);
bool isFormatUnsigned (vk::VkFormat format);
bool isFormatFloat (vk::VkFormat format);
+bool isFormat8bitTy(vk::VkFormat format);
+bool isFormat16BitTy(vk::VkFormat format);
void addGeometryShadersFromTemplate (const std::string& glslTemplate, const vk::ShaderBuildOptions& options, vk::GlslSourceCollection& collection);
void addGeometryShadersFromTemplate (const std::string& spirvTemplate, const vk::SpirVAsmBuildOptions& options, vk::SpirVAsmCollection& collection);
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
index feaa42f..17134df 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
@@ -116,6 +116,8 @@
VkShaderStageFlags shaderStage;
VkFormat format;
de::SharedPtr<bool> geometryPointSizeSupported;
+ deBool requires8BitUniformBuffer;
+ deBool requires16BitUniformBuffer;
};
bool fmtIsBoolean(VkFormat format)
@@ -617,6 +619,22 @@
if (!subgroups::isFormatSupportedForDevice(context, caseDef.format))
TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
+ if (caseDef.requires16BitUniformBuffer)
+ {
+ if (!subgroups::is16BitUBOStorageSupported(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
+ }
+ }
+
+ if (caseDef.requires8BitUniformBuffer)
+ {
+ if (!subgroups::is8BitUBOStorageSupported(context))
+ {
+ TCU_THROW(NotSupportedError, "Device does not support the specified format in subgroup operations");
+ }
+ }
+
if (caseDef.opType > OPTYPE_LAST_NON_ARB)
{
context.requireDeviceFunctionality("VK_EXT_shader_subgroup_vote");
@@ -795,7 +813,7 @@
const std::string op = de::toLower(getOpTypeName(opTypeIndex));
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format, de::SharedPtr<bool>(new bool)};
+ const CaseDefinition caseDef = { opTypeIndex, VK_SHADER_STAGE_COMPUTE_BIT, format, de::SharedPtr<bool>(new bool),deBool(false),deBool(false) };
if (opTypeIndex < OPTYPE_LAST_NON_ARB)
{
addFunctionCaseWithPrograms(computeGroup.get(),
@@ -811,7 +829,7 @@
}
{
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format, de::SharedPtr<bool>(new bool)};
+ const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_ALL_GRAPHICS, format, de::SharedPtr<bool>(new bool),deBool(false),deBool(false) };
if (opTypeIndex < OPTYPE_LAST_NON_ARB)
{
addFunctionCaseWithPrograms(graphicGroup.get(),
@@ -828,7 +846,7 @@
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
- const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format, de::SharedPtr<bool>(new bool)};
+ const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format, de::SharedPtr<bool>(new bool),deBool(false),deBool(false) };
if (opTypeIndex < OPTYPE_LAST_NON_ARB)
{
addFunctionCaseWithPrograms(framebufferGroup.get(),
@@ -846,8 +864,9 @@
supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef);
}
}
-
- const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_FRAGMENT_BIT, format, de::SharedPtr<bool>(new bool)};
+ bool needs8BitUBOStorage = isFormat8bitTy(format);
+ bool needs16BitUBOStorage = isFormat16BitTy(format);
+ const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_FRAGMENT_BIT, format, de::SharedPtr<bool>(new bool),deBool(needs8BitUBOStorage),deBool(needs16BitUBOStorage) };
if (opTypeIndex < OPTYPE_LAST_NON_ARB)
{
addFunctionCaseWithPrograms(fragHelperGroup.get(),