From 87ee1729d0cd5c6a26c62109eae9b75b006a9d1a Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 23 Feb 2017 18:07:58 +0100 Subject: [PATCH] glsl: use an enum for AMD_conservative_depth layout qualifiers The main idea behind this is to free some bits in the flags.q struct because currently all 64-bits are used and we can't add more layout qualifiers without reaching a static assert. In order to do that (mainly for ARB_bindless_texture), use an enumeration for the AMD_conservative_depth layout qualifiers because it's forbidden to declare more than one depth qualifier for gl_FragDepth. Note that ast_type_qualifier::merge_qualifier() will prevent using duplicate layout qualifiers by returning a compile-time error. No piglit regressions found (including compiler tests) with RX480 on RadeonSI. v2: use a switch case Signed-off-by: Samuel Pitoiset Reviewed-by: Andres Gomez (v1) --- src/compiler/glsl/ast.h | 16 +++++++++++---- src/compiler/glsl/ast_to_hir.cpp | 35 ++++++++++++++++---------------- src/compiler/glsl/ast_type.cpp | 12 +++-------- src/compiler/glsl/glsl_parser.yy | 12 +++++++---- 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h index 3dff164232d..11a092e41c2 100644 --- a/src/compiler/glsl/ast.h +++ b/src/compiler/glsl/ast.h @@ -463,6 +463,14 @@ 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); @@ -528,10 +536,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 */ @@ -630,6 +635,9 @@ struct ast_type_qualifier { /** 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 */ diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index db48cf81134..8424b5bb3f2 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -3629,11 +3629,7 @@ apply_layout_qualifier_to_variable(const struct ast_type_qualifier *qual, /* Layout qualifiers for gl_FragDepth, which are enabled by extension * AMD_conservative_depth. */ - int depth_layout_count = qual->flags.q.depth_any - + qual->flags.q.depth_greater - + qual->flags.q.depth_less - + qual->flags.q.depth_unchanged; - if (depth_layout_count > 0 + if (qual->flags.q.depth_type && !state->is_version(420, 0) && !state->AMD_conservative_depth_enable && !state->ARB_conservative_depth_enable) { @@ -3641,27 +3637,30 @@ apply_layout_qualifier_to_variable(const struct ast_type_qualifier *qual, "extension GL_AMD_conservative_depth or " "GL_ARB_conservative_depth must be enabled " "to use depth layout qualifiers"); - } else if (depth_layout_count > 0 + } else if (qual->flags.q.depth_type && strcmp(var->name, "gl_FragDepth") != 0) { _mesa_glsl_error(loc, state, "depth layout qualifiers can be applied only to " "gl_FragDepth"); - } else if (depth_layout_count > 1 - && strcmp(var->name, "gl_FragDepth") == 0) { - _mesa_glsl_error(loc, state, - "at most one depth layout qualifier can be applied to " - "gl_FragDepth"); } - if (qual->flags.q.depth_any) + + switch (qual->depth_type) { + case ast_depth_any: var->data.depth_layout = ir_depth_layout_any; - else if (qual->flags.q.depth_greater) + break; + case ast_depth_greater: var->data.depth_layout = ir_depth_layout_greater; - else if (qual->flags.q.depth_less) + break; + case ast_depth_less: var->data.depth_layout = ir_depth_layout_less; - else if (qual->flags.q.depth_unchanged) - var->data.depth_layout = ir_depth_layout_unchanged; - else - var->data.depth_layout = ir_depth_layout_none; + break; + case ast_depth_unchanged: + var->data.depth_layout = ir_depth_layout_unchanged; + break; + default: + var->data.depth_layout = ir_depth_layout_none; + break; + } if (qual->flags.q.std140 || qual->flags.q.std430 || diff --git a/src/compiler/glsl/ast_type.cpp b/src/compiler/glsl/ast_type.cpp index e3f06a9900d..580d216b303 100644 --- a/src/compiler/glsl/ast_type.cpp +++ b/src/compiler/glsl/ast_type.cpp @@ -63,10 +63,7 @@ ast_type_qualifier::has_layout() const { return this->flags.q.origin_upper_left || this->flags.q.pixel_center_integer - || this->flags.q.depth_any - || this->flags.q.depth_greater - || this->flags.q.depth_less - || this->flags.q.depth_unchanged + || this->flags.q.depth_type || this->flags.q.std140 || this->flags.q.std430 || this->flags.q.shared @@ -718,7 +715,7 @@ ast_type_qualifier::validate_flags(YYLTYPE *loc, "%s '%s':" "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s" "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s" - "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", + "%s%s%s%s%s%s%s%s%s%s%s%s%s\n", message, name, bad.flags.q.invariant ? " invariant" : "", bad.flags.q.precise ? " precise" : "", @@ -744,10 +741,7 @@ ast_type_qualifier::validate_flags(YYLTYPE *loc, bad.flags.q.explicit_index ? " index" : "", bad.flags.q.explicit_binding ? " binding" : "", bad.flags.q.explicit_offset ? " offset" : "", - bad.flags.q.depth_any ? " depth_any" : "", - bad.flags.q.depth_greater ? " depth_greater" : "", - bad.flags.q.depth_less ? " depth_less" : "", - bad.flags.q.depth_unchanged ? " depth_unchanged" : "", + bad.flags.q.depth_type ? " depth_type" : "", bad.flags.q.std140 ? " std140" : "", bad.flags.q.std430 ? " std430" : "", bad.flags.q.shared ? " shared" : "", diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy index 146c9628973..7777d703f8c 100644 --- a/src/compiler/glsl/glsl_parser.yy +++ b/src/compiler/glsl/glsl_parser.yy @@ -1227,14 +1227,18 @@ layout_qualifier_id: state->ARB_conservative_depth_enable || state->is_version(420, 0))) { if (match_layout_qualifier($1, "depth_any", state) == 0) { - $$.flags.q.depth_any = 1; + $$.flags.q.depth_type = 1; + $$.depth_type = ast_depth_any; } else if (match_layout_qualifier($1, "depth_greater", state) == 0) { - $$.flags.q.depth_greater = 1; + $$.flags.q.depth_type = 1; + $$.depth_type = ast_depth_greater; } else if (match_layout_qualifier($1, "depth_less", state) == 0) { - $$.flags.q.depth_less = 1; + $$.flags.q.depth_type = 1; + $$.depth_type = ast_depth_less; } else if (match_layout_qualifier($1, "depth_unchanged", state) == 0) { - $$.flags.q.depth_unchanged = 1; + $$.flags.q.depth_type = 1; + $$.depth_type = ast_depth_unchanged; } if ($$.flags.i && state->AMD_conservative_depth_warn) {