Validate that VertexId and InstanceId are not allowed in Vulkan. (#2036)

The Vulkan specification does not permit use of the VertexId and
InstanceId BuiltIn decorations, so add a check to ensure they are not
being used when the target environment is Vulkan.
This commit is contained in:
Neil Henning 2018-11-13 14:22:49 +00:00 committed by alan-baker
parent f343a15764
commit 2b1f6b373c
2 changed files with 26 additions and 1 deletions

View File

@ -167,6 +167,8 @@ class BuiltInsValidator {
const Instruction& inst);
spv_result_t ValidateVertexIndexAtDefinition(const Decoration& decoration,
const Instruction& inst);
spv_result_t ValidateVertexIdOrInstanceIdAtDefinition(
const Instruction& inst);
spv_result_t ValidateWorkgroupSizeAtDefinition(const Decoration& decoration,
const Instruction& inst);
// Used for GlobalInvocationId, LocalInvocationId, NumWorkgroups, WorkgroupId.
@ -2085,6 +2087,17 @@ spv_result_t BuiltInsValidator::ValidateVertexIndexAtDefinition(
return ValidateVertexIndexAtReference(decoration, inst, inst, inst);
}
spv_result_t BuiltInsValidator::ValidateVertexIdOrInstanceIdAtDefinition(
const Instruction& inst) {
if (spvIsVulkanEnv(_.context()->target_env)) {
return _.diag(SPV_ERROR_INVALID_DATA, &inst)
<< "Vulkan spec doesn't allow BuiltIn VertexId/InstanceId "
"to be used.";
}
return SPV_SUCCESS;
}
spv_result_t BuiltInsValidator::ValidateVertexIndexAtReference(
const Decoration& decoration, const Instruction& built_in_inst,
const Instruction& referenced_inst,
@ -2441,7 +2454,9 @@ spv_result_t BuiltInsValidator::ValidateSingleBuiltInAtDefinition(
return ValidateWorkgroupSizeAtDefinition(decoration, inst);
}
case SpvBuiltInVertexId:
case SpvBuiltInInstanceId:
case SpvBuiltInInstanceId: {
return ValidateVertexIdOrInstanceIdAtDefinition(inst);
}
case SpvBuiltInLocalInvocationIndex:
case SpvBuiltInWorkDim:
case SpvBuiltInGlobalSize:

View File

@ -446,6 +446,16 @@ INSTANTIATE_TEST_CASE_P(
"execution model is Fragment.",
"which is called with execution model Fragment."))), );
INSTANTIATE_TEST_CASE_P(
VertexIdAndInstanceIdVertexInput,
ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
Combine(Values("VertexId", "InstanceId"), Values("Vertex"), Values("Input"),
Values("%u32"),
Values(TestResult(
SPV_ERROR_INVALID_DATA,
"Vulkan spec doesn't allow BuiltIn VertexId/InstanceId to be "
"used."))), );
INSTANTIATE_TEST_CASE_P(
ClipAndCullDistanceVertexInput,
ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,