Add support for AMD_conservative_depth by extending the production rule of layout_qualifier_id to process the additional layout qualifier tokens enabled by the extension. --- src/glsl/glsl_parser.ypp | 64 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/src/glsl/glsl_parser.ypp b/src/glsl/glsl_parser.ypp index 97f7b32..2161200 100644 --- a/src/glsl/glsl_parser.ypp +++ b/src/glsl/glsl_parser.ypp @@ -50,6 +50,24 @@ layout_qualifier_id__ARB_fragment_coord_conventions_enable( const char *token1, YYLTYPE *token1_location); +/** + * \brief Helper function for prodution rule of 'layout_qualifier_id'. + * + * If extension 'AMD_conservative_depth' is enabled and \c token1 is + * a layout qualifer added by that extension, then process the token and + * return true. Else, return false. + * + * This function should be used only within the production rule of + * 'layout_qualifier_id'. + */ +static bool +layout_qualifier_id__AMD_conservative_depth( + _mesa_glsl_parse_state *state, + ast_type_qualifier *lhs, + YYLTYPE *lhs_location, + const char *token1, + YYLTYPE *token1_location); + %} %pure-parser @@ -1024,8 +1042,14 @@ layout_qualifier_id: memset(& $$, 0, sizeof($$)); - got_one = layout_qualifier_id__ARB_fragment_coord_conventions_enable( - state, & $$, & @$, $1, & @1); + if (!got_one) { + got_one = layout_qualifier_id__ARB_fragment_coord_conventions_enable( + state, & $$, & @$, $1, & @1); + } + if (!got_one) { + got_one = layout_qualifier_id__AMD_conservative_depth( + state, & $$, & @$, $1, & @1); + } /* If the identifier didn't match any known layout identifiers, * emit an error. @@ -1667,3 +1691,39 @@ layout_qualifier_id__ARB_fragment_coord_conventions_enable( return found; } + +static bool +layout_qualifier_id__AMD_conservative_depth( + _mesa_glsl_parse_state *state, + ast_type_qualifier *lhs, + YYLTYPE *lhs_location, + const char *token1, + YYLTYPE *token1_location) +{ + // found: Indicates if a layout qualifier has been found. + bool found = false; + + if (!state->AMD_conservative_depth_enable) + return false; + + if (strcmp(token1, "depth_any") == 0) { + found = true; + lhs->flags.q.depth_any = 1; + } else if (strcmp(token1, "depth_greater") == 0) { + found = true; + lhs->flags.q.depth_greater = 1; + } else if (strcmp(token1, "depth_less") == 0) { + found = true; + lhs->flags.q.depth_less = 1; + } else if (strcmp(token1, "depth_unchanged") == 0) { + found = true; + lhs->flags.q.depth_unchanged = 1; + } + + if (found && state->AMD_conservative_depth_warn) { + _mesa_glsl_warning(token1_location, state, "GL_AMD_conservative_depth " + "layout identifier `%s' used\n", token1); + } + + return found; +} -- 1.7.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev