| 19 | class NegativeSubgroup : public VkLayerTest {}; |
| 20 | |
| 21 | TEST_F(NegativeSubgroup, Properties) { |
| 22 | TEST_DESCRIPTION( |
| 23 | "Test shader validation support for subgroup VkPhysicalDeviceSubgroupProperties such as supportedStages, and " |
| 24 | "supportedOperations, quadOperationsInAllStages."); |
| 25 | |
| 26 | SetTargetApiVersion(VK_API_VERSION_1_1); |
| 27 | AddRequiredFeature(vkt::Feature::vertexPipelineStoresAndAtomics); |
| 28 | RETURN_IF_SKIP(Init()); |
| 29 | |
| 30 | // Don't enable the extension on purpose |
| 31 | const bool extension_support_partitioned = |
| 32 | DeviceExtensionSupported(Gpu(), nullptr, VK_NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME); |
| 33 | InitRenderTarget(); |
| 34 | |
| 35 | // Gather all aspects supported |
| 36 | VkPhysicalDeviceSubgroupProperties subgroup_prop = vku::InitStructHelper(); |
| 37 | GetPhysicalDeviceProperties2(subgroup_prop); |
| 38 | VkSubgroupFeatureFlags subgroup_operations = subgroup_prop.supportedOperations; |
| 39 | const bool feature_support_basic = ((subgroup_operations & VK_SUBGROUP_FEATURE_BASIC_BIT) != 0); |
| 40 | const bool feature_support_vote = ((subgroup_operations & VK_SUBGROUP_FEATURE_VOTE_BIT) != 0); |
| 41 | const bool feature_support_arithmetic = ((subgroup_operations & VK_SUBGROUP_FEATURE_ARITHMETIC_BIT) != 0); |
| 42 | const bool feature_support_ballot = ((subgroup_operations & VK_SUBGROUP_FEATURE_BALLOT_BIT) != 0); |
| 43 | const bool feature_support_shuffle = ((subgroup_operations & VK_SUBGROUP_FEATURE_SHUFFLE_BIT) != 0); |
| 44 | const bool feature_support_relative = ((subgroup_operations & VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT) != 0); |
| 45 | const bool feature_support_culstered = ((subgroup_operations & VK_SUBGROUP_FEATURE_CLUSTERED_BIT) != 0); |
| 46 | const bool feature_support_quad = ((subgroup_operations & VK_SUBGROUP_FEATURE_QUAD_BIT) != 0); |
| 47 | const bool feature_support_partitioned = ((subgroup_operations & VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV) != 0); |
| 48 | const bool vertex_support = ((subgroup_prop.supportedStages & VK_SHADER_STAGE_VERTEX_BIT) != 0); |
| 49 | const bool vertex_quad_support = (subgroup_prop.quadOperationsInAllStages == VK_TRUE); |
| 50 | |
| 51 | if (!feature_support_basic) { |
| 52 | GTEST_SKIP() << "VK_SUBGROUP_FEATURE_BASIC_BIT not supported, all test will have issues"; |
| 53 | } |
| 54 | |
| 55 | std::string vsSource; |
| 56 | std::vector<const char*> errors; |
| 57 | // There is no 'supportedOperations' check due to it would be redundant to the Capability check done first in VUID 01091 since |
| 58 | // each 'supportedOperations' flag is 1:1 map to a SPIR-V Capability |
| 59 | const char* operation_vuid = "VUID-VkShaderModuleCreateInfo-pCode-08740"; |
| 60 | const char* stage_vuid = "VUID-RuntimeSpirv-None-06343"; |
| 61 | const char* quad_vuid = "VUID-RuntimeSpirv-None-06342"; |
| 62 | |
| 63 | // Same pipeline creation for each subgroup test |
| 64 | auto subgroup_test = [this](std::string source, const std::vector<const char*>& errors) { |
| 65 | for (const auto& error : errors) m_errorMonitor->SetDesiredError(error); |
| 66 | VkShaderObj vs(*m_device, source.c_str(), VK_SHADER_STAGE_VERTEX_BIT, SPV_ENV_VULKAN_1_1); |
| 67 | if (!errors.empty()) { |
| 68 | m_errorMonitor->VerifyFound(); |
| 69 | } |
| 70 | }; |
| 71 | |
| 72 | // Basic |
| 73 | { |
| 74 | vsSource = R"glsl( |
| 75 | #version 450 |
| 76 | #extension GL_KHR_shader_subgroup_basic: enable |
| 77 | layout(set = 0, binding = 0) buffer StorageBuffer { float x; uint y; } ssbo; |
| 78 | void main(){ |
nothing calls this directly
no test coverage detected