[Mesa-dev] [PATCH 3/8] glcpp: Accept pointer to GL context rather than just the API version

Carl Worth cworth at cworth.org
Wed Dec 5 17:32:12 PST 2012


As the preprocessor becomes more sophisticated and gains more optional
behavior, it's easiest to just pass the GL context pointer to it so that
it can examine any fields there that it needs to (such as API version,
or the state of any driconf options, etc.).
---
 src/glsl/glcpp/glcpp.c          |   13 ++++++++++++-
 src/glsl/glcpp/glcpp.h          |    4 +++-
 src/glsl/glcpp/pp.c             |    4 ++--
 src/glsl/glsl_parser_extras.h   |    2 +-
 src/glsl/main.cpp               |    2 +-
 src/glsl/test_optpass.cpp       |    2 +-
 src/mesa/program/ir_to_mesa.cpp |    2 +-
 7 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/glsl/glcpp/glcpp.c b/src/glsl/glcpp/glcpp.c
index 7c2ded8..79fbdac 100644
--- a/src/glsl/glcpp/glcpp.c
+++ b/src/glsl/glcpp/glcpp.c
@@ -94,6 +94,14 @@ load_text_file(void *ctx, const char *filename)
 	return text;
 }
 
+/* Initialize only those things that glcpp cares about.
+ */
+static void
+init_fake_gl_context (struct gl_context *gl_ctx)
+{
+	gl_ctx->API = API_OPENGL_COMPAT;
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -102,6 +110,9 @@ main (int argc, char *argv[])
 	char *info_log = ralloc_strdup(ctx, "");
 	const char *shader;
 	int ret;
+	struct gl_context gl_ctx;
+
+	init_fake_gl_context (&gl_ctx);
 
 	if (argc) {
 		filename = argv[1];
@@ -111,7 +122,7 @@ main (int argc, char *argv[])
 	if (shader == NULL)
 	   return 1;
 
-	ret = glcpp_preprocess(ctx, &shader, &info_log, NULL, API_OPENGL_COMPAT);
+	ret = glcpp_preprocess(ctx, &shader, &info_log, NULL, &gl_ctx);
 
 	printf("%s", shader);
 	fprintf(stderr, "%s", info_log);
diff --git a/src/glsl/glcpp/glcpp.h b/src/glsl/glcpp/glcpp.h
index a459289..cdcbdfe 100644
--- a/src/glsl/glcpp/glcpp.h
+++ b/src/glsl/glcpp/glcpp.h
@@ -27,6 +27,8 @@
 #include <stdint.h>
 #include <stdbool.h>
 
+#include "main/mtypes.h"
+
 #include "../ralloc.h"
 
 #include "program/hash_table.h"
@@ -197,7 +199,7 @@ glcpp_parser_destroy (glcpp_parser_t *parser);
 
 int
 glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log,
-	   const struct gl_extensions *extensions, int api);
+	   const struct gl_extensions *extensions, struct gl_context *g_ctx);
 
 /* Functions for writing to the info log */
 
diff --git a/src/glsl/glcpp/pp.c b/src/glsl/glcpp/pp.c
index 11b2941..5f86a49 100644
--- a/src/glsl/glcpp/pp.c
+++ b/src/glsl/glcpp/pp.c
@@ -151,10 +151,10 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
 
 int
 glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log,
-	   const struct gl_extensions *extensions, int api)
+	   const struct gl_extensions *extensions, struct gl_context *gl_ctx)
 {
 	int errors;
-	glcpp_parser_t *parser = glcpp_parser_create (extensions, api);
+	glcpp_parser_t *parser = glcpp_parser_create (extensions, gl_ctx->API);
 	*shader = remove_line_continuations(parser, *shader);
 
 	glcpp_lex_set_source_string (parser, *shader);
diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
index 0b208f6..7473eee 100644
--- a/src/glsl/glsl_parser_extras.h
+++ b/src/glsl/glsl_parser_extras.h
@@ -299,7 +299,7 @@ extern "C" {
 #endif
 
 extern int glcpp_preprocess(void *ctx, const char **shader, char **info_log,
-                      const struct gl_extensions *extensions, int api);
+                      const struct gl_extensions *extensions, struct gl_context *gl_ctx);
 
 extern void _mesa_destroy_shader_compiler(void);
 extern void _mesa_destroy_shader_compiler_caches(void);
diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp
index 33cd79c..4af440a 100644
--- a/src/glsl/main.cpp
+++ b/src/glsl/main.cpp
@@ -145,7 +145,7 @@ compile_shader(struct gl_context *ctx, struct gl_shader *shader)
 
    const char *source = shader->Source;
    state->error = glcpp_preprocess(state, &source, &state->info_log,
-			     state->extensions, ctx->API) != 0;
+			     state->extensions, ctx) != 0;
 
    if (!state->error) {
       _mesa_glsl_lexer_ctor(state, source);
diff --git a/src/glsl/test_optpass.cpp b/src/glsl/test_optpass.cpp
index ce5df24..117b0b0 100644
--- a/src/glsl/test_optpass.cpp
+++ b/src/glsl/test_optpass.cpp
@@ -217,7 +217,7 @@ int test_optpass(int argc, char **argv)
       shader->Source = input.c_str();
       const char *source = shader->Source;
       state->error = glcpp_preprocess(state, &source, &state->info_log,
-                                state->extensions, ctx->API) != 0;
+                                state->extensions, ctx) != 0;
 
       if (!state->error) {
          _mesa_glsl_lexer_ctor(state, source);
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index d5b9683..0f7439b 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -3061,7 +3061,7 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader)
    }
 
    state->error = glcpp_preprocess(state, &source, &state->info_log,
-			     &ctx->Extensions, ctx->API);
+			     &ctx->Extensions, ctx);
 
    if (ctx->Shader.Flags & GLSL_DUMP) {
       printf("GLSL source for %s shader %d:\n",
-- 
1.7.10



More information about the mesa-dev mailing list