aboutsummaryrefslogtreecommitdiff
path: root/source/val/validate_scopes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/val/validate_scopes.cpp')
-rw-r--r--source/val/validate_scopes.cpp149
1 files changed, 72 insertions, 77 deletions
diff --git a/source/val/validate_scopes.cpp b/source/val/validate_scopes.cpp
index fa1dad9e..e9781802 100644
--- a/source/val/validate_scopes.cpp
+++ b/source/val/validate_scopes.cpp
@@ -25,16 +25,16 @@ namespace val {
bool IsValidScope(uint32_t scope) {
// Deliberately avoid a default case so we have to update the list when the
// scopes list changes.
- switch (static_cast<spv::Scope>(scope)) {
- case spv::Scope::CrossDevice:
- case spv::Scope::Device:
- case spv::Scope::Workgroup:
- case spv::Scope::Subgroup:
- case spv::Scope::Invocation:
- case spv::Scope::QueueFamilyKHR:
- case spv::Scope::ShaderCallKHR:
+ switch (static_cast<SpvScope>(scope)) {
+ case SpvScopeCrossDevice:
+ case SpvScopeDevice:
+ case SpvScopeWorkgroup:
+ case SpvScopeSubgroup:
+ case SpvScopeInvocation:
+ case SpvScopeQueueFamilyKHR:
+ case SpvScopeShaderCallKHR:
return true;
- case spv::Scope::Max:
+ case SpvScopeMax:
break;
}
return false;
@@ -42,7 +42,7 @@ bool IsValidScope(uint32_t scope) {
spv_result_t ValidateScope(ValidationState_t& _, const Instruction* inst,
uint32_t scope) {
- spv::Op opcode = inst->opcode();
+ SpvOp opcode = inst->opcode();
bool is_int32 = false, is_const_int32 = false;
uint32_t value = 0;
std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(scope);
@@ -53,14 +53,14 @@ spv_result_t ValidateScope(ValidationState_t& _, const Instruction* inst,
}
if (!is_const_int32) {
- if (_.HasCapability(spv::Capability::Shader) &&
- !_.HasCapability(spv::Capability::CooperativeMatrixNV)) {
+ if (_.HasCapability(SpvCapabilityShader) &&
+ !_.HasCapability(SpvCapabilityCooperativeMatrixNV)) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< "Scope ids must be OpConstant when Shader capability is "
<< "present";
}
- if (_.HasCapability(spv::Capability::Shader) &&
- _.HasCapability(spv::Capability::CooperativeMatrixNV) &&
+ if (_.HasCapability(SpvCapabilityShader) &&
+ _.HasCapability(SpvCapabilityCooperativeMatrixNV) &&
!spvOpcodeIsConstant(_.GetIdOpcode(scope))) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< "Scope ids must be constant or specialization constant when "
@@ -78,10 +78,10 @@ spv_result_t ValidateScope(ValidationState_t& _, const Instruction* inst,
spv_result_t ValidateExecutionScope(ValidationState_t& _,
const Instruction* inst, uint32_t scope) {
- spv::Op opcode = inst->opcode();
+ SpvOp opcode = inst->opcode();
bool is_int32 = false, is_const_int32 = false;
- uint32_t tmp_value = 0;
- std::tie(is_int32, is_const_int32, tmp_value) = _.EvalInt32IfConst(scope);
+ uint32_t value = 0;
+ std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(scope);
if (auto error = ValidateScope(_, inst, scope)) {
return error;
@@ -91,15 +91,13 @@ spv_result_t ValidateExecutionScope(ValidationState_t& _,
return SPV_SUCCESS;
}
- spv::Scope value = spv::Scope(tmp_value);
-
// Vulkan specific rules
if (spvIsVulkanEnv(_.context()->target_env)) {
// Vulkan 1.1 specific rules
if (_.context()->target_env != SPV_ENV_VULKAN_1_0) {
// Scope for Non Uniform Group Operations must be limited to Subgroup
if (spvOpcodeIsNonUniformGroupOperation(opcode) &&
- value != spv::Scope::Subgroup) {
+ value != SpvScopeSubgroup) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< _.VkErrorID(4642) << spvOpcodeString(opcode)
<< ": in Vulkan environment Execution scope is limited to "
@@ -109,21 +107,21 @@ spv_result_t ValidateExecutionScope(ValidationState_t& _,
// OpControlBarrier must only use Subgroup execution scope for a subset of
// execution models.
- if (opcode == spv::Op::OpControlBarrier && value != spv::Scope::Subgroup) {
+ if (opcode == SpvOpControlBarrier && value != SpvScopeSubgroup) {
std::string errorVUID = _.VkErrorID(4682);
_.function(inst->function()->id())
->RegisterExecutionModelLimitation([errorVUID](
- spv::ExecutionModel model,
+ SpvExecutionModel model,
std::string* message) {
- if (model == spv::ExecutionModel::Fragment ||
- model == spv::ExecutionModel::Vertex ||
- model == spv::ExecutionModel::Geometry ||
- model == spv::ExecutionModel::TessellationEvaluation ||
- model == spv::ExecutionModel::RayGenerationKHR ||
- model == spv::ExecutionModel::IntersectionKHR ||
- model == spv::ExecutionModel::AnyHitKHR ||
- model == spv::ExecutionModel::ClosestHitKHR ||
- model == spv::ExecutionModel::MissKHR) {
+ if (model == SpvExecutionModelFragment ||
+ model == SpvExecutionModelVertex ||
+ model == SpvExecutionModelGeometry ||
+ model == SpvExecutionModelTessellationEvaluation ||
+ model == SpvExecutionModelRayGenerationKHR ||
+ model == SpvExecutionModelIntersectionKHR ||
+ model == SpvExecutionModelAnyHitKHR ||
+ model == SpvExecutionModelClosestHitKHR ||
+ model == SpvExecutionModelMissKHR) {
if (message) {
*message =
errorVUID +
@@ -139,17 +137,17 @@ spv_result_t ValidateExecutionScope(ValidationState_t& _,
}
// Only subset of execution models support Workgroup.
- if (value == spv::Scope::Workgroup) {
+ if (value == SpvScopeWorkgroup) {
std::string errorVUID = _.VkErrorID(4637);
_.function(inst->function()->id())
->RegisterExecutionModelLimitation(
- [errorVUID](spv::ExecutionModel model, std::string* message) {
- if (model != spv::ExecutionModel::TaskNV &&
- model != spv::ExecutionModel::MeshNV &&
- model != spv::ExecutionModel::TaskEXT &&
- model != spv::ExecutionModel::MeshEXT &&
- model != spv::ExecutionModel::TessellationControl &&
- model != spv::ExecutionModel::GLCompute) {
+ [errorVUID](SpvExecutionModel model, std::string* message) {
+ if (model != SpvExecutionModelTaskNV &&
+ model != SpvExecutionModelMeshNV &&
+ model != SpvExecutionModelTaskEXT &&
+ model != SpvExecutionModelMeshEXT &&
+ model != SpvExecutionModelTessellationControl &&
+ model != SpvExecutionModelGLCompute) {
if (message) {
*message =
errorVUID +
@@ -165,7 +163,7 @@ spv_result_t ValidateExecutionScope(ValidationState_t& _,
// Vulkan generic rules
// Scope for execution must be limited to Workgroup or Subgroup
- if (value != spv::Scope::Workgroup && value != spv::Scope::Subgroup) {
+ if (value != SpvScopeWorkgroup && value != SpvScopeSubgroup) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< _.VkErrorID(4636) << spvOpcodeString(opcode)
<< ": in Vulkan environment Execution Scope is limited to "
@@ -179,7 +177,7 @@ spv_result_t ValidateExecutionScope(ValidationState_t& _,
// Scope for execution must be limited to Workgroup or Subgroup for
// non-uniform operations
if (spvOpcodeIsNonUniformGroupOperation(opcode) &&
- value != spv::Scope::Subgroup && value != spv::Scope::Workgroup) {
+ value != SpvScopeSubgroup && value != SpvScopeWorkgroup) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< spvOpcodeString(opcode)
<< ": Execution scope is limited to Subgroup or Workgroup";
@@ -190,10 +188,10 @@ spv_result_t ValidateExecutionScope(ValidationState_t& _,
spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst,
uint32_t scope) {
- const spv::Op opcode = inst->opcode();
+ const SpvOp opcode = inst->opcode();
bool is_int32 = false, is_const_int32 = false;
- uint32_t tmp_value = 0;
- std::tie(is_int32, is_const_int32, tmp_value) = _.EvalInt32IfConst(scope);
+ uint32_t value = 0;
+ std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(scope);
if (auto error = ValidateScope(_, inst, scope)) {
return error;
@@ -203,10 +201,8 @@ spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst,
return SPV_SUCCESS;
}
- spv::Scope value = spv::Scope(tmp_value);
-
- if (value == spv::Scope::QueueFamilyKHR) {
- if (_.HasCapability(spv::Capability::VulkanMemoryModelKHR)) {
+ if (value == SpvScopeQueueFamilyKHR) {
+ if (_.HasCapability(SpvCapabilityVulkanMemoryModelKHR)) {
return SPV_SUCCESS;
} else {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
@@ -216,9 +212,9 @@ spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst,
}
}
- if (value == spv::Scope::Device &&
- _.HasCapability(spv::Capability::VulkanMemoryModelKHR) &&
- !_.HasCapability(spv::Capability::VulkanMemoryModelDeviceScopeKHR)) {
+ if (value == SpvScopeDevice &&
+ _.HasCapability(SpvCapabilityVulkanMemoryModelKHR) &&
+ !_.HasCapability(SpvCapabilityVulkanMemoryModelDeviceScopeKHR)) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< "Use of device scope with VulkanKHR memory model requires the "
<< "VulkanMemoryModelDeviceScopeKHR capability";
@@ -226,19 +222,18 @@ spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst,
// Vulkan Specific rules
if (spvIsVulkanEnv(_.context()->target_env)) {
- if (value != spv::Scope::Device && value != spv::Scope::Workgroup &&
- value != spv::Scope::Subgroup && value != spv::Scope::Invocation &&
- value != spv::Scope::ShaderCallKHR &&
- value != spv::Scope::QueueFamily) {
+ if (value != SpvScopeDevice && value != SpvScopeWorkgroup &&
+ value != SpvScopeSubgroup && value != SpvScopeInvocation &&
+ value != SpvScopeShaderCallKHR && value != SpvScopeQueueFamily) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< _.VkErrorID(4638) << spvOpcodeString(opcode)
<< ": in Vulkan environment Memory Scope is limited to Device, "
"QueueFamily, Workgroup, ShaderCallKHR, Subgroup, or "
"Invocation";
} else if (_.context()->target_env == SPV_ENV_VULKAN_1_0 &&
- value == spv::Scope::Subgroup &&
- !_.HasCapability(spv::Capability::SubgroupBallotKHR) &&
- !_.HasCapability(spv::Capability::SubgroupVoteKHR)) {
+ value == SpvScopeSubgroup &&
+ !_.HasCapability(SpvCapabilitySubgroupBallotKHR) &&
+ !_.HasCapability(SpvCapabilitySubgroupVoteKHR)) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< _.VkErrorID(6997) << spvOpcodeString(opcode)
<< ": in Vulkan 1.0 environment Memory Scope is can not be "
@@ -246,17 +241,17 @@ spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst,
"declared";
}
- if (value == spv::Scope::ShaderCallKHR) {
+ if (value == SpvScopeShaderCallKHR) {
std::string errorVUID = _.VkErrorID(4640);
_.function(inst->function()->id())
->RegisterExecutionModelLimitation(
- [errorVUID](spv::ExecutionModel model, std::string* message) {
- if (model != spv::ExecutionModel::RayGenerationKHR &&
- model != spv::ExecutionModel::IntersectionKHR &&
- model != spv::ExecutionModel::AnyHitKHR &&
- model != spv::ExecutionModel::ClosestHitKHR &&
- model != spv::ExecutionModel::MissKHR &&
- model != spv::ExecutionModel::CallableKHR) {
+ [errorVUID](SpvExecutionModel model, std::string* message) {
+ if (model != SpvExecutionModelRayGenerationKHR &&
+ model != SpvExecutionModelIntersectionKHR &&
+ model != SpvExecutionModelAnyHitKHR &&
+ model != SpvExecutionModelClosestHitKHR &&
+ model != SpvExecutionModelMissKHR &&
+ model != SpvExecutionModelCallableKHR) {
if (message) {
*message =
errorVUID +
@@ -269,17 +264,17 @@ spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst,
});
}
- if (value == spv::Scope::Workgroup) {
+ if (value == SpvScopeWorkgroup) {
std::string errorVUID = _.VkErrorID(7321);
_.function(inst->function()->id())
->RegisterExecutionModelLimitation(
- [errorVUID](spv::ExecutionModel model, std::string* message) {
- if (model != spv::ExecutionModel::GLCompute &&
- model != spv::ExecutionModel::TessellationControl &&
- model != spv::ExecutionModel::TaskNV &&
- model != spv::ExecutionModel::MeshNV &&
- model != spv::ExecutionModel::TaskEXT &&
- model != spv::ExecutionModel::MeshEXT) {
+ [errorVUID](SpvExecutionModel model, std::string* message) {
+ if (model != SpvExecutionModelGLCompute &&
+ model != SpvExecutionModelTessellationControl &&
+ model != SpvExecutionModelTaskNV &&
+ model != SpvExecutionModelMeshNV &&
+ model != SpvExecutionModelTaskEXT &&
+ model != SpvExecutionModelMeshEXT) {
if (message) {
*message = errorVUID +
"Workgroup Memory Scope is limited to MeshNV, "
@@ -291,12 +286,12 @@ spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst,
return true;
});
- if (_.memory_model() == spv::MemoryModel::GLSL450) {
+ if (_.memory_model() == SpvMemoryModelGLSL450) {
errorVUID = _.VkErrorID(7320);
_.function(inst->function()->id())
->RegisterExecutionModelLimitation(
- [errorVUID](spv::ExecutionModel model, std::string* message) {
- if (model == spv::ExecutionModel::TessellationControl) {
+ [errorVUID](SpvExecutionModel model, std::string* message) {
+ if (model == SpvExecutionModelTessellationControl) {
if (message) {
*message =
errorVUID +