glsl/pp: fix extension enable/disable options
authorBrian Paul <brianp@vmware.com>
Wed, 10 Feb 2010 17:49:48 +0000 (10:49 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 10 Feb 2010 17:49:50 +0000 (10:49 -0700)
Now the #extension name: disable/enable flags do the right thing.

Fixes glean/glsl1 "Preprocessor test (extension test 3)"

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

index 7b9f494f130a2a0665db86246f88035f25838030..983a09c02af6127dbf78cae5cff5bd45113333e7 100644 (file)
@@ -45,6 +45,7 @@
 
 struct sl_pp_extension {
    int name;   /*< GL_VENDOR_extension_name */
+   int enabled;
 };
 
 struct sl_pp_predefined {
index 630a7975c75ddde494ba18b6a6bb91cd6881b359..777e42d0fc97fb6ded96ed4818c6827684831ed3 100644 (file)
 #include "sl_pp_public.h"
 
 
+/**
+ * Declare an extension to the preprocessor.  This tells the preprocessor
+ * which extensions are supported by Mesa.
+ * The shader still needs to have a "#extension name: behavior" line to enable
+ * the extension.
+ */
 int
 sl_pp_context_add_extension(struct sl_pp_context *context,
                             const char *name)
@@ -47,10 +53,18 @@ sl_pp_context_add_extension(struct sl_pp_context *context,
       return -1;
    }
 
+   ext.enabled = 0;
+
    context->extensions[context->num_extensions++] = ext;
+
+   assert(context->num_extensions <= sizeof(context->extensions));
+
    return 0;
 }
 
+/**
+ * Process a "#extension name: behavior" directive.
+ */
 int
 sl_pp_process_extension(struct sl_pp_context *context,
                         const struct sl_pp_token_info *input,
@@ -61,6 +75,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
    int extension_name = -1;
    int behavior = -1;
    struct sl_pp_token_info out;
+   struct sl_pp_extension *extension = NULL;
 
    /* Grab the extension name. */
    if (first < last && input[first].token == SL_PP_IDENTIFIER) {
@@ -82,6 +97,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
       for (i = 0; i < context->num_extensions; i++) {
          if (extension_name == context->extensions[i].name) {
             out.data.extension = extension_name;
+            extension = &context->extensions[i];
             break;
          }
       }
@@ -121,6 +137,7 @@ sl_pp_process_extension(struct sl_pp_context *context,
          return -1;
       }
       out.token = SL_PP_EXTENSION_REQUIRE;
+      extension->enabled = 1;
    } else if (behavior == context->dict.enable) {
       if (out.data.extension == -1) {
          /* Warning: the extension cannot be enabled. */
@@ -131,18 +148,21 @@ sl_pp_process_extension(struct sl_pp_context *context,
          return -1;
       }
       out.token = SL_PP_EXTENSION_ENABLE;
+      extension->enabled = 1;
    } else if (behavior == context->dict.warn) {
       if (out.data.extension == -1) {
          /* Warning: the extension is not supported. */
          return 0;
       }
       out.token = SL_PP_EXTENSION_WARN;
+      extension->enabled = 0;
    } else if (behavior == context->dict.disable) {
       if (out.data.extension == -1) {
          /* Warning: the extension is not supported. */
          return 0;
       }
       out.token = SL_PP_EXTENSION_DISABLE;
+      extension->enabled = 0;
    } else {
       strcpy(context->error_msg, "unrecognised behavior name");
       return -1;
index 3ddbcc84af8a368dea0a50920a9f36ab8a32a5e4..272c3a23ccee2beb792e3c505e4e67cfa953b9e9 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 1;
+         return context->extensions[i].enabled;
       }
    }