glsl: Propagate depth layout qualifier from AST to IR

This commit is contained in:
Chad Versace
2011-01-27 01:40:26 -08:00
parent 5fc57f471b
commit bc04d244f5
3 changed files with 73 additions and 0 deletions

View File

@@ -2009,6 +2009,40 @@ apply_type_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
&& !state->AMD_conservative_depth_enable) {
_mesa_glsl_error(loc, state,
"extension GL_AMD_conservative_depth must be enabled "
"to use depth layout qualifiers");
} else if (depth_layout_count > 0
&& 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)
var->depth_layout = ir_depth_layout_any;
else if (qual->flags.q.depth_greater)
var->depth_layout = ir_depth_layout_greater;
else if (qual->flags.q.depth_less)
var->depth_layout = ir_depth_layout_less;
else if (qual->flags.q.depth_unchanged)
var->depth_layout = ir_depth_layout_unchanged;
else
var->depth_layout = ir_depth_layout_none;
if (var->type->is_array() && state->language_version != 110) {
var->array_lvalue = true;
}
@@ -2599,6 +2633,36 @@ ast_declarator_list::hir(exec_list *instructions,
&& earlier->type == var->type
&& earlier->mode == var->mode) {
earlier->interpolation = var->interpolation;
/* Layout qualifiers for gl_FragDepth. */
} else if (state->AMD_conservative_depth_enable
&& strcmp(var->name, "gl_FragDepth") == 0
&& earlier->type == var->type
&& earlier->mode == var->mode) {
/** From the AMD_conservative_depth spec:
* Within any shader, the first redeclarations of gl_FragDepth
* must appear before any use of gl_FragDepth.
*/
if (earlier->used) {
_mesa_glsl_error(&loc, state,
"the first redeclaration of gl_FragDepth "
"must appear before any use of gl_FragDepth");
}
/* Prevent inconsistent redeclaration of depth layout qualifier. */
if (earlier->depth_layout != ir_depth_layout_none
&& earlier->depth_layout != var->depth_layout) {
_mesa_glsl_error(&loc, state,
"gl_FragDepth: depth layout is declared here "
"as '%s, but it was previously declared as "
"'%s'",
depth_layout_string(var->depth_layout),
depth_layout_string(earlier->depth_layout));
}
earlier->depth_layout = var->depth_layout;
} else {
YYLTYPE loc = this->get_location();
_mesa_glsl_error(&loc, state, "`%s' redeclared", decl->identifier);

View File

@@ -1341,6 +1341,7 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name,
this->constant_value = NULL;
this->origin_upper_left = false;
this->pixel_center_integer = false;
this->depth_layout = ir_depth_layout_none;
this->used = false;
if (type && type->base_type == GLSL_TYPE_SAMPLER)

View File

@@ -353,6 +353,14 @@ public:
unsigned pixel_center_integer:1;
/*@}*/
/**
* \brief Layout qualifier for gl_FragDepth.
*
* This is not equal to \c ir_depth_layout_none if and only if this
* variable is \c gl_FragDepth and a layout qualifier is specified.
*/
ir_depth_layout depth_layout;
/**
* Was the location explicitly set in the shader?
*