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 <samuel.pitoiset@gmail.com> Reviewed-by: Andres Gomez <agomez@igalia.com> (v1)
This commit is contained in:
parent
de2727925a
commit
87ee1729d0
|
@ -463,6 +463,14 @@ enum {
|
||||||
ast_precision_low
|
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 {
|
struct ast_type_qualifier {
|
||||||
DECLARE_RALLOC_CXX_OPERATORS(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 */
|
/** \name Layout qualifiers for GL_AMD_conservative_depth */
|
||||||
/** \{ */
|
/** \{ */
|
||||||
unsigned depth_any:1;
|
unsigned depth_type:1;
|
||||||
unsigned depth_greater:1;
|
|
||||||
unsigned depth_less:1;
|
|
||||||
unsigned depth_unchanged:1;
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
|
||||||
/** \name Layout qualifiers for GL_ARB_uniform_buffer_object */
|
/** \name Layout qualifiers for GL_ARB_uniform_buffer_object */
|
||||||
|
@ -630,6 +635,9 @@ struct ast_type_qualifier {
|
||||||
/** Precision of the type (highp/medium/lowp). */
|
/** Precision of the type (highp/medium/lowp). */
|
||||||
unsigned precision:2;
|
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
|
* Alignment specified via GL_ARB_enhanced_layouts "align" layout qualifier
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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
|
/* Layout qualifiers for gl_FragDepth, which are enabled by extension
|
||||||
* AMD_conservative_depth.
|
* AMD_conservative_depth.
|
||||||
*/
|
*/
|
||||||
int depth_layout_count = qual->flags.q.depth_any
|
if (qual->flags.q.depth_type
|
||||||
+ qual->flags.q.depth_greater
|
|
||||||
+ qual->flags.q.depth_less
|
|
||||||
+ qual->flags.q.depth_unchanged;
|
|
||||||
if (depth_layout_count > 0
|
|
||||||
&& !state->is_version(420, 0)
|
&& !state->is_version(420, 0)
|
||||||
&& !state->AMD_conservative_depth_enable
|
&& !state->AMD_conservative_depth_enable
|
||||||
&& !state->ARB_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 "
|
"extension GL_AMD_conservative_depth or "
|
||||||
"GL_ARB_conservative_depth must be enabled "
|
"GL_ARB_conservative_depth must be enabled "
|
||||||
"to use depth layout qualifiers");
|
"to use depth layout qualifiers");
|
||||||
} else if (depth_layout_count > 0
|
} else if (qual->flags.q.depth_type
|
||||||
&& strcmp(var->name, "gl_FragDepth") != 0) {
|
&& strcmp(var->name, "gl_FragDepth") != 0) {
|
||||||
_mesa_glsl_error(loc, state,
|
_mesa_glsl_error(loc, state,
|
||||||
"depth layout qualifiers can be applied only to "
|
"depth layout qualifiers can be applied only to "
|
||||||
"gl_FragDepth");
|
"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;
|
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;
|
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;
|
var->data.depth_layout = ir_depth_layout_less;
|
||||||
else if (qual->flags.q.depth_unchanged)
|
break;
|
||||||
|
case ast_depth_unchanged:
|
||||||
var->data.depth_layout = ir_depth_layout_unchanged;
|
var->data.depth_layout = ir_depth_layout_unchanged;
|
||||||
else
|
break;
|
||||||
|
default:
|
||||||
var->data.depth_layout = ir_depth_layout_none;
|
var->data.depth_layout = ir_depth_layout_none;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (qual->flags.q.std140 ||
|
if (qual->flags.q.std140 ||
|
||||||
qual->flags.q.std430 ||
|
qual->flags.q.std430 ||
|
||||||
|
|
|
@ -63,10 +63,7 @@ ast_type_qualifier::has_layout() const
|
||||||
{
|
{
|
||||||
return this->flags.q.origin_upper_left
|
return this->flags.q.origin_upper_left
|
||||||
|| this->flags.q.pixel_center_integer
|
|| this->flags.q.pixel_center_integer
|
||||||
|| this->flags.q.depth_any
|
|| this->flags.q.depth_type
|
||||||
|| this->flags.q.depth_greater
|
|
||||||
|| this->flags.q.depth_less
|
|
||||||
|| this->flags.q.depth_unchanged
|
|
||||||
|| this->flags.q.std140
|
|| this->flags.q.std140
|
||||||
|| this->flags.q.std430
|
|| this->flags.q.std430
|
||||||
|| this->flags.q.shared
|
|| 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%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,
|
message, name,
|
||||||
bad.flags.q.invariant ? " invariant" : "",
|
bad.flags.q.invariant ? " invariant" : "",
|
||||||
bad.flags.q.precise ? " precise" : "",
|
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_index ? " index" : "",
|
||||||
bad.flags.q.explicit_binding ? " binding" : "",
|
bad.flags.q.explicit_binding ? " binding" : "",
|
||||||
bad.flags.q.explicit_offset ? " offset" : "",
|
bad.flags.q.explicit_offset ? " offset" : "",
|
||||||
bad.flags.q.depth_any ? " depth_any" : "",
|
bad.flags.q.depth_type ? " depth_type" : "",
|
||||||
bad.flags.q.depth_greater ? " depth_greater" : "",
|
|
||||||
bad.flags.q.depth_less ? " depth_less" : "",
|
|
||||||
bad.flags.q.depth_unchanged ? " depth_unchanged" : "",
|
|
||||||
bad.flags.q.std140 ? " std140" : "",
|
bad.flags.q.std140 ? " std140" : "",
|
||||||
bad.flags.q.std430 ? " std430" : "",
|
bad.flags.q.std430 ? " std430" : "",
|
||||||
bad.flags.q.shared ? " shared" : "",
|
bad.flags.q.shared ? " shared" : "",
|
||||||
|
|
|
@ -1227,14 +1227,18 @@ layout_qualifier_id:
|
||||||
state->ARB_conservative_depth_enable ||
|
state->ARB_conservative_depth_enable ||
|
||||||
state->is_version(420, 0))) {
|
state->is_version(420, 0))) {
|
||||||
if (match_layout_qualifier($1, "depth_any", state) == 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) {
|
} 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) {
|
} 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",
|
} else if (match_layout_qualifier($1, "depth_unchanged",
|
||||||
state) == 0) {
|
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) {
|
if ($$.flags.i && state->AMD_conservative_depth_warn) {
|
||||||
|
|
Loading…
Reference in New Issue