glsl/pp: Add sl_pp_context_add_extension().
authorMichal Krol <michal@vmware.com>
Thu, 10 Dec 2009 11:38:22 +0000 (12:38 +0100)
committerMichal Krol <michal@vmware.com>
Thu, 10 Dec 2009 11:38:22 +0000 (12:38 +0100)
This way third parties are able to add supported extension strings.

src/glsl/pp/sl_pp_context.h
src/glsl/pp/sl_pp_dict.c
src/glsl/pp/sl_pp_dict.h
src/glsl/pp/sl_pp_extension.c
src/glsl/pp/sl_pp_macro.c
src/glsl/pp/sl_pp_public.h

index 569a2d735b94807d2ff4a9800c54bed3d9a64b76..5e3ae72fdfa1cba66ad6ab866b546458db3da35d 100644 (file)
 
 #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;
index 2dd77a69e900fc8e3c6540b1caf645077936562a..062139e6ac03deea511602d537de6c951a0fc24a 100644 (file)
@@ -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);
index 49f0e0bf9fa337d3f7fd9d8b30e80841d9615e64..875217bd30913a4cecb7d6833ca6b6e2a3bec334 100644 (file)
@@ -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;
index 4148fd9a5a304664b26b703bedc2e11a5dfeda03..67b24404d4da9e2391176f936cf6a8ba582ffaae 100644 (file)
 #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,
@@ -37,14 +63,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
                         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;
+         }
       }
    }
 
index 29f1229dd7d835a8994c1067aadfa55e61e8ec5b..05466c9a7c39f8cbcb0b6292c08f1d8be83890aa 100644 (file)
@@ -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
index 8317c7e378ab06a153724a184e92c738a746bc68..20f208975e4d2bc789a2ff23f7d5faeeaaadffd0 100644 (file)
@@ -45,6 +45,11 @@ sl_pp_context_destroy(struct sl_pp_context *context);
 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);