glsl: Move layout(location) checks to AST-to-HIR conversion

This will simplify the addition of layout(location) qualifiers for
separate shader objects.  This was validated with new piglit tests
arb_explicit_attrib_location/1.30/compiler/not-enabled-01.vert and
arb_explicit_attrib_location/1.30/compiler/not-enabled-02.vert.

v2: Refactor error checking to check_explicit_attrib_location_allowed
and eliminate the gotos.  Suggested by Paul.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
This commit is contained in:
Ian Romanick
2013-09-25 14:36:27 -07:00
parent 9d6294f5a2
commit 5cb80f0314
3 changed files with 43 additions and 22 deletions
+8
View File
@@ -2063,6 +2063,9 @@ validate_explicit_location(const struct ast_type_qualifier *qual,
switch (state->target) {
case vertex_shader:
if (var->mode == ir_var_shader_in) {
if (!state->check_explicit_attrib_location_allowed(loc, var))
return;
break;
}
@@ -2077,6 +2080,9 @@ validate_explicit_location(const struct ast_type_qualifier *qual,
case fragment_shader:
if (var->mode == ir_var_shader_out) {
if (!state->check_explicit_attrib_location_allowed(loc, var))
return;
break;
}
@@ -2126,6 +2132,8 @@ validate_explicit_location(const struct ast_type_qualifier *qual,
}
}
}
return;
}
static void
+15 -19
View File
@@ -1302,29 +1302,25 @@ layout_qualifier_id:
{
memset(& $$, 0, sizeof($$));
if (state->has_explicit_attrib_location()) {
if (match_layout_qualifier("location", $1, state) == 0) {
$$.flags.q.explicit_location = 1;
if (match_layout_qualifier("location", $1, state) == 0) {
$$.flags.q.explicit_location = 1;
if ($3 >= 0) {
$$.location = $3;
} else {
_mesa_glsl_error(& @3, state,
"invalid location %d specified", $3);
YYERROR;
}
if ($3 >= 0) {
$$.location = $3;
} else {
_mesa_glsl_error(& @3, state, "invalid location %d specified", $3);
YYERROR;
}
}
if (match_layout_qualifier("index", $1, state) == 0) {
$$.flags.q.explicit_index = 1;
if (match_layout_qualifier("index", $1, state) == 0) {
$$.flags.q.explicit_index = 1;
if ($3 >= 0) {
$$.index = $3;
} else {
_mesa_glsl_error(& @3, state,
"invalid index %d specified", $3);
YYERROR;
}
if ($3 >= 0) {
$$.index = $3;
} else {
_mesa_glsl_error(& @3, state, "invalid index %d specified", $3);
YYERROR;
}
}
+20 -3
View File
@@ -69,6 +69,10 @@ typedef struct YYLTYPE {
# define YYLTYPE_IS_DECLARED 1
# define YYLTYPE_IS_TRIVIAL 1
extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
const char *fmt, ...);
struct _mesa_glsl_parse_state {
_mesa_glsl_parse_state(struct gl_context *_ctx, GLenum target,
void *mem_ctx);
@@ -121,6 +125,22 @@ struct _mesa_glsl_parse_state {
return check_version(130, 300, locp, "bit-wise operations are forbidden");
}
bool check_explicit_attrib_location_allowed(YYLTYPE *locp,
const ir_variable *var)
{
if (!this->has_explicit_attrib_location()) {
const char *const requirement = this->es_shader
? "GLSL ES 300"
: "GL_ARB_explicit_attrib_location extension or GLSL 330";
_mesa_glsl_error(locp, this, "%s explicit location requires %s",
mode_string(var), requirement);
return false;
}
return true;
}
bool has_explicit_attrib_location() const
{
return ARB_explicit_attrib_location_enable || is_version(330, 300);
@@ -372,9 +392,6 @@ do { \
(Current).source = 0; \
} while (0)
extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
const char *fmt, ...);
/**
* Emit a warning to the shader log
*