mesa: Add core support for the GL_INTEL_performance_query extension.
authorPetri Latvala <petri.latvala@intel.com>
Wed, 23 Apr 2014 08:08:52 +0000 (11:08 +0300)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 2 May 2014 17:07:04 +0000 (10:07 -0700)
Like AMD_performance_monitor, this extension provides an interface for
applications (and OpenGL-based tools) to access GPU performance
counters. Since the exact performance counters available vary between
vendors and hardware generations, the extension provides an API the
application can use to get the names, types, and minimum/maximum
values of all available counters.

Applications create performance queries based on available query
types, and begin/end measurement collection. Multiple queries can be
measuring simultaneously.

v2: Whitespace changes
v3: src/mapi/glapi/gen/gl_API.xml: Also expose the functions to GLES2.
v4: Whitespace changes, static_dispatch="false" for all functions, fix
    dispatch_sanity test for GLES2 functions

Signed-off-by: Petri Latvala <petri.latvala@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mapi/glapi/gen/INTEL_performance_query.xml [new file with mode: 0644]
src/mapi/glapi/gen/Makefile.am
src/mapi/glapi/gen/gl_API.xml
src/mesa/main/config.h
src/mesa/main/extensions.c
src/mesa/main/get.c
src/mesa/main/get_hash_params.py
src/mesa/main/mtypes.h
src/mesa/main/performance_monitor.c
src/mesa/main/performance_monitor.h
src/mesa/main/tests/dispatch_sanity.cpp

diff --git a/src/mapi/glapi/gen/INTEL_performance_query.xml b/src/mapi/glapi/gen/INTEL_performance_query.xml
new file mode 100644 (file)
index 0000000..25cd181
--- /dev/null
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
+
+<OpenGLAPI>
+
+<category name="GL_INTEL_performance_query" number="443">
+
+  <function name="GetFirstPerfQueryIdINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryId" type="GLuint *"/>
+  </function>
+
+  <function name="GetNextPerfQueryIdINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryId" type="GLuint"/>
+    <param name="nextQueryId" type="GLuint *"/>
+  </function>
+
+  <function name="GetPerfQueryIdByNameINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryName" type="GLchar *"/>
+    <param name="queryId" type="GLuint *"/>
+  </function>
+
+  <function name="GetPerfQueryInfoINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryId" type="GLuint"/>
+    <param name="queryNameLength" type="GLuint"/>
+    <param name="queryName" type="GLchar *"/>
+    <param name="dataSize" type="GLuint *"/>
+    <param name="noCounters" type="GLuint *"/>
+    <param name="noInstances" type="GLuint *"/>
+    <param name="capsMask" type="GLuint *"/>
+  </function>
+
+  <function name="GetPerfCounterInfoINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryId" type="GLuint"/>
+    <param name="counterId" type="GLuint"/>
+    <param name="counterNameLength" type="GLuint"/>
+    <param name="counterName" type="GLchar *"/>
+    <param name="counterDescLength" type="GLuint"/>
+    <param name="counterDesc" type="GLchar *"/>
+    <param name="counterOffset" type="GLuint *"/>
+    <param name="counterDataSize" type="GLuint *"/>
+    <param name="counterTypeEnum" type="GLuint *"/>
+    <param name="counterDataTypeEnum" type="GLuint *"/>
+    <param name="rawCounterMaxValue" type="GLuint64 *"/>
+  </function>
+
+  <function name="CreatePerfQueryINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryId" type="GLuint"/>
+    <param name="queryHandle" type="GLuint *"/>
+  </function>
+
+  <function name="DeletePerfQueryINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryHandle" type="GLuint"/>
+  </function>
+
+  <function name="BeginPerfQueryINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryHandle" type="GLuint"/>
+  </function>
+
+  <function name="EndPerfQueryINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryHandle" type="GLuint"/>
+  </function>
+
+  <function name="GetPerfQueryDataINTEL" offset="assign" static_dispatch="false" es2="2.0">
+    <param name="queryHandle" type="GLuint"/>
+    <param name="flags" type="GLuint"/>
+    <param name="dataSize" type="GLsizei"/>
+    <param name="data" type="GLvoid *"/>
+    <param name="bytesWritten" type="GLuint *"/>
+  </function>
+
+  <enum name="PERFQUERY_SINGLE_CONTEXT_INTEL" value="0x0000"/>
+  <enum name="PERFQUERY_GLOBAL_CONTEXT_INTEL" value="0x0001"/>
+  <enum name="PERFQUERY_WAIT_INTEL" value="0x83FB"/>
+  <enum name="PERFQUERY_FLUSH_INTEL" value="0x83FA"/>
+  <enum name="PERFQUERY_DONOT_FLUSH_INTEL" value="0x83F9"/>
+  <enum name="PERFQUERY_COUNTER_EVENT_INTEL" value="0x94F0"/>
+  <enum name="PERFQUERY_COUNTER_DURATION_NORM_INTEL" value="0x94F1"/>
+  <enum name="PERFQUERY_COUNTER_DURATION_RAW_INTEL" value="0x94F2"/>
+  <enum name="PERFQUERY_COUNTER_THROUGHPUT_INTEL" value="0x94F3"/>
+  <enum name="PERFQUERY_COUNTER_RAW_INTEL" value="0x94F4"/>
+  <enum name="PERFQUERY_COUNTER_TIMESTAMP_INTEL" value="0x94F5"/>
+  <enum name="PERFQUERY_COUNTER_DATA_UINT32_INTEL" value="0x94F8"/>
+  <enum name="PERFQUERY_COUNTER_DATA_UINT64_INTEL" value="0x94F9"/>
+  <enum name="PERFQUERY_COUNTER_DATA_FLOAT_INTEL" value="0x94FA"/>
+  <enum name="PERFQUERY_COUNTER_DATA_DOUBLE_INTEL" value="0x94FB"/>
+  <enum name="PERFQUERY_COUNTER_DATA_BOOL32_INTEL" value="0x94FC"/>
+  <enum name="PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL" value="0x94FD"/>
+  <enum name="PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL" value="0x94FE"/>
+  <enum name="PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL" value="0x94FF"/>
+  <enum name="PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL" value="0x9500"/>
+</category>
+
+</OpenGLAPI>
index 35cf924da08fe357a891238fbdced16b31855e30..6f36989bcca5e95f48a57e7300128ac70b8b198f 100644 (file)
@@ -172,6 +172,7 @@ API_XML = \
        EXT_texture_array.xml \
        EXT_texture_integer.xml \
        EXT_transform_feedback.xml \
+       INTEL_performance_query.xml \
        KHR_debug.xml \
        NV_conditional_render.xml \
        NV_primitive_restart.xml \
index 46640397bccc22c7e03165c81f2d01985b0820b3..d6f9b578772537de579d1a4484d9f5e599f9d6dd 100644 (file)
     <enum name="SKIP_DECODE_EXT"                      value="0x8A4A"/>
 </category>
 
+<xi:include href="INTEL_performance_query.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
+
 <!-- Unnumbered extensions sorted by name. -->
 
 <category name="GL_ATI_blend_equation_separate">
index 30da5d4222bc43f295061eacce56ec968b69a7ea..c96502a7ff8c4c6628192741fab547481e0f68c2 100644 (file)
 #define MAX_VERTEX_STREAMS                  4
 /*@}*/
 
+/** For GL_INTEL_performance_query */
+/*@{*/
+#define MAX_PERFQUERY_QUERY_NAME_LENGTH     256
+#define MAX_PERFQUERY_COUNTER_NAME_LENGTH   256
+#define MAX_PERFQUERY_COUNTER_DESC_LENGTH   1024
+#define PERFQUERY_HAVE_GPA_EXTENDED_COUNTERS 0
+/*@}*/
+
 /*
  * Color channel component order
  * 
index 55ed5d3cc2cb97d6df75ae77f645191abb5ec7ea..c2ff7e3b752ea1418cbdc768b5349b52c7b02c71 100644 (file)
@@ -331,6 +331,7 @@ static const struct extension extension_table[] = {
    { "GL_IBM_rasterpos_clip",                      o(dummy_true),                              GLL,            1996 },
    { "GL_IBM_texture_mirrored_repeat",             o(dummy_true),                              GLL,            1998 },
    { "GL_INGR_blend_func_separate",                o(EXT_blend_func_separate),                 GLL,            1999 },
+   { "GL_INTEL_performance_query",                 o(INTEL_performance_query),                       GL | ES2, 2013 },
    { "GL_MESA_pack_invert",                        o(MESA_pack_invert),                        GL,             2002 },
    { "GL_MESA_texture_signed_rgba",                o(EXT_texture_snorm),                       GL,             2009 },
    { "GL_MESA_window_pos",                         o(dummy_true),                              GLL,            2000 },
index 937d7aa67b4cf06a9e15018724ee11383b4f8d3e..80a5839b575b1924064d40bc11ba7bd0a6ca6575 100644 (file)
@@ -394,6 +394,7 @@ EXTRA_EXT(ARB_viewport_array);
 EXTRA_EXT(ARB_compute_shader);
 EXTRA_EXT(ARB_gpu_shader5);
 EXTRA_EXT2(ARB_transform_feedback3, ARB_gpu_shader5);
+EXTRA_EXT(INTEL_performance_query);
 
 static const int
 extra_ARB_color_buffer_float_or_glcore[] = {
index 1d565028ebbffff8caa0ac8f8fbbc589cb7bd33a..d40fa0778273c2f2fe66031264c7b5e00708f074 100644 (file)
@@ -311,6 +311,12 @@ descriptor=[
 # GL_ARB_get_program_binary / GL_OES_get_program_binary
   [ "NUM_PROGRAM_BINARY_FORMATS", "CONST(0), NO_EXTRA" ],
   [ "PROGRAM_BINARY_FORMATS", "LOC_CUSTOM, TYPE_INVALID, 0, NO_EXTRA" ],
+
+# GL_INTEL_performance_query
+  [ "PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL", "CONST(MAX_PERFQUERY_QUERY_NAME_LENGTH), extra_INTEL_performance_query" ],
+  [ "PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL", "CONST(MAX_PERFQUERY_COUNTER_NAME_LENGTH), extra_INTEL_performance_query" ],
+  [ "PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL", "CONST(MAX_PERFQUERY_COUNTER_DESC_LENGTH), extra_INTEL_performance_query" ],
+  [ "PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL", "CONST(PERFQUERY_HAVE_GPA_EXTENDED_COUNTERS), extra_INTEL_performance_query" ],
 ]},
 
 # GLES3 is not a typo.
index e57c04db3d9b5fcec6a0bc4afc58adf7265d376a..917d071a2c86eba31566109b9f949e168c79fd7d 100644 (file)
@@ -3613,6 +3613,7 @@ struct gl_extensions
    GLboolean ATI_texture_env_combine3;
    GLboolean ATI_fragment_shader;
    GLboolean ATI_separate_stencil;
+   GLboolean INTEL_performance_query;
    GLboolean MESA_pack_invert;
    GLboolean MESA_ycbcr_texture;
    GLboolean NV_conditional_render;
index e62f7701217b1e8903a7c6d07e9e2939b73240b5..597f633f6f9c42d1f847d13a3e2581e87c7622fd 100644 (file)
@@ -639,3 +639,222 @@ _mesa_perf_monitor_counter_size(const struct gl_perf_monitor_counter *c)
       return 0;
    }
 }
+
+extern void GLAPIENTRY
+_mesa_GetFirstPerfQueryIdINTEL(GLuint *queryId)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If queryId pointer is equal to 0, INVALID_VALUE error is generated."
+    */
+   if (!queryId) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+                  "glGetFirstPerfQueryIdINTEL(queryId == NULL)");
+      return;
+   }
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If the given hardware platform doesn't support any performance
+    *    queries, then the value of 0 is returned and INVALID_OPERATION error
+    *    is raised."
+    */
+
+   *queryId = 0;
+   _mesa_error(ctx, GL_INVALID_OPERATION,
+               "glGetFirstPerfQueryIdINTEL(no queries supported)");
+}
+
+extern void GLAPIENTRY
+_mesa_GetNextPerfQueryIdINTEL(GLuint queryId, GLuint *nextQueryId)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If nextQueryId pointer is equal to 0, an INVALID_VALUE error is
+    *    generated."
+    */
+   if (!nextQueryId) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+                  "glGetNextPerfQueryIdINTEL(nextQueryId == NULL)");
+      return;
+   }
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If the specified performance query identifier is invalid then
+    *    INVALID_VALUE error is generated. Whenever error is generated, the
+    *    value of 0 is returned."
+    *
+    * No queries are supported, so all queries are invalid.
+    */
+   *nextQueryId = 0;
+   _mesa_error(ctx, GL_INVALID_VALUE,
+               "glGetNextPerfQueryIdINTEL(invalid query)");
+}
+
+extern void GLAPIENTRY
+_mesa_GetPerfQueryIdByNameINTEL(char *queryName, GLuint *queryId)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If queryName does not reference a valid query name, an INVALID_VALUE
+    *    error is generated."
+    *
+    * No queries are supported, so all query names are invalid.
+    */
+
+   _mesa_error(ctx, GL_INVALID_VALUE,
+               "glGetPerfQueryIdByNameINTEL(invalid query name)");
+}
+
+extern void GLAPIENTRY
+_mesa_GetPerfQueryInfoINTEL(GLuint queryId,
+                            GLuint queryNameLength, char *queryName,
+                            GLuint *dataSize, GLuint *noCounters,
+                            GLuint *noActiveInstances,
+                            GLuint *capsMask)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If queryId does not reference a valid query type, an INVALID_VALUE
+    *    error is generated."
+    *
+    * No queries are supported, so all queries are invalid.
+    */
+
+   _mesa_error(ctx, GL_INVALID_VALUE,
+               "glGetPerfQueryInfoINTEL(invalid query)");
+}
+
+extern void GLAPIENTRY
+_mesa_GetPerfCounterInfoINTEL(GLuint queryId, GLuint counterId,
+                              GLuint counterNameLength, char *counterName,
+                              GLuint counterDescLength, char *counterDesc,
+                              GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum,
+                              GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If the pair of queryId and counterId does not reference a valid
+    *    counter, an INVALID_VALUE error is generated."
+    *
+    * No queries are supported, so all queries are invalid.
+    */
+
+   _mesa_error(ctx, GL_INVALID_VALUE,
+               "glGetPerfCounterInfoINTEL(invalid counterId)");
+}
+
+extern void GLAPIENTRY
+_mesa_CreatePerfQueryINTEL(GLuint queryId, GLuint *queryHandle)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If queryId does not reference a valid query type, an INVALID_VALUE
+    *    error is generated."
+    *
+    * No queries are supported, so all queries are invalid.
+    */
+
+   _mesa_error(ctx, GL_INVALID_VALUE,
+               "glCreatePerfQueryINTEL(invalid queryId)");
+}
+
+extern void GLAPIENTRY
+_mesa_DeletePerfQueryINTEL(GLuint queryHandle)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If a query handle doesn't reference a previously created performance
+    *    query instance, an INVALID_VALUE error is generated."
+    *
+    * No queries are supported, so all queries are invalid.
+    */
+
+   _mesa_error(ctx, GL_INVALID_VALUE,
+               "glDeletePerfQueryINTEL(invalid queryHandle)");
+}
+
+extern void GLAPIENTRY
+_mesa_BeginPerfQueryINTEL(GLuint queryHandle)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If a query handle doesn't reference a previously created performance
+    *    query instance, an INVALID_VALUE error is generated."
+    *
+    * No queries are supported, so all queries are invalid.
+    */
+
+   _mesa_error(ctx, GL_INVALID_VALUE,
+               "glBeginPerfQueryINTEL(invalid queryHandle)");
+}
+
+extern void GLAPIENTRY
+_mesa_EndPerfQueryINTEL(GLuint queryHandle)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If a performance query is not currently started, an
+    *    INVALID_OPERATION error will be generated."
+    *
+    * The specification doesn't state that an invalid handle would be an
+    * INVALID_VALUE error. Regardless, query for such a handle will not be
+    * started, so we generate an INVALID_OPERATION in that case.
+    *
+    * No queries are supported, so all handles are invalid.
+    */
+
+   _mesa_error(ctx, GL_INVALID_OPERATION,
+               "glEndPerfQueryINTEL(query not started)");
+}
+
+extern void GLAPIENTRY
+_mesa_GetPerfQueryDataINTEL(GLuint queryHandle, GLuint flags,
+                            GLsizei dataSize, void *data, GLuint *bytesWritten)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *    "If bytesWritten or data pointers are NULL then an INVALID_VALUE
+    *    error is generated."
+    */
+   if (!bytesWritten || !data) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+                  "glGetPerfQueryDataINTEL(bytesWritten or data is NULL)");
+      return;
+   }
+
+   /* The specification doesn't state that an invalid handle generates an
+    * error. We could interpret that to mean the case should be handled as
+    * "measurement not ready for this query", but what should be done if
+    * `flags' equals PERFQUERY_WAIT_INTEL?
+    *
+    * To resolve this, we just generate an INVALID_VALUE from an invalid query
+    * handle.
+    *
+    * No queries are supported, so all handles are invalid.
+    */
+
+   _mesa_error(ctx, GL_INVALID_VALUE,
+               "glGetPerfQueryDataINTEL(invalid queryHandle)");
+}
index 76234e5c1bc670cdb079d41937e6088810129ff7..7b311e4e01de3be0e91499de038bb8a73cd05e13 100644 (file)
@@ -23,7 +23,8 @@
 
 /**
  * \file performance_monitor.h
- * Core Mesa support for the AMD_performance_monitor extension.
+ * Core Mesa support for the AMD_performance_monitor extension and the
+ * INTEL_performance_query extension.
  */
 
 #pragma once
@@ -85,4 +86,44 @@ _mesa_GetPerfMonitorCounterDataAMD(GLuint monitor, GLenum pname,
 unsigned
 _mesa_perf_monitor_counter_size(const struct gl_perf_monitor_counter *);
 
+
+extern void GLAPIENTRY
+_mesa_GetFirstPerfQueryIdINTEL(GLuint *queryId);
+
+extern void GLAPIENTRY
+_mesa_GetNextPerfQueryIdINTEL(GLuint queryId, GLuint *nextQueryId);
+
+extern void GLAPIENTRY
+_mesa_GetPerfQueryIdByNameINTEL(char *queryName, GLuint *queryId);
+
+extern void GLAPIENTRY
+_mesa_GetPerfQueryInfoINTEL(GLuint queryId,
+                            GLuint queryNameLength, char *queryName,
+                            GLuint *dataSize, GLuint *noCounters,
+                            GLuint *noActiveInstances,
+                            GLuint *capsMask);
+
+extern void GLAPIENTRY
+_mesa_GetPerfCounterInfoINTEL(GLuint queryId, GLuint counterId,
+                              GLuint counterNameLength, char *counterName,
+                              GLuint counterDescLength, char *counterDesc,
+                              GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum,
+                              GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);
+
+extern void GLAPIENTRY
+_mesa_CreatePerfQueryINTEL(GLuint queryId, GLuint *queryHandle);
+
+extern void GLAPIENTRY
+_mesa_DeletePerfQueryINTEL(GLuint queryHandle);
+
+extern void GLAPIENTRY
+_mesa_BeginPerfQueryINTEL(GLuint queryHandle);
+
+extern void GLAPIENTRY
+_mesa_EndPerfQueryINTEL(GLuint queryHandle);
+
+extern void GLAPIENTRY
+_mesa_GetPerfQueryDataINTEL(GLuint queryHandle, GLuint flags,
+                            GLsizei dataSize, void *data, GLuint *bytesWritten);
+
 #endif
index fe797f9808885629ea7565db984a1b85b563d616..0e57653b4b4c848a8f012c5bfd1124235c6e0a5f 100644 (file)
@@ -920,6 +920,18 @@ const struct function gl_core_functions_possible[] = {
    { "glEndPerfMonitorAMD", 11, -1 },
    { "glGetPerfMonitorCounterDataAMD", 11, -1 },
 
+   /* GL_INTEL_performance_query */
+   { "glGetFirstPerfQueryIdINTEL", 30, -1 },
+   { "glGetNextPerfQueryIdINTEL", 30, -1 },
+   { "glGetPerfQueryIdByNameINTEL", 30, -1 },
+   { "glGetPerfQueryInfoINTEL", 30, -1 },
+   { "glGetPerfCounterInfoINTEL", 30, -1 },
+   { "glCreatePerfQueryINTEL", 30, -1 },
+   { "glDeletePerfQueryINTEL", 30, -1 },
+   { "glBeginPerfQueryINTEL", 30, -1 },
+   { "glEndPerfQueryINTEL", 30, -1 },
+   { "glGetPerfQueryDataINTEL", 30, -1 },
+
    /* GL_NV_vdpau_interop */
    { "glVDPAUInitNV", 11, -1 },
    { "glVDPAUFiniNV", 11, -1 },
@@ -1340,6 +1352,19 @@ const struct function gles2_functions_possible[] = {
    { "glProgramUniformMatrix4x3fvEXT", 20, -1 },
    { "glValidateProgramPipelineEXT", 20, -1 },
    { "glGetProgramPipelineInfoLogEXT", 20, -1 },
+
+   /* GL_INTEL_performance_query */
+   { "glGetFirstPerfQueryIdINTEL", 20, -1 },
+   { "glGetNextPerfQueryIdINTEL", 20, -1 },
+   { "glGetPerfQueryIdByNameINTEL", 20, -1 },
+   { "glGetPerfQueryInfoINTEL", 20, -1 },
+   { "glGetPerfCounterInfoINTEL", 20, -1 },
+   { "glCreatePerfQueryINTEL", 20, -1 },
+   { "glDeletePerfQueryINTEL", 20, -1 },
+   { "glBeginPerfQueryINTEL", 20, -1 },
+   { "glEndPerfQueryINTEL", 20, -1 },
+   { "glGetPerfQueryDataINTEL", 20, -1 },
+
    { NULL, 0, -1 }
 };