Simplify extension string handling.
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 3 Jul 2003 02:15:06 +0000 (02:15 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 3 Jul 2003 02:15:06 +0000 (02:15 +0000)
src/mesa/main/context.c
src/mesa/main/extensions.c
src/mesa/main/extensions.h
src/mesa/main/get.c
src/mesa/main/mtypes.h

index 666e3403a27a9b6d2210e3663de5bf1b48595098..cd4c66671589777e9a37ce1a70edf2af63ae0c24 100644 (file)
@@ -1202,7 +1202,7 @@ init_attrib_groups( GLcontext *ctx )
    ctx->MinMax.Min[ACOMP] = 1000;    ctx->MinMax.Max[ACOMP] = -1000;
 
    /* Extensions */
-   _mesa_extensions_ctr( ctx );
+   _mesa_init_extensions( ctx );
 
    /* Lighting group */
    for (i=0;i<MAX_LIGHTS;i++) {
@@ -1682,9 +1682,10 @@ static void add_debug_flags( const char *debug )
 }
 
 
-/*
+/**
  * Initialize a GLcontext struct.  This includes allocating all the
  * other structs and arrays which hang off of the context by pointers.
+ * \note the direct parameter is ignored (obsolete).
  */
 GLboolean
 _mesa_initialize_context( GLcontext *ctx,
@@ -1923,12 +1924,12 @@ _mesa_initialize_context( GLcontext *ctx,
 
 
 
-/*
+/**
  * Allocate and initialize a GLcontext structure.
  * Input:  visual - a GLvisual pointer (we copy the struct contents)
  *         sharelist - another context to share display lists with or NULL
  *         driver_ctx - pointer to device driver's context state struct
- *         direct - direct rendering?
+ *         direct - obsolete, ignored
  * Return:  pointer to a new __GLcontextRec or NULL if error.
  */
 GLcontext *
@@ -2078,7 +2079,8 @@ _mesa_free_context_data( GLcontext *ctx )
 
    _math_matrix_dtr(&ctx->Viewport._WindowMap);
 
-   _mesa_extensions_dtr(ctx);
+   if (ctx->Extensions.String)
+      FREE((void *) ctx->Extensions.String);
 
    FREE(ctx->Exec);
    FREE(ctx->Save);
index 3b7c21a1622b599b277c90e244f17f5ac8f10f4d..4c0faf3a18dd1d64572914ac088ef157852fef9c 100644 (file)
 #include "mtypes.h"
 
 
-#define MAX_EXT_NAMELEN 80
-
-struct extension {
-   struct extension *next, *prev;
-   GLint enabled;
-   GLboolean *flag;                    /* optional flag stored elsewhere */
-   char name[MAX_EXT_NAMELEN+1];
-   void (*notify)( GLcontext *, GLboolean );
-};
-
 #define F(x) (int)&(((struct gl_extensions *)0)->x)
 #define ON GL_TRUE
 #define OFF GL_FALSE
 
+
 static const struct {
    GLboolean enabled;
    const char *name;
@@ -121,7 +112,7 @@ static const struct {
    { OFF, "GL_IBM_texture_mirrored_repeat",    F(ARB_texture_mirrored_repeat)},
    { OFF, "GL_INGR_blend_func_separate",       F(EXT_blend_func_separate) },
    { OFF, "GL_MESA_pack_invert",               F(MESA_pack_invert) },
-   { OFF, "GL_MESA_packed_depth_stencil",      0 },
+   { OFF, "GL_MESA_packed_depth_stencil",      F(MESA_packed_depth_stencil) },
    { OFF, "GL_MESA_resize_buffers",            F(MESA_resize_buffers) },
    { OFF, "GL_MESA_ycbcr_texture",             F(MESA_ycbcr_texture) },
    { ON,  "GL_MESA_window_pos",                F(ARB_window_pos) },
@@ -149,352 +140,286 @@ static const struct {
 
 
 
-
-/*
+/**
  * Enable all extensions suitable for a software-only renderer.
  * This is a convenience function used by the XMesa, OSMesa, GGI drivers, etc.
  */
 void
 _mesa_enable_sw_extensions(GLcontext *ctx)
 {
-   const char *extensions[] = {
-      "GL_ARB_depth_texture",
+   ctx->Extensions.ARB_depth_texture = GL_TRUE;
 #if FEATURE_ARB_fragment_program
-      "GL_ARB_fragment_program",
+   /*ctx->Extensions.ARB_fragment_program = GL_TRUE;*/
 #endif
-      "GL_ARB_imaging",
-      "GL_ARB_multitexture",
+   ctx->Extensions.ARB_imaging = GL_TRUE;
+   ctx->Extensions.ARB_multitexture = GL_TRUE;
 #if FEATURE_ARB_occlusion_query
-      "GL_ARB_occlusion_query",
+   ctx->Extensions.ARB_occlusion_query = GL_TRUE;
 #endif
-      "GL_ARB_point_parameters",
-      "GL_ARB_shadow",
-      "GL_ARB_shadow_ambient",
-      "GL_ARB_texture_border_clamp",
-      "GL_ARB_texture_cube_map",
-      "GL_ARB_texture_env_add",
-      "GL_ARB_texture_env_combine",
-      "GL_ARB_texture_env_crossbar",
-      "GL_ARB_texture_env_dot3",
-      "GL_ARB_texture_mirrored_repeat",
+   ctx->Extensions.ARB_shadow = GL_TRUE;
+   ctx->Extensions.ARB_texture_border_clamp = GL_TRUE;
+   ctx->Extensions.ARB_texture_cube_map = GL_TRUE;
+   ctx->Extensions.ARB_texture_env_combine = GL_TRUE;
+   ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE;
+   ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE;
+   ctx->Extensions.ARB_texture_mirrored_repeat = GL_TRUE;
 #if FEATURE_ARB_vertex_program
-      "GL_ARB_vertex_program",
+   /*ctx->Extensions.ARB_vertex_program = GL_TRUE;*/
 #endif
-      "GL_ATI_texture_env_combine3",
-      "GL_ATI_texture_mirror_once",
-      "GL_EXT_blend_color",
-      "GL_EXT_blend_func_separate",
-      "GL_EXT_blend_logic_op",
-      "GL_EXT_blend_minmax",
-      "GL_EXT_blend_subtract",
-      "GL_EXT_convolution",
-      "GL_EXT_depth_bounds_test",
-      "GL_EXT_fog_coord",
-      "GL_EXT_histogram",
-      "GL_EXT_paletted_texture",
-      "GL_EXT_point_parameters",
-      "GL_EXT_shadow_funcs",
-      "GL_EXT_secondary_color",
-      "GL_EXT_shared_texture_palette",
-      "GL_EXT_stencil_wrap",
-      "GL_EXT_stencil_two_side",
-      "GL_EXT_texture_edge_clamp",
-      "GL_EXT_texture_env_add",
-      "GL_EXT_texture_env_combine",
-      "GL_EXT_texture_env_dot3",
-      "GL_EXT_texture_lod_bias",
-      "GL_EXT_texture_rectangle",
-      "GL_HP_occlusion_test",
-      "GL_IBM_texture_mirrored_repeat",
-      "GL_INGR_blend_func_separate",
-      "GL_MESA_pack_invert",
-      "GL_MESA_resize_buffers",
-      "GL_MESA_ycbcr_texture",
-      "GL_NV_blend_square",
-      "GL_NV_light_max_exponent",
-      "GL_NV_point_sprite",
-      "GL_NV_texture_rectangle",
-      "GL_NV_texgen_reflection",
+   ctx->Extensions.ATI_texture_env_combine3 = GL_TRUE;
+   ctx->Extensions.ATI_texture_mirror_once = GL_TRUE;
+   ctx->Extensions.EXT_blend_color = GL_TRUE;
+   ctx->Extensions.EXT_blend_func_separate = GL_TRUE;
+   ctx->Extensions.EXT_blend_logic_op = GL_TRUE;
+   ctx->Extensions.EXT_blend_minmax = GL_TRUE;
+   ctx->Extensions.EXT_blend_subtract = GL_TRUE;
+   ctx->Extensions.EXT_convolution = GL_TRUE;
+   ctx->Extensions.EXT_depth_bounds_test = GL_TRUE;
+   ctx->Extensions.EXT_fog_coord = GL_TRUE;
+   ctx->Extensions.EXT_histogram = GL_TRUE;
+   ctx->Extensions.EXT_paletted_texture = GL_TRUE;
+   ctx->Extensions.EXT_point_parameters = GL_TRUE;
+   ctx->Extensions.EXT_shadow_funcs = GL_TRUE;
+   ctx->Extensions.EXT_secondary_color = GL_TRUE;
+   ctx->Extensions.EXT_shared_texture_palette = GL_TRUE;
+   ctx->Extensions.EXT_stencil_wrap = GL_TRUE;
+   ctx->Extensions.EXT_stencil_two_side = GL_TRUE;
+   ctx->Extensions.EXT_texture_env_add = GL_TRUE;
+   ctx->Extensions.EXT_texture_env_combine = GL_TRUE;
+   ctx->Extensions.EXT_texture_env_dot3 = GL_TRUE;
+   ctx->Extensions.EXT_texture_lod_bias = GL_TRUE;
+   ctx->Extensions.HP_occlusion_test = GL_TRUE;
+   ctx->Extensions.MESA_pack_invert = GL_TRUE;
+   ctx->Extensions.MESA_resize_buffers = GL_TRUE;
+   ctx->Extensions.MESA_ycbcr_texture = GL_TRUE;
+   ctx->Extensions.NV_blend_square = GL_TRUE;
+   /*ctx->Extensions.NV_light_max_exponent = GL_TRUE;*/
+   ctx->Extensions.NV_point_sprite = GL_TRUE;
+   ctx->Extensions.NV_texture_rectangle = GL_TRUE;
+   /*ctx->Extensions.NV_texgen_reflection = GL_TRUE;*/
 #if FEATURE_NV_vertex_program
-      "GL_NV_vertex_program",
-      "GL_NV_vertex_program1_1",
+   ctx->Extensions.NV_vertex_program = GL_TRUE;
+   ctx->Extensions.NV_vertex_program1_1 = GL_TRUE;
 #endif
 #if FEATURE_NV_fragment_program
-      "GL_NV_fragment_program",
+   ctx->Extensions.NV_fragment_program = GL_TRUE;
 #endif
-      "GL_SGI_color_matrix",
-      "GL_SGI_color_table",
-      "GL_SGI_texture_color_table",
-      "GL_SGIS_generate_mipmap",
-      "GL_SGIS_pixel_texture",
-      "GL_SGIS_texture_edge_clamp",
-      "GL_SGIS_texture_border_clamp",
-      "GL_SGIX_depth_texture",
-      "GL_SGIX_pixel_texture",
-      "GL_SGIX_shadow",
-      "GL_SGIX_shadow_ambient",
-      NULL
-   };
-   GLuint i;
-
-   for (i = 0; extensions[i]; i++) {
-      _mesa_enable_extension(ctx, extensions[i]);
-   }
+   ctx->Extensions.SGI_color_matrix = GL_TRUE;
+   ctx->Extensions.SGI_color_table = GL_TRUE;
+   ctx->Extensions.SGI_texture_color_table = GL_TRUE;
+   ctx->Extensions.SGIS_generate_mipmap = GL_TRUE;
+   ctx->Extensions.SGIS_pixel_texture = GL_TRUE;
+   ctx->Extensions.SGIS_texture_edge_clamp = GL_TRUE;
+   ctx->Extensions.SGIX_depth_texture = GL_TRUE;
+   ctx->Extensions.SGIX_pixel_texture = GL_TRUE;
+   ctx->Extensions.SGIX_shadow = GL_TRUE;
+   ctx->Extensions.SGIX_shadow_ambient = GL_TRUE;
 }
 
 
-/*
+/**
  * Enable GL_ARB_imaging and all the EXT extensions that are subsets of it.
  */
 void
 _mesa_enable_imaging_extensions(GLcontext *ctx)
 {
-   const char *extensions[] = {
-      "GL_ARB_imaging",
-      "GL_EXT_blend_color",
-      "GL_EXT_blend_minmax",
-      "GL_EXT_blend_subtract",
-      "GL_EXT_convolution",
-      "GL_EXT_histogram",
-      "GL_SGI_color_matrix",
-      "GL_SGI_color_table",
-      NULL
-   };
-   GLuint i;
-
-   for (i = 0; extensions[i]; i++) {
-      _mesa_enable_extension(ctx, extensions[i]);
-   }
+   ctx->Extensions.ARB_imaging = GL_TRUE;
+   ctx->Extensions.EXT_blend_color = GL_TRUE;
+   ctx->Extensions.EXT_blend_minmax = GL_TRUE;
+   ctx->Extensions.EXT_blend_subtract = GL_TRUE;
+   ctx->Extensions.EXT_convolution = GL_TRUE;
+   ctx->Extensions.EXT_histogram = GL_TRUE;
+   ctx->Extensions.SGI_color_matrix = GL_TRUE;
+   ctx->Extensions.SGI_color_table = GL_TRUE;
 }
 
 
 
-/*
+/**
  * Enable all OpenGL 1.3 features and extensions.
+ * A convenience function to be called by drivers.
  */
 void
 _mesa_enable_1_3_extensions(GLcontext *ctx)
 {
-   const char *extensions[] = {
-      "GL_ARB_multisample",
-      "GL_ARB_multitexture",
-      "GL_ARB_texture_border_clamp",
-      "GL_ARB_texture_compression",
-      "GL_ARB_texture_cube_map",
-      "GL_ARB_texture_env_add",
-      "GL_ARB_texture_env_combine",
-      "GL_ARB_texture_env_dot3",
-      "GL_ARB_transpose_matrix",
-      NULL
-   };
-   GLuint i;
-
-   for (i = 0; extensions[i]; i++) {
-      _mesa_enable_extension(ctx, extensions[i]);
-   }
+   ctx->Extensions.ARB_multisample = GL_TRUE;
+   ctx->Extensions.ARB_multitexture = GL_TRUE;
+   ctx->Extensions.ARB_texture_border_clamp = GL_TRUE;
+   ctx->Extensions.ARB_texture_compression = GL_TRUE;
+   ctx->Extensions.ARB_texture_cube_map = GL_TRUE;
+   ctx->Extensions.ARB_texture_env_combine = GL_TRUE;
+   ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE;
+   ctx->Extensions.EXT_texture_env_add = GL_TRUE;
+   /*ctx->Extensions.ARB_transpose_matrix = GL_TRUE;*/
 }
 
 
 
-/*
+/**
  * Enable all OpenGL 1.4 features and extensions.
+ * A convenience function to be called by drivers.
  */
 void
 _mesa_enable_1_4_extensions(GLcontext *ctx)
 {
-   const char *extensions[] = {
-      "GL_ARB_depth_texture",
-      "GL_ARB_point_parameters",
-      "GL_ARB_shadow",
-      "GL_ARB_texture_env_crossbar",
-      "GL_ARB_texture_mirrored_repeat",
-      "GL_ARB_window_pos",
-      "GL_EXT_blend_color",
-      "GL_EXT_blend_func_separate",
-      "GL_EXT_blend_logic_op",
-      "GL_EXT_blend_minmax",
-      "GL_EXT_blend_subtract",
-      "GL_EXT_fog_coord",
-      "GL_EXT_multi_draw_arrays",
-      "GL_EXT_secondary_color",
-      "GL_EXT_stencil_wrap",
-      "GL_SGIS_generate_mipmap",
-      NULL
-   };
-   GLuint i;
-
-   for (i = 0; extensions[i]; i++) {
-      _mesa_enable_extension(ctx, extensions[i]);
-   }
+   ctx->Extensions.ARB_depth_texture = GL_TRUE;
+   ctx->Extensions.ARB_shadow = GL_TRUE;
+   ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE;
+   ctx->Extensions.ARB_texture_mirrored_repeat = GL_TRUE;
+   ctx->Extensions.ARB_window_pos = GL_TRUE;
+   ctx->Extensions.EXT_blend_color = GL_TRUE;
+   ctx->Extensions.EXT_blend_func_separate = GL_TRUE;
+   ctx->Extensions.EXT_blend_logic_op = GL_TRUE;
+   ctx->Extensions.EXT_blend_minmax = GL_TRUE;
+   ctx->Extensions.EXT_blend_subtract = GL_TRUE;
+   ctx->Extensions.EXT_fog_coord = GL_TRUE;
+   ctx->Extensions.EXT_multi_draw_arrays = GL_TRUE;
+   ctx->Extensions.EXT_point_parameters = GL_TRUE;
+   ctx->Extensions.EXT_secondary_color = GL_TRUE;
+   ctx->Extensions.EXT_stencil_wrap = GL_TRUE;
+   ctx->Extensions.SGIS_generate_mipmap = GL_TRUE;
 }
 
 
-
-/*
- * Add a new extenstion.  This would be called from a Mesa driver.
+/**
+ * Enable all OpenGL 1.5 features and extensions.
+ * A convenience function to be called by drivers.
+ * XXX TENTATIVE!!!
  */
 void
-_mesa_add_extension( GLcontext *ctx,
-                     GLboolean enabled,
-                     const char *name,
-                     GLboolean *flag_ptr )
+_mesa_enable_1_5_extensions(GLcontext *ctx)
 {
-   /* We should never try to add an extension after
-    * _mesa_extensions_get_string() has been called!
-    */
-   assert(ctx->Extensions.ext_string == 0);
-
-   {
-      struct extension *t = MALLOC_STRUCT(extension);
-      t->enabled = enabled;
-      _mesa_strncpy(t->name, name, MAX_EXT_NAMELEN);
-      t->name[MAX_EXT_NAMELEN] = 0;
-      t->flag = flag_ptr;
-      if (t->flag)
-         *t->flag = enabled;
-      insert_at_tail( ctx->Extensions.ext_list, t );
-   }
+   ctx->Extensions.ARB_occlusion_query = GL_TRUE;
+   ctx->Extensions.ARB_vertex_buffer_object = GL_TRUE;
 }
 
 
-/*
+/**
  * Either enable or disable the named extension.
  */
 static void
-set_extension( GLcontext *ctx, const char *name, GLint state )
+set_extension( GLcontext *ctx, const char *name, GLboolean state )
 {
-   /* XXX we should assert that ext_string is null.  We should never be
-    * enabling/disabling extensions after _mesa_extensions_get_string()
-    * has been called!
-    */
-   struct extension *i;
-   foreach( i, ctx->Extensions.ext_list )
-      if (_mesa_strncmp(i->name, name, MAX_EXT_NAMELEN) == 0)
-        break;
-
-   if (i == ctx->Extensions.ext_list) {
-      /* this is an error.  Drivers should never try to enable/disable
-       * an extension which is unknown to Mesa or wasn't added by calling
-       * _mesa_add_extension().
-       */
+   GLboolean *base = (GLboolean *) &ctx->Extensions;
+   GLuint i;
+
+   if (ctx->Extensions.String) {
+      /* The string was already queried - can't change it now! */
+      _mesa_problem(ctx, "Trying to enable/disable extension after glGetString(GL_EXTENSIONS): %s", name);
       return;
    }
 
-   if (i->flag)
-      *(i->flag) = state;
-   i->enabled = state;
+   for (i = 0 ; i < Elements(default_extensions) ; i++) {
+      if (_mesa_strcmp(default_extensions[i].name, name) == 0) {
+         if (default_extensions[i].flag_offset) {
+            GLboolean *enabled = base + default_extensions[i].flag_offset;
+            *enabled = state;
+         }
+         return;
+      }
+   }
+   _mesa_problem(ctx, "Trying to enable unknown extension: %s", name);
 }
 
 
-
+/**
+ * Enable the named extension.
+ * Typically called by drivers.
+ */
 void
 _mesa_enable_extension( GLcontext *ctx, const char *name )
 {
-   if (ctx->Extensions.ext_string == 0)
-      set_extension( ctx, name, 1 );
+   set_extension(ctx, name, GL_TRUE);
 }
 
 
+/**
+ * Disable the named extension.
+ * XXX is this really needed???
+ */
 void
 _mesa_disable_extension( GLcontext *ctx, const char *name )
 {
-   if (ctx->Extensions.ext_string == 0)
-      set_extension( ctx, name, 0 );
+   set_extension(ctx, name, GL_FALSE);
 }
 
 
-/*
+/**
  * Test if the named extension is enabled in this context.
  */
 GLboolean
-_mesa_extension_is_enabled( GLcontext *ctx, const char *name)
+_mesa_extension_is_enabled( GLcontext *ctx, const char *name )
 {
-   struct extension *i;
-   foreach( i, ctx->Extensions.ext_list )
-      if (_mesa_strncmp(i->name, name, MAX_EXT_NAMELEN) == 0) {
-         if (i->enabled)
+   const GLboolean *base = (const GLboolean *) &ctx->Extensions;
+   GLuint i;
+
+   for (i = 0 ; i < Elements(default_extensions) ; i++) {
+      if (_mesa_strcmp(default_extensions[i].name, name) == 0) {
+         if (!default_extensions[i].flag_offset)
             return GL_TRUE;
-         else
-            return GL_FALSE;
+         return *(base + default_extensions[i].flag_offset);
       }
-
+   }
    return GL_FALSE;
 }
 
 
+/**
+ * Run through the default_extensions array above and set the
+ * ctx->Extensions.ARB/EXT_* flags accordingly.
+ * To be called during context initialization.
+ */
 void
-_mesa_extensions_dtr( GLcontext *ctx )
+_mesa_init_extensions( GLcontext *ctx )
 {
-   struct extension *i, *nexti;
-
-   if (ctx->Extensions.ext_string) {
-      FREE( ctx->Extensions.ext_string );
-      ctx->Extensions.ext_string = 0;
-   }
+   GLboolean *base = (GLboolean *) &ctx->Extensions;
+   GLuint i;
 
-   if (ctx->Extensions.ext_list) {
-      foreach_s( i, nexti, ctx->Extensions.ext_list ) {
-        remove_from_list( i );
-        FREE( i );
+   for (i = 0 ; i < Elements(default_extensions) ; i++) {
+      if (default_extensions[i].enabled &&
+          default_extensions[i].flag_offset) {
+         *(base + default_extensions[i].flag_offset) = GL_TRUE;
       }
-
-      FREE(ctx->Extensions.ext_list);
-      ctx->Extensions.ext_list = 0;
    }
 }
 
 
-void
-_mesa_extensions_ctr( GLcontext *ctx )
+/**
+ * Construct the GL_EXTENSIONS string.  Called the first time that
+ * glGetString(GL_EXTENSIONS) is called.
+ */
+GLubyte *
+_mesa_make_extension_string( GLcontext *ctx )
 {
+   const GLboolean *base = (const GLboolean *) &ctx->Extensions;
+   GLuint extStrLen = 0;
+   GLubyte *s;
    GLuint i;
-   GLboolean *base = (GLboolean *)&ctx->Extensions;
-
-   ctx->Extensions.ext_string = NULL;
-   ctx->Extensions.ext_list = MALLOC_STRUCT(extension);
-   make_empty_list( ctx->Extensions.ext_list );
 
+   /* first, compute length of the extension string */
    for (i = 0 ; i < Elements(default_extensions) ; i++) {
-      GLboolean *ptr = NULL;
-
-      if (default_extensions[i].flag_offset)
-        ptr = base + default_extensions[i].flag_offset;
-
-      (void) _mesa_add_extension( ctx,
-                                  default_extensions[i].enabled,
-                                  default_extensions[i].name,
-                                  ptr);
+      if (!default_extensions[i].flag_offset ||
+          *(base + default_extensions[i].flag_offset)) {
+         extStrLen += _mesa_strlen(default_extensions[i].name) + 1;
+      }
    }
-}
+   s = _mesa_malloc(extStrLen);
 
-
-const char *
-_mesa_extensions_get_string( GLcontext *ctx )
-{
-   if (ctx->Extensions.ext_string == 0)
-   {
-      struct extension *i;
-      char *str;
-      GLuint len = 0;
-      foreach (i, ctx->Extensions.ext_list)
-        if (i->enabled)
-           len += _mesa_strlen(i->name) + 1;
-
-      if (len == 0)
-        return "";
-
-      str = (char *) _mesa_malloc(len * sizeof(char));
-      ctx->Extensions.ext_string = str;
-
-      foreach (i, ctx->Extensions.ext_list)
-        if (i->enabled) {
-           _mesa_strcpy(str, i->name);
-           str += _mesa_strlen(str);
-           *str++ = ' ';
-        }
-
-      *(str-1) = 0;
+   /* second, build the extension string */
+   extStrLen = 0;
+   for (i = 0 ; i < Elements(default_extensions) ; i++) {
+      if (!default_extensions[i].flag_offset ||
+          *(base + default_extensions[i].flag_offset)) {
+         GLuint len = _mesa_strlen(default_extensions[i].name);
+         _mesa_memcpy(s + extStrLen, default_extensions[i].name, len);
+         extStrLen += len;
+         s[extStrLen] = (GLubyte) ' ';
+         extStrLen++;
+      }
    }
+   ASSERT(extStrLen > 0);
+
+   s[extStrLen - 1] = 0;
 
-   return ctx->Extensions.ext_string;
+   return s;
 }
index fee9d0d57ec9e67adb13e862faa8fe211102d902..8be86897991561a93951c1a74f1874231eaff434 100644 (file)
@@ -1,9 +1,8 @@
-
 /*
  * Mesa 3-D graphics library
- * Version:  4.1
+ * Version:  5.1
  *
- * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -38,19 +37,16 @@ extern void _mesa_enable_1_3_extensions(GLcontext *ctx);
 
 extern void _mesa_enable_1_4_extensions(GLcontext *ctx);
 
-extern void _mesa_add_extension( GLcontext *ctx, GLboolean enabled,
-                                 const char *name, GLboolean *flag_ptr );
-
-extern void _mesa_enable_extension( GLcontext *ctx, const char *name );
+extern void _mesa_enable_1_5_extensions(GLcontext *ctx);
 
-extern void _mesa_disable_extension( GLcontext *ctx, const char *name );
+extern void _mesa_enable_extension(GLcontext *ctx, const char *name);
 
-extern GLboolean _mesa_extension_is_enabled( GLcontext *ctx, const char *name);
+extern void _mesa_disable_extension(GLcontext *ctx, const char *name);
 
-extern void _mesa_extensions_dtr( GLcontext *ctx );
+extern GLboolean _mesa_extension_is_enabled(GLcontext *ctx, const char *name);
 
-extern void _mesa_extensions_ctr( GLcontext *ctx );
+extern void _mesa_init_extensions(GLcontext *ctx);
 
-extern const char *_mesa_extensions_get_string( GLcontext *ctx );
+extern GLubyte *_mesa_make_extension_string(GLcontext *ctx);
 
 #endif
index 88a1d947f312ab7b80f890521a98267e5bfd142a..b0de5e7ec06743739937cd8a6039aceb35dd04f5 100644 (file)
@@ -6243,7 +6243,9 @@ _mesa_GetString( GLenum name )
                return (const GLubyte *) version_1_2;
             }
          case GL_EXTENSIONS:
-            return (const GLubyte *) _mesa_extensions_get_string(ctx);
+            if (!ctx->Extensions.String)
+               ctx->Extensions.String = _mesa_make_extension_string(ctx);
+            return (const GLubyte *) ctx->Extensions.String;
 #if FEATURE_NV_fragment_program
          case GL_PROGRAM_ERROR_STRING_NV:
             if (ctx->Extensions.NV_fragment_program) {
index 59a75da8c88b602c17ee306c8180dc2a1c5d3507..2c73d989627499b1fb6b046ad36deca3a06eeaa0 100644 (file)
@@ -878,7 +878,7 @@ struct gl_texture_image {
    GLfloat DepthScale;         /* used for mipmap lod computation */
    GLvoid *Data;               /* Image data, accessed via FetchTexel() */
    GLboolean IsClientData;     /* Data owned by client? */
-
+   GLboolean _IsPowerOfTwo;    /* Are all dimensions powers of two? */
 
    const struct gl_texture_format *TexFormat;
 
@@ -920,6 +920,7 @@ struct gl_texture_object {
    GLint _MaxLevel;            /* actual max mipmap level (q in the spec) */
    GLfloat _MaxLambda;         /* = _MaxLevel - BaseLevel (q - b in spec) */
    GLboolean GenerateMipmap;    /* GL_SGIS_generate_mipmap */
+   GLboolean _IsPowerOfTwo;    /* Are all image dimensions powers of two? */
 
    struct gl_texture_image *Image[MAX_TEXTURE_LEVELS];
 
@@ -1449,13 +1450,11 @@ struct gl_constants {
 /*
  * List of extensions.
  */
-struct extension;
 struct gl_extensions {
-   char *ext_string;
-   struct extension *ext_list;
    /* Flags to quickly test if certain extensions are available.
     * Not every extension needs to have such a flag, but it's encouraged.
     */
+   GLboolean dummy;  /* don't remove this! */
    GLboolean ARB_depth_texture;
    GLboolean ARB_fragment_program;
    GLboolean ARB_imaging;
@@ -1504,6 +1503,7 @@ struct gl_extensions {
    GLboolean HP_occlusion_test;
    GLboolean IBM_rasterpos_clip;
    GLboolean MESA_pack_invert;
+   GLboolean MESA_packed_depth_stencil;
    GLboolean MESA_resize_buffers;
    GLboolean MESA_ycbcr_texture;
    GLboolean NV_blend_square;
@@ -1524,6 +1524,8 @@ struct gl_extensions {
    GLboolean SGIX_shadow_ambient; /* or GL_ARB_shadow_ambient */
    GLboolean TDFX_texture_compression_FXT1;
    GLboolean APPLE_client_storage;
+   /* The extension string */
+   const GLubyte *String;
 };