]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.h
Check the flat qualifier from the correct member
[libs/gl.git] / source / glsl / spirv.h
index 1e7ec370d92249b073b2b53d2299d6b96460147a..e98fd91e7142ec0fecabd8850c76557071c5ea06 100644 (file)
@@ -1,5 +1,5 @@
-#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>
@@ -30,7 +30,8 @@ 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<Id> &);
        };
 
@@ -48,6 +49,7 @@ private:
                unsigned detail;
 
                TypeKey(Id i, unsigned d): type_id(i), detail(d) { }
+               TypeKey(BasicTypeDeclaration::Kind, bool);
 
                bool operator<(const TypeKey &) const;
        };
@@ -62,13 +64,15 @@ private:
                };
 
                ConstantKey(Id t, int i): type_id(t), int_value(i) { }
+               ConstantKey(Id t, unsigned u): type_id(t), int_value(u) { }
                ConstantKey(Id t, float f): type_id(t), float_value(f) { }
 
                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;
@@ -76,47 +80,52 @@ private:
        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<TypeKey, Id> pointer_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 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 allocate_id(Node &, Id);
+       Id allocate_forward_id(Node &);
        Id write_constant(Id, Word, bool);
        static ConstantKey get_constant_key(Id, const Variant &value);
        Id get_constant_id(Id, const Variant &value);
        Id get_vector_constant_id(Id, unsigned, Id);
-       Id get_standard_type_id(BasicTypeDeclaration::Kind, unsigned);
+       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 &);
@@ -131,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 &);
@@ -142,10 +150,12 @@ private:
        virtual void visit(Assignment &);
        virtual void visit(TernaryExpression &);
        virtual void visit(FunctionCall &);
-       void visit_constructor(FunctionCall &, const std::vector<Id> &);
+       void visit_constructor(FunctionCall &, const std::vector<Id> &, bool);
        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 &);
@@ -155,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 &);