struct TypeDeclaration;
struct VariableDeclaration;
-struct InterfaceBlock;
struct FunctionDeclaration;
struct Statement: Node
virtual void visit(NodeVisitor &);
};
-struct InterfaceBlockReference: Expression
-{
- std::string name;
-
- InterfaceBlock *declaration = 0;
-
- InterfaceBlockReference() = default;
- InterfaceBlockReference(const InterfaceBlockReference &);
-
- virtual InterfaceBlockReference *clone() const { return new InterfaceBlockReference(*this); }
- virtual void visit(NodeVisitor &);
-};
-
struct MemberAccess: Expression
{
NodePtr<Expression> left;
struct StructDeclaration: TypeDeclaration
{
Block members;
+ std::string block_name;
bool extended_alignment = false;
- InterfaceBlock *interface_block = 0;
+ VariableDeclaration *block_declaration = 0;
StructDeclaration();
StructDeclaration(const StructDeclaration &);
- ~StructDeclaration();
virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
virtual void visit(NodeVisitor &);
NodePtr<Expression> init_expression;
TypeDeclaration *type_declaration = 0;
+ StructDeclaration *block_declaration = 0;
VariableDeclaration *linked_declaration = 0;
VariableDeclaration() = default;
virtual void visit(NodeVisitor &);
};
-struct InterfaceBlock: Statement
-{
- NodePtr<Layout> layout;
- std::string interface;
- std::string block_name;
- NodePtr<Block> members;
- std::string instance_name;
- bool array = false;
-
- /* An interface block's ultimate base type is always a struct. The
- immediate type may be either that same struct or an array of it. */
- TypeDeclaration *type_declaration = 0;
- StructDeclaration *struct_declaration = 0;
- InterfaceBlock *linked_block = 0;
-
- InterfaceBlock() = default;
- InterfaceBlock(const InterfaceBlock &);
- ~InterfaceBlock();
-
- virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
- virtual void visit(NodeVisitor &);
-};
-
struct FunctionDeclaration: Statement
{
std::string return_type;
Stage *previous = 0;
Block content;
std::map<std::string, TypeDeclaration *> types;
- std::map<std::string, InterfaceBlock *> interface_blocks;
+ std::map<std::string, VariableDeclaration *> interface_blocks;
std::map<std::string, FunctionDeclaration *> functions;
std::map<std::string, unsigned> locations;
std::map<std::string, unsigned> texture_bindings;
};
std::string get_unused_variable_name(const Block &, const std::string &);
-const TypeDeclaration *get_ultimate_base_type(const TypeDeclaration *);
+TypeDeclaration *get_ultimate_base_type(TypeDeclaration *);
bool has_layout_qualifier(const Layout *, const std::string &);
int get_layout_value(const Layout *, const std::string &, int = -1);
void add_layout_qualifier(RefPtr<Layout> &, const Layout::Qualifier &);