Mesa (glsl-pp-rework-2): glsl/pp: Add sl_pp_context_add_extension().

Michał Król michal at kemper.freedesktop.org
Thu Dec 10 03:59:45 PST 2009


Module: Mesa
Branch: glsl-pp-rework-2
Commit: 91e164b3d0b1d36bfdf369266ae7e1ab396f1ba2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=91e164b3d0b1d36bfdf369266ae7e1ab396f1ba2

Author: Michal Krol <michal at vmware.com>
Date:   Thu Dec 10 12:38:22 2009 +0100

glsl/pp: Add sl_pp_context_add_extension().

This way third parties are able to add supported extension strings.

---

 src/glsl/pp/sl_pp_context.h   |   10 ++++++++
 src/glsl/pp/sl_pp_dict.c      |    2 -
 src/glsl/pp/sl_pp_dict.h      |    2 -
 src/glsl/pp/sl_pp_extension.c |   49 +++++++++++++++++++++++++++++++----------
 src/glsl/pp/sl_pp_macro.c     |   12 ++++++++++
 src/glsl/pp/sl_pp_public.h    |    5 ++++
 6 files changed, 64 insertions(+), 16 deletions(-)

diff --git a/src/glsl/pp/sl_pp_context.h b/src/glsl/pp/sl_pp_context.h
index 569a2d7..5e3ae72 100644
--- a/src/glsl/pp/sl_pp_context.h
+++ b/src/glsl/pp/sl_pp_context.h
@@ -37,6 +37,13 @@
 
 #define SL_PP_MAX_ERROR_MSG   1024
 
+#define SL_PP_MAX_EXTENSIONS  16
+
+struct sl_pp_extension {
+   int name;         /*< VENDOR_extension_name */
+   int name_string;  /*< GL_VENDOR_extension_name */
+};
+
 struct sl_pp_context {
    char *cstr_pool;
    unsigned int cstr_pool_max;
@@ -46,6 +53,9 @@ struct sl_pp_context {
    struct sl_pp_macro *macro;
    struct sl_pp_macro **macro_tail;
 
+   struct sl_pp_extension extensions[SL_PP_MAX_EXTENSIONS];
+   unsigned int num_extensions;
+
    unsigned int if_stack[SL_PP_MAX_IF_NESTING];
    unsigned int if_ptr;
    unsigned int if_value;
diff --git a/src/glsl/pp/sl_pp_dict.c b/src/glsl/pp/sl_pp_dict.c
index 2dd77a6..062139e 100644
--- a/src/glsl/pp/sl_pp_dict.c
+++ b/src/glsl/pp/sl_pp_dict.c
@@ -45,8 +45,6 @@ int
 sl_pp_dict_init(struct sl_pp_context *context)
 {
    ADD_NAME(context, all);
-   ADD_NAME_STR(context, _GL_ARB_draw_buffers, "GL_ARB_draw_buffers");
-   ADD_NAME_STR(context, _GL_ARB_texture_rectangle, "GL_ARB_texture_rectangle");
 
    ADD_NAME(context, require);
    ADD_NAME(context, enable);
diff --git a/src/glsl/pp/sl_pp_dict.h b/src/glsl/pp/sl_pp_dict.h
index 49f0e0b..875217b 100644
--- a/src/glsl/pp/sl_pp_dict.h
+++ b/src/glsl/pp/sl_pp_dict.h
@@ -33,8 +33,6 @@ struct sl_pp_context;
 
 struct sl_pp_dict {
    int all;
-   int _GL_ARB_draw_buffers;
-   int _GL_ARB_texture_rectangle;
 
    int require;
    int enable;
diff --git a/src/glsl/pp/sl_pp_extension.c b/src/glsl/pp/sl_pp_extension.c
index 4148fd9..67b2440 100644
--- a/src/glsl/pp/sl_pp_extension.c
+++ b/src/glsl/pp/sl_pp_extension.c
@@ -28,23 +28,42 @@
 #include <stdlib.h>
 #include <string.h>
 #include "sl_pp_process.h"
+#include "sl_pp_public.h"
 
 
 int
+sl_pp_context_add_extension(struct sl_pp_context *context,
+                            const char *name,
+                            const char *name_string)
+{
+   struct sl_pp_extension ext;
+
+   if (context->num_extensions == SL_PP_MAX_EXTENSIONS) {
+      return -1;
+   }
+
+   ext.name = sl_pp_context_add_unique_str(context, name);
+   if (ext.name == -1) {
+      return -1;
+   }
+
+   ext.name_string = sl_pp_context_add_unique_str(context, name_string);
+   if (ext.name_string == -1) {
+      return -1;
+   }
+
+   context->extensions[context->num_extensions++] = ext;
+   return 0;
+}
+
+int
 sl_pp_process_extension(struct sl_pp_context *context,
                         const struct sl_pp_token_info *input,
                         unsigned int first,
                         unsigned int last,
                         struct sl_pp_process_state *state)
 {
-   int extensions[] = {
-      context->dict.all,
-      context->dict._GL_ARB_draw_buffers,
-      context->dict._GL_ARB_texture_rectangle,
-      -1
-   };
    int extension_name = -1;
-   int *ext;
    int behavior = -1;
    struct sl_pp_token_info out;
 
@@ -59,11 +78,17 @@ sl_pp_process_extension(struct sl_pp_context *context,
    }
 
    /* Make sure the extension is supported. */
-   out.data.extension = -1;
-   for (ext = extensions; *ext != -1; ext++) {
-      if (extension_name == *ext) {
-         out.data.extension = extension_name;
-         break;
+   if (extension_name == context->dict.all) {
+      out.data.extension = extension_name;
+   } else {
+      unsigned int i;
+
+      out.data.extension = -1;
+      for (i = 0; i < context->num_extensions; i++) {
+         if (extension_name == context->extensions[i].name_string) {
+            out.data.extension = extension_name;
+            break;
+         }
       }
    }
 
diff --git a/src/glsl/pp/sl_pp_macro.c b/src/glsl/pp/sl_pp_macro.c
index 29f1229..05466c9 100644
--- a/src/glsl/pp/sl_pp_macro.c
+++ b/src/glsl/pp/sl_pp_macro.c
@@ -163,6 +163,18 @@ sl_pp_macro_expand(struct sl_pp_context *context,
       return 0;
    }
 
+   /* Replace extension names with 1.
+    */
+   for (j = 0; j < context->num_extensions; j++) {
+      if (macro_name == context->extensions[j].name) {
+         if (!mute && _out_number(context, state, 1)) {
+            return -1;
+         }
+         (*pi)++;
+         return 0;
+      }
+   }
+
    /* TODO: For FEATURE_es2_glsl, expand to 1 the following symbols.
     *       GL_ES
     *       GL_FRAGMENT_PRECISION_HIGH
diff --git a/src/glsl/pp/sl_pp_public.h b/src/glsl/pp/sl_pp_public.h
index 8317c7e..20f2089 100644
--- a/src/glsl/pp/sl_pp_public.h
+++ b/src/glsl/pp/sl_pp_public.h
@@ -46,6 +46,11 @@ const char *
 sl_pp_context_error_message(const struct sl_pp_context *context);
 
 int
+sl_pp_context_add_extension(struct sl_pp_context *context,
+                            const char *name,
+                            const char *name_string);
+
+int
 sl_pp_context_add_unique_str(struct sl_pp_context *context,
                              const char *str);
 



More information about the mesa-commit mailing list