struct EntryPoint
{
std::string name;
+ unsigned id = 0;
Stage stage = VERTEX;
std::vector<const Variable *> globals;
};
struct Structure
{
std::string name;
- std::vector<StructMember> members;
+ unsigned id = 0;
unsigned size = 0;
+ std::vector<StructMember> members;
};
struct Variable
{
std::string name;
- StorageClass storage = static_cast<StorageClass>(-1);
+ unsigned id = 0;
DataType type = VOID;
const Structure *struct_type = 0;
+ StorageClass storage = static_cast<StorageClass>(-1);
unsigned array_size = 0;
int location = -1;
unsigned descriptor_set = 0;
struct Constant
{
std::string name;
+ unsigned id = 0;
int constant_id = -1;
DataType type = VOID;
union
struct InstructionBlock
{
- const Constant *condition = 0;
+ unsigned id = 0;
bool negate_condition = false;
+ const Constant *condition = 0;
std::vector<const Variable *> accessed_variables;
std::vector<const InstructionBlock *> successors;
};
const std::vector<Variable> &get_variables() const { return variables; }
const std::vector<Constant> &get_spec_constants() const { return spec_constants; }
const std::vector<InstructionBlock> &get_blocks() const { return blocks; }
+
+ /** Creates a new module which is a specialized version of this one. */
+ SpirVModule *specialize(const std::map<std::string, int> &) const;
+
+private:
+ std::vector<const InstructionBlock *> collect_visited_blocks(const std::map<unsigned, int> &) const;
+ void collect_visited_blocks(unsigned, std::vector<std::uint8_t> &) const;
};
} // namespace GL