mesa: implement GL3 GL_NUM_EXTENSIONS query
authorBrian Paul <brianp@vmware.com>
Wed, 30 Dec 2009 17:16:01 +0000 (10:16 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 30 Dec 2009 17:16:01 +0000 (10:16 -0700)
src/mesa/main/extensions.c
src/mesa/main/extensions.h
src/mesa/main/get.c
src/mesa/main/get_gen.py
src/mesa/main/mtypes.h

index a1561b4065b6a3e525358bc54b9f19a64a08b8a6..88c025ee326c45d8de7d09090994d339e86b06a6 100644 (file)
@@ -700,3 +700,28 @@ _mesa_make_extension_string( GLcontext *ctx )
 
    return (GLubyte *) s;
 }
+
+
+/**
+ * Return number of enabled extensions.
+ */
+GLuint
+_mesa_get_extension_count(GLcontext *ctx)
+{
+   GLuint i;
+
+   /* only count once */
+   if (!ctx->Extensions.Count) {
+      for (i = 0; i < Elements(default_extensions); i++) {
+         if (extension_enabled(ctx, i)) {
+            ctx->Extensions.Count++;
+         }
+      }
+   }
+
+   if (0)
+      _mesa_debug(ctx, "%u of %d extensions enabled\n", ctx->Extensions.Count,
+                  Elements(default_extensions));
+
+   return ctx->Extensions.Count;
+}
index 05ad859a27ef595a252818aafe4e7606faa4e2e0..194c2efa40b78b07690d8cb07418a5ffab22d35c 100644 (file)
@@ -64,6 +64,10 @@ extern void _mesa_init_extensions(GLcontext *ctx);
 
 extern GLubyte *_mesa_make_extension_string(GLcontext *ctx);
 
+extern GLuint
+_mesa_get_extension_count(GLcontext *ctx);
+
+
 #else
 
 /** No-op */
index 99478f0ec43efcc7fe3540598f971d139774be09..618b5411cc9545ba8bd2dcde3dc17e630a0af7ec 100644 (file)
@@ -1899,6 +1899,9 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          CHECK_EXT1(ARB_sync, "GetBooleanv");
          params[0] = INT64_TO_BOOLEAN(ctx->Const.MaxServerWaitTimeout);
          break;
+      case GL_NUM_EXTENSIONS:
+         params[0] = INT_TO_BOOLEAN(_mesa_get_extension_count(ctx));
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetBooleanv(pname=0x%x)", pname);
    }
@@ -3734,6 +3737,9 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          CHECK_EXT1(ARB_sync, "GetFloatv");
          params[0] = (GLfloat)(ctx->Const.MaxServerWaitTimeout);
          break;
+      case GL_NUM_EXTENSIONS:
+         params[0] = (GLfloat)(_mesa_get_extension_count(ctx));
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetFloatv(pname=0x%x)", pname);
    }
@@ -5569,6 +5575,9 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          CHECK_EXT1(ARB_sync, "GetIntegerv");
          params[0] = INT64_TO_INT(ctx->Const.MaxServerWaitTimeout);
          break;
+      case GL_NUM_EXTENSIONS:
+         params[0] = _mesa_get_extension_count(ctx);
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetIntegerv(pname=0x%x)", pname);
    }
@@ -7405,6 +7414,9 @@ _mesa_GetInteger64v( GLenum pname, GLint64 *params )
          CHECK_EXT1(ARB_sync, "GetInteger64v");
          params[0] = ctx->Const.MaxServerWaitTimeout;
          break;
+      case GL_NUM_EXTENSIONS:
+         params[0] = (GLint64)(_mesa_get_extension_count(ctx));
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetInteger64v(pname=0x%x)", pname);
    }
index 82eacf03146d63099213f4b7749a225cedfa6621..7540661187f837e1a2519e05723b822b328845f2 100644 (file)
@@ -1030,6 +1030,9 @@ StateVars = [
        # GL_ARB_sync
        ( "GL_MAX_SERVER_WAIT_TIMEOUT", GLint64, ["ctx->Const.MaxServerWaitTimeout"], "",
          ["ARB_sync"] ),
+
+       # GL3
+       ( "GL_NUM_EXTENSIONS", GLint, ["_mesa_get_extension_count(ctx)"], "", None ),
 ]
 
 
index 3a48c8bf009e00ba64841fa20ac3e71ea7cfbda6..849d1689c35edb358d4d5b23110b737be6824a2c 100644 (file)
@@ -2512,6 +2512,8 @@ struct gl_extensions
    GLboolean S3_s3tc;
    /** The extension string */
    const GLubyte *String;
+   /** Number of supported extensions */
+   GLuint Count;
 };