Mesa (master): glsl: add preprocessor support for #pragma

Brian Paul brianp at kemper.freedesktop.org
Tue Jan 13 22:09:54 UTC 2009


Module: Mesa
Branch: master
Commit: 01a0938776ad12e6560a17163bb7a6a3da9e9820
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=01a0938776ad12e6560a17163bb7a6a3da9e9820

Author: Brian Paul <brianp at vmware.com>
Date:   Tue Jan 13 15:06:52 2009 -0700

glsl: add preprocessor support for #pragma

Two forms are supported:

Pragmas are silently ignored at this time.

---

 .../shader/slang/library/slang_pp_directives.syn   |   20 +++++++++
 .../shader/slang/library/slang_pp_directives_syn.h |   11 +++++
 src/mesa/shader/slang/slang_preprocess.c           |   44 +++++++++++++++++++-
 3 files changed, 74 insertions(+), 1 deletions(-)

diff --git a/src/mesa/shader/slang/library/slang_pp_directives.syn b/src/mesa/shader/slang/library/slang_pp_directives.syn
index d4a3210..b51d168 100644
--- a/src/mesa/shader/slang/library/slang_pp_directives.syn
+++ b/src/mesa/shader/slang/library/slang_pp_directives.syn
@@ -79,6 +79,12 @@
 .emtcode BEHAVIOR_WARN    3
 .emtcode BEHAVIOR_DISABLE 4
 
+/*
+ * The PRAGMA_* symbols follow TOKEN_PRAGMA
+ */
+.emtcode PRAGMA_NO_PARAM 0
+.emtcode PRAGMA_PARAM    1
+
 source
    optional_directive .and .loop source_element .and '\0' .emit ESCAPE_TOKEN .emit TOKEN_END;
 
@@ -153,6 +159,7 @@ directive
    dir_elif .emit TOKEN_ELIF .or
    dir_endif .emit TOKEN_ENDIF .or
    dir_ext .emit TOKEN_EXTENSION .or
+   dir_pragma .emit TOKEN_PRAGMA .or
    dir_line .emit TOKEN_LINE;
 
 dir_define
@@ -187,6 +194,19 @@ dir_ext
 dir_line
    optional_space .and '#' .and optional_space .and "line" .and expression;
 
+dir_pragma
+   optional_space .and '#' .and optional_space .and "pragma" .and symbol .and opt_pragma_param;
+
+
+opt_pragma_param
+   pragma_param .or .true .emit PRAGMA_NO_PARAM;
+
+pragma_param
+   optional_space .and '(' .emit PRAGMA_PARAM .and optional_space .and symbol_no_space .and optional_space .and ')';
+
+symbol_no_space
+   symbol_character .emit * .and .loop symbol_character2 .emit * .and .true .emit '\0';
+
 symbol
    space .and symbol_character .emit * .and .loop symbol_character2 .emit * .and .true .emit '\0';
 
diff --git a/src/mesa/shader/slang/library/slang_pp_directives_syn.h b/src/mesa/shader/slang/library/slang_pp_directives_syn.h
index 35e7bc2..430f8d8 100644
--- a/src/mesa/shader/slang/library/slang_pp_directives_syn.h
+++ b/src/mesa/shader/slang/library/slang_pp_directives_syn.h
@@ -20,6 +20,8 @@
 ".emtcode BEHAVIOR_ENABLE 2\n"
 ".emtcode BEHAVIOR_WARN 3\n"
 ".emtcode BEHAVIOR_DISABLE 4\n"
+".emtcode PRAGMA_NO_PARAM 0\n"
+".emtcode PRAGMA_PARAM 1\n"
 "source\n"
 " optional_directive .and .loop source_element .and '\\0' .emit ESCAPE_TOKEN .emit TOKEN_END;\n"
 "source_element\n"
@@ -76,6 +78,7 @@
 " dir_elif .emit TOKEN_ELIF .or\n"
 " dir_endif .emit TOKEN_ENDIF .or\n"
 " dir_ext .emit TOKEN_EXTENSION .or\n"
+" dir_pragma .emit TOKEN_PRAGMA .or\n"
 " dir_line .emit TOKEN_LINE;\n"
 "dir_define\n"
 " optional_space .and '#' .and optional_space .and \"define\" .and symbol .and opt_parameters .and\n"
@@ -99,6 +102,14 @@
 " optional_space .and ':' .and optional_space .and extension_behavior;\n"
 "dir_line\n"
 " optional_space .and '#' .and optional_space .and \"line\" .and expression;\n"
+"dir_pragma\n"
+" optional_space .and '#' .and optional_space .and \"pragma\" .and symbol .and opt_pragma_param;\n"
+"opt_pragma_param\n"
+" pragma_param .or .true .emit PRAGMA_NO_PARAM;\n"
+"pragma_param\n"
+" optional_space .and '(' .emit PRAGMA_PARAM .and optional_space .and symbol_no_space .and optional_space .and ')';\n"
+"symbol_no_space\n"
+" symbol_character .emit * .and .loop symbol_character2 .emit * .and .true .emit '\\0';\n"
 "symbol\n"
 " space .and symbol_character .emit * .and .loop symbol_character2 .emit * .and .true .emit '\\0';\n"
 "opt_parameters\n"
diff --git a/src/mesa/shader/slang/slang_preprocess.c b/src/mesa/shader/slang/slang_preprocess.c
index 76e757c..244a091 100644
--- a/src/mesa/shader/slang/slang_preprocess.c
+++ b/src/mesa/shader/slang/slang_preprocess.c
@@ -51,6 +51,9 @@ grammar_error_to_log (slang_info_log *log)
    GLint pos;
 
    grammar_get_last_error ((byte *) (buf), sizeof (buf), &pos);
+   if (buf[0] == 0) {
+      _mesa_snprintf(buf, sizeof(buf), "Preprocessor error");
+   }
    slang_info_log_error (log, buf);
 }
 
@@ -529,6 +532,20 @@ pp_ext_set(pp_ext *self, const char *name, GLboolean enable)
 
 
 /**
+ * Called in response to #pragma.  For example, "#pragma debug(on)" would
+ * call this function as pp_pragma("debug", "on").
+ * At this time, pragmas are silently ignored.
+ */
+static void
+pp_pragma(const char *pragma, const char *param)
+{
+#if 0
+   printf("#pragma %s %s\n", pragma, param);
+#endif
+}
+
+
+/**
  * The state of preprocessor: current line, file and version number, list
  * of all defined macros and the #if/#endif context.
  */
@@ -862,6 +879,10 @@ parse_if (slang_string *output, const byte *prod, GLuint *pi, GLint *result, pp_
 #define BEHAVIOR_WARN    3
 #define BEHAVIOR_DISABLE 4
 
+#define PRAGMA_NO_PARAM  0
+#define PRAGMA_PARAM     1
+
+
 static GLboolean
 preprocess_source (slang_string *output, const char *source,
                    grammar pid, grammar eid,
@@ -940,9 +961,11 @@ preprocess_source (slang_string *output, const char *source,
       else {
          const char *id;
          GLuint idlen;
+         GLubyte token;
 
          i++;
-         switch (prod[i++]) {
+         token = prod[i++];
+         switch (token) {
 
          case TOKEN_END:
             /* End of source string.
@@ -1159,6 +1182,25 @@ preprocess_source (slang_string *output, const char *source,
             }
             break;
 
+         case TOKEN_PRAGMA:
+            {
+               GLint have_param;
+               const char *pragma, *param;
+
+               pragma = (const char *) (&prod[i]);
+               i += _mesa_strlen(pragma) + 1;
+               have_param = (prod[i++] == PRAGMA_PARAM);
+               if (have_param) {
+                  param = (const char *) (&prod[i]);
+                  i += _mesa_strlen(param) + 1;
+               }
+               else {
+                  param = NULL;
+               }
+               pp_pragma(pragma, param);
+            }
+            break;
+
          case TOKEN_LINE:
             id = (const char *) (&prod[i]);
             i += _mesa_strlen (id) + 1;




More information about the mesa-commit mailing list