15bd8deadSopenharmony_ciName
25bd8deadSopenharmony_ci 
35bd8deadSopenharmony_ci    EXT_direct_state_access
45bd8deadSopenharmony_ci
55bd8deadSopenharmony_ciName Strings
65bd8deadSopenharmony_ci
75bd8deadSopenharmony_ci    GL_EXT_direct_state_access
85bd8deadSopenharmony_ci
95bd8deadSopenharmony_ciContributors
105bd8deadSopenharmony_ci
115bd8deadSopenharmony_ci    Cass Everitt, NVIDIA
125bd8deadSopenharmony_ci    Daniel Pageau, Blizzard
135bd8deadSopenharmony_ci    Daniel Koch, TransGaming
145bd8deadSopenharmony_ci    Ian Romanick, IBM
155bd8deadSopenharmony_ci    Jason Green, TransGaming
165bd8deadSopenharmony_ci    Johan Andersson, DICE/Electronic Arts
175bd8deadSopenharmony_ci    Jon Leech
185bd8deadSopenharmony_ci    Mark Kilgard, NVIDIA
195bd8deadSopenharmony_ci    Nicholas Vining, Destineer
205bd8deadSopenharmony_ci    Pat Brown, NVIDIA
215bd8deadSopenharmony_ci    Patrick Doane, Blizzard
225bd8deadSopenharmony_ci    Robert Barris, Blizzard
235bd8deadSopenharmony_ci    Ryan Gordon, Destineer
245bd8deadSopenharmony_ci    Scott Nations, NVIDIA
255bd8deadSopenharmony_ci    Yanjun Zhang, S3 Graphics
265bd8deadSopenharmony_ci    Jeff Bolz, NVIDIA
275bd8deadSopenharmony_ci    Jeff Juliano, NVIDIA
285bd8deadSopenharmony_ci    Jon Burgess, NVIDIA
295bd8deadSopenharmony_ci    Mike Marcin
305bd8deadSopenharmony_ci    Nigel Stewart, NVIDIA
315bd8deadSopenharmony_ci    Jason McKesson
325bd8deadSopenharmony_ci    Graham Sellers, AMD
335bd8deadSopenharmony_ci    Vladimir Vukicevic, Mozilla
345bd8deadSopenharmony_ci
355bd8deadSopenharmony_ciContact
365bd8deadSopenharmony_ci
375bd8deadSopenharmony_ci    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)
385bd8deadSopenharmony_ci
395bd8deadSopenharmony_ciStatus
405bd8deadSopenharmony_ci
415bd8deadSopenharmony_ci    Complete, except for GLX protocol
425bd8deadSopenharmony_ci
435bd8deadSopenharmony_ci    Version 1.0 implemented by NVIDIA, shipping November 2008
445bd8deadSopenharmony_ci    Version 1.1 implemented by NVIDIA, shipping January 2009
455bd8deadSopenharmony_ci
465bd8deadSopenharmony_ciVersion
475bd8deadSopenharmony_ci
485bd8deadSopenharmony_ci    Last Modified Date:         02/24/2014
495bd8deadSopenharmony_ci    Author revision:            39
505bd8deadSopenharmony_ci    Version                     1.2
515bd8deadSopenharmony_ci
525bd8deadSopenharmony_ci    (version 1.0 lacked OpenGL 3.0 support)
535bd8deadSopenharmony_ci    (version 1.1 lacked GL_TEXTUREi support for glVertexArrayTexCoordOffsetEXT)
545bd8deadSopenharmony_ci    (version 1.1 didn't clearly specify GL_TEXTURE_COORD_ARRAY works with glGetVertexArrayIntegeri_vEXT)
555bd8deadSopenharmony_ci
565bd8deadSopenharmony_ciNumber
575bd8deadSopenharmony_ci
585bd8deadSopenharmony_ci    353
595bd8deadSopenharmony_ci
605bd8deadSopenharmony_ciDependencies
615bd8deadSopenharmony_ci
625bd8deadSopenharmony_ci    This extension is written against the OpenGL 2.1 specification.
635bd8deadSopenharmony_ci
645bd8deadSopenharmony_ci    This extension interacts with the matrix manipulation commands
655bd8deadSopenharmony_ci    introduced by OpenGL 1.0.
665bd8deadSopenharmony_ci
675bd8deadSopenharmony_ci    This extension interacts with the texture object manipulation commands
685bd8deadSopenharmony_ci    introduced by EXT_texture_object and standardized by OpenGL 1.1.
695bd8deadSopenharmony_ci
705bd8deadSopenharmony_ci    This extension interacts with the 3D texture object manipulation
715bd8deadSopenharmony_ci    commands introduced by EXT_texture3D and standardized by OpenGL 1.2.
725bd8deadSopenharmony_ci
735bd8deadSopenharmony_ci    This extension interacts with the multitexture command introduced
745bd8deadSopenharmony_ci    by ARB_multitexture and standardized by OpenGL 1.2.1.
755bd8deadSopenharmony_ci
765bd8deadSopenharmony_ci    This extension interacts with the matrix transpose manipulation
775bd8deadSopenharmony_ci    commands introduced by ARB_transpose_matrix and standardized by
785bd8deadSopenharmony_ci    OpenGL 1.3.
795bd8deadSopenharmony_ci
805bd8deadSopenharmony_ci    This extension interacts with the local parameter program object
815bd8deadSopenharmony_ci    manipulation commands introduced by ARB_vertex_program.
825bd8deadSopenharmony_ci
835bd8deadSopenharmony_ci    This extension interacts with the texture rectangle enable and target
845bd8deadSopenharmony_ci    binding introduced by ARB_texture_rectangle (and NV_texture_rectangle
855bd8deadSopenharmony_ci    and EXT_texture_rectangle).
865bd8deadSopenharmony_ci
875bd8deadSopenharmony_ci    This extension interacts with the buffer manipulation commands
885bd8deadSopenharmony_ci    standardized by OpenGL 1.5.
895bd8deadSopenharmony_ci
905bd8deadSopenharmony_ci    This extension interacts with the GLSL uniform commands standardized
915bd8deadSopenharmony_ci    by OpenGL 2.0.
925bd8deadSopenharmony_ci
935bd8deadSopenharmony_ci    This extension interacts with the GLSL uniform matrix commands
945bd8deadSopenharmony_ci    standardized by OpenGL 2.1.
955bd8deadSopenharmony_ci
965bd8deadSopenharmony_ci    This extension interacts with the framebuffer object commands
975bd8deadSopenharmony_ci    introduced by EXT_framebuffer_object and standardized by OpenGL 3.0.
985bd8deadSopenharmony_ci
995bd8deadSopenharmony_ci    This extension interacts with the framebuffer blit commands introduced
1005bd8deadSopenharmony_ci    by EXT_framebuffer_blit and standardized by OpenGL 3.0.
1015bd8deadSopenharmony_ci
1025bd8deadSopenharmony_ci    This extension interacts with the framebuffer multisample commands
1035bd8deadSopenharmony_ci    introduced by EXT_framebuffer_multisample and standardized by
1045bd8deadSopenharmony_ci    OpenGL 3.0.
1055bd8deadSopenharmony_ci
1065bd8deadSopenharmony_ci    This extension interacts with the vertex array object commands
1075bd8deadSopenharmony_ci    introduced by APPLE_vertex_array_object and standardized by
1085bd8deadSopenharmony_ci    OpenGL 3.0.
1095bd8deadSopenharmony_ci
1105bd8deadSopenharmony_ci    This extension interacts with the integer texture parameter commands
1115bd8deadSopenharmony_ci    introduced by EXT_texture_integer and standardized by OpenGL 3.0.
1125bd8deadSopenharmony_ci
1135bd8deadSopenharmony_ci    This extension interacts with the texture buffer commands introduced
1145bd8deadSopenharmony_ci    by EXT_texture_buffer_object.
1155bd8deadSopenharmony_ci
1165bd8deadSopenharmony_ci    This extension interacts with the GLSL integer uniform commands
1175bd8deadSopenharmony_ci    introduced by EXT_gpu_shader4.
1185bd8deadSopenharmony_ci
1195bd8deadSopenharmony_ci    This extension interacts with the local plural parameter program
1205bd8deadSopenharmony_ci    object manipulation commands introduced by EXT_gpu_program_parameters.
1215bd8deadSopenharmony_ci
1225bd8deadSopenharmony_ci    This extension interacts with the local integer parameter program
1235bd8deadSopenharmony_ci    object manipulation commands introduced by NV_gpu_program4.
1245bd8deadSopenharmony_ci
1255bd8deadSopenharmony_ci    This extension trivially interacts with the EnableIndexedEXT
1265bd8deadSopenharmony_ci    and DisableIndexed commands and the integer and boolean indexed
1275bd8deadSopenharmony_ci    queries introduced by EXT_draw_buffers2, EXT_transform_feedback,
1285bd8deadSopenharmony_ci    and NV_transform_feedback.
1295bd8deadSopenharmony_ci
1305bd8deadSopenharmony_ci    This extension interacts with NV_explicit_multisample.
1315bd8deadSopenharmony_ci
1325bd8deadSopenharmony_ci    This extension trivially interacts with EXT_texture_array.
1335bd8deadSopenharmony_ci
1345bd8deadSopenharmony_ci    This extension trivially interacts with NV_texture_cube_map_array.
1355bd8deadSopenharmony_ci
1365bd8deadSopenharmony_ci    This extension interacts with the buffer data copying command
1375bd8deadSopenharmony_ci    introduced by  EXT_copy_buffer and standardized by OpenGL 3.0.
1385bd8deadSopenharmony_ci
1395bd8deadSopenharmony_ciOverview
1405bd8deadSopenharmony_ci
1415bd8deadSopenharmony_ci    This extension introduces a set of new "direct state access"
1425bd8deadSopenharmony_ci    commands (meaning no selector is involved) to access (update and
1435bd8deadSopenharmony_ci    query) OpenGL state that previously depended on the OpenGL state
1445bd8deadSopenharmony_ci    selectors for access.  These new commands supplement the existing
1455bd8deadSopenharmony_ci    selector-based OpenGL commands to access the same state.
1465bd8deadSopenharmony_ci
1475bd8deadSopenharmony_ci    The intent of this extension is to make it more efficient for
1485bd8deadSopenharmony_ci    libraries to avoid disturbing selector and latched state.  The
1495bd8deadSopenharmony_ci    extension also allows more efficient command usage by eliminating
1505bd8deadSopenharmony_ci    the need for selector update commands.
1515bd8deadSopenharmony_ci
1525bd8deadSopenharmony_ci    Two derivative advantages of this extension are 1) display lists
1535bd8deadSopenharmony_ci    can be executed using these commands that avoid disturbing selectors
1545bd8deadSopenharmony_ci    that subsequent commands may depend on, and 2) drivers implemented
1555bd8deadSopenharmony_ci    with a dual-thread partitioning with OpenGL command buffering from
1565bd8deadSopenharmony_ci    an application thread and then OpenGL command dispatching in a
1575bd8deadSopenharmony_ci    concurrent driver thread can avoid thread synchronization created by
1585bd8deadSopenharmony_ci    selector saving, setting, command execution, and selector restoration.
1595bd8deadSopenharmony_ci
1605bd8deadSopenharmony_ci    This extension does not itself add any new OpenGL state.
1615bd8deadSopenharmony_ci
1625bd8deadSopenharmony_ci    We call a state variable in OpenGL an "OpenGL state selector" or
1635bd8deadSopenharmony_ci    simply a "selector" if OpenGL commands depend on the state variable
1645bd8deadSopenharmony_ci    to determine what state to query or update.  The matrix mode and
1655bd8deadSopenharmony_ci    active texture are both selectors.  Object bindings for buffers,
1665bd8deadSopenharmony_ci    programs, textures, and framebuffer objects are also selectors.
1675bd8deadSopenharmony_ci
1685bd8deadSopenharmony_ci    We call OpenGL state "latched" if the state is set by one OpenGL
1695bd8deadSopenharmony_ci    command but then that state is saved by a subsequent command or the
1705bd8deadSopenharmony_ci    state determines how client memory or buffer object memory is accessed
1715bd8deadSopenharmony_ci    by a subsequent command.  The array and element array buffer bindings
1725bd8deadSopenharmony_ci    are latched by vertex array specification commands to determine
1735bd8deadSopenharmony_ci    which buffer a given vertex array uses.  Vertex array state and pixel
1745bd8deadSopenharmony_ci    pack/unpack state decides how client memory or buffer object memory is
1755bd8deadSopenharmony_ci    accessed by subsequent vertex pulling or image specification commands.
1765bd8deadSopenharmony_ci
1775bd8deadSopenharmony_ci    The existence of selectors and latched state in the OpenGL API
1785bd8deadSopenharmony_ci    reduces the number of parameters to various sets of OpenGL commands
1795bd8deadSopenharmony_ci    but complicates the access to state for layered libraries which seek
1805bd8deadSopenharmony_ci    to access state without disturbing other state, namely the state of
1815bd8deadSopenharmony_ci    state selectors and latched state.  In many cases, selectors and
1825bd8deadSopenharmony_ci    latched state were introduced by extensions as OpenGL evolved to
1835bd8deadSopenharmony_ci    minimize the disruption to the OpenGL API when new functionality,
1845bd8deadSopenharmony_ci    particularly the pluralization of existing functionality as when
1855bd8deadSopenharmony_ci    texture objects and later multiple texture units, was introduced.
1865bd8deadSopenharmony_ci
1875bd8deadSopenharmony_ci    The OpenGL API involves several selectors (listed in historical
1885bd8deadSopenharmony_ci    order of introduction):
1895bd8deadSopenharmony_ci
1905bd8deadSopenharmony_ci      o  The matrix mode.
1915bd8deadSopenharmony_ci
1925bd8deadSopenharmony_ci      o  The current bound texture for each supported texture target.
1935bd8deadSopenharmony_ci
1945bd8deadSopenharmony_ci      o  The active texture.
1955bd8deadSopenharmony_ci
1965bd8deadSopenharmony_ci      o  The active client texture.
1975bd8deadSopenharmony_ci
1985bd8deadSopenharmony_ci      o  The current bound program for each supported program target.
1995bd8deadSopenharmony_ci
2005bd8deadSopenharmony_ci      o  The current bound buffer for each supported buffer target.
2015bd8deadSopenharmony_ci
2025bd8deadSopenharmony_ci      o  The current GLSL program.
2035bd8deadSopenharmony_ci
2045bd8deadSopenharmony_ci      o  The current framebuffer object.
2055bd8deadSopenharmony_ci
2065bd8deadSopenharmony_ci    The new selector-free update commands can be compiled into display
2075bd8deadSopenharmony_ci    lists.
2085bd8deadSopenharmony_ci
2095bd8deadSopenharmony_ci    The OpenGL API has latched state for vertex array buffer objects
2105bd8deadSopenharmony_ci    and pixel store state.  When an application issues a GL command to
2115bd8deadSopenharmony_ci    unpack or pack pixels (for example, glTexImage2D or glReadPixels
2125bd8deadSopenharmony_ci    respectively), the current unpack and pack pixel store state
2135bd8deadSopenharmony_ci    determines how the pixels are unpacked from/packed to client memory
2145bd8deadSopenharmony_ci    or pixel buffer objects.  For example, consider:
2155bd8deadSopenharmony_ci
2165bd8deadSopenharmony_ci      glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_TRUE);
2175bd8deadSopenharmony_ci      glPixelStorei(GL_UNPACK_ROW_LENGTH, 640);
2185bd8deadSopenharmony_ci      glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 47);
2195bd8deadSopenharmony_ci      glDrawPixels(100, 100, GL_RGB, GL_FLOAT, pixels);
2205bd8deadSopenharmony_ci
2215bd8deadSopenharmony_ci    The unpack swap bytes and row length state set by the preceding
2225bd8deadSopenharmony_ci    glPixelStorei commands (as well as the 6 other unpack pixel store
2235bd8deadSopenharmony_ci    state variables) control how data is read (unpacked) from buffer of
2245bd8deadSopenharmony_ci    data pointed to by pixels.  The glBindBuffer command also specifies
2255bd8deadSopenharmony_ci    an unpack buffer object (47) so the pixel pointer is actually treated
2265bd8deadSopenharmony_ci    as a byte offset into buffer object 47.
2275bd8deadSopenharmony_ci
2285bd8deadSopenharmony_ci    When an application issues a command to configure a vertex array,
2295bd8deadSopenharmony_ci    the current array buffer state is latched as the binding for the
2305bd8deadSopenharmony_ci    particular vertex array being specified.  For example, consider:
2315bd8deadSopenharmony_ci
2325bd8deadSopenharmony_ci      glBindBuffer(GL_ARRAY_BUFFER, 23);
2335bd8deadSopenharmony_ci      glVertexPointer(3, GL_FLOAT, 12, pointer);
2345bd8deadSopenharmony_ci
2355bd8deadSopenharmony_ci    The glBindBuffer command updates the array buffering binding
2365bd8deadSopenharmony_ci    (GL_ARRAY_BUFFER_BINDING) to the buffer object named 23.  The
2375bd8deadSopenharmony_ci    subsequent glVertexPointer command specifies explicit parameters
2385bd8deadSopenharmony_ci    for the size, type, stride, and pointer to access the position
2395bd8deadSopenharmony_ci    vertex array BUT ALSO latches the current array buffer binding for
2405bd8deadSopenharmony_ci    the vertex array buffer binding (GL_VERTEX_ARRAY_BUFFER_BINDING).
2415bd8deadSopenharmony_ci    Effectively the current array buffer binding buffer object becomes
2425bd8deadSopenharmony_ci    an implicit fifth parameter to glVertexPointer and this applies to
2435bd8deadSopenharmony_ci    all the gl*Pointer vertex array specification commands.
2445bd8deadSopenharmony_ci
2455bd8deadSopenharmony_ci    Selectors and latched state create problems for layered libraries
2465bd8deadSopenharmony_ci    using OpenGL because selectors require the selector state to be
2475bd8deadSopenharmony_ci    modified to update some other state and latched state means implicit
2485bd8deadSopenharmony_ci    state can affect the operation of commands specifying, packing, or
2495bd8deadSopenharmony_ci    unpacking data through pointers/offsets.  For layered libraries,
2505bd8deadSopenharmony_ci    a state update performed by the library may attempt to save the
2515bd8deadSopenharmony_ci    selector state, set the selector, update/query some state the
2525bd8deadSopenharmony_ci    selector controls, and then restore the selector to its saved state.
2535bd8deadSopenharmony_ci    Layered libraries can skip the selector save/restore but this risks
2545bd8deadSopenharmony_ci    introducing uncertainty about the state of a selector after calling
2555bd8deadSopenharmony_ci    layered library routines.  Such selector side-effects are difficult
2565bd8deadSopenharmony_ci    to document and lead to compatibility issues as the layered library
2575bd8deadSopenharmony_ci    evolves or its usage varies.  For latched state, layered libraries
2585bd8deadSopenharmony_ci    may find commands such as glDrawPixels do not work as expected
2595bd8deadSopenharmony_ci    because latched pixel store state is not what the library expects.
2605bd8deadSopenharmony_ci    Querying or pushing the latched state, setting the latched state
2615bd8deadSopenharmony_ci    explicitly, performing the operation involving latched state, and
2625bd8deadSopenharmony_ci    then restoring or popping the latched state avoids entanglements
2635bd8deadSopenharmony_ci    with latched state but at considerable cost.
2645bd8deadSopenharmony_ci
2655bd8deadSopenharmony_ci    EXAMPLE USAGE OF THIS EXTENSION'S FUNCTIONALITY
2665bd8deadSopenharmony_ci
2675bd8deadSopenharmony_ci    Consider the following routine to set the modelview matrix involving
2685bd8deadSopenharmony_ci    the matrix mode selector:
2695bd8deadSopenharmony_ci
2705bd8deadSopenharmony_ci      void setModelviewMatrix(const GLfloat matrix[16])
2715bd8deadSopenharmony_ci      {
2725bd8deadSopenharmony_ci        GLenum savedMatrixMode;
2735bd8deadSopenharmony_ci
2745bd8deadSopenharmony_ci        glGetIntegerv(GL_MATRIX_MODE, &savedMatrixMode);
2755bd8deadSopenharmony_ci        glMatrixMode(GL_MODELVIEW);
2765bd8deadSopenharmony_ci        glLoadMatrixf(matrix);
2775bd8deadSopenharmony_ci        glMatrixMode(savedMatrixMode);
2785bd8deadSopenharmony_ci      }
2795bd8deadSopenharmony_ci
2805bd8deadSopenharmony_ci    Notice that four OpenGL commands are required to update the current
2815bd8deadSopenharmony_ci    modelview matrix without disturbing the matrix mode selector.
2825bd8deadSopenharmony_ci
2835bd8deadSopenharmony_ci    OpenGL query commands can also substantially reduce the performance
2845bd8deadSopenharmony_ci    of modern OpenGL implementations which may off-load OpenGL state
2855bd8deadSopenharmony_ci    processing to another CPU core/thread or to the GPU itself.
2865bd8deadSopenharmony_ci
2875bd8deadSopenharmony_ci    An alternative to querying the selector is to use the
2885bd8deadSopenharmony_ci    glPushAttrib/glPopAttrib commands.  However this approach typically
2895bd8deadSopenharmony_ci    involves pushing far more state than simply the one or two selectors
2905bd8deadSopenharmony_ci    that need to be saved and restored.  Because so much state is
2915bd8deadSopenharmony_ci    associated with a given push/pop attribute bit, the glPushAttrib
2925bd8deadSopenharmony_ci    and glPopAttrib commands are considerably more costly than the
2935bd8deadSopenharmony_ci    save/restore approach.  Additionally glPushAttrib risks overflowing
2945bd8deadSopenharmony_ci    the attribute stack.
2955bd8deadSopenharmony_ci
2965bd8deadSopenharmony_ci    The reliability and performance of layered libraries and applications
2975bd8deadSopenharmony_ci    can be improved by adding to the OpenGL API a new set of commands
2985bd8deadSopenharmony_ci    to access directly OpenGL state that otherwise involves selectors
2995bd8deadSopenharmony_ci    to access.
3005bd8deadSopenharmony_ci
3015bd8deadSopenharmony_ci    The above example can be reimplemented more efficiently and without
3025bd8deadSopenharmony_ci    selector side-effects:
3035bd8deadSopenharmony_ci
3045bd8deadSopenharmony_ci      void setModelviewMatrix(const GLfloat matrix[16])
3055bd8deadSopenharmony_ci      {
3065bd8deadSopenharmony_ci        glMatrixLoadfEXT(GL_MODELVIEW, matrix);
3075bd8deadSopenharmony_ci      }
3085bd8deadSopenharmony_ci
3095bd8deadSopenharmony_ci    Consider a layered library seeking to load a texture:
3105bd8deadSopenharmony_ci
3115bd8deadSopenharmony_ci      void loadTexture(GLint texobj, GLint width, GLint height,
3125bd8deadSopenharmony_ci                       void *data)
3135bd8deadSopenharmony_ci      {
3145bd8deadSopenharmony_ci        glBindTexture(GL_TEXTURE_2D, texobj);
3155bd8deadSopenharmony_ci        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,
3165bd8deadSopenharmony_ci                     width, height, GL_RGB, GL_FLOAT, data);
3175bd8deadSopenharmony_ci      }
3185bd8deadSopenharmony_ci
3195bd8deadSopenharmony_ci    The library expects the data to be packed into the buffer pointed
3205bd8deadSopenharmony_ci    to by data.  But what if the current pixel unpack buffer binding
3215bd8deadSopenharmony_ci    is not zero so the current pixel unpack buffer, rather than client
3225bd8deadSopenharmony_ci    memory, will be read?  Or what if the application has modified
3235bd8deadSopenharmony_ci    the GL_UNPACK_ROW_LENGTH pixel store state before loadTexture
3245bd8deadSopenharmony_ci    is called?  
3255bd8deadSopenharmony_ci
3265bd8deadSopenharmony_ci    We can fix the routine by calling glBindBuffer(GL_PIXEL_UNPACK_BUFFER,
3275bd8deadSopenharmony_ci    0) and setting all the pixel store unpack state to the initial state
3285bd8deadSopenharmony_ci    the loadTexture routine expects, but this is expensive.  It also risks
3295bd8deadSopenharmony_ci    disturbing the state so when loadTexture returns to the application,
3305bd8deadSopenharmony_ci    the application doesn't realize the current texture object (for
3315bd8deadSopenharmony_ci    whatever texture unit the current active texture happens to be) and
3325bd8deadSopenharmony_ci    pixel store state has changed.
3335bd8deadSopenharmony_ci
3345bd8deadSopenharmony_ci    We can more efficiently implement this routine without disturbing
3355bd8deadSopenharmony_ci    selector or latched state as follows:
3365bd8deadSopenharmony_ci
3375bd8deadSopenharmony_ci      void loadTexture(GLint texobj, GLint width, GLint height,
3385bd8deadSopenharmony_ci                       void *data)
3395bd8deadSopenharmony_ci      {
3405bd8deadSopenharmony_ci        glPushClientAttribDefaultEXT(GL_CLIENT_PIXEL_STORE_BIT);
3415bd8deadSopenharmony_ci        glTextureImage2D(texobj, GL_TEXTURE_2D, 0, GL_RGB8,
3425bd8deadSopenharmony_ci                         width, height, GL_RGB, GL_FLOAT, data);
3435bd8deadSopenharmony_ci        glPopClientAttrib();
3445bd8deadSopenharmony_ci      }
3455bd8deadSopenharmony_ci
3465bd8deadSopenharmony_ci    Now loadTexture does not have to worry about inappropriately
3475bd8deadSopenharmony_ci    configured pixel store state or a non-zero pixel unpack buffer
3485bd8deadSopenharmony_ci    binding.  And loadTexture has no unintended side-effects for
3495bd8deadSopenharmony_ci    selector or latched state (assuming the client attrib state does
3505bd8deadSopenharmony_ci    not overflow).
3515bd8deadSopenharmony_ci
3525bd8deadSopenharmony_ciNew Procedures and Functions
3535bd8deadSopenharmony_ci
3545bd8deadSopenharmony_ci    <OpenGL 1.1: New client commands>
3555bd8deadSopenharmony_ci
3565bd8deadSopenharmony_ci        void ClientAttribDefaultEXT(bitfield mask);
3575bd8deadSopenharmony_ci        void PushClientAttribDefaultEXT(bitfield mask);
3585bd8deadSopenharmony_ci
3595bd8deadSopenharmony_ci    <OpenGL 1.0: New matrix commands add "Matrix" prefix to name,
3605bd8deadSopenharmony_ci    drops "Matrix" suffix from name, and add initial "enum matrixMode"
3615bd8deadSopenharmony_ci    parameter>
3625bd8deadSopenharmony_ci
3635bd8deadSopenharmony_ci        void MatrixLoadfEXT(enum matrixMode, const float *m);
3645bd8deadSopenharmony_ci        void MatrixLoaddEXT(enum matrixMode, const double *m);
3655bd8deadSopenharmony_ci
3665bd8deadSopenharmony_ci        void MatrixMultfEXT(enum matrixMode, const float *m);
3675bd8deadSopenharmony_ci        void MatrixMultdEXT(enum matrixMode, const double *m);
3685bd8deadSopenharmony_ci
3695bd8deadSopenharmony_ci        void MatrixLoadIdentityEXT(enum matrixMode);
3705bd8deadSopenharmony_ci
3715bd8deadSopenharmony_ci        void MatrixRotatefEXT(enum matrixMode, float angle,
3725bd8deadSopenharmony_ci                              float x, float y, float z);
3735bd8deadSopenharmony_ci        void MatrixRotatedEXT(enum matrixMode, double angle,
3745bd8deadSopenharmony_ci                              double x, double y, double z);
3755bd8deadSopenharmony_ci
3765bd8deadSopenharmony_ci        void MatrixScalefEXT(enum matrixMode,
3775bd8deadSopenharmony_ci                             float x, float y, float z);
3785bd8deadSopenharmony_ci        void MatrixScaledEXT(enum matrixMode,
3795bd8deadSopenharmony_ci                             double x, double y, double z);
3805bd8deadSopenharmony_ci
3815bd8deadSopenharmony_ci        void MatrixTranslatefEXT(enum matrixMode,
3825bd8deadSopenharmony_ci                                 float x, float y, float z);
3835bd8deadSopenharmony_ci        void MatrixTranslatedEXT(enum matrixMode,
3845bd8deadSopenharmony_ci                                 double x, double y, double z);
3855bd8deadSopenharmony_ci
3865bd8deadSopenharmony_ci        void MatrixOrthoEXT(enum matrixMode, double l, double r,
3875bd8deadSopenharmony_ci                            double b, double t, double n, double f);
3885bd8deadSopenharmony_ci        void MatrixFrustumEXT(enum matrixMode, double l, double r,
3895bd8deadSopenharmony_ci                              double b, double t, double n, double f);
3905bd8deadSopenharmony_ci
3915bd8deadSopenharmony_ci        void MatrixPushEXT(enum matrixMode);
3925bd8deadSopenharmony_ci        void MatrixPopEXT(enum matrixMode);
3935bd8deadSopenharmony_ci
3945bd8deadSopenharmony_ci    <OpenGL 1.1: New texture object commands and queries replace "Tex"
3955bd8deadSopenharmony_ci    in name with "Texture" and add initial "uint texture" parameter>
3965bd8deadSopenharmony_ci
3975bd8deadSopenharmony_ci        void TextureParameteriEXT(uint texture, enum target,
3985bd8deadSopenharmony_ci                                  enum pname, int param);
3995bd8deadSopenharmony_ci        void TextureParameterivEXT(uint texture, enum target,
4005bd8deadSopenharmony_ci                                   enum pname, const int *param);
4015bd8deadSopenharmony_ci
4025bd8deadSopenharmony_ci        void TextureParameterfEXT(uint texture, enum target,
4035bd8deadSopenharmony_ci                                  enum pname, float param);
4045bd8deadSopenharmony_ci        void TextureParameterfvEXT(uint texture, enum target,
4055bd8deadSopenharmony_ci                                   enum pname, const float *param);
4065bd8deadSopenharmony_ci
4075bd8deadSopenharmony_ci        void TextureImage1DEXT(uint texture, enum target,
4085bd8deadSopenharmony_ci                               int level, int internalformat,
4095bd8deadSopenharmony_ci                               sizei width, int border,
4105bd8deadSopenharmony_ci                               enum format, enum type, const void *pixels);
4115bd8deadSopenharmony_ci        void TextureImage2DEXT(uint texture, enum target,
4125bd8deadSopenharmony_ci                               int level, int internalformat,
4135bd8deadSopenharmony_ci                               sizei width, sizei height, int border,
4145bd8deadSopenharmony_ci                               enum format, enum type, const void *pixels);
4155bd8deadSopenharmony_ci
4165bd8deadSopenharmony_ci        void TextureSubImage1DEXT(uint texture, enum target,
4175bd8deadSopenharmony_ci                                  int level, int xoffset, sizei width,
4185bd8deadSopenharmony_ci                                  enum format, enum type,
4195bd8deadSopenharmony_ci                                  const void *pixels);
4205bd8deadSopenharmony_ci        void TextureSubImage2DEXT(uint texture, enum target,
4215bd8deadSopenharmony_ci                                  int level, int xoffset, int yoffset,
4225bd8deadSopenharmony_ci                                  sizei width, sizei height,
4235bd8deadSopenharmony_ci                                  enum format, enum type,
4245bd8deadSopenharmony_ci                                  const void *pixels);
4255bd8deadSopenharmony_ci
4265bd8deadSopenharmony_ci        void CopyTextureImage1DEXT(uint texture, enum target,
4275bd8deadSopenharmony_ci                                   int level, enum internalformat,
4285bd8deadSopenharmony_ci                                   int x, int y, sizei width, int border);
4295bd8deadSopenharmony_ci        void CopyTextureImage2DEXT(uint texture, enum target,
4305bd8deadSopenharmony_ci                                   int level, enum internalformat,
4315bd8deadSopenharmony_ci                                   int x, int y,
4325bd8deadSopenharmony_ci                                   sizei width, sizei height, int border);
4335bd8deadSopenharmony_ci
4345bd8deadSopenharmony_ci        void CopyTextureSubImage1DEXT(uint texture, enum target,
4355bd8deadSopenharmony_ci                                      int level, int xoffset,
4365bd8deadSopenharmony_ci                                      int x, int y, sizei width);
4375bd8deadSopenharmony_ci        void CopyTextureSubImage2DEXT(uint texture, enum target,
4385bd8deadSopenharmony_ci                                      int level, int xoffset, int yoffset,
4395bd8deadSopenharmony_ci                                      int x, int y,
4405bd8deadSopenharmony_ci                                      sizei width, sizei height);
4415bd8deadSopenharmony_ci
4425bd8deadSopenharmony_ci        void GetTextureImageEXT(uint texture, enum target,
4435bd8deadSopenharmony_ci                                int level,
4445bd8deadSopenharmony_ci                                enum format, enum type, void *pixels);
4455bd8deadSopenharmony_ci
4465bd8deadSopenharmony_ci        void GetTextureParameterfvEXT(uint texture, enum target,
4475bd8deadSopenharmony_ci                                      enum pname, float *params);
4485bd8deadSopenharmony_ci        void GetTextureParameterivEXT(uint texture, enum target,
4495bd8deadSopenharmony_ci                                      enum pname, int *params);
4505bd8deadSopenharmony_ci
4515bd8deadSopenharmony_ci        void GetTextureLevelParameterfvEXT(uint texture, enum target,
4525bd8deadSopenharmony_ci                                           int level,
4535bd8deadSopenharmony_ci                                           enum pname, float *params);
4545bd8deadSopenharmony_ci        void GetTextureLevelParameterivEXT(uint texture, enum target,
4555bd8deadSopenharmony_ci                                           int level,
4565bd8deadSopenharmony_ci                                           enum pname, int *params);
4575bd8deadSopenharmony_ci
4585bd8deadSopenharmony_ci    <OpenGL 1.2: New 3D texture object commands replace "Tex" in name with
4595bd8deadSopenharmony_ci    "Texture" and adds initial "uint texture" parameter>
4605bd8deadSopenharmony_ci
4615bd8deadSopenharmony_ci        void TextureImage3DEXT(uint texture, enum target,
4625bd8deadSopenharmony_ci                               int level, int internalformat,
4635bd8deadSopenharmony_ci                               sizei width, sizei height, sizei depth,
4645bd8deadSopenharmony_ci                               int border,
4655bd8deadSopenharmony_ci                               enum format, enum type, const void *pixels);
4665bd8deadSopenharmony_ci
4675bd8deadSopenharmony_ci        void TextureSubImage3DEXT(uint texture, enum target,
4685bd8deadSopenharmony_ci                                  int level,
4695bd8deadSopenharmony_ci                                  int xoffset, int yoffset, int zoffset,
4705bd8deadSopenharmony_ci                                  sizei width, sizei height, sizei depth,
4715bd8deadSopenharmony_ci                                  enum format, enum type,
4725bd8deadSopenharmony_ci                                  const void *pixels);
4735bd8deadSopenharmony_ci        void CopyTextureSubImage3DEXT(uint texture, enum target,
4745bd8deadSopenharmony_ci                                      int level,
4755bd8deadSopenharmony_ci                                      int xoffset, int yoffset, int zoffset,
4765bd8deadSopenharmony_ci                                      int x, int y,
4775bd8deadSopenharmony_ci                                      sizei width, sizei height);
4785bd8deadSopenharmony_ci
4795bd8deadSopenharmony_ci    <OpenGL 1.2.1: New multitexture commands and queries prefix "Multi"
4805bd8deadSopenharmony_ci    before "Tex" and add an initial "enum texunit" parameter (to identify
4815bd8deadSopenharmony_ci    the texture unit).>
4825bd8deadSopenharmony_ci
4835bd8deadSopenharmony_ci        void BindMultiTextureEXT(enum texunit, enum target, uint texture);
4845bd8deadSopenharmony_ci
4855bd8deadSopenharmony_ci        void MultiTexCoordPointerEXT(enum texunit, int size, enum type,
4865bd8deadSopenharmony_ci                                     sizei stride, const void *pointer);
4875bd8deadSopenharmony_ci
4885bd8deadSopenharmony_ci        void MultiTexEnvfEXT(enum texunit, enum target, enum pname,
4895bd8deadSopenharmony_ci                             float param);
4905bd8deadSopenharmony_ci        void MultiTexEnvfvEXT(enum texunit, enum target, enum pname,
4915bd8deadSopenharmony_ci                              const float *params);
4925bd8deadSopenharmony_ci        void MultiTexEnviEXT(enum texunit, enum target, enum pname,
4935bd8deadSopenharmony_ci                             int param);
4945bd8deadSopenharmony_ci        void MultiTexEnvivEXT(enum texunit, enum target, enum pname,
4955bd8deadSopenharmony_ci                              const int *params);
4965bd8deadSopenharmony_ci
4975bd8deadSopenharmony_ci        void MultiTexGendEXT(enum texunit, enum coord, enum pname,
4985bd8deadSopenharmony_ci                             double param);
4995bd8deadSopenharmony_ci        void MultiTexGendvEXT(enum texunit, enum coord, enum pname,
5005bd8deadSopenharmony_ci                              const double *params);
5015bd8deadSopenharmony_ci        void MultiTexGenfEXT(enum texunit, enum coord, enum pname,
5025bd8deadSopenharmony_ci                             float param);
5035bd8deadSopenharmony_ci        void MultiTexGenfvEXT(enum texunit, enum coord, enum pname,
5045bd8deadSopenharmony_ci                              const float *params);
5055bd8deadSopenharmony_ci        void MultiTexGeniEXT(enum texunit, enum coord, enum pname,
5065bd8deadSopenharmony_ci                             int param);
5075bd8deadSopenharmony_ci        void MultiTexGenivEXT(enum texunit, enum coord, enum pname,
5085bd8deadSopenharmony_ci                              const int *params);
5095bd8deadSopenharmony_ci
5105bd8deadSopenharmony_ci        void GetMultiTexEnvfvEXT(enum texunit, enum target, enum pname,
5115bd8deadSopenharmony_ci                                 float *params);
5125bd8deadSopenharmony_ci        void GetMultiTexEnvivEXT(enum texunit, enum target, enum pname,
5135bd8deadSopenharmony_ci                                 int *params);
5145bd8deadSopenharmony_ci
5155bd8deadSopenharmony_ci        void GetMultiTexGendvEXT(enum texunit, enum coord, enum pname,
5165bd8deadSopenharmony_ci                                 double *params);
5175bd8deadSopenharmony_ci        void GetMultiTexGenfvEXT(enum texunit, enum coord, enum pname,
5185bd8deadSopenharmony_ci                                 float *params);
5195bd8deadSopenharmony_ci        void GetMultiTexGenivEXT(enum texunit, enum coord, enum pname,
5205bd8deadSopenharmony_ci                                 int *params);
5215bd8deadSopenharmony_ci
5225bd8deadSopenharmony_ci        void MultiTexParameteriEXT(enum texunit, enum target,
5235bd8deadSopenharmony_ci                                   enum pname, int param);
5245bd8deadSopenharmony_ci        void MultiTexParameterivEXT(enum texunit, enum target,
5255bd8deadSopenharmony_ci                                    enum pname, const int *param);
5265bd8deadSopenharmony_ci
5275bd8deadSopenharmony_ci        void MultiTexParameterfEXT(enum texunit, enum target,
5285bd8deadSopenharmony_ci                                   enum pname, float param);
5295bd8deadSopenharmony_ci        void MultiTexParameterfvEXT(enum texunit, enum target,
5305bd8deadSopenharmony_ci                                    enum pname, const float *param);
5315bd8deadSopenharmony_ci
5325bd8deadSopenharmony_ci        void MultiTexImage1DEXT(enum texunit, enum target,
5335bd8deadSopenharmony_ci                                int level, int internalformat,
5345bd8deadSopenharmony_ci                                sizei width, int border,
5355bd8deadSopenharmony_ci                                enum format, enum type, const void *pixels);
5365bd8deadSopenharmony_ci        void MultiTexImage2DEXT(enum texunit, enum target,
5375bd8deadSopenharmony_ci                                int level, int internalformat,
5385bd8deadSopenharmony_ci                                sizei width, sizei height, int border,
5395bd8deadSopenharmony_ci                                enum format, enum type, const void *pixels);
5405bd8deadSopenharmony_ci
5415bd8deadSopenharmony_ci        void MultiTexSubImage1DEXT(enum texunit, enum target,
5425bd8deadSopenharmony_ci                                   int level, int xoffset, sizei width,
5435bd8deadSopenharmony_ci                                   enum format, enum type,
5445bd8deadSopenharmony_ci                                   const void *pixels);
5455bd8deadSopenharmony_ci        void MultiTexSubImage2DEXT(enum texunit, enum target,
5465bd8deadSopenharmony_ci                                   int level, int xoffset, int yoffset,
5475bd8deadSopenharmony_ci                                   sizei width, sizei height,
5485bd8deadSopenharmony_ci                                   enum format, enum type,
5495bd8deadSopenharmony_ci                                   const void *pixels);
5505bd8deadSopenharmony_ci
5515bd8deadSopenharmony_ci        void CopyMultiTexImage1DEXT(enum texunit, enum target,
5525bd8deadSopenharmony_ci                                    int level, enum internalformat,
5535bd8deadSopenharmony_ci                                    int x, int y, sizei width, int border);
5545bd8deadSopenharmony_ci        void CopyMultiTexImage2DEXT(enum texunit, enum target,
5555bd8deadSopenharmony_ci                                    int level, enum internalformat,
5565bd8deadSopenharmony_ci                                    int x, int y,
5575bd8deadSopenharmony_ci                                    sizei width, sizei height, int border);
5585bd8deadSopenharmony_ci
5595bd8deadSopenharmony_ci        void CopyMultiTexSubImage1DEXT(enum texunit, enum target,
5605bd8deadSopenharmony_ci                                       int level, int xoffset,
5615bd8deadSopenharmony_ci                                       int x, int y, sizei width);
5625bd8deadSopenharmony_ci        void CopyMultiTexSubImage2DEXT(enum texunit, enum target,
5635bd8deadSopenharmony_ci                                       int level, int xoffset, int yoffset,
5645bd8deadSopenharmony_ci                                       int x, int y,
5655bd8deadSopenharmony_ci                                       sizei width, sizei height);
5665bd8deadSopenharmony_ci
5675bd8deadSopenharmony_ci        void GetMultiTexImageEXT(enum texunit, enum target,
5685bd8deadSopenharmony_ci                                 int level,
5695bd8deadSopenharmony_ci                                 enum format, enum type, void *pixels);
5705bd8deadSopenharmony_ci
5715bd8deadSopenharmony_ci        void GetMultiTexParameterfvEXT(enum texunit, enum target,
5725bd8deadSopenharmony_ci                                       enum pname, float *params);
5735bd8deadSopenharmony_ci        void GetMultiTexParameterivEXT(enum texunit, enum target,
5745bd8deadSopenharmony_ci                                       enum pname, int *params);
5755bd8deadSopenharmony_ci
5765bd8deadSopenharmony_ci        void GetMultiTexLevelParameterfvEXT(enum texunit, enum target,
5775bd8deadSopenharmony_ci                                            int level,
5785bd8deadSopenharmony_ci                                            enum pname, float *params);
5795bd8deadSopenharmony_ci        void GetMultiTexLevelParameterivEXT(enum texunit, enum target,
5805bd8deadSopenharmony_ci                                            int level,
5815bd8deadSopenharmony_ci                                            enum pname, int *params);
5825bd8deadSopenharmony_ci
5835bd8deadSopenharmony_ci        void MultiTexImage3DEXT(enum texunit, enum target,
5845bd8deadSopenharmony_ci                                int level, int internalformat,
5855bd8deadSopenharmony_ci                                sizei width, sizei height, sizei depth,
5865bd8deadSopenharmony_ci                                int border,
5875bd8deadSopenharmony_ci                                enum format, enum type, const void *pixels);
5885bd8deadSopenharmony_ci
5895bd8deadSopenharmony_ci        void MultiTexSubImage3DEXT(enum texunit, enum target,
5905bd8deadSopenharmony_ci                                   int level,
5915bd8deadSopenharmony_ci                                   int xoffset, int yoffset, int zoffset,
5925bd8deadSopenharmony_ci                                   sizei width, sizei height, sizei depth,
5935bd8deadSopenharmony_ci                                   enum format, enum type,
5945bd8deadSopenharmony_ci                                   const void *pixels);
5955bd8deadSopenharmony_ci        void CopyMultiTexSubImage3DEXT(enum texunit, enum target,
5965bd8deadSopenharmony_ci                                       int level,
5975bd8deadSopenharmony_ci                                       int xoffset, int yoffset, int zoffset,
5985bd8deadSopenharmony_ci                                       int x, int y,
5995bd8deadSopenharmony_ci                                       sizei width, sizei height);
6005bd8deadSopenharmony_ci
6015bd8deadSopenharmony_ci    <OpenGL 1.2.1: New indexed texture commands and queries append
6025bd8deadSopenharmony_ci    "Indexed" to name and add "uint index" parameter (to identify the
6035bd8deadSopenharmony_ci    texture unit index) after state name parameters (if any) and before
6045bd8deadSopenharmony_ci    state value parameters>
6055bd8deadSopenharmony_ci
6065bd8deadSopenharmony_ci        void EnableClientStateIndexedEXT(enum array, uint index);
6075bd8deadSopenharmony_ci        void DisableClientStateIndexedEXT(enum array, uint index);
6085bd8deadSopenharmony_ci
6095bd8deadSopenharmony_ci    <OpenGL 3.0: New indexed texture commands and queries append "i"
6105bd8deadSopenharmony_ci    to name and add "uint index" parameter (to identify the texture
6115bd8deadSopenharmony_ci    unit index) after state name parameters (if any) and before state
6125bd8deadSopenharmony_ci    value parameters>
6135bd8deadSopenharmony_ci
6145bd8deadSopenharmony_ci        void EnableClientStateiEXT(enum array, uint index);
6155bd8deadSopenharmony_ci        void DisableClientStateiEXT(enum array, uint index);
6165bd8deadSopenharmony_ci
6175bd8deadSopenharmony_ci    <OpenGL 1.2.1: New indexed generic queries (added for indexed texture
6185bd8deadSopenharmony_ci    state) append "Indexed" to name and add "uint index" parameter
6195bd8deadSopenharmony_ci    (to identify the texture unit) after state name parameters (if any) and
6205bd8deadSopenharmony_ci    before state value parameters>
6215bd8deadSopenharmony_ci
6225bd8deadSopenharmony_ci        void GetFloatIndexedvEXT(enum target, uint index, float *params);
6235bd8deadSopenharmony_ci        void GetDoubleIndexedvEXT(enum target, uint index, double *params);
6245bd8deadSopenharmony_ci
6255bd8deadSopenharmony_ci        void GetPointerIndexedvEXT(enum target, uint index, void **params);
6265bd8deadSopenharmony_ci
6275bd8deadSopenharmony_ci    <OpenGL 3.0: New indexed generic queries (added for indexed texture
6285bd8deadSopenharmony_ci    state) replace "v" for "i_v" to name and add "uint index" parameter
6295bd8deadSopenharmony_ci    (to identify the texture unit) after state name parameters (if any)
6305bd8deadSopenharmony_ci    and before state value parameters>
6315bd8deadSopenharmony_ci
6325bd8deadSopenharmony_ci        void GetFloati_vEXT(enum pname, uint index, float *params);
6335bd8deadSopenharmony_ci        void GetDoublei_vEXT(enum pname, uint index, double *params);
6345bd8deadSopenharmony_ci
6355bd8deadSopenharmony_ci        void GetPointeri_vEXT(enum pname, uint index, void **params);
6365bd8deadSopenharmony_ci
6375bd8deadSopenharmony_ci    <OpenGL 1.2.1:  Extend the functionality of these EXT_draw_buffers2
6385bd8deadSopenharmony_ci    commands and queries for multitexture>
6395bd8deadSopenharmony_ci
6405bd8deadSopenharmony_ci        void EnableIndexedEXT(enum cap, uint index);
6415bd8deadSopenharmony_ci        void DisableIndexedEXT(enum cap, uint index);
6425bd8deadSopenharmony_ci
6435bd8deadSopenharmony_ci        boolean IsEnabledIndexedEXT(enum target, uint index);
6445bd8deadSopenharmony_ci
6455bd8deadSopenharmony_ci        void GetIntegerIndexedvEXT(enum target, uint index, int *params);
6465bd8deadSopenharmony_ci        void GetBooleanIndexedvEXT(enum target, uint index,
6475bd8deadSopenharmony_ci                                   boolean *params);
6485bd8deadSopenharmony_ci
6495bd8deadSopenharmony_ci    <ARB_vertex_program: New program commands and queries add "Named"
6505bd8deadSopenharmony_ci    prefix to name and adds initial "uint program" parameter>
6515bd8deadSopenharmony_ci
6525bd8deadSopenharmony_ci        void NamedProgramStringEXT(uint program, enum target, enum format,
6535bd8deadSopenharmony_ci                                   sizei len, const void *string); 
6545bd8deadSopenharmony_ci
6555bd8deadSopenharmony_ci        void NamedProgramLocalParameter4dEXT(uint program, enum target,
6565bd8deadSopenharmony_ci                                             uint index,
6575bd8deadSopenharmony_ci                                             double x, double y,
6585bd8deadSopenharmony_ci                                             double z, double w);
6595bd8deadSopenharmony_ci        void NamedProgramLocalParameter4dvEXT(uint program, enum target,
6605bd8deadSopenharmony_ci                                              uint index,
6615bd8deadSopenharmony_ci                                              const double *params);
6625bd8deadSopenharmony_ci        void NamedProgramLocalParameter4fEXT(uint program, enum target,
6635bd8deadSopenharmony_ci                                             uint index,
6645bd8deadSopenharmony_ci                                             float x, float y,
6655bd8deadSopenharmony_ci                                             float z, float w);
6665bd8deadSopenharmony_ci        void NamedProgramLocalParameter4fvEXT(uint program, enum target,
6675bd8deadSopenharmony_ci                                              uint index,
6685bd8deadSopenharmony_ci                                              const float *params);
6695bd8deadSopenharmony_ci
6705bd8deadSopenharmony_ci        void GetNamedProgramLocalParameterdvEXT(uint program, enum target,
6715bd8deadSopenharmony_ci                                                uint index,
6725bd8deadSopenharmony_ci                                                double *params);
6735bd8deadSopenharmony_ci        void GetNamedProgramLocalParameterfvEXT(uint program, enum target,
6745bd8deadSopenharmony_ci                                                uint index,
6755bd8deadSopenharmony_ci                                                float *params);
6765bd8deadSopenharmony_ci        void GetNamedProgramivEXT(uint program, enum target,
6775bd8deadSopenharmony_ci                                  enum pname, int *params);
6785bd8deadSopenharmony_ci        void GetNamedProgramStringEXT(uint program, enum target,
6795bd8deadSopenharmony_ci                                      enum pname, void *string);
6805bd8deadSopenharmony_ci
6815bd8deadSopenharmony_ci    <OpenGL 1.3: New compressed texture object commands replace "Tex"
6825bd8deadSopenharmony_ci    in name with "Texture" and add initial "uint texture" parameter>
6835bd8deadSopenharmony_ci
6845bd8deadSopenharmony_ci        void CompressedTextureImage3DEXT(uint texture, enum target, int level,
6855bd8deadSopenharmony_ci                                         enum internalformat,
6865bd8deadSopenharmony_ci                                         sizei width, sizei height,
6875bd8deadSopenharmony_ci                                         sizei depth, int border,
6885bd8deadSopenharmony_ci                                         sizei imageSize, const void *data);
6895bd8deadSopenharmony_ci        void CompressedTextureImage2DEXT(uint texture, enum target, int level,
6905bd8deadSopenharmony_ci                                         enum internalformat,
6915bd8deadSopenharmony_ci                                         sizei width, sizei height,
6925bd8deadSopenharmony_ci                                         int border, sizei imageSize,
6935bd8deadSopenharmony_ci                                         const void *data);
6945bd8deadSopenharmony_ci        void CompressedTextureImage1DEXT(uint texture, enum target, int level,
6955bd8deadSopenharmony_ci                                         enum internalformat,
6965bd8deadSopenharmony_ci                                         sizei width, int border,
6975bd8deadSopenharmony_ci                                         sizei imageSize, const void *data);
6985bd8deadSopenharmony_ci        void CompressedTextureSubImage3DEXT(uint texture, enum target, int level,
6995bd8deadSopenharmony_ci                                            int xoffset, int yoffset,
7005bd8deadSopenharmony_ci                                            int zoffset,
7015bd8deadSopenharmony_ci                                            sizei width, sizei height,
7025bd8deadSopenharmony_ci                                            sizei depth, enum format,
7035bd8deadSopenharmony_ci                                            sizei imageSize, const void *data);
7045bd8deadSopenharmony_ci        void CompressedTextureSubImage2DEXT(uint texture, enum target, int level,
7055bd8deadSopenharmony_ci                                            int xoffset, int yoffset,
7065bd8deadSopenharmony_ci                                            sizei width, sizei height,
7075bd8deadSopenharmony_ci                                            enum format,
7085bd8deadSopenharmony_ci                                            sizei imageSize, const void *data);
7095bd8deadSopenharmony_ci        void CompressedTextureSubImage1DEXT(uint texture, enum target, int level,
7105bd8deadSopenharmony_ci                                            int xoffset, sizei width,
7115bd8deadSopenharmony_ci                                            enum format,
7125bd8deadSopenharmony_ci                                            sizei imageSize, const void *data);
7135bd8deadSopenharmony_ci
7145bd8deadSopenharmony_ci        void GetCompressedTextureImageEXT(uint texture, enum target,
7155bd8deadSopenharmony_ci                                          int level, void *img);
7165bd8deadSopenharmony_ci
7175bd8deadSopenharmony_ci    <OpenGL 1.3: New multitexture compressed texture commands and queries
7185bd8deadSopenharmony_ci    prefix "Multi" before "Tex" and add an initial "enum texunit"
7195bd8deadSopenharmony_ci    parameter (to identify the texture unit).>
7205bd8deadSopenharmony_ci
7215bd8deadSopenharmony_ci        void CompressedMultiTexImage3DEXT(enum texunit, enum target, int level,
7225bd8deadSopenharmony_ci                                          enum internalformat,
7235bd8deadSopenharmony_ci                                          sizei width, sizei height,
7245bd8deadSopenharmony_ci                                          sizei depth, int border,
7255bd8deadSopenharmony_ci                                          sizei imageSize, const void *data);
7265bd8deadSopenharmony_ci        void CompressedMultiTexImage2DEXT(enum texunit, enum target, int level,
7275bd8deadSopenharmony_ci                                          enum internalformat,
7285bd8deadSopenharmony_ci                                          sizei width, sizei height,
7295bd8deadSopenharmony_ci                                          int border, sizei imageSize,
7305bd8deadSopenharmony_ci                                          const void *data);
7315bd8deadSopenharmony_ci        void CompressedMultiTexImage1DEXT(enum texunit, enum target, int level,
7325bd8deadSopenharmony_ci                                          enum internalformat,
7335bd8deadSopenharmony_ci                                          sizei width, int border,
7345bd8deadSopenharmony_ci                                          sizei imageSize, const void *data);
7355bd8deadSopenharmony_ci        void CompressedMultiTexSubImage3DEXT(enum texunit, enum target, int level,
7365bd8deadSopenharmony_ci                                             int xoffset, int yoffset,
7375bd8deadSopenharmony_ci                                             int zoffset,
7385bd8deadSopenharmony_ci                                             sizei width, sizei height,
7395bd8deadSopenharmony_ci                                             sizei depth, enum format,
7405bd8deadSopenharmony_ci                                             sizei imageSize, const void *data);
7415bd8deadSopenharmony_ci        void CompressedMultiTexSubImage2DEXT(enum texunit, enum target, int level,
7425bd8deadSopenharmony_ci                                             int xoffset, int yoffset,
7435bd8deadSopenharmony_ci                                             sizei width, sizei height,
7445bd8deadSopenharmony_ci                                             enum format,
7455bd8deadSopenharmony_ci                                             sizei imageSize, const void *data);
7465bd8deadSopenharmony_ci        void CompressedMultiTexSubImage1DEXT(enum texunit, enum target, int level,
7475bd8deadSopenharmony_ci                                             int xoffset, sizei width,
7485bd8deadSopenharmony_ci                                             enum format,
7495bd8deadSopenharmony_ci                                             sizei imageSize, const void *data);
7505bd8deadSopenharmony_ci
7515bd8deadSopenharmony_ci        void GetCompressedMultiTexImageEXT(enum texunit, enum target,
7525bd8deadSopenharmony_ci                                           int level, void *img);
7535bd8deadSopenharmony_ci
7545bd8deadSopenharmony_ci    <OpenGL 1.3: New transpose matrix commands add "Matrix" suffix
7555bd8deadSopenharmony_ci    to name, drops "Matrix" suffix from name, and add initial "enum
7565bd8deadSopenharmony_ci    matrixMode" parameter>
7575bd8deadSopenharmony_ci
7585bd8deadSopenharmony_ci        void MatrixLoadTransposefEXT(enum matrixMode, const float *m);
7595bd8deadSopenharmony_ci        void MatrixLoadTransposedEXT(enum matrixMode, const double *m);
7605bd8deadSopenharmony_ci
7615bd8deadSopenharmony_ci        void MatrixMultTransposefEXT(enum matrixMode, const float *m);
7625bd8deadSopenharmony_ci        void MatrixMultTransposedEXT(enum matrixMode, const double *m);
7635bd8deadSopenharmony_ci
7645bd8deadSopenharmony_ci    <OpenGL 1.5: New buffer commands and queries replace "Buffer" with
7655bd8deadSopenharmony_ci    "NamedBuffer" in name and replace "enum target" parameter with
7665bd8deadSopenharmony_ci    "uint buffer">
7675bd8deadSopenharmony_ci
7685bd8deadSopenharmony_ci        void NamedBufferDataEXT(uint buffer, sizeiptr size,
7695bd8deadSopenharmony_ci                                const void *data, enum usage);
7705bd8deadSopenharmony_ci        void NamedBufferSubDataEXT(uint buffer, intptr offset,
7715bd8deadSopenharmony_ci                                   sizeiptr size, const void *data);
7725bd8deadSopenharmony_ci        void* MapNamedBufferEXT(uint buffer, enum access);
7735bd8deadSopenharmony_ci        boolean UnmapNamedBufferEXT(uint buffer);
7745bd8deadSopenharmony_ci        void GetNamedBufferParameterivEXT(uint buffer,
7755bd8deadSopenharmony_ci                                          enum pname, int *params);
7765bd8deadSopenharmony_ci        void GetNamedBufferPointervEXT(uint buffer,
7775bd8deadSopenharmony_ci                                       enum pname, void* *params);
7785bd8deadSopenharmony_ci        void GetNamedBufferSubDataEXT(uint buffer,
7795bd8deadSopenharmony_ci                                      intptr offset, sizeiptr size, void *data);
7805bd8deadSopenharmony_ci
7815bd8deadSopenharmony_ci    <OpenGL 2.0: New uniform commands add "Program" prefix to name and
7825bd8deadSopenharmony_ci    add initial "uint program" parameter>
7835bd8deadSopenharmony_ci
7845bd8deadSopenharmony_ci        void ProgramUniform1fEXT(uint program, int location, float v0);
7855bd8deadSopenharmony_ci        void ProgramUniform2fEXT(uint program, int location,
7865bd8deadSopenharmony_ci                                 float v0, float v1);
7875bd8deadSopenharmony_ci        void ProgramUniform3fEXT(uint program, int location,
7885bd8deadSopenharmony_ci                                 float v0, float v1, float v2);
7895bd8deadSopenharmony_ci        void ProgramUniform4fEXT(uint program, int location,
7905bd8deadSopenharmony_ci                                 float v0, float v1, float v2, float v3);
7915bd8deadSopenharmony_ci
7925bd8deadSopenharmony_ci        void ProgramUniform1iEXT(uint program, int location, int v0);
7935bd8deadSopenharmony_ci        void ProgramUniform2iEXT(uint program, int location,
7945bd8deadSopenharmony_ci                                 int v0, int v1);
7955bd8deadSopenharmony_ci        void ProgramUniform3iEXT(uint program, int location,
7965bd8deadSopenharmony_ci                                 int v0, int v1, int v2);
7975bd8deadSopenharmony_ci        void ProgramUniform4iEXT(uint program, int location,
7985bd8deadSopenharmony_ci                                 int v0, int v1, int v2, int v3);
7995bd8deadSopenharmony_ci
8005bd8deadSopenharmony_ci        void ProgramUniform1fvEXT(uint program, int location,
8015bd8deadSopenharmony_ci                                  sizei count, const float *value);
8025bd8deadSopenharmony_ci        void ProgramUniform2fvEXT(uint program, int location,
8035bd8deadSopenharmony_ci                                  sizei count, const float *value);
8045bd8deadSopenharmony_ci        void ProgramUniform3fvEXT(uint program, int location,
8055bd8deadSopenharmony_ci                                  sizei count, const float *value);
8065bd8deadSopenharmony_ci        void ProgramUniform4fvEXT(uint program, int location,
8075bd8deadSopenharmony_ci                                  sizei count, const float *value);
8085bd8deadSopenharmony_ci
8095bd8deadSopenharmony_ci        void ProgramUniform1ivEXT(uint program, int location,
8105bd8deadSopenharmony_ci                                  sizei count, const int *value);
8115bd8deadSopenharmony_ci        void ProgramUniform2ivEXT(uint program, int location,
8125bd8deadSopenharmony_ci                                  sizei count, const int *value);
8135bd8deadSopenharmony_ci        void ProgramUniform3ivEXT(uint program, int location,
8145bd8deadSopenharmony_ci                                  sizei count, const int *value);
8155bd8deadSopenharmony_ci        void ProgramUniform4ivEXT(uint program, int location,
8165bd8deadSopenharmony_ci                                  sizei count, const int *value);
8175bd8deadSopenharmony_ci
8185bd8deadSopenharmony_ci        void ProgramUniformMatrix2fvEXT(uint program, int location,
8195bd8deadSopenharmony_ci                                        sizei count, boolean transpose,
8205bd8deadSopenharmony_ci                                        const float *value);
8215bd8deadSopenharmony_ci        void ProgramUniformMatrix3fvEXT(uint program, int location,
8225bd8deadSopenharmony_ci                                        sizei count, boolean transpose,
8235bd8deadSopenharmony_ci                                        const float *value);
8245bd8deadSopenharmony_ci        void ProgramUniformMatrix4fvEXT(uint program, int location,
8255bd8deadSopenharmony_ci                                        sizei count, boolean transpose,
8265bd8deadSopenharmony_ci                                        const float *value);
8275bd8deadSopenharmony_ci
8285bd8deadSopenharmony_ci    <OpenGL 2.1: New uniform matrix commands add "Program" prefix to
8295bd8deadSopenharmony_ci    name and add initial "uint program" parameter>
8305bd8deadSopenharmony_ci
8315bd8deadSopenharmony_ci        void ProgramUniformMatrix2x3fvEXT(uint program, int location,
8325bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
8335bd8deadSopenharmony_ci                                          const float *value);
8345bd8deadSopenharmony_ci        void ProgramUniformMatrix3x2fvEXT(uint program, int location,
8355bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
8365bd8deadSopenharmony_ci                                          const float *value);
8375bd8deadSopenharmony_ci        void ProgramUniformMatrix2x4fvEXT(uint program, int location,
8385bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
8395bd8deadSopenharmony_ci                                          const float *value);
8405bd8deadSopenharmony_ci        void ProgramUniformMatrix4x2fvEXT(uint program, int location,
8415bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
8425bd8deadSopenharmony_ci                                          const float *value);
8435bd8deadSopenharmony_ci        void ProgramUniformMatrix3x4fvEXT(uint program, int location,
8445bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
8455bd8deadSopenharmony_ci                                          const float *value);
8465bd8deadSopenharmony_ci        void ProgramUniformMatrix4x3fvEXT(uint program, int location,
8475bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
8485bd8deadSopenharmony_ci                                          const float *value);
8495bd8deadSopenharmony_ci
8505bd8deadSopenharmony_ci    <EXT_texture_buffer_object:  New texture buffer object command
8515bd8deadSopenharmony_ci    replaces "Tex" in name with "Texture" and adds initial "uint texture"
8525bd8deadSopenharmony_ci    parameter>
8535bd8deadSopenharmony_ci
8545bd8deadSopenharmony_ci        void TextureBufferEXT(uint texture, enum target,
8555bd8deadSopenharmony_ci                              enum internalformat, uint buffer);
8565bd8deadSopenharmony_ci
8575bd8deadSopenharmony_ci    <EXT_texture_buffer_object: New multitexture texture buffer command
8585bd8deadSopenharmony_ci    prefixes "Multi" before "Tex" and add an initial "enum texunit"
8595bd8deadSopenharmony_ci    parameter (to identify the texture unit).>
8605bd8deadSopenharmony_ci
8615bd8deadSopenharmony_ci        void MultiTexBufferEXT(enum texunit, enum target,
8625bd8deadSopenharmony_ci                               enum internalformat, uint buffer);
8635bd8deadSopenharmony_ci
8645bd8deadSopenharmony_ci    <EXT_texture_integer: New integer texture object commands and queries
8655bd8deadSopenharmony_ci    replace "Tex" in name with "Texture" and add initial "uint texture"
8665bd8deadSopenharmony_ci    parameter>
8675bd8deadSopenharmony_ci
8685bd8deadSopenharmony_ci        void TextureParameterIivEXT(uint texture, enum target,
8695bd8deadSopenharmony_ci                                    enum pname, const int *params);
8705bd8deadSopenharmony_ci        void TextureParameterIuivEXT(uint texture, enum target,
8715bd8deadSopenharmony_ci                                     enum pname, const uint *params);
8725bd8deadSopenharmony_ci
8735bd8deadSopenharmony_ci        void GetTextureParameterIivEXT(uint texture, enum target,
8745bd8deadSopenharmony_ci                                       enum pname, int *params);
8755bd8deadSopenharmony_ci        void GetTextureParameterIuivEXT(uint texture, enum target,
8765bd8deadSopenharmony_ci                                        enum pname, uint *params);
8775bd8deadSopenharmony_ci
8785bd8deadSopenharmony_ci    <EXT_texture_integer: New multitexture integer texture commands and
8795bd8deadSopenharmony_ci    queries prefix "Multi" before "Tex" and add an initial "enum texunit"
8805bd8deadSopenharmony_ci    parameter (to identify the texture unit).>
8815bd8deadSopenharmony_ci
8825bd8deadSopenharmony_ci        void MultiTexParameterIivEXT(enum texunit, enum target,
8835bd8deadSopenharmony_ci                                     enum pname, const int *params);
8845bd8deadSopenharmony_ci        void MultiTexParameterIuivEXT(enum texunit, enum target,
8855bd8deadSopenharmony_ci                                      enum pname, const uint *params);
8865bd8deadSopenharmony_ci
8875bd8deadSopenharmony_ci        void GetMultiTexParameterIivEXT(enum texunit, enum target,
8885bd8deadSopenharmony_ci                                        enum pname, int *params);
8895bd8deadSopenharmony_ci        void GetMultiTexParameterIuivEXT(enum texunit, enum target,
8905bd8deadSopenharmony_ci                                         enum pname, uint *params);
8915bd8deadSopenharmony_ci
8925bd8deadSopenharmony_ci    <EXT_gpu_shader4: New integer uniform commands add "Program" prefix
8935bd8deadSopenharmony_ci    to name and add initial "uint program" parameter>
8945bd8deadSopenharmony_ci
8955bd8deadSopenharmony_ci        void ProgramUniform1uiEXT(uint program, int location, uint v0);
8965bd8deadSopenharmony_ci        void ProgramUniform2uiEXT(uint program, int location,
8975bd8deadSopenharmony_ci                                  uint v0, uint v1);
8985bd8deadSopenharmony_ci        void ProgramUniform3uiEXT(uint program, int location,
8995bd8deadSopenharmony_ci                                  uint v0, uint v1, uint v2);
9005bd8deadSopenharmony_ci        void ProgramUniform4uiEXT(uint program, int location,
9015bd8deadSopenharmony_ci                                  uint v0, uint v1, uint v2, uint v3);
9025bd8deadSopenharmony_ci
9035bd8deadSopenharmony_ci        void ProgramUniform1uivEXT(uint program, int location,
9045bd8deadSopenharmony_ci                                   sizei count, const uint *value);
9055bd8deadSopenharmony_ci        void ProgramUniform2uivEXT(uint program, int location,
9065bd8deadSopenharmony_ci                                   sizei count, const uint *value);
9075bd8deadSopenharmony_ci        void ProgramUniform3uivEXT(uint program, int location,
9085bd8deadSopenharmony_ci                                   sizei count, const uint *value);
9095bd8deadSopenharmony_ci        void ProgramUniform4uivEXT(uint program, int location,
9105bd8deadSopenharmony_ci                                   sizei count, const uint *value);
9115bd8deadSopenharmony_ci
9125bd8deadSopenharmony_ci    <EXT_gpu_program_parameters: New program command adds "Named" prefix
9135bd8deadSopenharmony_ci    to name and adds "uint program" parameter>
9145bd8deadSopenharmony_ci
9155bd8deadSopenharmony_ci        void NamedProgramLocalParameters4fvEXT(uint program, enum target,
9165bd8deadSopenharmony_ci                                               uint index, sizei count,
9175bd8deadSopenharmony_ci                                               const float *params); 
9185bd8deadSopenharmony_ci
9195bd8deadSopenharmony_ci    <NV_gpu_program4: New program commands and queries add "Named"
9205bd8deadSopenharmony_ci    prefix to name and replace "enum target" with "uint program">
9215bd8deadSopenharmony_ci
9225bd8deadSopenharmony_ci        void NamedProgramLocalParameterI4iEXT(uint program, enum target,
9235bd8deadSopenharmony_ci                                              uint index, 
9245bd8deadSopenharmony_ci                                              int x, int y,
9255bd8deadSopenharmony_ci                                              int z, int w);
9265bd8deadSopenharmony_ci        void NamedProgramLocalParameterI4ivEXT(uint program, enum target,
9275bd8deadSopenharmony_ci                                               uint index, 
9285bd8deadSopenharmony_ci                                               const int *params);
9295bd8deadSopenharmony_ci        void NamedProgramLocalParametersI4ivEXT(uint program, enum target,
9305bd8deadSopenharmony_ci                                                uint index, sizei count,
9315bd8deadSopenharmony_ci                                                const int *params);
9325bd8deadSopenharmony_ci        void NamedProgramLocalParameterI4uiEXT(uint program, enum target,
9335bd8deadSopenharmony_ci                                               uint index, 
9345bd8deadSopenharmony_ci                                               uint x, uint y,
9355bd8deadSopenharmony_ci                                               uint z, uint w);
9365bd8deadSopenharmony_ci        void NamedProgramLocalParameterI4uivEXT(uint program, enum target,
9375bd8deadSopenharmony_ci                                                uint index, 
9385bd8deadSopenharmony_ci                                                const uint *params);
9395bd8deadSopenharmony_ci        void NamedProgramLocalParametersI4uivEXT(uint program, enum target,
9405bd8deadSopenharmony_ci                                                 uint index, sizei count,
9415bd8deadSopenharmony_ci                                                 const uint *params);
9425bd8deadSopenharmony_ci
9435bd8deadSopenharmony_ci        void GetNamedProgramLocalParameterIivEXT(uint program, enum target,
9445bd8deadSopenharmony_ci                                                 uint index,
9455bd8deadSopenharmony_ci                                                 int *params);
9465bd8deadSopenharmony_ci        void GetNamedProgramLocalParameterIuivEXT(uint program, enum target,
9475bd8deadSopenharmony_ci                                                  uint index,
9485bd8deadSopenharmony_ci                                                  uint *params);
9495bd8deadSopenharmony_ci
9505bd8deadSopenharmony_ci    <OpenGL 3.0: New renderbuffer commands add "Named" prefix to name
9515bd8deadSopenharmony_ci    and replace "enum target" with "uint renderbuffer">
9525bd8deadSopenharmony_ci
9535bd8deadSopenharmony_ci        void NamedRenderbufferStorageEXT(uint renderbuffer,
9545bd8deadSopenharmony_ci                                         enum internalformat,
9555bd8deadSopenharmony_ci                                         sizei width, sizei height);
9565bd8deadSopenharmony_ci
9575bd8deadSopenharmony_ci        void GetNamedRenderbufferParameterivEXT(uint renderbuffer,
9585bd8deadSopenharmony_ci                                                enum pname, int *params);
9595bd8deadSopenharmony_ci
9605bd8deadSopenharmony_ci    <OpenGL 3.0: New renderbuffer commands add "Named"
9615bd8deadSopenharmony_ci    prefix to name and replace "enum target" with "uint renderbuffer">
9625bd8deadSopenharmony_ci
9635bd8deadSopenharmony_ci        void NamedRenderbufferStorageMultisampleEXT(uint renderbuffer,
9645bd8deadSopenharmony_ci                                                    sizei samples,
9655bd8deadSopenharmony_ci                                                    enum internalformat,
9665bd8deadSopenharmony_ci                                                    sizei width, sizei height);
9675bd8deadSopenharmony_ci
9685bd8deadSopenharmony_ci    <NV_framebuffer_multisample_coverage: New renderbuffer commands
9695bd8deadSopenharmony_ci    add "Named" prefix to name and replace "enum target" with "uint
9705bd8deadSopenharmony_ci    renderbuffer">
9715bd8deadSopenharmony_ci
9725bd8deadSopenharmony_ci        void NamedRenderbufferStorageMultisampleCoverageEXT(uint renderbuffer,
9735bd8deadSopenharmony_ci                                                            sizei coverageSamples, 
9745bd8deadSopenharmony_ci                                                            sizei colorSamples,
9755bd8deadSopenharmony_ci                                                            enum internalformat,
9765bd8deadSopenharmony_ci                                                            sizei width,
9775bd8deadSopenharmony_ci                                                            sizei height);
9785bd8deadSopenharmony_ci
9795bd8deadSopenharmony_ci    <OpenGL 3.0: New framebuffer commands add "Named" prefix to name
9805bd8deadSopenharmony_ci    and replace "enum target" with "uint framebuffer">
9815bd8deadSopenharmony_ci
9825bd8deadSopenharmony_ci        enum CheckNamedFramebufferStatusEXT(uint framebuffer,
9835bd8deadSopenharmony_ci                                            enum target);
9845bd8deadSopenharmony_ci
9855bd8deadSopenharmony_ci        void NamedFramebufferTexture1DEXT(uint framebuffer,
9865bd8deadSopenharmony_ci                                          enum attachment,
9875bd8deadSopenharmony_ci                                          enum textarget, uint texture,
9885bd8deadSopenharmony_ci                                          int level);
9895bd8deadSopenharmony_ci        void NamedFramebufferTexture2DEXT(uint framebuffer,
9905bd8deadSopenharmony_ci                                          enum attachment,
9915bd8deadSopenharmony_ci                                          enum textarget, uint texture,
9925bd8deadSopenharmony_ci                                          int level);
9935bd8deadSopenharmony_ci        void NamedFramebufferTexture3DEXT(uint framebuffer,
9945bd8deadSopenharmony_ci                                          enum attachment,
9955bd8deadSopenharmony_ci                                          enum textarget, uint texture,
9965bd8deadSopenharmony_ci                                          int level, int zoffset);
9975bd8deadSopenharmony_ci
9985bd8deadSopenharmony_ci        void NamedFramebufferRenderbufferEXT(uint framebuffer,
9995bd8deadSopenharmony_ci                                             enum attachment,
10005bd8deadSopenharmony_ci                                             enum renderbuffertarget,
10015bd8deadSopenharmony_ci                                             uint renderbuffer);
10025bd8deadSopenharmony_ci
10035bd8deadSopenharmony_ci        void GetNamedFramebufferAttachmentParameterivEXT(uint framebuffer,
10045bd8deadSopenharmony_ci                                                         enum attachment,
10055bd8deadSopenharmony_ci                                                         enum pname,
10065bd8deadSopenharmony_ci                                                         int *params);
10075bd8deadSopenharmony_ci
10085bd8deadSopenharmony_ci    <OpenGL 3.0: New texture commands add "Texture" within name and
10095bd8deadSopenharmony_ci    replace "enum target" with "uint texture">
10105bd8deadSopenharmony_ci
10115bd8deadSopenharmony_ci        void GenerateTextureMipmapEXT(uint texture, enum target);
10125bd8deadSopenharmony_ci
10135bd8deadSopenharmony_ci    <OpenGL 3.0: New texture commands add "MultiTex" within name and
10145bd8deadSopenharmony_ci    replace "enum target" with "enum texunit">
10155bd8deadSopenharmony_ci
10165bd8deadSopenharmony_ci        void GenerateMultiTexMipmapEXT(enum texunit, enum target);
10175bd8deadSopenharmony_ci
10185bd8deadSopenharmony_ci    <OpenGL 3.0: New framebuffer commands>
10195bd8deadSopenharmony_ci
10205bd8deadSopenharmony_ci        void FramebufferDrawBufferEXT(uint framebuffer, enum mode);
10215bd8deadSopenharmony_ci        void FramebufferDrawBuffersEXT(uint framebuffer, sizei n,
10225bd8deadSopenharmony_ci                                       const enum *bufs)
10235bd8deadSopenharmony_ci        void FramebufferReadBufferEXT(uint framebuffer, enum mode);
10245bd8deadSopenharmony_ci
10255bd8deadSopenharmony_ci    <OpenGL 3.0: New framebuffer query>
10265bd8deadSopenharmony_ci
10275bd8deadSopenharmony_ci        void GetFramebufferParameterivEXT(uint framebuffer, enum pname,
10285bd8deadSopenharmony_ci                                          int *param);
10295bd8deadSopenharmony_ci
10305bd8deadSopenharmony_ci    <OpenGL 3.0: New buffer data copy command>
10315bd8deadSopenharmony_ci        void NamedCopyBufferSubDataEXT(uint readBuffer, uint writeBuffer, 
10325bd8deadSopenharmony_ci                                       intptr readOffset, intptr writeOffset,
10335bd8deadSopenharmony_ci                                       sizeiptr size);
10345bd8deadSopenharmony_ci
10355bd8deadSopenharmony_ci    <EXT_geometry_shader4 or NV_gpu_program4: New framebuffer commands
10365bd8deadSopenharmony_ci    add "Named" prefix to name and replace "enum target" with "uint
10375bd8deadSopenharmony_ci    framebuffer">
10385bd8deadSopenharmony_ci
10395bd8deadSopenharmony_ci        void NamedFramebufferTextureEXT(uint framebuffer, enum attachment, 
10405bd8deadSopenharmony_ci                                        uint texture, int level);
10415bd8deadSopenharmony_ci        void NamedFramebufferTextureLayerEXT(uint framebuffer,
10425bd8deadSopenharmony_ci                                             enum attachment, 
10435bd8deadSopenharmony_ci                                             uint texture,
10445bd8deadSopenharmony_ci                                             int level, int layer);
10455bd8deadSopenharmony_ci        void NamedFramebufferTextureFaceEXT(uint framebuffer, enum attachment,
10465bd8deadSopenharmony_ci                                            uint texture,
10475bd8deadSopenharmony_ci                                            int level, enum face);
10485bd8deadSopenharmony_ci
10495bd8deadSopenharmony_ci    <NV_explicit_multisample:  New texture renderbuffer object command
10505bd8deadSopenharmony_ci    replaces "Tex" in name with "Texture" and add initial "uint texture"
10515bd8deadSopenharmony_ci    parameter> 
10525bd8deadSopenharmony_ci
10535bd8deadSopenharmony_ci        void TextureRenderbufferEXT(uint texture, enum target,
10545bd8deadSopenharmony_ci                                    uint renderbuffer);
10555bd8deadSopenharmony_ci
10565bd8deadSopenharmony_ci    <NV_explicit_multisample: New multitexture texture renderbuffer command
10575bd8deadSopenharmony_ci    prefixes "Multi" before "Tex" and add an initial "enum texunit"
10585bd8deadSopenharmony_ci    parameter (to identify the texture unit)>
10595bd8deadSopenharmony_ci
10605bd8deadSopenharmony_ci        void MultiTexRenderbufferEXT(enum texunit, enum target,
10615bd8deadSopenharmony_ci                                     uint renderbuffer);
10625bd8deadSopenharmony_ci
10635bd8deadSopenharmony_ci    <OpenGL 3.0: New vertex array specification commands for vertex
10645bd8deadSopenharmony_ci    array objects prefix "VertexArray", add initial "uint vaobj" and
10655bd8deadSopenharmony_ci    "uint buffer" parameters, change "Pointer" suffix to "Offset",
10665bd8deadSopenharmony_ci    and change the final parameter from "const void *" to "intptr offset">
10675bd8deadSopenharmony_ci
10685bd8deadSopenharmony_ci        void VertexArrayVertexOffsetEXT(uint vaobj, uint buffer,
10695bd8deadSopenharmony_ci                                        int size, enum type, sizei stride,
10705bd8deadSopenharmony_ci                                        intptr offset);
10715bd8deadSopenharmony_ci        void VertexArrayColorOffsetEXT(uint vaobj, uint buffer,
10725bd8deadSopenharmony_ci                                       int size, enum type, sizei stride,
10735bd8deadSopenharmony_ci                                       intptr offset);
10745bd8deadSopenharmony_ci        void VertexArrayEdgeFlagOffsetEXT(uint vaobj, uint buffer,
10755bd8deadSopenharmony_ci                                          sizei stride, intptr offset);
10765bd8deadSopenharmony_ci        void VertexArrayIndexOffsetEXT(uint vaobj, uint buffer,
10775bd8deadSopenharmony_ci                                       enum type, sizei stride,
10785bd8deadSopenharmony_ci                                       intptr offset);
10795bd8deadSopenharmony_ci        void VertexArrayNormalOffsetEXT(uint vaobj, uint buffer,
10805bd8deadSopenharmony_ci                                        enum type, sizei stride,
10815bd8deadSopenharmony_ci                                        intptr offset);
10825bd8deadSopenharmony_ci        void VertexArrayTexCoordOffsetEXT(uint vaobj, uint buffer,
10835bd8deadSopenharmony_ci                                          int size, enum type, sizei stride,
10845bd8deadSopenharmony_ci                                          intptr offset);
10855bd8deadSopenharmony_ci        void VertexArrayMultiTexCoordOffsetEXT(uint vaobj, uint buffer,
10865bd8deadSopenharmony_ci                                               enum texunit,
10875bd8deadSopenharmony_ci                                               int size, enum type, sizei stride,
10885bd8deadSopenharmony_ci                                               intptr offset);
10895bd8deadSopenharmony_ci        void VertexArrayFogCoordOffsetEXT(uint vaobj, uint buffer,
10905bd8deadSopenharmony_ci                                          enum type, sizei stride,
10915bd8deadSopenharmony_ci                                          intptr offset);
10925bd8deadSopenharmony_ci        void VertexArraySecondaryColorOffsetEXT(uint vaobj, uint buffer,
10935bd8deadSopenharmony_ci                                                int size, enum type,
10945bd8deadSopenharmony_ci                                                sizei stride, intptr offset);
10955bd8deadSopenharmony_ci        void VertexArrayVertexAttribOffsetEXT(uint vaobj, uint buffer,
10965bd8deadSopenharmony_ci                                              uint index, int size,
10975bd8deadSopenharmony_ci                                              enum type, boolean normalized,
10985bd8deadSopenharmony_ci                                              sizei stride, intptr offset);
10995bd8deadSopenharmony_ci        void VertexArrayVertexAttribIOffsetEXT(uint vaobj, uint buffer,
11005bd8deadSopenharmony_ci                                               uint index, int size,
11015bd8deadSopenharmony_ci                                               enum type, sizei stride,
11025bd8deadSopenharmony_ci                                               intptr offset);
11035bd8deadSopenharmony_ci
11045bd8deadSopenharmony_ci    <OpenGL 3.0: New vertex array enable commands for vertex array
11055bd8deadSopenharmony_ci    objects change "ClientState" to "VertexArray" and add an initial
11065bd8deadSopenharmony_ci    "uint vaobj" parameter>
11075bd8deadSopenharmony_ci
11085bd8deadSopenharmony_ci        void EnableVertexArrayEXT(uint vaobj, enum array);
11095bd8deadSopenharmony_ci        void DisableVertexArrayEXT(uint vaobj, enum array);
11105bd8deadSopenharmony_ci
11115bd8deadSopenharmony_ci    <OpenGL 3.0: New vertex attrib array enable commands for vertex
11125bd8deadSopenharmony_ci    array objects change "VertexAttribArray" to "VertexArrayAttrib"
11135bd8deadSopenharmony_ci    and add an initial "uint vaobj" parameter>
11145bd8deadSopenharmony_ci
11155bd8deadSopenharmony_ci        void EnableVertexArrayAttribEXT(uint vaobj, uint index);
11165bd8deadSopenharmony_ci        void DisableVertexArrayAttribEXT(uint vaobj, uint index);
11175bd8deadSopenharmony_ci
11185bd8deadSopenharmony_ci    <OpenGL 3.0: New queries for vertex array objects>
11195bd8deadSopenharmony_ci
11205bd8deadSopenharmony_ci        void GetVertexArrayIntegervEXT(uint vaobj, enum pname,
11215bd8deadSopenharmony_ci                                       int *param);
11225bd8deadSopenharmony_ci        void GetVertexArrayPointervEXT(uint vaobj, enum pname,
11235bd8deadSopenharmony_ci                                       void **param);
11245bd8deadSopenharmony_ci        void GetVertexArrayIntegeri_vEXT(uint vaobj,
11255bd8deadSopenharmony_ci                                         uint index,
11265bd8deadSopenharmony_ci                                         enum pname,
11275bd8deadSopenharmony_ci                                         int *param);
11285bd8deadSopenharmony_ci        void GetVertexArrayPointeri_vEXT(uint vaobj,
11295bd8deadSopenharmony_ci                                         uint index,
11305bd8deadSopenharmony_ci                                         enum pname,
11315bd8deadSopenharmony_ci                                         void **param);
11325bd8deadSopenharmony_ci
11335bd8deadSopenharmony_ci    <OpenGL 3.0: New buffer commands replace "Buffer" with "NamedBuffer"
11345bd8deadSopenharmony_ci    in name and replace "enum target" parameter with "uint buffer">
11355bd8deadSopenharmony_ci
11365bd8deadSopenharmony_ci        void *MapNamedBufferRangeEXT(uint buffer, intptr offset,
11375bd8deadSopenharmony_ci                                     sizeiptr length, bitfield access);
11385bd8deadSopenharmony_ci        void FlushMappedNamedBufferRangeEXT(uint buffer, intptr offset,
11395bd8deadSopenharmony_ci                                            sizeiptr length);
11405bd8deadSopenharmony_ci
11415bd8deadSopenharmony_ciNew Tokens
11425bd8deadSopenharmony_ci
11435bd8deadSopenharmony_ci    Accepted by the <pname> parameter of GetBooleanIndexedvEXT,
11445bd8deadSopenharmony_ci    GetIntegerIndexedvEXT, GetFloatIndexedvEXT, GetDoubleIndexedvEXT:
11455bd8deadSopenharmony_ci    GetBooleani_v, GetIntegeri_v, GetFloati_vEXT, GetDoublei_vEXT:
11465bd8deadSopenharmony_ci
11475bd8deadSopenharmony_ci        PROGRAM_MATRIX_EXT                              0x8E2D
11485bd8deadSopenharmony_ci        TRANSPOSE_PROGRAM_MATRIX_EXT                    0x8E2E
11495bd8deadSopenharmony_ci        PROGRAM_MATRIX_STACK_DEPTH_EXT                  0x8E2F
11505bd8deadSopenharmony_ci
11515bd8deadSopenharmony_ciAdditions to Chapter 2 of the OpenGL 3.0 Specification (OpenGL Operation)
11525bd8deadSopenharmony_ci
11535bd8deadSopenharmony_ci    Insert the following after the 2nd sentence in the 4th paragraph in
11545bd8deadSopenharmony_ci    Section 2.5 (Errors):
11555bd8deadSopenharmony_ci
11565bd8deadSopenharmony_ci    "Certain commands and queries provide direct state
11575bd8deadSopenharmony_ci    access to named objects (such as TextureParameteriEXT,
11585bd8deadSopenharmony_ci    NamedProgramLocalParameter4dEXT, NamedRenderbufferStorageEXT,
11595bd8deadSopenharmony_ci    NamedFramebufferTexture2DEXT, GetTextureImageEXT, etc.) and perform
11605bd8deadSopenharmony_ci    implicit object initialization when provided unused object names.
11615bd8deadSopenharmony_ci    When these commands and queries are given an object name not
11625bd8deadSopenharmony_ci    currently used, these commands and queries will first (prior to
11635bd8deadSopenharmony_ci    any further error checking) make the name used and appropriately
11645bd8deadSopenharmony_ci    initialize the named object to a new object state vector.  After this
11655bd8deadSopenharmony_ci    object initialization for unused names takes place, the command may
11665bd8deadSopenharmony_ci    subsequently generate an error.  In this case, the command's state
11675bd8deadSopenharmony_ci    update or query's result is ignored, but the name still becomes used
11685bd8deadSopenharmony_ci    and the object initialization still takes place."
11695bd8deadSopenharmony_ci
11705bd8deadSopenharmony_ci    Add after the paragraph describing EnableClientState in Section 2.8
11715bd8deadSopenharmony_ci    (Vertex Arrays):
11725bd8deadSopenharmony_ci
11735bd8deadSopenharmony_ci    "The following commands:
11745bd8deadSopenharmony_ci
11755bd8deadSopenharmony_ci        void EnableClientStateIndexedEXT(enum array, uint index);
11765bd8deadSopenharmony_ci        void DisableClientStateIndexedEXT(enum array, uint index);
11775bd8deadSopenharmony_ci        void EnableClientStateiEXT(enum array, uint index);
11785bd8deadSopenharmony_ci        void DisableClientStateiEXT(enum array, uint index);
11795bd8deadSopenharmony_ci
11805bd8deadSopenharmony_ci    are equivalent (assuming no errors) to the following:
11815bd8deadSopenharmony_ci
11825bd8deadSopenharmony_ci        if (array == TEXTURE_COORD_ARRAY) {
11835bd8deadSopenharmony_ci          int savedClientActiveTexture;
11845bd8deadSopenharmony_ci
11855bd8deadSopenharmony_ci          GetIntegerv(CLIENT_ACTIVE_TEXTURE, &savedClientActiveTexture);
11865bd8deadSopenharmony_ci          ClientActiveTexture(TEXTURE0+index);
11875bd8deadSopenharmony_ci          XXX(array);
11885bd8deadSopenharmony_ci          ClientActiveTexture(savedActiveTexture);
11895bd8deadSopenharmony_ci        } else {
11905bd8deadSopenharmony_ci          // Invalid enum
11915bd8deadSopenharmony_ci        }
11925bd8deadSopenharmony_ci
11935bd8deadSopenharmony_ci    where index is the index parameter to the listed commands and XXX is
11945bd8deadSopenharmony_ci    the name of the command without its "Indexed" or "i" suffix (either
11955bd8deadSopenharmony_ci    EnableClientState or DisableClientState).  The error INVALID_VALUE
11965bd8deadSopenharmony_ci    is generated if index is greater or equal to the implementation's
11975bd8deadSopenharmony_ci    NUM_TEXTURE_COORDS value.  The error INVALID_ENUM is generated if
11985bd8deadSopenharmony_ci    array is not TEXTURE_COORD_ARRAY."
11995bd8deadSopenharmony_ci
12005bd8deadSopenharmony_ci    Add before the last paragraph in Section 2.8 (Vertex Arrays):
12015bd8deadSopenharmony_ci
12025bd8deadSopenharmony_ci    "The following command:
12035bd8deadSopenharmony_ci
12045bd8deadSopenharmony_ci        void MultiTexCoordPointerEXT(enum texunit, int size, enum type,
12055bd8deadSopenharmony_ci                                     sizei stride, const void *pointer);
12065bd8deadSopenharmony_ci
12075bd8deadSopenharmony_ci    is equivalent (assuming no errors) to the following:
12085bd8deadSopenharmony_ci
12095bd8deadSopenharmony_ci        int savedClientActiveTexture;
12105bd8deadSopenharmony_ci
12115bd8deadSopenharmony_ci        GetIntegerv(CLIENT_ACTIVE_TEXTURE, &savedClientActiveTexture);
12125bd8deadSopenharmony_ci        ClientActiveTexture(texunit);
12135bd8deadSopenharmony_ci        TexCoordPointer(...);
12145bd8deadSopenharmony_ci        ClientActiveTexture(savedActiveTexture);
12155bd8deadSopenharmony_ci
12165bd8deadSopenharmony_ci    where ... is the list of the arguments for the command excluding
12175bd8deadSopenharmony_ci    the index parameter."
12185bd8deadSopenharmony_ci
12195bd8deadSopenharmony_ci    Add to the end of section 2.9 (Buffer Objects), before section 2.9.1
12205bd8deadSopenharmony_ci    (Vertex Arrays in Buffer Objects):
12215bd8deadSopenharmony_ci
12225bd8deadSopenharmony_ci    "The following commands:
12235bd8deadSopenharmony_ci
12245bd8deadSopenharmony_ci        void NamedBufferDataEXT(uint buffer, sizeiptr size,
12255bd8deadSopenharmony_ci                                const void *data, enum usage);
12265bd8deadSopenharmony_ci        void NamedBufferSubDataEXT(uint buffer, intptr offset,
12275bd8deadSopenharmony_ci                                   sizeiptr size, const void *data);
12285bd8deadSopenharmony_ci        void* MapNamedBufferEXT(uint buffer, enum access);
12295bd8deadSopenharmony_ci        boolean UnmapNamedBufferEXT(uint buffer);
12305bd8deadSopenharmony_ci        void *MapNamedBufferRangeEXT(uint buffer, intptr offset,
12315bd8deadSopenharmony_ci                                     sizeiptr length, bitfield access);
12325bd8deadSopenharmony_ci        void FlushMappedNamedBufferRangeEXT(uint buffer, intptr offset,
12335bd8deadSopenharmony_ci                                            sizeiptr length);
12345bd8deadSopenharmony_ci        void NamedCopyBufferSubDataEXT(uint readBuffer, uint writeBuffer, 
12355bd8deadSopenharmony_ci                                       intptr readOffset, intptr writeOffset,
12365bd8deadSopenharmony_ci                                       sizeiptr size);
12375bd8deadSopenharmony_ci
12385bd8deadSopenharmony_ci    operate identically to the corresponding command where "Named" is
12395bd8deadSopenharmony_ci    deleted from the name (and extension suffixes are dropped or updated
12405bd8deadSopenharmony_ci    appropriately) except, rather than updating the currently bound buffer
12415bd8deadSopenharmony_ci    for the buffer target parameter (a parameter not present for these
12425bd8deadSopenharmony_ci    listed commands), these "Named" commands update the buffer object
12435bd8deadSopenharmony_ci    named by the initial buffer parameter.  The remaining parameters
12445bd8deadSopenharmony_ci    following the initial buffer parameter for the listed "Named" commands
12455bd8deadSopenharmony_ci    match the parameters for the corresponding non-"Named" buffer command
12465bd8deadSopenharmony_ci    (except the target parameter is not needed because the buffer object
12475bd8deadSopenharmony_ci    to update is identified by its name) and are interpreted as they
12485bd8deadSopenharmony_ci    are for the non-"Named" buffer command.  If the buffer object named
12495bd8deadSopenharmony_ci    by the buffer parameter has not been previously bound or has been
12505bd8deadSopenharmony_ci    deleted since the last binding, the GL first creates a new state
12515bd8deadSopenharmony_ci    vector, initialized with a zero-sized memory buffer and comprising the
12525bd8deadSopenharmony_ci    state values listed in table 2.6.  There is no buffer corresponding
12535bd8deadSopenharmony_ci    to the name zero, these commands generate the INVALID_OPERATION
12545bd8deadSopenharmony_ci    error if the buffer parameter is zero."
12555bd8deadSopenharmony_ci
12565bd8deadSopenharmony_ci    Add to the end of Section 2.10 (Vertex Array Objects):
12575bd8deadSopenharmony_ci
12585bd8deadSopenharmony_ci    "The following commands:
12595bd8deadSopenharmony_ci
12605bd8deadSopenharmony_ci        void VertexArrayVertexOffsetEXT(uint vaobj, uint buffer,
12615bd8deadSopenharmony_ci                                        int size, enum type, sizei stride,
12625bd8deadSopenharmony_ci                                        intptr offset);
12635bd8deadSopenharmony_ci        void VertexArrayColorOffsetEXT(uint vaobj, uint buffer,
12645bd8deadSopenharmony_ci                                       int size, enum type, sizei stride,
12655bd8deadSopenharmony_ci                                       intptr offset);
12665bd8deadSopenharmony_ci        void VertexArrayEdgeFlagOffsetEXT(uint vaobj, uint buffer,
12675bd8deadSopenharmony_ci                                          sizei stride, intptr offset);
12685bd8deadSopenharmony_ci        void VertexArrayIndexOffsetEXT(uint vaobj, uint buffer,
12695bd8deadSopenharmony_ci                                       enum type, sizei stride,
12705bd8deadSopenharmony_ci                                       intptr offset);
12715bd8deadSopenharmony_ci        void VertexArrayNormalOffsetEXT(uint vaobj, uint buffer,
12725bd8deadSopenharmony_ci                                        enum type, sizei stride,
12735bd8deadSopenharmony_ci                                        intptr offset);
12745bd8deadSopenharmony_ci        void VertexArrayTexCoordOffsetEXT(uint vaobj, uint buffer,
12755bd8deadSopenharmony_ci                                          int size, enum type, sizei stride,
12765bd8deadSopenharmony_ci                                          intptr offset);
12775bd8deadSopenharmony_ci        void VertexArrayMultiTexCoordOffsetEXT(uint vaobj, uint buffer,
12785bd8deadSopenharmony_ci                                               enum texunit,
12795bd8deadSopenharmony_ci                                               int size, enum type, sizei stride,
12805bd8deadSopenharmony_ci                                               intptr offset);
12815bd8deadSopenharmony_ci        void VertexArrayFogCoordOffsetEXT(uint vaobj, uint buffer,
12825bd8deadSopenharmony_ci                                          enum type, sizei stride,
12835bd8deadSopenharmony_ci                                          intptr offset);
12845bd8deadSopenharmony_ci        void VertexArraySecondaryColorOffsetEXT(uint vaobj, uint buffer,
12855bd8deadSopenharmony_ci                                                int size, enum type,
12865bd8deadSopenharmony_ci                                                sizei stride, intptr offset);
12875bd8deadSopenharmony_ci        void VertexArrayVertexAttribOffsetEXT(uint vaobj, uint buffer,
12885bd8deadSopenharmony_ci                                              uint index, int size,
12895bd8deadSopenharmony_ci                                              enum type, boolean normalized,
12905bd8deadSopenharmony_ci                                              sizei stride, intptr offset);
12915bd8deadSopenharmony_ci        void VertexArrayVertexAttribIOffsetEXT(uint vaobj, uint buffer,
12925bd8deadSopenharmony_ci                                               uint index, int size,
12935bd8deadSopenharmony_ci                                               enum type, sizei stride,
12945bd8deadSopenharmony_ci                                               intptr offset);
12955bd8deadSopenharmony_ci
12965bd8deadSopenharmony_ci    operate identically to the corresponding command where "VertexArray"
12975bd8deadSopenharmony_ci    is deleted from the name and "Offset" is changed to "Pointer" (and
12985bd8deadSopenharmony_ci    extension suffixes are dropped or updated appropriately) except,
12995bd8deadSopenharmony_ci    1) rather than updating the currently in use vertex array object,
13005bd8deadSopenharmony_ci    these "VertexArray" commands update the vertex array object named
13015bd8deadSopenharmony_ci    by the initial vaobj parameter, and 2) the corresponding command
13025bd8deadSopenharmony_ci    operates as if the ARRAY_BUFFER buffer binding is bound to the
13035bd8deadSopenharmony_ci    buffer named by the buffer parameter.  The remaining parameters
13045bd8deadSopenharmony_ci    following the initial vaobj parameter for the listed "VertexArray"
13055bd8deadSopenharmony_ci    commands match the parameters for the corresponding non-"VertexArray"
13065bd8deadSopenharmony_ci    vertex array specification command and are interpreted as they
13075bd8deadSopenharmony_ci    are for the non-"VertexArray" vertex array specification command.
13085bd8deadSopenharmony_ci    The one exception is that final intptr offset parameter of the
13095bd8deadSopenharmony_ci    "VertexArray" command is cast to the final pointer parameter of the
13105bd8deadSopenharmony_ci    non-"VertexArray" command (intptr is guaranteed to be large enough
13115bd8deadSopenharmony_ci    to store any pointer value).
13125bd8deadSopenharmony_ci
13135bd8deadSopenharmony_ci    If the vertex array object named by the vaobj parameter has not
13145bd8deadSopenharmony_ci    been previously bound but has been generated (without subsequent
13155bd8deadSopenharmony_ci    deletion) by GenVertexArrays, the GL first creates a new state
13165bd8deadSopenharmony_ci    vector in the same manner as when BindVertexArray creates a new
13175bd8deadSopenharmony_ci    vertex array object.  However these commands fail and an
13185bd8deadSopenharmony_ci    INVALID_OPERATION error is generated if vaobj is not a name returned
13195bd8deadSopenharmony_ci    from a previous call to GenVertexArrays, or if such a name has since
13205bd8deadSopenharmony_ci    been deleted with DeleteVertexArrays.
13215bd8deadSopenharmony_ci
13225bd8deadSopenharmony_ci    If the buffer object named by the buffer parameter is non-zero and
13235bd8deadSopenharmony_ci    has not been previously bound or has been deleted since the last
13245bd8deadSopenharmony_ci    binding, the GL first creates a new state vector, initialized with
13255bd8deadSopenharmony_ci    a zero-sized memory buffer and comprising the state values listed
13265bd8deadSopenharmony_ci    in table 2.6.  If the buffer object named by the buffer parameter
13275bd8deadSopenharmony_ci    is zero, these commands update the vertex array client-state.
13285bd8deadSopenharmony_ci
13295bd8deadSopenharmony_ci    If the buffer object named by the buffer parameter is non-zero and
13305bd8deadSopenharmony_ci    the offset parameter is negative, generate the INVALID_VALUE error.
13315bd8deadSopenharmony_ci    No error is generated in the case where buffer is zero because the
13325bd8deadSopenharmony_ci    offset might be valid pointer than just happens to be negative when
13335bd8deadSopenharmony_ci    cast to a intptr type.
13345bd8deadSopenharmony_ci
13355bd8deadSopenharmony_ci    The following commands:
13365bd8deadSopenharmony_ci
13375bd8deadSopenharmony_ci        void EnableVertexArrayEXT(uint vaobj, enum array);
13385bd8deadSopenharmony_ci        void DisableVertexArrayEXT(uint vaobj, enum array);
13395bd8deadSopenharmony_ci        void EnableVertexArrayAttribEXT(uint vaobj, uint index);
13405bd8deadSopenharmony_ci        void DisableVertexArrayAttribEXT(uint vaobj, uint index);
13415bd8deadSopenharmony_ci
13425bd8deadSopenharmony_ci    operate identically to EnableClientState, DisableClientState,
13435bd8deadSopenharmony_ci    EnableVertexAttribArray, and DisableVertexAttribArray respectively
13445bd8deadSopenharmony_ci    except rather than updating the current vertex array client-state
13455bd8deadSopenharmony_ci    these "VertexArray" commands update the vertex array enables
13465bd8deadSopenharmony_ci    within the vertex array object named by the initial vaobj parameter.
13475bd8deadSopenharmony_ci    The array parameter matches the array parameter for the corresponding
13485bd8deadSopenharmony_ci    EnableClientState and DisableClientState commands.  The index
13495bd8deadSopenharmony_ci    parameter matches the index parameter for the corresponding
13505bd8deadSopenharmony_ci    EnableVertexAttribArray and DisableVertexAttribArray commands.
13515bd8deadSopenharmony_ci
13525bd8deadSopenharmony_ci    Additionally EnableVertexArrayEXT and DisableVertexArrayEXT accept
13535bd8deadSopenharmony_ci    the tokens TEXTURE0 through TEXTUREn where n is less than the
13545bd8deadSopenharmony_ci    implementation-dependent limit of MAX_TEXTURE_COORDS.  For these
13555bd8deadSopenharmony_ci    GL_TEXTUREi tokens, EnableVertexArrayEXT and DisableVertexArrayEXT
13565bd8deadSopenharmony_ci    act identically to EnableVertexArrayEXT(vaobj, TEXTURE_COORD_ARRAY)
13575bd8deadSopenharmony_ci    or DisableVertexArrayEXT(vaobj, TEXTURE_COORD_ARRAY) respectively
13585bd8deadSopenharmony_ci    as if the active client texture is set to texture coordinate set i
13595bd8deadSopenharmony_ci    based on the token TEXTUREi indicated by array.
13605bd8deadSopenharmony_ci
13615bd8deadSopenharmony_ci    If the vertex array object named by the vaobj parameter has not
13625bd8deadSopenharmony_ci    been previously bound but has been generated (without subsequent
13635bd8deadSopenharmony_ci    deletion) by GenVertexArrays, the GL first creates a new state
13645bd8deadSopenharmony_ci    vector in the same manner as when BindVertexArray creates a new
13655bd8deadSopenharmony_ci    vertex array object.  However these commands fail and an
13665bd8deadSopenharmony_ci    INVALID_OPERATION error is generated if vaobj is not a name returned
13675bd8deadSopenharmony_ci    from a previous call to GenVertexArrays, or if such a name has since
13685bd8deadSopenharmony_ci    been deleted with DeleteVertexArrays."
13695bd8deadSopenharmony_ci
13705bd8deadSopenharmony_ci    Add to the end of Section 2.12.2 (Matrices):
13715bd8deadSopenharmony_ci
13725bd8deadSopenharmony_ci    "The following commands:
13735bd8deadSopenharmony_ci
13745bd8deadSopenharmony_ci        void MatrixLoadfEXT(enum matrixMode, const float *m);
13755bd8deadSopenharmony_ci        void MatrixLoaddEXT(enum matrixMode, const double *m);
13765bd8deadSopenharmony_ci
13775bd8deadSopenharmony_ci        void MatrixLoadTransposefEXT(enum matrixMode, const float *m);
13785bd8deadSopenharmony_ci        void MatrixLoadTransposedEXT(enum matrixMode, const double *m);
13795bd8deadSopenharmony_ci
13805bd8deadSopenharmony_ci        void MatrixMultfEXT(enum matrixMode, const float *m);
13815bd8deadSopenharmony_ci        void MatrixMultdEXT(enum matrixMode, const double *m);
13825bd8deadSopenharmony_ci
13835bd8deadSopenharmony_ci        void MatrixMultTransposefEXT(enum matrixMode, const float *m);
13845bd8deadSopenharmony_ci        void MatrixMultTransposedEXT(enum matrixMode, const double *m);
13855bd8deadSopenharmony_ci
13865bd8deadSopenharmony_ci        void MatrixLoadIdentityEXT(enum matrixMode);
13875bd8deadSopenharmony_ci
13885bd8deadSopenharmony_ci        void MatrixRotatefEXT(enum matrixMode, float angle,
13895bd8deadSopenharmony_ci                              float x, float y, float z);
13905bd8deadSopenharmony_ci        void MatrixRotatedEXT(enum matrixMode, double angle,
13915bd8deadSopenharmony_ci                              double x, double y, double z);
13925bd8deadSopenharmony_ci
13935bd8deadSopenharmony_ci        void MatrixScalefEXT(enum matrixMode,
13945bd8deadSopenharmony_ci                             float x, float y, float z);
13955bd8deadSopenharmony_ci        void MatrixScaledEXT(enum matrixMode,
13965bd8deadSopenharmony_ci                             double x, double y, double z);
13975bd8deadSopenharmony_ci
13985bd8deadSopenharmony_ci        void MatrixTranslatefEXT(enum matrixMode,
13995bd8deadSopenharmony_ci                                 float x, float y, float z);
14005bd8deadSopenharmony_ci        void MatrixTranslatedEXT(enum matrixMode,
14015bd8deadSopenharmony_ci                                 double x, double y, double z);
14025bd8deadSopenharmony_ci
14035bd8deadSopenharmony_ci        void MatrixOrthoEXT(enum matrixMode, double l, double r,
14045bd8deadSopenharmony_ci                            double b, double t, double n, double f);
14055bd8deadSopenharmony_ci        void MatrixFrustumEXT(enum matrixMode, double l, double r,
14065bd8deadSopenharmony_ci                              double b, double t, double n, double f);
14075bd8deadSopenharmony_ci
14085bd8deadSopenharmony_ci        void MatrixPushEXT(enum matrixMode);
14095bd8deadSopenharmony_ci        void MatrixPopEXT(enum matrixMode);
14105bd8deadSopenharmony_ci
14115bd8deadSopenharmony_ci    are equivalent (assuming no errors) to the following:
14125bd8deadSopenharmony_ci
14135bd8deadSopenharmony_ci        int savedMatrixMode;
14145bd8deadSopenharmony_ci
14155bd8deadSopenharmony_ci        GetIntegerv(MATRIX_MODE, &savedMatrixMode);
14165bd8deadSopenharmony_ci        if (matrixMode >= TEXTURE0 && matrixMode <= TEXTURE31) {
14175bd8deadSopenharmony_ci           int savedActiveTexture;
14185bd8deadSopenharmony_ci
14195bd8deadSopenharmony_ci           MatrixMode(TEXTURE);
14205bd8deadSopenharmony_ci           GetIntegerv(ACTIVE_TEXTURE, &savedActiveTexture);
14215bd8deadSopenharmony_ci           ActiveTexture(matrixMode);
14225bd8deadSopenharmony_ci           XXX(...);
14235bd8deadSopenharmony_ci           ActiveTexture(savedActiveTexture);
14245bd8deadSopenharmony_ci        } else {
14255bd8deadSopenharmony_ci           MatrixMode(matrixMode);
14265bd8deadSopenharmony_ci           XXX(...);
14275bd8deadSopenharmony_ci        }
14285bd8deadSopenharmony_ci        MatrixMode(savedMatrixMode);
14295bd8deadSopenharmony_ci
14305bd8deadSopenharmony_ci    where matrixMode is the matrixMode parameter to the listed commands,
14315bd8deadSopenharmony_ci    XXX is found in Table 2.selectorFreeMatrixCommands, and ... is the
14325bd8deadSopenharmony_ci    list of the remaining arguments for the command that follow the
14335bd8deadSopenharmony_ci    initial matrixMode parameter.
14345bd8deadSopenharmony_ci
14355bd8deadSopenharmony_ci    Table 2.selectorFreeMatrixCommands:
14365bd8deadSopenharmony_ci
14375bd8deadSopenharmony_ci        Selector-free Command Name  XXX
14385bd8deadSopenharmony_ci        --------------------------  --------------------
14395bd8deadSopenharmony_ci        MatrixLoadfEXT              LoadMatrixf
14405bd8deadSopenharmony_ci        MatrixLoaddEXT              LoadMatrixd
14415bd8deadSopenharmony_ci
14425bd8deadSopenharmony_ci        MatrixLoadTransposefEXT     LoadTransposeMatrixf
14435bd8deadSopenharmony_ci        MatrixLoadTransposedEXT     LoadTransposeMatrixd
14445bd8deadSopenharmony_ci
14455bd8deadSopenharmony_ci        MatrixMultfEXT              MultMatrixf
14465bd8deadSopenharmony_ci        MatrixMultdEXT              MultMatrixd
14475bd8deadSopenharmony_ci
14485bd8deadSopenharmony_ci        MatrixMultTransposefEXT     MultTransposeMatrixf
14495bd8deadSopenharmony_ci        MatrixMultTransposedEXT     MultTransposeMatrixd
14505bd8deadSopenharmony_ci
14515bd8deadSopenharmony_ci        MatrixLoadIdentityEXT       LoadIdentity
14525bd8deadSopenharmony_ci
14535bd8deadSopenharmony_ci        MatrixRotatefEXT            Rotatef
14545bd8deadSopenharmony_ci        MatrixRotatedEXT            Rotated
14555bd8deadSopenharmony_ci
14565bd8deadSopenharmony_ci        MatrixScalefEXT             Scalef
14575bd8deadSopenharmony_ci        MatrixScaledEXT             Scaled
14585bd8deadSopenharmony_ci
14595bd8deadSopenharmony_ci        MatrixTranslatefEXT         Translatef
14605bd8deadSopenharmony_ci        MatrixTranslatedEXT         Translated
14615bd8deadSopenharmony_ci
14625bd8deadSopenharmony_ci        MatrixOrthoEXT              Ortho
14635bd8deadSopenharmony_ci        MatrixFrustumEXT            Frustum
14645bd8deadSopenharmony_ci
14655bd8deadSopenharmony_ci        MatrixPushEXT               PushMatrix
14665bd8deadSopenharmony_ci        MatrixPopEXT                PopMatrix"
14675bd8deadSopenharmony_ci
14685bd8deadSopenharmony_ci    Add to the end of Section 2.20.3 (Shader Variables):
14695bd8deadSopenharmony_ci
14705bd8deadSopenharmony_ci    "Program-specific Uniform Updates
14715bd8deadSopenharmony_ci
14725bd8deadSopenharmony_ci    The following commands:
14735bd8deadSopenharmony_ci
14745bd8deadSopenharmony_ci        void ProgramUniform1fEXT(uint program, int location, float v0);
14755bd8deadSopenharmony_ci        void ProgramUniform2fEXT(uint program, int location,
14765bd8deadSopenharmony_ci                                 float v0, float v1);
14775bd8deadSopenharmony_ci        void ProgramUniform3fEXT(uint program, int location,
14785bd8deadSopenharmony_ci                                 float v0, float v1, float v2);
14795bd8deadSopenharmony_ci        void ProgramUniform4fEXT(uint program, int location,
14805bd8deadSopenharmony_ci                                 float v0, float v1, float v2, float v3);
14815bd8deadSopenharmony_ci
14825bd8deadSopenharmony_ci        void ProgramUniform1iEXT(uint program, int location, int v0);
14835bd8deadSopenharmony_ci        void ProgramUniform2iEXT(uint program, int location,
14845bd8deadSopenharmony_ci                                 int v0, int v1);
14855bd8deadSopenharmony_ci        void ProgramUniform3iEXT(uint program, int location,
14865bd8deadSopenharmony_ci                                 int v0, int v1, int v2);
14875bd8deadSopenharmony_ci        void ProgramUniform4iEXT(uint program, int location,
14885bd8deadSopenharmony_ci                                 int v0, int v1, int v2, int v3);
14895bd8deadSopenharmony_ci
14905bd8deadSopenharmony_ci        void ProgramUniform1fvEXT(uint program, int location,
14915bd8deadSopenharmony_ci                                  sizei count, const float *value);
14925bd8deadSopenharmony_ci        void ProgramUniform2fvEXT(uint program, int location,
14935bd8deadSopenharmony_ci                                  sizei count, const float *value);
14945bd8deadSopenharmony_ci        void ProgramUniform3fvEXT(uint program, int location,
14955bd8deadSopenharmony_ci                                  sizei count, const float *value);
14965bd8deadSopenharmony_ci        void ProgramUniform4fvEXT(uint program, int location,
14975bd8deadSopenharmony_ci                                  sizei count, const float *value);
14985bd8deadSopenharmony_ci
14995bd8deadSopenharmony_ci        void ProgramUniform1ivEXT(uint program, int location,
15005bd8deadSopenharmony_ci                                  sizei count, const int *value);
15015bd8deadSopenharmony_ci        void ProgramUniform2ivEXT(uint program, int location,
15025bd8deadSopenharmony_ci                                  sizei count, const int *value);
15035bd8deadSopenharmony_ci        void ProgramUniform3ivEXT(uint program, int location,
15045bd8deadSopenharmony_ci                                  sizei count, const int *value);
15055bd8deadSopenharmony_ci        void ProgramUniform4ivEXT(uint program, int location,
15065bd8deadSopenharmony_ci                                  sizei count, const int *value);
15075bd8deadSopenharmony_ci
15085bd8deadSopenharmony_ci        void ProgramUniformMatrix2fvEXT(uint program, int location,
15095bd8deadSopenharmony_ci                                        sizei count, boolean transpose,
15105bd8deadSopenharmony_ci                                        const float *value);
15115bd8deadSopenharmony_ci        void ProgramUniformMatrix3fvEXT(uint program, int location,
15125bd8deadSopenharmony_ci                                        sizei count, boolean transpose,
15135bd8deadSopenharmony_ci                                        const float *value);
15145bd8deadSopenharmony_ci        void ProgramUniformMatrix4fvEXT(uint program, int location,
15155bd8deadSopenharmony_ci                                        sizei count, boolean transpose,
15165bd8deadSopenharmony_ci                                        const float *value);
15175bd8deadSopenharmony_ci
15185bd8deadSopenharmony_ci        void ProgramUniformMatrix2x3fvEXT(uint program, int location,
15195bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
15205bd8deadSopenharmony_ci                                          const float *value);
15215bd8deadSopenharmony_ci        void ProgramUniformMatrix3x2fvEXT(uint program, int location,
15225bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
15235bd8deadSopenharmony_ci                                          const float *value);
15245bd8deadSopenharmony_ci        void ProgramUniformMatrix2x4fvEXT(uint program, int location,
15255bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
15265bd8deadSopenharmony_ci                                          const float *value);
15275bd8deadSopenharmony_ci        void ProgramUniformMatrix4x2fvEXT(uint program, int location,
15285bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
15295bd8deadSopenharmony_ci                                          const float *value);
15305bd8deadSopenharmony_ci        void ProgramUniformMatrix3x4fvEXT(uint program, int location,
15315bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
15325bd8deadSopenharmony_ci                                          const float *value);
15335bd8deadSopenharmony_ci        void ProgramUniformMatrix4x3fvEXT(uint program, int location,
15345bd8deadSopenharmony_ci                                          sizei count, boolean transpose,
15355bd8deadSopenharmony_ci                                          const float *value);
15365bd8deadSopenharmony_ci
15375bd8deadSopenharmony_ci        void ProgramUniform1uiEXT(uint program, int location, uint v0);
15385bd8deadSopenharmony_ci        void ProgramUniform2uiEXT(uint program, int location,
15395bd8deadSopenharmony_ci                                  uint v0, uint v1);
15405bd8deadSopenharmony_ci        void ProgramUniform3uiEXT(uint program, int location,
15415bd8deadSopenharmony_ci                                  uint v0, uint v1, uint v2);
15425bd8deadSopenharmony_ci        void ProgramUniform4uiEXT(uint program, int location,
15435bd8deadSopenharmony_ci                                  uint v0, uint v1, uint v2, uint v3);
15445bd8deadSopenharmony_ci
15455bd8deadSopenharmony_ci        void ProgramUniform1uivEXT(uint program, int location,
15465bd8deadSopenharmony_ci                                   sizei count, const uint *value);
15475bd8deadSopenharmony_ci        void ProgramUniform2uivEXT(uint program, int location,
15485bd8deadSopenharmony_ci                                   sizei count, const uint *value);
15495bd8deadSopenharmony_ci        void ProgramUniform3uivEXT(uint program, int location,
15505bd8deadSopenharmony_ci                                   sizei count, const uint *value);
15515bd8deadSopenharmony_ci        void ProgramUniform4uivEXT(uint program, int location,
15525bd8deadSopenharmony_ci                                   sizei count, const uint *value);
15535bd8deadSopenharmony_ci
15545bd8deadSopenharmony_ci    operate identically to the corresponding command where "Program" is
15555bd8deadSopenharmony_ci    deleted from the name (and extension suffixes are dropped or updated
15565bd8deadSopenharmony_ci    appropriately) except, rather than updating the currently in use
15575bd8deadSopenharmony_ci    program object, these "Program" commands update the program object
15585bd8deadSopenharmony_ci    named by the initial program parameter.  The remaining parameters
15595bd8deadSopenharmony_ci    following the initial program parameter for the listed "Program"
15605bd8deadSopenharmony_ci    commands match the parameters for the corresponding non-"Program"
15615bd8deadSopenharmony_ci    uniform command and are interpreted as they are for the non-"Program"
15625bd8deadSopenharmony_ci    uniform command.  If the program named by the program parameter
15635bd8deadSopenharmony_ci    is not created or has not been successfully linked, the error
15645bd8deadSopenharmony_ci    INVALID_OPERATION is generated."
15655bd8deadSopenharmony_ci
15665bd8deadSopenharmony_ciAdditions to Chapter 3 of the OpenGL 3.0 Specification (Rasterization)
15675bd8deadSopenharmony_ci
15685bd8deadSopenharmony_ci    Add to the end of section 3.8.12 (Texture Objects):
15695bd8deadSopenharmony_ci
15705bd8deadSopenharmony_ci    "Texture Object State Update
15715bd8deadSopenharmony_ci
15725bd8deadSopenharmony_ci    The command
15735bd8deadSopenharmony_ci
15745bd8deadSopenharmony_ci        void BindMultiTextureEXT(enum texunit, enum target, uint texture);
15755bd8deadSopenharmony_ci
15765bd8deadSopenharmony_ci    operates identically to BindTexture except, rather than binding the
15775bd8deadSopenharmony_ci    named texture object to the current active texture's target binding
15785bd8deadSopenharmony_ci    specified by the target parameter, BindMultiTextureEXT binds the
15795bd8deadSopenharmony_ci    named texture to the specified target binding of texunit.
15805bd8deadSopenharmony_ci
15815bd8deadSopenharmony_ci    These texture object state update commands:
15825bd8deadSopenharmony_ci
15835bd8deadSopenharmony_ci        void TextureParameteriEXT(uint texture, enum target,
15845bd8deadSopenharmony_ci                                  enum pname, int param);
15855bd8deadSopenharmony_ci        void TextureParameterivEXT(uint texture, enum target,
15865bd8deadSopenharmony_ci                                   enum pname, const int *param);
15875bd8deadSopenharmony_ci
15885bd8deadSopenharmony_ci        void TextureParameterfEXT(uint texture, enum target,
15895bd8deadSopenharmony_ci                                  enum pname, float param);
15905bd8deadSopenharmony_ci        void TextureParameterfvEXT(uint texture, enum target,
15915bd8deadSopenharmony_ci                                   enum pname, const float *param);
15925bd8deadSopenharmony_ci
15935bd8deadSopenharmony_ci        void TextureParameterIivEXT(uint texture, enum target,
15945bd8deadSopenharmony_ci                                    enum pname, const int *params);
15955bd8deadSopenharmony_ci        void TextureParameterIuivEXT(uint texture, enum target,
15965bd8deadSopenharmony_ci                                     enum pname, const uint *params);
15975bd8deadSopenharmony_ci
15985bd8deadSopenharmony_ci        void TextureImage1DEXT(uint texture, enum target,
15995bd8deadSopenharmony_ci                               int level, int internalformat,
16005bd8deadSopenharmony_ci                               sizei width, int border,
16015bd8deadSopenharmony_ci                               enum format, enum type, const void *pixels);
16025bd8deadSopenharmony_ci        void TextureImage2DEXT(uint texture, enum target,
16035bd8deadSopenharmony_ci                               int level, int internalformat,
16045bd8deadSopenharmony_ci                               sizei width, sizei height, int border,
16055bd8deadSopenharmony_ci                               enum format, enum type, const void *pixels);
16065bd8deadSopenharmony_ci
16075bd8deadSopenharmony_ci        void TextureSubImage1DEXT(uint texture, enum target,
16085bd8deadSopenharmony_ci                                  int level, int xoffset, sizei width,
16095bd8deadSopenharmony_ci                                  enum format, enum type,
16105bd8deadSopenharmony_ci                                  const void *pixels);
16115bd8deadSopenharmony_ci        void TextureSubImage2DEXT(uint texture, enum target,
16125bd8deadSopenharmony_ci                                  int level, int xoffset, int yoffset,
16135bd8deadSopenharmony_ci                                  sizei width, sizei height,
16145bd8deadSopenharmony_ci                                  enum format, enum type,
16155bd8deadSopenharmony_ci                                  const void *pixels);
16165bd8deadSopenharmony_ci
16175bd8deadSopenharmony_ci        void CopyTextureImage1DEXT(uint texture, enum target,
16185bd8deadSopenharmony_ci                                   int level, enum internalformat,
16195bd8deadSopenharmony_ci                                   int x, int y, sizei width, int border);
16205bd8deadSopenharmony_ci        void CopyTextureImage2DEXT(uint texture, enum target,
16215bd8deadSopenharmony_ci                                   int level, enum internalformat,
16225bd8deadSopenharmony_ci                                   int x, int y,
16235bd8deadSopenharmony_ci                                   sizei width, sizei height, int border);
16245bd8deadSopenharmony_ci
16255bd8deadSopenharmony_ci        void CopyTextureSubImage1DEXT(uint texture, enum target,
16265bd8deadSopenharmony_ci                                      int level, int xoffset,
16275bd8deadSopenharmony_ci                                      int x, int y, sizei width);
16285bd8deadSopenharmony_ci        void CopyTextureSubImage2DEXT(uint texture, enum target,
16295bd8deadSopenharmony_ci                                      int level, int xoffset, int yoffset,
16305bd8deadSopenharmony_ci                                      int x, int y,
16315bd8deadSopenharmony_ci                                      sizei width, sizei height);
16325bd8deadSopenharmony_ci
16335bd8deadSopenharmony_ci        void TextureImage3DEXT(uint texture, enum target,
16345bd8deadSopenharmony_ci                               int level, int internalformat,
16355bd8deadSopenharmony_ci                               sizei width, sizei height, sizei depth,
16365bd8deadSopenharmony_ci                               int border,
16375bd8deadSopenharmony_ci                               enum format, enum type, const void *pixels);
16385bd8deadSopenharmony_ci
16395bd8deadSopenharmony_ci        void TextureSubImage3DEXT(uint texture, enum target,
16405bd8deadSopenharmony_ci                                  int level,
16415bd8deadSopenharmony_ci                                  int xoffset, int yoffset, int zoffset,
16425bd8deadSopenharmony_ci                                  sizei width, sizei height, sizei depth,
16435bd8deadSopenharmony_ci                                  enum format, enum type,
16445bd8deadSopenharmony_ci                                  const void *pixels);
16455bd8deadSopenharmony_ci        void CopyTextureSubImage3DEXT(uint texture, enum target,
16465bd8deadSopenharmony_ci                                      int level,
16475bd8deadSopenharmony_ci                                      int xoffset, int yoffset, int zoffset,
16485bd8deadSopenharmony_ci                                      int x, int y,
16495bd8deadSopenharmony_ci                                      sizei width, sizei height);
16505bd8deadSopenharmony_ci
16515bd8deadSopenharmony_ci        void TextureBufferEXT(uint texture, enum target,
16525bd8deadSopenharmony_ci                              enum internalformat, uint buffer);
16535bd8deadSopenharmony_ci
16545bd8deadSopenharmony_ci        void CompressedTextureImage3DEXT(uint texture, enum target, int level,
16555bd8deadSopenharmony_ci                                         enum internalformat,
16565bd8deadSopenharmony_ci                                         sizei width, sizei height,
16575bd8deadSopenharmony_ci                                         sizei depth, int border,
16585bd8deadSopenharmony_ci                                         sizei imageSize, const void *data);
16595bd8deadSopenharmony_ci        void CompressedTextureImage2DEXT(uint texture, enum target, int level,
16605bd8deadSopenharmony_ci                                         enum internalformat,
16615bd8deadSopenharmony_ci                                         sizei width, sizei height,
16625bd8deadSopenharmony_ci                                         int border, sizei imageSize,
16635bd8deadSopenharmony_ci                                         const void *data);
16645bd8deadSopenharmony_ci        void CompressedTextureImage1DEXT(uint texture, enum target, int level,
16655bd8deadSopenharmony_ci                                         enum internalformat,
16665bd8deadSopenharmony_ci                                         sizei width, int border,
16675bd8deadSopenharmony_ci                                         sizei imageSize, const void *data);
16685bd8deadSopenharmony_ci        void CompressedTextureSubImage3DEXT(uint texture, enum target, int level,
16695bd8deadSopenharmony_ci                                            int xoffset, int yoffset,
16705bd8deadSopenharmony_ci                                            int zoffset,
16715bd8deadSopenharmony_ci                                            sizei width, sizei height,
16725bd8deadSopenharmony_ci                                            sizei depth, enum format,
16735bd8deadSopenharmony_ci                                            sizei imageSize, const void *data);
16745bd8deadSopenharmony_ci        void CompressedTextureSubImage2DEXT(uint texture, enum target, int level,
16755bd8deadSopenharmony_ci                                            int xoffset, int yoffset,
16765bd8deadSopenharmony_ci                                            sizei width, sizei height,
16775bd8deadSopenharmony_ci                                            enum format,
16785bd8deadSopenharmony_ci                                            sizei imageSize, const void *data);
16795bd8deadSopenharmony_ci        void CompressedTextureSubImage1DEXT(uint texture, enum target, int level,
16805bd8deadSopenharmony_ci                                            int xoffset, sizei width,
16815bd8deadSopenharmony_ci                                            enum format,
16825bd8deadSopenharmony_ci                                            sizei imageSize, const void *data);
16835bd8deadSopenharmony_ci        void CompressedTextureImage3DEXT(uint texture, enum target, int level,
16845bd8deadSopenharmony_ci                                         enum internalformat,
16855bd8deadSopenharmony_ci                                         sizei width, sizei height,
16865bd8deadSopenharmony_ci                                         sizei depth, int border,
16875bd8deadSopenharmony_ci                                         sizei imageSize, const void *data);
16885bd8deadSopenharmony_ci
16895bd8deadSopenharmony_ci        void TextureBufferEXT(uint texture, enum target,
16905bd8deadSopenharmony_ci                              enum internalformat, uint buffer);
16915bd8deadSopenharmony_ci
16925bd8deadSopenharmony_ci        void TextureRenderbufferEXT(uint texture, enum target,
16935bd8deadSopenharmony_ci                                    uint renderbuffer);
16945bd8deadSopenharmony_ci
16955bd8deadSopenharmony_ci    operate identically to the corresponding command where "Texture"
16965bd8deadSopenharmony_ci    is substituted for "Tex" (and extension suffixes are dropped or
16975bd8deadSopenharmony_ci    updated appropriately) except, rather than updating the current bound
16985bd8deadSopenharmony_ci    texture for the texture unit indicated by the current active texture
16995bd8deadSopenharmony_ci    state and the target parameter, these "Texture" commands update the
17005bd8deadSopenharmony_ci    texture object named by the initial texture parameter.  If the
17015bd8deadSopenharmony_ci    texture parameter is zero, then the target parameter selects the
17025bd8deadSopenharmony_ci    default texture of the specified target to update.  The remaining
17035bd8deadSopenharmony_ci    parameters following the initial texture parameter for the listed
17045bd8deadSopenharmony_ci    "Texture" commands match the parameters for the corresponding "Tex"
17055bd8deadSopenharmony_ci    command and are interpreted as they are for the "Tex" command.
17065bd8deadSopenharmony_ci    If the texture parameter is for an unused name, the name becomes
17075bd8deadSopenharmony_ci    used and the named texture object is set to a new state vector,
17085bd8deadSopenharmony_ci    comprising all the state values listed in section 3.8.11, set
17095bd8deadSopenharmony_ci    to the same initial values prior to the command's state update.
17105bd8deadSopenharmony_ci    If the texture parameter is for a used name and that named texture
17115bd8deadSopenharmony_ci    object has a different target than the specified target parameter,
17125bd8deadSopenharmony_ci    the INVALID_OPERATION error is generated.  One consequence of this
17135bd8deadSopenharmony_ci    error for commands that accepts TEXTURE_PROXY_* as a valid target
17145bd8deadSopenharmony_ci    parameter is TEXTURE_PROXY_* target tokens generate errors if used
17155bd8deadSopenharmony_ci    with a non-zero texture parameter because the target of a non-default
17165bd8deadSopenharmony_ci    (non-zero) texture object is never a proxy target."
17175bd8deadSopenharmony_ci
17185bd8deadSopenharmony_ci    Add before the last paragraph of Section 3.8.16 (Texture Application):
17195bd8deadSopenharmony_ci
17205bd8deadSopenharmony_ci    "The following commands (introduced by EXT_draw_buffers2):
17215bd8deadSopenharmony_ci
17225bd8deadSopenharmony_ci        void EnableIndexedEXT(enum cap, uint index);
17235bd8deadSopenharmony_ci        void Enablei(enum cap, uint index);
17245bd8deadSopenharmony_ci        void DisableIndexedEXT(enum cap, uint index);
17255bd8deadSopenharmony_ci        void Disablei(enum cap, uint index);
17265bd8deadSopenharmony_ci
17275bd8deadSopenharmony_ci    are equivalent (assuming no errors) to the following:
17285bd8deadSopenharmony_ci
17295bd8deadSopenharmony_ci        int savedActiveTexture;
17305bd8deadSopenharmony_ci
17315bd8deadSopenharmony_ci        GetIntegerv(ACTIVE_TEXTURE, &savedActiveTexture);
17325bd8deadSopenharmony_ci        ActiveTexture(TEXTURE0+index);
17335bd8deadSopenharmony_ci        XXX(cap);
17345bd8deadSopenharmony_ci        ActiveTexture(savedActiveTexture);
17355bd8deadSopenharmony_ci
17365bd8deadSopenharmony_ci    where index is the index parameter to the listed commands and XXX
17375bd8deadSopenharmony_ci    is the name of the command without its "Indexed" or "i" suffix
17385bd8deadSopenharmony_ci    (either Enable or Disable) when the cap parameter is one of
17395bd8deadSopenharmony_ci    the texture-related enable token depending on the active texture
17405bd8deadSopenharmony_ci    state, namely TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
17415bd8deadSopenharmony_ci    TEXTURE_RECTANGLE_ARB, TEXTURE_GEN_S, TEXTURE_GEN_T, TEXTURE_GEN_R,
17425bd8deadSopenharmony_ci    or TEXTURE_GEN_Q."
17435bd8deadSopenharmony_ci
17445bd8deadSopenharmony_ci    Add NEW section 3.8.X (Multitexture Commands): after section 3.8.16
17455bd8deadSopenharmony_ci    (Texture Application):
17465bd8deadSopenharmony_ci
17475bd8deadSopenharmony_ci    "These multitexture commands:
17485bd8deadSopenharmony_ci
17495bd8deadSopenharmony_ci        void MultiTexCoordPointerEXT(enum texunit, int size, enum type,
17505bd8deadSopenharmony_ci                                     sizei stride, const void *pointer);
17515bd8deadSopenharmony_ci
17525bd8deadSopenharmony_ci        void MultiTexEnvfEXT(enum texunit, enum target, enum pname,
17535bd8deadSopenharmony_ci                             float param);
17545bd8deadSopenharmony_ci        void MultiTexEnvfvEXT(enum texunit, enum target, enum pname,
17555bd8deadSopenharmony_ci                              const float *params);
17565bd8deadSopenharmony_ci        void MultiTexEnviEXT(enum texunit, enum target, enum pname,
17575bd8deadSopenharmony_ci                             int param);
17585bd8deadSopenharmony_ci        void MultiTexEnvivEXT(enum texunit, enum target, enum pname,
17595bd8deadSopenharmony_ci                              const int *params);
17605bd8deadSopenharmony_ci
17615bd8deadSopenharmony_ci        void MultiTexGendEXT(enum texunit, enum coord, enum pname,
17625bd8deadSopenharmony_ci                             double param);
17635bd8deadSopenharmony_ci        void MultiTexGendvEXT(enum texunit, enum coord, enum pname,
17645bd8deadSopenharmony_ci                              const double *params);
17655bd8deadSopenharmony_ci        void MultiTexGenfEXT(enum texunit, enum coord, enum pname,
17665bd8deadSopenharmony_ci                             float param);
17675bd8deadSopenharmony_ci        void MultiTexGenfvEXT(enum texunit, enum coord, enum pname,
17685bd8deadSopenharmony_ci                              const float *params);
17695bd8deadSopenharmony_ci        void MultiTexGeniEXT(enum texunit, enum coord, enum pname,
17705bd8deadSopenharmony_ci                             int param);
17715bd8deadSopenharmony_ci        void MultiTexGenivEXT(enum texunit, enum coord, enum pname,
17725bd8deadSopenharmony_ci                              const int *params);
17735bd8deadSopenharmony_ci
17745bd8deadSopenharmony_ci        void MultiTexParameteriEXT(enum texunit, enum target,
17755bd8deadSopenharmony_ci                                   enum pname, int param);
17765bd8deadSopenharmony_ci        void MultiTexParameterivEXT(enum texunit, enum target,
17775bd8deadSopenharmony_ci                                    enum pname, const int *param);
17785bd8deadSopenharmony_ci
17795bd8deadSopenharmony_ci        void MultiTexParameterfEXT(enum texunit, enum target,
17805bd8deadSopenharmony_ci                                   enum pname, float param);
17815bd8deadSopenharmony_ci        void MultiTexParameterfvEXT(enum texunit, enum target,
17825bd8deadSopenharmony_ci                                    enum pname, const float *param);
17835bd8deadSopenharmony_ci
17845bd8deadSopenharmony_ci        void MultiTexParameterIivEXT(enum texunit, enum target,
17855bd8deadSopenharmony_ci                                     enum pname, const int *params);
17865bd8deadSopenharmony_ci        void MultiTexParameterIuivEXT(enum texunit, enum target,
17875bd8deadSopenharmony_ci                                      enum pname, const uint *params);
17885bd8deadSopenharmony_ci
17895bd8deadSopenharmony_ci        void MultiTexImage1DEXT(enum texunit, enum target,
17905bd8deadSopenharmony_ci                                int level, int internalformat,
17915bd8deadSopenharmony_ci                                sizei width, int border,
17925bd8deadSopenharmony_ci                                enum format, enum type, const void *pixels);
17935bd8deadSopenharmony_ci        void MultiTexImage2DEXT(enum texunit, enum target,
17945bd8deadSopenharmony_ci                                int level, int internalformat,
17955bd8deadSopenharmony_ci                                sizei width, sizei height, int border,
17965bd8deadSopenharmony_ci                                enum format, enum type, const void *pixels);
17975bd8deadSopenharmony_ci
17985bd8deadSopenharmony_ci        void MultiTexSubImage1DEXT(enum texunit, enum target,
17995bd8deadSopenharmony_ci                                   int level, int xoffset, sizei width,
18005bd8deadSopenharmony_ci                                   enum format, enum type,
18015bd8deadSopenharmony_ci                                   const void *pixels);
18025bd8deadSopenharmony_ci        void MultiTexSubImage2DEXT(enum texunit, enum target,
18035bd8deadSopenharmony_ci                                   int level, int xoffset, int yoffset,
18045bd8deadSopenharmony_ci                                   sizei width, sizei height,
18055bd8deadSopenharmony_ci                                   enum format, enum type,
18065bd8deadSopenharmony_ci                                   const void *pixels);
18075bd8deadSopenharmony_ci
18085bd8deadSopenharmony_ci        void CopyMultiTexImage1DEXT(enum texunit, enum target,
18095bd8deadSopenharmony_ci                                    int level, enum internalformat,
18105bd8deadSopenharmony_ci                                    int x, int y, sizei width, int border);
18115bd8deadSopenharmony_ci        void CopyMultiTexImage2DEXT(enum texunit, enum target,
18125bd8deadSopenharmony_ci                                    int level, enum internalformat,
18135bd8deadSopenharmony_ci                                    int x, int y,
18145bd8deadSopenharmony_ci                                    sizei width, sizei height, int border);
18155bd8deadSopenharmony_ci
18165bd8deadSopenharmony_ci        void CopyMultiTexSubImage1DEXT(enum texunit, enum target,
18175bd8deadSopenharmony_ci                                       int level, int xoffset,
18185bd8deadSopenharmony_ci                                       int x, int y, sizei width);
18195bd8deadSopenharmony_ci        void CopyMultiTexSubImage2DEXT(enum texunit, enum target,
18205bd8deadSopenharmony_ci                                       int level, int xoffset, int yoffset,
18215bd8deadSopenharmony_ci                                       int x, int y,
18225bd8deadSopenharmony_ci                                       sizei width, sizei height);
18235bd8deadSopenharmony_ci
18245bd8deadSopenharmony_ci        void MultiTexImage3DEXT(enum texunit, enum target,
18255bd8deadSopenharmony_ci                                int level, int internalformat,
18265bd8deadSopenharmony_ci                                sizei width, sizei height, sizei depth,
18275bd8deadSopenharmony_ci                                int border,
18285bd8deadSopenharmony_ci                                enum format, enum type, const void *pixels);
18295bd8deadSopenharmony_ci
18305bd8deadSopenharmony_ci        void MultiTexSubImage3DEXT(enum texunit, enum target,
18315bd8deadSopenharmony_ci                                   int level,
18325bd8deadSopenharmony_ci                                   int xoffset, int yoffset, int zoffset,
18335bd8deadSopenharmony_ci                                   sizei width, sizei height, sizei depth,
18345bd8deadSopenharmony_ci                                   enum format, enum type,
18355bd8deadSopenharmony_ci                                   const void *pixels);
18365bd8deadSopenharmony_ci        void CopyMultiTexSubImage3DEXT(enum texunit, enum target,
18375bd8deadSopenharmony_ci                                       int level,
18385bd8deadSopenharmony_ci                                       int xoffset, int yoffset, int zoffset,
18395bd8deadSopenharmony_ci                                       int x, int y,
18405bd8deadSopenharmony_ci                                       sizei width, sizei height);
18415bd8deadSopenharmony_ci
18425bd8deadSopenharmony_ci        void CompressedMultiTexImage3DEXT(enum texunit, enum target, int level,
18435bd8deadSopenharmony_ci                                          enum internalformat,
18445bd8deadSopenharmony_ci                                          sizei width, sizei height,
18455bd8deadSopenharmony_ci                                          sizei depth, int border,
18465bd8deadSopenharmony_ci                                          sizei imageSize, const void *data);
18475bd8deadSopenharmony_ci        void CompressedMultiTexImage2DEXT(enum texunit, enum target, int level,
18485bd8deadSopenharmony_ci                                          enum internalformat,
18495bd8deadSopenharmony_ci                                          sizei width, sizei height,
18505bd8deadSopenharmony_ci                                          int border, sizei imageSize,
18515bd8deadSopenharmony_ci                                          const void *data);
18525bd8deadSopenharmony_ci        void CompressedMultiTexImage1DEXT(enum texunit, enum target, int level,
18535bd8deadSopenharmony_ci                                          enum internalformat,
18545bd8deadSopenharmony_ci                                          sizei width, int border,
18555bd8deadSopenharmony_ci                                          sizei imageSize, const void *data);
18565bd8deadSopenharmony_ci        void CompressedMultiTexSubImage3DEXT(enum texunit, enum target, int level,
18575bd8deadSopenharmony_ci                                             int xoffset, int yoffset,
18585bd8deadSopenharmony_ci                                             int zoffset,
18595bd8deadSopenharmony_ci                                             sizei width, sizei height,
18605bd8deadSopenharmony_ci                                             sizei depth, enum format,
18615bd8deadSopenharmony_ci                                             sizei imageSize, const void *data);
18625bd8deadSopenharmony_ci        void CompressedMultiTexSubImage2DEXT(enum texunit, enum target, int level,
18635bd8deadSopenharmony_ci                                             int xoffset, int yoffset,
18645bd8deadSopenharmony_ci                                             sizei width, sizei height,
18655bd8deadSopenharmony_ci                                             enum format,
18665bd8deadSopenharmony_ci                                             sizei imageSize, const void *data);
18675bd8deadSopenharmony_ci        void CompressedMultiTexSubImage1DEXT(enum texunit, enum target, int level,
18685bd8deadSopenharmony_ci                                             int xoffset, sizei width,
18695bd8deadSopenharmony_ci                                             enum format,
18705bd8deadSopenharmony_ci                                             sizei imageSize, const void *data);
18715bd8deadSopenharmony_ci
18725bd8deadSopenharmony_ci        void MultiTexBufferEXT(enum texunit, enum target,
18735bd8deadSopenharmony_ci                               enum internalformat, uint buffer);
18745bd8deadSopenharmony_ci
18755bd8deadSopenharmony_ci        void MultiTexRenderbufferEXT(enum texunit, enum target,
18765bd8deadSopenharmony_ci                                     uint renderbuffer);
18775bd8deadSopenharmony_ci
18785bd8deadSopenharmony_ci    are equivalent (assuming no errors) to the following:
18795bd8deadSopenharmony_ci
18805bd8deadSopenharmony_ci        int savedActiveTexture;
18815bd8deadSopenharmony_ci
18825bd8deadSopenharmony_ci        GetIntegerv(ACTIVE_TEXTURE, &savedActiveTexture);
18835bd8deadSopenharmony_ci        ActiveTexture(texunit);
18845bd8deadSopenharmony_ci        XXX(...);
18855bd8deadSopenharmony_ci        ActiveTexture(savedActiveTexture);
18865bd8deadSopenharmony_ci
18875bd8deadSopenharmony_ci    where XXX is the name of the command without its "Multi" prefix
18885bd8deadSopenharmony_ci    (and extension suffixes are dropped or updated appropriately)
18895bd8deadSopenharmony_ci    and ... is the list of the arguments for the command excluding the
18905bd8deadSopenharmony_ci    index parameter."
18915bd8deadSopenharmony_ci
18925bd8deadSopenharmony_ciAdditions to Chapter 4 of the OpenGL 3.0 Specification (Per-Fragment
18935bd8deadSopenharmony_ciOperations and the Frame Buffer)
18945bd8deadSopenharmony_ci
18955bd8deadSopenharmony_ci    Add new section 4.4.7 (Named Access):
18965bd8deadSopenharmony_ci
18975bd8deadSopenharmony_ci    "The following commands:
18985bd8deadSopenharmony_ci
18995bd8deadSopenharmony_ci        void NamedRenderbufferStorageEXT(uint renderbuffer,
19005bd8deadSopenharmony_ci                                         enum internalformat,
19015bd8deadSopenharmony_ci                                         sizei width, sizei height);
19025bd8deadSopenharmony_ci
19035bd8deadSopenharmony_ci        void NamedRenderbufferStorageMultisampleEXT(uint renderbuffer,
19045bd8deadSopenharmony_ci                                                    sizei samples,
19055bd8deadSopenharmony_ci                                                    enum internalformat,
19065bd8deadSopenharmony_ci                                                    sizei width, sizei height);
19075bd8deadSopenharmony_ci
19085bd8deadSopenharmony_ci        void NamedRenderbufferStorageMultisampleCoverageEXT(uint renderbuffer,
19095bd8deadSopenharmony_ci                                                            sizei coverageSamples, 
19105bd8deadSopenharmony_ci                                                            sizei colorSamples,
19115bd8deadSopenharmony_ci                                                            enum internalformat,
19125bd8deadSopenharmony_ci                                                            sizei width,
19135bd8deadSopenharmony_ci                                                            sizei height);
19145bd8deadSopenharmony_ci
19155bd8deadSopenharmony_ci    operate identically to the corresponding command where "Named" is
19165bd8deadSopenharmony_ci    deleted from the name (and extension suffixes are dropped or updated
19175bd8deadSopenharmony_ci    appropriately) except, rather than updating the currently bound
19185bd8deadSopenharmony_ci    renderbuffer for the renderbuffer target parameter (a parameter not
19195bd8deadSopenharmony_ci    present for these listed commands), these "Named" commands update the
19205bd8deadSopenharmony_ci    renderbuffer object named by the initial renderbuffer parameter.
19215bd8deadSopenharmony_ci    The remaining parameters following the initial renderbuffer
19225bd8deadSopenharmony_ci    parameter for the listed "Named" commands match the parameters
19235bd8deadSopenharmony_ci    for the corresponding non-"Named" renderbuffer command and are
19245bd8deadSopenharmony_ci    interpreted as they are for the non-"Named" renderbuffer command;
19255bd8deadSopenharmony_ci    and the target parameter is assumed to be RENDERBUFFER.  If the
19265bd8deadSopenharmony_ci    renderbuffer object named by the renderbuffer parameter has not
19275bd8deadSopenharmony_ci    been previously bound or has been deleted since the last binding,
19285bd8deadSopenharmony_ci    the GL first creates a new state vector in the same manner as when
19295bd8deadSopenharmony_ci    BindRenderbuffer creates a new renderbuffer object.
19305bd8deadSopenharmony_ci
19315bd8deadSopenharmony_ci    The following commands (and query):
19325bd8deadSopenharmony_ci
19335bd8deadSopenharmony_ci        void NamedFramebufferTexture1DEXT(uint framebuffer,
19345bd8deadSopenharmony_ci                                          enum attachment,
19355bd8deadSopenharmony_ci                                          enum textarget, uint texture,
19365bd8deadSopenharmony_ci                                          int level);
19375bd8deadSopenharmony_ci        void NamedFramebufferTexture2DEXT(uint framebuffer,
19385bd8deadSopenharmony_ci                                          enum attachment,
19395bd8deadSopenharmony_ci                                          enum textarget, uint texture,
19405bd8deadSopenharmony_ci                                          int level);
19415bd8deadSopenharmony_ci        void NamedFramebufferTexture3DEXT(uint framebuffer,
19425bd8deadSopenharmony_ci                                          enum attachment,
19435bd8deadSopenharmony_ci                                          enum textarget, uint texture,
19445bd8deadSopenharmony_ci                                          int level, int zoffset);
19455bd8deadSopenharmony_ci
19465bd8deadSopenharmony_ci        void NamedFramebufferRenderbufferEXT(uint framebuffer,
19475bd8deadSopenharmony_ci                                             enum attachment,
19485bd8deadSopenharmony_ci                                             enum renderbuffertarget,
19495bd8deadSopenharmony_ci                                             uint renderbuffer);
19505bd8deadSopenharmony_ci
19515bd8deadSopenharmony_ci        void NamedFramebufferTextureEXT(uint framebuffer, enum attachment, 
19525bd8deadSopenharmony_ci                                        uint texture, int level);
19535bd8deadSopenharmony_ci        void NamedFramebufferTextureLayerEXT(uint framebuffer,
19545bd8deadSopenharmony_ci                                             enum attachment, 
19555bd8deadSopenharmony_ci                                             uint texture,
19565bd8deadSopenharmony_ci                                             int level, int layer);
19575bd8deadSopenharmony_ci        void NamedFramebufferTextureFaceEXT(uint framebuffer, enum attachment,
19585bd8deadSopenharmony_ci                                            uint texture,
19595bd8deadSopenharmony_ci                                            int level, enum face);
19605bd8deadSopenharmony_ci
19615bd8deadSopenharmony_ci        void GetNamedFramebufferAttachmentParameterivEXT(uint framebuffer,
19625bd8deadSopenharmony_ci                                                         enum attachment,
19635bd8deadSopenharmony_ci                                                         enum pname,
19645bd8deadSopenharmony_ci                                                         int *params);
19655bd8deadSopenharmony_ci
19665bd8deadSopenharmony_ci    operate identically to the corresponding command (or query) where
19675bd8deadSopenharmony_ci    "Named" is deleted from the name (and extension suffixes are dropped
19685bd8deadSopenharmony_ci    or updated appropriately) except, rather than updating the currently
19695bd8deadSopenharmony_ci    bound framebuffer for the framebuffer target parameter (a parameter
19705bd8deadSopenharmony_ci    not present for these listed commands and query), these "Named"
19715bd8deadSopenharmony_ci    commands update (or the query queries) the framebuffer object named by
19725bd8deadSopenharmony_ci    the initial framebuffer parameter.  The remaining parameters following
19735bd8deadSopenharmony_ci    the initial framebuffer parameter for the listed "Named" commands
19745bd8deadSopenharmony_ci    (or query) match the parameters for the corresponding non-"Named"
19755bd8deadSopenharmony_ci    framebuffer command (or query) and are interpreted as they are for the
19765bd8deadSopenharmony_ci    non-"Named" framebuffer command (or query); and the target parameter is
19775bd8deadSopenharmony_ci    assumed to be FRAMEBUFFER.  If the framebuffer object named by
19785bd8deadSopenharmony_ci    the framebuffer parameter has not been previously bound or has been
19795bd8deadSopenharmony_ci    deleted since the last binding, the GL first creates a new state
19805bd8deadSopenharmony_ci    vector in the same manner as when BindFramebuffer creates a new
19815bd8deadSopenharmony_ci    framebuffer object.
19825bd8deadSopenharmony_ci
19835bd8deadSopenharmony_ci    The commands
19845bd8deadSopenharmony_ci
19855bd8deadSopenharmony_ci        void FramebufferDrawBufferEXT(uint framebuffer, enum mode);
19865bd8deadSopenharmony_ci        void FramebufferDrawBuffersEXT(uint framebuffer, sizei n,
19875bd8deadSopenharmony_ci                                       const enum *bufs)
19885bd8deadSopenharmony_ci        void FramebufferReadBufferEXT(uint framebuffer, enum mode);
19895bd8deadSopenharmony_ci
19905bd8deadSopenharmony_ci
19915bd8deadSopenharmony_ci    operate identically to DrawBuffer, DrawBuffers, and ReadBuffer
19925bd8deadSopenharmony_ci    (without the initial framebuffer parameter) respectively except rather
19935bd8deadSopenharmony_ci    than updating the draw buffers or read buffer of the currently bound
19945bd8deadSopenharmony_ci    framebuffer object or the default window-system-provided framebuffer
19955bd8deadSopenharmony_ci    (i.e., FRAMEBUFFER_BINDING is zero), these commands update the
19965bd8deadSopenharmony_ci    draw buffers or read buffer of the framebuffer object named by the
19975bd8deadSopenharmony_ci    framebuffer parameter.  When the framebuffer parameter is zero,
19985bd8deadSopenharmony_ci    the default window-system provided framebuffer is updated (even if
19995bd8deadSopenharmony_ci    the window-system-provided framebuffer is not currently bound).
20005bd8deadSopenharmony_ci    If the framebuffer object named by the framebuffer parameter has not
20015bd8deadSopenharmony_ci    been previously bound or has been deleted since the last binding,
20025bd8deadSopenharmony_ci    the GL first creates a new state vector in the same manner as when
20035bd8deadSopenharmony_ci    BindFramebuffer creates a new framebuffer object.
20045bd8deadSopenharmony_ci
20055bd8deadSopenharmony_ci    The query
20065bd8deadSopenharmony_ci
20075bd8deadSopenharmony_ci        void GetFramebufferParameterivEXT(uint framebuffer, enum pname,
20085bd8deadSopenharmony_ci                                          int *param);
20095bd8deadSopenharmony_ci
20105bd8deadSopenharmony_ci    returns the framebuffer state of the framebuffer object specified
20115bd8deadSopenharmony_ci    by the framebuffer parameter.  The pname parameter must be one of
20125bd8deadSopenharmony_ci    framebuffer dependent values listed in either table 4.nnn (namely
20135bd8deadSopenharmony_ci    DRAW_BUFFER, READ_BUFFER, or DRAW_BUFFER0 through DRAW_BUFFER15).
20145bd8deadSopenharmony_ci    The query returns the same value in param that GetIntegerv would
20155bd8deadSopenharmony_ci    return if called with pname and param as if the framebuffer specified
20165bd8deadSopenharmony_ci    by the framebuffer parameter had been bound with BindFramebuffer.
20175bd8deadSopenharmony_ci    If the framebuffer object named by the framebuffer parameter has not
20185bd8deadSopenharmony_ci    been previously bound or has been deleted since the last binding,
20195bd8deadSopenharmony_ci    the GL first creates a new state vector in the same manner as when
20205bd8deadSopenharmony_ci    BindFramebuffer creates a new framebuffer object.
20215bd8deadSopenharmony_ci
20225bd8deadSopenharmony_ci    The command
20235bd8deadSopenharmony_ci
20245bd8deadSopenharmony_ci        enum CheckNamedFramebufferStatusEXT(uint framebuffer,
20255bd8deadSopenharmony_ci                                            enum target);
20265bd8deadSopenharmony_ci
20275bd8deadSopenharmony_ci    operates identically to CheckFramebufferStatus except rather
20285bd8deadSopenharmony_ci    than checking the currently bound framebuffer for the framebuffer
20295bd8deadSopenharmony_ci    target parameter, the status of the named framebuffer is checked
20305bd8deadSopenharmony_ci    where the target parameter indicates how the framebuffer would
20315bd8deadSopenharmony_ci    be bound.  Because FRAMEBUFFER_UNSUPPORTED can be returned by
20325bd8deadSopenharmony_ci    CheckFramebufferStatus due to an implementation-dependent set of
20335bd8deadSopenharmony_ci    restrictions that might not be known until the framebuffer object is
20345bd8deadSopenharmony_ci    bound with BindFramebuffer, CheckNamedFramebufferStatusARB may in
20355bd8deadSopenharmony_ci    rare circumstances (ideally never) return FRAMEBUFFER_COMPLETE
20365bd8deadSopenharmony_ci    when CheckFramebufferStatus with the same framebuffer object bound
20375bd8deadSopenharmony_ci    would return FRAMEBUFFER_UNSUPPORTED.  The framebuffer is checked
20385bd8deadSopenharmony_ci    for drawing if target is FRAMEBUFFER or DRAW_FRAMEBUFFER,
20395bd8deadSopenharmony_ci    and checked for reading if the target is READ_FRAMEBUFFER.
20405bd8deadSopenharmony_ci    If the framebuffer object named by the framebuffer parameter has not
20415bd8deadSopenharmony_ci    been previously bound or has been deleted since the last binding,
20425bd8deadSopenharmony_ci    the GL first creates a new state vector in the same manner as when
20435bd8deadSopenharmony_ci    BindFramebuffer creates a new framebuffer object.
20445bd8deadSopenharmony_ci
20455bd8deadSopenharmony_ci    The commands
20465bd8deadSopenharmony_ci
20475bd8deadSopenharmony_ci        void GenerateTextureMipmapEXT(uint texture, enum target);
20485bd8deadSopenharmony_ci
20495bd8deadSopenharmony_ci        void GenerateMultiTexMipmapEXT(enum texunit, enum target);
20505bd8deadSopenharmony_ci
20515bd8deadSopenharmony_ci    operate identically to GenerateMipmap except they use the
20525bd8deadSopenharmony_ci    texture specified by the named texture or specified texture unit
20535bd8deadSopenharmony_ci    respectively.  The target parameter must be a token accepted by
20545bd8deadSopenharmony_ci    GenerateMipmap.
20555bd8deadSopenharmony_ci
20565bd8deadSopenharmony_ci    If GenerateTextureMipmapARB's texture parameter is for an unused
20575bd8deadSopenharmony_ci    name, the name becomes used and the named texture object is set
20585bd8deadSopenharmony_ci    to a new state vector, comprising all the state values listed in
20595bd8deadSopenharmony_ci    section 3.8.11, set to the same initial values prior to the command's
20605bd8deadSopenharmony_ci    state update.  If the texture parameter is for a used name and that
20615bd8deadSopenharmony_ci    named texture object has a different target than the specified target
20625bd8deadSopenharmony_ci    parameter, the INVALID_OPERATION error is generated."
20635bd8deadSopenharmony_ci
20645bd8deadSopenharmony_ciAdditions to Chapter 5 of the OpenGL 3.0 Specification (Special Functions)
20655bd8deadSopenharmony_ci
20665bd8deadSopenharmony_ci    In Section 5.4 (Display Lists):
20675bd8deadSopenharmony_ci
20685bd8deadSopenharmony_ci    Add to list (page 310) of "Client state" commands "not compiled into
20695bd8deadSopenharmony_ci    the display list but are executed immediately":
20705bd8deadSopenharmony_ci
20715bd8deadSopenharmony_ci        PushClientAttribDefaultEXT, ClientAttribDefaultEXT
20725bd8deadSopenharmony_ci
20735bd8deadSopenharmony_ci    Add to list (page 310) of "Framebuffer and renderbuffer objects"
20745bd8deadSopenharmony_ci    commands "not compiled into the display list but are executed
20755bd8deadSopenharmony_ci    immediately":
20765bd8deadSopenharmony_ci
20775bd8deadSopenharmony_ci         CheckNamedFramebufferStatusEXT, NamedRenderbufferStorageEXT,
20785bd8deadSopenharmony_ci         NamedFramebufferTexture1DEXT, NamedFramebufferTexture2DEXT,
20795bd8deadSopenharmony_ci         NamedFramebufferTexture3DEXT, NamedFramebufferRenderbufferEXT,
20805bd8deadSopenharmony_ci         GenerateTextureMipmapEXT, GenerateMultiTexMipmapEXT
20815bd8deadSopenharmony_ci
20825bd8deadSopenharmony_ci    Add to the list (page 310) of "Vertex Buffer Objects" commands
20835bd8deadSopenharmony_ci    "not compiled into the display list but are executed immediately":
20845bd8deadSopenharmony_ci    
20855bd8deadSopenharmony_ci         NamedCopyBufferSubDataEXT
20865bd8deadSopenharmony_ci
20875bd8deadSopenharmony_ciAdditions to Chapter 6 of the OpenGL 3.0 Specification (State and
20885bd8deadSopenharmony_ciState Requests)
20895bd8deadSopenharmony_ci
20905bd8deadSopenharmony_ci    Change section 6.1.1 (Simple Queries) so the second and third
20915bd8deadSopenharmony_ci    paragraphs read:
20925bd8deadSopenharmony_ci
20935bd8deadSopenharmony_ci    "Indexed simple state variables are queried with the commands:
20945bd8deadSopenharmony_ci
20955bd8deadSopenharmony_ci        void GetBooleani_v(enum target, uint index, boolean *data);
20965bd8deadSopenharmony_ci        void GetIntegeri_v(enum target, uint index, int *data);
20975bd8deadSopenharmony_ci        void GetFloati_vEXT(enum target, uint index, float *data);
20985bd8deadSopenharmony_ci        void GetDoublei_vEXT(enum target, uint index, double *data);
20995bd8deadSopenharmony_ci
21005bd8deadSopenharmony_ci        void GetBooleanIndexedvEXT(enum target, uint index, boolean *data);
21015bd8deadSopenharmony_ci        void GetIntegerIndexedvEXT(enum target, uint index, int *data);
21025bd8deadSopenharmony_ci        void GetFloatIndexedvEXT(enum target, uint index, float *data);
21035bd8deadSopenharmony_ci        void GetDoubleIndexedvEXT(enum target, uint index, double *data);
21045bd8deadSopenharmony_ci
21055bd8deadSopenharmony_ci    target is the name of the indexed state and index is the index of
21065bd8deadSopenharmony_ci    the particular element being queried.  data is a pointer to a scalar
21075bd8deadSopenharmony_ci    or array of the indicated type in which to place the returned data.
21085bd8deadSopenharmony_ci    An INVALID_VALUE error is generated if index is outside the valide
21095bd8deadSopenharmony_ci    range for the indexed state target.
21105bd8deadSopenharmony_ci
21115bd8deadSopenharmony_ci    Table 6.indexedGenericQueryCommands:
21125bd8deadSopenharmony_ci
21135bd8deadSopenharmony_ci        Selector-free Command Name  GetXXX
21145bd8deadSopenharmony_ci        --------------------------  --------------------
21155bd8deadSopenharmony_ci        GetBooleanIndexedvEXT       GetBooleanv
21165bd8deadSopenharmony_ci        GetIntegerIndexedvEXT       GetIntegerv
21175bd8deadSopenharmony_ci        GetFloatIndexedvEXT         GetFloatv
21185bd8deadSopenharmony_ci        GetDoubleIndexedvEXT        GetDoublev
21195bd8deadSopenharmony_ci        GetBooleani_v               GetBooleanv
21205bd8deadSopenharmony_ci        GetIntegeri_v               GetIntegerv
21215bd8deadSopenharmony_ci        GetFloati_vEXT              GetFloatv
21225bd8deadSopenharmony_ci        GetDoublei_vEXT             GetDoublev
21235bd8deadSopenharmony_ci
21245bd8deadSopenharmony_ci    When the target to one of these indexed queries is one
21255bd8deadSopenharmony_ci    of PROGRAM_MATRIX_EXT, TRANSPOSE_PROGRAM_MATRIX_EXT, or
21265bd8deadSopenharmony_ci    PROGRAM_MATRIX_STACK_DEPTH_EXT, the query operates indentically to
21275bd8deadSopenharmony_ci    (assuming no errors):
21285bd8deadSopenharmony_ci
21295bd8deadSopenharmony_ci        int savedMatrixMode;
21305bd8deadSopenharmony_ci        GetIntegerv(MATRIX_MODE, &savedMatrixMode);
21315bd8deadSopenharmony_ci        MatrixMode(GL_MATRIX0_ARB+index);
21325bd8deadSopenharmony_ci        switch (target) {
21335bd8deadSopenharmony_ci        case PROGRAM_MATRIX_EXT:
21345bd8deadSopenharmony_ci            GetXXX(CURRENT_MATRIX_ARB, params);
21355bd8deadSopenharmony_ci            break;
21365bd8deadSopenharmony_ci        case TRANSPOSE_PROGRAM_MATRIX_EXT:
21375bd8deadSopenharmony_ci            GetXXX(TRANSPOSE_CURRENT_MATRIX_ARB, params);
21385bd8deadSopenharmony_ci            break;
21395bd8deadSopenharmony_ci        case PROGRAM_MATRIX_STACK_DEPTH_EXT:
21405bd8deadSopenharmony_ci            GetXXX(CURRENT_MATRIX_STACK_DEPTH_ARB, params);
21415bd8deadSopenharmony_ci            break;
21425bd8deadSopenharmony_ci        }
21435bd8deadSopenharmony_ci        MatrixMode(savedMatrixMode);
21445bd8deadSopenharmony_ci
21455bd8deadSopenharmony_ci    where GetXXX is found in Table 6.indexedGenericQueryCommands.
21465bd8deadSopenharmony_ci
21475bd8deadSopenharmony_ci    When the target to one of these indexed queries is one
21485bd8deadSopenharmony_ci    of CURRENT_MATRIX_NV, CURRENT_MATRIX_STACK_DEPTH_NV,
21495bd8deadSopenharmony_ci    CURRENT_RASTER_TEXTURE_COORDS, CURRENT_TEXTURE_COORDS,
21505bd8deadSopenharmony_ci    TEXTURE_BINDING_1D, TEXTURE_BINDING_1D_ARRAY,
21515bd8deadSopenharmony_ci    TEXTURE_BINDING_2D, TEXTURE_BINDING_2D_ARRAY,
21525bd8deadSopenharmony_ci    TEXTURE_BINDING_3D, TEXTURE_BINDING_BUFFER_EXT,
21535bd8deadSopenharmony_ci    TEXTURE_BINDING_CUBE_MAP, TEXTURE_BINDING_CUBE_MAP_ARRAY_NV,
21545bd8deadSopenharmony_ci    TEXTURE_BINDING_RECTANGLE_ARB, TEXTURE_BINDING_RENDERBUFFER_NV,
21555bd8deadSopenharmony_ci    TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV,
21565bd8deadSopenharmony_ci    TEXTURE_BUFFER_DATA_STORE_BINDING_EXT, TEXTURE_BUFFER_FORMAT_EXT,
21575bd8deadSopenharmony_ci    TEXTURE_GEN_Q, TEXTURE_GEN_R, TEXTURE_GEN_S, TEXTURE_GEN_T,
21585bd8deadSopenharmony_ci    TEXTURE_MATRIX, TEXTURE_STACK_DEPTH, TRANSPOSE_TEXTURE_MATRIX,
21595bd8deadSopenharmony_ci    GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP, or
21605bd8deadSopenharmony_ci    GL_TEXTURE_RECTANGLE_ARB, the query operates indentically (assuming
21615bd8deadSopenharmony_ci    no errors) to:
21625bd8deadSopenharmony_ci
21635bd8deadSopenharmony_ci        int savedActiveTexture;
21645bd8deadSopenharmony_ci        GetIntegerv(ACTIVE_TEXTURE, &savedActiveTexture);
21655bd8deadSopenharmony_ci        ActiveTexture(TEXTURE0+index);
21665bd8deadSopenharmony_ci        GetXXX(target, params);
21675bd8deadSopenharmony_ci        ActiveTexture(savedActiveTexture);
21685bd8deadSopenharmony_ci
21695bd8deadSopenharmony_ci    where GetXXX is found in Table 6.indexedGenericQueryCommands.
21705bd8deadSopenharmony_ci
21715bd8deadSopenharmony_ci    When the target to one of these indexed queries is one of
21725bd8deadSopenharmony_ci    TEXTURE_COORD_ARRAY, TEXTURE_COORD_ARRAY_BUFFER_BINDING,
21735bd8deadSopenharmony_ci    TEXTURE_COORD_ARRAY_COUNT, TEXTURE_COORD_ARRAY_SIZE,
21745bd8deadSopenharmony_ci    TEXTURE_COORD_ARRAY_STRIDE, or TEXTURE_COORD_ARRAY_TYPE, the query
21755bd8deadSopenharmony_ci    operates indentically (assuming no errors) to:
21765bd8deadSopenharmony_ci
21775bd8deadSopenharmony_ci        int savedClientActiveTexture;
21785bd8deadSopenharmony_ci        GetIntegerv(CLIENT_ACTIVE_TEXTURE, &savedClientActiveTexture);
21795bd8deadSopenharmony_ci        ClientActiveTexture(TEXTURE0+index);
21805bd8deadSopenharmony_ci        GetXXX(target, params);
21815bd8deadSopenharmony_ci        ClientActiveTexture(savedClientActiveTexture);
21825bd8deadSopenharmony_ci
21835bd8deadSopenharmony_ci    where GetXXX is found in Table 6.indexedGenericQueryCommands.
21845bd8deadSopenharmony_ci
21855bd8deadSopenharmony_ci    Finally,
21865bd8deadSopenharmony_ci
21875bd8deadSopenharmony_ci        boolean IsEnabled(enum value);
21885bd8deadSopenharmony_ci
21895bd8deadSopenharmony_ci    can be used to determine if value is currently enabled (as with
21905bd8deadSopenharmony_ci    Enable) or disabled and the queries
21915bd8deadSopenharmony_ci
21925bd8deadSopenharmony_ci        boolean IsEnabledi(enum target, uint index);
21935bd8deadSopenharmony_ci        boolean IsEnabledIndexedEXT(enum cap, uint index);
21945bd8deadSopenharmony_ci
21955bd8deadSopenharmony_ci    can be used to determine if the indexed state corresponding to target
21965bd8deadSopenharmony_ci    and index is enabled or disabled.  An INVALID_VALUE error is generated
21975bd8deadSopenharmony_ci    if index is outside the valid range for the indexed state target.
21985bd8deadSopenharmony_ci
21995bd8deadSopenharmony_ci    When the target to IsEnabledi or IsEnabledIndexedEXT is
22005bd8deadSopenharmony_ci    one of TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP,
22015bd8deadSopenharmony_ci    TEXTURE_RECTANGLE_ARB, TEXTURE_GEN_S, TEXTURE_GEN_T, TEXTURE_GEN_R,
22025bd8deadSopenharmony_ci    or TEXTURE_GEN_Q, the query operates indentically (assuming no
22035bd8deadSopenharmony_ci    errors) to:
22045bd8deadSopenharmony_ci
22055bd8deadSopenharmony_ci        int savedActiveTexture;
22065bd8deadSopenharmony_ci        boolean rv;
22075bd8deadSopenharmony_ci        GetIntegerv(ACTIVE_TEXTURE, &savedActiveTexture);
22085bd8deadSopenharmony_ci        ActiveTexture(TEXTURE0+index);
22095bd8deadSopenharmony_ci        rv = IsEnabled(cap);
22105bd8deadSopenharmony_ci        ActiveTexture(savedActiveTexture);
22115bd8deadSopenharmony_ci        return rv;
22125bd8deadSopenharmony_ci
22135bd8deadSopenharmony_ci    When the target to IsEnabledi or IsEnabledIndexedEXT is
22145bd8deadSopenharmony_ci    TEXTURE_COORD_ARRAY, the query operates indentically (assuming no
22155bd8deadSopenharmony_ci    errors) to:
22165bd8deadSopenharmony_ci
22175bd8deadSopenharmony_ci        int savedClientActiveTexture;
22185bd8deadSopenharmony_ci        boolean rv;
22195bd8deadSopenharmony_ci        GetIntegerv(CLIENT_ACTIVE_TEXTURE, &savedClientActiveTexture);
22205bd8deadSopenharmony_ci        ClientActiveTexture(TEXTURE0+index);
22215bd8deadSopenharmony_ci        rv = IsEnabled(cap);
22225bd8deadSopenharmony_ci        ClientActiveTexture(savedClientActiveTexture);
22235bd8deadSopenharmony_ci        return rv;"
22245bd8deadSopenharmony_ci
22255bd8deadSopenharmony_ci    Add new paragraph to the end of section 6.1.3 (Enumerated Queries):
22265bd8deadSopenharmony_ci
22275bd8deadSopenharmony_ci    "These commands
22285bd8deadSopenharmony_ci
22295bd8deadSopenharmony_ci        void GetTextureImageEXT(uint texture, enum target,
22305bd8deadSopenharmony_ci                                int level,
22315bd8deadSopenharmony_ci                                enum format, enum type, void *pixels);
22325bd8deadSopenharmony_ci
22335bd8deadSopenharmony_ci        void GetTextureParameterfvEXT(uint texture, enum target,
22345bd8deadSopenharmony_ci                                      enum pname, float *params);
22355bd8deadSopenharmony_ci        void GetTextureParameterivEXT(uint texture, enum target,
22365bd8deadSopenharmony_ci                                      enum pname, int *params);
22375bd8deadSopenharmony_ci
22385bd8deadSopenharmony_ci        void GetTextureLevelParameterfvEXT(uint texture, enum target,
22395bd8deadSopenharmony_ci                                           int level,
22405bd8deadSopenharmony_ci                                           enum pname, float *params);
22415bd8deadSopenharmony_ci        void GetTextureLevelParameterivEXT(uint texture, enum target,
22425bd8deadSopenharmony_ci                                           int level,
22435bd8deadSopenharmony_ci                                           enum pname, int *params);
22445bd8deadSopenharmony_ci
22455bd8deadSopenharmony_ci        void GetTextureParameterIivEXT(uint texture, enum target,
22465bd8deadSopenharmony_ci                                       enum pname, int *params);
22475bd8deadSopenharmony_ci        void GetTextureParameterIuivEXT(uint texture, enum target,
22485bd8deadSopenharmony_ci                                        enum pname, uint *params);
22495bd8deadSopenharmony_ci
22505bd8deadSopenharmony_ci    operate identically to the corresponding texture query command where
22515bd8deadSopenharmony_ci    "Texture" is substituted for "Tex" (and extension suffixes are dropped
22525bd8deadSopenharmony_ci    or updated appropriately) except, rather than querying the current
22535bd8deadSopenharmony_ci    bound texture for the texture unit indicated by the current active
22545bd8deadSopenharmony_ci    texture state and the target parameter, these "Texture" commands
22555bd8deadSopenharmony_ci    query the texture object named by the initial texture parameter.
22565bd8deadSopenharmony_ci    The remaining parameters following the initial texture parameter
22575bd8deadSopenharmony_ci    for the listed "Texture" commands match the parameters for the
22585bd8deadSopenharmony_ci    corresponding "Tex" command and are interpreted as they are for the
22595bd8deadSopenharmony_ci    "Tex" command." If the texture parameter is for an unused name, the
22605bd8deadSopenharmony_ci    name becomes used and the named texture object is set to a new state
22615bd8deadSopenharmony_ci    vector, comprising all the state values listed in section 3.8.11,
22625bd8deadSopenharmony_ci    set to the same initial values prior to the command's state query.
22635bd8deadSopenharmony_ci    If the texture parameter is for a used name and that named texture
22645bd8deadSopenharmony_ci    object has a different target than the specified target parameter,
22655bd8deadSopenharmony_ci    the INVALID_OPERATION error is generated.  One consequence of this
22665bd8deadSopenharmony_ci    error for commands that accepts TEXTURE_PROXY_* as a valid target
22675bd8deadSopenharmony_ci    parameter (GetTextureLevelParameter*, but not GetTextureParameter*)
22685bd8deadSopenharmony_ci    is TEXTURE_PROXY_* target tokens generate errors if used with a
22695bd8deadSopenharmony_ci    non-zero texture parameter because the target of a non-default
22705bd8deadSopenharmony_ci    (non-zero) texture object is never a proxy target."
22715bd8deadSopenharmony_ci
22725bd8deadSopenharmony_ci    Add new paragraph after the GetPointerv description in section 6.1.11
22735bd8deadSopenharmony_ci    (Pointer and String Queries):
22745bd8deadSopenharmony_ci
22755bd8deadSopenharmony_ci    "The following query
22765bd8deadSopenharmony_ci
22775bd8deadSopenharmony_ci        void GetPointerIndexedvEXT(enum pname, uint index, void **params);
22785bd8deadSopenharmony_ci
22795bd8deadSopenharmony_ci    is equivalent (assuming no errors) to the following:
22805bd8deadSopenharmony_ci
22815bd8deadSopenharmony_ci        int savedClientActiveTexture;
22825bd8deadSopenharmony_ci
22835bd8deadSopenharmony_ci        GetIntegerv(CLIENT_ACTIVE_TEXTURE, &savedClientActiveTexture);
22845bd8deadSopenharmony_ci        ClientActiveTexture(TEXTURE0+index);
22855bd8deadSopenharmony_ci        GetPointerv(pname, params);
22865bd8deadSopenharmony_ci        ClientActiveTexture(savedClientActiveTexture);
22875bd8deadSopenharmony_ci
22885bd8deadSopenharmony_ci    where index is the index parameter to the listed queries and GetXXX
22895bd8deadSopenharmony_ci    is found in Table 6.indexedGenericQueryCommands.  when the pname
22905bd8deadSopenharmony_ci    parameter is TEXTURE_COORD_ARRAY_POINTER."
22915bd8deadSopenharmony_ci
22925bd8deadSopenharmony_ci    Add new paragraph to the end of section 6.1.13 (Buffer Object Queries):
22935bd8deadSopenharmony_ci
22945bd8deadSopenharmony_ci    "These commands
22955bd8deadSopenharmony_ci
22965bd8deadSopenharmony_ci        void GetNamedBufferParameterivEXT(uint buffer,
22975bd8deadSopenharmony_ci                                          enum pname, int *params);
22985bd8deadSopenharmony_ci        void GetNamedBufferPointervEXT(uint buffer,
22995bd8deadSopenharmony_ci                                       enum pname, void* *params);
23005bd8deadSopenharmony_ci        void GetNamedBufferSubDataEXT(uint buffer,
23015bd8deadSopenharmony_ci                                      intptr offset, sizeiptr size, void *data);
23025bd8deadSopenharmony_ci
23035bd8deadSopenharmony_ci    operate identically to the corresponding command where "Named" is
23045bd8deadSopenharmony_ci    deleted from the name (and extension suffixes are dropped or updated
23055bd8deadSopenharmony_ci    appropriately) except, rather than querying the currently bound buffer
23065bd8deadSopenharmony_ci    for the buffer target parameter (a parameter not present for these
23075bd8deadSopenharmony_ci    listed commands), these "Named" commands query the buffer object
23085bd8deadSopenharmony_ci    named by the initial buffer parameter.  The remaining parameters
23095bd8deadSopenharmony_ci    following the initial buffer parameter for the listed "Named" commands
23105bd8deadSopenharmony_ci    match the parameters for the corresponding non-"Named" buffer command
23115bd8deadSopenharmony_ci    (except the target parameter is not needed because the buffer object
23125bd8deadSopenharmony_ci    to query is identified by its name) and are interpreted as they
23135bd8deadSopenharmony_ci    are for the non-"Named" buffer command.  If the buffer object named
23145bd8deadSopenharmony_ci    by the buffer parameter has not been previously bound or has been
23155bd8deadSopenharmony_ci    deleted since the last binding, the GL first creates a new state
23165bd8deadSopenharmony_ci    vector, initialized with a zero-sized memory buffer and comprising the
23175bd8deadSopenharmony_ci    state values listed in table 2.6.  There is no buffer corresponding
23185bd8deadSopenharmony_ci    to the name zero, these commands generate the INVALID_OPERATION
23195bd8deadSopenharmony_ci    error if the buffer parameter is zero."
23205bd8deadSopenharmony_ci
23215bd8deadSopenharmony_ci    Add new paragraph to the end of section after 6.1.14 (Vertex Array
23225bd8deadSopenharmony_ci    Object Queries):
23235bd8deadSopenharmony_ci
23245bd8deadSopenharmony_ci    "The commands
23255bd8deadSopenharmony_ci
23265bd8deadSopenharmony_ci        void GetVertexArrayIntegervEXT(uint vaobj, enum pname,
23275bd8deadSopenharmony_ci                                       int *param);
23285bd8deadSopenharmony_ci        void GetVertexArrayPointervEXT(uint vaobj, enum pname,
23295bd8deadSopenharmony_ci                                       void **param);
23305bd8deadSopenharmony_ci        void GetVertexArrayIntegeri_vEXT(uint vaobj,
23315bd8deadSopenharmony_ci                                         uint index,
23325bd8deadSopenharmony_ci                                         enum pname,
23335bd8deadSopenharmony_ci                                         int *param);
23345bd8deadSopenharmony_ci        void GetVertexArrayPointeri_vEXT(uint vaobj,
23355bd8deadSopenharmony_ci                                         uint index,
23365bd8deadSopenharmony_ci                                         enum pname,
23375bd8deadSopenharmony_ci                                         void **param);
23385bd8deadSopenharmony_ci
23395bd8deadSopenharmony_ci    queries the parameters of the vertex array object named by vaobj.  For
23405bd8deadSopenharmony_ci    GetVertexArrayIntegervEXT, pname must be one of the "Get value" tokens
23415bd8deadSopenharmony_ci    in tables 6.6, 6.7, 6.8, and 6.9 that use GetIntegerv, IsEnabled, or
23425bd8deadSopenharmony_ci    GetPointerv for their "Get command" (so excluding the VERTEX_ATTRIB_*
23435bd8deadSopenharmony_ci    tokens).  For GetVertexArrayIntegeri_vEXT, pname must be one of the
23445bd8deadSopenharmony_ci    "Get value" tokens in tables 6.8 and 6.9 that use GetVertexAttribiv
23455bd8deadSopenharmony_ci    or GetVertexAttribPointerv (so allowing only the VERTEX_ATTRIB_*
23465bd8deadSopenharmony_ci    tokens) or a token of the form TEXTURE_COORD_ARRAY (the enable) or
23475bd8deadSopenharmony_ci    TEXTURE_COORD_ARRAY_*; index identifies the vertex attribute
23485bd8deadSopenharmony_ci    array to query or texture coordinate set index respectively.  For
23495bd8deadSopenharmony_ci    GetVertexArrayPointervEXT, pname must be a *_ARRAY_POINTER token from
23505bd8deadSopenharmony_ci    tables 6.6, 6.7, and 6.8 excluding VERTEX_ATTRIB_ARRAY_POINTER.  For
23515bd8deadSopenharmony_ci    GetVertexArrayPointeri_vEXT, pname must be VERTEX_ATTRIB_ARRAY_POINTER
23525bd8deadSopenharmony_ci    or TEXTURE_COORD_ARRAY_POINTER with the index parameter indicating
23535bd8deadSopenharmony_ci    the vertex attribute or texture coordindate set index.
23545bd8deadSopenharmony_ci
23555bd8deadSopenharmony_ci    If the state queried by GetVertexArrayIntegervEXT or
23565bd8deadSopenharmony_ci    GetVertexArrayVertexAttribIntegervEXT is maintained as a pointer,
23575bd8deadSopenharmony_ci    the least significant bits of the pointer that fit within an int are
23585bd8deadSopenharmony_ci    returned in case a pointer is larger than an int.  This behavior
23595bd8deadSopenharmony_ci    allows pointers treated as offsets (when less than 2^31) to be
23605bd8deadSopenharmony_ci    returned as integer values.
23615bd8deadSopenharmony_ci
23625bd8deadSopenharmony_ci    If the vertex array object named by the vaobj parameter has not
23635bd8deadSopenharmony_ci    been previously bound but has been generated (without subsequent
23645bd8deadSopenharmony_ci    deletion) by GenVertexArrays, the GL first creates a new state
23655bd8deadSopenharmony_ci    vector in the same manner as when BindVertexArray creates a new
23665bd8deadSopenharmony_ci    vertex array object (hence the initial state will be returned).
23675bd8deadSopenharmony_ci    However these queries fail and an INVALID_OPERATION error is
23685bd8deadSopenharmony_ci    generated if vaobj is not a name returned from a previous call
23695bd8deadSopenharmony_ci    to GenVertexArrays, or if such a name has since been deleted with
23705bd8deadSopenharmony_ci    DeleteVertexArrays."
23715bd8deadSopenharmony_ci
23725bd8deadSopenharmony_ci    Add NEW section after 6.1.15 (Shader and Program Queries):
23735bd8deadSopenharmony_ci
23745bd8deadSopenharmony_ci    "16.1.X  Multitexture Queries
23755bd8deadSopenharmony_ci
23765bd8deadSopenharmony_ci    These queries
23775bd8deadSopenharmony_ci
23785bd8deadSopenharmony_ci        void GetMultiTexEnvfvEXT(enum texunit, enum target,
23795bd8deadSopenharmony_ci                                 enum pname, float *params);
23805bd8deadSopenharmony_ci        void GetMultiTexEnvivEXT(enum texunit, enum target,
23815bd8deadSopenharmony_ci                                 enum pname, int *params);
23825bd8deadSopenharmony_ci
23835bd8deadSopenharmony_ci        void GetMultiTexGendvEXT(enum texunit, enum coord,
23845bd8deadSopenharmony_ci                                 enum pname, double *params);
23855bd8deadSopenharmony_ci        void GetMultiTexGenfvEXT(enum texunit, enum coord,
23865bd8deadSopenharmony_ci                                 enum pname, float *params);
23875bd8deadSopenharmony_ci        void GetMultiTexGenivEXT(enum texunit, enum coord,
23885bd8deadSopenharmony_ci                                 enum pname, int *params);
23895bd8deadSopenharmony_ci
23905bd8deadSopenharmony_ci        void GetMultiTexImageEXT(enum texunit, enum target,
23915bd8deadSopenharmony_ci                                 int level,
23925bd8deadSopenharmony_ci                                 enum format, enum type, void *pixels);
23935bd8deadSopenharmony_ci
23945bd8deadSopenharmony_ci        void GetMultiTexParameterfvEXT(enum texunit, enum target,
23955bd8deadSopenharmony_ci                                       enum pname, float *params);
23965bd8deadSopenharmony_ci        void GetMultiTexParameterivEXT(enum texunit, enum target,
23975bd8deadSopenharmony_ci                                       enum pname, int *params);
23985bd8deadSopenharmony_ci
23995bd8deadSopenharmony_ci        void GetMultiTexParameterIivEXT(enum texunit, enum target,
24005bd8deadSopenharmony_ci                                        enum pname, int *params);
24015bd8deadSopenharmony_ci        void GetMultiTexParameterIuivEXT(enum texunit, enum target,
24025bd8deadSopenharmony_ci                                         enum pname, uint *params);
24035bd8deadSopenharmony_ci
24045bd8deadSopenharmony_ci        void GetMultiTexLevelParameterfvEXT(enum texunit, enum target,
24055bd8deadSopenharmony_ci                                            int level,
24065bd8deadSopenharmony_ci                                            enum pname, float *params);
24075bd8deadSopenharmony_ci        void GetMultiTexLevelParameterivEXT(enum texunit, enum target,
24085bd8deadSopenharmony_ci                                            int level,
24095bd8deadSopenharmony_ci                                            enum pname, int *params);
24105bd8deadSopenharmony_ci
24115bd8deadSopenharmony_ci        void GetCompressedMultiTexImageEXT(enum texunit, enum target,
24125bd8deadSopenharmony_ci                                           int level, void *img);
24135bd8deadSopenharmony_ci
24145bd8deadSopenharmony_ci    are equivalent (assuming no errors) to the following:
24155bd8deadSopenharmony_ci
24165bd8deadSopenharmony_ci        int savedActiveTexture, savedClientActiveTexture;
24175bd8deadSopenharmony_ci
24185bd8deadSopenharmony_ci        GetIntegerv(ACTIVE_TEXTURE, &savedActiveTexture);
24195bd8deadSopenharmony_ci        ActiveTexture(texunit);
24205bd8deadSopenharmony_ci        GetXXX(...);
24215bd8deadSopenharmony_ci        ActiveTexture(savedActiveTexture);
24225bd8deadSopenharmony_ci
24235bd8deadSopenharmony_ci    where GetXXX is found in Table 6.MultiTexQueryCommands and
24245bd8deadSopenharmony_ci    ... is the list of the arguments for the command excluding the
24255bd8deadSopenharmony_ci    index parameter.
24265bd8deadSopenharmony_ci
24275bd8deadSopenharmony_ci    Table 6.MultiTexQueryCommands:
24285bd8deadSopenharmony_ci
24295bd8deadSopenharmony_ci        Selector-free Command Name       GetXXX
24305bd8deadSopenharmony_ci        ------------------------------   --------------------
24315bd8deadSopenharmony_ci        GetMultiTexEnvfvEXT              GetTexEnvfv
24325bd8deadSopenharmony_ci        GetMultiTexEnvivEXT              GetTexEnviv
24335bd8deadSopenharmony_ci        GetMultiTexGendvEXT              GetTexGendv
24345bd8deadSopenharmony_ci        GetMultiTexGenfvEXT              GetTexGenfv
24355bd8deadSopenharmony_ci        GetMultiTexGenivEXT              GetTexGeniv
24365bd8deadSopenharmony_ci        GetMultiTexImageEXT              GetTexImage
24375bd8deadSopenharmony_ci        GetMultiTexParameterfvEXT        GetTexParameterfv
24385bd8deadSopenharmony_ci        GetMultiTexParameterivEXT        GetTexParameteriv
24395bd8deadSopenharmony_ci        GetMultiTexParameterIivEXT       GetTexParameterIiv
24405bd8deadSopenharmony_ci        GetMultiTexParameterIuivEXT      GetTexParameterIuiv
24415bd8deadSopenharmony_ci        GetMultiTexLevelParameterivEXT   GetTexLevelParameteriv
24425bd8deadSopenharmony_ci        GetMultiTexLevelParameterfvEXT   GetTexLevelParameterfv
24435bd8deadSopenharmony_ci        GetCompressedMultiTexImageEXT    GetCompressedTexImage
24445bd8deadSopenharmony_ci
24455bd8deadSopenharmony_ci    Add new paragraphs after the first paragraph of section 6.1.15
24465bd8deadSopenharmony_ci    (Saving and Restoring State):
24475bd8deadSopenharmony_ci
24485bd8deadSopenharmony_ci    "The command
24495bd8deadSopenharmony_ci
24505bd8deadSopenharmony_ci        void ClientAttribDefaultEXT(bitfield mask);
24515bd8deadSopenharmony_ci
24525bd8deadSopenharmony_ci     resets portions of the client state, depending on the bits set
24535bd8deadSopenharmony_ci     in the mask parameter, to the initial values of the state.
24545bd8deadSopenharmony_ci     When CLIENT_PIXEL_STORE_BIT is set in mask, the pixel store
24555bd8deadSopenharmony_ci     state is set to the initial values documented in table 6.23.
24565bd8deadSopenharmony_ci     When CLIENT_VERTEX_ARRAY_BIT is set in mask, the client vertex
24575bd8deadSopenharmony_ci     array state is set to the initial values documented in table 6.6,
24585bd8deadSopenharmony_ci     6.7, and 6.8.
24595bd8deadSopenharmony_ci
24605bd8deadSopenharmony_ci     The command
24615bd8deadSopenharmony_ci
24625bd8deadSopenharmony_ci        void PushClientAttribDefaultEXT(bitfield mask);
24635bd8deadSopenharmony_ci
24645bd8deadSopenharmony_ci     is equivalent to:
24655bd8deadSopenharmony_ci
24665bd8deadSopenharmony_ci        PushClientAttrib(mask);
24675bd8deadSopenharmony_ci        ClientAttribDefaultEXT(mask);"
24685bd8deadSopenharmony_ci
24695bd8deadSopenharmony_ciAdditions to Appendix A of the OpenGL 3.0 Specification (Invariance)
24705bd8deadSopenharmony_ci
24715bd8deadSopenharmony_ci    None.
24725bd8deadSopenharmony_ci
24735bd8deadSopenharmony_ciInteractions with the ARB_texture_rectangle specification
24745bd8deadSopenharmony_ci
24755bd8deadSopenharmony_ci    If ARB_texture_rectangle (or NV_texture_rectangle or
24765bd8deadSopenharmony_ci    EXT_texture_rectangle) is NOT supported, ignore references to
24775bd8deadSopenharmony_ci    TEXTURE_RECTANGLE_ARB and GL_TEXTURE_BINDING_RECTANGLE_ARB in amended
24785bd8deadSopenharmony_ci    section 3.8.16 and new section 6.1.X.
24795bd8deadSopenharmony_ci
24805bd8deadSopenharmony_ciInteractions with the ARB_vertex_program specification
24815bd8deadSopenharmony_ci
24825bd8deadSopenharmony_ci    If ARB_vertex_program is NOT supported, ignore the support
24835bd8deadSopenharmony_ci    for PROGRAM_MATRIX_EXT, TRANSPOSE_PROGRAM_MATRIX_EXT,
24845bd8deadSopenharmony_ci    and PROGRAM_MATRIX_STACK_DEPTH_EXT described for the
24855bd8deadSopenharmony_ci    GetBooleanIndexedvEXT, GetIntegerIndexedvEXT, GetFloatIndexedvEXT,
24865bd8deadSopenharmony_ci    and GetDoubleIndexedvEXT commands in section 6.1.X.
24875bd8deadSopenharmony_ci
24885bd8deadSopenharmony_ciAdditions to the ARB_vertex_program specification
24895bd8deadSopenharmony_ci
24905bd8deadSopenharmony_ci    Add to the end of section 2.14.1 (Program Objects):
24915bd8deadSopenharmony_ci
24925bd8deadSopenharmony_ci    "This command
24935bd8deadSopenharmony_ci
24945bd8deadSopenharmony_ci        void NamedProgramStringEXT(uint program, enum target, enum format,
24955bd8deadSopenharmony_ci                                   sizei len, const void *string); 
24965bd8deadSopenharmony_ci
24975bd8deadSopenharmony_ci    operates identically to ProgramStringARB except, rather than
24985bd8deadSopenharmony_ci    specifying the string for the currently bound program for the program
24995bd8deadSopenharmony_ci    target parameter, NamedProgramStringARB specifies the program string
25005bd8deadSopenharmony_ci    for the program object named by the initial program parameter.
25015bd8deadSopenharmony_ci
25025bd8deadSopenharmony_ci    If the program parameter is for an unused program, the name becomes
25035bd8deadSopenharmony_ci    used and the named program object is set to a new program state
25045bd8deadSopenharmony_ci    vector as if BindProgramARB had been called on the unused program
25055bd8deadSopenharmony_ci    name with the given target parameter but without changing the target's
25065bd8deadSopenharmony_ci    program binding.
25075bd8deadSopenharmony_ci
25085bd8deadSopenharmony_ci    If the program parameter is for a used name and that named program
25095bd8deadSopenharmony_ci    object has a different target than the specified target parameter,
25105bd8deadSopenharmony_ci    the INVALID_OPERATION error is generated.
25115bd8deadSopenharmony_ci
25125bd8deadSopenharmony_ci    These commands
25135bd8deadSopenharmony_ci
25145bd8deadSopenharmony_ci        void NamedProgramLocalParameter4dEXT(uint program, enum target,
25155bd8deadSopenharmony_ci                                             uint index,
25165bd8deadSopenharmony_ci                                             double x, double y,
25175bd8deadSopenharmony_ci                                             double z, double w);
25185bd8deadSopenharmony_ci        void NamedProgramLocalParameter4dvEXT(uint program, enum target,
25195bd8deadSopenharmony_ci                                              uint index,
25205bd8deadSopenharmony_ci                                              const double *params);
25215bd8deadSopenharmony_ci        void NamedProgramLocalParameter4fEXT(uint program, enum target,
25225bd8deadSopenharmony_ci                                             uint index,
25235bd8deadSopenharmony_ci                                             float x, float y,
25245bd8deadSopenharmony_ci                                             float z, float w);
25255bd8deadSopenharmony_ci        void NamedProgramLocalParameter4fvEXT(uint program, enum target,
25265bd8deadSopenharmony_ci                                              uint index,
25275bd8deadSopenharmony_ci                                              const float *params);
25285bd8deadSopenharmony_ci
25295bd8deadSopenharmony_ci    operate identically to the corresponding command where "Named"
25305bd8deadSopenharmony_ci    is deleted from the name (and extension suffixes are updated to
25315bd8deadSopenharmony_ci    ARB appropriately) except, rather than updating the currently bound
25325bd8deadSopenharmony_ci    program for the program target parameter (a parameter not present for
25335bd8deadSopenharmony_ci    these listed commands), these "Named" commands update the program
25345bd8deadSopenharmony_ci    object named by the initial program parameter.  If the program
25355bd8deadSopenharmony_ci    parameter is zero, then the target parameter selects the default
25365bd8deadSopenharmony_ci    program of the specified target to update.  The remaining parameters
25375bd8deadSopenharmony_ci    following the initial program parameter for the listed "Named"
25385bd8deadSopenharmony_ci    commands match the parameters for the corresponding non-"Named"
25395bd8deadSopenharmony_ci    command and are interpreted as they are for the non-"Named" command.
25405bd8deadSopenharmony_ci    If the program parameter is for an unused name, the name becomes
25415bd8deadSopenharmony_ci    used and the named program object is assigned target-specific
25425bd8deadSopenharmony_ci    default values (see section 2.14.7 for vertex programs or section
25435bd8deadSopenharmony_ci    3.11.8 for fragment programs), set to the same initial values prior to
25445bd8deadSopenharmony_ci    the command's state update.  If the program parameter is for a used
25455bd8deadSopenharmony_ci    name and that named program object has a different target than the
25465bd8deadSopenharmony_ci    specified target parameter, the INVALID_OPERATION error is generated."
25475bd8deadSopenharmony_ci
25485bd8deadSopenharmony_ci    Add to the end of section 6.1.12 (Program Queries):
25495bd8deadSopenharmony_ci
25505bd8deadSopenharmony_ci    "These queries
25515bd8deadSopenharmony_ci
25525bd8deadSopenharmony_ci        void GetNamedProgramLocalParameterdvEXT(uint program, enum target,
25535bd8deadSopenharmony_ci                                                uint index,
25545bd8deadSopenharmony_ci                                                double *params);
25555bd8deadSopenharmony_ci        void GetNamedProgramLocalParameterfvEXT(uint program, enum target,
25565bd8deadSopenharmony_ci                                                uint index,
25575bd8deadSopenharmony_ci                                                float *params);
25585bd8deadSopenharmony_ci        void GetNamedProgramivEXT(uint program, enum target,
25595bd8deadSopenharmony_ci                                  enum pname, int *params);
25605bd8deadSopenharmony_ci        void GetNamedProgramStringEXT(uint program, enum target,
25615bd8deadSopenharmony_ci                                      enum pname, void *string);
25625bd8deadSopenharmony_ci
25635bd8deadSopenharmony_ci    operate identically to the corresponding query where "Named" is
25645bd8deadSopenharmony_ci    deleted from the name (and extension suffixes are updated to ARB
25655bd8deadSopenharmony_ci    appropriately) except, rather than querying the currently bound
25665bd8deadSopenharmony_ci    program for the program target parameter (a parameter not present for
25675bd8deadSopenharmony_ci    these listed query), these "Named" queries query the program object
25685bd8deadSopenharmony_ci    named by the initial program parameter.  If the program parameter
25695bd8deadSopenharmony_ci    is zero, then the target parameter selects the default program of
25705bd8deadSopenharmony_ci    the specified target to query.  The remaining parameters following
25715bd8deadSopenharmony_ci    the initial program parameter for the listed "Named" queries match
25725bd8deadSopenharmony_ci    the parameters for the corresponding non-"Named" query and are
25735bd8deadSopenharmony_ci    interpreted as they are for the non-"Named" query.  If the program
25745bd8deadSopenharmony_ci    parameter is for an unused name, the name becomes used and the named
25755bd8deadSopenharmony_ci    program object is assigned target-specific default values (see section
25765bd8deadSopenharmony_ci    2.14.7 for vertex programs or section 3.11.8 for fragment programs),
25775bd8deadSopenharmony_ci    set to the same initial values prior to the query's state query.
25785bd8deadSopenharmony_ci    If the program parameter is for a used name and that named program
25795bd8deadSopenharmony_ci    object has a different target than the specified target parameter,
25805bd8deadSopenharmony_ci    the INVALID_OPERATION error is generated."
25815bd8deadSopenharmony_ci
25825bd8deadSopenharmony_ciAdditions to the EXT_gpu_program_parameters specification
25835bd8deadSopenharmony_ci
25845bd8deadSopenharmony_ci    Add to the end of section 2.14.1 (Program Objects):
25855bd8deadSopenharmony_ci
25865bd8deadSopenharmony_ci    "This command
25875bd8deadSopenharmony_ci
25885bd8deadSopenharmony_ci        void NamedProgramLocalParameters4fvEXT(uint program, enum target,
25895bd8deadSopenharmony_ci                                               uint index, sizei count,
25905bd8deadSopenharmony_ci                                               const float *params); 
25915bd8deadSopenharmony_ci
25925bd8deadSopenharmony_ci    operate identically to ProgramLocalParameters4fvEXT except, rather
25935bd8deadSopenharmony_ci    than updating the currently bound program for the program target
25945bd8deadSopenharmony_ci    parameter (a parameter not present for these listed commands), these
25955bd8deadSopenharmony_ci    "Named" commands update the program object named by the initial
25965bd8deadSopenharmony_ci    program parameter.  If the program parameter is zero, then the
25975bd8deadSopenharmony_ci    target parameter selects the default program of the specified target
25985bd8deadSopenharmony_ci    to update.  The remaining parameters following the initial program
25995bd8deadSopenharmony_ci    parameter for the listed "Named" commands match the parameters for
26005bd8deadSopenharmony_ci    the corresponding non-"Named" command and are interpreted as they
26015bd8deadSopenharmony_ci    are for the non-"Named" command.  If the program parameter is for
26025bd8deadSopenharmony_ci    an unused name, the name becomes used and the named program object
26035bd8deadSopenharmony_ci    is assigned target-specific default values (see section 2.14.7
26045bd8deadSopenharmony_ci    for vertex programs or section 3.11.8 for fragment programs), set
26055bd8deadSopenharmony_ci    to the same initial values prior to the command's state update.
26065bd8deadSopenharmony_ci    If the program parameter is for a used name and that named program
26075bd8deadSopenharmony_ci    object has a different target than the specified target parameter,
26085bd8deadSopenharmony_ci    the INVALID_OPERATION error is generated."
26095bd8deadSopenharmony_ci
26105bd8deadSopenharmony_ciAdditions to the NV_gpu_program4 specification
26115bd8deadSopenharmony_ci
26125bd8deadSopenharmony_ci    Add to the end of section 2.14.1 (Program Objects):
26135bd8deadSopenharmony_ci
26145bd8deadSopenharmony_ci    "These commands
26155bd8deadSopenharmony_ci
26165bd8deadSopenharmony_ci        void NamedProgramLocalParameterI4iEXT(uint program, enum target,
26175bd8deadSopenharmony_ci                                              uint index, 
26185bd8deadSopenharmony_ci                                              int x, int y,
26195bd8deadSopenharmony_ci                                              int z, int w);
26205bd8deadSopenharmony_ci        void NamedProgramLocalParameterI4ivEXT(uint program, enum target,
26215bd8deadSopenharmony_ci                                               uint index,
26225bd8deadSopenharmony_ci                                               const int *params);
26235bd8deadSopenharmony_ci        void NamedProgramLocalParametersI4ivEXT(uint program, enum target,
26245bd8deadSopenharmony_ci                                                uint index, sizei count,
26255bd8deadSopenharmony_ci                                                const int *params);
26265bd8deadSopenharmony_ci        void NamedProgramLocalParameterI4uiEXT(uint program, enum target,
26275bd8deadSopenharmony_ci                                               uint index, 
26285bd8deadSopenharmony_ci                                               uint x, uint y,
26295bd8deadSopenharmony_ci                                               uint z, uint w);
26305bd8deadSopenharmony_ci        void NamedProgramLocalParameterI4uivEXT(uint program, enum target,
26315bd8deadSopenharmony_ci                                                uint index, 
26325bd8deadSopenharmony_ci                                                const uint *params);
26335bd8deadSopenharmony_ci        void NamedProgramLocalParametersI4uivEXT(uint program, enum target,
26345bd8deadSopenharmony_ci                                                 uint index, sizei count,
26355bd8deadSopenharmony_ci                                                 const uint *params);
26365bd8deadSopenharmony_ci
26375bd8deadSopenharmony_ci    operate identically to the corresponding command where "Named"
26385bd8deadSopenharmony_ci    is deleted from the name (and extension suffixes are updated to
26395bd8deadSopenharmony_ci    NV appropriately) except, rather than updating the currently bound
26405bd8deadSopenharmony_ci    program for the program target parameter (a parameter not present for
26415bd8deadSopenharmony_ci    these listed commands), these "Named" commands update the program
26425bd8deadSopenharmony_ci    object named by the initial program parameter.  If the program
26435bd8deadSopenharmony_ci    parameter is zero, then the target parameter selects the default
26445bd8deadSopenharmony_ci    program of the specified target to update.  The remaining parameters
26455bd8deadSopenharmony_ci    following the initial program parameter for the listed "Named"
26465bd8deadSopenharmony_ci    commands match the parameters for the corresponding non-"Named"
26475bd8deadSopenharmony_ci    command and are interpreted as they are for the non-"Named" command.
26485bd8deadSopenharmony_ci    If the program parameter is for an unused name, the name becomes
26495bd8deadSopenharmony_ci    used and the named program object is assigned target-specific
26505bd8deadSopenharmony_ci    default values (see section 2.14.7 for vertex programs or section
26515bd8deadSopenharmony_ci    3.11.8 for fragment programs), set to the same initial values prior to
26525bd8deadSopenharmony_ci    the command's state update.  If the program parameter is for a used
26535bd8deadSopenharmony_ci    name and that named program object has a different target than the
26545bd8deadSopenharmony_ci    specified target parameter, the INVALID_OPERATION error is generated."
26555bd8deadSopenharmony_ci
26565bd8deadSopenharmony_ci    Add to the end of section 6.1.12 (Program Queries):
26575bd8deadSopenharmony_ci
26585bd8deadSopenharmony_ci    "These queries
26595bd8deadSopenharmony_ci
26605bd8deadSopenharmony_ci        void GetNamedProgramLocalParameterIivEXT(uint program, enum target, uint index,
26615bd8deadSopenharmony_ci                                                 int *params);
26625bd8deadSopenharmony_ci        void GetNamedProgramLocalParameterIuivEXT(uint program, enum target, uint index,
26635bd8deadSopenharmony_ci                                                  uint *params);
26645bd8deadSopenharmony_ci
26655bd8deadSopenharmony_ci    operate identically to the corresponding query where "Named" is
26665bd8deadSopenharmony_ci    deleted from the name (and extension suffixes are updated to NV
26675bd8deadSopenharmony_ci    appropriately) except, rather than querying the currently bound
26685bd8deadSopenharmony_ci    program for the program target parameter (a parameter not present for
26695bd8deadSopenharmony_ci    these listed query), these "Named" queries query the program object
26705bd8deadSopenharmony_ci    named by the initial program parameter.  If the program parameter
26715bd8deadSopenharmony_ci    is zero, then the target parameter selects the default program of
26725bd8deadSopenharmony_ci    the specified target to query.  The remaining parameters following
26735bd8deadSopenharmony_ci    the initial program parameter for the listed "Named" queries match
26745bd8deadSopenharmony_ci    the parameters for the corresponding non-"Named" query and are
26755bd8deadSopenharmony_ci    interpreted as they are for the non-"Named" query.  If the program
26765bd8deadSopenharmony_ci    parameter is for an unused name, the name becomes used and the named
26775bd8deadSopenharmony_ci    program object is assigned target-specific default values (see section
26785bd8deadSopenharmony_ci    2.14.7 for vertex programs or section 3.11.8 for fragment programs),
26795bd8deadSopenharmony_ci    set to the same initial values prior to the query's state query.
26805bd8deadSopenharmony_ci    If the program parameter is for a used name and that named program
26815bd8deadSopenharmony_ci    object has a different target than the specified target parameter,
26825bd8deadSopenharmony_ci    the INVALID_OPERATION error is generated."
26835bd8deadSopenharmony_ci
26845bd8deadSopenharmony_ciInteractions with OpenGL 3.0 or the EXT_texture_integer specification
26855bd8deadSopenharmony_ci
26865bd8deadSopenharmony_ci    If NEITHER OpenGL 3.0 nor EXT_texture_integer are supported, ignore
26875bd8deadSopenharmony_ci    the support for TextureParameterIivARB, TextureParameterIuivARB,
26885bd8deadSopenharmony_ci    GetTextureParameterIivARB, GetTextureParameterIuivARB,
26895bd8deadSopenharmony_ci    MultiTexParameterIivARB, MultiTexParameterIuivARB,
26905bd8deadSopenharmony_ci    GetMultiTexParameterIivARB, and GetMultiTexParameterIuivARB.
26915bd8deadSopenharmony_ci
26925bd8deadSopenharmony_ciInteractions with the EXT_texture_buffer_object specification
26935bd8deadSopenharmony_ci
26945bd8deadSopenharmony_ci    If EXT_texture_buffer_object is NOT supported, ignore the support
26955bd8deadSopenharmony_ci    for TextureBufferARB and MultiTexBufferARB.
26965bd8deadSopenharmony_ci
26975bd8deadSopenharmony_ciInteractions with OpenGL 3.0 or the APPLE_vertex_array_object
26985bd8deadSopenharmony_ci
26995bd8deadSopenharmony_ci    If NEITHER OpenGL 3.0 nor EXT_texture_integer are supported, ignore XXX
27005bd8deadSopenharmony_ci
27015bd8deadSopenharmony_ci    If either OpenGL 3.0 or APPLE_vertex_array_object is supported, then
27025bd8deadSopenharmony_ci    ClientAttribDefaultARB also sets the VERTEX_ARRAY_BINDING vertex-array
27035bd8deadSopenharmony_ci    state to zero if the mask parameter has CLIENT_VERTEX_ARRAY_BIT set.
27045bd8deadSopenharmony_ci
27055bd8deadSopenharmony_ci    This means PushClientAttribDefaultARB also sets the
27065bd8deadSopenharmony_ci    VERTEX_ARRAY_BINDING_APPLE vertex-array state to zero after pushing
27075bd8deadSopenharmony_ci    the client state.  if the mask parameter has CLIENT_VERTEX_ARRAY_BIT
27085bd8deadSopenharmony_ci    set.
27095bd8deadSopenharmony_ci
27105bd8deadSopenharmony_ciInteractions with EXT_geometry_shader4 or NV_gpu_program4
27115bd8deadSopenharmony_ci
27125bd8deadSopenharmony_ci    If both EXT_geometry_shader4 and NV_gpu_program4 are NOT
27135bd8deadSopenharmony_ci    supported, ignore the support for NamedFramebufferTextureARB,
27145bd8deadSopenharmony_ci    NamedFramebufferTextureLayerARB, and NamedFramebufferTextureFaceARB.
27155bd8deadSopenharmony_ci
27165bd8deadSopenharmony_ciInteractions with OpenGL 3.0 or EXT_framebuffer_blit
27175bd8deadSopenharmony_ci
27185bd8deadSopenharmony_ci    If NEITHER OpenGL 3.0 nor EXT_framebuffer_blit are supported,
27195bd8deadSopenharmony_ci    ignore the references to DRAW_FRAMEBUFFER and READ_FRAMEBUFFER in
27205bd8deadSopenharmony_ci    the discussion of CheckNamedFramebufferStatusARB and do not allow
27215bd8deadSopenharmony_ci    these tokens for the command's target parameter.
27225bd8deadSopenharmony_ci
27235bd8deadSopenharmony_ciInteractions with OpenGL 3.0 or EXT_framebuffer_multisample
27245bd8deadSopenharmony_ci
27255bd8deadSopenharmony_ci    If NEITHER OpenGL 3.0 or EXT_framebuffer_multisample are supported,
27265bd8deadSopenharmony_ci    ignore the support for NamedRenderbufferStorageMultisampleARB.
27275bd8deadSopenharmony_ci
27285bd8deadSopenharmony_ciInteractions with NV_framebuffer_multisample_coverage
27295bd8deadSopenharmony_ci
27305bd8deadSopenharmony_ci    If NV_framebuffer_multisample_coverage is NOT supported, ignore the
27315bd8deadSopenharmony_ci    support for NamedRenderbufferStorageMultisampleCoverageARB.
27325bd8deadSopenharmony_ci
27335bd8deadSopenharmony_ciInteractions with the NV_explicit_multisample specification
27345bd8deadSopenharmony_ci
27355bd8deadSopenharmony_ci    If NV_explicit_multisample is NOT supported, ignore the
27365bd8deadSopenharmony_ci    support for TextureRenderbufferARB, MultiTexRenderbufferARB,
27375bd8deadSopenharmony_ci    TEXTURE_BINDING_RENDERBUFFER_NV,
27385bd8deadSopenharmony_ci    and TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV.
27395bd8deadSopenharmony_ci
27405bd8deadSopenharmony_ciInteractions with the NV_texture_cube_map_array specification
27415bd8deadSopenharmony_ci
27425bd8deadSopenharmony_ci    If NV_texture_cube_map_array is NOT supported, ignore the support
27435bd8deadSopenharmony_ci    for TEXTURE_BINDING_CUBE_MAP_ARRAY_NV.
27445bd8deadSopenharmony_ci
27455bd8deadSopenharmony_ciInteractions with OpenGL 3.0
27465bd8deadSopenharmony_ci
27475bd8deadSopenharmony_ci    If OpenGL 3.0 is NOT supported, ignore the support for
27485bd8deadSopenharmony_ci    EnableClientStateiEXT, DisableClientStateiEXT, GetFloati_vEXT,
27495bd8deadSopenharmony_ci    GetDoublei_vEXT, GetPointeri_vEXT, VertexArrayVertexOffsetEXT,
27505bd8deadSopenharmony_ci    VertexArrayColorOffsetEXT, VertexArrayEdgeFlagOffsetEXT,
27515bd8deadSopenharmony_ci    VertexArrayIndexOffsetEXT, VertexArrayNormalOffsetEXT,
27525bd8deadSopenharmony_ci    VertexArrayTexCoordOffsetEXT, VertexArrayMultiTexCoordOffsetEXT,
27535bd8deadSopenharmony_ci    VertexArrayFogCoordOffsetEXT, VertexArraySecondaryColorOffsetEXT,
27545bd8deadSopenharmony_ci    VertexArrayVertexAttribOffsetEXT,
27555bd8deadSopenharmony_ci    VertexArrayVertexAttribIOffsetEXT, EnableVertexArrayEXT,
27565bd8deadSopenharmony_ci    DisableVertexArrayEXT, EnableVertexArrayAttribEXT,
27575bd8deadSopenharmony_ci    DisableVertexArrayAttribEXT, GetVertexArrayIntegervEXT,
27585bd8deadSopenharmony_ci    GetVertexArrayPointervEXT, GetVertexArrayVertexAttribParameterivEXT,
27595bd8deadSopenharmony_ci    GetVertexArrayVertexAttribPointervEXT, MapNamedBufferRangeEXT,
27605bd8deadSopenharmony_ci    and FlushMappedNamedBufferRangeEXT.
27615bd8deadSopenharmony_ci
27625bd8deadSopenharmony_ci    If OpenGL 3.0 is NOT supported, ignore references to Enablei,
27635bd8deadSopenharmony_ci    Disablei, IsEnabledi, GetBooleani_v, and GetIntegeri_v.
27645bd8deadSopenharmony_ci
27655bd8deadSopenharmony_ciAdditions to the AGL/GLX/WGL Specifications
27665bd8deadSopenharmony_ci
27675bd8deadSopenharmony_ci    None.
27685bd8deadSopenharmony_ci
27695bd8deadSopenharmony_ciGLX Protocol
27705bd8deadSopenharmony_ci
27715bd8deadSopenharmony_ci    XXX incomplete!  ZZZZ values need to be registered!
27725bd8deadSopenharmony_ci    XXX ARB_vertex_program support is specified.
27735bd8deadSopenharmony_ci
27745bd8deadSopenharmony_ci    The following rendering commands are sent to the server as part of a
27755bd8deadSopenharmony_ci    glXRender request:
27765bd8deadSopenharmony_ci
27775bd8deadSopenharmony_ci        NamedProgramLocalParameter4fvEXT
27785bd8deadSopenharmony_ci            2           36              rendering command length
27795bd8deadSopenharmony_ci            2           ZZZZ            rendering command opcode
27805bd8deadSopenharmony_ci            4           ENUM            program
27815bd8deadSopenharmony_ci            4           ENUM            target
27825bd8deadSopenharmony_ci            4           CARD32          index
27835bd8deadSopenharmony_ci            4           FLOAT32         params[0]
27845bd8deadSopenharmony_ci            4           FLOAT32         params[1]
27855bd8deadSopenharmony_ci            4           FLOAT32         params[2]
27865bd8deadSopenharmony_ci            4           FLOAT32         params[3]
27875bd8deadSopenharmony_ci
27885bd8deadSopenharmony_ci        NamedProgramLocalParameter4dvEXT
27895bd8deadSopenharmony_ci            2           48              rendering command length
27905bd8deadSopenharmony_ci            2           ZZZZ            rendering command opcode
27915bd8deadSopenharmony_ci            4           ENUM            program
27925bd8deadSopenharmony_ci            4           ENUM            target
27935bd8deadSopenharmony_ci            4           CARD32          index
27945bd8deadSopenharmony_ci            8           FLOAT64         params[0]
27955bd8deadSopenharmony_ci            8           FLOAT64         params[1]
27965bd8deadSopenharmony_ci            8           FLOAT64         params[2]
27975bd8deadSopenharmony_ci            8           FLOAT64         params[3]
27985bd8deadSopenharmony_ci
27995bd8deadSopenharmony_ci    The NamedProgramStringEXT is potentially large, and hence can be
28005bd8deadSopenharmony_ci    sent in a glXRender or glXRenderLarge request.
28015bd8deadSopenharmony_ci
28025bd8deadSopenharmony_ci        NamedProgramStringEXT
28035bd8deadSopenharmony_ci            2           20+len+p        rendering command length
28045bd8deadSopenharmony_ci            2           ZZZZ            rendering command opcode
28055bd8deadSopenharmony_ci            4           ENUM            program
28065bd8deadSopenharmony_ci            4           ENUM            target
28075bd8deadSopenharmony_ci            4           ENUM            format
28085bd8deadSopenharmony_ci            4           sizei           len
28095bd8deadSopenharmony_ci            len         LISTofBYTE      program
28105bd8deadSopenharmony_ci            p                           unused, p=pad(len)
28115bd8deadSopenharmony_ci
28125bd8deadSopenharmony_ci         If the command is encoded in a glxRenderLarge request, the command
28135bd8deadSopenharmony_ci         opcode and command length fields above are expanded to 4 bytes each:
28145bd8deadSopenharmony_ci
28155bd8deadSopenharmony_ci            4           20+len+p        rendering command length
28165bd8deadSopenharmony_ci            4           ZZZZ            rendering command opcode
28175bd8deadSopenharmony_ci
28185bd8deadSopenharmony_ci    The remaining commands are non-rendering commands.  These commands are
28195bd8deadSopenharmony_ci    sent separately (i.e., not as part of a glXRender or glXRenderLarge
28205bd8deadSopenharmony_ci    request), using the glXVendorPrivateWithReply request:
28215bd8deadSopenharmony_ci
28225bd8deadSopenharmony_ci        GetNamedProgramLocalParameterfvEXT
28235bd8deadSopenharmony_ci            1           CARD8           opcode (X assigned)
28245bd8deadSopenharmony_ci            1           17              GLX opcode (glXVendorPrivateWithReply)
28255bd8deadSopenharmony_ci            2           6               request length
28265bd8deadSopenharmony_ci            4           ZZZZ            vendor specific opcode
28275bd8deadSopenharmony_ci            4           GLX_CONTEXT_TAG context tag
28285bd8deadSopenharmony_ci            4           ENUM            program
28295bd8deadSopenharmony_ci            4           ENUM            target
28305bd8deadSopenharmony_ci            4           CARD32          index
28315bd8deadSopenharmony_ci          =>
28325bd8deadSopenharmony_ci            1           1               reply
28335bd8deadSopenharmony_ci            1                           unused
28345bd8deadSopenharmony_ci            2           CARD16          sequence number
28355bd8deadSopenharmony_ci            4           m               reply length, m=(n==1?0:n)
28365bd8deadSopenharmony_ci            4                           unused
28375bd8deadSopenharmony_ci            4           CARD32          n (number of parameter components)
28385bd8deadSopenharmony_ci
28395bd8deadSopenharmony_ci            if (n=1) this follows:
28405bd8deadSopenharmony_ci
28415bd8deadSopenharmony_ci            4           FLOAT32         params
28425bd8deadSopenharmony_ci            12                          unused
28435bd8deadSopenharmony_ci
28445bd8deadSopenharmony_ci            otherwise this follows:
28455bd8deadSopenharmony_ci
28465bd8deadSopenharmony_ci            16                          unused
28475bd8deadSopenharmony_ci            n*4         LISTofFLOAT32   params
28485bd8deadSopenharmony_ci
28495bd8deadSopenharmony_ci        GetNamedProgramLocalParameterdvEXT
28505bd8deadSopenharmony_ci            1           CARD8           opcode (X assigned)
28515bd8deadSopenharmony_ci            1           17              GLX opcode (glXVendorPrivateWithReply)
28525bd8deadSopenharmony_ci            2           6               request length
28535bd8deadSopenharmony_ci            4           ZZZZ            vendor specific opcode
28545bd8deadSopenharmony_ci            4           GLX_CONTEXT_TAG context tag
28555bd8deadSopenharmony_ci            4           ENUM            program
28565bd8deadSopenharmony_ci            4           CARD32          index
28575bd8deadSopenharmony_ci            4           ENUM            target
28585bd8deadSopenharmony_ci          =>
28595bd8deadSopenharmony_ci            1           1               reply
28605bd8deadSopenharmony_ci            1                           unused
28615bd8deadSopenharmony_ci            2           CARD16          sequence number
28625bd8deadSopenharmony_ci            4           m               reply length, m=(n==1?0:n*2)
28635bd8deadSopenharmony_ci            4                           unused
28645bd8deadSopenharmony_ci            4           CARD32          n (number of parameter components)
28655bd8deadSopenharmony_ci
28665bd8deadSopenharmony_ci            if (n=1) this follows:
28675bd8deadSopenharmony_ci
28685bd8deadSopenharmony_ci            8           FLOAT64         params
28695bd8deadSopenharmony_ci            8                           unused
28705bd8deadSopenharmony_ci
28715bd8deadSopenharmony_ci            otherwise this follows:
28725bd8deadSopenharmony_ci
28735bd8deadSopenharmony_ci            16                          unused
28745bd8deadSopenharmony_ci            n*8         LISTofFLOAT64   params
28755bd8deadSopenharmony_ci
28765bd8deadSopenharmony_ci        GetNamedProgramivEXT
28775bd8deadSopenharmony_ci            1           CARD8           opcode (X assigned)
28785bd8deadSopenharmony_ci            1           17              GLX opcode (glXVendorPrivateWithReply)
28795bd8deadSopenharmony_ci            2           6               request length
28805bd8deadSopenharmony_ci            4           ZZZZ            vendor specific opcode
28815bd8deadSopenharmony_ci            4           GLX_CONTEXT_TAG context tag
28825bd8deadSopenharmony_ci            4           ENUM            program
28835bd8deadSopenharmony_ci            4           ENUM            target
28845bd8deadSopenharmony_ci            4           ENUM            pname
28855bd8deadSopenharmony_ci          =>
28865bd8deadSopenharmony_ci            1           1               reply
28875bd8deadSopenharmony_ci            1                           unused
28885bd8deadSopenharmony_ci            2           CARD16          sequence number
28895bd8deadSopenharmony_ci            4           m               reply length, m=(n==1?0:n)
28905bd8deadSopenharmony_ci            4                           unused
28915bd8deadSopenharmony_ci            4           CARD32          n
28925bd8deadSopenharmony_ci
28935bd8deadSopenharmony_ci            if (n=1) this follows:
28945bd8deadSopenharmony_ci
28955bd8deadSopenharmony_ci            4           INT32           params
28965bd8deadSopenharmony_ci            12                          unused
28975bd8deadSopenharmony_ci
28985bd8deadSopenharmony_ci            otherwise this follows:
28995bd8deadSopenharmony_ci
29005bd8deadSopenharmony_ci            16                          unused
29015bd8deadSopenharmony_ci            n*4         LISTofINT32     params
29025bd8deadSopenharmony_ci
29035bd8deadSopenharmony_ci        GetNamedProgramStringEXT
29045bd8deadSopenharmony_ci            1           CARD8           opcode (X assigned)
29055bd8deadSopenharmony_ci            1           17              GLX opcode (glXVendorPrivateWithReply)
29065bd8deadSopenharmony_ci            2           6               request length
29075bd8deadSopenharmony_ci            4           ZZZZ            vendor specific opcode
29085bd8deadSopenharmony_ci            4           GLX_CONTEXT_TAG context tag
29095bd8deadSopenharmony_ci            4           ENUM            program
29105bd8deadSopenharmony_ci            4           ENUM            target
29115bd8deadSopenharmony_ci            4           ENUM            pname
29125bd8deadSopenharmony_ci          =>
29135bd8deadSopenharmony_ci            1           1               reply
29145bd8deadSopenharmony_ci            1                           unused
29155bd8deadSopenharmony_ci            2           CARD16          sequence number
29165bd8deadSopenharmony_ci            4           (n+p)/4         reply length
29175bd8deadSopenharmony_ci            4                           unused
29185bd8deadSopenharmony_ci            4           CARD32          n
29195bd8deadSopenharmony_ci            16                          unused
29205bd8deadSopenharmony_ci            n           STRING          program
29215bd8deadSopenharmony_ci            p                           unused, p=pad(n)
29225bd8deadSopenharmony_ci
29235bd8deadSopenharmony_ciErrors
29245bd8deadSopenharmony_ci
29255bd8deadSopenharmony_ci    All the commands in this extension excepting ClientAttribDefaultEXT
29265bd8deadSopenharmony_ci    are expressed in terms of existing GL commands and the error that
29275bd8deadSopenharmony_ci    apply to those commands apply to the new commands.  If an error
29285bd8deadSopenharmony_ci    occurs for any of the commands introduced by this extension, any
29295bd8deadSopenharmony_ci    selector used by the command is left undisturbed.
29305bd8deadSopenharmony_ci
29315bd8deadSopenharmony_ci    Several errors are truly "new" with this extension:
29325bd8deadSopenharmony_ci
29335bd8deadSopenharmony_ci    INVALID_OPERATION is generated by CopyTextureImage1DEXT,
29345bd8deadSopenharmony_ci    CopyTextureImage2DEXT, CopyTextureSubImage1DEXT,
29355bd8deadSopenharmony_ci    CopyTextureSubImage2DEXT, CopyTextureSubImage3DEXT,
29365bd8deadSopenharmony_ci    GetCompressedTextureImageEXT, GetTextureImageEXT,
29375bd8deadSopenharmony_ci    GetTextureLevelParameterfvEXT, GetTextureLevelParameterivEXT,
29385bd8deadSopenharmony_ci    GetTextureParameterfvEXT, GetTextureParameterIivEXT,
29395bd8deadSopenharmony_ci    GetTextureParameterIuivEXT, GetTextureParameterivEXT,
29405bd8deadSopenharmony_ci    TextureBufferEXT, TextureImage1DEXT, TextureImage2DEXT,
29415bd8deadSopenharmony_ci    TextureImage3DEXT, TextureParameterfEXT, TextureParameterfvEXT,
29425bd8deadSopenharmony_ci    TextureParameteriEXT, TextureParameterIivEXT, TextureParameterIuivEXT,
29435bd8deadSopenharmony_ci    TextureParameterivEXT, TextureSubImage1DEXT, TextureSubImage2DEXT,
29445bd8deadSopenharmony_ci    TextureSubImage3DEXT, and GenerateMultiTexMipmapEXT if the target
29455bd8deadSopenharmony_ci    parameter does not match the target type of the texture object named
29465bd8deadSopenharmony_ci    by the texture parameter.
29475bd8deadSopenharmony_ci
29485bd8deadSopenharmony_ci    INVALID_OPERATION is generated by GetNamedBufferParameterivEXT,
29495bd8deadSopenharmony_ci    GetNamedBufferPointervEXT, GetNamedBufferSubDataEXT,
29505bd8deadSopenharmony_ci    MapNamedBufferEXT, NamedBufferDataEXT, NamedBufferSubDataEXT, and
29515bd8deadSopenharmony_ci    UnmapNamedBufferEXT if the buffer parameter is zero.
29525bd8deadSopenharmony_ci
29535bd8deadSopenharmony_ci    INVALID_OPERATION is generated by ProgramUniform1fEXT,
29545bd8deadSopenharmony_ci    ProgramUniform2fEXT, ProgramUniform3fEXT, ProgramUniform4fEXT,
29555bd8deadSopenharmony_ci    ProgramUniform1iEXT, ProgramUniform2iEXT, ProgramUniform3iEXT,
29565bd8deadSopenharmony_ci    ProgramUniform4iEXT, ProgramUniform1fvEXT, ProgramUniform2fvEXT,
29575bd8deadSopenharmony_ci    ProgramUniform3fvEXT, ProgramUniform4fvEXT, ProgramUniform1ivEXT,
29585bd8deadSopenharmony_ci    ProgramUniform2ivEXT, ProgramUniform3ivEXT, ProgramUniform4ivEX,
29595bd8deadSopenharmony_ci    ProgramUniformMatrix2fvEXT, ProgramUniformMatrix3fvEXT,
29605bd8deadSopenharmony_ci    ProgramUniformMatrix4fvEXT, ProgramUniformMatrix2x3fv,
29615bd8deadSopenharmony_ci    ProgramUniformMatrix3x2fv, ProgramUniformMatrix2x4fv,
29625bd8deadSopenharmony_ci    ProgramUniformMatrix4x2fv, ProgramUniformMatrix3x4fv,
29635bd8deadSopenharmony_ci    ProgramUniformMatrix4x3fv, ProgramUniform1uiEXT, ProgramUniform2uiEXT,
29645bd8deadSopenharmony_ci    ProgramUniform3uiEXT, ProgramUniform4uiEXT, ProgramUniform1uivEXT,
29655bd8deadSopenharmony_ci    ProgramUniform2uivEXT, ProgramUniform3uivEXT, and
29665bd8deadSopenharmony_ci    ProgramUniform4uivEXT if the program named by the program parameter
29675bd8deadSopenharmony_ci    has not been successfully linked.
29685bd8deadSopenharmony_ci
29695bd8deadSopenharmony_ci    INVALID_VALUE is generated by NamedProgramLocalParameter4dEXT,
29705bd8deadSopenharmony_ci    NamedProgramLocalParameter4dvEXT, NamedProgramLocalParameter4fEXT,
29715bd8deadSopenharmony_ci    NamedProgramLocalParameter4fvEXT, GetNamedProgramLocalParameterdvEXT,
29725bd8deadSopenharmony_ci    GetNamedProgramLocalParameterfvEXT, GetNamedProgramivEXT, and
29735bd8deadSopenharmony_ci    GetNamedProgramStringEXT if the program named by the program parameter
29745bd8deadSopenharmony_ci    does not exist.
29755bd8deadSopenharmony_ci
29765bd8deadSopenharmony_ci    INVALID_OPERATION is generated by MultiTexCoordPointerEXT,
29775bd8deadSopenharmony_ci    VertexArrayMultiTexCoordOffsetEXT, MultiTexEnvfEXT, MultiTexEnvfvEXT,
29785bd8deadSopenharmony_ci    MultiTexEnviEXT, MultiTexEnvivEXT, MultiTexGendEXT, MultiTexGendvEXT,
29795bd8deadSopenharmony_ci    MultiTexGenfEXT, MultiTexGenfvEXT, MultiTexGeniEXT, MultiTexGenivEXT,
29805bd8deadSopenharmony_ci    MultiTexParameteriEXT, MultiTexParameterivEXT, MultiTexParameterfEXT,
29815bd8deadSopenharmony_ci    MultiTexParameterfvEXT, MultiTexParameterIivEXT,
29825bd8deadSopenharmony_ci    MultiTexParameterIuivEXT, MultiTexImage1DEXT, MultiTexImage2DEXT,
29835bd8deadSopenharmony_ci    MultiTexSubImage1DEXT, MultiTexSubImage2DEXT, CopyMultiTexImage1DEXT,
29845bd8deadSopenharmony_ci    CopyMultiTexImage2DEXT, CopyMultiTexSubImage1DEXT,
29855bd8deadSopenharmony_ci    CopyMultiTexSubImage2DEXT, MultiTexImage3DEXT, MultiTexSubImage3DEXT,
29865bd8deadSopenharmony_ci    CopyMultiTexSubImage3DEXT, MultiTexBufferEXT, GetMultiTexEnvfvEXT,
29875bd8deadSopenharmony_ci    GetMultiTexEnvivEXT, GetMultiTexGendvEXT, GetMultiTexGenfvEXT,
29885bd8deadSopenharmony_ci    GetMultiTexGenivEXT, GetMultiTexImageEXT, GetMultiTexParameterfvEXT,
29895bd8deadSopenharmony_ci    GetMultiTexParameterivEXT, GetMultiTexParameterIivEXT,
29905bd8deadSopenharmony_ci    GetMultiTexParameterIuivEXT, GetMultiTexLevelParameterivEXT,
29915bd8deadSopenharmony_ci    GetMultiTexLevelParameterfvEXT, and GetCompressedMultiTexImageEXT if
29925bd8deadSopenharmony_ci    the texunit parameter names a texture unit that is greater or equal in
29935bd8deadSopenharmony_ci    number to the implementations limit for maximum texture image units.
29945bd8deadSopenharmony_ci
29955bd8deadSopenharmony_ci    INVALID_OPERATION is generated by FramebufferDrawBuffersEXT if a
29965bd8deadSopenharmony_ci    color buffer not currently allocated to the GL context is specified.
29975bd8deadSopenharmony_ci
29985bd8deadSopenharmony_ci    INVALID_OPERATION is generated by FramebufferDrawBuffersEXT if <n>
29995bd8deadSopenharmony_ci    is greater than the state MAX_DRAW_BUFFERS.
30005bd8deadSopenharmony_ci    
30015bd8deadSopenharmony_ci    INVALID_OPERATION is generated by FramebufferDrawBuffersEXT if value
30025bd8deadSopenharmony_ci    in <bufs> does not correspond to one of the allowed buffers.
30035bd8deadSopenharmony_ci
30045bd8deadSopenharmony_ci    INVALID_OPERATION is generated by FramebufferDrawBuffersEXT if a
30055bd8deadSopenharmony_ci    draw buffer other then NONE is specified more then once in <bufs>.
30065bd8deadSopenharmony_ci
30075bd8deadSopenharmony_ciNew State
30085bd8deadSopenharmony_ci
30095bd8deadSopenharmony_ci    None.
30105bd8deadSopenharmony_ci
30115bd8deadSopenharmony_ciNew Implementation Dependent State
30125bd8deadSopenharmony_ci
30135bd8deadSopenharmony_ci    None.
30145bd8deadSopenharmony_ci
30155bd8deadSopenharmony_ciNVIDIA Implementation Details
30165bd8deadSopenharmony_ci
30175bd8deadSopenharmony_ci    NVIDIA drivers prior to 330.00 (August 2013) have a bug where
30185bd8deadSopenharmony_ci    glMultiTexGeniEXT acts identically to glTexGeni (so glMultiTexGeniEXT
30195bd8deadSopenharmony_ci    ignores its texture unit parameter).
30205bd8deadSopenharmony_ci    
30215bd8deadSopenharmony_ci    As a workaround, use glMultiTexGenivEXT.  So problematic code written
30225bd8deadSopenharmony_ci    as:
30235bd8deadSopenharmony_ci    
30245bd8deadSopenharmony_ci      glMultiTexGeniEXT(texUnit, coord, pname, value);
30255bd8deadSopenharmony_ci
30265bd8deadSopenharmony_ci    can be rewritten as:
30275bd8deadSopenharmony_ci
30285bd8deadSopenharmony_ci      GLenum pvalue = value;
30295bd8deadSopenharmony_ci      glMultiTexGenivEXT(texUnit, coord, pname, &pvalue);
30305bd8deadSopenharmony_ci
30315bd8deadSopenharmony_ci    NVIDIA drivers prior to 330.00 (August 2013) do not support
30325bd8deadSopenharmony_ci    the glEnableVertexArrayEXT and glDisableVertexArrayEXT with the
30335bd8deadSopenharmony_ci    GL_TEXTUREi tokens and instead generate a GL_INVALID_ENUM error.
30345bd8deadSopenharmony_ci    See issue 32.  The only workaround is to change the texture
30355bd8deadSopenharmony_ci    unit selector (glActiveTexture) and bind the vertex array
30365bd8deadSopenharmony_ci    object (glBindVertexArray) and call glEnable or glDisable with
30375bd8deadSopenharmony_ci    GL_TEXTURE_COORD_ARRAY.  Alternatively use generic vertex attribute
30385bd8deadSopenharmony_ci    arrays instead of texture coordinate arrays.
30395bd8deadSopenharmony_ci
30405bd8deadSopenharmony_ciIssues
30415bd8deadSopenharmony_ci
30425bd8deadSopenharmony_ci    (0) What is changed from version 1.0 to version 1.1 of this extension
30435bd8deadSopenharmony_ci        to support OpenGL 3.0?
30445bd8deadSopenharmony_ci
30455bd8deadSopenharmony_ci        RESOLVED:  Changes are primarily cosmetic except the addition
30465bd8deadSopenharmony_ci        of API for selector-free access to vertex array objects since
30475bd8deadSopenharmony_ci        that functionality is part of OpenGL 3.0:
30485bd8deadSopenharmony_ci
30495bd8deadSopenharmony_ci        1) Update all references to section numbering to OpenGL 3.0
30505bd8deadSopenharmony_ci        section numbers.
30515bd8deadSopenharmony_ci
30525bd8deadSopenharmony_ci        2) Where EXT extensions have become part of OpenGL 3.0, refer
30535bd8deadSopenharmony_ci        to the functionality as part of OpenGL 3.0 rather than by
30545bd8deadSopenharmony_ci        extension name.
30555bd8deadSopenharmony_ci
30565bd8deadSopenharmony_ci        3) New selector-free API for vertex buffer objects since these
30575bd8deadSopenharmony_ci        were introduced by OpenGL 3.0.  The EXT version specified
30585bd8deadSopenharmony_ci        a necessary glClientAttribDefaultEXT interaction with
30595bd8deadSopenharmony_ci        APPLE_vertex_buffer_object but didn't provide an selector-free
30605bd8deadSopenharmony_ci        API for vertex buffer objects.
30615bd8deadSopenharmony_ci
30625bd8deadSopenharmony_ci        4) Add new selector-free API for fine control over mapping
30635bd8deadSopenharmony_ci        buffer subranges into client space (glMapNamedBufferRangeEXT)
30645bd8deadSopenharmony_ci        and flushing modified data (glFlushMappedNamedBufferRangeEXT).
30655bd8deadSopenharmony_ci
30665bd8deadSopenharmony_ci        5) Add OpenGL 3.0-style aliases for the version 1.0 commands
30675bd8deadSopenharmony_ci        and queries that have "Indexed" in the name.  OpenGL 3.0 has a
30685bd8deadSopenharmony_ci        convention where an "i" indexed indexed commands and queries.
30695bd8deadSopenharmony_ci        For example, glGetFloati_v and glGetFloatIndexedvEXT are
30705bd8deadSopenharmony_ci        identical queries.  Likewise glEnableClientStateIndexedEXT and
30715bd8deadSopenharmony_ci        glEnableClientStateiEXT are identical commands.
30725bd8deadSopenharmony_ci
30735bd8deadSopenharmony_ci    (1) What should this extension be called?
30745bd8deadSopenharmony_ci
30755bd8deadSopenharmony_ci        RESOLVED: EXT_direct_state_access
30765bd8deadSopenharmony_ci
30775bd8deadSopenharmony_ci        "direct" means state updates and queries are not indirected
30785bd8deadSopenharmony_ci        through a selector such as the matrix mode, active texture
30795bd8deadSopenharmony_ci        unit, active client texture unit, current texture binding,
30805bd8deadSopenharmony_ci        current vertex/fragment/geometry program, current GLSL program,
30815bd8deadSopenharmony_ci        or current buffer binding.
30825bd8deadSopenharmony_ci
30835bd8deadSopenharmony_ci        "state" so there's not confusion about what this extension
30845bd8deadSopenharmony_ci        provides direct access to (not direct access to the hardware or
30855bd8deadSopenharmony_ci        the framebuffer, etc.).
30865bd8deadSopenharmony_ci
30875bd8deadSopenharmony_ci        "access" is because this extension applies to both queries (reads)
30885bd8deadSopenharmony_ci        and updates (writes) of OpenGL state.  Access is general enough
30895bd8deadSopenharmony_ci        to encompass both queries and updates.
30905bd8deadSopenharmony_ci
30915bd8deadSopenharmony_ci    (2) Should we have a "direct_state_access" extension for each type
30925bd8deadSopenharmony_ci        of OpenGL state involved (matrix, program, GLSL, texture unit,
30935bd8deadSopenharmony_ci        texture object) or have one uber-extension?  For example,
30945bd8deadSopenharmony_ci        EXT_direct_matrix_access, EXT_direct_texture_access, etc.
30955bd8deadSopenharmony_ci
30965bd8deadSopenharmony_ci        RESOLVED: One uber-extension.
30975bd8deadSopenharmony_ci
30985bd8deadSopenharmony_ci        This extension introduces no additional hardware functionality
30995bd8deadSopenharmony_ci        but rather provides commands to perform state updates and queries
31005bd8deadSopenharmony_ci        without having to change (and possibly query and restore) API
31015bd8deadSopenharmony_ci        selectors.
31025bd8deadSopenharmony_ci
31035bd8deadSopenharmony_ci        The dependencies sections make it clear that if some functionality
31045bd8deadSopenharmony_ci        (say, GLSL) is not supported, implementations supporting this
31055bd8deadSopenharmony_ci        extension ignore the direct access API for the particular missing
31065bd8deadSopenharmony_ci        functionality.
31075bd8deadSopenharmony_ci
31085bd8deadSopenharmony_ci        This simplifies the burden on applications to use the new direct
31095bd8deadSopenharmony_ci        access API.  When this extension is supported, the application can
31105bd8deadSopenharmony_ci        assume all functionality supported by their respective extensions
31115bd8deadSopenharmony_ci        is available through the direct access commands introduced by
31125bd8deadSopenharmony_ci        this extension.
31135bd8deadSopenharmony_ci
31145bd8deadSopenharmony_ci    (3) Explain the methodology for naming selector-free commands.
31155bd8deadSopenharmony_ci
31165bd8deadSopenharmony_ci        The naming conventions seek to maximize consistency but
31175bd8deadSopenharmony_ci        differences between the various selectors and command subsets
31185bd8deadSopenharmony_ci        dictate differences in approach.
31195bd8deadSopenharmony_ci
31205bd8deadSopenharmony_ci        The chosen naming conventions has two guiding principles: 1)
31215bd8deadSopenharmony_ci        making the selector-free commands similar to the existing
31225bd8deadSopenharmony_ci        selector-based commands in naming but also clearly and
31235bd8deadSopenharmony_ci        consistently distinguished (at least within each group of
31245bd8deadSopenharmony_ci        commands) from the existing selector-based commands to which
31255bd8deadSopenharmony_ci        selector-free commands correspond by a simple pattern, and 2)
31265bd8deadSopenharmony_ci        being conscious of the length in characters of the resulting
31275bd8deadSopenharmony_ci        command names.
31285bd8deadSopenharmony_ci
31295bd8deadSopenharmony_ci        Selector-less matrix commands all start glMatrix* (rather than gl*
31305bd8deadSopenharmony_ci        or gl*Matrix[fd] for the corresponding selector-based commands).
31315bd8deadSopenharmony_ci
31325bd8deadSopenharmony_ci        Rationale: The selector-based matrix commands have the
31335bd8deadSopenharmony_ci        classic verb-noun format (example: glLoadMatrixf) described
31345bd8deadSopenharmony_ci        in Kurt Akeley's "Syntax Rules for OpenGL Extensions" document
31355bd8deadSopenharmony_ci        (henceforth abbreviated SRfOE) while the selector-free versions
31365bd8deadSopenharmony_ci        have a noun-verb format.  This variance from SRfOE conventions
31375bd8deadSopenharmony_ci        is deemed warranted for the sake of consistent naming of all the
31385bd8deadSopenharmony_ci        selector-free matrix commands.
31395bd8deadSopenharmony_ci
31405bd8deadSopenharmony_ci        The alternative of using "NamedMatrix" as a suffix to the
31415bd8deadSopenharmony_ci        matrix commands was considered (example: glLoadNamedMatrixf
31425bd8deadSopenharmony_ci        rather than glLoadMatrixf) but most matrix commands do not
31435bd8deadSopenharmony_ci        contain the word Matrix so this leads to awkward constructions
31445bd8deadSopenharmony_ci        such as glFrustumNamedMatrix and glLoadIdentityNamedMatrix.
31455bd8deadSopenharmony_ci        glMatrixFrustum and glMatrixLoadIdentity were preferred despite
31465bd8deadSopenharmony_ci        the variance this creates with SRfOE.  Also considered was
31475bd8deadSopenharmony_ci        adding "Named" or "NamedMatrix" as a prefix to the matrix
31485bd8deadSopenharmony_ci        commands (example: glNamedLoadMatrixf, glNamedFrustum,
31495bd8deadSopenharmony_ci        glNamedLoadIdentity; or glNamedMatrixLoadMatrixf,
31505bd8deadSopenharmony_ci        glNamedMatrixFrustum, glNamedMatrixLoadIdentity).  But the
31515bd8deadSopenharmony_ci        "Named" prefix is awkward because it is not the frustum,
31525bd8deadSopenharmony_ci        etc. that is named but rather a matrix.  The "NamedMatrix" prefix
31535bd8deadSopenharmony_ci        becomes awkward because of the length of the resulting commands
31545bd8deadSopenharmony_ci        while having a noun-verb format.  The "Matrix" prefixed format
31555bd8deadSopenharmony_ci        (where "Matrix" appears in the command name only once) provides
31565bd8deadSopenharmony_ci        consistency of naming and minimizes command name length but
31575bd8deadSopenharmony_ci        at the consistency cost of varying with the SRfOE's verb-noun
31585bd8deadSopenharmony_ci        convention.
31595bd8deadSopenharmony_ci
31605bd8deadSopenharmony_ci        Selector-less texture object commands all start glTexture*
31615bd8deadSopenharmony_ci        or glGetTexture* (rather than glTex* and glGetTex* for the
31625bd8deadSopenharmony_ci        corresponding selector-based commands).
31635bd8deadSopenharmony_ci
31645bd8deadSopenharmony_ci        Rationale: SRfOE states "Tex" is an abbreviation for "Texture"
31655bd8deadSopenharmony_ci        in command names.  However in the context of texture objects, the
31665bd8deadSopenharmony_ci        abbreviated "Texture" is used instead (example: glIsTexture,
31675bd8deadSopenharmony_ci        not glIsTex).  The abbreviation "Tex" is used when texture is
31685bd8deadSopenharmony_ci        used as an adjective to describe state being specified (examples:
31695bd8deadSopenharmony_ci        glTexParameter* and glTexImage*).  The unabbreviated "Texture"
31705bd8deadSopenharmony_ci        is used as a noun in command names.
31715bd8deadSopenharmony_ci
31725bd8deadSopenharmony_ci        The selector-free texture object commands use the unabbreviated
31735bd8deadSopenharmony_ci        "Texture" as an adjective since a texture object is accessed
31745bd8deadSopenharmony_ci        directly where the "Tex" commands refer to texture state accessed
31755bd8deadSopenharmony_ci        indirectly based on the currently bound texture object.
31765bd8deadSopenharmony_ci
31775bd8deadSopenharmony_ci        Selector-less multitexture texture unit commands and queries
31785bd8deadSopenharmony_ci        all replace "Tex" with "MultiTex"  and a new initial texunit
31795bd8deadSopenharmony_ci        identifies the texture unit by token (mimicking how TexCoord2f
31805bd8deadSopenharmony_ci        is MultiTexCoord2f for multitexture immediate mode).
31815bd8deadSopenharmony_ci
31825bd8deadSopenharmony_ci        Selector-less generic enables (glEnable, glDisable)
31835bd8deadSopenharmony_ci        for texture unit enables make use of the convention for
31845bd8deadSopenharmony_ci        indexed queries introduced by EXT_draw_buffers2 and also
31855bd8deadSopenharmony_ci        used by EXT_transform_feedback so use glEnableIndexedEXT and
31865bd8deadSopenharmony_ci        glDisableIndexedEXT.
31875bd8deadSopenharmony_ci
31885bd8deadSopenharmony_ci        Selector-less generic queries (glGetIntegerv, glGetFloatv,
31895bd8deadSopenharmony_ci        glGetPointerv, etc) for texture unit state make use
31905bd8deadSopenharmony_ci        of the convention for indexed queries introduced by
31915bd8deadSopenharmony_ci        EXT_draw_buffers2 and also used by EXT_transform_feedback so use
31925bd8deadSopenharmony_ci        glGetIntegerIndexedvEXT, glGetFloatIndexedvEXT,
31935bd8deadSopenharmony_ci        glGetDoubleIndexedvEXT, glGetBooleanIndexedvEXT, and
31945bd8deadSopenharmony_ci        glIsEnabledIndexedEXT.
31955bd8deadSopenharmony_ci
31965bd8deadSopenharmony_ci        OpenGL 3.0 introduced a new naming convention for indexed
31975bd8deadSopenharmony_ci        state enables and queries so glGetIntegeri_v, glGetFloati_vEXT,
31985bd8deadSopenharmony_ci        glGetDoublei_vEXT, and glGetBooleani_v, glIsEnabledi operate
31995bd8deadSopenharmony_ci        identically respectively to the prior indexed query list.
32005bd8deadSopenharmony_ci
32015bd8deadSopenharmony_ci        Selector-less buffer object commands all start with glNamedBuffer
32025bd8deadSopenharmony_ci        or glGetNamedBuffer.
32035bd8deadSopenharmony_ci
32045bd8deadSopenharmony_ci        Selector-less program parameter commands (for
32055bd8deadSopenharmony_ci        ARB_vertex_program-based extensions) all start glNamedProgram
32065bd8deadSopenharmony_ci        or glGetNamedProgram.
32075bd8deadSopenharmony_ci
32085bd8deadSopenharmony_ci        Selector-less uniform commands for GLSL all start glProgramUniform.
32095bd8deadSopenharmony_ci
32105bd8deadSopenharmony_ci        Selector-less framebuffer object commands all start
32115bd8deadSopenharmony_ci        with glNamedFramebufer, glGetNamedFramebuffer, or
32125bd8deadSopenharmony_ci        glCheckNamedFramebuffer.  The selector-less framebuffer
32135bd8deadSopenharmony_ci        control commands are glFramebufferDrawBufferEXT,
32145bd8deadSopenharmony_ci        glFramebufferDrawBuffersEXT, and glFramebufferReadBufferEXT.
32155bd8deadSopenharmony_ci
32165bd8deadSopenharmony_ci        Selector-less renderbuffer object commands all start
32175bd8deadSopenharmony_ci        with glNamedRenderbuffer or glGetNamedRenderbuffer.
32185bd8deadSopenharmony_ci
32195bd8deadSopenharmony_ci    (4) Should the selector-free glTexture* and glNamedProgram* commands
32205bd8deadSopenharmony_ci        and glGetTexture* and glGetNamedProgram* queries have target
32215bd8deadSopenharmony_ci        parameters (for passing GL_TEXTURE_2D or GL_VERTEX_PROGRAM_ARB,
32225bd8deadSopenharmony_ci        etc.)?
32235bd8deadSopenharmony_ci
32245bd8deadSopenharmony_ci        RESOLVED:  Yes.
32255bd8deadSopenharmony_ci
32265bd8deadSopenharmony_ci        It would be desirable to update a texture parameter for a given
32275bd8deadSopenharmony_ci        texture object without having to know the target of the texture
32285bd8deadSopenharmony_ci        object.  For example, one could change the GL_TEXTURE_MIN_FILTER
32295bd8deadSopenharmony_ci        of a texture object without knowing if the texture object was
32305bd8deadSopenharmony_ci        a 1D, 2D, 3D, or cube map texture.
32315bd8deadSopenharmony_ci
32325bd8deadSopenharmony_ci        As desirable as that might be, OpenGL's texture target scheme
32335bd8deadSopenharmony_ci        makes that difficult in general for several reasons.
32345bd8deadSopenharmony_ci
32355bd8deadSopenharmony_ci        First, a side-effect of glBindTexture is that a texture object of
32365bd8deadSopenharmony_ci        the indicated target is created if the specified texture object
32375bd8deadSopenharmony_ci        name does not map to an existent texture object.  In this case,
32385bd8deadSopenharmony_ci        a texture object of the specified target is created and its state
32395bd8deadSopenharmony_ci        is initialized to the initial texture object state based on the
32405bd8deadSopenharmony_ci        specified target.  The selector-free texture object commands
32415bd8deadSopenharmony_ci        should operate the same way if a non-existent texture object
32425bd8deadSopenharmony_ci        is specified.
32435bd8deadSopenharmony_ci
32445bd8deadSopenharmony_ci        Second, cube maps have face-specific targets
32455bd8deadSopenharmony_ci        (GL_TEXTURE_CUBE_MAP_POSITIVE_X, etc.) as well as the
32465bd8deadSopenharmony_ci        face-independent target (GL_TEXTURE_CUBE_MAP).  Commands for
32475bd8deadSopenharmony_ci        texture image specification (glTexImage2D, etc.) and query
32485bd8deadSopenharmony_ci        (glGetTexImage) require the target parameter to select the
32495bd8deadSopenharmony_ci        appropriate face.
32505bd8deadSopenharmony_ci
32515bd8deadSopenharmony_ci        Assembly program commands have a similar need for a target
32525bd8deadSopenharmony_ci        parameter.  Calling glBindProgramARB is specified to create an
32535bd8deadSopenharmony_ci        empty program of the specified target type of the bind.
32545bd8deadSopenharmony_ci
32555bd8deadSopenharmony_ci        Semantically, glTexture* commands (and glGetTexture* queries) are
32565bd8deadSopenharmony_ci        semantically equivalent of performing a glBindTexture followed
32575bd8deadSopenharmony_ci        atomically by the equivalent glTex* command (or equivalent
32585bd8deadSopenharmony_ci        glGetTex* query).
32595bd8deadSopenharmony_ci
32605bd8deadSopenharmony_ci        Likewise semantically, glNamedProgram* commands (and
32615bd8deadSopenharmony_ci        glGetNamedProgram* queries) are semantically equivalent of
32625bd8deadSopenharmony_ci        performing a glBindProgramARB followed atomically by the
32635bd8deadSopenharmony_ci        equivalent glProgram* command (or equivalent glGetProgram* query).
32645bd8deadSopenharmony_ci
32655bd8deadSopenharmony_ci        Note that buffer commands do not have this same need for a target
32665bd8deadSopenharmony_ci        parameter in their selector-less form.
32675bd8deadSopenharmony_ci
32685bd8deadSopenharmony_ci    (5) The OpenGL API has "latched" state.  Explain latched state
32695bd8deadSopenharmony_ci        and how this extension addresses latched state.
32705bd8deadSopenharmony_ci
32715bd8deadSopenharmony_ci        RESOLVED:  Examples of latched state in the OpenGL API are the
32725bd8deadSopenharmony_ci        current array and array element buffers and the pixel store
32735bd8deadSopenharmony_ci        pack/unpack state.  Latched stated is all client-side state
32745bd8deadSopenharmony_ci        (pixel store or vertex array).
32755bd8deadSopenharmony_ci
32765bd8deadSopenharmony_ci        The state of the current array buffer acts as an extra parameter
32775bd8deadSopenharmony_ci        to all the gl*Pointer calls to configure vertex arrays.  The state
32785bd8deadSopenharmony_ci        of the current element array buffer acts as an extra parameter to
32795bd8deadSopenharmony_ci        the glDrawElements family of commands.  The pixel store unpack
32805bd8deadSopenharmony_ci        state acts as a collection of extra parameters to glTexImage*,
32815bd8deadSopenharmony_ci        glTexSubImage*, glDrawPixels, glBitmap, glColorTable,
32825bd8deadSopenharmony_ci        glPolygonStipple, glConvolutionFilter*, etc.  The pixel store pack
32835bd8deadSopenharmony_ci        state acts as a collection of extra parameters to glReadPixels,
32845bd8deadSopenharmony_ci        glGetTexImage, glGetColorTable, etc.
32855bd8deadSopenharmony_ci
32865bd8deadSopenharmony_ci        Whereas a selector is an extra parameter that designates what
32875bd8deadSopenharmony_ci        state variable is to be updated or queried, latched state is
32885bd8deadSopenharmony_ci        actual state values the command uses to update other state
32895bd8deadSopenharmony_ci        variables or control the operation of the command.
32905bd8deadSopenharmony_ci
32915bd8deadSopenharmony_ci        Latched state is similar in its undesirability for layered
32925bd8deadSopenharmony_ci        libraries because it requires OpenGL state variables to be
32935bd8deadSopenharmony_ci        modified to update particular state variables or control the
32945bd8deadSopenharmony_ci        operation of the command.
32955bd8deadSopenharmony_ci
32965bd8deadSopenharmony_ci        Fixing the latched state problem with additional API is involved
32975bd8deadSopenharmony_ci        because it would require introducing a new command for every
32985bd8deadSopenharmony_ci        existing OpenGL command accepting a pointer to specify vertex
32995bd8deadSopenharmony_ci        arrays or pixel data or transform feedback buffer with a "uint
33005bd8deadSopenharmony_ci        buffer, intptr offset" set of parameters rather than a pointer.
33015bd8deadSopenharmony_ci
33025bd8deadSopenharmony_ci        This extension addresses latched state by adding a new command
33035bd8deadSopenharmony_ci        glClientAttribDefaultEXT that uses its mask parameter to set all
33045bd8deadSopenharmony_ci        the client vertex array or pixel store state to its default state.
33055bd8deadSopenharmony_ci
33065bd8deadSopenharmony_ci        The glPushClientAttribDefaultEXT performs the
33075bd8deadSopenharmony_ci        glClientAttribDefaultEXT in combination with a glPushClientAttrib
33085bd8deadSopenharmony_ci        command.  This provides an inexpensive way to save-and-restore the
33095bd8deadSopenharmony_ci        latched client state so layered libraries that want well-defined
33105bd8deadSopenharmony_ci        latched client state can use these commands.
33115bd8deadSopenharmony_ci
33125bd8deadSopenharmony_ci        Because the state affected by glPushClientAttribDefaultEXT
33135bd8deadSopenharmony_ci        and glClientAttribDefaultEXT is all client-side, this state
33145bd8deadSopenharmony_ci        is inexpensive to update (unlike the glPushAttrib/glPopAttrib
33155bd8deadSopenharmony_ci        commands).
33165bd8deadSopenharmony_ci
33175bd8deadSopenharmony_ci        Some consideration was given to providing extra mask bits to
33185bd8deadSopenharmony_ci        control just the vertex array enables (to disable them all) or
33195bd8deadSopenharmony_ci        pixel store pack and unpack state independently (just the pack
33205bd8deadSopenharmony_ci        or just the unpack state).  The entire set of vertex array and
33215bd8deadSopenharmony_ci        pixel store state is compact enough that it doesn't make sense
33225bd8deadSopenharmony_ci        to add extra mask bits for subsets of the state.
33235bd8deadSopenharmony_ci
33245bd8deadSopenharmony_ci    (6) How is the expense of a per-command specified texture object,
33255bd8deadSopenharmony_ci        assembly program object, buffer object, or GLSL program object
33265bd8deadSopenharmony_ci        name lookup minimized?
33275bd8deadSopenharmony_ci
33285bd8deadSopenharmony_ci        RESOLVED:  Modern OpenGL driver implementations implementing
33295bd8deadSopenharmony_ci        this extension are expected to cache most recently used object
33305bd8deadSopenharmony_ci        names so accessing the last name repeatedly is fast.
33315bd8deadSopenharmony_ci
33325bd8deadSopenharmony_ci        The details of this is left up to the OpenGL implementation but
33335bd8deadSopenharmony_ci        developers can expect consecutive direct access commands to the
33345bd8deadSopenharmony_ci        same named object will be efficient.
33355bd8deadSopenharmony_ci
33365bd8deadSopenharmony_ci    (7) What should the selector-free glBindTexture routine be called?
33375bd8deadSopenharmony_ci
33385bd8deadSopenharmony_ci        RESOLVED: glBindMultiTextureEXT
33395bd8deadSopenharmony_ci
33405bd8deadSopenharmony_ci        This name shares the same "Multi" subword with the other routines
33415bd8deadSopenharmony_ci        (glMultiTexGen*, glMultiTexEnv*, glMultiTexParameter*, etc.).
33425bd8deadSopenharmony_ci
33435bd8deadSopenharmony_ci        The name uses "MultiTexture" instead of simply "MultiTex" because
33445bd8deadSopenharmony_ci        the glBindMultiTextureEXT command takes a texture object parameter
33455bd8deadSopenharmony_ci        (hence "Texture" instead of "Tex" used for texture unit-based
33465bd8deadSopenharmony_ci        commands) as well as a texture unit parameter.
33475bd8deadSopenharmony_ci
33485bd8deadSopenharmony_ci    (8) Should glGetIntegeri_v, glGetIntegerIndexedvEXT, glIsEnabledi,
33495bd8deadSopenharmony_ci        glIsEnabledIndexedEXT, etc. work of all query tokens or just
33505bd8deadSopenharmony_ci        query tokens for indexed state such as query tokens where the
33515bd8deadSopenharmony_ci        active texture or client active texture apply?
33525bd8deadSopenharmony_ci
33535bd8deadSopenharmony_ci        RESOLVED: Just for query tokens for indexed state.
33545bd8deadSopenharmony_ci
33555bd8deadSopenharmony_ci        This is consistent with how EXT_draw_buffers2 and
33565bd8deadSopenharmony_ci        EXT_transform_feedback work for their Indexed commands.
33575bd8deadSopenharmony_ci
33585bd8deadSopenharmony_ci        How the index parameter is interpreted depends on the queried state.
33595bd8deadSopenharmony_ci        For texture related state the index refers to the active texture unit
33605bd8deadSopenharmony_ci        or active client texture unit appropriately.
33615bd8deadSopenharmony_ci
33625bd8deadSopenharmony_ci        Said index texture tokens are:
33635bd8deadSopenharmony_ci
33645bd8deadSopenharmony_ci            GL_CURRENT_MATRIX_NV
33655bd8deadSopenharmony_ci            GL_CURRENT_MATRIX_STACK_DEPTH_NV
33665bd8deadSopenharmony_ci            GL_CURRENT_RASTER_TEXTURE_COORDS
33675bd8deadSopenharmony_ci            GL_CURRENT_TEXTURE_COORDS
33685bd8deadSopenharmony_ci            GL_TEXTURE_BINDING_1D
33695bd8deadSopenharmony_ci            GL_TEXTURE_BINDING_1D_ARRAY
33705bd8deadSopenharmony_ci            GL_TEXTURE_BINDING_2D
33715bd8deadSopenharmony_ci            GL_TEXTURE_BINDING_2D_ARRAY
33725bd8deadSopenharmony_ci            GL_TEXTURE_BINDING_3D
33735bd8deadSopenharmony_ci            GL_TEXTURE_BINDING_BUFFER_EXT
33745bd8deadSopenharmony_ci            GL_TEXTURE_BINDING_CUBE_MAP
33755bd8deadSopenharmony_ci            GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_NV
33765bd8deadSopenharmony_ci            GL_TEXTURE_BINDING_RECTANGLE_ARB
33775bd8deadSopenharmony_ci            GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT
33785bd8deadSopenharmony_ci            GL_TEXTURE_BUFFER_FORMAT_EXT
33795bd8deadSopenharmony_ci            GL_TEXTURE_COORD_ARRAY
33805bd8deadSopenharmony_ci            GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING
33815bd8deadSopenharmony_ci            GL_TEXTURE_COORD_ARRAY_COUNT
33825bd8deadSopenharmony_ci            GL_TEXTURE_COORD_ARRAY_POINTER
33835bd8deadSopenharmony_ci            GL_TEXTURE_COORD_ARRAY_SIZE
33845bd8deadSopenharmony_ci            GL_TEXTURE_COORD_ARRAY_STRIDE
33855bd8deadSopenharmony_ci            GL_TEXTURE_COORD_ARRAY_TYPE
33865bd8deadSopenharmony_ci            GL_TEXTURE_GEN_Q
33875bd8deadSopenharmony_ci            GL_TEXTURE_GEN_R
33885bd8deadSopenharmony_ci            GL_TEXTURE_GEN_S
33895bd8deadSopenharmony_ci            GL_TEXTURE_GEN_T
33905bd8deadSopenharmony_ci            GL_TEXTURE_MATRIX
33915bd8deadSopenharmony_ci            GL_TEXTURE_STACK_DEPTH
33925bd8deadSopenharmony_ci            GL_TRANSPOSE_TEXTURE_MATRIX
33935bd8deadSopenharmony_ci            GL_TEXTURE_1D
33945bd8deadSopenharmony_ci            GL_TEXTURE_2D
33955bd8deadSopenharmony_ci            GL_TEXTURE_3D
33965bd8deadSopenharmony_ci            GL_TEXTURE_CUBE_MAP
33975bd8deadSopenharmony_ci            GL_TEXTURE_RECTANGLE_ARB
33985bd8deadSopenharmony_ci
33995bd8deadSopenharmony_ci        For EXT_draw_buffers2 or EXT_transform_feedback queries, the
34005bd8deadSopenharmony_ci        index refers to the draw buffer or transform feedback buffer
34015bd8deadSopenharmony_ci        appropriately.
34025bd8deadSopenharmony_ci
34035bd8deadSopenharmony_ci    (9) Why does the equivalent code for glGetIntegeri_v,
34045bd8deadSopenharmony_ci        glGetIntegerIndexedvEXT, glIsEnabledi, glIsEnabledIndexedEXT,
34055bd8deadSopenharmony_ci        etc. save and restore the active texture and client active
34065bd8deadSopenharmony_ci        texture state appropriately?
34075bd8deadSopenharmony_ci
34085bd8deadSopenharmony_ci        RESOLVED:  Most query tokens use the active texture but some
34095bd8deadSopenharmony_ci        (those starting with GL_TEXTURE_COORD_ARRAY involving vertex
34105bd8deadSopenharmony_ci        arrays) use the client active texture.
34115bd8deadSopenharmony_ci
34125bd8deadSopenharmony_ci        For historical reasons, glEnable/glDisable can be used to
34135bd8deadSopenharmony_ci        enable/disable client state that would be better enabled/disabled
34145bd8deadSopenharmony_ci        with glEnableClientState/glDisableClientState.
34155bd8deadSopenharmony_ci
34165bd8deadSopenharmony_ci        The appropriate selector (active texture or client active texture)
34175bd8deadSopenharmony_ci        is saved or restored based on the query target.
34185bd8deadSopenharmony_ci
34195bd8deadSopenharmony_ci   (10) Can these selector-free state update commands be compiled into
34205bd8deadSopenharmony_ci        display lists?
34215bd8deadSopenharmony_ci
34225bd8deadSopenharmony_ci        RESOLVED:  YES
34235bd8deadSopenharmony_ci
34245bd8deadSopenharmony_ci        The object name, texture unit, or matrix mode parameter is
34255bd8deadSopenharmony_ci        compiled into the display list by-value like any other value
34265bd8deadSopenharmony_ci        parameter.
34275bd8deadSopenharmony_ci
34285bd8deadSopenharmony_ci        This capability to compile selector-free commands into display
34295bd8deadSopenharmony_ci        lists is one of the significant benefits of this extension.
34305bd8deadSopenharmony_ci        Prior to this extension, the only reliable way to update
34315bd8deadSopenharmony_ci        state for a particular texture unit, matrix, buffer, or
34325bd8deadSopenharmony_ci        texture without disturbing OpenGL selector state was using
34335bd8deadSopenharmony_ci        glPushAttrib/glPopAttrib which is too expensive to be practical.
34345bd8deadSopenharmony_ci
34355bd8deadSopenharmony_ci        However the glGet* selector-free commands, being queries, cannot
34365bd8deadSopenharmony_ci        be compiled into display lists.
34375bd8deadSopenharmony_ci
34385bd8deadSopenharmony_ci   (11) Why are there no glGetProgramUniform* query commands for GLSL?
34395bd8deadSopenharmony_ci
34405bd8deadSopenharmony_ci        RESOLVED:  OpenGL 2.0 already has glGetUniform* query commands
34415bd8deadSopenharmony_ci        that accept a program parameter as a parameter so are already
34425bd8deadSopenharmony_ci        selector-free.
34435bd8deadSopenharmony_ci
34445bd8deadSopenharmony_ci   (12) Is glMatrixLoadfEXT(GL_TEXTURE, matrixData), etc. legal?
34455bd8deadSopenharmony_ci
34465bd8deadSopenharmony_ci        RESOLVED:  YES.
34475bd8deadSopenharmony_ci
34485bd8deadSopenharmony_ci        This will update the texture matrix based on the current active
34495bd8deadSopenharmony_ci        texture.  This avoids the matrix mode selector but still relies
34505bd8deadSopenharmony_ci        on the active texture selector.
34515bd8deadSopenharmony_ci
34525bd8deadSopenharmony_ci        Use GL_TEXTUREn where n is the texture unit to reference a
34535bd8deadSopenharmony_ci        specific texture unit's texture matrix without changing either
34545bd8deadSopenharmony_ci        the matrix mode or active texture state.
34555bd8deadSopenharmony_ci
34565bd8deadSopenharmony_ci   (13) Some glTex* and glGetTex* routines accept proxy targets.  How do
34575bd8deadSopenharmony_ci        proxy textures work with the selector-free commands?
34585bd8deadSopenharmony_ci
34595bd8deadSopenharmony_ci        RESOLVED:  Proxy targets work with the glTex* (glTexImage*)
34605bd8deadSopenharmony_ci        and glGetTex* (glGetTexLevelParameter*) commands that support
34615bd8deadSopenharmony_ci        proxy textures BUT the texture name must be 0 to avoid a
34625bd8deadSopenharmony_ci        GL_INVALID_OPERATION error.
34635bd8deadSopenharmony_ci
34645bd8deadSopenharmony_ci        This is a consequence of the requirement that the target parameter
34655bd8deadSopenharmony_ci        must match the target of the named texture object.
34665bd8deadSopenharmony_ci
34675bd8deadSopenharmony_ci        Only the texture object name zero (which exists for all the
34685bd8deadSopenharmony_ci        supported texture targets, including proxies) exists as a
34695bd8deadSopenharmony_ci        proxy target.
34705bd8deadSopenharmony_ci
34715bd8deadSopenharmony_ci        This should work:
34725bd8deadSopenharmony_ci
34735bd8deadSopenharmony_ci          GLuint texobj = 0;
34745bd8deadSopenharmony_ci          GLint width;
34755bd8deadSopenharmony_ci          glTexureImage2D(texobj, GL_PROXY_TEXTURE_2D,
34765bd8deadSopenharmony_ci                          0, GL_RGB, 32, 32, 0, GL_RGB,
34775bd8deadSopenharmony_ci                          GL_UNSIGNED_BYTE, image);
34785bd8deadSopenharmony_ci          glGetTextureLevelParameterivEXT(texobj, GL_PROXY_TEXTURE_2D,
34795bd8deadSopenharmony_ci                                          GL_TEXTURE_WIDTH, &width)
34805bd8deadSopenharmony_ci          if (width > 0) {
34815bd8deadSopenharmony_ci             // 32x32 RGB texture supported by implementation
34825bd8deadSopenharmony_ci          } else {
34835bd8deadSopenharmony_ci             // 32x32 RGB texture NOT supported by implementation
34845bd8deadSopenharmony_ci          }
34855bd8deadSopenharmony_ci
34865bd8deadSopenharmony_ci        This same code would generate a GL_INVALID_OPERATION error if
34875bd8deadSopenharmony_ci        texobj was a non-zero value.
34885bd8deadSopenharmony_ci
34895bd8deadSopenharmony_ci   (14) What does glClientAttribDefaultEXT(GL_CLIENT_PIXEL_STORE_BIT) do?
34905bd8deadSopenharmony_ci
34915bd8deadSopenharmony_ci        RESOLVED:  It is equivalent to:
34925bd8deadSopenharmony_ci
34935bd8deadSopenharmony_ci          glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
34945bd8deadSopenharmony_ci          glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
34955bd8deadSopenharmony_ci          glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0);
34965bd8deadSopenharmony_ci          glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0);
34975bd8deadSopenharmony_ci          glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
34985bd8deadSopenharmony_ci          glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
34995bd8deadSopenharmony_ci          glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
35005bd8deadSopenharmony_ci          glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
35015bd8deadSopenharmony_ci          glPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE);
35025bd8deadSopenharmony_ci          glPixelStorei(GL_PACK_LSB_FIRST, GL_FALSE);
35035bd8deadSopenharmony_ci          glPixelStorei(GL_PACK_IMAGE_HEIGHT, 0);
35045bd8deadSopenharmony_ci          glPixelStorei(GL_PACK_SKIP_IMAGES, 0);
35055bd8deadSopenharmony_ci          glPixelStorei(GL_PACK_ROW_LENGTH, 0);
35065bd8deadSopenharmony_ci          glPixelStorei(GL_PACK_SKIP_ROWS, 0);
35075bd8deadSopenharmony_ci          glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
35085bd8deadSopenharmony_ci          glPixelStorei(GL_PACK_ALIGNMENT, 4);
35095bd8deadSopenharmony_ci
35105bd8deadSopenharmony_ci          glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
35115bd8deadSopenharmony_ci          glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
35125bd8deadSopenharmony_ci
35135bd8deadSopenharmony_ci        Note both the pack and unpack state are set to their initial
35145bd8deadSopenharmony_ci        values.
35155bd8deadSopenharmony_ci
35165bd8deadSopenharmony_ci        Keep in mind that the initial unpack/pack alignment of 4, while
35175bd8deadSopenharmony_ci        the specified initial value, is often surprising to OpenGL
35185bd8deadSopenharmony_ci        developers who expect the alignment to be 1.
35195bd8deadSopenharmony_ci
35205bd8deadSopenharmony_ci   (15) What does glClientAttribDefaultEXT(GL_CLIENT_VERTEX_ARRAY_BIT) do?
35215bd8deadSopenharmony_ci
35225bd8deadSopenharmony_ci        RESOLVED:  It is equivalent to:
35235bd8deadSopenharmony_ci
35245bd8deadSopenharmony_ci          int i;
35255bd8deadSopenharmony_ci          GLint max;
35265bd8deadSopenharmony_ci
35275bd8deadSopenharmony_ci          glBindBuffer(GL_ARRAY_BUFFER, 0);
35285bd8deadSopenharmony_ci          glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
35295bd8deadSopenharmony_ci
35305bd8deadSopenharmony_ci          glDisableClientState(GL_EDGE_FLAG_ARRAY);
35315bd8deadSopenharmony_ci          glEdgePointer(0, 0);
35325bd8deadSopenharmony_ci
35335bd8deadSopenharmony_ci          glDisableClientState(GL_INDEX_ARRAY);
35345bd8deadSopenharmony_ci          glIndexPointer(GL_FLOAT, 0, 0);
35355bd8deadSopenharmony_ci
35365bd8deadSopenharmony_ci          glDisableClientState(GL_SECONDARY_COLOR_ARRAY);
35375bd8deadSopenharmony_ci          glSecondaryColorPointer(4, GL_FLOAT, 0, 0);
35385bd8deadSopenharmony_ci
35395bd8deadSopenharmony_ci          glDisableClientState(GL_FOG_COORD_ARRAY);
35405bd8deadSopenharmony_ci          glFogCoordPointer(GL_FLOAT, 0, 0);
35415bd8deadSopenharmony_ci
35425bd8deadSopenharmony_ci          glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max);
35435bd8deadSopenharmony_ci          for (i=0; i<max; i++) {
35445bd8deadSopenharmony_ci            glClientActiveTexture(GL_TEXTURE0 + i);
35455bd8deadSopenharmony_ci            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
35465bd8deadSopenharmony_ci            glTexCoordPointer(4, GL_FLOAT, 0, 0);
35475bd8deadSopenharmony_ci          }
35485bd8deadSopenharmony_ci
35495bd8deadSopenharmony_ci          glDisableClientState(GL_COLOR_ARRAY);
35505bd8deadSopenharmony_ci          glColorPointer(4, GL_FLOAT, 0, 0);
35515bd8deadSopenharmony_ci
35525bd8deadSopenharmony_ci          glDisableClientState(GL_NORMAL_ARRAY);
35535bd8deadSopenharmony_ci          glNormalPointer(GL_FLOAT, 0, 0);
35545bd8deadSopenharmony_ci
35555bd8deadSopenharmony_ci          glDisableClientState(GL_VERTEX_ARRAY);
35565bd8deadSopenharmony_ci          glVertexPointer(4, GL_FLOAT, 0, 0);
35575bd8deadSopenharmony_ci
35585bd8deadSopenharmony_ci          glDisableClientState(GL_WEIGHT_ARRAY_ARB);
35595bd8deadSopenharmony_ci          glWeightPointerARB(0, GL_FLOAT, 0, 0);
35605bd8deadSopenharmony_ci
35615bd8deadSopenharmony_ci          glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max);
35625bd8deadSopenharmony_ci          for (i=0; i<max; i++) {
35635bd8deadSopenharmony_ci            glDisableVertexAttribArray(i);
35645bd8deadSopenharmony_ci            glVertexAttribPointer(i, 4, GL_FLOAT, GL_FALSE, 0, 0);
35655bd8deadSopenharmony_ci          }
35665bd8deadSopenharmony_ci
35675bd8deadSopenharmony_ci          glClientActiveTexture(GL_TEXTURE0);
35685bd8deadSopenharmony_ci
35695bd8deadSopenharmony_ci        Keep in mind the initial state of the vertex array enable
35705bd8deadSopenharmony_ci        is disabled.  Applications will typically at least
35715bd8deadSopenharmony_ci        want glEnableClientState(GL_VERTEX_ARRAY) called after
35725bd8deadSopenharmony_ci        glClientAttribDefaultEXT(GL_CLIENT_VERTEX_ARRAY_BIT) for this
35735bd8deadSopenharmony_ci        reason.
35745bd8deadSopenharmony_ci
35755bd8deadSopenharmony_ci   (16) Should glGetFloatIndexedvEXT and glGetDoubleIndexedvEXT return
35765bd8deadSopenharmony_ci        values for non-texture state parameters similar to the parameters
35775bd8deadSopenharmony_ci        that work for glGetIntegerIndexedvEXT and glGetBooleanIndexedvEXT
35785bd8deadSopenharmony_ci        that EXT_draw_buffers2, EXT_transform_feedback, and
35795bd8deadSopenharmony_ci        NV_transform_feedback support?
35805bd8deadSopenharmony_ci
35815bd8deadSopenharmony_ci        RESOLVED:  glGetFloatIndexedvEXT and glGetDoubleIndexedvEXT
35825bd8deadSopenharmony_ci        should accept without error parameter tokens supported
35835bd8deadSopenharmony_ci        by glGetIntegerIndexedvEXT and glGetBooleanIndexedvEXT
35845bd8deadSopenharmony_ci        through the EXT_draw_buffers2, EXT_transform_feedback, and
35855bd8deadSopenharmony_ci        NV_transform_feedback extensions.  In these cases, GLfloat or
35865bd8deadSopenharmony_ci        GLdouble values respectively of the indexed state should be
35875bd8deadSopenharmony_ci        returned.
35885bd8deadSopenharmony_ci
35895bd8deadSopenharmony_ci        The EXT_draw_buffers2 extension specifically considered adding
35905bd8deadSopenharmony_ci        glGetFloatIndexedvEXT and glGetDoubleIndexedvEXT queries but
35915bd8deadSopenharmony_ci        left them out since none of the indexed state introduced was
35925bd8deadSopenharmony_ci        floating-point.  This extension adds floating-point indexed state
35935bd8deadSopenharmony_ci        and so adds glGetFloatIndexedvEXT and glGetDoubleIndexedvEXT
35945bd8deadSopenharmony_ci        and thereby enhances the functionality of these unrelated
35955bd8deadSopenharmony_ci        extensions supporting glGetIndexedv, etc. by introducing
35965bd8deadSopenharmony_ci        glGetFloatIndexedvEXT and glGetDoubleIndexedvEXT and expecting
35975bd8deadSopenharmony_ci        them to operate consistently with glGetIntegerIndexedvEXT except
35985bd8deadSopenharmony_ci        returning GLfloat and GLdouble versions of the queried state
35995bd8deadSopenharmony_ci        respectively.
36005bd8deadSopenharmony_ci
36015bd8deadSopenharmony_ci        Following the OpenGL 3.0 function naming convention for indexed
36025bd8deadSopenharmony_ci        state, version 1.1 of this specification adds glGetFloati_vEXT
36035bd8deadSopenharmony_ci        and glGetDoublei_vEXT queries.
36045bd8deadSopenharmony_ci
36055bd8deadSopenharmony_ci   (17) Should there be a selector-free way to query the "program"
36065bd8deadSopenharmony_ci        matrices introduced by ARB_vertex_program?
36075bd8deadSopenharmony_ci
36085bd8deadSopenharmony_ci        RESOLVED:  Yes.  The GL_PROGRAM_MATRIX_EXT,
36095bd8deadSopenharmony_ci        GL_TRANSPOSE_PROGRAM_MATRIX_EXT, and
36105bd8deadSopenharmony_ci        GL_PROGRAM_MATRIX_STACK_DEPTH_EXT tokens supported by
36115bd8deadSopenharmony_ci        glGetFloati_vEXT, glGetFloatIndexedvEXT, etc. query the program
36125bd8deadSopenharmony_ci        matrices specified by GL_MATRIX0_ARB, etc.
36135bd8deadSopenharmony_ci
36145bd8deadSopenharmony_ci        The ARB_vertex_program (and NV_vertex_program) introduced the
36155bd8deadSopenharmony_ci        GL_CURRENT_MATRIX_ARB, GL_TRANSPOSE_CURRENT_MATRIX_ARB, and
36165bd8deadSopenharmony_ci        GL_CURRENT_MATRIX_STACK_DEPTH_ARB query tokens to get back the
36175bd8deadSopenharmony_ci        current matrix based on the glMatrixMode state.  This avoided
36185bd8deadSopenharmony_ci        adding a large set of tokens to query the matrix, transpose
36195bd8deadSopenharmony_ci        matrix, and matrix stack depth for all the program matrices.
36205bd8deadSopenharmony_ci        But this made querying these matrices always dependent on the
36215bd8deadSopenharmony_ci        matrix mode selector.  The indexed glGet queries are allow
36225bd8deadSopenharmony_ci        indexed access to the program matrices but the above new query
36235bd8deadSopenharmony_ci        tokens must be added for this purpose.
36245bd8deadSopenharmony_ci
36255bd8deadSopenharmony_ci   (18) How does this extension interact with APPLE_vertex_array_object?
36265bd8deadSopenharmony_ci
36275bd8deadSopenharmony_ci        RESOLVED:  The VERTEX_ARRAY_BINDING_APPLE state is
36285bd8deadSopenharmony_ci        client vertex-array state so glClientAttribDefaultEXT and
36295bd8deadSopenharmony_ci        glPushClientAttribDefaultEXT should, when their mask parameter has
36305bd8deadSopenharmony_ci        CLIENT_VERTEX_ARRAY_BIT set, set the VERTEX_ARRAY_BINDING_APPLE
36315bd8deadSopenharmony_ci        state to its initial value of zero.
36325bd8deadSopenharmony_ci
36335bd8deadSopenharmony_ci        This could go unsaid if the APPLE_vertex_array_object
36345bd8deadSopenharmony_ci        specification explicitly listed the VERTEX_ARRAY_BINDING_APPLE
36355bd8deadSopenharmony_ci        state in one of tables 6.6, 6.7, and 6.8.
36365bd8deadSopenharmony_ci
36375bd8deadSopenharmony_ci   (19) glGetProgramivARB queries per-program state corresponding to
36385bd8deadSopenharmony_ci        the current program for the specified target but also queries
36395bd8deadSopenharmony_ci        per-target state.  Should glGetNamedProgramivEXT return
36405bd8deadSopenharmony_ci        only per-program state and not per-target state?  Or should
36415bd8deadSopenharmony_ci        glGetNamedProgramivEXT return both per-program and per-target
36425bd8deadSopenharmony_ci        state?
36435bd8deadSopenharmony_ci
36445bd8deadSopenharmony_ci        RESOLVED:  glGetNamedProgramivEXT should accept the same pname
36455bd8deadSopenharmony_ci        parameters as glGetProgramivARB and thus should handle BOTH
36465bd8deadSopenharmony_ci        per-program AND per-target queries.
36475bd8deadSopenharmony_ci
36485bd8deadSopenharmony_ci        However glGetNamedProgramivEXT does require the specified
36495bd8deadSopenharmony_ci        program object's target must match the specified (supported)
36505bd8deadSopenharmony_ci        target parameter otherwise an INVALID_OPERATION error occurs.
36515bd8deadSopenharmony_ci        Program object zero applies to all program targets so specifying
36525bd8deadSopenharmony_ci        program object zero avoids the possibility of this error.
36535bd8deadSopenharmony_ci
36545bd8deadSopenharmony_ci        This resolution avoids having to keep a list of allowed
36555bd8deadSopenharmony_ci        per-program vs. disallowed per-target tokens up-to-date with
36565bd8deadSopenharmony_ci        future extensions.
36575bd8deadSopenharmony_ci
36585bd8deadSopenharmony_ci        The ARB_vertex_program and ARB_fragment_program per-target
36595bd8deadSopenharmony_ci        program query tokens are GL_PROGRAM_BINDING_ARB,
36605bd8deadSopenharmony_ci        GL_MAX_PROGRAM_ENV_PARAMETERS_ARB,
36615bd8deadSopenharmony_ci        GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB,
36625bd8deadSopenharmony_ci        GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB,
36635bd8deadSopenharmony_ci        GL_MAX_PROGRAM_INSTRUCTIONS_ARB,
36645bd8deadSopenharmony_ci        GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB,
36655bd8deadSopenharmony_ci        GL_MAX_PROGRAM_TEMPORARIES_ARB,
36665bd8deadSopenharmony_ci        GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB,
36675bd8deadSopenharmony_ci        GL_MAX_PROGRAM_PARAMETERS_ARB,
36685bd8deadSopenharmony_ci        GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB, GL_MAX_PROGRAM_ATTRIBS_ARB,
36695bd8deadSopenharmony_ci        GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB,
36705bd8deadSopenharmony_ci        GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB,
36715bd8deadSopenharmony_ci        GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB,
36725bd8deadSopenharmony_ci        GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB,
36735bd8deadSopenharmony_ci        GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB,
36745bd8deadSopenharmony_ci        GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB,
36755bd8deadSopenharmony_ci        GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB,
36765bd8deadSopenharmony_ci        GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB,
36775bd8deadSopenharmony_ci        GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV, GL_MAX_PROGRAM_CALL_DEPTH_NV,
36785bd8deadSopenharmony_ci        GL_MAX_PROGRAM_IF_DEPTH_NV, GL_MAX_PROGRAM_LOOP_DEPTH_NV,
36795bd8deadSopenharmony_ci        GL_MAX_PROGRAM_LOOP_COUNT_NV.  The NV_gpu_program4
36805bd8deadSopenharmony_ci        extension adds GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV,
36815bd8deadSopenharmony_ci        GL_MAX_PROGRAM_RESULT_COMPONENTS_NV,
36825bd8deadSopenharmony_ci        GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV,
36835bd8deadSopenharmony_ci        GL_MAX_PROGRAM_GENERIC_RESULTS_NV,
36845bd8deadSopenharmony_ci        GL_MAX_PROGRAM_OUTPUT_VERTICES_NV and
36855bd8deadSopenharmony_ci        GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV.
36865bd8deadSopenharmony_ci        The NV_parameter_buffer_object extension adds
36875bd8deadSopenharmony_ci        GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV and
36885bd8deadSopenharmony_ci        GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV.
36895bd8deadSopenharmony_ci
36905bd8deadSopenharmony_ci        The ARB_vertex_program and ARB_fragment_program per-program
36915bd8deadSopenharmony_ci        program query tokens are GL_PROGRAM_LENGTH_ARB,
36925bd8deadSopenharmony_ci        GL_PROGRAM_FORMAT_ARB, GL_PROGRAM_INSTRUCTIONS_ARB,
36935bd8deadSopenharmony_ci        GL_PROGRAM_TEMPORARIES_ARB, GL_PROGRAM_PARAMETERS_ARB,
36945bd8deadSopenharmony_ci        GL_PROGRAM_ATTRIBS_ARB, GL_PROGRAM_ADDRESS_REGISTERS_ARB,
36955bd8deadSopenharmony_ci        GL_PROGRAM_ALU_INSTRUCTIONS_ARB, GL_PROGRAM_TEX_INSTRUCTIONS_ARB,
36965bd8deadSopenharmony_ci        GL_PROGRAM_TEX_INDIRECTIONS_ARB,
36975bd8deadSopenharmony_ci        GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB,
36985bd8deadSopenharmony_ci        GL_PROGRAM_NATIVE_TEMPORARIES_ARB,
36995bd8deadSopenharmony_ci        GL_PROGRAM_NATIVE_PARAMETERS_ARB, GL_PROGRAM_NATIVE_ATTRIBS_ARB,
37005bd8deadSopenharmony_ci        GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB,
37015bd8deadSopenharmony_ci        GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB,
37025bd8deadSopenharmony_ci        GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB,
37035bd8deadSopenharmony_ci        GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB, and
37045bd8deadSopenharmony_ci        GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB.
37055bd8deadSopenharmony_ci        The NV_gpu_program4 extension adds GL_GEOMETRY_VERTICES_OUT_EXT,
37065bd8deadSopenharmony_ci        GL_GEOMETRY_INPUT_TYPE_EXT, GL_GEOMETRY_OUTPUT_TYPE_EXT,
37075bd8deadSopenharmony_ci        GL_PROGRAM_ATTRIB_COMPONENTS_NV, and
37085bd8deadSopenharmony_ci        GL_PROGRAM_RESULT_COMPONENTS_NV.
37095bd8deadSopenharmony_ci
37105bd8deadSopenharmony_ci   (20) When multiple contexts are sharing objects such as textures,
37115bd8deadSopenharmony_ci        programs, and/or buffers what expectations exist for when other
37125bd8deadSopenharmony_ci        contexts will see the state updates to textures, programs,
37135bd8deadSopenharmony_ci        and buffers manipulated by this extension?
37145bd8deadSopenharmony_ci
37155bd8deadSopenharmony_ci        RESOLVED:  This extension doesn't change the expected semantics
37165bd8deadSopenharmony_ci        for multiple context sharing objects within a share group, but
37175bd8deadSopenharmony_ci        this is an appropriate place to document these expectations for
37185bd8deadSopenharmony_ci        both developers and implementers.
37195bd8deadSopenharmony_ci
37205bd8deadSopenharmony_ci        Object state updates are visible in two ways:  1) queries return
37215bd8deadSopenharmony_ci        the current (most recently updated) state, and 2) rendering
37225bd8deadSopenharmony_ci        results are affected by the updated state.
37235bd8deadSopenharmony_ci
37245bd8deadSopenharmony_ci        When a context updates objects, that updating context must observe
37255bd8deadSopenharmony_ci        those updates immediately for both queries and rendering results.
37265bd8deadSopenharmony_ci        This is a strong requirement for "sequential consistency" of
37275bd8deadSopenharmony_ci        updates and queries based on the context's own sequential stream
37285bd8deadSopenharmony_ci        of commands and queries.
37295bd8deadSopenharmony_ci
37305bd8deadSopenharmony_ci        Queries by other OpenGL rendering contexts in the same share
37315bd8deadSopenharmony_ci        group with a context updating some shared OpenGL object must
37325bd8deadSopenharmony_ci        observe the effect of another context's update with "transactional
37335bd8deadSopenharmony_ci        consistency".  Program state updates and queries are treated as
37345bd8deadSopenharmony_ci        "transactions" that must be consistent with some serialized order.
37355bd8deadSopenharmony_ci        Implementations typically achieved this by guaranteeing mutual
37365bd8deadSopenharmony_ci        exclusion for all object updates and queries.  This is a strong
37375bd8deadSopenharmony_ci        consistency requirement.
37385bd8deadSopenharmony_ci
37395bd8deadSopenharmony_ci        Rendering results based on updated state are subject to a
37405bd8deadSopenharmony_ci        weaker consistency requirement.  Rendering results by other
37415bd8deadSopenharmony_ci        OpenGL rendering contexts in the same share group with a context
37425bd8deadSopenharmony_ci        updating some shared OpenGL object may see a stale version of
37435bd8deadSopenharmony_ci        the object's state if the those contexts sharing the object are
37445bd8deadSopenharmony_ci        bound to the object when the state update occurs.
37455bd8deadSopenharmony_ci
37465bd8deadSopenharmony_ci        Even so, the stale values of the object's state must always
37475bd8deadSopenharmony_ci        represent a consistent state of the object transactionally
37485bd8deadSopenharmony_ci        consistent when the object was last "bound" or otherwise used
37495bd8deadSopenharmony_ci        for rendering.  We refer to this weaker consistency as "bind
37505bd8deadSopenharmony_ci        consistency".
37515bd8deadSopenharmony_ci
37525bd8deadSopenharmony_ci        This requirement means, for example, a texture object should NEVER
37535bd8deadSopenharmony_ci        observe the red and green components to be from one state update
37545bd8deadSopenharmony_ci        while the red and alpha components correspond to a subsequent
37555bd8deadSopenharmony_ci        state update.
37565bd8deadSopenharmony_ci
37575bd8deadSopenharmony_ci        A context other than the context performing an update is
37585bd8deadSopenharmony_ci        guaranteed to see a "transactional consistent" view of an
37595bd8deadSopenharmony_ci        object's state when the context next processes a command to bind
37605bd8deadSopenharmony_ci        or otherwise "use" an object for rendering.  However if the
37615bd8deadSopenharmony_ci        object being updated is currently bound or "used" by another
37625bd8deadSopenharmony_ci        context, when this update is observed is not well-defined.
37635bd8deadSopenharmony_ci        So to guarantee an up-to-date version of a bound object's state,
37645bd8deadSopenharmony_ci        the context must re-bind to the updated object.
37655bd8deadSopenharmony_ci
37665bd8deadSopenharmony_ci        (UNRESOLVED:  Should a re-bind require binding to a different
37675bd8deadSopenharmony_ci        object and then binding back to the object, or is simply rebinding
37685bd8deadSopenharmony_ci        to the same name already bound enough?  As a performance
37695bd8deadSopenharmony_ci        optimization, an OpenGL implementation may treat binding to
37705bd8deadSopenharmony_ci        an already bound object as a no-op.  However it would be nice
37715bd8deadSopenharmony_ci        if binding to any already bound object at least checked if the
37725bd8deadSopenharmony_ci        object had been updated since the last bind and, if an update
37735bd8deadSopenharmony_ci        has occurred, update the context's view of the object used for
37745bd8deadSopenharmony_ci        rendering.)
37755bd8deadSopenharmony_ci
37765bd8deadSopenharmony_ci        Some examples (with serialized order shown):
37775bd8deadSopenharmony_ci
37785bd8deadSopenharmony_ci        Sequential consistency for one thread:
37795bd8deadSopenharmony_ci
37805bd8deadSopenharmony_ci            thread A:
37815bd8deadSopenharmony_ci                glBindMultiTextureEXT(GL_TEXTURE1, GL_TEXTURE_2D, 23);
37825bd8deadSopenharmony_ci                glEnablei(GL_TEXTURE_2D, 1);
37835bd8deadSopenharmony_ci                glTextureParameterivEXT(23, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
37845bd8deadSopenharmony_ci                glDrawElements(...); // first render
37855bd8deadSopenharmony_ci                glTextureParameterivEXT(23, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
37865bd8deadSopenharmony_ci                glDrawElements(...); // second render
37875bd8deadSopenharmony_ci
37885bd8deadSopenharmony_ci        The first render must observer texture 23 using GL_LINEAR
37895bd8deadSopenharmony_ci        minification filtering while the second render must observe
37905bd8deadSopenharmony_ci        GL_NEAREST minification filtering.
37915bd8deadSopenharmony_ci
37925bd8deadSopenharmony_ci        Transactional consistency for queries by multiple sharing
37935bd8deadSopenharmony_ci        contexts:
37945bd8deadSopenharmony_ci
37955bd8deadSopenharmony_ci            thread A:
37965bd8deadSopenharmony_ci                glTextureParameteriv(23, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
37975bd8deadSopenharmony_ci                glGetTextureParameteriv(23, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &geti1);
37985bd8deadSopenharmony_ci            thread B:
37995bd8deadSopenharmony_ci                glTextureParameteriv(23, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
38005bd8deadSopenharmony_ci            thread A:
38015bd8deadSopenharmony_ci                glGetTextureParameteriv(23, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &geti2);
38025bd8deadSopenharmony_ci
38035bd8deadSopenharmony_ci        geti1 should return GL_LINEAR bug geti2 should return GL_NEAREST.
38045bd8deadSopenharmony_ci
38055bd8deadSopenharmony_ci        Bind consistency for rendering by multiple sharing contexts:
38065bd8deadSopenharmony_ci
38075bd8deadSopenharmony_ci            thread A:
38085bd8deadSopenharmony_ci                glBindMultiTextureEXT(GL_TEXTURE1, GL_TEXTURE_2D, 23);
38095bd8deadSopenharmony_ci                glEnablei(GL_TEXTURE_2D, 1);
38105bd8deadSopenharmony_ci                glTextureParameterivEXT(23, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
38115bd8deadSopenharmony_ci            thread B:
38125bd8deadSopenharmony_ci                glTextureParameterivEXT(23, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
38135bd8deadSopenharmony_ci            thread A:
38145bd8deadSopenharmony_ci                glDrawElements(...); // first render
38155bd8deadSopenharmony_ci                glBindMultiTextureEXT(GL_TEXTURE1, GL_TEXTURE_2D, 23);
38165bd8deadSopenharmony_ci                glDrawElements(...); // second render
38175bd8deadSopenharmony_ci
38185bd8deadSopenharmony_ci        The first render may or may not observe the minification
38195bd8deadSopenharmony_ci        filter be set to GL_NEAREST; an implementation could use the
38205bd8deadSopenharmony_ci        stale GL_LINEAR state.  The second render should observe the
38215bd8deadSopenharmony_ci        minification filter be set to GL_NEAREST.
38225bd8deadSopenharmony_ci
38235bd8deadSopenharmony_ci        Perhaps a bind away might be required for consistency, binding
38245bd8deadSopenharmony_ci        away from 23, then back to 23:
38255bd8deadSopenharmony_ci
38265bd8deadSopenharmony_ci            thread A:
38275bd8deadSopenharmony_ci                glBindMultiTextureEXT(GL_TEXTURE1, GL_TEXTURE_2D, 0);
38285bd8deadSopenharmony_ci                glBindMultiTextureEXT(GL_TEXTURE1, GL_TEXTURE_2D, 23);
38295bd8deadSopenharmony_ci                glDrawElements(...); // second render
38305bd8deadSopenharmony_ci
38315bd8deadSopenharmony_ci   (20) Should direct access commands and queries be added for
38325bd8deadSopenharmony_ci        renderbuffer and framebuffer objects?
38335bd8deadSopenharmony_ci
38345bd8deadSopenharmony_ci        RESOLVED:  Yes.
38355bd8deadSopenharmony_ci
38365bd8deadSopenharmony_ci        These should be added for completeness.
38375bd8deadSopenharmony_ci
38385bd8deadSopenharmony_ci   (21) Should the Named framebuffer and renderbuffer object commands take
38395bd8deadSopenharmony_ci        a target parameter in addition to the initial GLuint
38405bd8deadSopenharmony_ci        framebuffer/renderbuffer parameter?
38415bd8deadSopenharmony_ci
38425bd8deadSopenharmony_ci        RESOLVED:  No, except for CheckNamedFramebufferStatusEXT (see
38435bd8deadSopenharmony_ci        the next issue).
38445bd8deadSopenharmony_ci
38455bd8deadSopenharmony_ci        The rationale for including a target parameter for the texture
38465bd8deadSopenharmony_ci        commands is that the default texture object zero and cube map
38475bd8deadSopenharmony_ci        face targets need the target for disambiguation.
38485bd8deadSopenharmony_ci
38495bd8deadSopenharmony_ci        Likewise assembly programs needs a target parameter to know
38505bd8deadSopenharmony_ci        how source text should be parsed, etc.  Programs really have
38515bd8deadSopenharmony_ci        different target types (vertex, geometry, fragment).
38525bd8deadSopenharmony_ci
38535bd8deadSopenharmony_ci        Buffer objects do not include a target parameter in their Named
38545bd8deadSopenharmony_ci        commands because the target identifies the binding point for the
38555bd8deadSopenharmony_ci        buffer while buffers themselves do not have a target type so the
38565bd8deadSopenharmony_ci        target is relevant for binding buffers, but not accessing buffers.
38575bd8deadSopenharmony_ci
38585bd8deadSopenharmony_ci        The only legal values for target or RENDERBUFFER and
38595bd8deadSopenharmony_ci        FRAMEBUFFER respectively so there is really one type of
38605bd8deadSopenharmony_ci        renderbuffer and framebuffer respectively.
38615bd8deadSopenharmony_ci
38625bd8deadSopenharmony_ci        The target parameter could be used by future extensions but
38635bd8deadSopenharmony_ci        so far the several extensions that extend framebuffer and
38645bd8deadSopenharmony_ci        renderbuffer objects already (EXT_framebuffer_multisample,
38655bd8deadSopenharmony_ci        NV_framebuffer_multisample_coverage, EXT_geometry_shader4,
38665bd8deadSopenharmony_ci        and NV_gpu_program4) maintain a single legal framebuffer and
38675bd8deadSopenharmony_ci        renderbuffer target value.
38685bd8deadSopenharmony_ci
38695bd8deadSopenharmony_ci        This does not preclude new binding targets for renderbuffer or
38705bd8deadSopenharmony_ci        framebuffers in the way buffer objects support lots of binding
38715bd8deadSopenharmony_ci        targets but buffers themselves are target-free (unlike textures
38725bd8deadSopenharmony_ci        and programs).
38735bd8deadSopenharmony_ci
38745bd8deadSopenharmony_ci   (22) How should the target parameter work for
38755bd8deadSopenharmony_ci        glCheckNamedFramebufferStatusEXT?
38765bd8deadSopenharmony_ci
38775bd8deadSopenharmony_ci        RESOLVED:  The target parameter determines whether the status
38785bd8deadSopenharmony_ci        check is for reading or drawing.
38795bd8deadSopenharmony_ci
38805bd8deadSopenharmony_ci        OpenGL 3.0 (by incorporating the EXT_framebuffer_blit extension)
38815bd8deadSopenharmony_ci        introduces GL_DRAW_FRAMEBUFFER and GL_READ_FRAMEBUFFER targets.
38825bd8deadSopenharmony_ci        A framebuffer object may be supported for drawing but perhaps
38835bd8deadSopenharmony_ci        not reading (or vice versa).  glCheckNamedFramebufferStatusEXT
38845bd8deadSopenharmony_ci        uses its target parameter to determine whether the check is for
38855bd8deadSopenharmony_ci        reading or writing.
38865bd8deadSopenharmony_ci
38875bd8deadSopenharmony_ci        Because glCheckFramebufferStatus allows for "an
38885bd8deadSopenharmony_ci        implementation-dependent set of restrictions" for
38895bd8deadSopenharmony_ci        which GL_FRAMEBUFFER_UNSUPPORTED may be returned,
38905bd8deadSopenharmony_ci        it is possible for glCheckNamedFramebufferStatusEXT
38915bd8deadSopenharmony_ci        to return GL_FRAMEBUFFER_COMPLETE when binding to
38925bd8deadSopenharmony_ci        the framebuffer object with glBindFramebuffer and
38935bd8deadSopenharmony_ci        then calling glCheckFramebufferStatus may generate
38945bd8deadSopenharmony_ci        GL_FRAMEBUFFER_COMPLETE may be returned, it is possible
38955bd8deadSopenharmony_ci        for glCheckNamedFramebufferStatusEXT could return still return
38965bd8deadSopenharmony_ci        GL_FRAMEBUFFER_UNSUPPORTED.
38975bd8deadSopenharmony_ci
38985bd8deadSopenharmony_ci        Despite this allowance, the intent here however is that an
38995bd8deadSopenharmony_ci        application should be able to create a framebuffer object and
39005bd8deadSopenharmony_ci        determine in most cases that a framebuffer object can be supported
39015bd8deadSopenharmony_ci        with glCheckNamedFramebufferStatusEXT.
39025bd8deadSopenharmony_ci
39035bd8deadSopenharmony_ci   (23) Do we need glFramebufferDrawBufferEXT, glFramebufferDrawBuffersEXT
39045bd8deadSopenharmony_ci        and glFramebufferReadBufferEXT commands?
39055bd8deadSopenharmony_ci
39065bd8deadSopenharmony_ci        UNRESOLVED:  Yes, add them.
39075bd8deadSopenharmony_ci
39085bd8deadSopenharmony_ci        The READ_BUFFER and DRAW_BUFFER state is per-framebuffer object
39095bd8deadSopenharmony_ci        and glDrawBuffers, glReadBuffer, and glDrawBuffer update the
39105bd8deadSopenharmony_ci        currently bound framebuffer object.  These commands use the
39115bd8deadSopenharmony_ci        current framebuffer object binding as a selector so there should
39125bd8deadSopenharmony_ci        be selector-free versions of this commands.
39135bd8deadSopenharmony_ci
39145bd8deadSopenharmony_ci        Since these commands didn't have Framebuffer in the name before,
39155bd8deadSopenharmony_ci        we avoid saying "NamedFramebuffer" in the commands.
39165bd8deadSopenharmony_ci
39175bd8deadSopenharmony_ci   (24) Should there be a selector-free way to query the Framebuffer
39185bd8deadSopenharmony_ci        Dependent Values (table 9.nnn) for a named framebuffer object?
39195bd8deadSopenharmony_ci
39205bd8deadSopenharmony_ci        RESOLVED:  No.
39215bd8deadSopenharmony_ci
39225bd8deadSopenharmony_ci        It makes sense to provide selector-free queries for API-settable
39235bd8deadSopenharmony_ci        state such as GL_READ_BUFFER, GL_DRAW_BUFFER, and GL_DRAW_BUFFERi
39245bd8deadSopenharmony_ci        but framebuffer dependent values of a framebuffer object state
39255bd8deadSopenharmony_ci        are really derived state value and depends on the status of a
39265bd8deadSopenharmony_ci        framebuffer object bind.
39275bd8deadSopenharmony_ci
39285bd8deadSopenharmony_ci        OpenGL 3.0 (by incorporating the EXT_framebuffer_object)
39295bd8deadSopenharmony_ci        describes per-framebuffer object state in its tables 4.nnn
39305bd8deadSopenharmony_ci        and 9.nnn.  The framebuffer object API allows this state to be
39315bd8deadSopenharmony_ci        queried with glGetIntegerv, etc. based on the current framebuffer
39325bd8deadSopenharmony_ci        object binding (a selector).  The glGetFramebufferParameteriv
39335bd8deadSopenharmony_ci        command queries table 4.nnn state, but not table 9.nnn state.
39345bd8deadSopenharmony_ci
39355bd8deadSopenharmony_ci        Issue #25 in the EXT_framebuffer_object specification is relevant
39365bd8deadSopenharmony_ci        here.  Issue #25 (the issue could be more clear...) indicates
39375bd8deadSopenharmony_ci        that zero may be returned if a given buffer is not attached
39385bd8deadSopenharmony_ci        (the case where the framebuffer object is inconsistent).
39395bd8deadSopenharmony_ci
39405bd8deadSopenharmony_ci        The GL_FRAMEBUFFER_UNSUPPORTED status can occur due to "an
39415bd8deadSopenharmony_ci        implementation-dependent set of restrictions".  Presumably these
39425bd8deadSopenharmony_ci        restrictions might not be evaluated until glBindFramebuffer
39435bd8deadSopenharmony_ci        time.  This blanket "didn't work" status means the appropriate
39445bd8deadSopenharmony_ci        per-framebuffer state may not be determined without binding to
39455bd8deadSopenharmony_ci        the framebuffer object.
39465bd8deadSopenharmony_ci
39475bd8deadSopenharmony_ci        A future revision of this specification (such as its integration
39485bd8deadSopenharmony_ci        into an FBO-enabled core specification) may wish to reconsider
39495bd8deadSopenharmony_ci        this issue and add table 9.nnn state to the state queriable by
39505bd8deadSopenharmony_ci        glGetFramebufferParameteriv.
39515bd8deadSopenharmony_ci
39525bd8deadSopenharmony_ci        If so, there should also be a query
39535bd8deadSopenharmony_ci        glGetFramebufferMultisamplefvEXT for NV_explicit_multisample
39545bd8deadSopenharmony_ci        for similar reasons. 
39555bd8deadSopenharmony_ci
39565bd8deadSopenharmony_ci            void GetFramebufferMultisamplefvEXT(uint framebuffer,
39575bd8deadSopenharmony_ci                                                enum pname, uint index,
39585bd8deadSopenharmony_ci                                                float *val);
39595bd8deadSopenharmony_ci
39605bd8deadSopenharmony_ci   (25) Should the selector-free versions of various OpenGL 3.0 and
39615bd8deadSopenharmony_ci        EXT_framebuffer_object framebuffer object commands not be allowed
39625bd8deadSopenharmony_ci        in display lists when the selector-based versions are specified
39635bd8deadSopenharmony_ci        to not be compiled into display lists?
39645bd8deadSopenharmony_ci
39655bd8deadSopenharmony_ci        RESOLVED:  Yes, keep this same restriction.
39665bd8deadSopenharmony_ci
39675bd8deadSopenharmony_ci        It is unfortunate that commands such as glGenerateMipmap
39685bd8deadSopenharmony_ci        are explicitly specified to not be compiled into display lists;
39695bd8deadSopenharmony_ci        this extension simply retains these same restrictions.
39705bd8deadSopenharmony_ci
39715bd8deadSopenharmony_ci   (26) Direct state access commands and queries can implicit object
39725bd8deadSopenharmony_ci        initialization when provided unused object names.  If implicit
39735bd8deadSopenharmony_ci        object initialization is required but the command would
39745bd8deadSopenharmony_ci        subsequently generate an error, should the object be initialized
39755bd8deadSopenharmony_ci        and the name now be used?
39765bd8deadSopenharmony_ci
39775bd8deadSopenharmony_ci        RESOLVED:  Yes, an object for an unused name can be initialized
39785bd8deadSopenharmony_ci        but if the command generates an error, the object should still
39795bd8deadSopenharmony_ci        be initialized and the name now used.
39805bd8deadSopenharmony_ci
39815bd8deadSopenharmony_ci        Most OpenGL commands (excepting GL_OUT_OF_MEMORY errors) are
39825bd8deadSopenharmony_ci        ignored if an error occurs.
39835bd8deadSopenharmony_ci
39845bd8deadSopenharmony_ci        Direct state access commands are an exception because they
39855bd8deadSopenharmony_ci        should be "morally equivalent" to doing a glBind* followed by
39865bd8deadSopenharmony_ci        the selector-based command.  For example:
39875bd8deadSopenharmony_ci
39885bd8deadSopenharmony_ci            GLuint update2D = 27;
39895bd8deadSopenharmony_ci            glTextureImage2D(update2D, GL_TEXTURE_2D, ...);
39905bd8deadSopenharmony_ci
39915bd8deadSopenharmony_ci        should be morally equivalent to:
39925bd8deadSopenharmony_ci
39935bd8deadSopenharmony_ci            GLuint update2D = 27;
39945bd8deadSopenharmony_ci            GLint bound2D;
39955bd8deadSopenharmony_ci            glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound2D);
39965bd8deadSopenharmony_ci            glBindTexture(GL_TEXTURE_2D, update2D);
39975bd8deadSopenharmony_ci            glTexImage2D(GL_TEXTURE_2D, ...);
39985bd8deadSopenharmony_ci            glBindTexture(GL_TEXTURE_2D, bound2D);
39995bd8deadSopenharmony_ci
40005bd8deadSopenharmony_ci        If the ... arguments to glTexImage2D and glTextureImage2D
40015bd8deadSopenharmony_ci        resulted in an error (say a GL_INVALID_ENUM), in both cases we
40025bd8deadSopenharmony_ci        want texture object 27 to exist after the sequence.
40035bd8deadSopenharmony_ci
40045bd8deadSopenharmony_ci        The rationale for this behavior is an application lacking
40055bd8deadSopenharmony_ci        EXT_direct_state_access should be able to generate equivalent
40065bd8deadSopenharmony_ci        command sequences and have "morally equivalent" error behavior.
40075bd8deadSopenharmony_ci
40085bd8deadSopenharmony_ci        It is deemed undesirable for an non-EXT_direct_state_access path
40095bd8deadSopenharmony_ci        to behave differently (initializing unused objects on glBind*)
40105bd8deadSopenharmony_ci        despite an error in the subsequent state-setting command or
40115bd8deadSopenharmony_ci        state-querying query.
40125bd8deadSopenharmony_ci
40135bd8deadSopenharmony_ci   (27) How many entry points are introduced?
40145bd8deadSopenharmony_ci
40155bd8deadSopenharmony_ci        This extension adds just 3 tokens but specifies 214 functions
40165bd8deadSopenharmony_ci        (192 for version 1.0 plus 22 for OpenGL 3.0 support added by
40175bd8deadSopenharmony_ci        version 1.1).
40185bd8deadSopenharmony_ci
40195bd8deadSopenharmony_ci        Technically 5 of these functions were previously introduced by
40205bd8deadSopenharmony_ci        EXT_draw_buffers2 and are now part of OpenGL 3.0.
40215bd8deadSopenharmony_ci
40225bd8deadSopenharmony_ci        OpenGL 2.1 and 3.0 contains 583 and 666 functions respectively.
40235bd8deadSopenharmony_ci        So the OpenGL 2.1 subset of EXT_direct_state_access is +22%
40245bd8deadSopenharmony_ci        more functions beyond OpenGL 2.1's function set.
40255bd8deadSopenharmony_ci
40265bd8deadSopenharmony_ci        By comparison, OpenGL 2.0 added 93 functions (primarily for GLSL
40275bd8deadSopenharmony_ci        support) to OpenGL 1.5's 484 functions, a +19% increase in the
40285bd8deadSopenharmony_ci        function set.  OpenGL 3.0 added 83 new functions.
40295bd8deadSopenharmony_ci
40305bd8deadSopenharmony_ci        OpenGL's immediate mode API function count is considerably
40315bd8deadSopenharmony_ci        larger than the number of EXT_direct_state_access functions.
40325bd8deadSopenharmony_ci        There are 212 "vertex attribute" functions (counting all core
40335bd8deadSopenharmony_ci        OpenGL 2.1 glVertex*, glColor*, glSecondaryColor*, glNormal*,
40345bd8deadSopenharmony_ci        glTexCoord*, glMultiTexCoord*, glVertexAttrib*, glMaterial*,
40355bd8deadSopenharmony_ci        glRasterPos*, and glWindowPos* variants).
40365bd8deadSopenharmony_ci
40375bd8deadSopenharmony_ci        So the core EXT_direct_state_access function count is 63% of
40385bd8deadSopenharmony_ci        the count of core OpenGL 2.1 "vertex attribute" functions.
40395bd8deadSopenharmony_ci
40405bd8deadSopenharmony_ci        Another way to measure the footprint of EXT_direct_state_access
40415bd8deadSopenharmony_ci        is in terms of the optimized compiled user-space driver
40425bd8deadSopenharmony_ci        the size (text+data) of a modern Windows XP OpenGL driver
40435bd8deadSopenharmony_ci        supporting EXT_direct_state_access compared to the same
40445bd8deadSopenharmony_ci        driver without EXT_direct_state_access supported compiled in.
40455bd8deadSopenharmony_ci        The EXT_direct_state_access driver is +2.5% larger.
40465bd8deadSopenharmony_ci
40475bd8deadSopenharmony_ci   (28) How should vertex array objects be supported?
40485bd8deadSopenharmony_ci
40495bd8deadSopenharmony_ci        RESOLVED:  The EXT version of this specification didn't provide
40505bd8deadSopenharmony_ci        interactions with the glVertexArrayBindAPPLE selector introduced
40515bd8deadSopenharmony_ci        by the APPLE_vertex_buffer_object extension.  Now that this
40525bd8deadSopenharmony_ci        extension is incorporated into OpenGL 3.0, it makes sense for
40535bd8deadSopenharmony_ci        an ARB extension to incorporate selector-free support for vertex
40545bd8deadSopenharmony_ci        buffer objects.
40555bd8deadSopenharmony_ci
40565bd8deadSopenharmony_ci        Selector-free versions of the vertex array specification commands
40575bd8deadSopenharmony_ci        are of the form (using glColorPointer as an example):
40585bd8deadSopenharmony_ci
40595bd8deadSopenharmony_ci            void glVertexArrayColorOffsetEXT(uint vaobj, uint buffer,
40605bd8deadSopenharmony_ci                                             int size, enum type, sizei stride,
40615bd8deadSopenharmony_ci                                             intptr offset);
40625bd8deadSopenharmony_ci
40635bd8deadSopenharmony_ci        There are two initial parameter for both the vertex array
40645bd8deadSopenharmony_ci        object selector (vaobj) and the latched buffer state (buffer).
40655bd8deadSopenharmony_ci
40665bd8deadSopenharmony_ci        The vaobj parameter is needed for the commands to be
40675bd8deadSopenharmony_ci        selector-free.  The latched buffer is an explicit parameter to
40685bd8deadSopenharmony_ci        avoid having disturb the GL_ARRAY_BUFFER selector.
40695bd8deadSopenharmony_ci
40705bd8deadSopenharmony_ci        (While using glPushClientAttribDefaultEXT/glPopClientAttrib
40715bd8deadSopenharmony_ci        works to avoid disturbing latched client vertex array buffer
40725bd8deadSopenharmony_ci        binding state--ignoring client attrib stack overflows--that
40735bd8deadSopenharmony_ci        approach doesn't work for vertex array objects because
40745bd8deadSopenharmony_ci        glPushClientAttribDefaultARB/glPopClientAttrib would default all
40755bd8deadSopenharmony_ci        the initial values of the currently bound vertex array object.)
40765bd8deadSopenharmony_ci
40775bd8deadSopenharmony_ci        Also the last "const GLvoid * pointer" parameter is changed to
40785bd8deadSopenharmony_ci        an "intptr offset" parameter.  This change reflects the more
40795bd8deadSopenharmony_ci        encouraged and generally more efficient usage of pulling vertex
40805bd8deadSopenharmony_ci        arrays from vertex buffer objects.  This usage avoids having to
40815bd8deadSopenharmony_ci        always cast an offset to a pointer.
40825bd8deadSopenharmony_ci
40835bd8deadSopenharmony_ci        Because the GLintptr type has the same sizeof as a pointer,
40845bd8deadSopenharmony_ci        applications seeking to pass pointers with a zero value for the
40855bd8deadSopenharmony_ci        buffer parameter can do so by casting their pointer to a GLintptr.
40865bd8deadSopenharmony_ci        Example:
40875bd8deadSopenharmony_ci
40885bd8deadSopenharmony_ci            static GLfloat colors[3*20];
40895bd8deadSopenharmony_ci            glVertexArrayColorOffsetEXT(27, /*client-state*/0,
40905bd8deadSopenharmony_ci                                        3, GL_FLOAT, 12, (GLintptr)colors);
40915bd8deadSopenharmony_ci
40925bd8deadSopenharmony_ci        Also added are selector-free vertex array object enable/disable
40935bd8deadSopenharmony_ci        commands and queries.  The queries return GLintptr values to
40945bd8deadSopenharmony_ci        make sure pointers as well as offsets can be returned.
40955bd8deadSopenharmony_ci
40965bd8deadSopenharmony_ci   (29) How should vertex array object queries be supported?
40975bd8deadSopenharmony_ci
40985bd8deadSopenharmony_ci        RESOLVED:  Provide both glGetVertexArray*Parameteriv and
40995bd8deadSopenharmony_ci        glGetVertexArray*Pointerv queries.
41005bd8deadSopenharmony_ci
41015bd8deadSopenharmony_ci        Rather than providing both integer and pointer queries, it is
41025bd8deadSopenharmony_ci        tempting to provide just a query accepting a GLintptr pointer.
41035bd8deadSopenharmony_ci        But that's a likely pitfall for 64-bit coding.  Someone coding for
41045bd8deadSopenharmony_ci        32-bit could pass a GLint* without complaint from the compiler
41055bd8deadSopenharmony_ci        since both GLint* and GLintptr* are pointers to a 32-bit value,
41065bd8deadSopenharmony_ci        but in a 64-bit compilation environment, GLintptr* is a pointer
41075bd8deadSopenharmony_ci        to a 64-bit value.  While 64-bit compilers are likely to error
41085bd8deadSopenharmony_ci        (or at least warn) about this situation, a GLintptr* is likely
41095bd8deadSopenharmony_ci        to encourage 64-bit portability problems.  Having both a pointer
41105bd8deadSopenharmony_ci        and integer query avoids this problem.
41115bd8deadSopenharmony_ci
41125bd8deadSopenharmony_ci   (30) What should happen when a negative offset is passed to the
41135bd8deadSopenharmony_ci        glVertexArray*OffsetEXT routines?
41145bd8deadSopenharmony_ci
41155bd8deadSopenharmony_ci        RESOLVED:  When the buffer is non-zero, the offset really should
41165bd8deadSopenharmony_ci        be a positive value so generate a GL_INVALID_VALUE if a negative
41175bd8deadSopenharmony_ci        offset is passed to these routines when buffer is non-zero.
41185bd8deadSopenharmony_ci        When the buffer is non-negative, the GLintptr offset parameter
41195bd8deadSopenharmony_ci        will be treated as a pointer; in this case, there should be
41205bd8deadSopenharmony_ci        no check for negative values of the offset parameter since the
41215bd8deadSopenharmony_ci        negative parameter could, in fact, be a valid pointer.
41225bd8deadSopenharmony_ci
41235bd8deadSopenharmony_ci        This raises the interesting point as to whether the several
41245bd8deadSopenharmony_ci        core OpenGL buffer API commands such as glBufferSubData,
41255bd8deadSopenharmony_ci        glMapBufferRange, and glFlushMappedBufferRange should actually
41265bd8deadSopenharmony_ci        have a type of GLsizeiptr for their offset parameter.  Doing so
41275bd8deadSopenharmony_ci        would simplify the language in section 2.9 (Buffer Object) by
41285bd8deadSopenharmony_ci        eliminating the need to document GL_INVALID_OFFSET errors for
41295bd8deadSopenharmony_ci        negative offset parameters.  Such a change could be made in a
41305bd8deadSopenharmony_ci        compatible way because GLintptr and GLsizeiptr are typedef'ed
41315bd8deadSopenharmony_ci        to the same underlying type (a signed int of the same size in
41325bd8deadSopenharmony_ci        bytes as a pointer).
41335bd8deadSopenharmony_ci
41345bd8deadSopenharmony_ci   (31) Should the internalformat parameter of various DSA versions of
41355bd8deadSopenharmony_ci        gl*Tex*Image* routines be a GLint or GLenum?
41365bd8deadSopenharmony_ci
41375bd8deadSopenharmony_ci        RESOLVED:  Match the type for internalformat of the pre-DSA
41385bd8deadSopenharmony_ci        version of the routine.
41395bd8deadSopenharmony_ci
41405bd8deadSopenharmony_ci        This is a legacy of OpenGL 1.0 where the internalformat parameter
41415bd8deadSopenharmony_ci        to glTexImage1D and glTexImage2D was a GLint-typed value that
41425bd8deadSopenharmony_ci        could be 1, 2, 3, or 4 for the number of components.
41435bd8deadSopenharmony_ci
41445bd8deadSopenharmony_ci        In OpenGL 1.1, internal texture formats were introduced to provide
41455bd8deadSopenharmony_ci        more specificity to the internal representation of texels within
41465bd8deadSopenharmony_ci        a texture.  This was part of introducing texture objects to OpenGL
41475bd8deadSopenharmony_ci        (a feature not originally in OpenGL 1.0).
41485bd8deadSopenharmony_ci
41495bd8deadSopenharmony_ci        The intent of this decision is to make it easier for existing
41505bd8deadSopenharmony_ci        code converting use the selector-free DSA routines without
41515bd8deadSopenharmony_ci        signed/unsigned warnings because GLenum is unsigned while GLint
41525bd8deadSopenharmony_ci        is signed.
41535bd8deadSopenharmony_ci
41545bd8deadSopenharmony_ci        This means the following commands take a GLint internalformat
41555bd8deadSopenharmony_ci        parameter:
41565bd8deadSopenharmony_ci
41575bd8deadSopenharmony_ci            glTextureImage1DEXT
41585bd8deadSopenharmony_ci            glTextureImage2DEXT
41595bd8deadSopenharmony_ci            glTextureImage3DEXT
41605bd8deadSopenharmony_ci            glMultiTexImage1DEXT
41615bd8deadSopenharmony_ci            glMultiTexImage2DEXT
41625bd8deadSopenharmony_ci            glMultiTexImage3DEXT
41635bd8deadSopenharmony_ci
41645bd8deadSopenharmony_ci        This means the following commands take a GLenum internalformat
41655bd8deadSopenharmony_ci        parameter:
41665bd8deadSopenharmony_ci
41675bd8deadSopenharmony_ci            glCopyTextureImage1DEXT
41685bd8deadSopenharmony_ci            glCopyTextureImage2DEXT
41695bd8deadSopenharmony_ci            glCopyMultiTexImage1DEXT
41705bd8deadSopenharmony_ci            glCopyMultiTexImage2DEXT
41715bd8deadSopenharmony_ci
41725bd8deadSopenharmony_ci            glCompressedTextureImage1DEXT
41735bd8deadSopenharmony_ci            glCompressedTextureImage2DEXT
41745bd8deadSopenharmony_ci            glCompressedTextureImage3DEXT
41755bd8deadSopenharmony_ci            glCompressedMultiTexImage1DEXT
41765bd8deadSopenharmony_ci            glCompressedMultiTexImage2DEXT
41775bd8deadSopenharmony_ci            glCompressedMultiTexImage3DEXT
41785bd8deadSopenharmony_ci
41795bd8deadSopenharmony_ci            glTextureBufferEXT
41805bd8deadSopenharmony_ci            glMultiTexBufferEXT
41815bd8deadSopenharmony_ci            glNamedRenderbufferStorageEXT
41825bd8deadSopenharmony_ci            glNamedRenderbufferStorageMultisampleEXT
41835bd8deadSopenharmony_ci            glNamedRenderbufferStorageMultisampleCoverageEXT
41845bd8deadSopenharmony_ci
41855bd8deadSopenharmony_ci        Warning: pre-July 2013 versions of glext.h have the DSA prototypes that
41865bd8deadSopenharmony_ci        should be using GLint internalformat using GLenum instead.  See:
41875bd8deadSopenharmony_ci
41885bd8deadSopenharmony_ci            https://cvs.khronos.org/bugzilla/show_bug.cgi?id=10413
41895bd8deadSopenharmony_ci
41905bd8deadSopenharmony_ci   (32) How can a particular vertex array object's texture coordinate
41915bd8deadSopenharmony_ci        set array be updated without depending on the active client
41925bd8deadSopenharmony_ci        texture selector?
41935bd8deadSopenharmony_ci
41945bd8deadSopenharmony_ci        RESOLVED:  The glEnableVertexArrayEXT and glDisableVertexArrayEXT
41955bd8deadSopenharmony_ci        commands should be extended to accept GL_TEXTUREi tokens where
41965bd8deadSopenharmony_ci        GL_TEXTUREi indicates the specific vertex array for texture
41975bd8deadSopenharmony_ci        coordinate set i to enable or disable respectively.
41985bd8deadSopenharmony_ci
41995bd8deadSopenharmony_ci        Due to a specification lapse, this behavior was not specified in
42005bd8deadSopenharmony_ci        the version 1.1 of this specification but was added for version
42015bd8deadSopenharmony_ci        1.2.
42025bd8deadSopenharmony_ci
42035bd8deadSopenharmony_ci        The use of a GL_TEXTUREi token follows the precedent set for how
42045bd8deadSopenharmony_ci        GL_TEXTUREi is supported for the selector-free matrix routines.
42055bd8deadSopenharmony_ci
42065bd8deadSopenharmony_ci        Implementations of EXT_direct_state_access prior to July 2013
42075bd8deadSopenharmony_ci        cannot be expected to implement this behavior and will generate
42085bd8deadSopenharmony_ci        a GL_INVALID_ENUM error instead.  This error can be used to
42095bd8deadSopenharmony_ci        distinguish version 1.2 and earlier versions of this extension.
42105bd8deadSopenharmony_ci
42115bd8deadSopenharmony_ci        Calling glEnableVertexArrayEXT or glDisableVertexArrayEXT with
42125bd8deadSopenharmony_ci        GL_TEXTURE_COORD_ARRAY can be expected to update the texture
42135bd8deadSopenharmony_ci        coordinate array based on the current active client texture
42145bd8deadSopenharmony_ci        coordinate set of the indicated vertex array object, effectively
42155bd8deadSopenharmony_ci        depending on the current active texture selector but not the
42165bd8deadSopenharmony_ci        current bound vertex array object selector.
42175bd8deadSopenharmony_ci
42185bd8deadSopenharmony_ci        Querying the enable of multitexture texture coordinate arrays
42195bd8deadSopenharmony_ci        uses glGetVertexArrayIntegeri_vEXT with GL_TEXTURE_COORD_ARRAY
42205bd8deadSopenharmony_ci        for the pname.  This behavior was not clearly specified before
42215bd8deadSopenharmony_ci        version 1.2.
42225bd8deadSopenharmony_ci
42235bd8deadSopenharmony_ciRevision History
42245bd8deadSopenharmony_ci
42255bd8deadSopenharmony_ci    Rev.    Date    Author    Changes
42265bd8deadSopenharmony_ci    ----  --------  --------  -----------------------------------------
42275bd8deadSopenharmony_ci     1    11/20/07  mjk       Initial version
42285bd8deadSopenharmony_ci     2    12/03/07  mjk       Feedback from JeffB
42295bd8deadSopenharmony_ci     3    01/02/08  mjk       Formatting
42305bd8deadSopenharmony_ci     4    01/02/08  mjk       NV_gpu_program4 additions
42315bd8deadSopenharmony_ci     5    01/02/08  mjk       EXT_gpu_program_parameters additions
42325bd8deadSopenharmony_ci     6    03/06/08  mjk       Switch from "MultiTex" to "Indexed"
42335bd8deadSopenharmony_ci                              texture API
42345bd8deadSopenharmony_ci     7    03/27/08  mjk       Feedback from TransGaming
42355bd8deadSopenharmony_ci     8    03/28/08  mjk       Program matrix query and
42365bd8deadSopenharmony_ci                              indexed query restructuring
42375bd8deadSopenharmony_ci     9    03/31/08  mjk       MultiTex API complete
42385bd8deadSopenharmony_ci     10   04/03/08  mjk       Fix CompressedTexture and CompressedMultiTex
42395bd8deadSopenharmony_ci                              lapses noticed by Ian
42405bd8deadSopenharmony_ci     11   04/14/08  mjk       Add target parameters to NamedProgram and
42415bd8deadSopenharmony_ci                              GetNamedProgram calls
42425bd8deadSopenharmony_ci     12   04/17/08  mjk       ARB_texture_rectangle interaction
42435bd8deadSopenharmony_ci     13   04/28/08  mjk       Add issue #19
42445bd8deadSopenharmony_ci     14   05/02/08  mjk       Add issue #20 about multi-thread
42455bd8deadSopenharmony_ci                              interactions as suggested by Yanjun Zhang
42465bd8deadSopenharmony_ci     15   05/06/08  mjk       Typos: glGetMultiTexCompressedTextureEXT
42475bd8deadSopenharmony_ci                              prototype and GLX protocol suffixing
42485bd8deadSopenharmony_ci     16   05/22/08  mjk       Add FBO support
42495bd8deadSopenharmony_ci     17   05/23/08  mjk       Fix Generate{Texture,MultiTex}MipmapEXT
42505bd8deadSopenharmony_ci     18   06/06/08  mjk       glCheckNamedFramebufferStatusEXT needs target
42515bd8deadSopenharmony_ci                              Issues #22 and #23
42525bd8deadSopenharmony_ci     19   06/10/08  mjk       Add FramebufferDrawBufferEXT,
42535bd8deadSopenharmony_ci                              FramebufferDrawBuffersEXT,
42545bd8deadSopenharmony_ci                              FramebufferReadBufferEXT
42555bd8deadSopenharmony_ci     20   07/01/08  mjk       Add NV_explicit_multisample interaction
42565bd8deadSopenharmony_ci     21   07/07/08  mjk       Typo fixes from Daniel Koch, error
42575bd8deadSopenharmony_ci                              semantics, new issues, limit
42585bd8deadSopenharmony_ci                              GetFramebufferParameterivEXT to 4.nnn state,
42595bd8deadSopenharmony_ci                              fix NamedProgramStringEXT discussion,
42605bd8deadSopenharmony_ci                              add EXT_texture_array and
42615bd8deadSopenharmony_ci                              NV_texture_cube_map_array interactions
42625bd8deadSopenharmony_ci     22   07/15/08  mjk       Just typos
42635bd8deadSopenharmony_ci     23   11/05/08  mjk       Destineer support
42645bd8deadSopenharmony_ci     24   11/05/08  mjk       Destineer support
42655bd8deadSopenharmony_ci     25   12/15/08  mjk       Version 1.1 adds OpenGL 3.0 support
42665bd8deadSopenharmony_ci     26   12/19/08  mjk       Fix VertexArrayVertexOffsetEXT duplicate
42675bd8deadSopenharmony_ci                              entry point; eliminated version missing stride
42685bd8deadSopenharmony_ci     27   12/22/08  mjk       NamedRenderbufferStorageEXT shouldn't have
42695bd8deadSopenharmony_ci                              target parameter
42705bd8deadSopenharmony_ci     28   12/23/08  mjk       Fixed various "index" functions for 3.0
42715bd8deadSopenharmony_ci     29   01/12/09  mjk       Add error for negative offsets for
42725bd8deadSopenharmony_ci                              glVertexArray*Offset commands when buffer
42735bd8deadSopenharmony_ci                              parameter is non-zero
42745bd8deadSopenharmony_ci     30   01/26/09  mjk       Correct glPopClientAttrib usage
42755bd8deadSopenharmony_ci     31   02/17/09  mjk       Add glVertexArrayMultiTexCoordOffsetEXT
42765bd8deadSopenharmony_ci                              New names: GetVertexArrayIntegeri_vEXT,
42775bd8deadSopenharmony_ci                              GetVertexArrayIntegervEXT,
42785bd8deadSopenharmony_ci                              GetVertexArrayPointeri_vEXT
42795bd8deadSopenharmony_ci     32   03/13/09  groth     Add EXT_copy_buffer interaction
42805bd8deadSopenharmony_ci     33   06/10/09  mjk       add VertexArrayMultiTexCoordOffsetEXT to
42815bd8deadSopenharmony_ci                              list of errors for exceeding the maximum
42825bd8deadSopenharmony_ci                              texture image units
42835bd8deadSopenharmony_ci     34   09/07/10  mjk       some Get*Indexedv instanced needed EXT
42845bd8deadSopenharmony_ci                              suffixes; issue 27 update
42855bd8deadSopenharmony_ci     35   06/18/13  mjk       add issue 31; glext.h had GLenum internalformat
42865bd8deadSopenharmony_ci                              when spec said GLint for gl*Tex*Image*EXT commands
42875bd8deadSopenharmony_ci     36   06/24/13  mjk       fix glEnableVertexArrayEXT and
42885bd8deadSopenharmony_ci                              glDisableVertexArrayEXT so they accept the
42895bd8deadSopenharmony_ci                              GL_TEXTUREi tokens to be free of active
42905bd8deadSopenharmony_ci                              client texture selector (issue 32)
42915bd8deadSopenharmony_ci     37   07/29/13  mjk       document NVIDIA driver bugs
42925bd8deadSopenharmony_ci     38   10/22/13  mjk       add Matrix*Transpose*EXT routines missing
42935bd8deadSopenharmony_ci                              from section 2.12.2 list
42945bd8deadSopenharmony_ci     39   02/24/15  mjk       add & operator to glMultiTexGenivEXT in NV Impl.
4295