[Mesa-dev] [PATCH] glsl: use an enum for AMD_conservative_depth layout qualifiers
Samuel Pitoiset
samuel.pitoiset at gmail.com
Thu Feb 23 17:07:58 UTC 2017
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.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
src/compiler/glsl/ast.h | 16 ++++++++++++----
src/compiler/glsl/ast_to_hir.cpp | 21 ++++++---------------
src/compiler/glsl/ast_type.cpp | 12 +++---------
src/compiler/glsl/glsl_parser.yy | 12 ++++++++----
4 files changed, 29 insertions(+), 32 deletions(-)
diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h
index 3dff164232..11a092e41c 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 88febe7ff3..ad1fd9150a 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,24 +3637,19 @@ 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)
+ if (qual->depth_type == ast_depth_any)
var->data.depth_layout = ir_depth_layout_any;
- else if (qual->flags.q.depth_greater)
+ else if (qual->depth_type == ast_depth_greater)
var->data.depth_layout = ir_depth_layout_greater;
- else if (qual->flags.q.depth_less)
+ else if (qual->depth_type == ast_depth_less)
var->data.depth_layout = ir_depth_layout_less;
- else if (qual->flags.q.depth_unchanged)
+ else if (qual->depth_type == ast_depth_unchanged)
var->data.depth_layout = ir_depth_layout_unchanged;
else
var->data.depth_layout = ir_depth_layout_none;
diff --git a/src/compiler/glsl/ast_type.cpp b/src/compiler/glsl/ast_type.cpp
index e3f06a9900..580d216b30 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 db29165518..fd7edb28e7 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) {
--
2.11.1
More information about the mesa-dev
mailing list