On 12.04.2013 21:14, Kenneth Graunke 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 <kenn...@whitecape.org> > --- > src/mapi/glapi/gen/AMD_performance_monitor.xml | 87 ++++ > 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/main/performance_monitor.c | 563 > +++++++++++++++++++++++++ > src/mesa/main/performance_monitor.h | 85 ++++ > src/mesa/sources.mak | 1 + > 12 files changed, 850 insertions(+) > create mode 100644 src/mapi/glapi/gen/AMD_performance_monitor.xml > create mode 100644 src/mesa/main/performance_monitor.c > create mode 100644 src/mesa/main/performance_monitor.h > > /** > + * 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; > +}; > +
Started to implement this for mesa/st, got a question about ActiveCounters: Does this bitset refer to the counter IDs or the Counters array index ? Do the IDs have to be consecutive ? Do they have to correspond to the array index ? > + > +void GLAPIENTRY > +_mesa_SelectPerfMonitorCountersAMD(GLuint monitor, GLboolean enable, > + GLuint group, GLint numCounters, > + GLuint *counterList) > +{ ... > + if (enable) { > + /* Enable the counters */ > + for (i = 0; i < numCounters; i++) { > + BITSET_SET(m->ActiveCounters, counterList[i]); > + } > + } else { > + /* Disable the counters */ > + for (i = 0; i < numCounters; i++) { > + BITSET_CLEAR(m->ActiveCounters, counterList[i]); > + } > + } > +} counterList is an ID, so this implies ActiveCounters refers to IDs. You also do: m->ActiveCounters = calloc(ctx->PerfMonitor.NumCounters, sizeof(BITSET_WORD)); So, this implies it refers to the Counters array of size NumCounters (unless the overallocation by 8 * sizeof(BITSET_WORD) bits has some purpose that escapes me). Hence, we cannot freely select IDs, can we ? I had different graciously spaced ranges of gallium query IDs reserved of different counter domains (since I haven't added all possible counters, I don't even know all of them, needs REing), so I guess I have to remap them in the state tracker ... Anyway, I think this should be mentioned in a comment [that is easy to find]. Thanks, Christoph _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev