spv_capability_mask_t RequiredCapabilities(const AssemblyGrammar& grammar,
spv_operand_type_t type,
uint32_t operand) {
+ spv_capability_mask_t result = 0;
spv_operand_desc operand_desc;
- if (SPV_SUCCESS == grammar.lookupOperand(type, operand, &operand_desc))
- return operand_desc->capabilities;
- else
- return 0;
+
+ if (SPV_SUCCESS == grammar.lookupOperand(type, operand, &operand_desc)) {
+ result = operand_desc->capabilities;
+
+ // There's disagreement about whether mere mention of ClipDistance and
+ // CullDistance implies a requirement to declare their associated
+ // capabilities. Until the dust settles, turn off those checks.
+ // See https://github.com/KhronosGroup/SPIRV-Tools/issues/261
+ // TODO(dneto): Once the final decision is made, fix this in a more
+ // permanent way, e.g. by generating Vulkan-specific operand tables that
+ // eliminate this capability dependency.
+ if (type == SPV_OPERAND_TYPE_BUILT_IN &&
+ grammar.target_env() == SPV_ENV_VULKAN_1_0) {
+ result = result & (~(SPV_CAPABILITY_AS_MASK(SpvCapabilityClipDistance) |
+ SPV_CAPABILITY_AS_MASK(SpvCapabilityCullDistance)));
+ }
+ }
+
+ return result;
}
} // namespace
// Always assembles using v1.1.
using ValidateCapabilityV11 = spvtest::ValidateBase<CapTestParameter>;
+// Always assembles using Vulkan 1.0.
+// TODO(dneto): Refactor all these tests to scale better across environments.
+using ValidateCapabilityVulkan10 = spvtest::ValidateBase<CapTestParameter>;
+
TEST_F(ValidateCapability, Default) {
const char str[] = R"(
OpCapability Kernel
"%intt = OpTypeInt 32 1\n", ShaderDependencies())
)),);
+// There's disagreement about whether mere mention of ClipDistance and
+// CullDistance implies a requirement to declare their associated capabilities.
+// Until the dust settles, turn off those checks.
+// See https://github.com/KhronosGroup/SPIRV-Tools/issues/261
+INSTANTIATE_TEST_CASE_P(BuiltIn, ValidateCapabilityVulkan10,
+ Combine(
+ // Vulkan 1.0 is based on SPIR-V 1.0
+ ValuesIn(AllV10Capabilities()),
+ Values(
+make_pair(string(kGLSL450MemoryModel) +
+ "OpDecorate %intt BuiltIn ClipDistance\n"
+ "%intt = OpTypeInt 32 1\n", AllV10Capabilities()),
+make_pair(string(kGLSL450MemoryModel) +
+ "OpDecorate %intt BuiltIn CullDistance\n"
+ "%intt = OpTypeInt 32 1\n", AllV10Capabilities())
+)),);
+
// TODO(umar): Selection Control
// TODO(umar): Loop Control
// TODO(umar): Function Control
capability.size(), &dummy);
}
+
+
TEST_P(ValidateCapability, Capability) {
const string capability = Capability(GetParam());
spv_target_env env =
<< test_code;
}
+TEST_P(ValidateCapabilityVulkan10, Capability) {
+ const string test_code = MakeAssembly(GetParam());
+ std::cout << test_code << std::endl;
+ CompileSuccessfully(test_code, SPV_ENV_VULKAN_1_0);
+ ASSERT_EQ(ExpectedResult(GetParam()),
+ ValidateInstructions(SPV_ENV_VULKAN_1_0))
+ << test_code;
+}
+
TEST_F(ValidateCapability, SemanticsIdIsAnIdNotALiteral) {
// From https://github.com/KhronosGroup/SPIRV-Tools/issues/248
// The validator was interpreting the memory semantics ID number