summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Arceri <timothy.arceri@collabora.com>2015-11-14 14:32:38 +1100
committerTimothy Arceri <t_arceri@yahoo.com.au>2015-11-21 07:27:21 +1100
commitdb3c36aedfa2e92c2cf1c17a096c1b5e7cd51c42 (patch)
tree3cf1511c52d8db589f0bf1ac4ba0103112db8999
parent17e224e8ec9c190fb856a60a22d8e19b8f20837e (diff)
glsl: move stream layout max validation
This validation is moved later so we can validate the max value when compile time constant support is added in a later patch. Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com> Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
-rw-r--r--src/glsl/ast_to_hir.cpp21
-rw-r--r--src/glsl/ast_type.cpp14
2 files changed, 19 insertions, 16 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 7104aa0a633..bb0db7992e5 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2522,6 +2522,21 @@ process_qualifier_constant(struct _mesa_glsl_parse_state *state,
}
static bool
+validate_stream_qualifier(YYLTYPE *loc, struct _mesa_glsl_parse_state *state,
+ unsigned stream)
+{
+ if (stream >= state->ctx->Const.MaxVertexStreams) {
+ _mesa_glsl_error(loc, state,
+ "invalid stream specified %d is larger than "
+ "MAX_VERTEX_STREAMS - 1 (%d).",
+ stream, state->ctx->Const.MaxVertexStreams - 1);
+ return false;
+ }
+
+ return true;
+}
+
+static bool
validate_binding_qualifier(struct _mesa_glsl_parse_state *state,
YYLTYPE *loc,
const glsl_type *type,
@@ -3036,7 +3051,8 @@ apply_layout_qualifier_to_variable(const struct ast_type_qualifier *qual,
qual->flags.q.out && qual->flags.q.stream) {
unsigned qual_stream;
if (process_qualifier_constant(state, loc, "stream", qual->stream,
- &qual_stream)) {
+ &qual_stream) &&
+ validate_stream_qualifier(loc, state, qual_stream)) {
var->data.stream = qual_stream;
}
}
@@ -6517,7 +6533,8 @@ ast_interface_block::hir(exec_list *instructions,
unsigned qual_stream;
if (!process_qualifier_constant(state, &loc, "stream", this->layout.stream,
- &qual_stream)) {
+ &qual_stream) ||
+ !validate_stream_qualifier(&loc, state, qual_stream)) {
/* If the stream qualifier is invalid it doesn't make sense to continue
* on and try to compare stream layouts on member variables against it
* so just return early.
diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp
index 79134c19893..b107051e32c 100644
--- a/src/glsl/ast_type.cpp
+++ b/src/glsl/ast_type.cpp
@@ -190,20 +190,6 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
if (state->stage == MESA_SHADER_GEOMETRY &&
state->has_explicit_attrib_stream()) {
- if (q.flags.q.stream && q.stream >= state->ctx->Const.MaxVertexStreams) {
- _mesa_glsl_error(loc, state,
- "`stream' value is larger than MAX_VERTEX_STREAMS - 1 "
- "(%d > %d)",
- q.stream, state->ctx->Const.MaxVertexStreams - 1);
- }
- if (this->flags.q.explicit_stream &&
- this->stream >= state->ctx->Const.MaxVertexStreams) {
- _mesa_glsl_error(loc, state,
- "`stream' value is larger than MAX_VERTEX_STREAMS - 1 "
- "(%d > %d)",
- this->stream, state->ctx->Const.MaxVertexStreams - 1);
- }
-
if (!this->flags.q.explicit_stream) {
if (q.flags.q.stream) {
this->flags.q.stream = 1;