blob: 6069557cad4fe415b74ced92294cda4d39860e72 [file] [log] [blame]
XXX - Almost complete; needs GLX protocol.
Name
SGIX_instruments
Name Strings
GL_SGIX_instruments
Version
$Date: 1997/09/18 01:12:38 $ $Revision: 1.6 $
Number
55
Dependencies
None
Overview
This extension allows the gathering and return of performance
measurements from within the graphics pipeline by adding
instrumentation.
There are two reasons to do this. The first is as a part of some
type of fixed-frame-rate load management scheme. If we know that
the pipeline is stalled or struggling to process the amount of
data we have given it so far, we can reduce the level of detail of
the remaining objects in the current frame or the next frame, or
adjust the framebuffer resolution for the next frame if we have a
video-zoom capability available. We can call this type of
instrumentation Load Monitoring.
The second is for performance tuning and debugging of an
application. It might tell us how many triangles were culled or
clipped before being rasterized. We can call this simply Tuning.
Load Monitoring requires that the instrumentation and the access
of the measurements be efficient, otherwise the instrumentation
itself will reduce performance more than any load-management
scheme could hope to offset. Tuning does not have the same
requirements.
The proposed extension adds a call to setup a measurements return
buffer, similar to FeedbackBuffer but with an asynchrounous
behavior to prevent filling the pipeline with NOP's while waiting
for the data to be returned.
Note that although the extension has been specified without any
particular instruments, defining either a device dependent or
device independent instrument should be as simple as introducing
an extension consisting primarily of a new enumerant to identify
the instrument.
New Procedures and Functions
void InstrumentsBufferSGIX(sizei size, int *buf)
void StartInstrumentsSGIX(void)
void StopInstrumentsSGIX(int marker)
void ReadInstrumentsSGIX(int marker)
int PollInstrumentsSGIX(int *markerp)
int GetInstrumentsSGIX(void)
An example of using the calls to test the extension:
{
#ifdef GL_SGIX_instruments
static GLint buffer[64];
void *bufp;
int id, count0, count1, r;
/* define the buffer to hold the measurments */
glInstrumentsBufferSGIX(sizeof(buffer)/sizeof(GLint), (GLint *) buffer);
/* enable the instruments from which one wishes to take measurements */
glEnable(<an enum for instrument in use>);
glStartInstrumentsSGIX();
/* insert GL commands here */
glReadInstrumentsSGIX(14);
/* insert GL commands here */
glStopInstrumentsSGIX(15);
/* the number of msrmnts since the buffer was specified can be queried */
glGetIntegerv(GL_INSTRUMENT_MEASUREMENTS_SGIX,&r); /* r should be 2 */
glGetPointervEXT(GL_INSTRUMENT_BUFFER_SGIX,&bufp);
/* bufp should be equal to buffer */
/*
* we can do a GetInstrumentsSGIX before or after the calls to
* PollInstrumentsSGIX but to be sure of exactly what
* measurements are in the buffer, we can use PollInstrumentsSGIX.
*/
count0 = glGetInstrumentsSGIX();
/* count0 will be a count of from 0 to 2 multiples of the size
* in words of the instrument measurement we have enabled.
* If buffer was overflowed, count0 will be 1.
*/
while (!(r = glPollInstrumentsSGIX(&id))) ;
/* if r is -1, we have overflowed, if it is 1, id will
* have the value of the marker passed in with the first
* measurement request (should be 14)
*/
while (!(r = glPollInstrumentsSGIX(&id))) ;
/* see the note on the first poll; id should be 15 */
count1 = glGetInstrumentsSGIX();
/* the sum of count0 and count1 should be 2 times
* the size in words of an instrument measurement
* that we have enabled.
*/
#endif
}
New Tokens
Accepted by the <pname> parameter of GetIntegerv, GetFloatv, and
GetDoublev:
INSTRUMENT_MEASUREMENTS_SGIX
Accepted by the <pname> parameter of GetPointervEXT:
INSTRUMENT_BUFFER_POINTER_SGIX
Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)
None
Additions to Chapter 3 of the 1.0 Specification (Rasterization)
None
Additions to Chapter 4 of the 1.0 Specification (Per-Fragment
Operations and the Frame Buffer)
None
Additions to Chapter 5 of the 1.0 Specification (Special Functions)
The following commands are not included in display lists:
InstrumentsBufferSGIX
PollInstrumentsSGIX
GetInstrumentsSGIX
Add a section 5.X entitled Instruments:
Instruments provide a method to measure performance of the GL
pipeline and identify possible bottlenecks. This information may
be useful in feedback-based load management schemes which attempt
to maintain a constant frame-rate. A set of functions is provided
which allows an asynchronous implementation such that the graphics
pipeline need not be stalled while measurements are returned to
the client.
A buffer in which to collect instrument measurements is defined
with InstrumentsBufferSGIX, where <size> defines the size of the
buffer. If <buf> has been previously defined with a prior call,
the buffer is reset, that is, measurements taken after the call to
InstrumentsBufferSGIX will be written to the start of the buffer.
Otherwise the buffer will be processed in a way that allows
asynchronous writing to the buffer from the graphics pipeline. If
<buf> is zero, then any resources allocated to prepare the buffer
for writing from the graphics pipeline from a previous call will
be freed. If <buf> is non-zero, but is different from a previous
call, the old buffer is considered to be replaced by the new
buffer and any allocated resources involved in preparing the old
buffer for writing are freed.
If <size> is negative an INVALID_VALUE is generated.
An INVALID_OPERATION is generated if InstrumentsBufferSGIX is
called between Begin/End.
If there are multiple instruments enabled, the measurement for
each enabled instrument can appear in the buffer in any order for
a given measurement.
The buffer address can be queried with glGetPointervEXT using
<pname> GL_INSTRUMENT_BUFFER_POINTER.
To start the enabled instrument(s) before taking a measurement
execute StartInstrumentsSGIX. To stop the enabled instruments and
take a measurement use StopInstrumentsSGIX. The parameter <marker>
is passed through the pipe and written back to the buffer to ease
the task of interpreting the buffer.
To take an instrument measurement use ReadInstrumentsSGIX. The
parameter <marker> is processed as with StopInstrumentsSGIX.
An INVALID_OPERATION is generated if StartInstrumentsSGIX is
executed twice without an intervening execution of
StopInstrumentsSGIX or InstrumentsBufferSGIX. Symetrically, an
INVALID_OPERATION is generated if StopInstrumentsSGIX is executed
twice without an intervening execution of StartInstrumentsSGIX.
ReadInstrumentsSGIX will generate an INVALID_OPERATION if executed
after an execution of StopInstruments without an intervening
execution of StopInstrumentsSGIX or InstrumentsBufferSGIX.
Executing any of StartInstrumentsSGIX, StopInstrumentsSGIX,
ReadInstruments without a successful call to InstrumentsBufferSGIX
to define a buffer will generate an INVALID_OPERATION. Executing
any of StartInstrumentsSGIX, StopInstrumentsSGIX, ReadInstruments
between Begin/End will generate an INVALID_OPERATION
If no instruments are enabled, executions of StartInstrumentsSGIX,
StopInstrumentsSGIX, ReadInstruments will not write measurements
to the buffer.
The number of measurements taken since the buffer was reset can be
queried with glGet using <pname> GL_INSTRUMENT_MEASUREMENTS.
To determine whether a measurement of the enabled instruments has
been written to the buffer call PollInstrumentsSGIX. If a new
measurement has appeared in the buffer since the last call to
PollInstrumentsSGIX, 1 will be returned, otherwise zero is
returned. If 1 is returned, the value of marker associated with
the measurement and passed to StopInstrumentsSGIX or
ReadInstrumentsSGIX is written into the integer referred to by
<markerp>. The measurements will appear in the buffer in the order
in which they were requested. If the buffer is overflowed,
PollInstrumentsSGIX may return -1 as soon as the overflow is
detected, even if the measurement being polled for did not cause
the overflow. An implementation may choose to delay reporting the
overflow until the measurement that caused the overflow is the one
being polled.
To get a total count of the number of new valid words written to
the buffer call GetInstrumentsSGIX. The value returned is the
number of ints that have been written to the buffer since the last
call to GetInstrumentsSGIX. GetInstrumentsSGIX can be used
independently of PollInstrumentsSGIX. If the buffer has been
overflowed since the last call to GetInstrumentsSGIX, -1 is
returned for the count.
Additions to Chapter 6 of the 1.0 Specification (State and State Requests)
The GL_INSTRUMENT_BUFFER_POINTER_SGIX enum should be added to the
list of enum's recognized by GetPointerv.
Additions to the GLX Specification
None
GLX Protocol
XXX - not yet complete
Errors
An INVALID_OPERATION is generated if any of the instruments
functions or procedures are called within Begin/End.
When calling glInstrumentsBufferSGIX, an INVALID_VALUE is
generated if <size> is negative.
An INVALID_OPERATION is generated if two StartInstrumentsSGIX are
called without an intervening call to StopInstrumentsSGIX or
InstrumentsBufferSGIX. Symetrically, an INVALID_OPERATION is
generated if StopInstrumentsSGIX is called twice without an
intervening StartInstrumentsSGIX. ReadInstrumentsSGIX will
generate an INVALID_OPERATION if called after a call to
StopInstruments without an intervening call to StopInstrumentsSGIX
or InstrumentsBufferSGIX.
Calling any of StartInstrumentsSGIX, StopInstrumentsSGIX,
ReadInstruments without a successful call to InstrumentsBufferSGIX
to define a buffer will generate an INVALID_OPERATION.
New State
Initial Initial
Get Value Get Command Type Value Attrib
--------- ----------- ---- ----- ------
INSTRUMENT_MEASUREMENTS_SGIX GetInteger Z 0 -
INSTRUMENT_BUFFER_POINTER_SGIX GetPointervEXT Y 0 -
New Implementation Dependent State
None