X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fglsl%2Fast.h;h=3a960c2ff327306b924657ffdad22569fc07e5aa;hb=HEAD;hp=55f9a6c2e5aeb6168047e14ed542e81d4d921d59;hpb=a4a93103fb8f5c21c4cd17e89f07badfab14c0ab;p=mesa.git diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h index 55f9a6c2e5a..3a960c2ff32 100644 --- a/src/compiler/glsl/ast.h +++ b/src/compiler/glsl/ast.h @@ -22,12 +22,13 @@ * DEALINGS IN THE SOFTWARE. */ -#pragma once #ifndef AST_H #define AST_H #include "list.h" #include "glsl_parser_extras.h" +#include "compiler/glsl_types.h" +#include "util/bitset.h" struct _mesa_glsl_parse_state; @@ -76,6 +77,7 @@ public: { struct YYLTYPE locp; + locp.path = this->location.path; locp.source = this->location.source; locp.first_line = this->location.first_line; locp.first_column = this->location.first_column; @@ -92,6 +94,7 @@ public: */ void set_location(const struct YYLTYPE &locp) { + this->location.path = locp.path; this->location.source = locp.source; this->location.first_line = locp.first_line; this->location.first_column = locp.first_column; @@ -106,6 +109,7 @@ public: */ void set_location_range(const struct YYLTYPE &begin, const struct YYLTYPE &end) { + this->location.path = begin.path; this->location.source = begin.source; this->location.first_line = begin.first_line; this->location.last_line = end.last_line; @@ -117,6 +121,7 @@ public: * Source location of the AST node. */ struct { + char *path; /**< GLSL shader include path. */ unsigned source; /**< GLSL source number. */ unsigned first_line; /**< First line number within the source string. */ unsigned first_column; /**< First column in the first line. */ @@ -195,6 +200,8 @@ enum ast_operators { ast_float_constant, ast_bool_constant, ast_double_constant, + ast_int64_constant, + ast_uint64_constant, ast_sequence, ast_aggregate @@ -255,6 +262,8 @@ public: unsigned uint_constant; int bool_constant; double double_constant; + uint64_t uint64_constant; + int64_t int64_constant; } primary_expression; @@ -377,8 +386,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) { @@ -460,10 +468,25 @@ 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); + /* Note: this bitset needs to have at least as many bits as the 'q' + * struct has flags, below. Previously, the size was 128 instead of 96. + * But an apparent bug in GCC 5.4.0 causes bad SSE code generation + * elsewhere, leading to a crash. 96 bits works around the issue. + * See https://bugs.freedesktop.org/show_bug.cgi?id=105497 + */ + DECLARE_BITSET_T(bitset_t, 96); - union { + union flags { struct { unsigned invariant:1; unsigned precise:1; @@ -525,10 +548,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 */ @@ -599,24 +619,70 @@ 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; + + /** + * Flags for the layout qualifers added by ARB_fragment_shader_interlock + */ + + unsigned pixel_interlock_ordered:1; + unsigned pixel_interlock_unordered:1; + unsigned sample_interlock_ordered:1; + unsigned sample_interlock_unordered: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; + /** \} */ + + /** \name Layout qualifiers for GL_EXT_shader_framebuffer_fetch_non_coherent */ + /** \{ */ + unsigned non_coherent:1; + /** \} */ + + /** \name Layout qualifiers for NV_compute_shader_derivatives */ + /** \{ */ + unsigned derivative_group:1; + /** \} */ + + /** + * Flag set if GL_NV_viewport_array2 viewport_relative layout + * qualifier is used. + */ + unsigned viewport_relative:1; } /** \brief Set of flags, accessed by name. */ q; /** \brief Set of flags, accessed as a bitmask. */ - uint64_t i; + bitset_t i; } flags; /** 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 */ @@ -695,7 +761,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; @@ -713,7 +779,13 @@ struct ast_type_qualifier { * \note * This field is only valid if \c explicit_image_format is set. */ - GLenum image_format; + enum pipe_format image_format; + + /** + * Arrangement of invocations used to calculate derivatives in a compute + * shader. From NV_compute_shader_derivatives. + */ + enum gl_derivative_group derivative_group; /** * Base type of the data read from or written to this image. Only @@ -725,9 +797,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. */ @@ -748,20 +817,53 @@ 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); + + /** + * Validate current qualifier against the global out one. + */ + bool validate_out_qualifier(YYLTYPE *loc, + _mesa_glsl_parse_state *state); - bool merge_out_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); - bool merge_in_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 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, @@ -775,8 +877,8 @@ class ast_declarator_list; class ast_struct_specifier : public ast_node { public: - ast_struct_specifier(void *lin_ctx, const char *identifier, - ast_declarator_list *declarator_list); + ast_struct_specifier(const char *identifier, + ast_declarator_list *declarator_list); virtual void print(void) const; virtual ir_rvalue *hir(exec_list *instructions, @@ -787,6 +889,7 @@ public: /* List of ast_declarator_list * */ exec_list declarations; bool is_declaration; + const glsl_type *type; }; @@ -795,7 +898,7 @@ class ast_type_specifier : public ast_node { public: /** Construct a type specifier from a type name */ ast_type_specifier(const char *name) - : type_name(name), structure(NULL), array_specifier(NULL), + : type(NULL), type_name(name), structure(NULL), array_specifier(NULL), default_precision(ast_precision_none) { /* empty */ @@ -803,12 +906,19 @@ public: /** Construct a type specifier from a structure definition */ ast_type_specifier(ast_struct_specifier *s) - : type_name(s->name), structure(s), array_specifier(NULL), + : type(NULL), type_name(s->name), structure(s), array_specifier(NULL), default_precision(ast_precision_none) { /* empty */ } + ast_type_specifier(const glsl_type *t) + : type(t), type_name(t->name), structure(NULL), array_specifier(NULL), + default_precision(ast_precision_none) + { + /* empty */ + } + const struct glsl_type *glsl_type(const char **name, struct _mesa_glsl_parse_state *state) const; @@ -817,6 +927,7 @@ public: ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *); + const struct glsl_type *type; const char *type_name; ast_struct_specifier *structure; @@ -1112,6 +1223,16 @@ public: }; +class ast_demote_statement : public ast_node { +public: + ast_demote_statement(void) {} + virtual void print(void) const; + + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); +}; + + class ast_function_definition : public ast_node { public: ast_function_definition() : prototype(NULL), body(NULL) @@ -1139,6 +1260,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; @@ -1224,6 +1346,20 @@ private: ast_layout_expression *local_size[3]; }; +class ast_warnings_toggle : public ast_node { +public: + ast_warnings_toggle(bool _enable) + : enable(_enable) + { + /* empty */ + } + + virtual ir_rvalue *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); + +private: + bool enable; +}; /*@}*/ extern void