X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fspirv.h;h=23def508d719d6ba23296f4d50da59d730e0d264;hp=d680ee3c8a76e01d8e244aadc1307fbccd457aa9;hb=HEAD;hpb=b466adff89db080c304ac3178ce1f4fef844cb28 diff --git a/source/glsl/spirv.h b/source/glsl/spirv.h index d680ee3c..e98fd91e 100644 --- a/source/glsl/spirv.h +++ b/source/glsl/spirv.h @@ -30,7 +30,7 @@ private: 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 &); }; @@ -70,8 +70,9 @@ private: bool operator<(const ConstantKey &) const; }; - Stage *stage; - FunctionDeclaration *current_function; + Features features; + Stage *stage = 0; + FunctionDeclaration *current_function = 0; std::vector interface_layouts; SpirVContent content; SpirVWriter writer; @@ -79,6 +80,7 @@ private: std::map imported_extension_ids; std::map declared_ids; std::map declared_uniform_ids; + std::map declared_spec_ids; std::map standard_type_ids; std::map image_type_ids; std::map array_type_ids; @@ -86,31 +88,32 @@ private: std::map function_type_ids; std::map constant_ids; std::map 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 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 &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; @@ -122,7 +125,7 @@ private: 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 &); @@ -137,7 +140,6 @@ private: 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 &); @@ -152,7 +154,8 @@ private: void visit_builtin_matrix_comp_mult(FunctionCall &, const std::vector &); void visit_builtin_texture_query(FunctionCall &, const std::vector &); void visit_builtin_texture(FunctionCall &, const std::vector &); - void visit_builtin_texel_fetch(FunctionCall &, const std::vector &); + void visit_builtin_texture_fetch(FunctionCall &, const std::vector &); + void visit_builtin_texture_store(FunctionCall &, const std::vector &); void visit_builtin_interpolate(FunctionCall &, const std::vector &); virtual void visit(ExpressionStatement &); virtual void visit(InterfaceLayout &); @@ -162,7 +165,6 @@ private: 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 &);