[Mesa-dev] [PATCH 04/26] glsl: Compute version_string on the fly.
Ian Romanick
idr at freedesktop.org
Fri Nov 30 10:07:19 PST 2012
From: Paul Berry <stereotype441 at gmail.com>
Fixes a bug where version_string would be left uninitialized if no
GLSL "#version" directive was used.
---
src/glsl/ast_to_hir.cpp | 6 +++---
src/glsl/glsl_parser.yy | 13 +++++--------
src/glsl/glsl_parser_extras.h | 11 ++++++++++-
3 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 75b551b..adada30 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -449,7 +449,7 @@ modulus_result_type(const struct glsl_type *type_a,
if (state->language_version < 130) {
_mesa_glsl_error(loc, state,
"operator '%%' is reserved in %s",
- state->version_string);
+ state->get_version_string());
return glsl_type::error_type;
}
@@ -2618,13 +2618,13 @@ ast_declarator_list::hir(exec_list *instructions,
_mesa_glsl_error(& loc, state,
"`out' qualifier in declaration of `%s' "
"only valid for function parameters in %s.",
- decl->identifier, state->version_string);
+ decl->identifier, state->get_version_string());
}
if (this->type->qualifier.flags.q.in) {
_mesa_glsl_error(& loc, state,
"`in' qualifier in declaration of `%s' "
"only valid for function parameters in %s.",
- decl->identifier, state->version_string);
+ decl->identifier, state->get_version_string());
}
/* FINISHME: Test for other invalid qualifiers. */
}
diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index 03e05ff..e68a601 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -289,14 +289,11 @@ version_statement:
}
state->language_version = $2;
- state->version_string =
- glsl_compute_version_string(state, state->es_shader,
- state->language_version);
if (!supported) {
_mesa_glsl_error(& @2, state, "%s is not supported. "
"Supported versions are: %s\n",
- state->version_string,
+ state->get_version_string(),
state->supported_version_string);
}
@@ -316,7 +313,7 @@ pragma_statement:
if (state->language_version == 110) {
_mesa_glsl_warning(& @1, state,
"pragma `invariant(all)' not supported in %s",
- state->version_string);
+ state->get_version_string());
} else {
state->all_invariant = true;
}
@@ -1501,7 +1498,7 @@ precision_qualifier:
"precision qualifier forbidden "
"in %s (1.30 or later "
"required)\n",
- state->version_string);
+ state->get_version_string());
$$ = ast_precision_high;
}
@@ -1511,7 +1508,7 @@ precision_qualifier:
"precision qualifier forbidden "
"in %s (1.30 or later "
"required)\n",
- state->version_string);
+ state->get_version_string());
$$ = ast_precision_medium;
}
@@ -1521,7 +1518,7 @@ precision_qualifier:
"precision qualifier forbidden "
"in %s (1.30 or later "
"required)\n",
- state->version_string);
+ state->get_version_string());
$$ = ast_precision_low;
}
diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
index 5bad5a9..26fdee1 100644
--- a/src/glsl/glsl_parser_extras.h
+++ b/src/glsl/glsl_parser_extras.h
@@ -80,6 +80,16 @@ struct _mesa_glsl_parse_state {
ralloc_free(mem);
}
+ /**
+ * Generate a string representing the GLSL version currently being compiled
+ * (useful for error messages).
+ */
+ const char *get_version_string()
+ {
+ return glsl_compute_version_string(this, this->es_shader,
+ this->language_version);
+ }
+
struct gl_context *const ctx;
void *scanner;
exec_list translation_unit;
@@ -91,7 +101,6 @@ struct _mesa_glsl_parse_state {
bool es_shader;
unsigned language_version;
- const char *version_string;
enum _mesa_glsl_parser_targets target;
/**
--
1.7.11.7
More information about the mesa-dev
mailing list