-#ifndef MSP_GL_SL_SPIRV
-#define MSP_GL_SL_SPIRV
+#ifndef MSP_GL_SL_SPIRV_H_
+#define MSP_GL_SL_SPIRV_H_
#include <map>
#include <string>
char arg_types[5];
char extension[13];
Word opcode;
- UInt8 arg_order[4];
+ std::uint8_t arg_order[4];
Word capability;
void (SpirVGenerator::*handler)(FunctionCall &, const std::vector<Id> &);
};
bool operator<(const ConstantKey &) const;
};
- Stage *stage;
- FunctionDeclaration *current_function;
+ Features features;
+ Stage *stage = 0;
+ FunctionDeclaration *current_function = 0;
std::vector<const InterfaceLayout *> interface_layouts;
SpirVContent content;
SpirVWriter writer;
std::map<std::string, Id> imported_extension_ids;
std::map<Node *, Declaration> declared_ids;
std::map<std::string, Id> declared_uniform_ids;
+ std::map<unsigned, Id> declared_spec_ids;
std::map<TypeKey, Id> standard_type_ids;
std::map<Id, Id> image_type_ids;
std::map<TypeKey, Id> array_type_ids;
std::map<std::string, Id> function_type_ids;
std::map<ConstantKey, Id> constant_ids;
std::map<const VariableDeclaration *, Id> variable_load_ids;
- Id next_id;
- Id r_expression_result_id;
- bool r_constant_result;
- bool constant_expression;
- bool spec_constant;
- bool reachable;
- bool composite_access;
- Id r_composite_base_id;
- Node *r_composite_base;
+ Id next_id = 1;
+ Id r_expression_result_id = 0;
+ bool r_constant_result = false;
+ bool constant_expression = false;
+ bool spec_constant = false;
+ bool reachable = false;
+ bool composite_access = false;
+ Id r_composite_base_id = 0;
+ Node *r_composite_base = 0;
std::vector<unsigned> r_composite_chain;
- Id assignment_source_id;
- Id loop_merge_block_id;
- Id loop_continue_target_id;
+ Id assignment_source_id = 0;
+ Id loop_merge_block_id = 0;
+ Id loop_continue_target_id = 0;
static const BuiltinFunctionInfo builtin_functions[];
public:
SpirVGenerator();
- void apply(Module &);
+ void apply(Module &, const Features &);
const std::vector<Word> &get_code() const { return content.code; }
private:
static StorageClass get_interface_storage(const std::string &, bool);
static SpirVBuiltin get_builtin_semantic(const std::string &);
+ static SpirVFormat get_format(const std::string &);
void use_capability(Capability);
Id import_extension(const std::string &);
Id get_id(Node &) const;
Id get_vector_constant_id(Id, unsigned, Id);
Id get_standard_type_id(BasicTypeDeclaration::Kind, unsigned, bool = true);
bool is_scalar_type(Id, BasicTypeDeclaration::Kind) const;
- Id get_array_type_id(TypeDeclaration &, unsigned);
+ Id get_array_type_id(TypeDeclaration &, Id, bool);
Id get_pointer_type_id(Id, StorageClass);
Id get_variable_type_id(const VariableDeclaration &);
Id get_load_id(VariableDeclaration &);
virtual void visit(Block &);
virtual void visit(Literal &);
virtual void visit(VariableReference &);
- virtual void visit(InterfaceBlockReference &);
void generate_composite_access(TypeDeclaration &);
void visit_composite(Expression &, unsigned, TypeDeclaration &);
void visit_isolated(Expression &);
void visit_builtin_matrix_comp_mult(FunctionCall &, const std::vector<Id> &);
void visit_builtin_texture_query(FunctionCall &, const std::vector<Id> &);
void visit_builtin_texture(FunctionCall &, const std::vector<Id> &);
- void visit_builtin_texel_fetch(FunctionCall &, const std::vector<Id> &);
+ void visit_builtin_texture_fetch(FunctionCall &, const std::vector<Id> &);
+ void visit_builtin_texture_store(FunctionCall &, const std::vector<Id> &);
void visit_builtin_interpolate(FunctionCall &, const std::vector<Id> &);
virtual void visit(ExpressionStatement &);
virtual void visit(InterfaceLayout &);
virtual void visit(ImageTypeDeclaration &);
virtual void visit(StructDeclaration &);
virtual void visit(VariableDeclaration &);
- virtual void visit(InterfaceBlock &);
void visit_entry_point(FunctionDeclaration &, Id);
virtual void visit(FunctionDeclaration &);
virtual void visit(Conditional &);