X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fglsl%2Fast.h;h=90a35654aeb158a810456ce8f02b38f27f2f6945;hb=154c789ad5510de12456507223515861e9e7900a;hp=9327e039793513e1ec1eb16090c5c8c986b7388d;hpb=115d938cea5f362c3c078bcc6e75da1245aa6675;p=mesa.git diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h index 9327e039793..90a35654aeb 100644 --- a/src/compiler/glsl/ast.h +++ b/src/compiler/glsl/ast.h @@ -27,6 +27,8 @@ #include "list.h" #include "glsl_parser_extras.h" +#include "compiler/glsl_types.h" +#include "util/bitset.h" struct _mesa_glsl_parse_state; @@ -472,8 +474,15 @@ enum { 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; @@ -617,6 +626,16 @@ struct ast_type_qualifier { * 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. @@ -630,12 +649,22 @@ struct ast_type_qualifier { 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; + /** \} */ } /** \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). */ @@ -742,6 +771,12 @@ struct ast_type_qualifier { */ GLenum 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 * the following enumerants are allowed: GLSL_TYPE_UINT, @@ -832,8 +867,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, @@ -844,6 +879,7 @@ public: /* List of ast_declarator_list * */ exec_list declarations; bool is_declaration; + const glsl_type *type; }; @@ -852,7 +888,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 */ @@ -860,12 +896,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; @@ -874,6 +917,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; @@ -1282,6 +1326,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