221
221
// Vulkan Specific rules
222
222
if (spvIsVulkanEnv(_.context()->target_env)) {
223
if (value == SpvScopeCrossDevice) {
224
return _.diag(SPV_ERROR_INVALID_DATA, inst)
225
<< _.VkErrorID(4638) << spvOpcodeString(opcode)
226
<< ": in Vulkan environment, Memory Scope cannot be CrossDevice";
228
// Vulkan 1.0 specific rules
229
if (_.context()->target_env == SPV_ENV_VULKAN_1_0 &&
230
value != SpvScopeDevice && value != SpvScopeWorkgroup &&
231
value != SpvScopeInvocation) {
232
return _.diag(SPV_ERROR_INVALID_DATA, inst)
233
<< _.VkErrorID(4638) << spvOpcodeString(opcode)
234
<< ": in Vulkan 1.0 environment Memory Scope is limited to "
235
<< "Device, Workgroup and Invocation";
237
// Vulkan 1.1 specific rules
238
if ((_.context()->target_env == SPV_ENV_VULKAN_1_1 ||
239
_.context()->target_env == SPV_ENV_VULKAN_1_2) &&
240
value != SpvScopeDevice && value != SpvScopeWorkgroup &&
223
if (value != SpvScopeDevice && value != SpvScopeWorkgroup &&
241
224
value != SpvScopeSubgroup && value != SpvScopeInvocation &&
242
value != SpvScopeShaderCallKHR) {
225
value != SpvScopeShaderCallKHR && value != SpvScopeQueueFamily) {
243
226
return _.diag(SPV_ERROR_INVALID_DATA, inst)
244
227
<< _.VkErrorID(4638) << spvOpcodeString(opcode)
245
<< ": in Vulkan 1.1 and 1.2 environment Memory Scope is limited "
246
<< "to Device, Workgroup, Invocation, and ShaderCall";
228
<< ": in Vulkan environment Memory Scope is limited to Device, "
229
"QueueFamily, Workgroup, ShaderCallKHR, Subgroup, or "
231
} else if (_.context()->target_env == SPV_ENV_VULKAN_1_0 &&
232
value == SpvScopeSubgroup &&
233
!_.HasCapability(SpvCapabilitySubgroupBallotKHR) &&
234
!_.HasCapability(SpvCapabilitySubgroupVoteKHR)) {
235
return _.diag(SPV_ERROR_INVALID_DATA, inst)
236
<< _.VkErrorID(6997) << spvOpcodeString(opcode)
237
<< ": in Vulkan 1.0 environment Memory Scope is can not be "
238
"Subgroup without SubgroupBallotKHR or SubgroupVoteKHR "
249
242
if (value == SpvScopeShaderCallKHR) {