+/* When the first GL call is made, (that is, after the OpenGL context
+ * has been initialized with glX or some other system), then we can
+ * finally implement the "glenv --query" option if it was specified.
+ *
+ * Similarly, at this point, we can read the original extensions
+ * string from the OpenGL environment and modify it according to the
+ * blacklist or whitelist that the user may have specified.
+ */
+void glenv_first_gl_call (void);
+
+void
+glenv_first_gl_call (void)
+{
+ get_string_type_t *get_string = glaze_lookup ("glGetString");
+ char *orig_extensions;
+ const char *extension;
+
+ orig_extensions = xstrdup ((char *) get_string (GL_EXTENSIONS));
+
+ if (getenv ("GLENV_GL_EXTENSIONS"))
+ {
+ glenv_gl_extensions = getenv ("GLENV_GL_EXTENSIONS");
+ }
+ else if (getenv ("GLENV_GL_EXTENSIONS_BLACKLIST"))
+ {
+ const char *blacklist = getenv ("GLENV_GL_EXTENSIONS_BLACKLIST");
+
+ for (extension = strtok (orig_extensions, " ");
+ extension;
+ extension = strtok (NULL, " "))
+ {
+ if (! extension_list_contains (blacklist, extension))
+ extension_list_append (&glenv_gl_extensions, extension);
+ }
+ }
+ else if (getenv ("GLENV_GL_EXTENSIONS_WHITELIST"))
+ {
+ const char *whitelist = getenv ("GLENV_GL_EXTENSIONS_WHITELIST");
+
+ for (extension = strtok (orig_extensions, " ");
+ extension;
+ extension = strtok (NULL, " "))
+ {
+ if (extension_list_contains (whitelist, extension))
+ extension_list_append (&glenv_gl_extensions, extension);
+ }
+ }
+
+ free (orig_extensions);
+
+ if (glenv_gl_extensions) {
+ int i;
+ char *extensions_copy;
+
+ glenv_num_gl_extensions = extension_list_count (glenv_gl_extensions);
+
+ glenv_gl_extensions_array = malloc (sizeof (char *) * glenv_num_gl_extensions);
+
+ extensions_copy = xstrdup (glenv_gl_extensions);
+
+ for (i = 0, extension = strtok (extensions_copy, " ");
+ extension;
+ i++, extension = strtok (NULL, " "))
+ {
+ glenv_gl_extensions_array[i] = xstrdup (extension);
+ }
+
+ free (extensions_copy);
+ }
+
+ /* We deliberately call glGetString directly here rather than
+ * use the get_string function pointer to the underlying
+ * glGetString function. That's because we want --query to
+ * reflect any modifications the user made with other
+ * options. */
+ if (getenv ("GLENV_QUERY")) {
+ printf ("--vendor=\"%s\"\n", glGetString (GL_VENDOR));
+ printf ("--renderer=\"%s\"\n", glGetString (GL_RENDERER));
+ printf ("--version=\"%s\"\n", glGetString (GL_VERSION));
+ printf ("--shading-language-version=\"%s\"\n", glGetString (GL_SHADING_LANGUAGE_VERSION));
+ printf ("--extensions=\"%s\"\n", glGetString (GL_EXTENSIONS));
+
+ exit (0);
+ }
+}
+