virtual void compile(SL::Compiler &) = 0;
SL::Features create_features() const;
+
+public:
+ virtual void set_debug_name(const std::string &) { }
};
/**
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;
};
std::vector<Variable> variables;
std::vector<Constant> spec_constants;
std::vector<InstructionBlock> blocks;
+ bool specializable = false;
public:
virtual Format get_format() const { return SPIR_V; }
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; }
+ bool is_specializable() const { return specializable; }
+
+ /** 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;
+
+public:
+ void set_debug_name(const std::string &n) { SpirVModuleBackend::set_debug_name(n); }
};
} // namespace GL