* DEALINGS IN THE SOFTWARE.
*/
-#pragma once
#ifndef AST_H
#define AST_H
*/
class ast_node {
public:
- DECLARE_RALLOC_CXX_OPERATORS(ast_node);
+ DECLARE_LINEAR_ZALLOC_CXX_OPERATORS(ast_node);
/**
* Print an AST node in something approximating the original GLSL code
exec_node link;
+ virtual void set_is_lhs(bool);
+
protected:
/**
* The only constructor is protected so that only derived class objects can
ast_float_constant,
ast_bool_constant,
ast_double_constant,
+ ast_int64_constant,
+ ast_uint64_constant,
ast_sequence,
ast_aggregate
+
+ /**
+ * Number of possible operators for an ast_expression
+ *
+ * This is done as a define instead of as an additional value in the enum so
+ * that the compiler won't generate spurious messages like "warning:
+ * enumeration value ‘ast_num_operators’ not handled in switch"
+ */
+ #define AST_NUM_OPERATORS (ast_aggregate + 1)
};
/**
unsigned uint_constant;
int bool_constant;
double double_constant;
+ uint64_t uint64_constant;
+ int64_t int64_constant;
} primary_expression;
bool is_single_dimension() const
{
- return this->array_dimensions.tail_pred->prev != NULL &&
- this->array_dimensions.tail_pred->prev->is_head_sentinel();
+ return this->array_dimensions.get_tail_raw()->prev != NULL &&
+ this->array_dimensions.get_tail_raw()->prev->is_head_sentinel();
}
virtual void print(void) const;
struct _mesa_glsl_parse_state *state);
};
-/**
- * Number of possible operators for an ast_expression
- *
- * This is done as a define instead of as an additional value in the enum so
- * that the compiler won't generate spurious messages like "warning:
- * enumeration value ‘ast_num_operators’ not handled in switch"
- */
-#define AST_NUM_OPERATORS (ast_sequence + 1)
-
class ast_compound_statement : public ast_node {
public:
ast_precision_low
};
+enum {
+ ast_depth_none = 0, /**< Absence of depth qualifier. */
+ ast_depth_any,
+ ast_depth_greater,
+ ast_depth_less,
+ ast_depth_unchanged
+};
+
struct ast_type_qualifier {
DECLARE_RALLOC_CXX_OPERATORS(ast_type_qualifier);
/** \name Layout qualifiers for GL_AMD_conservative_depth */
/** \{ */
- unsigned depth_any:1;
- unsigned depth_greater:1;
- unsigned depth_less:1;
- unsigned depth_unchanged:1;
+ unsigned depth_type:1;
/** \} */
/** \name Layout qualifiers for GL_ARB_uniform_buffer_object */
*/
unsigned local_size:3;
+ /** \name Layout qualifiers for ARB_compute_variable_group_size. */
+ /** \{ */
+ unsigned local_size_variable:1;
+ /** \} */
+
/** \name Layout and memory qualifiers for ARB_shader_image_load_store. */
/** \{ */
unsigned early_fragment_tests:1;
/** \name Qualifiers for GL_ARB_shader_subroutine */
/** \{ */
unsigned subroutine:1; /**< Is this marked 'subroutine' */
- unsigned subroutine_def:1; /**< Is this marked 'subroutine' with a list of types */
/** \} */
+
+ /** \name Qualifiers for GL_KHR_blend_equation_advanced */
+ /** \{ */
+ unsigned blend_support:1; /**< Are there any blend_support_ qualifiers */
+ /** \} */
+
+ /**
+ * Flag set if GL_ARB_post_depth_coverage layout qualifier is used.
+ */
+ unsigned post_depth_coverage:1;
+ /**
+ * Flag set if GL_INTEL_conservartive_rasterization layout qualifier
+ * is used.
+ */
+ unsigned inner_coverage:1;
+
+ /** \name Layout qualifiers for GL_ARB_bindless_texture */
+ /** \{ */
+ unsigned bindless_sampler:1;
+ unsigned bindless_image:1;
+ unsigned bound_sampler:1;
+ unsigned bound_image:1;
+ /** \} */
}
/** \brief Set of flags, accessed by name. */
q;
/** Precision of the type (highp/medium/lowp). */
unsigned precision:2;
+ /** Type of layout qualifiers for GL_AMD_conservative_depth. */
+ unsigned depth_type:3;
+
/**
* Alignment specified via GL_ARB_enhanced_layouts "align" layout qualifier
*/
ast_layout_expression *local_size[3];
/** Tessellation evaluation shader: vertex spacing (equal, fractional even/odd) */
- GLenum vertex_spacing;
+ enum gl_tess_spacing vertex_spacing;
/** Tessellation evaluation shader: vertex ordering (CW or CCW) */
GLenum ordering;
*/
glsl_base_type image_base_type;
- /** Flag to know if this represents a default value for a qualifier */
- bool is_default_qualifier;
-
/**
* Return true if and only if an interpolation qualifier is present.
*/
*/
bool has_auxiliary_storage() const;
+ /**
+ * Return true if and only if a memory qualifier is present.
+ */
+ bool has_memory() const;
+
+ /**
+ * Return true if the qualifier is a subroutine declaration.
+ */
+ bool is_subroutine_decl() const;
+
bool merge_qualifier(YYLTYPE *loc,
_mesa_glsl_parse_state *state,
const ast_type_qualifier &q,
- bool is_single_layout_merge);
+ bool is_single_layout_merge,
+ bool is_multiple_layouts_merge = false);
- bool merge_out_qualifier(YYLTYPE *loc,
- _mesa_glsl_parse_state *state,
- const ast_type_qualifier &q,
- ast_node* &node, bool create_node);
+ /**
+ * Validate current qualifier against the global out one.
+ */
+ bool validate_out_qualifier(YYLTYPE *loc,
+ _mesa_glsl_parse_state *state);
- bool merge_in_qualifier(YYLTYPE *loc,
- _mesa_glsl_parse_state *state,
- const ast_type_qualifier &q,
- ast_node* &node, bool create_node);
+ /**
+ * Merge current qualifier into the global out one.
+ */
+ bool merge_into_out_qualifier(YYLTYPE *loc,
+ _mesa_glsl_parse_state *state,
+ ast_node* &node);
+
+ /**
+ * Validate current qualifier against the global in one.
+ */
+ bool validate_in_qualifier(YYLTYPE *loc,
+ _mesa_glsl_parse_state *state);
+
+ /**
+ * Merge current qualifier into the global in one.
+ */
+ bool merge_into_in_qualifier(YYLTYPE *loc,
+ _mesa_glsl_parse_state *state,
+ ast_node* &node);
+
+ /**
+ * Push pending layout qualifiers to the global values.
+ */
+ bool push_to_global(YYLTYPE *loc,
+ _mesa_glsl_parse_state *state);
bool validate_flags(YYLTYPE *loc,
_mesa_glsl_parse_state *state,
- const char *message,
- const ast_type_qualifier &allowed_flags);
+ const ast_type_qualifier &allowed_flags,
+ const char *message, const char *name);
ast_subroutine_list *subroutine_list;
};
class ast_struct_specifier : public ast_node {
public:
- ast_struct_specifier(const char *identifier,
+ ast_struct_specifier(void *lin_ctx, const char *identifier,
ast_declarator_list *declarator_list);
virtual void print(void) const;
/* List of ast_declarator_list * */
exec_list declarations;
bool is_declaration;
+ const glsl_type *type;
};
virtual ir_rvalue *hir(exec_list *instructions,
struct _mesa_glsl_parse_state *state);
+ ast_type_qualifier default_layout;
ast_type_qualifier layout;
const char *block_name;