rearranged order of some functions
[mesa.git] / src / mesa / main / extensions.c
index 55687294d17a6489c5ba7443690ef4e26b0fe66a..f60ae01de9d0d3971ef1e5b3eb411cb7945fe540 100644 (file)
@@ -1,10 +1,10 @@
-/* $Id: extensions.c,v 1.1 1999/08/19 00:55:41 jtg Exp $ */
+/* $Id: extensions.c,v 1.20 2000/03/11 23:23:26 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.1
+ * Version:  3.3
  * 
- * Copyright (C) 1999  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2000  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"),
  */
 
 
-#include <stdlib.h>
+#ifdef PC_HEADER
+#include "all.h"
+#else
+#include "glheader.h"
+#include "context.h"
 #include "extensions.h"
+#include "mem.h"
 #include "simple_list.h"
 #include "types.h"
+#endif
+
 
 #define MAX_EXT_NAMELEN 80
-#define MALLOC_STRUCT(T)  (struct T *) malloc( sizeof(struct T) )
 
 struct extension {
    struct extension *next, *prev;
-   int enabled;
+   GLint enabled;
    char name[MAX_EXT_NAMELEN+1];
    void (*notify)( GLcontext *, GLboolean ); 
 };
@@ -43,11 +49,12 @@ struct extension {
 
 
 static struct { int enabled; const char *name; } default_extensions[] = {
-   { ALWAYS_ENABLED, "GL_EXT_blend_color" },
-   { ALWAYS_ENABLED, "GL_EXT_blend_minmax" },
-   { ALWAYS_ENABLED, "GL_EXT_blend_logic_op" },
-   { ALWAYS_ENABLED, "GL_EXT_blend_subtract" },
-   { ALWAYS_ENABLED, "GL_EXT_paletted_texture" },
+   { DEFAULT_ON,     "GL_EXT_blend_color" },
+   { DEFAULT_OFF,    "ARB_imaging" },
+   { DEFAULT_ON,     "GL_EXT_blend_minmax" },
+   { DEFAULT_ON,     "GL_EXT_blend_logic_op" },
+   { DEFAULT_ON,     "GL_EXT_blend_subtract" },
+   { DEFAULT_ON,     "GL_EXT_paletted_texture" },
    { DEFAULT_ON,     "GL_EXT_point_parameters" },
    { ALWAYS_ENABLED, "GL_EXT_polygon_offset" },
    { ALWAYS_ENABLED, "GL_EXT_vertex_array" },
@@ -55,25 +62,44 @@ static struct { int enabled; const char *name; } default_extensions[] = {
    { DEFAULT_ON,     "GL_EXT_texture3D" },
    { ALWAYS_ENABLED, "GL_MESA_window_pos" },
    { ALWAYS_ENABLED, "GL_MESA_resize_buffers" },
-   { ALWAYS_ENABLED, "GL_EXT_shared_texture_palette" },
+   { DEFAULT_ON,     "GL_EXT_shared_texture_palette" },
    { ALWAYS_ENABLED, "GL_EXT_rescale_normal" },
    { ALWAYS_ENABLED, "GL_EXT_abgr" },
    { ALWAYS_ENABLED, "GL_SGIS_texture_edge_clamp" },
    { ALWAYS_ENABLED, "GL_EXT_stencil_wrap" },
-   { ALWAYS_ENABLED, "GL_INGR_blend_func_separate" },
+   { DEFAULT_ON,     "GL_INGR_blend_func_separate" },
    { DEFAULT_ON,     "GL_ARB_multitexture" },
    { ALWAYS_ENABLED, "GL_NV_texgen_reflection" },
    { DEFAULT_ON,     "GL_PGI_misc_hints" },
    { DEFAULT_ON,     "GL_EXT_compiled_vertex_array" },
-   { DEFAULT_OFF,    "GL_EXT_vertex_array_set" },
    { DEFAULT_ON,     "GL_EXT_clip_volume_hint" },
+   { DEFAULT_ON,     "GL_EXT_texture_env_add" },
+   { ALWAYS_ENABLED, "GL_ARB_tranpose_matrix" },
+   { DEFAULT_OFF,    "GL_EXT_vertex_array_set" },
+   { DEFAULT_OFF,    "GL_EXT_texture_env" },
+   { DEFAULT_ON,     "GL_EXT_texture_lod_bias" },
+   { DEFAULT_OFF,    "GL_HP_occlusion_test" }
 };
 
 
+/*
+ * Update the boolean convenience flags in the Extensions struct.
+ */
+static void
+update_extension_flags( GLcontext *ctx )
+{
+   /* Update flags */
+   ctx->Extensions.HaveTextureEnvAdd = gl_extension_is_enabled(ctx, "GL_EXT_texture_env_add");
+   ctx->Extensions.HaveTextureLodBias = gl_extension_is_enabled(ctx, "GL_EXT_texture_lod_bias");
+   ctx->Extensions.HaveHpOcclusionTest = gl_extension_is_enabled(ctx, "GL_HP_occlusion_test");
+}
+
+
+
 int gl_extensions_add( GLcontext *ctx, 
                       int state, 
                       const char *name, 
-                      void (*notify)() )
+                      void (*notify)(void) )
 {
    (void) notify;
 
@@ -91,21 +117,26 @@ int gl_extensions_add( GLcontext *ctx,
 }
 
 
-static int set_extension( GLcontext *ctx, const char *name, GLuint state )
+/*
+ * Either enable or disable the named extension.
+ */
+static int set_extension( GLcontext *ctx, const char *name, GLint state )
 {
    struct extension *i;
    foreach( i, ctx->Extensions.ext_list ) 
       if (strncmp(i->name, name, MAX_EXT_NAMELEN) == 0) 
         break;
 
-   if (i == ctx->Extensions.ext_list) return 1;
+   if (i == ctx->Extensions.ext_list)
+      return 1;
 
-   if (i->enabled && !(i->enabled & ALWAYS_ENABLED))
-   {
+   if (i->enabled && !(i->enabled & ALWAYS_ENABLED)) {
       if (i->notify) i->notify( ctx, state );      
       i->enabled = state;
    }
 
+   update_extension_flags(ctx);
+
    return 0;
 }   
 
@@ -126,21 +157,40 @@ int gl_extensions_disable( GLcontext *ctx, const char *name )
 }
       
 
+/*
+ * Test if the named extension is enabled in this context.
+ */
+GLboolean gl_extension_is_enabled( GLcontext *ctx, const char *name)
+{
+   struct extension *i;
+   foreach( i, ctx->Extensions.ext_list )
+      if (strncmp(i->name, name, MAX_EXT_NAMELEN) == 0) {
+         if (i->enabled)
+            return GL_TRUE;
+         else
+            return GL_FALSE;
+      }
+
+   return GL_FALSE;
+}
+
+
 void gl_extensions_dtr( GLcontext *ctx )
 {
    struct extension *i, *nexti;
 
    if (ctx->Extensions.ext_string) {
-      free( ctx->Extensions.ext_string );
+      FREE( ctx->Extensions.ext_string );
       ctx->Extensions.ext_string = 0;
    }
 
    if (ctx->Extensions.ext_list) {
       foreach_s( i, nexti, ctx->Extensions.ext_list ) {
-        free( i );
+        remove_from_list( i );
+        FREE( i );
       }
    
-      free(ctx->Extensions.ext_list);
+      FREE(ctx->Extensions.ext_list);
       ctx->Extensions.ext_list = 0;
    }      
 }
@@ -160,6 +210,7 @@ void gl_extensions_ctr( GLcontext *ctx )
                         default_extensions[i].name,
                         0 );
    }
+   update_extension_flags(ctx);
 }
 
 
@@ -177,7 +228,7 @@ const char *gl_extensions_get_string( GLcontext *ctx )
       if (len == 0) 
         return "";
 
-      str = (char *)malloc(len * sizeof(char));
+      str = (char *)MALLOC(len * sizeof(char));
       ctx->Extensions.ext_string = str;
 
       foreach (i, ctx->Extensions.ext_list) 
@@ -192,5 +243,3 @@ const char *gl_extensions_get_string( GLcontext *ctx )
       
    return ctx->Extensions.ext_string;
 }
-
-