glsl2: Conditionally define preprocessor tokens for optional extensions
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 30 Jun 2010 23:27:22 +0000 (16:27 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 2 Jul 2010 03:40:08 +0000 (20:40 -0700)
The only optional extension currently supported by the compiler is
GL_EXT_texture_array.

src/glsl/glcpp/glcpp-parse.y
src/glsl/glcpp/glcpp.c
src/glsl/glcpp/glcpp.h
src/glsl/glcpp/pp.c
src/glsl/glsl_parser_extras.h
src/glsl/main.cpp
src/mesa/shader/ir_to_mesa.cpp

index d4cb006bbcdaf94478e35bad5ee771ff05bed822..e5544fe29b8bbcef596d666289f43b6fc5221d2e 100644 (file)
@@ -28,6 +28,7 @@
 #include <inttypes.h>
 
 #include "glcpp.h"
+#include "main/mtypes.h"
 
 #define glcpp_print(stream, str) stream = talloc_strdup_append(stream, str)
 #define glcpp_printf(stream, fmt, args...) \
@@ -894,7 +895,7 @@ yyerror (YYLTYPE *locp, glcpp_parser_t *parser, const char *error)
 }
 
 glcpp_parser_t *
-glcpp_parser_create (void)
+glcpp_parser_create (const struct gl_extensions *extensions)
 {
        glcpp_parser_t *parser;
        token_t *tok;
@@ -932,6 +933,13 @@ glcpp_parser_create (void)
        _token_list_append(list, tok);
        _define_object_macro(parser, NULL, "GL_ARB_texture_rectangle", list);
 
+       if ((extensions != NULL) && extensions->EXT_texture_array) {
+               list = _token_list_create(parser);
+               _token_list_append(list, tok);
+               _define_object_macro(parser, NULL,
+                                    "GL_EXT_texture_array", list);
+       }
+
        talloc_unlink(parser, tok);
 
        return parser;
index cc87e14950b6b585150d152838105b172e706e28..a245cb54060809ebb6ff0adbc6dbf74b2620243d 100644 (file)
@@ -68,16 +68,13 @@ load_text_file(void *ctx, const char *file_name)
        return text;
 }
 
-int
-preprocess(void *talloc_ctx, const char **shader, char **info_log);
-
 int
 main (void)
 {
        void *ctx = talloc(NULL, void*);
        const char *shader = load_text_file(ctx, NULL);
        char *info_log = talloc_strdup(ctx, "");
-       int ret = preprocess(ctx, &shader, &info_log);
+       int ret = preprocess(ctx, &shader, &info_log, NULL);
 
        printf("%s", shader);
        fprintf(stderr, "%s", info_log);
index 2cfa98d2b1d67d561947302ae09f9f37c278e1a9..fc9511a67a86163a336970633df931f7c5718c2b 100644 (file)
@@ -158,8 +158,10 @@ struct glcpp_parser {
        int error;
 };
 
+struct gl_extensions;
+
 glcpp_parser_t *
-glcpp_parser_create (void);
+glcpp_parser_create (const struct gl_extensions *extensions);
 
 int
 glcpp_parser_parse (glcpp_parser_t *parser);
@@ -168,7 +170,8 @@ void
 glcpp_parser_destroy (glcpp_parser_t *parser);
 
 int
-preprocess(void *talloc_ctx, const char **shader, char **info_log);
+preprocess(void *talloc_ctx, const char **shader, char **info_log,
+          const struct gl_extensions *extensions);
 
 /* Functions for writing to the info log */
 
index a25b7b72a6bd136bd4cbfb3cb7f9b6099c75a907..1ce829a2c97111fd753b9e9d9a3ced3f67b9c7c6 100644 (file)
@@ -134,10 +134,11 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
 }
 
 extern int
-preprocess(void *talloc_ctx, const char **shader, char **info_log)
+preprocess(void *talloc_ctx, const char **shader, char **info_log,
+          const struct gl_extensions *extensions)
 {
        int errors;
-       glcpp_parser_t *parser = glcpp_parser_create ();
+       glcpp_parser_t *parser = glcpp_parser_create (extensions);
        *shader = remove_line_continuations(parser, *shader);
 
        glcpp_lex_set_source_string (parser, *shader);
index 3aeba83cc525129160cfa05a601fdb8d2bf836a9..dc3d23ac545b1852f9190b6f926f9d9850ae44a2 100644 (file)
@@ -115,7 +115,8 @@ extern void _mesa_glsl_warning(const YYLTYPE *locp,
                               const char *fmt, ...);
 
 extern "C" {
-extern int preprocess(void *ctx, const char **shader, char **info_log);
+extern int preprocess(void *ctx, const char **shader, char **info_log,
+                     const struct gl_extensions *extensions);
 }
 
 extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state,
index c833c9cde6d3b1b539431db8143cf9ccda287ebe..deaab7e0335d672f86bb6730fdffb15a10c35957 100644 (file)
@@ -109,6 +109,7 @@ void
 compile_shader(struct gl_shader *shader)
 {
    struct _mesa_glsl_parse_state *state;
+   struct gl_extensions ext;
 
    state = talloc_zero(talloc_parent(shader), struct _mesa_glsl_parse_state);
 
@@ -127,11 +128,12 @@ compile_shader(struct gl_shader *shader)
    state->loop_or_switch_nesting = NULL;
    state->ARB_texture_rectangle_enable = true;
 
+   memset(&ext, 0, sizeof(ext));
    state->Const.MaxDrawBuffers = 2;
    state->Const.MaxTextureCoords = 4;
 
    const char *source = shader->Source;
-   state->error = preprocess(state, &source, &state->info_log);
+   state->error = preprocess(state, &source, &state->info_log, &ext);
 
    if (!state->error) {
       _mesa_glsl_lexer_ctor(state, source);
index 14abf602af2d40ef3e0578d275a67ee9c89e498f..918004c79f101b31880400078a149667d21d77b5 100644 (file)
@@ -1713,7 +1713,8 @@ _mesa_glsl_compile_shader(GLcontext *ctx, struct gl_shader *shader)
    state->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits;
 
    const char *source = shader->Source;
-   state->error = preprocess(state, &source, &state->info_log);
+   state->error = preprocess(state, &source, &state->info_log,
+                            &ctx->Extensions);
 
    if (!state->error) {
      _mesa_glsl_lexer_ctor(state, source);