glsl/parser: Extract version directive processing into a function.

Version directive handling is going to have to be used within two
parser rules, one for desktop-style version directives (e.g. "#version
130") and one for the new ES-style version directive (e.g. "#version
300 es"), so this patch moves it to a function that can be called from
both rules.

No functional change.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Acked-by: Carl Worth <cworth@cworth.org>
This commit is contained in:
Paul Berry 2012-08-02 11:02:55 -07:00 committed by Ian Romanick
parent a03c2c7ab9
commit 629b9edc99
3 changed files with 55 additions and 42 deletions

View File

@ -261,48 +261,7 @@ version_statement:
/* blank - no #version specified: defaults are already set */
| VERSION_TOK INTCONSTANT EOL
{
bool supported = false;
switch ($2) {
case 100:
state->es_shader = true;
supported = state->ctx->API == API_OPENGLES2 ||
state->ctx->Extensions.ARB_ES2_compatibility;
break;
case 110:
case 120:
/* FINISHME: Once the OpenGL 3.0 'forward compatible' context or
* the OpenGL 3.2 Core context is supported, this logic will need
* change. Older versions of GLSL are no longer supported
* outside the compatibility contexts of 3.x.
*/
case 130:
case 140:
case 150:
case 330:
case 400:
case 410:
case 420:
supported = _mesa_is_desktop_gl(state->ctx) &&
((unsigned) $2) <= state->ctx->Const.GLSLVersion;
break;
default:
supported = false;
break;
}
state->language_version = $2;
if (!supported) {
_mesa_glsl_error(& @2, state, "%s is not supported. "
"Supported versions are: %s\n",
state->get_version_string(),
state->supported_version_string);
}
if (state->language_version >= 140) {
state->ARB_uniform_buffer_object_enable = true;
}
state->process_version_directive(&@2, $2);
}
;

View File

@ -174,6 +174,58 @@ _mesa_glsl_parse_state::check_version(unsigned required_glsl_version,
return false;
}
/**
* Process a GLSL #version directive.
*
* \param version is the integer that follows the #version token.
*/
void
_mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version)
{
bool supported = false;
switch (version) {
case 100:
this->es_shader = true;
supported = this->ctx->API == API_OPENGLES2 ||
this->ctx->Extensions.ARB_ES2_compatibility;
break;
case 110:
case 120:
/* FINISHME: Once the OpenGL 3.0 'forward compatible' context or
* the OpenGL 3.2 Core context is supported, this logic will need
* change. Older versions of GLSL are no longer supported
* outside the compatibility contexts of 3.x.
*/
case 130:
case 140:
case 150:
case 330:
case 400:
case 410:
case 420:
supported = _mesa_is_desktop_gl(this->ctx) &&
((unsigned) version) <= this->ctx->Const.GLSLVersion;
break;
default:
supported = false;
break;
}
this->language_version = version;
if (!supported) {
_mesa_glsl_error(locp, this, "%s is not supported. "
"Supported versions are: %s\n",
this->get_version_string(),
this->supported_version_string);
}
if (this->language_version >= 140) {
this->ARB_uniform_buffer_object_enable = true;
}
}
const char *
_mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target)
{

View File

@ -136,6 +136,8 @@ struct _mesa_glsl_parse_state {
return check_version(130, 300, locp, "bit-wise operations are forbidden");
}
void process_version_directive(YYLTYPE *locp, int version);
struct gl_context *const ctx;
void *scanner;
exec_list translation_unit;