* 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;
*/
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
{
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;
*/
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;
*/
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;
* 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. */
ast_float_constant,
ast_bool_constant,
ast_double_constant,
+ ast_int64_constant,
+ ast_uint64_constant,
ast_sequence,
ast_aggregate
unsigned uint_constant;
int bool_constant;
double double_constant;
+ uint64_t uint64_constant;
+ int64_t int64_constant;
} primary_expression;
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)
{
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;
/** \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 */
/** \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
*/
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;
* \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
*/
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);
+
+ /**
+ * 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,
class ast_struct_specifier : public ast_node {
public:
ast_struct_specifier(const char *identifier,
- ast_declarator_list *declarator_list);
+ ast_declarator_list *declarator_list);
virtual void print(void) const;
virtual ir_rvalue *hir(exec_list *instructions,
/* List of ast_declarator_list * */
exec_list declarations;
bool is_declaration;
+ const glsl_type *type;
};
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 */
/** 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;
ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
+ const struct glsl_type *type;
const char *type_name;
ast_struct_specifier *structure;
};
+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)
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;
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