[Mesa-dev] [PATCH 1/2] mesa: Add core support for the GL_AMD_performance_monitor extension.
Matt Turner
mattst88 at gmail.com
Thu Apr 11 15:45:02 PDT 2013
On Thu, Apr 11, 2013 at 2:00 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> This 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. Counters are also
> organized into groups.
>
> Applications create "performance monitor" objects, select the counters
> they want to track, and Begin/End monitoring, much like OpenGL's query
> API. Multiple monitors can be in flight simultaneously.
>
> We chose not to implement the similar GL_INTEL_performance_queries
> extension because Intel has not bothered to publish a specification in
> the OpenGL registry.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mapi/glapi/gen/Makefile.am | 1 +
> src/mapi/glapi/gen/gl_API.xml | 2 +
> src/mapi/glapi/gen/gl_genexec.py | 1 +
> src/mesa/SConscript | 1 +
> src/mesa/main/context.c | 2 +
> src/mesa/main/dd.h | 22 +++++++++++
> src/mesa/main/extensions.c | 1 +
> src/mesa/main/mtypes.h | 84 ++++++++++++++++++++++++++++++++++++++++
> src/mesa/sources.mak | 1 +
> 9 files changed, 115 insertions(+)
>
> diff --git a/src/mapi/glapi/gen/Makefile.am b/src/mapi/glapi/gen/Makefile.am
> index 36e47e2..baf8afc 100644
> --- a/src/mapi/glapi/gen/Makefile.am
> +++ b/src/mapi/glapi/gen/Makefile.am
> @@ -115,6 +115,7 @@ API_XML = \
> ARB_texture_storage.xml \
> ARB_vertex_array_object.xml \
> AMD_draw_buffers_blend.xml \
> + AMD_performance_monitor.xml \
> ARB_vertex_type_2_10_10_10_rev.xml \
I was going to ask if you could alphabetize this, but the whole list is hosed.
> APPLE_object_purgeable.xml \
> APPLE_vertex_array_object.xml \
> diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
> index df95924..afc7673 100644
> --- a/src/mapi/glapi/gen/gl_API.xml
> +++ b/src/mapi/glapi/gen/gl_API.xml
> @@ -12743,6 +12743,8 @@
> <enum name="FRAMEBUFFER_SRGB_CAPABLE_EXT" value="0x8DBA"/>
> </category>
>
> +<xi:include href="AMD_performance_monitor.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
> +
> <category name="GL_APPLE_texture_range" number="367">
> <enum name="TEXTURE_STORAGE_HINT_APPLE" count="1" value="0x85BC">
> <size name="TexParameteriv"/>
> diff --git a/src/mapi/glapi/gen/gl_genexec.py b/src/mapi/glapi/gen/gl_genexec.py
> index a85b447..e1233c4 100644
> --- a/src/mapi/glapi/gen/gl_genexec.py
> +++ b/src/mapi/glapi/gen/gl_genexec.py
> @@ -82,6 +82,7 @@ header = """/**
> #include "main/lines.h"
> #include "main/matrix.h"
> #include "main/multisample.h"
> +#include "main/performance_monitor.h"
> #include "main/pixel.h"
> #include "main/pixelstore.h"
> #include "main/points.h"
> diff --git a/src/mesa/SConscript b/src/mesa/SConscript
> index ca9b70b..9726c95 100644
> --- a/src/mesa/SConscript
> +++ b/src/mesa/SConscript
> @@ -97,6 +97,7 @@ main_sources = [
> 'main/multisample.c',
> 'main/pack.c',
> 'main/pbo.c',
> + 'main/performance_monitor.c',
> 'main/pixel.c',
> 'main/pixelstore.c',
> 'main/pixeltransfer.c',
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index 0539934..960239a 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -106,6 +106,7 @@
> #include "macros.h"
> #include "matrix.h"
> #include "multisample.h"
> +#include "performance_monitor.h"
> #include "pixel.h"
> #include "pixelstore.h"
> #include "points.h"
> @@ -762,6 +763,7 @@ init_attrib_groups(struct gl_context *ctx)
> _mesa_init_lighting( ctx );
> _mesa_init_matrix( ctx );
> _mesa_init_multisample( ctx );
> + _mesa_init_performance_monitors( ctx );
> _mesa_init_pixel( ctx );
> _mesa_init_pixelstore( ctx );
> _mesa_init_point( ctx );
> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
> index 8f3cd3d..60e7653 100644
> --- a/src/mesa/main/dd.h
> +++ b/src/mesa/main/dd.h
> @@ -646,6 +646,28 @@ struct dd_function_table {
> void (*WaitQuery)(struct gl_context *ctx, struct gl_query_object *q);
> /*@}*/
>
> + /**
> + * \name Performance monitors
> + */
> + /*@{*/
> + struct gl_perf_monitor_object * (*NewPerfMonitor)(void);
> + void (*DeletePerfMonitor)(struct gl_perf_monitor_object *m);
> + void (*BeginPerfMonitor)(struct gl_context *ctx,
> + struct gl_perf_monitor_object *m);
> +
> + /** Stop an active performance monitor, discarding results. */
> + void (*ResetPerfMonitor)(struct gl_context *ctx,
> + struct gl_perf_monitor_object *m);
> + void (*EndPerfMonitor)(struct gl_context *ctx,
> + struct gl_perf_monitor_object *m);
> + GLboolean (*IsPerfMonitorResultAvailable)(struct gl_perf_monitor_object *m);
> + void (*GetPerfMonitorResult)(struct gl_context *ctx,
> + struct gl_perf_monitor_object *m,
> + GLsizei dataSize,
> + GLuint *data,
> + GLint *bytesWritten);
> + /*@}*/
> +
>
> /**
> * \name Vertex Array objects
> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
> index c7f038b..16d3383 100644
> --- a/src/mesa/main/extensions.c
> +++ b/src/mesa/main/extensions.c
> @@ -287,6 +287,7 @@ static const struct extension extension_table[] = {
> { "GL_AMD_draw_buffers_blend", o(ARB_draw_buffers_blend), GL, 2009 },
> { "GL_AMD_seamless_cubemap_per_texture", o(AMD_seamless_cubemap_per_texture), GL, 2009 },
> { "GL_AMD_shader_stencil_export", o(ARB_shader_stencil_export), GL, 2009 },
> + { "GL_AMD_performance_monitor", o(AMD_performance_monitor), GL, 2007 },
This one actually is in the wrong place.
> { "GL_APPLE_object_purgeable", o(APPLE_object_purgeable), GL, 2006 },
> { "GL_APPLE_packed_pixels", o(dummy_true), GLL, 2002 },
> { "GL_APPLE_texture_max_level", o(dummy_true), ES1 | ES2, 2009 },
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index e46fa39..892f8e8 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1774,6 +1774,87 @@ struct gl_transform_feedback_state
>
>
> /**
> + * A "performance monitor" as described in AMD_performance_monitor.
> + */
> +struct gl_perf_monitor_object
> +{
> + GLboolean Active;
> +
> + /* Actually BITSET_WORD but we can't #include that here. */
> + GLuint *ActiveCounters;
> +};
> +
> +
> +union gl_perf_monitor_counter_value
> +{
> + float f;
> + uint64_t u64;
> + uint32_t u32;
> +};
> +
> +
> +struct gl_perf_monitor_counter
> +{
> + /** Human readable name for the counter. */
> + const char *Name;
> +
> + /**
> + * Unique ID for the counter.
> + *
> + * Core mesa requests counter values from the driver using this ID;
> + * most likely the driver will represent it using an enum of all possible
> + * counters.
> + */
> + unsigned ID;
> +
> + /** ID of the group this counter belongs to. */
> + unsigned GroupID;
> +
> + /**
> + * Data type of the counter. Valid values are FLOAT, UNSIGNED_INT,
> + * UNSIGNED_INT64_AMD, and PERCENTAGE_AMD.
> + */
> + GLenum Type;
> +
> + /** Minimum counter value. */
> + union gl_perf_monitor_counter_value Minimum;
> +
> + /** Maximum counter value. */
> + union gl_perf_monitor_counter_value Maximum;
> +};
> +
> +
> +struct gl_perf_monitor_group
> +{
> + const char *Name; /**< Human readable name for the group. */
> +
> + /**
> + * Maximum number of counters in this group which can be active at the
> + * same time.
> + */
> + GLint MaxActiveCounters;
> +};
> +
> +
> +/**
> + * Context state for AMD_performance_monitor.
> + */
> +struct gl_perf_monitor_state
> +{
> + /** Array of performance monitor groups (indexed by group ID) */
> + const struct gl_perf_monitor_group *Groups;
> + GLint NumGroups;
> +
> + /** Array of performance monitor counters (indexed by counter ID) */
> + const struct gl_perf_monitor_counter *Counters;
> + GLint NumCounters;
> +
> + /** The table of all performance monitors. */
> + struct _mesa_HashTable *Monitors;
> +};
> +
> +
> +/**
> * Names of the various vertex/fragment program register files, etc.
> *
> * NOTE: first four tokens must fit into 2 bits (see t_vb_arbprogram.c)
> @@ -3051,6 +3132,7 @@ struct gl_extensions
> GLboolean EXT_vertex_array_bgra;
> GLboolean OES_standard_derivatives;
> /* vendor extensions */
> + GLboolean AMD_performance_monitor;
> GLboolean AMD_seamless_cubemap_per_texture;
> GLboolean APPLE_object_purgeable;
> GLboolean ATI_envmap_bumpmap;
> @@ -3520,6 +3602,8 @@ struct gl_context
>
> struct gl_transform_feedback_state TransformFeedback;
>
> + struct gl_perf_monitor_state PerfMonitor;
> +
> struct gl_buffer_object *CopyReadBuffer; /**< GL_ARB_copy_buffer */
> struct gl_buffer_object *CopyWriteBuffer; /**< GL_ARB_copy_buffer */
>
> diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak
> index 3c88108..565d1a5 100644
> --- a/src/mesa/sources.mak
> +++ b/src/mesa/sources.mak
> @@ -64,6 +64,7 @@ MAIN_FILES = \
> $(SRCDIR)main/multisample.c \
> $(SRCDIR)main/pack.c \
> $(SRCDIR)main/pbo.c \
> + $(SRCDIR)main/performance_monitor.c \
> $(SRCDIR)main/pixel.c \
> $(SRCDIR)main/pixelstore.c \
> $(SRCDIR)main/pixeltransfer.c \
> --
> 1.8.2.1
More information about the mesa-dev
mailing list