15bd8deadSopenharmony_ciName
25bd8deadSopenharmony_ci
35bd8deadSopenharmony_ci    NV_transform_feedback
45bd8deadSopenharmony_ci
55bd8deadSopenharmony_ciName Strings
65bd8deadSopenharmony_ci
75bd8deadSopenharmony_ci    GL_NV_transform_feedback
85bd8deadSopenharmony_ci
95bd8deadSopenharmony_ciContributors
105bd8deadSopenharmony_ci
115bd8deadSopenharmony_ci    Cliff Woolley
125bd8deadSopenharmony_ci    Nick Carter
135bd8deadSopenharmony_ci
145bd8deadSopenharmony_ciContact
155bd8deadSopenharmony_ci
165bd8deadSopenharmony_ci    Barthold Lichtenbelt (blichtenbelt 'at' nvidia.com)
175bd8deadSopenharmony_ci    Pat Brown (pbrown 'at' nvidia.com)
185bd8deadSopenharmony_ci    Eric Werness (ewerness 'at' nvidia.com)
195bd8deadSopenharmony_ci
205bd8deadSopenharmony_ciStatus
215bd8deadSopenharmony_ci
225bd8deadSopenharmony_ci    Shipping for GeForce 8 Series (November 2006) 
235bd8deadSopenharmony_ci
245bd8deadSopenharmony_ciVersion
255bd8deadSopenharmony_ci
265bd8deadSopenharmony_ci    Last Modified Date:         03/09/2011
275bd8deadSopenharmony_ci    NVIDIA Revision:            18
285bd8deadSopenharmony_ci
295bd8deadSopenharmony_ciNumber
305bd8deadSopenharmony_ci
315bd8deadSopenharmony_ci    341
325bd8deadSopenharmony_ci
335bd8deadSopenharmony_ciDependencies
345bd8deadSopenharmony_ci
355bd8deadSopenharmony_ci    OpenGL 1.5 is required.
365bd8deadSopenharmony_ci
375bd8deadSopenharmony_ci    This extension interacts with EXT_timer_query.
385bd8deadSopenharmony_ci
395bd8deadSopenharmony_ci    NV_vertex_program4, NV_geometry_program4 and NV_gpu_program4 affect this
405bd8deadSopenharmony_ci    extension.
415bd8deadSopenharmony_ci
425bd8deadSopenharmony_ci    EXT_geometry_shader4 trivially interacts with this extension.
435bd8deadSopenharmony_ci
445bd8deadSopenharmony_ci    This extension has an OpenGL Shading Language component.  As such it
455bd8deadSopenharmony_ci    interacts with ARB_shader_objects and OpenGL 2.0.
465bd8deadSopenharmony_ci
475bd8deadSopenharmony_ci    This extension is written against the OpenGL 2.0 specification.
485bd8deadSopenharmony_ci
495bd8deadSopenharmony_ciOverview
505bd8deadSopenharmony_ci
515bd8deadSopenharmony_ci    This extension provides a new mode to the GL, called transform feedback,
525bd8deadSopenharmony_ci    which records vertex attributes of the primitives processed by the GL.
535bd8deadSopenharmony_ci    The selected attributes are written into buffer objects, and can be
545bd8deadSopenharmony_ci    written with each attribute in a separate buffer object or with all
555bd8deadSopenharmony_ci    attributes interleaved into a single buffer object.  If a geometry program
565bd8deadSopenharmony_ci    or shader is active, the primitives recorded are those emitted by the
575bd8deadSopenharmony_ci    geometry program.  Otherwise, transform feedback captures primitives whose
585bd8deadSopenharmony_ci    vertex are transformed by a vertex program or shader, or by fixed-function
595bd8deadSopenharmony_ci    vertex processing.  In either case, the primitives captured are those
605bd8deadSopenharmony_ci    generated prior to clipping.  Transform feedback mode is capable of
615bd8deadSopenharmony_ci    capturing transformed vertex data generated by fixed-function vertex
625bd8deadSopenharmony_ci    processing, outputs from assembly vertex or geometry programs, or varying
635bd8deadSopenharmony_ci    variables emitted from GLSL vertex or geometry shaders.
645bd8deadSopenharmony_ci
655bd8deadSopenharmony_ci    The vertex data recorded in transform feedback mode is stored into buffer
665bd8deadSopenharmony_ci    objects as an array of vertex attributes.  The regular representation and
675bd8deadSopenharmony_ci    the use of buffer objects allows the recorded data to be processed
685bd8deadSopenharmony_ci    directly by the GL without requiring CPU intervention to copy data.  In
695bd8deadSopenharmony_ci    particular, transform feedback data can be used for vertex arrays (via
705bd8deadSopenharmony_ci    vertex buffer objects), as the source for pixel data (via pixel buffer
715bd8deadSopenharmony_ci    objects), as program constant data (via the NV_parameter_buffer_object or
725bd8deadSopenharmony_ci    EXT_bindable_uniform extension), or via any other extension that makes use
735bd8deadSopenharmony_ci    of buffer objects.
745bd8deadSopenharmony_ci
755bd8deadSopenharmony_ci    This extension introduces new query object support to allow transform
765bd8deadSopenharmony_ci    feedback mode to operate asynchronously.  Query objects allow applications
775bd8deadSopenharmony_ci    to determine when transform feedback results are complete, as well as the
785bd8deadSopenharmony_ci    number of primitives processed and written back to buffer objects while in
795bd8deadSopenharmony_ci    transform feedback mode.  This extension also provides a new rasterizer
805bd8deadSopenharmony_ci    discard enable, which allows applications to use transform feedback to
815bd8deadSopenharmony_ci    capture vertex attributes without rendering anything.
825bd8deadSopenharmony_ci
835bd8deadSopenharmony_ciNew Procedures and Functions
845bd8deadSopenharmony_ci
855bd8deadSopenharmony_ci    void BindBufferRangeNV(enum target, uint index, uint buffer,
865bd8deadSopenharmony_ci                           intptr offset, sizeiptr size)
875bd8deadSopenharmony_ci    void BindBufferOffsetNV(enum target, uint index, uint buffer,
885bd8deadSopenharmony_ci                            intptr offset)
895bd8deadSopenharmony_ci    void BindBufferBaseNV(enum target, uint index, uint buffer)
905bd8deadSopenharmony_ci    void TransformFeedbackAttribsNV(sizei count, const int *attribs,
915bd8deadSopenharmony_ci                                    enum bufferMode)
925bd8deadSopenharmony_ci    void TransformFeedbackVaryingsNV(uint program, sizei count,
935bd8deadSopenharmony_ci                                     const int *locations,
945bd8deadSopenharmony_ci                                     enum bufferMode)
955bd8deadSopenharmony_ci    void BeginTransformFeedbackNV(enum primitiveMode)
965bd8deadSopenharmony_ci    void EndTransformFeedbackNV()
975bd8deadSopenharmony_ci
985bd8deadSopenharmony_ci    int GetVaryingLocationNV(uint program, const char *name)
995bd8deadSopenharmony_ci    void GetActiveVaryingNV(uint program, uint index,
1005bd8deadSopenharmony_ci                            sizei bufSize, sizei *length, sizei *size,
1015bd8deadSopenharmony_ci                            enum *type, char *name)
1025bd8deadSopenharmony_ci    void ActiveVaryingNV(uint program, const char *name)
1035bd8deadSopenharmony_ci    void GetTransformFeedbackVaryingNV(uint program, uint index,
1045bd8deadSopenharmony_ci                                       int *location)
1055bd8deadSopenharmony_ci
1065bd8deadSopenharmony_ci    void GetIntegerIndexedvEXT(enum param, uint index, int *values);
1075bd8deadSopenharmony_ci    void GetBooleanIndexedvEXT(enum param, uint index, boolean *values);
1085bd8deadSopenharmony_ci
1095bd8deadSopenharmony_ci    (Note: These indexed query functions are provided in the EXT_draw_buffers2
1105bd8deadSopenharmony_ci    extension.  The boolean query is not useful for any queryable value in
1115bd8deadSopenharmony_ci    this extension, but is supported for completeness and consistency with
1125bd8deadSopenharmony_ci    base GL typed "Get" functions.)
1135bd8deadSopenharmony_ci
1145bd8deadSopenharmony_ci
1155bd8deadSopenharmony_ciNew Tokens
1165bd8deadSopenharmony_ci
1175bd8deadSopenharmony_ci    Accepted by the <target> parameters of BindBuffer, BufferData,
1185bd8deadSopenharmony_ci    BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData,
1195bd8deadSopenharmony_ci    GetBufferPointerv, BindBufferRangeNV, BindBufferOffsetNV and
1205bd8deadSopenharmony_ci    BindBufferBaseNV:
1215bd8deadSopenharmony_ci
1225bd8deadSopenharmony_ci      TRANSFORM_FEEDBACK_BUFFER_NV                      0x8C8E
1235bd8deadSopenharmony_ci
1245bd8deadSopenharmony_ci    Accepted by the <param> parameter of GetIntegerIndexedvEXT and
1255bd8deadSopenharmony_ci    GetBooleanIndexedvEXT:
1265bd8deadSopenharmony_ci
1275bd8deadSopenharmony_ci      TRANSFORM_FEEDBACK_BUFFER_START_NV                0x8C84
1285bd8deadSopenharmony_ci      TRANSFORM_FEEDBACK_BUFFER_SIZE_NV                 0x8C85
1295bd8deadSopenharmony_ci      TRANSFORM_FEEDBACK_RECORD_NV                      0x8C86
1305bd8deadSopenharmony_ci
1315bd8deadSopenharmony_ci    Accepted by the <param> parameter of GetIntegerIndexedvEXT and
1325bd8deadSopenharmony_ci    GetBooleanIndexedvEXT, and by the <pname> parameter of GetBooleanv,
1335bd8deadSopenharmony_ci    GetDoublev, GetIntegerv, and GetFloatv:
1345bd8deadSopenharmony_ci
1355bd8deadSopenharmony_ci      TRANSFORM_FEEDBACK_BUFFER_BINDING_NV              0x8C8F
1365bd8deadSopenharmony_ci
1375bd8deadSopenharmony_ci    Accepted by the <bufferMode> parameter of TransformFeedbackAttribsNV and
1385bd8deadSopenharmony_ci    TransformFeedbackVaryingsNV:
1395bd8deadSopenharmony_ci
1405bd8deadSopenharmony_ci      INTERLEAVED_ATTRIBS_NV                            0x8C8C
1415bd8deadSopenharmony_ci      SEPARATE_ATTRIBS_NV                               0x8C8D
1425bd8deadSopenharmony_ci
1435bd8deadSopenharmony_ci    Accepted by the <target> parameter of BeginQuery, EndQuery, and
1445bd8deadSopenharmony_ci    GetQueryiv:
1455bd8deadSopenharmony_ci
1465bd8deadSopenharmony_ci      PRIMITIVES_GENERATED_NV                           0x8C87
1475bd8deadSopenharmony_ci      TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV          0x8C88
1485bd8deadSopenharmony_ci
1495bd8deadSopenharmony_ci    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, and by
1505bd8deadSopenharmony_ci    the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and
1515bd8deadSopenharmony_ci    GetDoublev:
1525bd8deadSopenharmony_ci
1535bd8deadSopenharmony_ci      RASTERIZER_DISCARD_NV                             0x8C89
1545bd8deadSopenharmony_ci
1555bd8deadSopenharmony_ci    Accepted by the <pname> parameter of GetBooleanv, GetDoublev, GetIntegerv,
1565bd8deadSopenharmony_ci    and GetFloatv:
1575bd8deadSopenharmony_ci
1585bd8deadSopenharmony_ci      MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV  0x8C8A
1595bd8deadSopenharmony_ci      MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV        0x8C8B
1605bd8deadSopenharmony_ci      MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV     0x8C80
1615bd8deadSopenharmony_ci      TRANSFORM_FEEDBACK_ATTRIBS_NV                     0x8C7E
1625bd8deadSopenharmony_ci
1635bd8deadSopenharmony_ci    Accepted by the <pname> parameter of GetProgramiv:
1645bd8deadSopenharmony_ci
1655bd8deadSopenharmony_ci      ACTIVE_VARYINGS_NV                                0x8C81
1665bd8deadSopenharmony_ci      ACTIVE_VARYING_MAX_LENGTH_NV                      0x8C82
1675bd8deadSopenharmony_ci      TRANSFORM_FEEDBACK_VARYINGS_NV                    0x8C83
1685bd8deadSopenharmony_ci
1695bd8deadSopenharmony_ci   Accepted by the <pname> parameter of GetBooleanv, GetDoublev, GetIntegerv,
1705bd8deadSopenharmony_ci   GetFloatv, and GetProgramiv:
1715bd8deadSopenharmony_ci
1725bd8deadSopenharmony_ci      TRANSFORM_FEEDBACK_BUFFER_MODE_NV                 0x8C7F
1735bd8deadSopenharmony_ci
1745bd8deadSopenharmony_ci   Accepted by the <attribs> parameter of TransformFeedbackAttribsNV:
1755bd8deadSopenharmony_ci
1765bd8deadSopenharmony_ci      BACK_PRIMARY_COLOR_NV                             0x8C77
1775bd8deadSopenharmony_ci      BACK_SECONDARY_COLOR_NV                           0x8C78
1785bd8deadSopenharmony_ci      TEXTURE_COORD_NV                                  0x8C79
1795bd8deadSopenharmony_ci      CLIP_DISTANCE_NV                                  0x8C7A
1805bd8deadSopenharmony_ci      VERTEX_ID_NV                                      0x8C7B
1815bd8deadSopenharmony_ci      PRIMITIVE_ID_NV                                   0x8C7C
1825bd8deadSopenharmony_ci      GENERIC_ATTRIB_NV                                 0x8C7D
1835bd8deadSopenharmony_ci      POINT_SIZE                                        0x0B11
1845bd8deadSopenharmony_ci      FOG_COORDINATE                                    0x8451
1855bd8deadSopenharmony_ci      SECONDARY_COLOR_NV                                0x852D
1865bd8deadSopenharmony_ci      PRIMARY_COLOR                                     0x8577
1875bd8deadSopenharmony_ci      POSITION                                          0x1203
1885bd8deadSopenharmony_ci      LAYER_NV                                          0x8DAA
1895bd8deadSopenharmony_ci
1905bd8deadSopenharmony_ci      (note:  POINT_SIZE, FOG_COORDINATE, PRIMARY_COLOR, and POSITION are
1915bd8deadSopenharmony_ci       defined in the core OpenGL specification; SECONDARY_COLOR_NV is defined
1925bd8deadSopenharmony_ci       in NV_register_combiners.)
1935bd8deadSopenharmony_ci
1945bd8deadSopenharmony_ci    Returned by the <type> parameter of GetActiveVaryingNV:
1955bd8deadSopenharmony_ci
1965bd8deadSopenharmony_ci      UNSIGNED_INT_VEC2_EXT                             0x8DC6
1975bd8deadSopenharmony_ci      UNSIGNED_INT_VEC3_EXT                             0x8DC7
1985bd8deadSopenharmony_ci      UNSIGNED_INT_VEC4_EXT                             0x8DC8
1995bd8deadSopenharmony_ci
2005bd8deadSopenharmony_ci      (note:  All three of these are defined in the EXT_gpu_shader4
2015bd8deadSopenharmony_ci      extension.)
2025bd8deadSopenharmony_ci
2035bd8deadSopenharmony_ciAdditions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL
2045bd8deadSopenharmony_ciOperation)
2055bd8deadSopenharmony_ci
2065bd8deadSopenharmony_ci    Insert three new sections between Sections 2.11, Coordinate Transforms and
2075bd8deadSopenharmony_ci    2.12, Clipping:
2085bd8deadSopenharmony_ci
2095bd8deadSopenharmony_ci    (Move the "Asynchronous Queries" language out of Section 4.1.7)
2105bd8deadSopenharmony_ci
2115bd8deadSopenharmony_ci    Section 2.X, Asynchronous Queries
2125bd8deadSopenharmony_ci
2135bd8deadSopenharmony_ci    Asynchronous queries provide a mechanism to return information about the
2145bd8deadSopenharmony_ci    processing of a sequence of GL commands.  There are two query types
2155bd8deadSopenharmony_ci    supported by the GL.  Transform feedback queries (section 2.Y) returns
2165bd8deadSopenharmony_ci    information on the number of vertices and primitives processed by the GL
2175bd8deadSopenharmony_ci    and written to one or more buffer objects.  Occlusion queries (section
2185bd8deadSopenharmony_ci    4.1.7.1) count the number of fragments or samples that pass the depth
2195bd8deadSopenharmony_ci    test.
2205bd8deadSopenharmony_ci
2215bd8deadSopenharmony_ci    The results of asynchronous queries are not returned by the GL immediately
2225bd8deadSopenharmony_ci    after the completion of the last command in the set; subsequent commands
2235bd8deadSopenharmony_ci    can be processed while the query results are not complete.  When
2245bd8deadSopenharmony_ci    available, the query results are stored in an associated query object.
2255bd8deadSopenharmony_ci    The commands described in section 6.1.12 provide mechanisms to determine
2265bd8deadSopenharmony_ci    when query results are available and return the actual results of the
2275bd8deadSopenharmony_ci    query.  The name space for query objects is the unsigned integers, with
2285bd8deadSopenharmony_ci    zero reserved by the GL.
2295bd8deadSopenharmony_ci
2305bd8deadSopenharmony_ci    Each type of query supported by the GL has an active query object name. If
2315bd8deadSopenharmony_ci    the active query object name for a query type is non-zero, the GL is
2325bd8deadSopenharmony_ci    currently tracking the information corresponding to that query type and
2335bd8deadSopenharmony_ci    the query results will be written into the corresponding query object.  If
2345bd8deadSopenharmony_ci    the active query object for a query type name is zero, no such information
2355bd8deadSopenharmony_ci    is being tracked.
2365bd8deadSopenharmony_ci
2375bd8deadSopenharmony_ci    A query object is created by calling
2385bd8deadSopenharmony_ci
2395bd8deadSopenharmony_ci      void BeginQuery(enum target, uint id);
2405bd8deadSopenharmony_ci
2415bd8deadSopenharmony_ci    with an unused name <id>.  <target> indicates the type of query to be
2425bd8deadSopenharmony_ci    performed; valid values of <target> are defined in subsequent
2435bd8deadSopenharmony_ci    sections. When a query object is created, the name <id> is marked as used
2445bd8deadSopenharmony_ci    and associated with a new query object.
2455bd8deadSopenharmony_ci
2465bd8deadSopenharmony_ci    BeginQuery sets the active query object name for the query type given by
2475bd8deadSopenharmony_ci    <target> to <id>.  If BeginQuery is called with an <id> of zero, if the
2485bd8deadSopenharmony_ci    active query object name for <target> is non-zero, or if <id> is the
2495bd8deadSopenharmony_ci    active query object name for any query type, the error INVALID OPERATION
2505bd8deadSopenharmony_ci    is generated.
2515bd8deadSopenharmony_ci
2525bd8deadSopenharmony_ci    The command
2535bd8deadSopenharmony_ci
2545bd8deadSopenharmony_ci      void EndQuery(enum target);
2555bd8deadSopenharmony_ci
2565bd8deadSopenharmony_ci    marks the end of the sequence of commands to be tracked for the query type
2575bd8deadSopenharmony_ci    given by <target>.  The active query object for <target> is updated to
2585bd8deadSopenharmony_ci    indicate that query results are not available, and the active query object
2595bd8deadSopenharmony_ci    name for <target> is reset to zero.  When the commands issued prior to
2605bd8deadSopenharmony_ci    EndQuery have completed and a final query result is available, the query
2615bd8deadSopenharmony_ci    object, active when EndQuery is, called is updated by the GL.  The query
2625bd8deadSopenharmony_ci    object is updated to indicate that the query results are available and to
2635bd8deadSopenharmony_ci    contain the query result.  If the active query object name for <target> is
2645bd8deadSopenharmony_ci    zero when EndQuery is called, the error INVALID_OPERATION is generated.
2655bd8deadSopenharmony_ci
2665bd8deadSopenharmony_ci   The command
2675bd8deadSopenharmony_ci
2685bd8deadSopenharmony_ci      void GenQueries(sizei n, uint *ids);
2695bd8deadSopenharmony_ci
2705bd8deadSopenharmony_ci    returns <n> previously unused query object names in <ids>. These names are
2715bd8deadSopenharmony_ci    marked as used, but no object is associated with them until the first time
2725bd8deadSopenharmony_ci    they are used by BeginQuery.
2735bd8deadSopenharmony_ci
2745bd8deadSopenharmony_ci    Query objects are deleted by calling
2755bd8deadSopenharmony_ci
2765bd8deadSopenharmony_ci      void DeleteQueries(sizei n, const uint *ids);
2775bd8deadSopenharmony_ci
2785bd8deadSopenharmony_ci    <ids> contains <n> names of query objects to be deleted. After a query
2795bd8deadSopenharmony_ci    object is deleted, its name is again unused.  Unused names in <ids> are
2805bd8deadSopenharmony_ci    silently ignored.
2815bd8deadSopenharmony_ci
2825bd8deadSopenharmony_ci    Calling either GenQueries or DeleteQueries while any query of any target
2835bd8deadSopenharmony_ci    is active causes an INVALID_OPERATION error to be generated.
2845bd8deadSopenharmony_ci
2855bd8deadSopenharmony_ci    Query objects contain two pieces of state:  a single bit indicating
2865bd8deadSopenharmony_ci    whether a query result is available, and an integer containing the query
2875bd8deadSopenharmony_ci    result value.  The number of bits used to represent the query result is
2885bd8deadSopenharmony_ci    implementation-dependent.  In the initial state of a query object, the
2895bd8deadSopenharmony_ci    result is available and its value is zero.
2905bd8deadSopenharmony_ci
2915bd8deadSopenharmony_ci    The necessary state for each query type is an unsigned integer holding the
2925bd8deadSopenharmony_ci    active query object name (zero if no query object is active), and any
2935bd8deadSopenharmony_ci    state necessary to keep the current results of an asynchronous query in
2945bd8deadSopenharmony_ci    progress.
2955bd8deadSopenharmony_ci
2965bd8deadSopenharmony_ci    Section 2.Y, Transform Feedback
2975bd8deadSopenharmony_ci
2985bd8deadSopenharmony_ci    In 'transform feedback' mode the vertices of transformed primitives are
2995bd8deadSopenharmony_ci    written out to one or more buffer objects. The vertices are fed back after
3005bd8deadSopenharmony_ci    the geometry shader stage, if it exists, or otherwise after vertex
3015bd8deadSopenharmony_ci    processing right before clipping (section 2.12) but after color
3025bd8deadSopenharmony_ci    clamping. Optionally the transformed vertices can be discarded after being
3035bd8deadSopenharmony_ci    stored into one or more buffer objects, or they can be passed on down to
3045bd8deadSopenharmony_ci    the clipping stage for further processing.
3055bd8deadSopenharmony_ci
3065bd8deadSopenharmony_ci    Transform feedback is started and finished by calling
3075bd8deadSopenharmony_ci
3085bd8deadSopenharmony_ci      void BeginTransformFeedbackNV(enum primitiveMode)
3095bd8deadSopenharmony_ci
3105bd8deadSopenharmony_ci    and
3115bd8deadSopenharmony_ci
3125bd8deadSopenharmony_ci      void EndTransformFeedbackNV(),
3135bd8deadSopenharmony_ci
3145bd8deadSopenharmony_ci    respectively. Transform feedback is said to be active after a call to
3155bd8deadSopenharmony_ci    BeginTransformFeedbackNV and inactive after a call to
3165bd8deadSopenharmony_ci    EndTransformFeedbackNV. Transform feedback is initially inactive.
3175bd8deadSopenharmony_ci    Transform feedback is performed after color clamping, but immediately
3185bd8deadSopenharmony_ci    before clipping in the OpenGL pipeline. <primitiveMode> is one of
3195bd8deadSopenharmony_ci    TRIANGLES, LINES, or POINTS, and specifies the output type of primitives
3205bd8deadSopenharmony_ci    that will be recorded into the buffer objects bound for transform feedback
3215bd8deadSopenharmony_ci    (see below). <primitiveMode> places a restriction on the primitive types
3225bd8deadSopenharmony_ci    that may be rendered during an instance of transform feedback. See table
3235bd8deadSopenharmony_ci    X.1.
3245bd8deadSopenharmony_ci
3255bd8deadSopenharmony_ci      Transform Feedback
3265bd8deadSopenharmony_ci      primitiveMode               allowed render primitive modes
3275bd8deadSopenharmony_ci      ----------------------      ---------------------------------
3285bd8deadSopenharmony_ci      POINTS                       POINTS
3295bd8deadSopenharmony_ci      LINES                        LINES, LINE_LOOP, and LINE_STRIP
3305bd8deadSopenharmony_ci      TRIANGLES                    TRIANGLES, TRIANGLE_STRIP,
3315bd8deadSopenharmony_ci                                   TRIANGLE_FAN, QUADS, QUAD_STRIP,
3325bd8deadSopenharmony_ci                                   and POLYGON
3335bd8deadSopenharmony_ci
3345bd8deadSopenharmony_ci    Table X.1 Legal combinations between the transform feedback primitive
3355bd8deadSopenharmony_ci    mode, as passed to BeginTransformFeedbackNV and the current primitive
3365bd8deadSopenharmony_ci    mode.
3375bd8deadSopenharmony_ci
3385bd8deadSopenharmony_ci    If a geometry program or geometry shader is active, the output primitive
3395bd8deadSopenharmony_ci    type of the currently active program is used as the render primitive in
3405bd8deadSopenharmony_ci    table X.1, otherwise the Begin mode is used.
3415bd8deadSopenharmony_ci
3425bd8deadSopenharmony_ci    Quads and polygons will be tessellated and recorded as triangles (the
3435bd8deadSopenharmony_ci    order of tessellation within a primitive is undefined); primitives
3445bd8deadSopenharmony_ci    specified in strips or fans will be assembled and recorded as individual
3455bd8deadSopenharmony_ci    primitives. Incomplete primitives are not recorded. Begin or any operation
3465bd8deadSopenharmony_ci    that implicitly calls Begin (such as DrawElements) will generate
3475bd8deadSopenharmony_ci    INVALID_OPERATION if the begin mode is not an allowed begin mode for the
3485bd8deadSopenharmony_ci    current transform feedback buffer state. If a geometry program or geometry
3495bd8deadSopenharmony_ci    shader is active, its output primitive mode is used for the error check
3505bd8deadSopenharmony_ci    instead of the begin mode.
3515bd8deadSopenharmony_ci
3525bd8deadSopenharmony_ci    It is an invalid operation error to call BeginTransformFeedbackNV,
3535bd8deadSopenharmony_ci    TransformFeedbackVaryingsNV, TransformFeedbackAttribsNV, or UseProgram or
3545bd8deadSopenharmony_ci    LinkProgram on the currently active program object while transform
3555bd8deadSopenharmony_ci    feedback is active.  It is an invalid operation error to call
3565bd8deadSopenharmony_ci    EndTransformFeedbackNV while transform feedback is inactive.
3575bd8deadSopenharmony_ci
3585bd8deadSopenharmony_ci    Transform feedback can operate in either INTERLEAVED_ATTRIBS_NV or
3595bd8deadSopenharmony_ci    SEPARATE_ATTRIBS_NV mode. In the INTERLEAVED_ATTRIBS_NV mode, several
3605bd8deadSopenharmony_ci    vertex attributes can be written, interleaved, into a single buffer
3615bd8deadSopenharmony_ci    object.  In the SEPARATE_ATTRIBS_NV mode, vertex attributes are recorded,
3625bd8deadSopenharmony_ci    non-interleaved, into several buffer objects simultaneously.
3635bd8deadSopenharmony_ci
3645bd8deadSopenharmony_ci    It is an INVALID_OPERATION error to call BeginTransformFeedbackNV if there
3655bd8deadSopenharmony_ci    is no buffer object bound to index 0 (see the description of the
3665bd8deadSopenharmony_ci    BindBuffer* commands below) in INTERLEAVED_ATTRIBS_NV mode. It is also an
3675bd8deadSopenharmony_ci    INVALID_OPERATION error to call BeginTransformFeedbackNV if the number of
3685bd8deadSopenharmony_ci    buffer objects bound in SEPARATE_ATTRIBS_NV mode is less than the number
3695bd8deadSopenharmony_ci    of buffer objects required, as given by the current transform feedback
3705bd8deadSopenharmony_ci    state.  It is also an INVALID_OPERATION error to call
3715bd8deadSopenharmony_ci    BeginTransformFeedbackNV if no attributes are specified to be captured in
3725bd8deadSopenharmony_ci    either separate or interleaved mode.
3735bd8deadSopenharmony_ci
3745bd8deadSopenharmony_ci    Buffer objects are made to be targets of transform feedback by calling one
3755bd8deadSopenharmony_ci    of
3765bd8deadSopenharmony_ci
3775bd8deadSopenharmony_ci      void BindBufferRangeNV(enum target, uint index, uint buffer,
3785bd8deadSopenharmony_ci                             intptr offset, sizeiptr size)
3795bd8deadSopenharmony_ci      void BindBufferOffsetNV(enum target, uint index, uint buffer,
3805bd8deadSopenharmony_ci                              intptr offset)
3815bd8deadSopenharmony_ci      void BindBufferBaseNV(enum target, uint index, uint buffer)
3825bd8deadSopenharmony_ci
3835bd8deadSopenharmony_ci    where <target> is set to TRANSFORM_FEEDBACK_BUFFER_NV. Any of the three
3845bd8deadSopenharmony_ci    BindBuffer* commands perform the equivalent of BindBuffer(target,
3855bd8deadSopenharmony_ci    buffer). <buffer> specifies which buffer object to bind to the target at
3865bd8deadSopenharmony_ci    index number <index>. <index> exists for use with the SEPARATE_ATTRIBS_NV
3875bd8deadSopenharmony_ci    mode and must be less than the value of
3885bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV.  <offset> specifies a starting
3895bd8deadSopenharmony_ci    offset into the buffer object <buffer>.  <size> specifies the number of
3905bd8deadSopenharmony_ci    elements that can be written during transform feedback mode. This is
3915bd8deadSopenharmony_ci    useful to prevent the GL from writing past a certain position in the
3925bd8deadSopenharmony_ci    buffer object. Both <offset> and <size> are in basic machine units. The
3935bd8deadSopenharmony_ci    error INVALID_VALUE is generated if the value of <size> is less than or
3945bd8deadSopenharmony_ci    equal to zero.  The error INVALID_VALUE is generated if <offset> or <size>
3955bd8deadSopenharmony_ci    are not word-aligned. The error INVALID_OPERATION is generated when any of
3965bd8deadSopenharmony_ci    the BindBuffer* commands is called while transform feedback is active.
3975bd8deadSopenharmony_ci
3985bd8deadSopenharmony_ci    BindBufferBaseNV is equivalent to calling BindBufferOffsetNV with an
3995bd8deadSopenharmony_ci    <offset> of 0. BindBufferOffsetNV is the equivalent of calling
4005bd8deadSopenharmony_ci    BindBufferRangeNV with <size> = sizeof(buffer) - <offset> and rounding
4015bd8deadSopenharmony_ci    <size> down so that it is word-aligned.
4025bd8deadSopenharmony_ci
4035bd8deadSopenharmony_ci    If recording the vertices of a primitive to the buffer objects being used
4045bd8deadSopenharmony_ci    for transform feedback purposes would result in either exceeding the
4055bd8deadSopenharmony_ci    limits of any buffer object's size, or in exceeding the end position
4065bd8deadSopenharmony_ci    <offset> + <size> - 1, as set by BindBufferRangeNV, then no vertices of
4075bd8deadSopenharmony_ci    the primitive are recorded, and the counter corresponding to the
4085bd8deadSopenharmony_ci    asynchronous query target TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV (see
4095bd8deadSopenharmony_ci    Section 2.Z) is not incremented.
4105bd8deadSopenharmony_ci
4115bd8deadSopenharmony_ci    Two methods exist to specify which transformed vertex attributes are
4125bd8deadSopenharmony_ci    streamed to one, or more, buffer objects in transform feedback mode.  If
4135bd8deadSopenharmony_ci    an OpenGL Shading Language vertex and/or geometry shader is active, then
4145bd8deadSopenharmony_ci    the state set with the TransformFeedbackVaryingsNV() command determines
4155bd8deadSopenharmony_ci    which attributes to record. If neither a vertex nor geometry shader is
4165bd8deadSopenharmony_ci    active, the state set with the TransformFeedbackAttribsNV() command
4175bd8deadSopenharmony_ci    determines which attributes to record.
4185bd8deadSopenharmony_ci
4195bd8deadSopenharmony_ci    When a program object containing a vertex shader and/or geometry shader is
4205bd8deadSopenharmony_ci    active, the set of vertex attributes recorded in transform feedback mode
4215bd8deadSopenharmony_ci    is specified by
4225bd8deadSopenharmony_ci
4235bd8deadSopenharmony_ci      void TransformFeedbackVaryingsNV(uint program, sizei count,
4245bd8deadSopenharmony_ci                                       const int *locations, 
4255bd8deadSopenharmony_ci                                       enum bufferMode)
4265bd8deadSopenharmony_ci
4275bd8deadSopenharmony_ci    This command sets the transform feedback state for <program> and specifies
4285bd8deadSopenharmony_ci    which varying variables to record when transform feedback is active. The
4295bd8deadSopenharmony_ci    array <locations> contains <count> locations of active varying variables,
4305bd8deadSopenharmony_ci    as queried with GetActiveVaryingNV(), to stream to a buffer object. See
4315bd8deadSopenharmony_ci    section 2.15.3. <bufferMode> is one of INTERLEAVED_ATTRIBS_NV or
4325bd8deadSopenharmony_ci    SEPARATE_ATTRIBS_NV.  The error INVALID_OPERATION is generated if any
4335bd8deadSopenharmony_ci    value in <locations> does not reference an active varying variable, or if
4345bd8deadSopenharmony_ci    any value in <locations> appears more than once in the array. The same
4355bd8deadSopenharmony_ci    error is generated if <program> has not been linked successfully. The
4365bd8deadSopenharmony_ci    program object's state value TRANSFORM_FEEDBACK_BUFFER_MODE_NV will be set
4375bd8deadSopenharmony_ci    to <bufferMode> and the program object's state value
4385bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_VARYINGS_NV set to <count>. These values can be queried
4395bd8deadSopenharmony_ci    with GetProgramiv (see section 6.1.14).
4405bd8deadSopenharmony_ci
4415bd8deadSopenharmony_ci    In the INTERLEAVED_ATTRIBS_NV mode, varying variables are written,
4425bd8deadSopenharmony_ci    interleaved, into one buffer object. This is the buffer object bound to
4435bd8deadSopenharmony_ci    index 0. Varying variables are written out to that buffer object in the
4445bd8deadSopenharmony_ci    order that they appear in the array <locations>. The error
4455bd8deadSopenharmony_ci    INVALID_OPERATION is generated if the total number of components of all
4465bd8deadSopenharmony_ci    varying variables specified in the array <locations> is greater than
4475bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV.
4485bd8deadSopenharmony_ci
4495bd8deadSopenharmony_ci    In the SEPARATE_ATTRIBS_NV mode, varying variables are recorded,
4505bd8deadSopenharmony_ci    non-interleaved, into several buffer objects simultaneously. The first
4515bd8deadSopenharmony_ci    varying variable in the array <locations> is written to the buffer bound
4525bd8deadSopenharmony_ci    to index 0. The last varying variable is written to the buffer object
4535bd8deadSopenharmony_ci    bound to index <count> - 1. No more than
4545bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV buffer objects can be written
4555bd8deadSopenharmony_ci    to simultaneously. The error INVALID_VALUE is generated if <count> is
4565bd8deadSopenharmony_ci    greater than that limit. Furthermore, the number of components for each
4575bd8deadSopenharmony_ci    varying variable in the array <locations> cannot exceed
4585bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV. The error INVALID_VALUE is
4595bd8deadSopenharmony_ci    generated if any varying variable in <locations> exceeds this limit.
4605bd8deadSopenharmony_ci
4615bd8deadSopenharmony_ci    It is not necessary to (re-)link <program> after calling
4625bd8deadSopenharmony_ci    TransformFeedbackVaryingsNV(). Changes to the transform feedback state
4635bd8deadSopenharmony_ci    will be picked up right away after calling TransformFeedbackVaryingsNV().
4645bd8deadSopenharmony_ci
4655bd8deadSopenharmony_ci    The value for any attribute specified to be streamed to a buffer object
4665bd8deadSopenharmony_ci    but not actually written by a vertex or geometry shader is undefined.
4675bd8deadSopenharmony_ci
4685bd8deadSopenharmony_ci    When neither a vertex nor geometry shader is active, the vertex attributes
4695bd8deadSopenharmony_ci    produced by fixed-function vertex processing or an assembly vertex or
4705bd8deadSopenharmony_ci    geometry program can be recorded in transform feedback mode.  The set of
4715bd8deadSopenharmony_ci    attributes to record is specified by
4725bd8deadSopenharmony_ci
4735bd8deadSopenharmony_ci      void TransformFeedbackAttribsNV(sizei count, const int *attribs,
4745bd8deadSopenharmony_ci                                      enum bufferMode)
4755bd8deadSopenharmony_ci
4765bd8deadSopenharmony_ci    This command specifies which attributes to record into one, or more,
4775bd8deadSopenharmony_ci    buffer objects. The value TRANSFORM_FEEDBACK_BUFFER_MODE_NV will be set
4785bd8deadSopenharmony_ci    to <bufferMode> and the value TRANSFORM_FEEDBACK_ATTRIBS_NV set to
4795bd8deadSopenharmony_ci    <count>.  The array <attribs> contains an interleaved representation of
4805bd8deadSopenharmony_ci    the attributes desired to be fed back containing 3*count values. For
4815bd8deadSopenharmony_ci    attrib i, the value at 3*i+0 is the enum corresponding to the attrib, as
4825bd8deadSopenharmony_ci    given in table X.2. The value at 3*i+1 is the number of components of the
4835bd8deadSopenharmony_ci    provided attrib to be fed back and is between 1 and 4. The value at 3*i+2
4845bd8deadSopenharmony_ci    is the index for attribute enumerants corresponding to more than one real
4855bd8deadSopenharmony_ci    attribute. For an attribute enumerant corresponding to only one attribute,
4865bd8deadSopenharmony_ci    the index is ignored. For an attribute enumerant corresponding to more
4875bd8deadSopenharmony_ci    than one attribute, the error INVALID_VALUE is generated if the index
4885bd8deadSopenharmony_ci    value is outside the allowable range for that attribute.
4895bd8deadSopenharmony_ci
4905bd8deadSopenharmony_ci                               permitted            GPU_program_4
4915bd8deadSopenharmony_ci     attrib                    sizes     index?     result name
4925bd8deadSopenharmony_ci     ---------------------     --------  --------   --------------
4935bd8deadSopenharmony_ci     POSITION                  1,2,3,4     no       position
4945bd8deadSopenharmony_ci     PRIMARY_COLOR             1,2,3,4     no       color.front.primary
4955bd8deadSopenharmony_ci     SECONDARY_COLOR_NV        1,2,3,4     no       color.front.secondary
4965bd8deadSopenharmony_ci     BACK_PRIMARY_COLOR_NV     1,2,3,4     no       color.back.primary
4975bd8deadSopenharmony_ci     BACK_SECONDARY_COLOR_NV   1,2,3,4     no       color.back.secondary
4985bd8deadSopenharmony_ci     FOG_COORDINATE            1           no       fogcoord
4995bd8deadSopenharmony_ci     POINT_SIZE                1           no       pointsize
5005bd8deadSopenharmony_ci     TEXTURE_COORD_NV          1,2,3,4     yes      texcoord[index]
5015bd8deadSopenharmony_ci     CLIP_DISTANCE_NV          1           yes      clip[index]
5025bd8deadSopenharmony_ci     VERTEX_ID_NV              1           no       vertexid
5035bd8deadSopenharmony_ci     PRIMITIVE_ID_NV           1           no       primid
5045bd8deadSopenharmony_ci     GENERIC_ATTRIB_NV         1,2,3,4     yes      attrib[index]
5055bd8deadSopenharmony_ci     LAYER_NV                  1           no       layer
5065bd8deadSopenharmony_ci
5075bd8deadSopenharmony_ci    Table X.2:  Transform Feedback Attribute Specifiers.The 'attrib' column
5085bd8deadSopenharmony_ci    specifies which attribute to record. The 'permitted sizes' column
5095bd8deadSopenharmony_ci    indicates how many components of the attribute can be recorded. The
5105bd8deadSopenharmony_ci    'index' column indicates if the attribute is indexed.  The 'gpu program 4'
5115bd8deadSopenharmony_ci    column shows which result variable of a vertex or geometry program
5125bd8deadSopenharmony_ci    corresponds to the attribute to record.
5135bd8deadSopenharmony_ci
5145bd8deadSopenharmony_ci    The TransformFeedbackAttribsNV() command sets transform feedback state
5155bd8deadSopenharmony_ci    which is used both when the GL is in fixed-function vertex processing
5165bd8deadSopenharmony_ci    mode, as well as when an assembly vertex and/or geometry program is
5175bd8deadSopenharmony_ci    active.
5185bd8deadSopenharmony_ci
5195bd8deadSopenharmony_ci    The parameter <bufferMode> has the same meaning as described for
5205bd8deadSopenharmony_ci    TransformFeedbackVaryingsNV(). Attributes are either written interleaved,
5215bd8deadSopenharmony_ci    or into separate buffer objects, in the same manner as described earlier
5225bd8deadSopenharmony_ci    for TransformFeedbackVaryingsNV().
5235bd8deadSopenharmony_ci
5245bd8deadSopenharmony_ci    In the INTERLEAVED_ATTRIBS_NV mode, the error INVALID_VALUE is generated
5255bd8deadSopenharmony_ci    if the sum of the values of elements 3*i+1 in the array <attribs> is
5265bd8deadSopenharmony_ci    greater than MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV.
5275bd8deadSopenharmony_ci
5285bd8deadSopenharmony_ci    In the SEPARATE_ATTRIBS_NV mode, no more than
5295bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV buffer objects can be written
5305bd8deadSopenharmony_ci    to simultaneously. The error INVALID_VALUE is generated if <count> is
5315bd8deadSopenharmony_ci    greater than that limit.
5325bd8deadSopenharmony_ci
5335bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated if any attribute appears more
5345bd8deadSopenharmony_ci    than once in the array <attribs>.
5355bd8deadSopenharmony_ci
5365bd8deadSopenharmony_ci    The value for any attribute specified to be streamed to a buffer object
5375bd8deadSopenharmony_ci    but not actually written by a vertex or geometry program is undefined.
5385bd8deadSopenharmony_ci    The values of PRIMITIVE_ID_NV or LAYER_NV for a vertex is defined if and
5395bd8deadSopenharmony_ci    only if a geometry program is active and that program writes to the result
5405bd8deadSopenharmony_ci    variables "result.primid" or "result.layer", respectively.  The value of
5415bd8deadSopenharmony_ci    VERTEX_ID_NV is only defined if and only if a vertex program is active, no
5425bd8deadSopenharmony_ci    geometry program is active, and the vertex program writes to the output
5435bd8deadSopenharmony_ci    attribute "result.id".
5445bd8deadSopenharmony_ci
5455bd8deadSopenharmony_ci    Section 2.Z, Primitive Queries
5465bd8deadSopenharmony_ci 
5475bd8deadSopenharmony_ci    Primitive queries use query objects to track the number of primitives
5485bd8deadSopenharmony_ci    generated by the GL and to track the number of primitives written to
5495bd8deadSopenharmony_ci    transform feedback buffers.
5505bd8deadSopenharmony_ci
5515bd8deadSopenharmony_ci    When BeginQuery is called with a <target> of PRIMITIVES_GENERATED_NV, the
5525bd8deadSopenharmony_ci    primitives-generated count maintained by the GL is set to zero. When the
5535bd8deadSopenharmony_ci    generated primitive query is active, the primitives-generated count is
5545bd8deadSopenharmony_ci    incremented every time a primitive reaches the Discarding Rasterization
5555bd8deadSopenharmony_ci    stage (see Section 3.x) right before rasterization. This counter counts
5565bd8deadSopenharmony_ci    the number of primitives emitted by a geometry shader, if active, possibly
5575bd8deadSopenharmony_ci    further tessellated into separate primitives during the transform-feedback
5585bd8deadSopenharmony_ci    stage, if active.
5595bd8deadSopenharmony_ci
5605bd8deadSopenharmony_ci    When BeginQuery is called with a <target> of
5615bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV, the transform-feedback-
5625bd8deadSopenharmony_ci    primitives-written count maintained by the GL is set to zero. When the
5635bd8deadSopenharmony_ci    transform feedback primitive written query is active, the
5645bd8deadSopenharmony_ci    transform-feedback-primitives-written count is incremented every time a
5655bd8deadSopenharmony_ci    primitive is recorded into a buffer object. If transform feedback is not
5665bd8deadSopenharmony_ci    active, this counter is not incremented. If the primitive does not fit in
5675bd8deadSopenharmony_ci    the buffer object, the counter is not incremented.
5685bd8deadSopenharmony_ci
5695bd8deadSopenharmony_ci    These two queries can be used together to determine if all primitives have
5705bd8deadSopenharmony_ci    been written to the bound feedback buffers; if both queries are run
5715bd8deadSopenharmony_ci    simultaneously and the query results are equal, all primitives have been
5725bd8deadSopenharmony_ci    written to the buffer(s). If the number of primitives written is less than
5735bd8deadSopenharmony_ci    the number of primitives generated, the buffer is full.
5745bd8deadSopenharmony_ci
5755bd8deadSopenharmony_ci    Modify section 2.15.3 "Shader Variables", page 75.
5765bd8deadSopenharmony_ci
5775bd8deadSopenharmony_ci    Change the second sentence in the first paragraph on p. 84 as follows:
5785bd8deadSopenharmony_ci
5795bd8deadSopenharmony_ci    . . . or read by a fragment shader, will count against this limit.  The
5805bd8deadSopenharmony_ci    transformed vertex position (gl_Position) does not count against this
5815bd8deadSopenharmony_ci    limit.
5825bd8deadSopenharmony_ci
5835bd8deadSopenharmony_ci    Add the following paragraphs on p.84:
5845bd8deadSopenharmony_ci
5855bd8deadSopenharmony_ci    A varying variable is considered active if it is determined by the linker
5865bd8deadSopenharmony_ci    that the varying will actually be used when the executable code in a
5875bd8deadSopenharmony_ci    program object is executed. The linker will make this determination
5885bd8deadSopenharmony_ci    regardless of the transform-feedback state set with the
5895bd8deadSopenharmony_ci    TransformFeedbackVaryingsNV() command. In cases where the linker cannot
5905bd8deadSopenharmony_ci    make a conclusive determination, the varying will be considered active. It
5915bd8deadSopenharmony_ci    is possible to override this determination and force the linker to
5925bd8deadSopenharmony_ci    consider a varying variable as active by calling ActiveVaryingNV(). This
5935bd8deadSopenharmony_ci    can be useful in transform feedback mode if there are varying variables to
5945bd8deadSopenharmony_ci    be recorded but not otherwise needed.
5955bd8deadSopenharmony_ci
5965bd8deadSopenharmony_ci    To find the location of an active varying variable, call
5975bd8deadSopenharmony_ci
5985bd8deadSopenharmony_ci      int GetVaryingLocationNV(uint program, const char *name)
5995bd8deadSopenharmony_ci
6005bd8deadSopenharmony_ci    This command will return the location of varying variable <name>.  <name>
6015bd8deadSopenharmony_ci    is a null-terminated string without whitespace. If <name> is not the name
6025bd8deadSopenharmony_ci    of an active varying variable in <program>, -1 is returned. Locations for
6035bd8deadSopenharmony_ci    both user-defined as well as built-in varying variables can be queried. If
6045bd8deadSopenharmony_ci    <program> has not been successfully linked, the error INVALID_OPERATION is
6055bd8deadSopenharmony_ci    generated. After a program is linked, the location will not change, unless
6065bd8deadSopenharmony_ci    the program is re- linked. A valid name cannot be any portion of a single
6075bd8deadSopenharmony_ci    vector or matrix, but can be a single element of an array or the whole
6085bd8deadSopenharmony_ci    array.  Note that varying variables cannot be structures.
6095bd8deadSopenharmony_ci
6105bd8deadSopenharmony_ci    To determine the set of active varying variables used by a program object,
6115bd8deadSopenharmony_ci    and their data types, use the command:
6125bd8deadSopenharmony_ci
6135bd8deadSopenharmony_ci      void GetActiveVaryingNV(uint program, uint index,
6145bd8deadSopenharmony_ci                              sizei bufSize, sizei *length, sizei *size,
6155bd8deadSopenharmony_ci                              enum *type, char *name);
6165bd8deadSopenharmony_ci
6175bd8deadSopenharmony_ci    This command provides information about the varying selected by
6185bd8deadSopenharmony_ci    <index>. An <index> of 0 selects the first active varying variable, and an
6195bd8deadSopenharmony_ci    <index> of ACTIVE_VARYINGS_NV-1 selects the last active varying
6205bd8deadSopenharmony_ci    variable. The value of ACTIVE_VARYINGS_NV can be queried with
6215bd8deadSopenharmony_ci    GetProgramiv (see section 6.1.14). If <index> is greater than or equal to
6225bd8deadSopenharmony_ci    ACTIVE_VARYINGS_NV, the error INVALID_VALUE is generated.  The parameter
6235bd8deadSopenharmony_ci    <program> is the name of a program object for which the command
6245bd8deadSopenharmony_ci    LinkProgram has been issued in the past. It is not necessary for <program>
6255bd8deadSopenharmony_ci    to have been linked successfully. The link could have failed because the
6265bd8deadSopenharmony_ci    number of active varying variables exceeded the limit.
6275bd8deadSopenharmony_ci
6285bd8deadSopenharmony_ci    The name of the selected varying is returned as a null-terminated string
6295bd8deadSopenharmony_ci    in <name>. The actual number of characters written into <name>, excluding
6305bd8deadSopenharmony_ci    the null terminator, is returned in <length>. If <length> is NULL, no
6315bd8deadSopenharmony_ci    length is returned. The maximum number of characters that may be written
6325bd8deadSopenharmony_ci    into <name>, including the null terminator, is specified by <bufSize>. The
6335bd8deadSopenharmony_ci    returned varying name can be the name of a user defined varying variable
6345bd8deadSopenharmony_ci    or the name of a built- in varying (which begin with the prefix "gl_", see
6355bd8deadSopenharmony_ci    the OpenGL Shading Language specification for a complete list). The length
6365bd8deadSopenharmony_ci    of the longest varying name in program is given by
6375bd8deadSopenharmony_ci    ACTIVE_VARYING_MAX_LENGTH_NV, which can be queried with GetProgramiv (see
6385bd8deadSopenharmony_ci    section 6.1.14).
6395bd8deadSopenharmony_ci
6405bd8deadSopenharmony_ci    For the selected varying variable, its type is returned into <type>.  The
6415bd8deadSopenharmony_ci    size of the varying is returned into <size>. The value in <size> is in
6425bd8deadSopenharmony_ci    units of the type returned in <type>. The type returned can be any of
6435bd8deadSopenharmony_ci    FLOAT, FLOAT_VEC2, FLOAT_VEC3, FLOAT_VEC4, INT, INT_VEC2, INT_VEC3,
6445bd8deadSopenharmony_ci    INT_VEC4, UNSIGNED_INT, UNSIGNED_INT_VEC2_EXT, UNSIGNED_INT_VEC3_EXT,
6455bd8deadSopenharmony_ci    UNSIGNED_INT_VEC4_EXT, FLOAT_MAT2, FLOAT_MAT3, or FLOAT_MAT4. If an error
6465bd8deadSopenharmony_ci    occurred, the return parameters <length>, <size>, <type> and <name> will
6475bd8deadSopenharmony_ci    be unmodified. This command will return as much information about active
6485bd8deadSopenharmony_ci    varying variables as possible. If no information is available, <length>
6495bd8deadSopenharmony_ci    will be set to zero and <name> will be an empty string. This situation
6505bd8deadSopenharmony_ci    could arise if GetActiveVaryingNV is issued after a failed link.
6515bd8deadSopenharmony_ci
6525bd8deadSopenharmony_ci    To force the linker to mark a varying variable as active, call
6535bd8deadSopenharmony_ci
6545bd8deadSopenharmony_ci      void ActiveVaryingNV(uint program, const char *name)
6555bd8deadSopenharmony_ci
6565bd8deadSopenharmony_ci    to specify that the varying variable <name> in <program> should be marked
6575bd8deadSopenharmony_ci    as active when the program is next linked. In particular, it does not
6585bd8deadSopenharmony_ci    modify the list of active varying variables in a program object that has
6595bd8deadSopenharmony_ci    already been linked. For any varying variable in <program> not passed to
6605bd8deadSopenharmony_ci    ActiveVaryingNV, the linker will determine their active status. <name>
6615bd8deadSopenharmony_ci    must be a null-terminated string without whitespace. A valid name cannot
6625bd8deadSopenharmony_ci    be an element of an array, or any portion of a single vector or
6635bd8deadSopenharmony_ci    matrix. ActiveVaryingNV may be issued before any shader objects are
6645bd8deadSopenharmony_ci    attached to <program>. Hence, <name> can contain any string, including a
6655bd8deadSopenharmony_ci    name that is never used as a varying variable in any shader object. Such
6665bd8deadSopenharmony_ci    names are ignored by the GL.
6675bd8deadSopenharmony_ci
6685bd8deadSopenharmony_ci    The application is advised to force any varying variable live that it
6695bd8deadSopenharmony_ci    needs for transform feedback purposes. The set of active varying variables
6705bd8deadSopenharmony_ci    are linker dependent.
6715bd8deadSopenharmony_ci
6725bd8deadSopenharmony_ciAdditions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)
6735bd8deadSopenharmony_ci
6745bd8deadSopenharmony_ci   (Add new section 3.X, Discarding Rasterization)
6755bd8deadSopenharmony_ci
6765bd8deadSopenharmony_ci    Primitives can be optionally discarded before rasterization by calling
6775bd8deadSopenharmony_ci    Enable and Disable with RASTERIZER_DISCARD_NV. When enabled, primitives
6785bd8deadSopenharmony_ci    are discarded right before the rasterization stage, but after the optional
6795bd8deadSopenharmony_ci    transform feedback stage. When disabled, primitives are passed through to
6805bd8deadSopenharmony_ci    the rasterization stage to be processed normally. RASTERIZER_DISCARD_NV
6815bd8deadSopenharmony_ci    applies to the DrawPixels, CopyPixels, Bitmap, Clear and Accum commands as
6825bd8deadSopenharmony_ci    well.
6835bd8deadSopenharmony_ci
6845bd8deadSopenharmony_ciAdditions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment
6855bd8deadSopenharmony_ciOperations and the Frame Buffer)
6865bd8deadSopenharmony_ci
6875bd8deadSopenharmony_ci    (Replace section 4.1.7, "Occlusion Queries", p. 204, with the following)
6885bd8deadSopenharmony_ci
6895bd8deadSopenharmony_ci    Occlusion queries use query objects to track the number of fragments or
6905bd8deadSopenharmony_ci    samples that pass the depth test.  An occlusion query can be started and
6915bd8deadSopenharmony_ci    finished by calling BeginQuery and EndQuery, respectively, with a <target>
6925bd8deadSopenharmony_ci    of SAMPLES_PASSED.
6935bd8deadSopenharmony_ci
6945bd8deadSopenharmony_ci    When an occlusion query starts, the samples-passed count maintained by the
6955bd8deadSopenharmony_ci    GL is set to zero.  When an occlusion query is active, the samples-passed
6965bd8deadSopenharmony_ci    count is incremented for each fragment that passes the depth test.  If the
6975bd8deadSopenharmony_ci    value of SAMPLE BUFFERS is 0, then the samples- passed count is
6985bd8deadSopenharmony_ci    incremented by 1 for each fragment. If the value of SAMPLE BUFFERS is 1,
6995bd8deadSopenharmony_ci    then the samples-passed count is incremented by the number of samples
7005bd8deadSopenharmony_ci    whose coverage bit is set. However, implementations, at their discretion,
7015bd8deadSopenharmony_ci    may instead increase the samples-passed count by the value of SAMPLES if
7025bd8deadSopenharmony_ci    any sample in the fragment is covered.  When an occlusion query finishes
7035bd8deadSopenharmony_ci    and all fragments generated by the commands issued prior to EndQuery have
7045bd8deadSopenharmony_ci    been generated, the samples-passed count is written to the corresponding
7055bd8deadSopenharmony_ci    query object as the query result value, and the query result for that
7065bd8deadSopenharmony_ci    object is marked as available.
7075bd8deadSopenharmony_ci
7085bd8deadSopenharmony_ci    If the samples-passed count overflows, (i.e., exceeds the value 2^n - 1,
7095bd8deadSopenharmony_ci    where n is the number of bits in the samples-passed count), its value
7105bd8deadSopenharmony_ci    becomes undefined.  It is recommended, but not required, that
7115bd8deadSopenharmony_ci    implementations handle this overflow case by saturating at 2^n - 1 and
7125bd8deadSopenharmony_ci    incrementing no further.
7135bd8deadSopenharmony_ci
7145bd8deadSopenharmony_ciAdditions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)
7155bd8deadSopenharmony_ci
7165bd8deadSopenharmony_ci    (Add to section 5.4, Display Lists p. 237)
7175bd8deadSopenharmony_ci
7185bd8deadSopenharmony_ci    On p. 241, add the following to the list of vertex buffer object commands
7195bd8deadSopenharmony_ci    not compiled into a display list: BindBufferRangeNV, BindBufferOffsetNV,
7205bd8deadSopenharmony_ci    BindBufferBaseNV, TransformFeedbackAttribsNV,
7215bd8deadSopenharmony_ci    TransformFeedbackVaryingsNV, and ActiveVaryingNV.
7225bd8deadSopenharmony_ci
7235bd8deadSopenharmony_ciAdditions to Chapter 6 of the OpenGL 2.0 Specification (State and State
7245bd8deadSopenharmony_ciRequests)
7255bd8deadSopenharmony_ci
7265bd8deadSopenharmony_ci    Modify the second paragraph of section 6.1.1 (Simple Queries) p244 to read
7275bd8deadSopenharmony_ci    as follows:
7285bd8deadSopenharmony_ci
7295bd8deadSopenharmony_ci    ...<data> is a pointer to a scalar or array of the indicated type in which
7305bd8deadSopenharmony_ci    to place the returned data. The commands
7315bd8deadSopenharmony_ci
7325bd8deadSopenharmony_ci      void GetIntegerIndexedvEXT(enum param, uint index, int *values);
7335bd8deadSopenharmony_ci      void GetBooleanIndexedvEXT(enum param, uint index, boolean *values);
7345bd8deadSopenharmony_ci
7355bd8deadSopenharmony_ci    are used to query indexed state.  <target> is the name of the indexed
7365bd8deadSopenharmony_ci    state and <index> is the index of the particular element being queried.
7375bd8deadSopenharmony_ci    <data> is a pointer to a scalar or array of the indicated type in which to
7385bd8deadSopenharmony_ci    place the returned data. In addition ...
7395bd8deadSopenharmony_ci
7405bd8deadSopenharmony_ci   (Replace Section 6.1.12, Occlusion Queries, p. 254)
7415bd8deadSopenharmony_ci
7425bd8deadSopenharmony_ci    Section 6.1.12, Asynchronous Queries
7435bd8deadSopenharmony_ci
7445bd8deadSopenharmony_ci    The command
7455bd8deadSopenharmony_ci
7465bd8deadSopenharmony_ci      boolean IsQuery(uint id);
7475bd8deadSopenharmony_ci
7485bd8deadSopenharmony_ci    returns TRUE if <id> is the name of a query object. If <id> is zero, or if
7495bd8deadSopenharmony_ci    <id> is a non-zero value that is not the name of a query object, IsQuery
7505bd8deadSopenharmony_ci    returns FALSE.
7515bd8deadSopenharmony_ci
7525bd8deadSopenharmony_ci    Information about a query target can be queried with the command
7535bd8deadSopenharmony_ci
7545bd8deadSopenharmony_ci      void GetQueryiv(enum target, enum pname, int *params);
7555bd8deadSopenharmony_ci
7565bd8deadSopenharmony_ci    <target> identifies the query target and can be SAMPLES_PASSED for
7575bd8deadSopenharmony_ci    occlusion queries or PRIMITIVES_GENERATED_NV and
7585bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV for primitive queries.
7595bd8deadSopenharmony_ci
7605bd8deadSopenharmony_ci    If <pname> is CURRENT_QUERY, the name of the currently active query for
7615bd8deadSopenharmony_ci    <target>, or zero if no query is active, will be placed in <params>.
7625bd8deadSopenharmony_ci
7635bd8deadSopenharmony_ci    If <pname> is QUERY_COUNTER_BITS, the implementation-dependent number of
7645bd8deadSopenharmony_ci    bits used to hold the query result for <target> will be placed in
7655bd8deadSopenharmony_ci    params. The number of query counter bits may be zero, in which case the
7665bd8deadSopenharmony_ci    counter contains no useful information.
7675bd8deadSopenharmony_ci
7685bd8deadSopenharmony_ci    For primitive queries (PRIMITIVES_GENERATED_NV and
7695bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV) if the number of bits is
7705bd8deadSopenharmony_ci    non-zero, the minimum number of bits allowed is 32.
7715bd8deadSopenharmony_ci
7725bd8deadSopenharmony_ci    For occlusion queries (SAMPLES_PASSED), if the number of bits is non-
7735bd8deadSopenharmony_ci    zero, the minimum number of bits allowed is a function of the
7745bd8deadSopenharmony_ci    implementation's maximum viewport dimensions (MAX_VIEWPORT_DIMS).  The
7755bd8deadSopenharmony_ci    counter must be able to represent at least two overdraws for every pixel
7765bd8deadSopenharmony_ci    in the viewport. The formula to compute the allowable minimum value (where
7775bd8deadSopenharmony_ci    n is the minimum number of bits) is:
7785bd8deadSopenharmony_ci
7795bd8deadSopenharmony_ci      n = min(32, ceil(log_2(maxViewportWidth *
7805bd8deadSopenharmony_ci                             maxViewportHeight * 2))).
7815bd8deadSopenharmony_ci
7825bd8deadSopenharmony_ci    The state of a query object can be queried with the commands
7835bd8deadSopenharmony_ci
7845bd8deadSopenharmony_ci      void GetQueryObjectiv(uint id, enum pname, int *params);
7855bd8deadSopenharmony_ci      void GetQueryObjectuiv(uint id, enum pname, uint *params);
7865bd8deadSopenharmony_ci
7875bd8deadSopenharmony_ci    If <id> is not the name of a query object, or if the query object named by
7885bd8deadSopenharmony_ci    <id> is currently active, then an INVALID_OPERATION error is generated.
7895bd8deadSopenharmony_ci
7905bd8deadSopenharmony_ci    If <pname> is QUERY_RESULT, then the query object's result value is
7915bd8deadSopenharmony_ci    returned as a single integer in <params>.  If the value is so large in
7925bd8deadSopenharmony_ci    magnitude that it cannot be represented with the requested type, then the
7935bd8deadSopenharmony_ci    nearest value representable using the requested type is returned.  If the
7945bd8deadSopenharmony_ci    number of query counter bits for any <target> is zero, then the result is
7955bd8deadSopenharmony_ci    returned as a single integer with a value of 0.
7965bd8deadSopenharmony_ci
7975bd8deadSopenharmony_ci    There may be an indeterminate delay before the above query returns.  If
7985bd8deadSopenharmony_ci    <pname> is QUERY_RESULT_AVAILABLE, FALSE is returned if such a delay would
7995bd8deadSopenharmony_ci    be required, TRUE is returned otherwise. It must always be true that if
8005bd8deadSopenharmony_ci    any query object returns a result available of TRUE, all queries of the
8015bd8deadSopenharmony_ci    same type issued prior to that query must also return TRUE.
8025bd8deadSopenharmony_ci
8035bd8deadSopenharmony_ci    Querying the state for any given query object forces the corresponding
8045bd8deadSopenharmony_ci    query to complete within a finite amount of time.
8055bd8deadSopenharmony_ci
8065bd8deadSopenharmony_ci    If multiple queries are issued using the same object name prior to calling
8075bd8deadSopenharmony_ci    GetQueryObject[u]iv, the result and availability information returned will
8085bd8deadSopenharmony_ci    always be from the last query issued.  The results from any queries before
8095bd8deadSopenharmony_ci    the last one will be lost if they are not retrieved before starting a new
8105bd8deadSopenharmony_ci    query on the same <target> and <id>.
8115bd8deadSopenharmony_ci
8125bd8deadSopenharmony_ci    (Add to Section 6.1.13, Buffer Objects, p. 255)
8135bd8deadSopenharmony_ci
8145bd8deadSopenharmony_ci    Add the following paragraph to the bottom of this section, p. 256.
8155bd8deadSopenharmony_ci
8165bd8deadSopenharmony_ci    To query which buffer objects are the target(s) when transform feedback is
8175bd8deadSopenharmony_ci    active, call GetIntegerIndexedvEXT() with <param> set to
8185bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_BUFFER_BINDING_NV. <index> has to be in the range 0 to
8195bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV - 1, otherwise the error
8205bd8deadSopenharmony_ci    INVALID_VALUE is generated. The name of the buffer object bound to <index>
8215bd8deadSopenharmony_ci    is returned in <values>. If no buffer object is bound for <index>, zero is
8225bd8deadSopenharmony_ci    returned in <values>.
8235bd8deadSopenharmony_ci
8245bd8deadSopenharmony_ci    To query the starting offset or size of the range of each buffer object
8255bd8deadSopenharmony_ci    binding used for transform feedback, call GetIntegerIndexedvEXT() with
8265bd8deadSopenharmony_ci    <param> set to TRANSFORM_FEEDBACK_BUFFER_START_NV or
8275bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_BUFFER_SIZE_NV respectively.  The error INVALID_VALUE
8285bd8deadSopenharmony_ci    is generated if <index> not in the range 0 to
8295bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV - 1.  If the parameter
8305bd8deadSopenharmony_ci    (starting offset or size) was not specified when the buffer object was
8315bd8deadSopenharmony_ci    bound, or if no buffer object is bound to <index>, zero is returned.
8325bd8deadSopenharmony_ci
8335bd8deadSopenharmony_ci    (Add a new Section 6.1.14 "Transform Feedback " and rename 6.1.14 to
8345bd8deadSopenharmony_ci    6.1.15)
8355bd8deadSopenharmony_ci
8365bd8deadSopenharmony_ci    To query the attributes to stream to a buffer object when neither an
8375bd8deadSopenharmony_ci    OpenGL Shading Language vertex nor geometry shader is active, call
8385bd8deadSopenharmony_ci    GetIntegerIndexedvEXT() with <param> set to
8395bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_RECORD_NV. This will return three values in <values>
8405bd8deadSopenharmony_ci    for each <index>. The first value returned is the attribute.  The second
8415bd8deadSopenharmony_ci    value the number of components of the attribute, and the third value the
8425bd8deadSopenharmony_ci    index of the attribute, if applicable. If the attribute is not indexed,
8435bd8deadSopenharmony_ci    the third component will return 0. The parameter <index> has to be in the
8445bd8deadSopenharmony_ci    range 0 to TRANSFORM_FEEDBACK_ATTRIBS_NV - 1, otherwise the error
8455bd8deadSopenharmony_ci    INVALID_VALUE is generated. If no data exists for <index> 0 is returned
8465bd8deadSopenharmony_ci    three times in <values>.
8475bd8deadSopenharmony_ci
8485bd8deadSopenharmony_ci    To query the attributes to stream to a buffer object when a vertex and/or
8495bd8deadSopenharmony_ci    geometry shader is active, use the command
8505bd8deadSopenharmony_ci    GetTransformFeedbackVaryingNV(), as explained in section 6.1.14.
8515bd8deadSopenharmony_ci
8525bd8deadSopenharmony_ci    (add to Section 6.1.14, Shader and Program Queries, p. 256)
8535bd8deadSopenharmony_ci
8545bd8deadSopenharmony_ci    Add the following paragraph to the bottom of page 257:
8555bd8deadSopenharmony_ci
8565bd8deadSopenharmony_ci    If <pname> is TRANSFORM_FEEDBACK_BUFFER_MODE_NV, the buffer mode,
8575bd8deadSopenharmony_ci    used when transform feedback is active, is returned. It can be one of
8585bd8deadSopenharmony_ci    SEPARATE_ATTRIBS_NV or INTERLEAVED_ATTRIBS_NV. If <pname> is
8595bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_VARINGS_NV, the number of varying variables to stream
8605bd8deadSopenharmony_ci    to one, or more, buffer objects are returned. If <pname> is
8615bd8deadSopenharmony_ci    ACTIVE_VARYINGS_NV, the number of active varying variables is
8625bd8deadSopenharmony_ci    returned. If no active varyings exist, 0 is returned. If <pname> is
8635bd8deadSopenharmony_ci    ACTIVE_VARYINGS_MAX_LENGTH_NV, the length of the longest active varying
8645bd8deadSopenharmony_ci    name, including a null terminator, is returned. If no active varying
8655bd8deadSopenharmony_ci    variable exists, 0 is returned.
8665bd8deadSopenharmony_ci
8675bd8deadSopenharmony_ci    The command
8685bd8deadSopenharmony_ci
8695bd8deadSopenharmony_ci      void GetTransformFeedbackVaryingNV(uint program, uint index,
8705bd8deadSopenharmony_ci                                         int *location)
8715bd8deadSopenharmony_ci
8725bd8deadSopenharmony_ci    returns, for each <index>, the location of a varying variable to stream to
8735bd8deadSopenharmony_ci    a buffer object in <location>. The <index> element of the array
8745bd8deadSopenharmony_ci    <locations>, as passed to TransformFeedbackVaryingsNV, is
8755bd8deadSopenharmony_ci    returned. <index> has to be in the program object specific range 0 to
8765bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_VARYINGS_NV - 1, otherwise the error INVALID_VALUE is
8775bd8deadSopenharmony_ci    generated. If no location exists for <index>, -1 is returned. If <program>
8785bd8deadSopenharmony_ci    is not the name of a program object, or if program object has not been
8795bd8deadSopenharmony_ci    linked successfully, the error INVALID_OPERATION is generated.
8805bd8deadSopenharmony_ci
8815bd8deadSopenharmony_ciAdditions to Appendix A of the OpenGL 2.0 Specification (Invariance)
8825bd8deadSopenharmony_ci
8835bd8deadSopenharmony_ci    None.
8845bd8deadSopenharmony_ci
8855bd8deadSopenharmony_ciAdditions to the AGL/GLX/WGL Specifications
8865bd8deadSopenharmony_ci
8875bd8deadSopenharmony_ci    None.
8885bd8deadSopenharmony_ci
8895bd8deadSopenharmony_ciGLX Protocol
8905bd8deadSopenharmony_ci
8915bd8deadSopenharmony_ci    UNDER DEVELOPMENT
8925bd8deadSopenharmony_ci
8935bd8deadSopenharmony_ciInteractions with EXT_timer_query
8945bd8deadSopenharmony_ci
8955bd8deadSopenharmony_ci    EXT_timer_query is the first extension to generalize the BeginQuery and
8965bd8deadSopenharmony_ci    EndQuery mechanism introduced by ARB_occlusion_query and OpenGL 1.5 to
8975bd8deadSopenharmony_ci    cover an additional query type.  This extension is the second.  This
8985bd8deadSopenharmony_ci    extension is written against the OpenGL 2.0 specification and uses most of
8995bd8deadSopenharmony_ci    the modifications in the EXT_timer_query specification.  If
9005bd8deadSopenharmony_ci    EXT_timer_query is supported, timer queries need to be added as a third
9015bd8deadSopenharmony_ci    query type.
9025bd8deadSopenharmony_ci
9035bd8deadSopenharmony_ciDependencies on NV_geometry_program4 and EXT_geometry_shader4
9045bd8deadSopenharmony_ci
9055bd8deadSopenharmony_ci    If NV_geometry_program4 is not supported, delete the reference to the
9065bd8deadSopenharmony_ci    output primitive type in Section 2.Y.  Delete the reference to
9075bd8deadSopenharmony_ci    PRIMITIVE_ID_NV and LAYER_NV.
9085bd8deadSopenharmony_ci
9095bd8deadSopenharmony_ci    If EXT_geometry_shader4 is not supported, delete any reference to a
9105bd8deadSopenharmony_ci    geometry shader.
9115bd8deadSopenharmony_ci
9125bd8deadSopenharmony_ciDependencies on NV_vertex_program4 and NV_gpu_program4
9135bd8deadSopenharmony_ci
9145bd8deadSopenharmony_ci    If NV_vertex_program4 is not supported, delete any reference to
9155bd8deadSopenharmony_ci    VERTEX_ID_NV.  If NV_gpu_program4 is not supported, table X.2 needs to
9165bd8deadSopenharmony_ci    refer to the "result" variables defined in the ARB_vertex_program
9175bd8deadSopenharmony_ci    specification instead.
9185bd8deadSopenharmony_ci
9195bd8deadSopenharmony_ciInteractions with ARB_shader_objects and OpenGL 2.0
9205bd8deadSopenharmony_ci
9215bd8deadSopenharmony_ci    If neither ARB_shader_objects nor OpenGL 2.0 is supported, all references
9225bd8deadSopenharmony_ci    to shader and program objects, as well as varying variables, should be
9235bd8deadSopenharmony_ci    removed.  This also means that functions including
9245bd8deadSopenharmony_ci    TransformFeedbackVaryingsNV, GetVaryingLocationNV, GetActiveVaryingNV,
9255bd8deadSopenharmony_ci    ActiveVaryingNV, and GetTransformFeedbackVaryingNV will not be
9265bd8deadSopenharmony_ci    supported, and enums that are relevant only in the context of shader and
9275bd8deadSopenharmony_ci    program objects will not be accepted.
9285bd8deadSopenharmony_ci
9295bd8deadSopenharmony_ciErrors
9305bd8deadSopenharmony_ci
9315bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by BeginQuery if called with an
9325bd8deadSopenharmony_ci    <id> of zero, if the active query object name for <target> is non- zero,
9335bd8deadSopenharmony_ci    or if <id> is the active query object name for any query type.
9345bd8deadSopenharmony_ci
9355bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by EndQuery if the active query
9365bd8deadSopenharmony_ci    object name for <target> is zero.
9375bd8deadSopenharmony_ci
9385bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated if Begin, or any command that
9395bd8deadSopenharmony_ci    performs an explicit Begin, is called when:
9405bd8deadSopenharmony_ci
9415bd8deadSopenharmony_ci      * A geometry program or shader is not active AND the begin mode does not
9425bd8deadSopenharmony_ci        match the allowed begin modes for the current transform feedback state
9435bd8deadSopenharmony_ci        as given by table X.1.
9445bd8deadSopenharmony_ci
9455bd8deadSopenharmony_ci      * A geometry program or shader is active AND the output primitive type
9465bd8deadSopenharmony_ci        (of the geometry program / shader) does not match the allowed begin
9475bd8deadSopenharmony_ci        modes for the current transform feedback state as given by table X.1.
9485bd8deadSopenharmony_ci
9495bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by BeginTransformFeedbackNV if
9505bd8deadSopenharmony_ci    there is no buffer object bound to index 0 in INTERLEAVED_ATTRIBS_NV
9515bd8deadSopenharmony_ci    mode.
9525bd8deadSopenharmony_ci
9535bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by BeginTransformFeedbackNV if
9545bd8deadSopenharmony_ci    the number of buffer objects bound in SEPARATE_ATTRIBS_NV mode is less
9555bd8deadSopenharmony_ci    than the number of buffer objects required, as given by the current
9565bd8deadSopenharmony_ci    transform feedback state.
9575bd8deadSopenharmony_ci
9585bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by BeginTransformFeedbackNV if
9595bd8deadSopenharmony_ci    no attributes are specified to be captured.
9605bd8deadSopenharmony_ci
9615bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by BeginTransformFeedbackNV,
9625bd8deadSopenharmony_ci    TransformFeedbackVaryingsNV, TransformFeedbackAttribsNV, or UseProgram or
9635bd8deadSopenharmony_ci    LinkProgram, called on the currently in use program object, while
9645bd8deadSopenharmony_ci    transform feedback is active.
9655bd8deadSopenharmony_ci
9665bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by EndTransformFeedbackNV while
9675bd8deadSopenharmony_ci    transform feedback is inactive.
9685bd8deadSopenharmony_ci
9695bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by BindBufferRangeNV,
9705bd8deadSopenharmony_ci    BindBufferOffsetNV or BindBufferBaseNV if <target> is
9715bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_BUFFER_NV and <index> is greater or equal
9725bd8deadSopenharmony_ci    than MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV.
9735bd8deadSopenharmony_ci
9745bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by BindBufferRangeNV if the value of
9755bd8deadSopenharmony_ci    <size> <= 0.
9765bd8deadSopenharmony_ci
9775bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by BindBufferRangeNV or
9785bd8deadSopenharmony_ci    BindBufferOffsetNV if <start> or <end> are not word-aligned.
9795bd8deadSopenharmony_ci
9805bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated when any of the BindBuffer*
9815bd8deadSopenharmony_ci    commands is called while transform feedback is active.
9825bd8deadSopenharmony_ci
9835bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by TransformFeedbackVaryingsNV
9845bd8deadSopenharmony_ci    commands if any location appears more than once in the array <locations.
9855bd8deadSopenharmony_ci
9865bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by TransformFeedbackVaryingsNV
9875bd8deadSopenharmony_ci    if any location in <locations> references a non-existing varying variable.
9885bd8deadSopenharmony_ci
9895bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by TransformFeedbackVaryingsNV
9905bd8deadSopenharmony_ci    if <program> has not been linked successfully.
9915bd8deadSopenharmony_ci
9925bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by TransformFeedbackVaryingsNV
9935bd8deadSopenharmony_ci    in INTERLEAVED_ATTRIBS_NV mode if the total number of components of all
9945bd8deadSopenharmony_ci    varying variables specified in the array <locations> is greater than
9955bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV.
9965bd8deadSopenharmony_ci
9975bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by TransformFeedbackVaryingsNV or
9985bd8deadSopenharmony_ci    TransformFeedbackAttribsNV in SEPARATE_ATTRIBS_NV mode if <count> is
9995bd8deadSopenharmony_ci    greater than MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV.
10005bd8deadSopenharmony_ci
10015bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by TransformFeedbackVaryingsNV in
10025bd8deadSopenharmony_ci    SEPARATE_ATTRIBS_NV mode if the number of components for each varying
10035bd8deadSopenharmony_ci    variable in the array <locations> is greater than
10045bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV.
10055bd8deadSopenharmony_ci
10065bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by TransformFeedbackAttribsNV in
10075bd8deadSopenharmony_ci    INTERLEAVED_ATTRIBS_NV mode if the sum of the values of the components of
10085bd8deadSopenharmony_ci    the attributes in the array <attribs> is greater than
10095bd8deadSopenharmony_ci    MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV.
10105bd8deadSopenharmony_ci
10115bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by TransformFeedbackAttribsNV if
10125bd8deadSopenharmony_ci    an enum value is specified more than once in the array <attribs>.
10135bd8deadSopenharmony_ci
10145bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by TransformFeedbackAttribsNV if
10155bd8deadSopenharmony_ci    the number of components for each attribute in the array <attribs> is
10165bd8deadSopenharmony_ci    outside the range [0,4].
10175bd8deadSopenharmony_ci
10185bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by TransformFeedbackAttribsNV if the
10195bd8deadSopenharmony_ci    index value is in the array <attribs> is outside the allowable range for
10205bd8deadSopenharmony_ci    an attribute enumerant corresponding to more than one real attribute.
10215bd8deadSopenharmony_ci
10225bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by GetVaryingLocationNV if
10235bd8deadSopenharmony_ci    <program> is not the name of a program object or if <program> has not been
10245bd8deadSopenharmony_ci    linked successfully.
10255bd8deadSopenharmony_ci
10265bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by GetActiveVaryingNV or
10275bd8deadSopenharmony_ci    ActiveVaryingNV if <program> is not the name of a program object.
10285bd8deadSopenharmony_ci
10295bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by GetActiveVaryingNV if <index> is
10305bd8deadSopenharmony_ci    greater than or equal to ACTIVE_VARYINGS_NV.
10315bd8deadSopenharmony_ci
10325bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by GetIntegerIndexedvEXT() or
10335bd8deadSopenharmony_ci    GetBooleanIndexedv() with <param> set to TRANSFORM_FEEDBACK_RECORD_NV if
10345bd8deadSopenharmony_ci    <index> is greater than or equal to TRANSFORM_FEEDBACK_ATTRIBS_NV.
10355bd8deadSopenharmony_ci
10365bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by GetIntegerIndexedvEXT() or
10375bd8deadSopenharmony_ci    GetBooleanIndexedvEXT() with <param> set to
10385bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_BUFFER_BINDING_NV if <index> is greater than or equal
10395bd8deadSopenharmony_ci    to MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV.
10405bd8deadSopenharmony_ci
10415bd8deadSopenharmony_ci    The error INVALID_VALUE is generated by GetTransformFeedbackVaryingsNV if
10425bd8deadSopenharmony_ci    <index> is greater than the program object specific value
10435bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_VARYINGS_NV - 1.
10445bd8deadSopenharmony_ci
10455bd8deadSopenharmony_ci    The error INVALID_OPERATION is generated by
10465bd8deadSopenharmony_ci    GetTransformFeedbackVaryingsNV if <program> is not the name of a program
10475bd8deadSopenharmony_ci    object, or if program object has not been linked successfully.
10485bd8deadSopenharmony_ci
10495bd8deadSopenharmony_ciNew State
10505bd8deadSopenharmony_ci
10515bd8deadSopenharmony_ci    (Add a new table:  Table 6.X,  Transform Feedback State)
10525bd8deadSopenharmony_ci
10535bd8deadSopenharmony_ci    Get Value             Type    Get Command     Init. Value  Description                Sec    Attrib
10545bd8deadSopenharmony_ci    ------------------    ------  --------------  ------------ -------------------------  -----  ------
10555bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_   Z2      GetIntegerv     INTERLEAVED_  Transform feedback mode   2.Y      -
10565bd8deadSopenharmony_ci      BUFFER_MODE_NV                              ATTRIBS_NV
10575bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_   Z2      GetIntegerv          0        Number of attributes to   2.Y      -
10585bd8deadSopenharmony_ci      ATTRIBS_NV                                                capture in transform
10595bd8deadSopenharmony_ci                                                                feedback mode
10605bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_   Z+      GetIntegerv          0        Buffer object bound to    6.1.13   -
10615bd8deadSopenharmony_ci      BUFFER_BINDING_NV                                         generic bind point for
10625bd8deadSopenharmony_ci                                                                transform feedback.
10635bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_   nx3*Z+  GetInteger-          0        Name, component count,    6.1.14   -
10645bd8deadSopenharmony_ci      RECORD_NV                   IndexedvEXT                   and index of each 
10655bd8deadSopenharmony_ci                                                                attribute captured
10665bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_   nxZ+    GetInteger-          0        Buffer object bound to    6.1.13   -
10675bd8deadSopenharmony_ci      BUFFER_BINDING_NV           IndexedvEXT                   each transform feedback
10685bd8deadSopenharmony_ci                                                                attribute stream.
10695bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_   nxZ+    GetInteger-          0        Start offset of binding   6.1.13   -
10705bd8deadSopenharmony_ci      BUFFER_START_NV             IndexedvEXT                   range for each transform
10715bd8deadSopenharmony_ci                                                                feedback attrib. stream
10725bd8deadSopenharmony_ci    TRANSFORM_FEEDBACK_   nxZ+    GetInteger-          0        Size of binding range     6.1.13   -
10735bd8deadSopenharmony_ci      BUFFER_SIZE_NV              IndexedvEXT                   for each transform
10745bd8deadSopenharmony_ci                                                                feedback attrib. stream
10755bd8deadSopenharmony_ci
10765bd8deadSopenharmony_ci   (Modify Table 6.37, p 298, updating the query object state to cover
10775bd8deadSopenharmony_ci   transform feedback.)
10785bd8deadSopenharmony_ci
10795bd8deadSopenharmony_ci    Get Value         Type  Get Command       Init. Value  Description                Sec    Attribute
10805bd8deadSopenharmony_ci    ----------------  ----  ----------------  -----------  -------------------------  -----  ---------
10815bd8deadSopenharmony_ci    CURRENT_QUERY     3xZ+  GetQueryiv        0            Active query object name   2.X        -
10825bd8deadSopenharmony_ci                                                           (occlusion, timer, xform
10835bd8deadSopenharmony_ci                                                            feedback)
10845bd8deadSopenharmony_ci    QUERY_RESULT      3xZ+  GetQueryObjectiv  0            Query object result        2.X        -
10855bd8deadSopenharmony_ci                                                           (samples passed, Time
10865bd8deadSopenharmony_ci                                                           elapsed, feedback data amount)
10875bd8deadSopenharmony_ci    QUERY_RESULT_AVAILABLE  3xZ+  GetQueryObjectiv  TRUE   Query object result        2.X        -
10885bd8deadSopenharmony_ci                                                             available?
10895bd8deadSopenharmony_ci
10905bd8deadSopenharmony_ci   (Modify Table 6.29, p. 290, Program Object State. Add the following state.)
10915bd8deadSopenharmony_ci
10925bd8deadSopenharmony_ci    Get Value           Type  Get Command   Init. Value  Description                 Sec    Attribute
10935bd8deadSopenharmony_ci    ----------------    ----  ------------  -----------  -------------------------   -----  ---------
10945bd8deadSopenharmony_ci   ACTIVE_VARYINGS_NV   Z+    GetProgramiv       0       Number of active varyings   2.15.3     -
10955bd8deadSopenharmony_ci   ACTIVE_VARYING_MAX_  Z+    GetProgramiv       0       Maximum active varying      2.15.3     -
10965bd8deadSopenharmony_ci     LENGTH_NV                                           name length
10975bd8deadSopenharmony_ci   TRANSFORM_FEEDBACK_  Z2    GetProgramiv  INTERLEAVED_ Transform feedback mode     6.1.14     -
10985bd8deadSopenharmony_ci     BUFFER_MODE_NV                         ATTRIBS_NV   for the program
10995bd8deadSopenharmony_ci   TRANSFORM_FEEDBACK_  Z+    GetProgramiv       0       Number of varyings to       6.1.14     -
11005bd8deadSopenharmony_ci     VARYINGS_NV                                         stream to buffer object(s)
11015bd8deadSopenharmony_ci        -               nxZ+  GetVarying-        -       Location of each active     2.15.3     -
11025bd8deadSopenharmony_ci                              LocationNV                 varying variable
11035bd8deadSopenharmony_ci        -               Z+    GetActive-          -      Size of each active         2.15.3     -
11045bd8deadSopenharmony_ci                              VaryingNV                  varying variable
11055bd8deadSopenharmony_ci        -               Z+    GetActive-          -      Type of each active         2.15.3     -
11065bd8deadSopenharmony_ci                              VaryingNV                  varying variable
11075bd8deadSopenharmony_ci        -               0+x-  GetActive-          -      Name of each active         2.15.3     -
11085bd8deadSopenharmony_ci                        char  VaryingNV                  varying variable
11095bd8deadSopenharmony_ci        -               Z+    GetTransform-       -      Varying location for one    6.1.14     -
11105bd8deadSopenharmony_ci                              Feedback-                  of the multiple varyings
11115bd8deadSopenharmony_ci                              VaryingNV                  to capture
11125bd8deadSopenharmony_ci
11135bd8deadSopenharmony_ciNew Implementation Dependent State
11145bd8deadSopenharmony_ci
11155bd8deadSopenharmony_ci   (Modify Table 6.34, p. 295.  Update the query object state to cover
11165bd8deadSopenharmony_ci   transform feedback.)
11175bd8deadSopenharmony_ci
11185bd8deadSopenharmony_ci    Get Value               Type Get Command  Minimum Value  Description                  Sec     Attribute
11195bd8deadSopenharmony_ci    --------------------    ---- -----------  -------------  --------------------------   ------  ---------
11205bd8deadSopenharmony_ci    QUERY_COUNTER_BITS      2xZ+ GetQueryiv   see 6.1.12     Asynchronous query counter   6.1.12    -
11215bd8deadSopenharmony_ci                                                             bits (occlusion, timer, 
11225bd8deadSopenharmony_ci                                                             transform feedback queries)
11235bd8deadSopenharmony_ci
11245bd8deadSopenharmony_ci   (Add a new table, Table 6.X. Transform Feedback State.)
11255bd8deadSopenharmony_ci
11265bd8deadSopenharmony_ci   NOTE:  In the "GetValue" columns below, MXFB stands for
11275bd8deadSopenharmony_ci   "MAX_TRANSFORM_FEEDBACK".
11285bd8deadSopenharmony_ci
11295bd8deadSopenharmony_ci    Get Value               Type Get Command  Minimum Value  Description                  Sec     Attribute
11305bd8deadSopenharmony_ci    --------------------    ---- -----------  -------------  --------------------------   ------  ---------
11315bd8deadSopenharmony_ci    MXFB_INTERLEAVED_       Z+   GetIntegerv  64             Max number of components to  2.Y       -
11325bd8deadSopenharmony_ci    COMPONENTS_NV                                            write to a single buffer in
11335bd8deadSopenharmony_ci                                                             interleaved mode
11345bd8deadSopenharmony_ci    MXFB_SEPARATE_          Z+   GetIntegerv  4              Max number of separate       2.Y       -
11355bd8deadSopenharmony_ci    ATTRIBS_NV                                               attributes or varyings that
11365bd8deadSopenharmony_ci                                                             can be captured in transform
11375bd8deadSopenharmony_ci                                                             feedback
11385bd8deadSopenharmony_ci    MXFB_SEPARATE           Z+   GetIntegerv  4              Max number of components     2.Y       -
11395bd8deadSopenharmony_ci    COMPONENTS_NV                                            per attribute or varying 
11405bd8deadSopenharmony_ci                                                             in separate mode
11415bd8deadSopenharmony_ci
11425bd8deadSopenharmony_ciIssues
11435bd8deadSopenharmony_ci
11445bd8deadSopenharmony_ci    1. How does transform feedback differ from core GL feedback?
11455bd8deadSopenharmony_ci
11465bd8deadSopenharmony_ci      * Transform feedback writes vertex data to buffer objects, which allows
11475bd8deadSopenharmony_ci        the data returned to be used directly by vertex pulling.  GL feedback
11485bd8deadSopenharmony_ci        mode writes vertex data to a buffer in system memory.
11495bd8deadSopenharmony_ci
11505bd8deadSopenharmony_ci      * Transform feedback is done after transformation, but prior to
11515bd8deadSopenharmony_ci        clipping.  The primitives returned contain the original transformed
11525bd8deadSopenharmony_ci        vertices produced by vertex or geometry program execution, and does
11535bd8deadSopenharmony_ci        not contain any primitives inserted by clipping.
11545bd8deadSopenharmony_ci
11555bd8deadSopenharmony_ci      * Transform feedback supports only a single basic output primitive type
11565bd8deadSopenharmony_ci        (points, lines, or triangles), while core GL feedback mode supports
11575bd8deadSopenharmony_ci        all primitive types.  Since only one primitive type is supported, the
11585bd8deadSopenharmony_ci        data returned does not contain tokens describing each primitive being
11595bd8deadSopenharmony_ci        fed back.  Primitive tokens make the data returned by GL feedback mode
11605bd8deadSopenharmony_ci        irregular and unsuitable for vertex pulling.
11615bd8deadSopenharmony_ci
11625bd8deadSopenharmony_ci    2. What should this extension be called?
11635bd8deadSopenharmony_ci
11645bd8deadSopenharmony_ci      RESOLVED: The current name is "NV_transform_feedback", playing off the
11655bd8deadSopenharmony_ci      fact that it is transformed primitives that are handled and the
11665bd8deadSopenharmony_ci      similarities to GL feedback mode.
11675bd8deadSopenharmony_ci
11685bd8deadSopenharmony_ci    3. What happens if you bind a buffer for transform feedback that is
11695bd8deadSopenharmony_ci       currently bound for other purposes?  Should we somehow detect this case
11705bd8deadSopenharmony_ci       and produce an error?
11715bd8deadSopenharmony_ci
11725bd8deadSopenharmony_ci      !!! NBC I feel strongly that we should follow the precedent for
11735bd8deadSopenharmony_ci      Map/Unmap. The reason that MapBuffer and UnmapBuffer are a precedent
11745bd8deadSopenharmony_ci      here is because while a buffer object is in the mapped state, no GL
11755bd8deadSopenharmony_ci      commands are allowed to operate on the buffer object's data.  So by
11765bd8deadSopenharmony_ci      analogy, while a buffer is being used for transform feedback, no other
11775bd8deadSopenharmony_ci      GL commands should be allowed to operate on the buffer object's data.
11785bd8deadSopenharmony_ci      This includes initiating any rendering which would cause the GL to
11795bd8deadSopenharmony_ci      source data from an active transform feedback buffer object.
11805bd8deadSopenharmony_ci
11815bd8deadSopenharmony_ci      UNRESOLVED
11825bd8deadSopenharmony_ci
11835bd8deadSopenharmony_ci    4. Should this extension include any new buffer object binding targets, or
11845bd8deadSopenharmony_ci       should it overload ARRAY_BUFFER, or should we skip the binding target
11855bd8deadSopenharmony_ci       altogether in favor of a buffer object name accepted directly by the
11865bd8deadSopenharmony_ci       new GL commands?
11875bd8deadSopenharmony_ci
11885bd8deadSopenharmony_ci      RESOLVED: There are new binding points for XFB along with a new API
11895bd8deadSopenharmony_ci      (BindBufferBase etc) to set the internal binding points. A new binding
11905bd8deadSopenharmony_ci      point, TRANSFORM_FEEDBACK_BUFFER_NV is also introduced.
11915bd8deadSopenharmony_ci
11925bd8deadSopenharmony_ci    5. Previous buffer object extensions provided a way to have existing GL
11935bd8deadSopenharmony_ci       commands reference a buffer object instead of a user-supplied buffer.
11945bd8deadSopenharmony_ci       Should the new commands introduced here allow referencing a
11955bd8deadSopenharmony_ci       user-supplied buffer in addition to a buffer object?
11965bd8deadSopenharmony_ci
11975bd8deadSopenharmony_ci      RESOLVED: No. A program can get the contents of the feedback buffer back
11985bd8deadSopenharmony_ci      to the CPU using MapBuffer and GetBufferSubData
11995bd8deadSopenharmony_ci
12005bd8deadSopenharmony_ci    6. Is BeginTransformFeedback really necessary? Could the query just
12015bd8deadSopenharmony_ci       initiate the transform feedback mode?
12025bd8deadSopenharmony_ci
12035bd8deadSopenharmony_ci      RESOLUTION: Using BeginTransformFeedback and EndTransformFeedback gives
12045bd8deadSopenharmony_ci      a clean place to spec all of the transform-feedback-specific issues
12055bd8deadSopenharmony_ci      without cluttering up the query language. Also, the queries don't have
12065bd8deadSopenharmony_ci      to be done at the same time as beginning and ending the feedback
12075bd8deadSopenharmony_ci      process.
12085bd8deadSopenharmony_ci
12095bd8deadSopenharmony_ci    7. What usage enums should be provided to glBufferData for use in
12105bd8deadSopenharmony_ci       conjunction with transform feedback?
12115bd8deadSopenharmony_ci
12125bd8deadSopenharmony_ci      RESOLVED: STREAM_COPY or STREAM_READ are expected to be the most common
12135bd8deadSopenharmony_ci      usages. If a buffer object is being written by the GL through transform
12145bd8deadSopenharmony_ci      feedback, and the contents of the buffer object are subsequently being
12155bd8deadSopenharmony_ci      consumed by the GL (e.g. by being used as a vertex buffer object), then
12165bd8deadSopenharmony_ci      this is a *_COPY usage. If the buffer object is being written by the GL
12175bd8deadSopenharmony_ci      through transform feedback, but is being consumed by the application
12185bd8deadSopenharmony_ci      (e.g. being mapped for read), this is a *_READ usage.  The temporal
12195bd8deadSopenharmony_ci      (STREAM, STATIC, or DYNAMIC) component of the usage enum is determined
12205bd8deadSopenharmony_ci      by the ratio between how often the contents of the buffer object are
12215bd8deadSopenharmony_ci      modified and how often operations that source data from the buffer
12225bd8deadSopenharmony_ci      object occur.
12235bd8deadSopenharmony_ci
12245bd8deadSopenharmony_ci    8. What should the behavior be when a buffer object is the active target
12255bd8deadSopenharmony_ci       of transform feedback, and it is deleted via DeleteBuffers?
12265bd8deadSopenharmony_ci
12275bd8deadSopenharmony_ci      RESOLVED: Deletion is deferred until the EndTransformFeedback if
12285bd8deadSopenharmony_ci      transform feedback is active.
12295bd8deadSopenharmony_ci
12305bd8deadSopenharmony_ci    9. Should we allow more buffers to be bound than are used?
12315bd8deadSopenharmony_ci
12325bd8deadSopenharmony_ci      RESOLVED: Yes. The extra buffers are not in the way and can stay bound.
12335bd8deadSopenharmony_ci
12345bd8deadSopenharmony_ci    10. Should we allow feedback to buffer lists with holes (i.e. 0 and 2
12355bd8deadSopenharmony_ci        bound)?
12365bd8deadSopenharmony_ci
12375bd8deadSopenharmony_ci      RESOLVED: No. This makes for an ugly API with the potential for bugs,
12385bd8deadSopenharmony_ci      without any real benefit. The application can as well bind all buffers
12395bd8deadSopenharmony_ci      needed to incremented indices. It is an invalid operation to not have a
12405bd8deadSopenharmony_ci      buffer bound where one is required.
12415bd8deadSopenharmony_ci
12425bd8deadSopenharmony_ci    11. Why only one feedback primitive mode per feedback invocation?
12435bd8deadSopenharmony_ci
12445bd8deadSopenharmony_ci      RESOLVED: Having primitive tokens breaks up the stream and makes it less
12455bd8deadSopenharmony_ci      amenable to being read back in as a vertex buffer. Also, mixing multiple
12465bd8deadSopenharmony_ci      primitive types makes the counting of primitives less clear for the
12475bd8deadSopenharmony_ci      application.
12485bd8deadSopenharmony_ci
12495bd8deadSopenharmony_ci    12. Is RasterPos fed back?
12505bd8deadSopenharmony_ci
12515bd8deadSopenharmony_ci      RESOLVED: No.
12525bd8deadSopenharmony_ci
12535bd8deadSopenharmony_ci    13. Is DrawPixels/CopyPixels/Bitmap fed back?
12545bd8deadSopenharmony_ci
12555bd8deadSopenharmony_ci      RESOLVED: No. Rasterization occurs as normal, but there is no
12565bd8deadSopenharmony_ci      output to the feedback buffer. This is consistent with taking a
12575bd8deadSopenharmony_ci      tap out of the pipe before clipping.
12585bd8deadSopenharmony_ci
12595bd8deadSopenharmony_ci    14. Why do we need new BindBuffer* functions?
12605bd8deadSopenharmony_ci
12615bd8deadSopenharmony_ci      RESOLVED: All previous buffer object extensions have been retrofits of
12625bd8deadSopenharmony_ci      existing pointer-based APIs. New extensions built assuming buffer
12635bd8deadSopenharmony_ci      objects don't have that history, so need a new API. The functionality of
12645bd8deadSopenharmony_ci      these new functions combines the functionality of BindBuffer, to set the
12655bd8deadSopenharmony_ci      external bind point used by calls like MapBuffer and BufferSubData, with
12665bd8deadSopenharmony_ci      the functionality to set an internal bind point like VertexAttribPointer
12675bd8deadSopenharmony_ci      does.
12685bd8deadSopenharmony_ci
12695bd8deadSopenharmony_ci   15. How do the transform feedback indices, passed to the BindBuffer*
12705bd8deadSopenharmony_ci       commands, work with multiple bindings?
12715bd8deadSopenharmony_ci
12725bd8deadSopenharmony_ci      RESOLVED: The same way that they work with vertex arrays. There is one
12735bd8deadSopenharmony_ci      external bind point, TRANSFORM_FEEDBACK_BUFFER_NV. There are n internal
12745bd8deadSopenharmony_ci      bind points, selected with the <index> parameter to the BindBuffer*
12755bd8deadSopenharmony_ci      commands, where n is some implementation dependent limit. The
12765bd8deadSopenharmony_ci      BindBuffer* commands take the buffer passed and bind it to the external
12775bd8deadSopenharmony_ci      bind point, as well as to the selected internal bind point.
12785bd8deadSopenharmony_ci
12795bd8deadSopenharmony_ci      For example:
12805bd8deadSopenharmony_ci
12815bd8deadSopenharmony_ci        BindBufferOffsetNV(TRANSFORM_FEEDBACK_BUFFER_NV, 0, 1, 12); 
12825bd8deadSopenharmony_ci        // XFB index 0 points at buffer 1 with offset 12
12835bd8deadSopenharmony_ci
12845bd8deadSopenharmony_ci        BindBuffer(TRANSFORM_FEEDBACK_BUFFER_NV, 2); 
12855bd8deadSopenharmony_ci        // Buffer 2 is now bound to the external bind point. XFB index 0 still
12865bd8deadSopenharmony_ci        // points at buffer 1
12875bd8deadSopenharmony_ci
12885bd8deadSopenharmony_ci        MapBuffer(TRANSFORM_FEEDBACK_BUFFER_NV, ...); 
12895bd8deadSopenharmony_ci        // Maps buffer 2
12905bd8deadSopenharmony_ci
12915bd8deadSopenharmony_ci    16. How are quads/quadstrips/polygons tessellated into triangles?
12925bd8deadSopenharmony_ci
12935bd8deadSopenharmony_ci      RESOLVED: In an implementation-dependent manner. OpenGL doesn't define
12945bd8deadSopenharmony_ci      quads or polygons in terms of triangles, so there is no one correct way
12955bd8deadSopenharmony_ci      to do it, and different GPUs may implement the behavior differently. A
12965bd8deadSopenharmony_ci      quad may be split into two triangles in several different ways, and an
12975bd8deadSopenharmony_ci      application may not rely on this behavior.
12985bd8deadSopenharmony_ci
12995bd8deadSopenharmony_ci    17. How does this extension interact with display lists?
13005bd8deadSopenharmony_ci
13015bd8deadSopenharmony_ci      RESOLVED: Just like the VBO extension, none of the BindBuffer* commands
13025bd8deadSopenharmony_ci      are compiled into a display list.
13035bd8deadSopenharmony_ci
13045bd8deadSopenharmony_ci    18. Does polygon mode state affect the logic that determines if the
13055bd8deadSopenharmony_ci        transform feed back primitive mode and the render mode states are
13065bd8deadSopenharmony_ci        valid at the start of transform feedback mode?
13075bd8deadSopenharmony_ci
13085bd8deadSopenharmony_ci      RESOLVED: PolygonMode has no influence on the BeginTransFormFeedback
13095bd8deadSopenharmony_ci      primitiveMode check since it is performed later, in raster.
13105bd8deadSopenharmony_ci
13115bd8deadSopenharmony_ci    19. What to do with incomplete primitives?
13125bd8deadSopenharmony_ci
13135bd8deadSopenharmony_ci      RESOLVED: If there is no room to store one or more vertices of a
13145bd8deadSopenharmony_ci      primitive in a buffer object, none of the vertices in that primitive are
13155bd8deadSopenharmony_ci      written to the buffer. If a partial primitive enters transform feedback
13165bd8deadSopenharmony_ci      (i.e. only two vertices sent in triangles mode), none of the vertices in
13175bd8deadSopenharmony_ci      that primitive are written to the buffer object.
13185bd8deadSopenharmony_ci
13195bd8deadSopenharmony_ci    20. Why does TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV have a
13205bd8deadSopenharmony_ci        TRANSFORM_FEEDBACK prefix but PRIMITIVES_GENERATED_NV doesn't?
13215bd8deadSopenharmony_ci
13225bd8deadSopenharmony_ci      RESOLVED: The number of primitives generated is independent of any
13235bd8deadSopenharmony_ci      feedback that is active. The number of primitives that are written is
13245bd8deadSopenharmony_ci      only valid for transform feedback - another extension could conceivably
13255bd8deadSopenharmony_ci      have a different way of writing out primitives that would require a
13265bd8deadSopenharmony_ci      similar but distinct token.
13275bd8deadSopenharmony_ci
13285bd8deadSopenharmony_ci    21. When a GLSL vertex shader is active, what happens in transform
13295bd8deadSopenharmony_ci        feedback mode if non-active varying variables are specified?
13305bd8deadSopenharmony_ci
13315bd8deadSopenharmony_ci      DISCUSSION: Active varying variables are varying variables, declared in
13325bd8deadSopenharmony_ci      the shader, that the linker determined are actually needed. As an
13335bd8deadSopenharmony_ci      optimization, the linker can discard the ones declared, but not
13345bd8deadSopenharmony_ci      needed. If non-active varying variables need to be fed into a buffer
13355bd8deadSopenharmony_ci      object, the linker should not perform this optimization.
13365bd8deadSopenharmony_ci
13375bd8deadSopenharmony_ci      There are three suggested resolutions to this problem:
13385bd8deadSopenharmony_ci
13395bd8deadSopenharmony_ci        1. The set of varying variables that need to be streamed to a buffer
13405bd8deadSopenharmony_ci           object in transform feedback mode are set as a property of the
13415bd8deadSopenharmony_ci           program object, and are taken into account during the link step.
13425bd8deadSopenharmony_ci           This means that changing the set means the application will have to
13435bd8deadSopenharmony_ci           re-link the program object in order to have the change take effect.
13445bd8deadSopenharmony_ci
13455bd8deadSopenharmony_ci        2. The set of varying variables that need to be streamed to a buffer
13465bd8deadSopenharmony_ci           object in transform feedback mode are specified after the program
13475bd8deadSopenharmony_ci           object has been linked. This is the most flexible option from the
13485bd8deadSopenharmony_ci           applications perspective, but this might mean that a) specifying
13495bd8deadSopenharmony_ci           this set could force the GL to re-link 'under the covers', and b)
13505bd8deadSopenharmony_ci           could mean that the GL runs out of varying variable slots because
13515bd8deadSopenharmony_ci           the combined total of the set of active varyings and the varyings
13525bd8deadSopenharmony_ci           to stream in transform feedback mode is too large.
13535bd8deadSopenharmony_ci
13545bd8deadSopenharmony_ci        3. This solution is a hybrid of the above two approaches. The set of
13555bd8deadSopenharmony_ci           potential varying variables that need to be streamed to a buffer
13565bd8deadSopenharmony_ci           object are set as a property of the program object. These varying
13575bd8deadSopenharmony_ci           variables are marked as active by the application and therefore
13585bd8deadSopenharmony_ci           cannot be eliminated during the link step. However, a sub-set of
13595bd8deadSopenharmony_ci           varying variables to actually stream to a buffer object can be
13605bd8deadSopenharmony_ci           changed without the application having to re-link the program
13615bd8deadSopenharmony_ci           object. This approach gives the application flexibility to change
13625bd8deadSopenharmony_ci           the set of varying variables to stream, while it eliminates the
13635bd8deadSopenharmony_ci           need for the GL to compile 'under the covers'.
13645bd8deadSopenharmony_ci
13655bd8deadSopenharmony_ci      RESOLUTION: Option 3 offers a good compromise, and therefore we'll go
13665bd8deadSopenharmony_ci      with that.
13675bd8deadSopenharmony_ci
13685bd8deadSopenharmony_ci    22. Given option 3 in the previous resolution, how to specify that a
13695bd8deadSopenharmony_ci        varying variable has to be considered active by the linker?
13705bd8deadSopenharmony_ci
13715bd8deadSopenharmony_ci      DISCUSSION: There are two approaches to the application specifying which
13725bd8deadSopenharmony_ci      varying variables are active. We can either provide a simple flag that
13735bd8deadSopenharmony_ci      specifies that all varying variables are considered active, or we can
13745bd8deadSopenharmony_ci      provide a more complex mechanism where the application can specify an
13755bd8deadSopenharmony_ci      individual varying variable as being active.
13765bd8deadSopenharmony_ci
13775bd8deadSopenharmony_ci      RESOLUTION: RESOLVED. The 'all or nothing' flag is a simple idea, but
13785bd8deadSopenharmony_ci      has a drawback when used with a 'uber-shader' that implements many paths
13795bd8deadSopenharmony_ci      to achieve an effect, but only one path is used during any run of the
13805bd8deadSopenharmony_ci      shader. In this case, a lot more varying variables might be flagged as
13815bd8deadSopenharmony_ci      active then really is necessary, running the risk of running out of
13825bd8deadSopenharmony_ci      resources. Therefore, we'll provide a mechanism for the application to
13835bd8deadSopenharmony_ci      specify on a per varying variable basis if it is active.
13845bd8deadSopenharmony_ci
13855bd8deadSopenharmony_ci    23. Given the discussion in the previous issues, should a
13865bd8deadSopenharmony_ci        GetActiveVarying() command be added, modeled after the existing
13875bd8deadSopenharmony_ci        getActiveUniform() command?
13885bd8deadSopenharmony_ci
13895bd8deadSopenharmony_ci      DISCUSSION: Such a command will return the list of active uniforms,
13905bd8deadSopenharmony_ci      after the program object has been linked. As per issue 22's resolution,
13915bd8deadSopenharmony_ci      the complete set of varying variables that could be streamed to a buffer
13925bd8deadSopenharmony_ci      object needs to be specified before the program object is linked.
13935bd8deadSopenharmony_ci
13945bd8deadSopenharmony_ci      It can be useful to an application to stream out a subset of the active
13955bd8deadSopenharmony_ci      varying variables or to find out the whole set of active varyings,
13965bd8deadSopenharmony_ci      especially since the set can be implementation dependent.
13975bd8deadSopenharmony_ci
13985bd8deadSopenharmony_ci      RESOLUTION: YES.
13995bd8deadSopenharmony_ci
14005bd8deadSopenharmony_ci    24. What is proper use of the command ActiveVaryingNV()?
14015bd8deadSopenharmony_ci
14025bd8deadSopenharmony_ci      RESOLVED: The application is well advised to force any varying variable
14035bd8deadSopenharmony_ci      live that it needs for transform feedback purposes. The set of active
14045bd8deadSopenharmony_ci      varying variables are linker dependent. For example, if a program object
14055bd8deadSopenharmony_ci      has no fragment shader, then the LinkProgram command cannot typically
14065bd8deadSopenharmony_ci      determine which built-in varying variables, output by a geometry or
14075bd8deadSopenharmony_ci      vertex shader, are active. This is because the fragment processing state
14085bd8deadSopenharmony_ci      can change, and therefore such a determination cannot be made until a
14095bd8deadSopenharmony_ci      render command is issued. Furthermore, any user-defined varyings are
14105bd8deadSopenharmony_ci      likely to be marked as non-active if there is no fragment shader because
14115bd8deadSopenharmony_ci      they are guaranteed to have no effect on fixed-function fragment
14125bd8deadSopenharmony_ci      processing. If there is both a vertex (or geometry) and fragment shader
14135bd8deadSopenharmony_ci      in a program object, the application can probably deduce what will be an
14145bd8deadSopenharmony_ci      active varying variable, or not. But beware of any (static) flow-control
14155bd8deadSopenharmony_ci      that the linker can use to do cross vertex- fragment optimization to
14165bd8deadSopenharmony_ci      cull any varying variables.
14175bd8deadSopenharmony_ci
14185bd8deadSopenharmony_ci    25. Are primitives sent down the pipeline after transform feedback, or
14195bd8deadSopenharmony_ci        discarded?
14205bd8deadSopenharmony_ci
14215bd8deadSopenharmony_ci      RESOLVED: Primitives can be optionally discarded before rasterization by
14225bd8deadSopenharmony_ci      calling Enable and Disable with RASTERIZER_DISCARD_NV. When enabled,
14235bd8deadSopenharmony_ci      primitives are discarded after vertex attributes are recorded into the
14245bd8deadSopenharmony_ci      buffer objects bound to transform feedback.  When disabled, primitives
14255bd8deadSopenharmony_ci      are passed through to the rasterization stage to be clipped and
14265bd8deadSopenharmony_ci      rasterized normally. All rasterization operations are discarded, not
14275bd8deadSopenharmony_ci      just those that are fed back into the buffer.
14285bd8deadSopenharmony_ci
14295bd8deadSopenharmony_ci      This applies to DrawPixels, CopyPixels, Bitmap, Clear, Accum as well.
14305bd8deadSopenharmony_ci
14315bd8deadSopenharmony_ci    26. If a varying is declared as an array, is the whole array streamed out?
14325bd8deadSopenharmony_ci
14335bd8deadSopenharmony_ci      RESOLVED: No, the application has to specify which elements of an array
14345bd8deadSopenharmony_ci      it wants to stream out. Implementations might not be able to stream out
14355bd8deadSopenharmony_ci      a large number of components to a single buffer object.  If that is the
14365bd8deadSopenharmony_ci      case, the application can stream each element of an array to a different
14375bd8deadSopenharmony_ci      buffer object in TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS mode.
14385bd8deadSopenharmony_ci
14395bd8deadSopenharmony_ci    27. Is it possible to capture attributes when using the fixed-function
14405bd8deadSopenharmony_ci        pipeline?
14415bd8deadSopenharmony_ci
14425bd8deadSopenharmony_ci      RESOLVED: Yes, there is nothing that precludes this. The application is
14435bd8deadSopenharmony_ci      responsible for sending down the needed vertex attributes and setting
14445bd8deadSopenharmony_ci      the GL state, as desired, for the attributes it wants to stream to a
14455bd8deadSopenharmony_ci      buffer object. Note that VERTEX_ID_NV is not defined in fixed-function.
14465bd8deadSopenharmony_ci
14475bd8deadSopenharmony_ci    28. Is it possible to record hardware-generated primitive ID values that
14485bd8deadSopenharmony_ci        would be available to a pixel shader?
14495bd8deadSopenharmony_ci
14505bd8deadSopenharmony_ci      RESOLVED:  Transform feedback can only record the primitive ID values
14515bd8deadSopenharmony_ci      emitted per-vertex by a geometry shader or program.  While each
14525bd8deadSopenharmony_ci      primitive recorded for transform-feedback has a well-defined primitive
14535bd8deadSopenharmony_ci      ID, transform feedback is only capable of recording the attributes of
14545bd8deadSopenharmony_ci      individual vertices.
14555bd8deadSopenharmony_ci
14565bd8deadSopenharmony_ci    29.  Does transform feedback support the ability to capture per-vertex
14575bd8deadSopenharmony_ci         layer outputs, as provided by EXT_geometry_shader4 and
14585bd8deadSopenharmony_ci         NV_geometry_program4?
14595bd8deadSopenharmony_ci
14605bd8deadSopenharmony_ci      RESOLVED:  Yes.  For GLSL shaders, it is sufficient to reference the
14615bd8deadSopenharmony_ci      built-in varying "gl_Layer".  For assembly geometry programs, the
14625bd8deadSopenharmony_ci      original version of the spec did not provide an enum allowing you to
14635bd8deadSopenharmony_ci      name "result.layer" in TransformFeedbackAttribsNV.  This was an
14645bd8deadSopenharmony_ci      oversight in the original spec, which was fixed by version 14.  An
14655bd8deadSopenharmony_ci      updated driver will be required to take advantage of this capability;
14665bd8deadSopenharmony_ci      NVIDIA drivers supporting this extension published prior to February
14675bd8deadSopenharmony_ci      2008 will not be able to capture "result.layer".  The value captured for
14685bd8deadSopenharmony_ci      LAYER_NV will be undefined unless a geometry program that writes
14695bd8deadSopenharmony_ci      "result.layer" is active.
14705bd8deadSopenharmony_ci
14715bd8deadSopenharmony_ciRevision History
14725bd8deadSopenharmony_ci
14735bd8deadSopenharmony_ci      Rev.    Date    Author    Changes
14745bd8deadSopenharmony_ci      ----  --------  --------  -----------------------------------------
14755bd8deadSopenharmony_ci       18   03/09/11  mjk       Minor typo fixes.
14765bd8deadSopenharmony_ci
14775bd8deadSopenharmony_ci       17   01/28/11  pbrown    Change return value for start/size queries
14785bd8deadSopenharmony_ci                                when no buffer bound from -1 to zero, to
14795bd8deadSopenharmony_ci                                match state tables (Bug 7318), as done by
14805bd8deadSopenharmony_ci                                Jon Leech in related EXT/ARB extensions and
14815bd8deadSopenharmony_ci                                the core API specification.
14825bd8deadSopenharmony_ci
14835bd8deadSopenharmony_ci       16   08/17/08  pbrown    Remove a non-existent function from the
14845bd8deadSopenharmony_ci                                set of functions that can generate invalid
14855bd8deadSopenharmony_ci                                operation errors while XFB is active.
14865bd8deadSopenharmony_ci
14875bd8deadSopenharmony_ci       15   02/20/08  pbrown    Fix incorrect minimum for MAX_TRANSFORM_
14885bd8deadSopenharmony_ci                                FEEDBACK_SEPARATE_COMPONENTS_NV.  Should be
14895bd8deadSopenharmony_ci                                4, not 16.
14905bd8deadSopenharmony_ci
14915bd8deadSopenharmony_ci       14   02/04/08  pbrown    Fixed a problem with the spec where we were
14925bd8deadSopenharmony_ci                                unable to record "result.layer" using the
14935bd8deadSopenharmony_ci                                assembly interface.  Added a new enum to 
14945bd8deadSopenharmony_ci                                address.
14955bd8deadSopenharmony_ci
14965bd8deadSopenharmony_ci       13   11/28/07  pbrown    Specified the captured primitive ID to be
14975bd8deadSopenharmony_ci                                undefined unless a geometry shader emits it
14985bd8deadSopenharmony_ci                                as a vertex output.  XFB can only record
14995bd8deadSopenharmony_ci                                per-vertex data.
15005bd8deadSopenharmony_ci
15015bd8deadSopenharmony_ci       12   09/27/07  pbrown    Removed incorrect error description from
15025bd8deadSopenharmony_ci                                the errors section -- buffer objects don't
15035bd8deadSopenharmony_ci                                need to be bound before calling Transform-
15045bd8deadSopenharmony_ci                                Feedback{Attribs,Varyings}NV, just before
15055bd8deadSopenharmony_ci                                BeginTransformFeedbackNV.
15065bd8deadSopenharmony_ci
15075bd8deadSopenharmony_ci       11   08/28/07  pbrown    Added an error calling BeginTransformFeedback
15085bd8deadSopenharmony_ci                                if no attributes would be captured (i.e.,
15095bd8deadSopenharmony_ci                                attribute count is 0 for ASM or no attributes
15105bd8deadSopenharmony_ci                                specified in the active GLSL program).
15115bd8deadSopenharmony_ci
15125bd8deadSopenharmony_ci       10   02/09/07  pbrown    Updated status section (now released).
15135bd8deadSopenharmony_ci
15145bd8deadSopenharmony_ci        9   10/23/06  pbrown    Fixed prototype for GetIntegerIndexedEXT and
15155bd8deadSopenharmony_ci                                GetBooleanIndexedEXT:  <index> is unsigned.
15165bd8deadSopenharmony_ci
15175bd8deadSopenharmony_ci        8   10/19/06  pbrown    Removed stray addition of GetFloatIndexedvEXT
15185bd8deadSopenharmony_ci                                and GetDoubleIndexedvEXT.  Minor wording
15195bd8deadSopenharmony_ci                                fixes.
15205bd8deadSopenharmony_ci
15215bd8deadSopenharmony_ci        7   10/17/06  pbrown    Rename from EXT to NV while working on
15225bd8deadSopenharmony_ci                                standardizing a functional subset extension
15235bd8deadSopenharmony_ci                                that will be named EXT_transform_feedback.  We
15245bd8deadSopenharmony_ci                                expect that the EXT should be equivalent to
15255bd8deadSopenharmony_ci                                the NV, except that it (a) removes support for
15265bd8deadSopenharmony_ci                                non-GLSL usage, (b) removes the ability to
15275bd8deadSopenharmony_ci                                change the set of varyings captured without
15285bd8deadSopenharmony_ci                                relinking.  NVIDIA expects to support both the
15295bd8deadSopenharmony_ci                                NV and EXT forms of this extension going
15305bd8deadSopenharmony_ci                                forward.  Fix state table formatting.  Removed
15315bd8deadSopenharmony_ci                                GetFloatIndexedvEXT and GetDoubleIndexedvEXT,
15325bd8deadSopenharmony_ci                                which are not needed by this and related
15335bd8deadSopenharmony_ci                                extensions.
15345bd8deadSopenharmony_ci
15355bd8deadSopenharmony_ci        6   09/11/06  pbrown    Fix bad prototype for GetActiveVaryingEXT
15365bd8deadSopenharmony_ci                                and bad references to "GetActiveVaryingsEXT".
15375bd8deadSopenharmony_ci                                Fix enum names for INTERLEAVED_ATTRIBS_EXT and
15385bd8deadSopenharmony_ci                                SEPARATE_ATTRIBS_EXT (no TRANSFORM_ FEEDBACK
15395bd8deadSopenharmony_ci                                prefix).  Remove erroneous state table entries
15405bd8deadSopenharmony_ci                                that were obsoleted by the introduction of the
15415bd8deadSopenharmony_ci                                TRANSFORM_FEEDBACK_RECORD_EXT query.
15425bd8deadSopenharmony_ci       
15435bd8deadSopenharmony_ci        5   08/31/06  pbrown    Fix miscellaneous spec errata.   Record enum
15445bd8deadSopenharmony_ci                                values that weren't documented in previous
15455bd8deadSopenharmony_ci                                spec versions.  Use correct function names for
15465bd8deadSopenharmony_ci                                indexed "Get" functions.  Clarify that GLSL
15475bd8deadSopenharmony_ci                                interactions mean that some functions and
15485bd8deadSopenharmony_ci                                enums defined here aren't supported if GLSL
15495bd8deadSopenharmony_ci                                isn't supported.  Fixed the double-assignment
15505bd8deadSopenharmony_ci                                of several TransformFeedbackAttribsEXT enums
15515bd8deadSopenharmony_ci                                and re-packed that portion of the enum range.
15525bd8deadSopenharmony_ci                                Clarify that several new functions are
15535bd8deadSopenharmony_ci                                non-listable.  Fix the query tokens for buffer
15545bd8deadSopenharmony_ci                                object range bindings to match the API
15555bd8deadSopenharmony_ci                                (start/size, not start/end).
15565bd8deadSopenharmony_ci
15575bd8deadSopenharmony_ci        4   08/30/06  pbrown    Reformatting as a plaintext document 
15585bd8deadSopenharmony_ci                                instead of an exported MS Word document.
15595bd8deadSopenharmony_ci
15605bd8deadSopenharmony_ci        3   07/26/06  barthold  Forgot a few changes w.r.t. version 2.
15615bd8deadSopenharmony_ci
15625bd8deadSopenharmony_ci        2   07/14/06  barthold  Change BindBufferRangeEXT to take an
15635bd8deadSopenharmony_ci                                offset and size parameter. Change 
15645bd8deadSopenharmony_ci                                BindBufferOffsetEXT to take an offset
15655bd8deadSopenharmony_ci                                parameter.
15665bd8deadSopenharmony_ci
15675bd8deadSopenharmony_ci        1             barthold  Internal spec development.
1568