X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fglsl%2Fast.h;h=455cb8113cda9c5bba86ad7e3ca99ea1bf3621cd;hb=6e3265eae533a1bff4f23a4508c5d8e9ab23164d;hp=06c7b032a791830d2dc7151f6e770511dc8bc7a5;hpb=4c863993780a11cea6f88fa0682796bee5794042;p=mesa.git diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h index 06c7b032a79..455cb8113cd 100644 --- a/src/compiler/glsl/ast.h +++ b/src/compiler/glsl/ast.h @@ -22,7 +22,6 @@ * DEALINGS IN THE SOFTWARE. */ -#pragma once #ifndef AST_H #define AST_H @@ -49,7 +48,7 @@ struct YYLTYPE; */ 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 @@ -195,9 +194,20 @@ enum ast_operators { 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) }; /** @@ -246,6 +256,8 @@ public: unsigned uint_constant; int bool_constant; double double_constant; + uint64_t uint64_constant; + int64_t int64_constant; } primary_expression; @@ -346,8 +358,8 @@ public: 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; @@ -368,8 +380,7 @@ public: bool process_qualifier_constant(struct _mesa_glsl_parse_state *state, const char *qual_indentifier, - unsigned *value, bool can_be_zero, - bool must_match = false); + unsigned *value, bool can_be_zero); void merge_qualifier(ast_layout_expression *l_expr) { @@ -416,15 +427,6 @@ public: 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: @@ -460,6 +462,14 @@ enum { 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); @@ -525,10 +535,7 @@ struct 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 */ @@ -553,6 +560,11 @@ struct ast_type_qualifier { */ 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; @@ -594,8 +606,22 @@ struct ast_type_qualifier { /** \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; } /** \brief Set of flags, accessed by name. */ q; @@ -607,6 +633,9 @@ struct ast_type_qualifier { /** 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 */ @@ -685,7 +714,7 @@ struct ast_type_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; @@ -715,9 +744,6 @@ struct ast_type_qualifier { */ 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. */ @@ -738,25 +764,58 @@ struct ast_type_qualifier { */ 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; }; @@ -765,7 +824,7 @@ class ast_declarator_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; @@ -1129,6 +1188,7 @@ public: 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;