mirror of
https://github.com/yuzu-emu/sirit
synced 2024-11-22 12:13:34 +00:00
Add support for forward declarations
This commit is contained in:
parent
c374bfd9fd
commit
f819ade0ef
2 changed files with 19 additions and 0 deletions
|
@ -35,6 +35,10 @@ struct Id {
|
||||||
std::uint32_t value;
|
std::uint32_t value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[[nodiscard]] inline bool ValidId(Id id) noexcept {
|
||||||
|
return id.value != 0;
|
||||||
|
}
|
||||||
|
|
||||||
class Module {
|
class Module {
|
||||||
public:
|
public:
|
||||||
explicit Module(std::uint32_t version = spv::Version);
|
explicit Module(std::uint32_t version = spv::Version);
|
||||||
|
@ -83,6 +87,12 @@ public:
|
||||||
AddExecutionMode(entry_point, mode, std::span<const Literal>({literals...}));
|
AddExecutionMode(entry_point, mode, std::span<const Literal>({literals...}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Generate a new id for forward declarations
|
||||||
|
[[nodiscard]] Id ForwardDeclarationId();
|
||||||
|
|
||||||
|
/// Assign a new id and return the old one, useful for defining forward declarations
|
||||||
|
Id ExchangeCurrentId(Id new_current_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an existing label to the code
|
* Adds an existing label to the code
|
||||||
* @param label Label to insert into code.
|
* @param label Label to insert into code.
|
||||||
|
|
|
@ -95,6 +95,15 @@ void Module::AddExecutionMode(Id entry_point, spv::ExecutionMode mode,
|
||||||
*execution_modes << spv::Op::OpExecutionMode << entry_point << mode << literals << EndOp{};
|
*execution_modes << spv::Op::OpExecutionMode << entry_point << mode << literals << EndOp{};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Id Module::ForwardDeclarationId() {
|
||||||
|
return Id{++bound};
|
||||||
|
}
|
||||||
|
|
||||||
|
Id Module::ExchangeCurrentId(Id new_current_id) {
|
||||||
|
const std::uint32_t old_id = std::exchange(bound, new_current_id.value - 1);
|
||||||
|
return Id{old_id + 1};
|
||||||
|
}
|
||||||
|
|
||||||
Id Module::AddLabel(Id label) {
|
Id Module::AddLabel(Id label) {
|
||||||
assert(label.value != 0);
|
assert(label.value != 0);
|
||||||
code->Reserve(2);
|
code->Reserve(2);
|
||||||
|
|
Loading…
Reference in a new issue