• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Name
2
3    KHR_debug
4
5Name Strings
6
7    GL_KHR_debug
8
9Contact
10
11    Christophe Riccio (christophe.riccio 'at' amd.com)
12
13Contributors
14
15    Jaakko Konttinen, AMD
16    Graham Sellers, AMD
17    Mark Young, AMD
18    Ahmet Oguz Akyuz, AMD
19    Bruce Merry, ARM
20    Daniel Koch, TransGaming
21    Jon Leech, Independent
22    Pat Brown, NVIDIA
23    Greg Roth, NVIDIA
24    Yaki Tebeka, Graphic Remedy
25    Piers Daniell, NVIDIA
26    Seth Sowerby, Apple
27    Benj Lipchak, Apple
28    Jean-François Roy, Apple
29    Daniel Rakos, AMD
30    Mark Callow, HI
31
32Notice
33
34    Copyright (c) 2012-2014 The Khronos Group Inc. Copyright terms at
35        http://www.khronos.org/registry/speccopyright.html
36
37Specification Update Policy
38
39    Khronos-approved extension specifications are updated in response to
40    issues and bugs prioritized by the Khronos OpenGL and OpenGL ES Working Groups. For
41    extensions which have been promoted to a core Specification, fixes will
42    first appear in the latest version of that core Specification, and will
43    eventually be backported to the extension document. This policy is
44    described in more detail at
45        https://www.khronos.org/registry/OpenGL/docs/update_policy.php
46
47Status
48
49    Complete.
50    Approved by the ARB on 2012/06/18.
51    Approved by the OpenGL ES WG on 2012/06/15.
52    Ratified by the Khronos Board of Promoters on 2012/07/27.
53
54Version
55
56    Last Modified Date: July 2, 2015
57    Author Revision: 17
58
59Number
60
61    ARB Extension #119
62    OpenGL ES Extension #118
63
64Dependencies
65
66    OpenGL 1.1 is required.
67
68    The extension is written against the OpenGL 4.2 Compatibility Profile
69    specification (April 27, 2012).
70
71Overview
72
73    This extension allows the GL to notify applications when various events
74    occur that may be useful during application development, debugging and
75    profiling.
76
77    These events are represented in the form of enumerable messages with a
78    human-readable string representation. Examples of debug events include
79    incorrect use of the GL, warnings of undefined behavior, and performance
80    warnings.
81
82    A message is uniquely identified by a source, a type and an
83    implementation-dependent ID within the source and type pair.
84
85    A message's source identifies the origin of the message and can either
86    describe components of the GL, the window system, third-party external
87    sources such as external debuggers, or even the application itself.
88
89    The type of the message roughly identifies the nature of the event that
90    caused the message. Examples include errors, performance warnings,
91    warnings about undefined behavior or notifications identifying that the
92    application is within a specific section of the application code.
93
94    A message's ID for a given source and type further distinguishes messages
95    within namespaces. For example, an error caused by a negative parameter
96    value or an invalid internal texture format are both errors generated by
97    the API, but would likely have different message IDs.
98
99    Each message is also assigned to a severity level that denotes roughly how
100    "important" that message is in comparison to other messages across all
101    sources and types. For example, notification of a GL error would likely
102    have a higher severity than a performance warning due to redundant state
103    changes.
104
105    Furthermore, every message contains an implementation-dependent string
106    representation that provides a useful description of the event.
107
108    Messages are communicated to the application through an application-
109    defined callback function that is called by the GL implementation on each
110    debug message. The motivation for the callback routine is to free
111    application developers from actively having to query whether a GL error,
112    or any other debuggable event has happened after each call to a GL
113    function. With a callback, developers can keep their code free of debug
114    checks, set breakpoints in the callback function, and only have to react
115    to messages as they occur. In situations where using a callback is not
116    possible, a message log is also provided that stores only copies of recent
117    messages until they are actively queried.
118
119    To control the volume of debug output, messages can be disabled either
120    individually by ID, or entire sets of messages can be turned off based on
121    combination of source and type, through the entire application code or
122    only section of the code encapsulated in debug groups. A debug group may
123    also be used to annotate the command stream using descriptive texts.
124
125    This extension also defines debug markers, a mechanism for the OpenGL
126    application to annotate the command stream with markers for discrete
127    events.
128
129    When profiling or debugging an OpenGL application with a built-in or an
130    external debugger or profiler, it is difficult to relate the commands
131    within the command stream to the elements of the scene or parts of the
132    program code to which they correspond. Debug markers and debug groups help
133    obviate this by allowing applications to specify this link. For example, a
134    debug marker can be used to identify the beginning of a frame in the
135    command stream and a debug group can encapsulate a specific command stream
136    to identify a rendering pass. Debug groups also allow control of the debug
137    outputs volume per section of an application code providing an effective
138    way to handle the massive amount of debug outputs that drivers can
139    generate.
140
141    Some existing implementations of ARB_debug_output only expose the
142    ARB_debug_output extension string if the context was created with the
143    debug flag {GLX|WGL}_CONTEXT_DEBUG_BIT_ARB as specified in
144    {GLX|WGL}_ARB_create_context. The behavior is not obvious when the
145    functionality is brought into the OpenGL core specification because the
146    extension string and function entry points must always exist.
147
148    This extension modifies the existing ARB_debug_output extension to allow
149    implementations to always have an empty message log. The specific messages
150    written to the message log or callback routines are already implementation
151    defined, so this specification simply makes it explicit that it's fine for
152    there to be zero messages generated, even when a GL error occurs, which is
153    useful if the context is non-debug.
154
155    Debug output can be enabled and disabled by changing the DEBUG_OUTPUT
156    state. It is implementation defined how much debug output is generated if
157    the context was created without the CONTEXT_DEBUG_BIT set. This is a new
158    query bit added to the existing GL_CONTEXT_FLAGS state to specify whether
159    the context was created with debug enabled.
160
161    Finally, this extension defines a mechanism for OpenGL applications to
162    label their objects (textures, buffers, shaders, etc.) with a descriptive
163    string.
164
165    When profiling or debugging an OpenGL application within an external or
166    built-in (debut output API) debugger or profiler it is difficult to
167    identify objects from their object names (integers).
168
169    Even when the object itself is viewed it can be problematic to
170    differentiate between similar objects. Attaching a descriptive string, a
171    label, to an object obviates this difficulty.
172
173    The intended purpose of this extension is purely to improve the user
174    experience within OpenGL development tools and application built-in
175    profilers and debuggers. This extension typically improves OpenGL
176    programmers efficiency by allowing them to instantly detect issues and the
177    reason for these issues giving him more time to focus on adding new
178    features to an OpenGL application.
179
180IP Status
181
182    No known IP claims.
183
184New Procedures and Functions
185
186    NOTE: when implemented in an OpenGL ES context, all entry points defined
187    by this extension must have a "KHR" suffix. When implemented in an
188    OpenGL context, all entry points must have NO suffix, as shown below.
189
190    void DebugMessageControl(enum source,
191                             enum type,
192                             enum severity,
193                             sizei count,
194                             const uint* ids,
195                             boolean enabled);
196
197    void DebugMessageInsert(enum source,
198                            enum type,
199                            uint id,
200                            enum severity,
201                            sizei length,
202                            const char* buf);
203
204    void DebugMessageCallback(DEBUGPROC callback,
205                              const void* userParam);
206
207    uint GetDebugMessageLog(uint count,
208                            sizei bufSize,
209                            enum* sources,
210                            enum* types,
211                            uint* ids,
212                            enum* severities,
213                            sizei* lengths,
214                            char* messageLog);
215
216    void GetPointerv(enum pname,
217                     void** params);
218
219    void PushDebugGroup(enum source, uint id, sizei length,
220        const char * message);
221
222    void PopDebugGroup(void);
223
224    void ObjectLabel(enum identifier, uint name, sizei length,
225        const char *label);
226
227    void GetObjectLabel(enum identifier, uint name, sizei bufSize,
228        sizei *length, char *label);
229
230    void ObjectPtrLabel(void* ptr, sizei length,
231        const char *label);
232
233    void GetObjectPtrLabel(void* ptr, sizei bufSize,
234        sizei *length, char *label);
235
236
237New Types
238
239    NOTE: when implemented in an OpenGL ES context, this typedef must have a
240    "KHR" suffix (GLDEBUGPROCKHR). When implemented in an OpenGL context,
241    thie typedef must have NO suffix, as shown below.
242
243    The callback function that applications can define, and
244    is accepted by DebugMessageCallback, is defined as:
245
246        typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,
247                                             GLenum type,
248                                             GLuint id,
249                                             GLenum severity,
250                                             GLsizei length,
251                                             const GLchar* message,
252                                             const void* userParam);
253
254    Note that this function pointer is defined as having the same calling
255    convention as the GL functions.
256
257New Tokens
258
259    NOTE: when implemented in an OpenGL ES context, all tokens defined by
260    this extension must have a "_KHR" suffix. When implemented in an OpenGL
261    context, all tokens must have NO suffix, as described below.
262
263    Tokens accepted by the <target> parameters of Enable, Disable, and
264    IsEnabled:
265
266        DEBUG_OUTPUT                                     0x92E0
267        DEBUG_OUTPUT_SYNCHRONOUS                         0x8242
268
269    Returned by GetIntegerv when <pname> is CONTEXT_FLAGS:
270
271        CONTEXT_FLAG_DEBUG_BIT                           0x00000002
272
273    Tokens accepted by the <value> parameters of GetBooleanv, GetIntegerv,
274    GetFloatv, GetDoublev and GetInteger64v:
275
276        MAX_DEBUG_MESSAGE_LENGTH                         0x9143
277        MAX_DEBUG_LOGGED_MESSAGES                        0x9144
278        DEBUG_LOGGED_MESSAGES                            0x9145
279        DEBUG_NEXT_LOGGED_MESSAGE_LENGTH                 0x8243
280        MAX_DEBUG_GROUP_STACK_DEPTH                      0x826C
281        DEBUG_GROUP_STACK_DEPTH                          0x826D
282        MAX_LABEL_LENGTH                                 0x82E8
283
284    Tokens accepted by the <pname> parameter of GetPointerv:
285
286        DEBUG_CALLBACK_FUNCTION                          0x8244
287        DEBUG_CALLBACK_USER_PARAM                        0x8245
288
289    Tokens accepted or provided by the <source> parameters of
290    DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the <sources>
291    parameter of GetDebugMessageLog (some commands restrict <source> to a
292    subset of these parameters; see the specification body for details):
293
294        DEBUG_SOURCE_API                                 0x8246
295        DEBUG_SOURCE_WINDOW_SYSTEM                       0x8247
296        DEBUG_SOURCE_SHADER_COMPILER                     0x8248
297        DEBUG_SOURCE_THIRD_PARTY                         0x8249
298        DEBUG_SOURCE_APPLICATION                         0x824A
299        DEBUG_SOURCE_OTHER                               0x824B
300
301    Tokens accepted or provided by the <type> parameters of
302    DebugMessageControl, DebugMessageInsert and DEBUGPROC, and the <types>
303    parameter of GetDebugMessageLog:
304
305        DEBUG_TYPE_ERROR                                 0x824C
306        DEBUG_TYPE_DEPRECATED_BEHAVIOR                   0x824D
307        DEBUG_TYPE_UNDEFINED_BEHAVIOR                    0x824E
308        DEBUG_TYPE_PORTABILITY                           0x824F
309        DEBUG_TYPE_PERFORMANCE                           0x8250
310        DEBUG_TYPE_OTHER                                 0x8251
311        DEBUG_TYPE_MARKER                                0x8268
312
313    Tokens accepted or provided by the <type> parameters of
314    DebugMessageControl and DEBUGPROC, and the <types> parameter of
315    GetDebugMessageLog:
316
317        DEBUG_TYPE_PUSH_GROUP                            0x8269
318        DEBUG_TYPE_POP_GROUP                             0x826A
319
320    Tokens accepted or provided by the <severity> parameters of
321    DebugMessageControl, DebugMessageInsert and DEBUGPROC callback functions,
322    and the <severities> parameter of GetDebugMessageLog:
323
324        DEBUG_SEVERITY_HIGH                              0x9146
325        DEBUG_SEVERITY_MEDIUM                            0x9147
326        DEBUG_SEVERITY_LOW                               0x9148
327        DEBUG_SEVERITY_NOTIFICATION                      0x826B
328
329    Returned by GetError:
330
331        STACK_UNDERFLOW                                  0x0504
332        STACK_OVERFLOW                                   0x0503
333
334    Tokens accepted or provided by the <identifier> parameters of
335    ObjectLabel and GetObjectLabel:
336
337        BUFFER                                           0x82E0
338        SHADER                                           0x82E1
339        PROGRAM                                          0x82E2
340        VERTEX_ARRAY
341        QUERY                                            0x82E3
342        PROGRAM_PIPELINE                                 0x82E4
343        TRANSFORM_FEEDBACK
344        SAMPLER                                          0x82E6
345        TEXTURE
346        RENDERBUFFER
347        FRAMEBUFFER
348      [[ Compatibility Profile ]]
349        DISPLAY_LIST                                     0x82E7
350      [[ End Profile-Specific Language ]]
351
352    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
353    GetFloatv, GetDoublev, and GetInteger64v:
354
355        MAX_LABEL_LENGTH
356
357Additions to Chapter 2 of the OpenGL 4.2 Specification
358(OpenGL Operation)
359
360    In section 2.5 - GL Errors:
361    Add to the end of the section (pg 19):
362
363    "When an error is generated, the GL will also generate a debug output
364    message describing its cause (see section 5.5).  The message has the
365    source DEBUG_SOURCE_API and the type DEBUG_TYPE_ERROR, and an
366    implementation-dependent ID."
367
368Additions to Chapter 3 of the OpenGL 4.2 Specification
369(Rasterization)
370
371    None.
372
373Additions to Chapter 4 of the OpenGL 4.2 Specification
374(Per-Fragment Operations and the Frame Buffer)
375
376    None.
377
378Additions to Chapter 5 of the OpenGL 4.2 Specification
379(Special Functions)
380
381    After section 5.4 - Hints (pg. 300) (section 5.3, p 217 in OpenGL ES 3.0),
382    add new section:
383
384    "5.5 - Debug Output
385
386    Application developers can obtain more information from the GL runtime in
387    the form of debug output.  This information can include details about GL
388    errors, undefined behavior, implementation-dependent performance warnings,
389    or other useful hints.
390
391    This information is communicated through a stream of debug messages that
392    are generated as GL commands are executed.  The application can choose to
393    receive these messages either through a callback routine, or by querying
394    for them from a message log.
395
396    Controls are provided for disabling messages that the application does not
397    care about, and for inserting application-generated messages into the
398    stream.
399
400    The GL may provide different levels of debug output depending on how the
401    context was created. If the context was created without the
402    CONTEXT_FLAG_DEBUG_BIT in the CONTEXT_FLAGS state, as described in Section
403    6.1.12, then the GL may optionally not generate any debug messages, but
404    the functions described below will otherwise operate without error.
405
406    Debug output functionality is controlled with the DEBUG_OUTPUT enable
407    state. If the context is created with the CONTEXT_FLAG_DEBUG_BIT set then
408    the initial state of DEBUG_OUTPUT is TRUE, otherwise the initial state of
409    DEBUG_OUTPUT is FALSE. In a debug context, if DEBUG_OUTPUT is disabled the
410    GL will not generate any debug output logs or callbacks. Enabling
411    DEBUG_OUTPUT again will enable full debug output functionality. If the
412    context was created without the CONTEXT_FLAG_DEBUG_BIT and the
413    DEBUG_OUTPUT is later enabled, the level of debug output logging is
414    defined by the GL implementation, which may have zero debug output. To
415    guarantee the full debug output support of the GL implementation the
416    context should be created with CONTEXT_FLAG_DEBUG_BIT context flag bit
417    set.
418
419    5.5.1 - Debug Messages
420
421    A debug message is uniquely identified by the source that generated it, a
422    type within that source, and an unsigned integer ID identifying the
423    message within that type. The message source is one of the symbolic
424    constants listed in Table 5.3. The message type is one of the symbolic
425    constants listed in Table 5.4.
426
427    Debug Output Message Source           Messages Generated by
428    ---------------------------           ---------------------
429    DEBUG_SOURCE_API                      The GL
430
431    DEBUG_SOURCE_SHADER_COMPILER          The GLSL shader compiler or compilers for
432                                          other extension-provided languages
433
434    DEBUG_SOURCE_WINDOW_SYSTEM            The window system, such as WGL or GLX
435
436    DEBUG_SOURCE_THIRD_PARTY              External debuggers or third-party middleware
437                                          libraries
438
439    DEBUG_SOURCE_APPLICATION              The application
440
441    DEBUG_SOURCE_OTHER                    Sources that do not fit to any of the ones listed above
442    ----------------------------------------------------------------------------
443    Table 5.3: Sources of debug output messages.  Each message must originate
444    from a source listed in this table.
445
446
447    Debug Output Message Type               Informs about
448    -------------------------               -------------
449    DEBUG_TYPE_ERROR                        Events that generated an error
450
451    DEBUG_TYPE_DEPRECATED_BEHAVIOR          Behavior that has been marked for
452                                            deprecation
453
454    DEBUG_TYPE_UNDEFINED_BEHAVIOR           Behavior that is undefined according to
455                                            the specification
456
457    DEBUG_TYPE_PERFORMANCE                  Implementation-dependent performance
458                                            warnings
459
460    DEBUG_TYPE_PORTABILITY                  Use of extensions or shaders in a way that
461                                            is highly vendor-specific
462
463    DEBUG_TYPE_OTHER                        Types of events that do not fit any of
464                                            the ones listed above
465
466    DEBUG_TYPE_MARKER                       Annotation of the command stream
467
468    DEBUG_TYPE_PUSH_GROUP                   Entering a debug group
469
470    DEBUG_TYPE_POP_GROUP                    Leaving a debug group
471
472    ----------------------------------------------------------------------------
473    Table 5.4: Types of debug output messages. Each message is associated with
474    one of these types that describes the nature of the message.
475
476    Each message source and type pair contains its own namespace of messages
477    with every message being associated with an ID. The assignment of IDs to
478    messages within a namespace is implementation-dependent. There can
479    potentially be overlap between the namespaces of two different pairs of
480    source and type, so messages can only be uniquely distinguished from each
481    other by the full combination of source, type and ID.
482
483    Each message is also assigned a severity level that roughly describes its
484    importance across all sources and types along a single global axis. The
485    severity of a message is one of the symbolic constants defined in
486    Table 5.5. Because messages can be disabled by their severity, this allows
487    for quick control the global volume of debug output.
488
489    Severity Level Token                  Suggested examples of messages
490    --------------------                  ------------------------------
491
492    DEBUG_SEVERITY_HIGH                   Any GL error; dangerous undefined behavior;
493                                          any GLSL or ARB shader compiler and
494                                          linker errors;
495
496    DEBUG_SEVERITY_MEDIUM                 Severe performance warnings; GLSL
497                                          or other shader compiler and linker
498                                          warnings; use of currently deprecated
499                                          behavior
500
501    DEBUG_SEVERITY_LOW                    Performance warnings from redundant
502                                          state changes; trivial undefined behavior
503
504    DEBUG_SEVERITY_NOTIFICATION           Any message which is not an
505                                          error or performance concern
506
507    ----------------------------------------------------------------------------
508    Table 5.5: Severity levels of messages.  Each debug output message is
509    associated with one of these severity levels.
510
511
512    Every message also has a null-terminated string representation that is
513    used to describe the message.  The contents of the string can change
514    slightly between different instances of the same message (e.g. which
515    parameter value caused a specific GL error to occur). The format of a
516    message string is left as implementation-dependent, although it should at
517    least represent a concise description of the event that caused the message
518    to be generated.  Messages with different IDs should also have
519    sufficiently distinguishable string representations to warrant their
520    separation.
521
522    The lengths of all messages, including their null terminators, must be
523    guaranteed to be less or equal to the value of the
524    implementation-dependent constant MAX_DEBUG_MESSAGE_LENGTH.
525
526    Messages can be either enabled or disabled.  Messages that are disabled
527    will not be generated. All messages are initially enabled unless their
528    assigned severity is DEBUG_SEVERITY_LOW. The enabled state of messages can
529    be changed using the command DebugMessageControl.
530
531    5.5.2 - Debug Message Callback
532
533    Applications can provide a callback function for receiving debug messages
534    using the command
535
536        void DebugMessageCallback(DEBUGPROC callback,
537                                  const void* userParam);
538
539    with <callback> storing the address of the callback function. This
540    function's prototype must follow the type definition of DEBUGPROC
541    including its platform-dependent calling convention. Anything else will
542    result in undefined behavior. Only one debug callback can be specified
543    for the current context, and further calls overwrite the previous
544    callback. Specifying NULL as the value of <callback> clears the current
545    callback and disables message output through callbacks. Applications can
546    provide user-specified data through the pointer <userParam>. The context
547    will store this pointer and will include it as one of the parameters in
548    each call to the callback function.
549
550    If the application has specified a callback function for receiving debug
551    output, the implementation will call that function whenever any enabled
552    message is generated.  The source, type, ID, and severity of the message
553    are specified by the DEBUGPROC parameters <source>, <type>, <id>, and
554    <severity>, respectively. The string representation of the message is
555    stored in <message> and its length (excluding the null-terminator) is
556    stored in <length>. The parameter <userParam> is the user-specified
557    parameter that was given when calling DebugMessageCallback.
558
559    Applications can query the current callback function and the current
560    user-specified parameter by obtaining the values of
561    DEBUG_CALLBACK_FUNCTION and DEBUG_CALLBACK_USER_PARAM, respectively.
562
563    Applications that specify a callback function must be aware of certain
564    special conditions when executing code inside a callback when it is
565    called by the GL, regardless of the debug source.
566
567    The memory for <message> is owned and managed by the GL, and should
568    only be considered valid for the duration of the function call.
569
570    The behavior of calling any GL or window system function from within the
571    callback function is undefined and may lead to program termination.
572
573    Care must also be taken in securing debug callbacks for use with
574    asynchronous debug output by multi-threaded GL implementations.
575    Section 5.5.7 describes this in further detail.
576
577    If the DEBUG_OUTPUT state is disabled then the GL will not call the
578    callback function.
579
580    5.5.3 - Debug Message Log
581
582    If DEBUG_CALLBACK_FUNCTION is NULL, then debug messages are instead
583    stored in an internal message log up to some maximum number of messages
584    as defined by the value of MAX_DEBUG_LOGGED_MESSAGES.
585
586    Each context stores its own message log and will only store messages
587    generated by commands operating in that context.  If the message log
588    fills up, then any subsequently generated messages will not be
589    placed in the log until the message log is cleared, and will instead
590    be discarded.
591
592    Applications can query the number of messages currently in the log by
593    obtaining the value of DEBUG_LOGGED_MESSAGES, and the string length
594    (including its null terminator) of the oldest message in the log through
595    the value of DEBUG_NEXT_LOGGED_MESSAGE_LENGTH.
596
597    To fetch message data stored in the log, the command GetDebugMessageLog
598    can be used as described in section 6.1.15.
599
600    If DEBUG_CALLBACK_FUNCTION is not NULL, no generated messages will be
601    stored in the log but will instead be passed to the debug callback routine
602    as described in section 5.5.2.
603
604    If the DEBUG_OUTPUT state is disabled then no messages are added to the
605    message log.
606
607    5.5.4 - Controlling Debug Messages
608
609    Applications can control the volume of debug output in the active debug
610    group, by disabling specific or groups of messages with the command:
611
612        void DebugMessageControl(enum source,
613                                 enum type,
614                                 enum severity,
615                                 sizei count,
616                                 const uint* ids,
617                                 boolean enabled);
618
619    If <enabled> is TRUE, the referenced subset of messages will be enabled.
620    If FALSE, then those messages will be disabled.
621
622    This command can reference different subsets of messages by first
623    considering the set of all messages, and filtering out messages based on
624    the following ways:
625
626        - If <source>, <type>, or <severity> is DONT_CARE, the messages from
627          all sources, of all types, or of all severities are referenced
628          respectively.
629
630        - When values other than DONT_CARE are specified, all messages whose
631          source, type, or severity match the specified <source>, <type>, or
632          <severity> respectively will be referenced.
633
634        - If <count> is greater than zero, then <ids> is an array of <count>
635          message IDs for the specified combination of <source> and <type>. In
636          this case, if <source> or <type> is DONT_CARE, or <severity> is not
637          DONT_CARE, the error INVALID_OPERATION is generated.
638
639          Unrecognized message IDs in <ids> are ignored. If <count> is zero,
640          the value if <ids> is ignored.
641
642    In addition, if any of <source>, <type>, and <severity> is not DONT_CARE
643    and is not one of the symbols from, respectively, Table 5.3, Table 5.4,
644    and Table 5.5, the error INVALID_ENUM is generated. If <count> is
645    negative, the error INVALID_VALUE is generated.
646
647    Although messages are grouped into an implicit hierarchy by their
648    sources and types, there is no explicit per-source, per-type or
649    per-severity enabled state. Instead, the enabled state is stored
650    individually for each message. There is no difference between disabling
651    all messages from one source in a single call, and individually
652    disabling all messages from that source using their types and IDs.
653
654    If the DEBUG_OUTPUT state is disabled the GL operates the same as
655    if messages of every <source>, <type> or <severity> are disabled.
656
657    5.5.5 - Externally Generated Messages
658
659    To support applications and third-party libraries generating their own
660    messages, such as ones containing timestamp information or signals about
661    specific render system events, the following function can be called
662
663        void DebugMessageInsert(enum source,
664                                enum type,
665                                uint id,
666                                enum severity,
667                                int length,
668                                const char* buf);
669
670    The value of <id> specifies the ID for the message and <severity>
671    indicates its severity level as defined by the caller. If <severity> is
672    not one of the severity levels listed in Table 5.5, the error
673    INVALID_ENUM will be generated. The value of <type> must be one of the
674    values from Table 5.4 and the value of <source> must be either
675    DEBUG_SOURCE_APPLICATION or DEBUG_SOURCE_THIRD_PARTY, or the error
676    INVALID_ENUM will be generated. The string <buf> contains the string
677    representation of the message. The parameter <length> contains the number
678    of characters in <buf>. If <length> is negative, it is implied that <buf>
679    contains a null terminated string. The error INVALID_VALUE will be
680    generated if the number of characters in <buf>, excluding the null
681    terminator when <length> is negative, is not less than the value of
682    MAX_DEBUG_MESSAGE_LENGTH.
683
684    If the DEBUG_OUTPUT state is disabled calls to DebugMessageInsert are
685    discarded and do not generate an error.
686
687    5.5.6 - Debug Groups
688
689    Debug groups provide a method for annotating a command stream with
690    discrete groups of commands using a descriptive text. Debug output
691    messages, either generated by the implementation or inserted by the
692    application with DebugMessageInsert are written to the active debug group,
693    the top of the debug group stack. Debug groups are strictly hierarchical.
694    Their sequences may be nested within other debug groups but can not
695    overlap. If no debug group has been pushed by the application then the
696    active debug group is the default debug group.
697
698    The command
699
700        void PushDebugGroup(enum source, uint id, sizei length,
701            const char *message);
702
703    pushes a debug group described by the string <message> into the command
704    stream. The value of <id> specifies the ID of messages generated. The
705    parameter <length> contains the number of characters in <message>. If
706    <length> is negative, it is implied that <message> contains a null
707    terminated string. The message has the specified <source> and <id>, <type>
708    DEBUG_TYPE_PUSH_GROUP, and <severity> DEBUG_SEVERITY_NOTIFICATION. The GL
709    will put a new debug group on top of the debug group stack which inherits
710    the control of the volume of debug output of the debug group previously
711    residing on the top of the debug group stack. Because debug groups are
712    strictly hierarchical, any additional control of the debug output volume
713    will only apply within the active debug group and the debug groups pushed
714    on top of the active debug group.
715
716    An INVALID_ENUM error is generated if the value of <source> is neither
717    DEBUG_SOURCE_APPLICATION nor DEBUG_SOURCE_THIRD_PARTY. An INVALID_VALUE
718    error is generated if <length> is negative and the number of characters in
719    <message>, excluding the null-terminator, is not less than the value of
720    MAX_DEBUG_MESSAGE_LENGTH.
721
722    The command
723
724        void PopDebugGroup();
725
726    pops the active debug group. When a debug group is popped, the GL
727    will also generate a debug output message describing its cause based
728    on the <message> string, the source <source>, and an ID <id> submitted
729    to the associated PushDebugGroup command. DEBUG_TYPE_PUSH_GROUP
730    and DEBUG_TYPE_POP_GROUP share a single namespace for message <id>.
731    <severity> has the value DEBUG_SEVERITY_NOTIFICATION. The <type>
732    has the value DEBUG_TYPE_POP_GROUP. Popping a debug group restores
733    the debug output volume control of the parent debug group.
734
735    Attempting to pop the default debug group off the stack generates a
736    STACK_UNDERFLOW error; pushing a debug group onto a stack containing
737    MAX_DEBUG_GROUP_STACK_DEPTH minus one elements will generate a
738    STACK_OVERFLOW error.
739
740    5.5.7 - Asynchronous and Synchronous Debug Output
741
742    The behavior of how and when the GL driver is allowed to generate debug
743    messages, and subsequently either call back to the application or place
744    the message in the debug message log, is affected by the state
745    DEBUG_OUTPUT_SYNCHRONOUS. This state can be modified by the Enable and
746    Disable commands. Its initial value is FALSE.
747
748    When DEBUG_OUTPUT_SYNCHRONOUS is disabled, the driver is optionally
749    allowed to concurrently call the debug callback routine from
750    potentially multiple threads, including threads that the context that
751    generated the message is not currently bound to. The implementation may
752    also call the callback routine asynchronously after the GL command that
753    generated the message has already returned. The application is fully
754    responsible for ensuring thread safety due to debug callbacks under
755    these circumstances. In this situation the <userParam> value may be
756    helpful in identifying which application thread's command originally
757    generated the debug callback.
758
759    When DEBUG_OUTPUT_SYNCHRONOUS is enabled, the driver guarantees
760    synchronous calls to the callback routine by the context. When synchronous
761    callbacks are enabled, all calls to the callback routine will be made by
762    the thread that owns the current context; all such calls will be made
763    serially by the current context; and each call will be made before the GL
764    command that generated the debug message is allowed to return.
765
766    When no callback is specified and DEBUG_OUTPUT_SYNCHRONOUS is disabled,
767    the driver can still asynchronously place messages in the debug message
768    log, even after the context thread has returned from the GL function that
769    generated those messages. When DEBUG_OUTPUT_SYNCHRONOUS is enabled, the
770    driver guarantees that all messages are added to the log before the GL
771    function returns.
772
773    Enabling synchronous debug output greatly simplifies the responsibilities
774    of the application for making its callback functions thread-safe, but may
775    potentially result in drastically reduced driver performance.
776
777    DEBUG_OUTPUT_SYNCHRONOUS only guarantees intra-context synchronization for
778    the callbacks of messages generated by that context, and does not
779    guarantee synchronization across multiple contexts. If multiple contexts
780    are concurrently used by the application, it is allowed for those contexts
781    to also concurrently call their designated callbacks, and the application
782    is responsible for handling thread safety in that situation even if
783    DEBUG_OUTPUT_SYNCHRONOUS is enabled in all contexts."
784
785    5.5.8 Debug Labels:
786
787    Debug labels provide a method for annotating any object (texture, buffer,
788    shader, etc.) with a descriptive text label. These labels may then be used
789    by the debug output (see section 5.5) or an external tool such as a
790    debugger or profiler to describe labelled objects.
791
792    The command
793
794        void ObjectLabel(enum identifier, uint name, sizei length, const char *label);
795
796    labels the object identified by <name> and its namespace <identifier>.
797    <identifier> must be one of the tokens in table 5.1, indicating the type
798    of the object corresponding to <name>.
799
800
801        Identifier           Object Type
802        ---------------------------------------
803        BUFFER            |  buffer
804        SHADER            |  shader
805        PROGRAM           |  program
806        VERTEX_ARRAY      |  vertex array
807        QUERY             |  query
808        PROGRAM_PIPELINE  |  program pipeline
809        TRANSFORM_FEEDBACK|  transform feedback
810        SAMPLER           |  sampler
811        TEXTURE           |  texture
812        RENDERBUFFER      |  render buffer
813        FRAMEBUFFER       |  frame buffer
814[[ Compatibility Profile Only]]
815        DISPLAY_LIST      |  display list
816[[ End Profile-Specific Language ]]
817        ---------------------------------------
818        Table 5.1. Valid object namespace identifiers and the corresponding
819        object type.
820
821    The command
822
823        void ObjectPtrLabel(void* ptr, sizei length, const char *label);
824
825    labels a sync object identified by <ptr>.
826
827    <label> contains a string used to label an object. <length> contains the
828    number of characters in <label>. If <length> is negative, it is implied that
829    <label> contains a null-terminated string. If <label> is NULL, any debug
830    label is effectively removed from the object.
831
832    An INVALID_ENUM error is generated by ObjectLabel if <identifier> is not
833    one of the object types listed in table 5.1.
834
835    An INVALID_VALUE error is generated by ObjectLabel if <name> is not
836    the name of a valid object of the type specified by <identifier>.
837
838    An INVALID_VALUE is generated if the <ptr> parameter of ObjectPtrLabel
839    is not the name of a sync object.
840
841    An INVALID_VALUE error is generated if the number of characters in
842    <label>, excluding the null terminator when <length> is negative, is not
843    less than the value of MAX_LABEL_LENGTH.
844
845    A label is part of the state of the object to which it is associated.
846    The initial state of an object's label is the empty string. Labels need
847    not be unique.
848
849
850Additions to Chapter 6 of the OpenGL 4.2 Specification
851(State and State Requests)
852
853    Modify the title of Section 6.1.6 - String Queries to read
854    "Section 6.1.6 - Pointer and String Queries", and insert to the
855    beginning of the section:
856
857    The command
858
859        void GetPointerv(enum pname, void** params);
860
861    obtains the pointer or pointers named <pname> in the array <params>.
862    The possible values for <pname> are DEBUG_CALLBACK_FUNCTION and
863    DEBUG_CALLBACK_USER_PARAM, which respectively return the current
864    debug output callback function pointer and its application-specified
865    user parameter.  Each <pname> returns a single pointer value.
866
867    Modify Section 6.1.12 "Pointer and String Queries"
868
869    Add to the paragraph describing the context profile mask and flags
870    (preceding the description of GetStringi) on page 485:
871
872    "If CONTEXT_FLAG_DEBUG_BIT is set in CONTEXT_FLAGS, then the DEBUG_OUTPUT
873    state, as described in section 5.5, will be enabled by default."
874
875    After Section 6.1.14 - Renderbuffer Object Queries (pg 324):
876    Add new Section 6.1.15 - Debug Object Queries:
877
878    6.1.15 - Debug Output Queries
879
880    When no debug callback is set, debug messages are stored in
881    a debug message log as described in section 5.5.3.  Messages can
882    be queried from the log by calling
883
884        uint GetDebugMessageLog(uint count,
885                                sizei bufSize,
886                                enum* sources,
887                                enum* types,
888                                uint* ids,
889                                enum* severities,
890                                sizei* lengths,
891                                char* messageLog);
892
893    This function fetches a maximum of <count> messages from the message
894    log, and will return the number of messages successfully fetched.
895
896    Messages will be fetched from the log in order of oldest to
897    newest.  Those messages that were fetched will be removed from the
898    log.
899
900    The sources, types, severities, IDs, and string lengths of
901    fetched messages will be stored in the application-provided arrays
902    <sources>, <types>, <severities>, <ids>, and <lengths>,
903    respectively.  The application is responsible for allocating enough
904    space for each array to hold up to <count> elements.  The string
905    representations of all fetched messages are stored in the
906    <messageLog> array.  If multiple messages are fetched, their strings
907    are concatenated into the same <messageLog> array and will be
908    separated by single null terminators.  The last string in the array
909    will also be null-terminated.  The maximum size of <messageLog>,
910    including the space used by all null terminators, is given by
911    <bufSize>. If <bufSize> is less than zero and <messageLog> is not
912    NULL, an INVALID_VALUE error will be generated. If a message's
913    string, including its null terminator, can not fully fit within the
914    <messageLog> array's remaining space, then that message and any
915    subsequent messages will not be fetched and will remain in the log.
916    The string lengths stored in the array <lengths> include the space
917    for the null terminator of each string.
918
919    Any or all of the arrays <sources>, <types>, <ids>, <severities>,
920    <lengths> and <messageLog> can also be null pointers, which causes
921    the attributes for such arrays to be discarded when messages
922    are fetched, however those messages will still be removed from the
923    log.  Thus to simply delete up to <count> messages from the message
924    log while ignoring their attributes, the application can call the
925    function with null pointers for all attribute arrays.
926
927    If the context was created without the CONTEXT_FLAG_DEBUG_BIT in the
928    CONTEXT_FLAGS state, as described in Section 6.1.12, then the GL can opt
929    to never add messages to the message log so GetDebugMessageLog will
930    always return zero.
931
932    Add new Section 6.1.16 - Debug Label Queries:
933
934    6.1.16 - Debug Label Queries
935
936    The command
937
938        void GetObjectLabel(enum identifier, uint name, sizei bufSize,
939            sizei *length, char *label);
940        void GetObjectPtrLabel(void* ptr, sizei bufSize,
941            sizei *length, char *label);
942
943    returns in <label> the string labelling an object. <label> will be
944    null-terminated. The actual number of characters written into <label>,
945    excluding the null terminator, is returned in <length>. If <length> is
946    NULL, no length is returned. The maximum number of characters that may
947    be written into <label>, including the null terminator, is specified by
948    <bufSize>. If no debug label was specified for the object then <label>
949    will contain a null-terminated empty string, and zero will be returned
950    in <length>. If <label> is NULL and <length> is non-NULL then no string
951    will be returned and the length of the label will be returned in
952    <length>.
953
954    An INVALID_ENUM error is generated by GetObjectLabel if identifier is not
955    one of the object types listed in table 5.1 except SYNC.
956
957    An INVALID_VALUE error is generated by GetObjectLabel if <name> is not
958    the name of a valid object of the type specified by <identifier>.
959
960Additions to the OpenGL / GLX / GLX Protocol Specifications
961
962    None.
963
964Additions to the WGL Specification
965
966    None.
967
968
969Interactions with OpenGL ES
970
971    This extension specification uses non-suffixed names for new entry
972    points, types, and tokens. This is correct for implementations against
973    OpenGL. However, when implemented in an OpenGL ES context, all new entry
974    points, types, and tokens are given KHR suffixes.
975
976    In OpenGL ES versions prior to and including ES 3.1 there is no
977    CONTEXT_FLAGS state and therefore the CONTEXT_FLAG_DEBUG_BIT cannot be
978    queried. GLES contexts must act as if this state existed as described
979    in this specification even if the state itself is not visible to
980    applications. For example, DEBUG_OUTPUT must still be enabled by default
981    if the context was created with debug enabled.
982
983Interactions with GLX_ARB_create_context_robustness
984
985    If the GLX window-system binding API is used to create a context,
986    the GLX_ARB_create_context extension is supported, and the bit
987    GLX_CONTEXT_DEBUG_BIT_ARB is set in GLX_CONTEXT_FLAGS when
988    glXCreateContextAttribsARB is called, the resulting context will
989    have debug enabled, and the CONTEXT_FLAG_DEBUG_BIT bit will be set
990    in CONTEXT_FLAGS as described above in section 6.1.12.
991
992Interactions with WGL_ARB_create_context_robustness
993
994    If the WGL window-system binding API is used to create a context,
995    the WGL_ARB_create_context extension is supported, and the bit
996    WGL_CONTEXT_DEBUG_BIT_ARB is set in WGL_CONTEXT_FLAGS when
997    wglCreateContextAttribsARB is called, the resulting context will
998    have debug enabled, and the CONTEXT_FLAG_DEBUG_BIT bit will be set
999    in CONTEXT_FLAGS as described above in section 6.1.12.
1000
1001Dependencies on GL and ES profiles, versions, and other extensions
1002
1003    Dependencies on OpenGL 4.2 Compatibility specification and any other
1004    versions or extensions that already provide the GetPointerv entry
1005    point as provided by the OpenGL 4.2 Compatibility specification
1006
1007        - Remove the modifications to Section 6.1.6 from this
1008          specification with the exception that GetPointerv will still
1009          accept DEBUG_CALLBACK_FUNCTION and
1010          DEBUG_CALLBACK_USER_PARAM as valid values for <pname>,
1011          and will return the same values as described in Chapter 6.
1012
1013    Dependencies on OpenGL 4.2 Compatibility specification and any other
1014    versions that support display lists
1015
1016        - DebugMessageControl, DebugMessageInsert,
1017          DebugMessageCallback, and GetDebugMessageLog are
1018          not compiled into display lists.
1019
1020          Add the following to section 5.5.1 of the OpenGL 4.0
1021          Compatibility specification, after the paragraph beginning
1022          with "GL command stream management" (pg 414):
1023
1024            "Debug output: DebugMessageControl,
1025             DebugMessageInsert, DebugMessageCallback, and
1026             GetDebugMessageLog"
1027
1028          Add the same language to corresponding sections of other
1029          specifications.
1030
1031Dependencies on program pipeline objects
1032
1033    If program pipeline objects are not supported, remove PROGRAM_PIPELINE
1034    from table 5.1.
1035
1036    Program pipeline objects are supported starting with OpenGL 4.2 and
1037    OpenGL ES 3.1. They are also supported if the OpenGL
1038    GL_ARB_separate_shader_objects or OpenGL ES
1039    GL_EXT_separate_shader_objects extensions are supported.
1040
1041Errors
1042
1043    The error INVALID_ENUM will be generated by DebugMessageControl
1044    if <source> is not DONT_CARE or one of the debug output sources
1045    listed in Table 5.3.
1046
1047    The error INVALID_ENUM will be generated by DebugMessageControl
1048    if <type> is not DONT_CARE or one of the debug output types listed
1049    in Table 5.4.
1050
1051    The error INVALID_ENUM will be generated by DebugMessageControl
1052    if <severity> is not DONT_CARE or one of the severity levels listed
1053    in Table 5.5.
1054
1055    The error INVALID_VALUE will be generated by DebugMessageControl
1056    if <count> is less than zero.
1057
1058    The error INVALID_OPERATION will be generated by
1059    DebugMessageControl when <count> is greater than zero and
1060    <source> is DONT_CARE.
1061
1062    The error INVALID_OPERATION will be generated by
1063    DebugMessageControl when <count> is greater than zero and
1064    <type> is DONT_CARE.
1065
1066    The error INVALID_OPERATION will be generated by
1067    DebugMessageControl when <count> is greater than zero and
1068    and <severity> is not DONT_CARE.
1069
1070    The error INVALID_VALUE will be generated by GetDebugMessageLog
1071    if the value of <count> is less than zero.
1072
1073    The error INVALID_VALUE will be generated by GetDebugMessageLog
1074    if <bufSize> is less than zero.
1075
1076    The error INVALID_ENUM will be generated by DebugMessageInsert if
1077    the value of <source> is not DEBUG_SOURCE_APPLICATION or
1078    DEBUG_SOURCE_THIRD_PARTY.
1079
1080    The error INVALID_ENUM will be generated by DebugMessageInsert if
1081    the value of <type> is not one of the values from Table 5.4.
1082
1083    The error INVALID_ENUM will be generated by DebugMessageInsert if
1084    <severity> is not a valid debug severity level listed in Table 5.5.
1085
1086    The error INVALID_VALUE will be generated by DebugMessageInsert
1087    if the number of characters in <buf>, excluding the null terminator
1088    when <length> is negative, is not less than
1089    MAX_DEBUG_MESSAGE_LENGTH.
1090
1091    The error INVALID_ENUM will be generated by PushDebugGroup
1092    if <source> is not DEBUG_SOURCE_APPLICATION or
1093    DEBUG_SOURCE_THIRD_PARTY.
1094
1095    The error INVALID_VALUE will be generated by PushDebugGroup
1096    if <length> is negative and the number of characters in <message>,
1097    excluding the null-terminator, is not less than the value of
1098    MAX_DEBUG_MESSAGE_LENGTH.
1099
1100    The <source> value of PushDebugGroup must be either
1101    DEBUG_SOURCE_APPLICATION or DEBUG_SOURCE_THIRD_PARTY, or the
1102    error INVALID_ENUM will be generated.
1103
1104    Popping a group off the stack with no entry generates the error
1105    STACK_UNDERFLOW; pushing a debug group onto a full stack generates
1106    the error STACK_OVERFLOW.
1107
1108    An INVALID_VALUE error is generated by ObjectLabel and
1109    GetObjectLabel if <name> is not the name of a valid object of the type
1110    specified by <identifier>.
1111
1112    An INVALID_VALUE error is generated by ObjectPtrLabel and
1113    GetObjectPtrLabel if <ptr> is not the name of a sync object.
1114
1115    An INVALID_VALUE error is generated by ObjectLabel if the number of
1116    characters in <label>, excluding the null terminator when <length> is
1117    negative, is not less than MAX_LABEL_LENGTH.
1118
1119    An INVALID_ENUM error is generated by ObjectLabel and GetObjectLabel if
1120    <identifier> is not one of the object namespace tokens in table 5.1.
1121
1122
1123New State
1124
1125    Add new table 6.55 after p.376 (Debug Output):
1126
1127                                                                       Initial
1128    Get Value                             Type  Get Command            Value         Description                Sec     Attribute
1129    --------------------------            ----  -----------            -------       -------------------------  ------  ---------
1130    DEBUG_CALLBACK_FUNCTION               Y     GetPointerv            NULL          The current debug output  5.5.2     -
1131                                                                                     callback function pointer
1132
1133    DEBUG_CALLBACK_USER_PARAM             Y     GetPointerv            NULL          The current debug output  5.5.2     -
1134                                                                                     callback user parameter
1135
1136    DEBUG_LOGGED_MESSAGES                 Z+    GetIntegerv            0             The number of messages    5.5.3     -
1137                                                                                     currently in the debug
1138                                                                                     message log
1139
1140    DEBUG_NEXT_LOGGED_MESSAGE_LENGTH      Z+    GetIntegerv            0             The string length of the  5.5.3     -
1141                                                                                     oldest debug message in
1142                                                                                     the debug message log
1143
1144    DEBUG_GROUP_STACK_DEPTH               Z+    GetIntegerv            1             Debug group stack         5.5.6     -
1145                                                                                     pointer
1146
1147    DEBUG_OUTPUT_SYNCHRONOUS              B     IsEnabled              FALSE         The enabled state for     5.5.7     -
1148                                                                                     synchronous debug message
1149                                                                                     callbacks
1150
1151    DEBUG_OUTPUT                          B     IsEnabled              Depends on    The enabled state for     5.5       -
1152                                                                       the context*  debug output
1153                                                                                     functionality
1154
1155    * Contexts created with the CONTEXT_DEBUG_BIT bit set, as defined in
1156    GLX_ARB_create_context and WGL_ARB_create_context control the initial
1157    value of this state. If CONTEXT_DEBUG_BIT is set then the initial
1158    value of DEBUG_OUTPUT is TRUE otherwise its FALSE.
1159
1160
1161    Add the following to Table 6.14 Buffer Object State:
1162
1163                                       Initial
1164    Get Value  Type  Get Command       Value    Description  Sec
1165    ---------  ----  --------------    -------  -----------  ---
1166    -          S     GetObjectLabel    empty    Debug label  6.2
1167
1168    Add the following to Table 6.24 Textures (state per texture object):
1169
1170                                       Initial
1171    Get Value  Type  Get Command       Value    Description  Sec
1172    ---------  ----  --------------    -------  -----------  ---
1173    -          S     GetObjectLabel    empty    Debug label  6.2
1174
1175    Add the following to Table 6.44 Shader Object State:
1176
1177                                       Initial
1178    Get Value  Type  Get Command       Value    Description  Sec
1179    ---------  ----  --------------    -------  -----------  ---
1180    -          S     GetObjectLabel    empty    Debug label  6.2
1181
1182    Add the following to Table 6.46 Program Object State:
1183
1184                                       Initial
1185    Get Value  Type  Get Command       Value    Description  Sec
1186    ---------  ----  --------------    -------  -----------  ---
1187    -          S     GetObjectLabel    empty    Debug label  6.2
1188
1189    Add the following to Table 6.36 Renderbuffer  (state per renderbuffer object):
1190
1191                                       Initial
1192    Get Value  Type  Get Command       Value    Description  Sec
1193    ---------  ----  --------------    -------  -----------  ---
1194    -          S     GetObjectLabel    empty    Debug label  6.2
1195
1196    Add the following to Table 6.33 Framebuffer (state per framebuffer object):
1197
1198                                       Initial
1199    Get Value  Type  Get Command       Value    Description  Sec
1200    ---------  ----  --------------    -------  -----------  ---
1201    -          S     GetObjectLabel    empty    Debug label  6.2
1202
1203    Add the following to Table 6.9 Vertex Array Object State:
1204
1205                                       Initial
1206    Get Value  Type  Get Command       Value    Description  Sec
1207    ---------  ----  --------------    -------  -----------  ---
1208    -          S     GetObjectLabel    empty    Debug label  6.2
1209
1210    Add the following to Table 6.54 Query Object State:
1211
1212                                       Initial
1213    Get Value  Type  Get Command       Value    Description  Sec
1214    ---------  ----  --------------    -------  -----------  ---
1215    -          S     GetObjectLabel    empty    Debug label  6.2
1216
1217    Add the following to Table 6.45 Program Pipeline Object State:
1218
1219                                       Initial
1220    Get Value  Type  Get Command       Value    Description  Sec
1221    ---------  ----  --------------    -------  -----------  ---
1222    -          S     GetObjectLabel    empty    Debug label  6.2
1223
1224    Add the following to Table 6.26 Textures (state per sampler object):
1225
1226                                       Initial
1227    Get Value  Type  Get Command       Value    Description  Sec
1228    ---------  ----  --------------    -------  -----------  ---
1229    -          S     GetObjectLabel    empty    Debug label  6.2
1230
1231    Add the following to Table 6.56 Transform Feedback State:
1232
1233                                       Initial
1234    Get Value  Type  Get Command       Value    Description  Sec
1235    ---------  ----  --------------    -------  -----------  ---
1236    -          S     GetObjectLabel    empty    Debug label  6.2
1237
1238    Add the following to Table 6.57 Sync (state per sync object):
1239
1240                                       Initial
1241    Get Value  Type  Get Command       Value    Description  Sec
1242    ---------  ----  ----------------- -------  -----------  ---
1243    -          S     GetObjectPtrLabel empty    Debug label  6.2
1244
1245      [[ Compatibility Profile ]]
1246    Add Table 6.60 Display List State:
1247
1248                                       Initial
1249    Get Value  Type  Get Command       Value    Description  Sec
1250    ---------  ----  ----------------- -------  -----------  ---
1251    -          S     GetObjectLabel    empty    Debug label  6.2
1252      [[ End Profile-Specific Language ]]
1253
1254
1255New Implementation Dependent State
1256
1257    Add new table 6.56 after table 6.55 (Implementation Dependent Debug Output Values):
1258                                                            Minimum
1259    Get Value                            Type  Get Command  Value    Description                  Sec      Attribute
1260    --------------------------------     --    -----------  -----    -------------------------    ------   ---------
1261    MAX_DEBUG_MESSAGE_LENGTH             Z+    GetIntegerv   1        The maximum length of a     5.5.1      -
1262                                                                      debug message string,
1263                                                                      including its null
1264                                                                      terminator
1265
1266    MAX_DEBUG_LOGGED_MESSAGES            Z+    GetIntegerv   1        The maximum number of       5.5.3      -
1267                                                                      messages stored in the
1268                                                                      debug message log
1269
1270    MAX_DEBUG_GROUP_STACK_DEPTH          Z+    GetIntegerv  64        Maximum group               5.5.6      -
1271                                                                      stack depth
1272
1273    MAX_LABEL_LENGTH                     Z+    GetIntegerv  256       Max length of a label       5.5.8      -
1274                                                                      string
1275
1276
1277Usage Examples
1278
1279    Scenario 1: skip a section of the code
1280    // Setup of the default active debug group: Filter everything in
1281    glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE);
1282
1283    // Generate a debug marker debug output message
1284    glDebugMessageInsert(
1285        GL_DEBUG_SOURCE_APPLICATION,
1286        GL_DEBUG_TYPE_MARKER, 100,
1287        GL_DEBUG_SEVERITY_NOTIFICATION,
1288        -1, "Message 1");
1289
1290    // Push debug group 1
1291    glPushDebugGroup(
1292        GL_DEBUG_SOURCE_APPLICATION,
1293        1,
1294        -1, "Message 2");
1295
1296    // Setup of the debug group 1: Filter everything out
1297    glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_FALSE);
1298
1299    // This message won't appear in the debug output log of
1300    glDebugMessageInsert(
1301        GL_DEBUG_SOURCE_APPLICATION,
1302        GL_DEBUG_TYPE_MARKER, 100,
1303        GL_DEBUG_SEVERITY_NOTIFICATION,
1304        -1, "Message 3");
1305
1306    // Pop debug group 1, restore the volume control of the default debug group.
1307    glPopDebugGroup();
1308
1309    // Generate a debug marker debug output message
1310    glDebugMessageInsert(
1311        GL_DEBUG_SOURCE_APPLICATION,
1312        GL_DEBUG_TYPE_MARKER, 100,
1313        GL_DEBUG_SEVERITY_NOTIFICATION,
1314        -1, "Message 5");
1315
1316    // Expected debug output from the GL implementation
1317    // Message 1
1318    // Message 2
1319    // Message 2
1320    // Message 5
1321
1322    Scenario 2: Only output a subsection of the code
1323    and disable some messages for the entire application
1324
1325    // Setup the control of de debug output for the default debug group
1326    glDebugMessageControl(
1327        GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_FALSE);
1328    glDebugMessageControl(
1329        GL_DEBUG_SOURCE_THIRD_PARTY, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_FALSE);
1330    std::vector<GLuint> Messages = {1234, 2345, 3456, 4567};
1331    glDebugMessageControl(
1332        GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, GL_DONT_CARE,
1333        GLuint(Messages,size()), &Messages[0], GL_FALSE);
1334    glDebugMessageControl(
1335        GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, GL_DONT_CARE,
1336        GLuint(Messages,size()), &Messages[0], GL_FALSE);
1337
1338    // Push debug group 1
1339    // Inheritate of the default debug group debug output volume control
1340    // Filtered out by glDebugMessageControl
1341    glPushDebugGroup(
1342        GL_DEBUG_SOURCE_APPLICATION,
1343        1,
1344        -1, "Message 1");
1345
1346    // In this section of the code, we are interested in performances.
1347    glDebugMessageControl(
1348        GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, GL_DONT_CARE, 0, NULL, GL_TRUE);
1349    // But we already identify that some messages are not really useful for us.
1350    std::vector<GLuint> Messages = {5678, 6789};
1351    glDebugMessageControl(
1352        GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, GL_DONT_CARE,
1353        GLuint(Messages,size()), &Messages[0], GL_FALSE);
1354
1355    glDebugMessageInsert(
1356        GL_DEBUG_SOURCE_APPLICATION,
1357        GL_DEBUG_TYPE_PERFORMANCE, 1357,
1358        GL_DEBUG_SEVERITY_MEDIUM,
1359        -1, "Message 2");
1360    glDebugMessageInsert(
1361        GL_DEBUG_SOURCE_THIRD_PARTY, // We still filter out these messages.
1362        GL_DEBUG_TYPE_OTHER, 3579,
1363        GL_DEBUG_SEVERITY_MEDIUM,
1364        -1, "Message 3");
1365
1366    glPopDebugGroup();
1367
1368    // Expected debug output from the GL implementation
1369    // Message 2
1370
1371
1372Issues
1373
1374    (1) Should the extension provides a method for querying markers?
1375
1376    RESOLVED: No.
1377
1378
1379    (2) Is the concept of <severity> meaningful for most profiling use cases?
1380
1381    DISCUSSION: The debug output API was originally designed for debugging
1382                but its design has led implementation and application to use
1383                it for profiling. Furthermore, markers are not strictly
1384                speaking low, medium or high severity messages.
1385
1386    RESOLVED: Added DEBUG_SEVERITY_NOTIFICATION
1387
1388
1389    (3) How should an implementation behave when the application doesn't push
1390        and pop group markers evenly?
1391
1392    DISCUSSION: Extra "pop" may be ignored as it is done in OpenGL ES
1393                EXT_debug_marker but what to do if the user push too many
1394                time? In any case, if a software doesn't push and pop evenly,
1395                its design is pretty ill. Hence it is better to notify the
1396                application as soon as possible by generating an error.
1397
1398                OpenGL legacy handles this problem by limiting the size of the
1399                stacks and generating STACK_UNDERFLOW and STACK_OVERFLOW
1400                errors.
1401
1402                The size of the marker group stack need to be big enough so
1403                that the application won't be limited but small enough so that
1404                an error is generated soon when pushes and pops are not even.
1405
1406                Another option is to let the drivers workaround this issue by
1407                ignoring push commands for a full stack and pop commands for
1408                an empty stack. In such case, an application doesn't have an
1409                immediate feedback for this behavior.
1410
1411    RESOLVED: Generates STACK_UNDERFLOW or STACK_UNDERFLOW errors
1412
1413
1414    (4) Do we need a maximum length for a marker string?
1415
1416    RESOLVED: No, reuse MAX_DEBUG_MESSAGE_LENGTH
1417
1418
1419    (5) Can we use this new extension to allow applications to request the
1420        info logs from compiling, linking and validating to be automatically
1421        submitted to the debug output log and debug output call-back function?
1422
1423    DISCUSSION: The API may need a new <type> value DEBUG_TYPE_INFO_LOG
1424                for every kind of info logs. glLinkProgram, glCompileShader,
1425                glCreateShaderProgram, glValidateProgram and
1426                glValidateProgramPipeline,  which execution generate the info
1427                logs, could also automatically submit this logs the the debug
1428                output API.
1429
1430                Such strategy can already be apply by querying the info log
1431                manually and submitting it to the debug output API with
1432                DebugMessageInsert but on some implementations querying the
1433                log immediately after the operation may significantly slow
1434                down the general compilation of shaders process.
1435
1436                The mechanism could be enable with glEnable with a dedicated
1437                value (DEBUG_OUTPUT_INFO_LOG). When enable, an option is
1438                that shader, program and program pipeline would not have to
1439                maintain this log.
1440
1441                This perspective emphasis the centralised nature of OpenGL
1442                debugging to the debug output API.
1443
1444    RESOLVED: Nothing prevent an implementation implementing ARB_debug_output
1445              to do it already.
1446
1447
1448    (6) Should we use dedicated functions for pushing and popping the group
1449        marker stack or use DebugMessageInsert with a dedicated types?
1450
1451    DISCUSSION: These functions have side effects (causing underflow errors,
1452                causing other messages to become disabled) rather than purely
1453                injecting messages into the debug log.
1454
1455    RESOLVED: Use separated functions.
1456
1457
1458    (7) Should we generate an error when we pop the last entry or when the
1459        stack is empty?
1460
1461    DISCUSSION: For the deprecated stacks, at the beginning of the program the
1462                stack depth was 1 which implies a default debug group (id 0?)
1463                in the present case.
1464
1465    RESOLVED: Let's follow the deprecated stacks precedent.
1466
1467
1468    (8) Should we be able to query the current debug group?
1469
1470    DISCUSSION: ARB_debug_output doesn't provide a query API for debug output
1471                control states, should we follow this precedent or are there
1472                use cases where is could be especially useful?
1473
1474    RESOLVED: No, it doesn't seem very useful.
1475
1476
1477    (9) Should we provide within which debug group a message is generated?
1478
1479    DISCUSSION: Such information might be useful but we would need to add a
1480                parameter to the callback function. Also, the application can
1481                take the responsibility of saving the current active debug
1482                group. Such option avoid API disruption.
1483
1484    RESOLVED: (8) could resolve this issue as well if this is actually at
1485              desired feature. Also nothing prevents an implementation to use
1486              a debug group id to form the debug output message. Finally an
1487              application can always store the current debug group each time
1488              a DEBUG_TYPE_PUSH_GROUP is generated.
1489
1490
1491    (10) Do we need a dedicated mechanism to enable and disable debug outputs?
1492
1493    DISCUSSION: It could seem that using glDebugMessageControl could allow
1494                to disable debug output. However with the introduction of
1495                debug groups, glDebugMessageControl only disable the active
1496                debug group and it could be pretty complex for an application
1497                to ensure that each debug group is disable. A easier idea
1498                would be to be global switch glEnable(GL_DEBUG_OUTPUT)
1499                allowing the application to completely switch on and off the
1500                entire debug output mechanism.
1501
1502    RESOLVED: Issue covered by ARB_debug_output2
1503
1504
1505    (11) Should there be a way to enable and disable the debug output
1506         functionality via glEnable(GL_DEBUG_OUTPUT) in addition to the way
1507         the context is created? This may be useful for third-party or
1508         pre-existing code that doesn't have control over how the context is
1509         created. This could be exposed in addition to the context creation
1510         flag, and the context creation flag just sets the default state of
1511         the enable.
1512
1513    RESOLVED: Yes, based on various feedback this would be useful. Added
1514              to revision 3 of this extension spec.
1515
1516
1517    (12) Should we use a single function to set the label for all objects?
1518
1519    DISCUSSION: This is the approach chosen in OpenGL ES extension
1520                EXT_debug_label. It builds up a new strong precedent
1521                for an important functionality but not exactly one
1522                which purpose is to build a strong design precedent.
1523
1524                On one hand using a unique function for all objects
1525                reduce the number of new entry point from 24 to 2.
1526
1527    RESOLVED: For the purpose of convergence with ES, the groups have
1528              voted for only 2 functions.
1529
1530
1531    (13) Do we need a maximum length (MAX_LABEL_LENGTH) for the label?
1532
1533    DISCUSSION: Following the precedents given by others strings in
1534                OpenGL, this seems useful. On one hand ARB_debug_output
1535                has a maximum size of the debug message
1536                (MAX_DEBUG_MESSAGE_LENGTH), shader variable names have
1537                a maximum length but on other hand the shader source
1538                and the program info log doesn't have such limitation.
1539                However, it seems hard to imagine that implementations
1540                doesn't have limitation somehow.
1541
1542    RESOLVED: Yes
1543
1544
1545    (14) Should we provide a function to label a display list?
1546
1547    RESOLVED: Yes for compatibility profile only.
1548
1549
1550    (15) Should the ES version of this extension supports the message log
1551         or only the callback function?
1552
1553    DISCUSSION: When promoting AMD_debug_output to ARB_debug_output, the ARB
1554                has added a message log that can be query by the application
1555                if no callback function has been specified by the application.
1556                The purpose of this addition was to support remote rendering.
1557                Is remote rendering supported by OpenGL ES? The ES group
1558                typically wants to have only one way to do things, should we
1559                only support the callback function for ES debug output?
1560
1561    RESOLVED: The ES group has chosen to keep it by vote
1562
1563
1564    (16) Why do OpenGL implementations use KHR suffixes, while OpenGL
1565         implementations use no suffix?
1566
1567    DISCUSSION: this functionality was initially defined by OpenGL 4.3, and
1568    set of "backwards compatibility" extensions were defined to allow
1569    implementing it against earlier GL versions. OpenGL ARB policy in the
1570    case of backwards compatibility extensions is that extension suffixes
1571    should not be added. The OpenGL ES Working Group then decided to support
1572    the same functionality as an OpenGL ES extension, and both groups agreed
1573    to share a single KHR specification for the extension. However, OpenGL
1574    ES policy requires extension suffixes on Khronos-approved OES and KHR
1575    extensions.
1576
1577    We are aware of this inconsistency, but both working groups have chosen
1578    to stand by their own naming policies and the inconsistency is unlikely
1579    to be resolved.
1580
1581Revision History
1582
1583    Revision 17, 2015/07/02 (Jan-Harald Fredriksen)
1584      - Clarify CONTEXT_FLAGS state for ES3.1 and earlier in the Interactions
1585        section (Bug 13104).
1586
1587    Revision 16, 2015/03/11 (Jon Leech)
1588      - Clarify dependencies required to support PROGRAM_PIPELINE (Bug
1589        13545).
1590
1591    Revision 15, 2014/03/04 (Jon Leech)
1592      - Minor changes to clean up expected message output format in example
1593        code and refer to the value of state named by tokens, rather than
1594        the token values themselves (Bug 10083).
1595
1596    Revision 14, 2013/11/05 (Jon Leech)
1597      - Edit state tables to replace the "Get Value" of LABEL with "-",
1598        indicating unnamed state. There is no token LABEL in the extension,
1599        and the GetObject*Label commands do not take <pname> parameters (Bug
1600        11131).
1601
1602    Revision 13, 2013/06/24 (Jon Leech)
1603      - Add 'const' attribute to <userParam> for DebugMessageCallback and
1604        the corresponding GLDEBUGPROC type. Specify that unrecognized
1605        message IDs are ignored in the DebugMessageControl <ids> array.
1606        Specify that GetDebugMessageLog <messageLog> parameter must be
1607        NULL when <bufSize> is less than zero, to allow an early out.
1608        Replace spurious GLvoid with void. (Bug 10083).
1609
1610    Revision 12, 2013/06/15 (Jon Leech)
1611      - Clarify in the New Tokens section that the <source> parameter of
1612        some commands may not allow all possible values shown in this
1613        section (public Bug 889).
1614
1615    Revision 11, 2013/04/26 (Jon Leech)
1616      - Implement OpenGL ES policy of adding KHR suffixes to all KHR
1617        extensions. Add notes, OpenGL ES Interaction section, and issue 16
1618        explaining the situation (Bug 9716).
1619
1620    Revision 10, 2013/04/16 (Jon Leech)
1621      - Fix type of <ids> parameter in GetDebugMessageLog body (Bug 10083)
1622
1623    Revision 9, 2012/09/18 (pbrown)
1624      - Add a "void" function argument list for PopDebugGroup().  The GLEW
1625        library needs this to properly parse the extension spec file.
1626
1627    Revision 8, 2012/09/16 (Jon Leech)
1628      - Add existing tokens allowed for ObjectLabel identifiers to "New
1629        Tokens" section, without enum values since they aren't actually new
1630        (Bug 9506).
1631
1632    Revision 7, 2012/09/12 (Jon Leech)
1633      - Clarify description of DebugMessageControl parameters to avoid
1634        triple negatives (Bug 9392).
1635
1636    Revision 6, 2012/07/31 (criccio)
1637      - ObjectLabel generates an INVALID_VALUE error if <name>
1638        doesn't identify a valid object.
1639
1640    Revision 5, 2012/06/22 (criccio)
1641      - Resolved issue 15
1642
1643    Revision 4, 2012/06/19 (Jon Leech)
1644      - Change logSize parameter to bufSize
1645
1646    Revision 3, 2012/06/12 (criccio)
1647      - Added ObjectPtrLabel and GetObjectPtrLabel (bug 9140)
1648
1649    Revision 2, 2012/06/07 (criccio)
1650      - Updated overview for higher consistence of the language.
1651      - Clarified when the message is generated by the GL when popping
1652        a debug group.
1653
1654    Revision 1, 2012/06/04 (criccio)
1655      - First draft, merged GL_ARB_debug_output, GL_ARB_debug_output2,
1656        GL_ARB_debug_group and GL_ARB_debug_label.
1657
1658