sl/pp: re-do extension testing code
authorBrian Paul <brianp@vmware.com>
Tue, 16 Feb 2010 17:42:05 +0000 (10:42 -0700)
committerBrian Paul <brianp@vmware.com>
Tue, 16 Feb 2010 17:43:36 +0000 (10:43 -0700)
The #extension directive should not effect which extension preprocessor
symbols are defined/undefined; only whether/how the compiler accepts
language features defined by the extension.

src/glsl/pp/sl_pp_context.h
src/glsl/pp/sl_pp_extension.c
src/glsl/pp/sl_pp_if.c
src/glsl/pp/sl_pp_public.h

index b5419bc..1232f1e 100644 (file)
 
 #define SL_PP_MAX_PREDEFINED  16
 
+enum sl_pp_extension_state {
+   SL_PP_EXTENSION_STATE_ENABLED,
+   SL_PP_EXTENSION_STATE_DISABLED,
+   SL_PP_EXTENSION_STATE_WARN,
+   SL_PP_EXTENSION_STATE_REQUIRE
+};
+
 struct sl_pp_extension {
    int name;   /*< GL_VENDOR_extension_name */
-   int enabled;
+   enum sl_pp_extension_state state;
 };
 
 struct sl_pp_predefined {
index 1f00d94..0816e81 100644 (file)
@@ -53,7 +53,7 @@ sl_pp_context_add_extension(struct sl_pp_context *context,
       return -1;
    }
 
-   ext.enabled = 0;
+   ext.state = SL_PP_EXTENSION_STATE_DISABLED;
 
    context->extensions[context->num_extensions++] = ext;
 
@@ -62,6 +62,24 @@ sl_pp_context_add_extension(struct sl_pp_context *context,
    return 0;
 }
 
+
+enum sl_pp_extension_state
+sl_pp_get_extension_state(const struct sl_pp_context *context,
+                          int extension_name)
+{
+   unsigned i;
+
+   for (i = 0; i < context->num_extensions; i++) {
+      if (extension_name == context->extensions[i].name) {
+         return context->extensions[i].state;
+      }
+   }
+
+   assert(0 && "unknown extension");
+   return SL_PP_EXTENSION_STATE_DISABLED;
+}
+
+
 /**
  * Process a "#extension name: behavior" directive.
  */
@@ -140,7 +158,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
 
       if (extension_name != context->dict.all) {
          assert(extension);
-         extension->enabled = 1;
+         extension->state = SL_PP_EXTENSION_STATE_REQUIRE;
       }
    } else if (behavior == context->dict.enable) {
       if (out.data.extension == -1) {
@@ -155,7 +173,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
 
       if (extension_name != context->dict.all) {
          assert(extension);
-         extension->enabled = 1;
+         extension->state = SL_PP_EXTENSION_STATE_ENABLED;
       }
    } else if (behavior == context->dict.warn) {
       if (out.data.extension == -1) {
@@ -166,7 +184,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
 
       if (extension_name != context->dict.all) {
          assert(extension);
-         extension->enabled = 1;
+         extension->state = SL_PP_EXTENSION_STATE_WARN;
       }
    } else if (behavior == context->dict.disable) {
       if (out.data.extension == -1) {
@@ -177,7 +195,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
 
       if (extension_name != context->dict.all) {
          assert(extension);
-         extension->enabled = 0;
+         extension->state = SL_PP_EXTENSION_STATE_DISABLED;
       }
    } else {
       strcpy(context->error_msg, "unrecognised behavior name");
index e233999..25cb7a3 100644 (file)
@@ -40,7 +40,7 @@ _macro_is_defined(struct sl_pp_context *context,
 
    for (i = 0; i < context->num_extensions; i++) {
       if (macro_name == context->extensions[i].name) {
-         return context->extensions[i].enabled;
+         return 1;
       }
    }
 
index ca6f722..e4ad80d 100644 (file)
@@ -55,6 +55,10 @@ int
 sl_pp_context_add_extension(struct sl_pp_context *context,
                             const char *name);
 
+enum sl_pp_extension_state
+sl_pp_get_extension_state(const struct sl_pp_context *context,
+                          int extension_name);
+
 int
 sl_pp_context_add_predefined(struct sl_pp_context *context,
                              const char *name,