glcpp: Add a flag to the parser state to indicate GLES.
authorCarl Worth <cworth@cworth.org>
Mon, 26 Nov 2012 22:53:54 +0000 (14:53 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 11 Jan 2013 18:57:25 +0000 (10:57 -0800)
This can be triggered either by creation of a GLES context (with
api == API_OPENGLES2) or else by a #version directive with version
value 100 or with a string of "es" following the version value.

There's no behavioral change with this commit—just preparation for ES-specific
behavior in the preprocessor in the future.

Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/glcpp/glcpp-parse.y
src/glsl/glcpp/glcpp.h

index 380a1d99cb48728348fca3b7c1cc0dc7e647307f..76dcd42290cd63be995fbf30a81d19bb44cfe008 100644 (file)
@@ -1179,15 +1179,18 @@ glcpp_parser_create (const struct gl_extensions *extensions, int api)
        parser->has_new_source_number = 0;
        parser->new_source_number = 0;
 
+       parser->is_gles = false;
+
        /* Add pre-defined macros. */
        if (extensions != NULL) {
           if (extensions->OES_EGL_image_external)
              add_builtin_define(parser, "GL_OES_EGL_image_external", 1);
        }
 
-       if (api == API_OPENGLES2)
+       if (api == API_OPENGLES2) {
+               parser->is_gles = true;
                add_builtin_define(parser, "GL_ES", 1);
-       else {
+       else {
           add_builtin_define(parser, "GL_ARB_draw_buffers", 1);
           add_builtin_define(parser, "GL_ARB_texture_rectangle", 1);
 
@@ -2026,11 +2029,6 @@ static void
 _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t version,
                                          const char *es_identifier)
 {
-       /* Note: We assume that if any identifier is present, it means ES.
-         * The GLSL parser will double-check that the identifier is correct.
-        */
-       bool is_es = es_identifier != NULL;
-
        macro_t *macro = hash_table_find (parser->defines, "__VERSION__");
        if (macro) {
                hash_table_remove (parser->defines, "__VERSION__");
@@ -2038,17 +2036,23 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
        }
        add_builtin_define (parser, "__VERSION__", version);
 
-       if (version == 100)
-               is_es = true;
-       if (is_es)
+       /* If we didn't have a GLES context to begin with, (indicated
+        * by parser->api), then the version declaration here might
+        * indicate GLES. */
+       if (! parser->is_gles &&
+           (version == 100 ||
+            (es_identifier && (strcmp(es_identifier, "es") == 0))))
+       {
+               parser->is_gles = true;
                add_builtin_define (parser, "GL_ES", 1);
+       }
 
        /* Currently, all ES2/ES3 implementations support highp in the
         * fragment shader, so we always define this macro in ES2/ES3.
         * If we ever get a driver that doesn't support highp, we'll
         * need to add a flag to the gl_context and check that here.
         */
-       if (version >= 130 || is_es)
+       if (version >= 130 || parser->is_gles)
                add_builtin_define (parser, "GL_FRAGMENT_PRECISION_HIGH", 1);
 
        ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length,
index a459289b2e446f658e287073261570ae6832df90..03a77b7047a06e9ba27fac03638e16673272121d 100644 (file)
@@ -182,6 +182,7 @@ struct glcpp_parser {
        int new_line_number;
        bool has_new_source_number;
        int new_source_number;
+       bool is_gles;
 };
 
 struct gl_extensions;