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:
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user