aboutsummaryrefslogtreecommitdiff
path: root/source/opt/spread_volatile_semantics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/opt/spread_volatile_semantics.cpp')
-rw-r--r--source/opt/spread_volatile_semantics.cpp99
1 files changed, 48 insertions, 51 deletions
diff --git a/source/opt/spread_volatile_semantics.cpp b/source/opt/spread_volatile_semantics.cpp
index 3037274d..b61fd0f4 100644
--- a/source/opt/spread_volatile_semantics.cpp
+++ b/source/opt/spread_volatile_semantics.cpp
@@ -21,32 +21,32 @@
namespace spvtools {
namespace opt {
namespace {
-constexpr uint32_t kOpDecorateInOperandBuiltinDecoration = 2u;
-constexpr uint32_t kOpLoadInOperandMemoryOperands = 1u;
-constexpr uint32_t kOpEntryPointInOperandEntryPoint = 1u;
-constexpr uint32_t kOpEntryPointInOperandInterface = 3u;
+
+const uint32_t kOpDecorateInOperandBuiltinDecoration = 2u;
+const uint32_t kOpLoadInOperandMemoryOperands = 1u;
+const uint32_t kOpEntryPointInOperandEntryPoint = 1u;
+const uint32_t kOpEntryPointInOperandInterface = 3u;
bool HasBuiltinDecoration(analysis::DecorationManager* decoration_manager,
uint32_t var_id, uint32_t built_in) {
return decoration_manager->FindDecoration(
- var_id, uint32_t(spv::Decoration::BuiltIn),
- [built_in](const Instruction& inst) {
+ var_id, SpvDecorationBuiltIn, [built_in](const Instruction& inst) {
return built_in == inst.GetSingleWordInOperand(
kOpDecorateInOperandBuiltinDecoration);
});
}
-bool IsBuiltInForRayTracingVolatileSemantics(spv::BuiltIn built_in) {
+bool IsBuiltInForRayTracingVolatileSemantics(uint32_t built_in) {
switch (built_in) {
- case spv::BuiltIn::SMIDNV:
- case spv::BuiltIn::WarpIDNV:
- case spv::BuiltIn::SubgroupSize:
- case spv::BuiltIn::SubgroupLocalInvocationId:
- case spv::BuiltIn::SubgroupEqMask:
- case spv::BuiltIn::SubgroupGeMask:
- case spv::BuiltIn::SubgroupGtMask:
- case spv::BuiltIn::SubgroupLeMask:
- case spv::BuiltIn::SubgroupLtMask:
+ case SpvBuiltInSMIDNV:
+ case SpvBuiltInWarpIDNV:
+ case SpvBuiltInSubgroupSize:
+ case SpvBuiltInSubgroupLocalInvocationId:
+ case SpvBuiltInSubgroupEqMask:
+ case SpvBuiltInSubgroupGeMask:
+ case SpvBuiltInSubgroupGtMask:
+ case SpvBuiltInSubgroupLeMask:
+ case SpvBuiltInSubgroupLtMask:
return true;
default:
return false;
@@ -56,17 +56,16 @@ bool IsBuiltInForRayTracingVolatileSemantics(spv::BuiltIn built_in) {
bool HasBuiltinForRayTracingVolatileSemantics(
analysis::DecorationManager* decoration_manager, uint32_t var_id) {
return decoration_manager->FindDecoration(
- var_id, uint32_t(spv::Decoration::BuiltIn), [](const Instruction& inst) {
- spv::BuiltIn built_in = spv::BuiltIn(
- inst.GetSingleWordInOperand(kOpDecorateInOperandBuiltinDecoration));
+ var_id, SpvDecorationBuiltIn, [](const Instruction& inst) {
+ uint32_t built_in =
+ inst.GetSingleWordInOperand(kOpDecorateInOperandBuiltinDecoration);
return IsBuiltInForRayTracingVolatileSemantics(built_in);
});
}
bool HasVolatileDecoration(analysis::DecorationManager* decoration_manager,
uint32_t var_id) {
- return decoration_manager->HasDecoration(var_id,
- uint32_t(spv::Decoration::Volatile));
+ return decoration_manager->HasDecoration(var_id, SpvDecorationVolatile);
}
} // namespace
@@ -77,7 +76,7 @@ Pass::Status SpreadVolatileSemantics::Process() {
}
const bool is_vk_memory_model_enabled =
context()->get_feature_mgr()->HasCapability(
- spv::Capability::VulkanMemoryModel);
+ SpvCapabilityVulkanMemoryModel);
CollectTargetsForVolatileSemantics(is_vk_memory_model_enabled);
// If VulkanMemoryModel capability is not enabled, we have to set Volatile
@@ -129,16 +128,15 @@ bool SpreadVolatileSemantics::IsTargetUsedByNonVolatileLoadInEntryPoint(
}
uint32_t memory_operands =
load->GetSingleWordInOperand(kOpLoadInOperandMemoryOperands);
- return (memory_operands & uint32_t(spv::MemoryAccessMask::Volatile)) !=
- 0;
+ return (memory_operands & SpvMemoryAccessVolatileMask) != 0;
},
funcs);
}
bool SpreadVolatileSemantics::HasInterfaceInConflictOfVolatileSemantics() {
for (Instruction& entry_point : get_module()->entry_points()) {
- spv::ExecutionModel execution_model =
- static_cast<spv::ExecutionModel>(entry_point.GetSingleWordInOperand(0));
+ SpvExecutionModel execution_model =
+ static_cast<SpvExecutionModel>(entry_point.GetSingleWordInOperand(0));
for (uint32_t operand_index = kOpEntryPointInOperandInterface;
operand_index < entry_point.NumInOperands(); ++operand_index) {
uint32_t var_id = entry_point.GetSingleWordInOperand(operand_index);
@@ -172,8 +170,8 @@ void SpreadVolatileSemantics::MarkVolatileSemanticsForVariable(
void SpreadVolatileSemantics::CollectTargetsForVolatileSemantics(
const bool is_vk_memory_model_enabled) {
for (Instruction& entry_point : get_module()->entry_points()) {
- spv::ExecutionModel execution_model =
- static_cast<spv::ExecutionModel>(entry_point.GetSingleWordInOperand(0));
+ SpvExecutionModel execution_model =
+ static_cast<SpvExecutionModel>(entry_point.GetSingleWordInOperand(0));
for (uint32_t operand_index = kOpEntryPointInOperandInterface;
operand_index < entry_point.NumInOperands(); ++operand_index) {
uint32_t var_id = entry_point.GetSingleWordInOperand(operand_index);
@@ -196,10 +194,9 @@ void SpreadVolatileSemantics::DecorateVarWithVolatile(Instruction* var) {
return;
}
get_decoration_mgr()->AddDecoration(
- spv::Op::OpDecorate,
- {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {var_id}},
- {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER,
- {uint32_t(spv::Decoration::Volatile)}}});
+ SpvOpDecorate, {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {var_id}},
+ {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER,
+ {SpvDecorationVolatile}}});
}
bool SpreadVolatileSemantics::VisitLoadsOfPointersToVariableInEntries(
@@ -220,17 +217,17 @@ bool SpreadVolatileSemantics::VisitLoadsOfPointersToVariableInEntries(
return true;
}
- if (user->opcode() == spv::Op::OpAccessChain ||
- user->opcode() == spv::Op::OpInBoundsAccessChain ||
- user->opcode() == spv::Op::OpPtrAccessChain ||
- user->opcode() == spv::Op::OpInBoundsPtrAccessChain ||
- user->opcode() == spv::Op::OpCopyObject) {
+ if (user->opcode() == SpvOpAccessChain ||
+ user->opcode() == SpvOpInBoundsAccessChain ||
+ user->opcode() == SpvOpPtrAccessChain ||
+ user->opcode() == SpvOpInBoundsPtrAccessChain ||
+ user->opcode() == SpvOpCopyObject) {
if (ptr_id == user->GetSingleWordInOperand(0))
worklist.push_back(user->result_id());
return true;
}
- if (user->opcode() != spv::Op::OpLoad) {
+ if (user->opcode() != SpvOpLoad) {
return true;
}
@@ -253,12 +250,12 @@ void SpreadVolatileSemantics::SetVolatileForLoadsInEntries(
[](Instruction* load) {
if (load->NumInOperands() <= kOpLoadInOperandMemoryOperands) {
load->AddOperand({SPV_OPERAND_TYPE_MEMORY_ACCESS,
- {uint32_t(spv::MemoryAccessMask::Volatile)}});
+ {SpvMemoryAccessVolatileMask}});
return true;
}
uint32_t memory_operands =
load->GetSingleWordInOperand(kOpLoadInOperandMemoryOperands);
- memory_operands |= uint32_t(spv::MemoryAccessMask::Volatile);
+ memory_operands |= SpvMemoryAccessVolatileMask;
load->SetInOperand(kOpLoadInOperandMemoryOperands, {memory_operands});
return true;
},
@@ -267,29 +264,29 @@ void SpreadVolatileSemantics::SetVolatileForLoadsInEntries(
}
bool SpreadVolatileSemantics::IsTargetForVolatileSemantics(
- uint32_t var_id, spv::ExecutionModel execution_model) {
+ uint32_t var_id, SpvExecutionModel execution_model) {
analysis::DecorationManager* decoration_manager =
context()->get_decoration_mgr();
- if (execution_model == spv::ExecutionModel::Fragment) {
+ if (execution_model == SpvExecutionModelFragment) {
return get_module()->version() >= SPV_SPIRV_VERSION_WORD(1, 6) &&
HasBuiltinDecoration(decoration_manager, var_id,
- uint32_t(spv::BuiltIn::HelperInvocation));
+ SpvBuiltInHelperInvocation);
}
- if (execution_model == spv::ExecutionModel::IntersectionKHR ||
- execution_model == spv::ExecutionModel::IntersectionNV) {
+ if (execution_model == SpvExecutionModelIntersectionKHR ||
+ execution_model == SpvExecutionModelIntersectionNV) {
if (HasBuiltinDecoration(decoration_manager, var_id,
- uint32_t(spv::BuiltIn::RayTmaxKHR))) {
+ SpvBuiltInRayTmaxKHR)) {
return true;
}
}
switch (execution_model) {
- case spv::ExecutionModel::RayGenerationKHR:
- case spv::ExecutionModel::ClosestHitKHR:
- case spv::ExecutionModel::MissKHR:
- case spv::ExecutionModel::CallableKHR:
- case spv::ExecutionModel::IntersectionKHR:
+ case SpvExecutionModelRayGenerationKHR:
+ case SpvExecutionModelClosestHitKHR:
+ case SpvExecutionModelMissKHR:
+ case SpvExecutionModelCallableKHR:
+ case SpvExecutionModelIntersectionKHR:
return HasBuiltinForRayTracingVolatileSemantics(decoration_manager,
var_id);
default: