diff options
Diffstat (limited to 'source/val/validate_scopes.cpp')
-rw-r--r-- | source/val/validate_scopes.cpp | 149 |
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 + |