glsl: Parse `demote` statement
When the EXT_demote_to_helper_invocation extension is enabled, `demote` is treated as a keyword, and produces an ir_demote. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
af1a6f0f77
commit
3439956377
|
@ -1213,6 +1213,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)
|
||||
|
|
|
@ -6464,6 +6464,25 @@ ast_jump_statement::hir(exec_list *instructions,
|
|||
}
|
||||
|
||||
|
||||
ir_rvalue *
|
||||
ast_demote_statement::hir(exec_list *instructions,
|
||||
struct _mesa_glsl_parse_state *state)
|
||||
{
|
||||
void *ctx = state;
|
||||
|
||||
if (state->stage != MESA_SHADER_FRAGMENT) {
|
||||
YYLTYPE loc = this->get_location();
|
||||
|
||||
_mesa_glsl_error(& loc, state,
|
||||
"`demote' may only appear in a fragment shader");
|
||||
}
|
||||
|
||||
instructions->push_tail(new(ctx) ir_demote);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
ir_rvalue *
|
||||
ast_selection_statement::hir(exec_list *instructions,
|
||||
struct _mesa_glsl_parse_state *state)
|
||||
|
|
|
@ -356,6 +356,7 @@ for return FOR;
|
|||
if return IF;
|
||||
discard return DISCARD;
|
||||
return return RETURN;
|
||||
demote KEYWORD_WITH_ALT(0, 0, 0, 0, yyextra->EXT_demote_to_helper_invocation_enable, DEMOTE);
|
||||
|
||||
bvec2 { yylval->type = glsl_type::bvec2_type; return BASIC_TYPE_TOK; }
|
||||
bvec3 { yylval->type = glsl_type::bvec3_type; return BASIC_TYPE_TOK; }
|
||||
|
|
|
@ -139,7 +139,7 @@ static bool match_layout_qualifier(const char *s1, const char *s2,
|
|||
|
||||
%token ATTRIBUTE CONST_TOK
|
||||
%token <type> BASIC_TYPE_TOK
|
||||
%token BREAK BUFFER CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT
|
||||
%token BREAK BUFFER CONTINUE DO ELSE FOR IF DEMOTE DISCARD RETURN SWITCH CASE DEFAULT
|
||||
%token CENTROID IN_TOK OUT_TOK INOUT_TOK UNIFORM VARYING SAMPLE
|
||||
%token NOPERSPECTIVE FLAT SMOOTH
|
||||
%token IMAGE1DSHADOW IMAGE2DSHADOW IMAGE1DARRAYSHADOW IMAGE2DARRAYSHADOW
|
||||
|
@ -256,6 +256,7 @@ static bool match_layout_qualifier(const char *s1, const char *s2,
|
|||
%type <node> declaration
|
||||
%type <node> declaration_statement
|
||||
%type <node> jump_statement
|
||||
%type <node> demote_statement
|
||||
%type <node> interface_block
|
||||
%type <interface_block> basic_interface_block
|
||||
%type <struct_specifier> struct_specifier
|
||||
|
@ -2510,6 +2511,7 @@ simple_statement:
|
|||
| switch_statement
|
||||
| iteration_statement
|
||||
| jump_statement
|
||||
| demote_statement
|
||||
;
|
||||
|
||||
compound_statement:
|
||||
|
@ -2808,6 +2810,15 @@ jump_statement:
|
|||
}
|
||||
;
|
||||
|
||||
demote_statement:
|
||||
DEMOTE ';'
|
||||
{
|
||||
void *ctx = state->linalloc;
|
||||
$$ = new(ctx) ast_demote_statement();
|
||||
$$->set_location(@1);
|
||||
}
|
||||
;
|
||||
|
||||
external_declaration:
|
||||
function_definition { $$ = $1; }
|
||||
| declaration { $$ = $1; }
|
||||
|
|
|
@ -1512,6 +1512,13 @@ ast_jump_statement::ast_jump_statement(int mode, ast_expression *return_value)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
ast_demote_statement::print(void) const
|
||||
{
|
||||
printf("demote; ");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ast_selection_statement::print(void) const
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue