| Name |
| |
| EXT_provoking_vertex |
| |
| Name Strings |
| |
| GL_EXT_provoking_vertex |
| |
| Contributors |
| |
| Cynthia Allison, NVIDIA |
| Gregory Roth, NVIDIA |
| Daniel Koch, TransGaming |
| Gavriel State, TransGaming |
| Jason Green, TransGaming |
| Ian Romanick, Intel |
| Marcus Steyer, NVIDIA |
| Pat Brown, NVIDIA |
| Stefan Dosinger, CodeWeavers |
| Henri Verbeet, CodeWeavers |
| |
| Contact |
| |
| Mark Kilgard, NVIDIA (mjk 'at' nvidia.com) |
| |
| Status |
| |
| Implemented by NVIDIA, March 2009 |
| |
| Version |
| |
| Last Modified Date: May 11, 2009 |
| Version: 12 |
| |
| Number |
| |
| 364 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 2.1 Specification but |
| can apply to any prior specification. |
| |
| ARB_geometry_shader4, EXT_geometry_shader4, NV_geometry_shader4, |
| and NV_gpu_program4 interact with this extension |
| |
| EXT_transform_feedback, NV_transform_feedback, and the transform |
| feedback functionality made core by OpenGL 3.0 are clarified by |
| this extension. |
| |
| Overview |
| |
| This extension provides an alternative provoking vertex convention |
| for rendering lines, triangles, and (optionally depending on the |
| implementation) quads. |
| |
| The provoking vertex of a primitive is the vertex that determines the |
| constant primary and secondary colors when flat shading is enabled. |
| |
| In OpenGL, the provoking vertex for triangle, quad, line, and |
| (trivially) point primitives is the last vertex used to assemble |
| the primitive. The polygon primitive is an exception in OpenGL where |
| the first vertex of a polygon primitive determines the color of the |
| polygon, even if actually broken into triangles and/or quads. |
| |
| See section 2.14.7 (Flatshading) of the OpenGL 2.1 specification, |
| particularly Table 2.12 for more details. |
| |
| Alternatively the provoking vertex could be the first vertex of |
| the primitive. Other APIs with flat-shading functionality such |
| as Reality Lab and Direct3D have adopted the "first vertex of the |
| primitive" convention to determine the provoking vertex. However, |
| these APIs lack quads so do not have a defined provoking vertex |
| convention for quads. |
| |
| The motivation for this extension is to allow applications developed |
| for APIs with a "first vertex of the primitive" provoking vertex to |
| be easily converted to OpenGL. |
| |
| New Procedures and Functions |
| |
| void ProvokingVertexEXT(enum mode); |
| |
| New Tokens |
| |
| Accepted by the <mode> parameter of ProvokingVertexEXT: |
| |
| FIRST_VERTEX_CONVENTION_EXT 0x8E4D |
| LAST_VERTEX_CONVENTION_EXT 0x8E4E |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, |
| GetFloatv, and GetDoublev: |
| |
| PROVOKING_VERTEX_EXT 0x8E4F |
| QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C |
| |
| Additions to Chapter 2 of the OpenGL 2.1 Specification (OpenGL Operation) |
| |
| -- Section 2.14.7 "Flatshading" (page 69) |
| |
| Replace the entire section with: |
| |
| "A primitive may be flatshaded, meaning that all vertices of the |
| primitive are assigned the same color index or the same primary or |
| secondary colors. These colors are the colors of the vertex that |
| spawned the primitive. Table 2.12 summaries the possibilities. |
| |
| Flatshading is controlled by |
| |
| void ShadeModel(enum shadeMode); |
| void ProvokingVertexEXT(enum provokeMode); |
| |
| shadeMode value must be either the symbolic constants SMOOTH or FLAT. |
| If shadeMode is SMOOTH (the initial state), the vertex colors are |
| treated individually. If shadeMode is FLAT, flatshading is turned on. |
| |
| provokeMode value must be either FIRST_VERTEX_CONVENTION_EXT |
| or LAST_VERTEX_CONVENTION_EXT. If provokeMode is |
| LAST_VERTEX_CONVENTION_EXT (the initial state), the "last vertex |
| convention" column of table 2.12 applies when flat shading; otherwise, |
| the "first vertex convention" column applies when flat shading. |
| The provoking vertex behavior of quad primitives is implementation |
| dependent. Implementations can choose to either respect (follow) |
| the state set by ProvokingVertexEXT for quad primitives (and, in |
| this case, return true for the QUADS_FOLLOW_PROVOKING_VERTEX_EXT |
| implementation-dependent state) or unconditionally implement the |
| last vertex convention for quad primitives (and, in this case, |
| return false for QUADS_FOLLOW_PROVOKING_VERTEX_EXT). |
| |
| ShadeModel and ProvokingVertexEXT each require one bit of state. |
| |
| First vertex Last vertex |
| Primitive type of polygon i convention convention |
| =========================== ============ ================================================== |
| point i i <- same |
| |
| independent line 2i-1 2i |
| line loop i i+1, if i<n |
| 1, if i==n |
| line strip i i+1 |
| |
| independent triangle 3i-2 3i |
| triangle strip i i+2 |
| triangle fan i+1 i+2 |
| |
| independent quad 4i-3 4i, if QUADS_FOLLOW_PROVOKING_VERTEX_EXT = true |
| 4i 4i, if QUADS_FOLLOW_PROVOKING_VERTEX_EXT = false <- same |
| quad strip 2i-1 2i+2, if QUADS_FOLLOW_PROVOKING_VERTEX_EXT = true |
| 2i+2 2i+2, if QUADS_FOLLOW_PROVOKING_VERTEX_EXT = false <- same |
| |
| single polygon (i=1) 1 1 <- same |
| |
| line adjacency 4i-2 4i-1 |
| line strip adjacency i+1 i+2 |
| triangle adjacency 6i-5 6i-1 |
| triangle strip adjacency 2i-1 2i+3 |
| |
| Table 2.12: Polygon flatshading color selection. The color used for |
| flat shading the ith polygon generated by the indicated Begin/End |
| type are derived from the current color (if lighting is disabled) |
| in effect when the indicated vertex is specified. If lighting |
| is enabled or a vertex shader is used, the colors are produced |
| by lighting or vertex shading (respectively) the indicated vertex. |
| Vertices are numbered 1 through n, where n is the number of vertices |
| between the Begin/End pair." |
| |
| Additions to Chapter 3 of the OpenGL 2.1 Specification (Rasterization) |
| |
| None |
| |
| Additions to Chapter 4 of the OpenGL 2.1 Specification (Per-Fragment |
| Operations and the Frame Buffer) |
| |
| None |
| |
| Additions to Chapter 5 of the OpenGL 2.1 Specification (Special |
| Functions) |
| |
| None |
| |
| Additions to Chapter 6 of the OpenGL 2.1 Specification (State and |
| State Requests) |
| |
| None |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None |
| |
| Additions to the OpenGL Shading Language |
| |
| None |
| |
| Dependencies on ARB_geometry_shader4, EXT_geometry_shader4, |
| NV_geometry_shader4, and/or NV_gpu_program4: |
| |
| If none of ARB_geometry_shader4, EXT_geometry_shader4, |
| NV_geometry_shader4, or NV_gpu_program4 are supported, ignore |
| the rows of table 2.12 for line adjacency, line strip adjacency, |
| triangle adjacency, and triangle strip adjacency. |
| |
| Dependencies on EXT_transform_feedback, NV_transform_feedback, and/or the |
| transform feedback functionality integrated into the core by OpenGL 3.0: |
| |
| Clarify the statement describing when transform feedback occurs |
| (in section 2.18 of the OpenGL 3.1 specification) to read: |
| |
| "The vertices are fed back after vertex color clamping, but before |
| flatshading and clipping." |
| |
| (The "flatshading and" phrase is newly clarifying.) |
| |
| GLX Protocol |
| |
| A new GL rendering command is added. The following command is sent to the |
| server as part of a glXRender request: |
| |
| ProvokingVertexEXT |
| 2 8 rendering command length |
| 2 4227 rendering command opcode |
| 4 ENUM provokeMode |
| |
| Errors |
| |
| INVALID_ENUM is generated when ProvokingVertexEXT is called with |
| a <provokeMode> that is not either FIRST_VERTEX_CONVENTION_EXT or |
| LAST_VERTEX_CONVENTION_EXT. |
| |
| New State |
| |
| (table 6.11, page 276) add the following entry: |
| |
| Get Value Type Get Command Initial Value Description Sec Attribute |
| -------------------- ---- ----------- -------------------------- ---------------- ------ --------- |
| PROVOKING_VERTEX_EXT Z2 GetIntegerv LAST_VERTEX_CONVENTION_EXT Provoking vertex 2.14.7 lighting |
| convention |
| |
| (table 6.36, page 301) add the following entry: |
| |
| Get Value Type Get Command Initial Value Description Sec Attribute |
| --------------------------------- ---- ----------- ------------- ----------------- ------ --------- |
| QUADS_FOLLOW_PROVOKING_VERTEX_EXT B GetBooleanv - True if quad 2.14.7 - |
| primitives follow |
| provoking vertex |
| convention |
| |
| New Implementation Dependent State |
| |
| None |
| |
| NVIDIA Implementation Details |
| |
| GeForce 8 (G8x, G9x, GT1xx) and up GPUs report true for |
| QUADS_FOLLOW_PROVOKING_VERTEX_EXT. |
| |
| GeForce 6 and 7 (NV4x, G7x) GPUs report false for |
| QUADS_FOLLOW_PROVOKING_VERTEX_EXT. |
| |
| Issues |
| |
| 1. What should this extension be called? |
| |
| RESOLVED: EXT_provoking_vertex |
| |
| The phrase "provoking vertex" is not used in the core OpenGL |
| specification but it is the accepted jargon for the functionality |
| in question. |
| |
| 2. How should quads be handled? |
| |
| RESOLVED: Ideally, quadrilateral primitives (GL_QUADS and |
| GL_QUAD_STRIP) would follow the provoking vertex mode. |
| |
| Other existing APIs with different flatshading conventions do |
| not support quads. |
| |
| Rather than force support for both the first and last convention |
| for quads (which no other API supports), instead this extension |
| provides implementations the flexibility to advertise whether |
| or not quads respect the provoking vertex or not. |
| |
| This resolution ensures more hardware vendors can support |
| this extension. Hardware vendors which support both OpenGL and |
| Direct3D's provoking vertex conventions must have support for |
| "first vertex" for triangles and lines because Direct3D demands |
| these conventions. Direct3D does not demand a convention for |
| quads. However every vendor supporting OpenGL can support the |
| "last vertex" mode for quads. Leaving the quad behavior up |
| to the OpenGL implementation means hardware can simply always |
| switch to the OpenGL quad behavior when emitting quads. |
| |
| See issue #12 for more details about how the |
| implementation-dependent handling of quads is advertised. |
| |
| 3. How should the specification language be written for this |
| extension? |
| |
| RESOLVED: Update table 2.12 for all supported primitives. |
| |
| The current language describes how points and lines are handled |
| in prose but the behavior for triangles, quads, and polygons is |
| specified in table 2.12. |
| |
| Put all the Begin/End batch types in a single table with two |
| columns specifying the "first vertex convention" and "last vertex |
| convention" provoking vertex modes respectively. |
| |
| A unified table is less ambiguous than a combination of a table |
| and prose. |
| |
| 4. What token names for the provoking vertex conventions should |
| be used? |
| |
| RESOLVED: GL_FIRST_VERTEX_CONVENTION_EXT and |
| GL_LAST_VERTEX_CONVENTION_EXT (the initial state, consistent |
| with OpenGL's unextended operation). |
| |
| The word "convention" is used because (see issue #2), the "first |
| vertex" or "last vertex" rules are not iron-clad as they may or |
| may do not apply to quads. |
| |
| The provoking vertex behavior for polygons and triangle fans |
| also isn't strictly first or last vertex: Polygons always use |
| the first vertex (no matter the provoking vertex convention). |
| Triangle fans don't really use the first vertex (the spoke vertex) |
| when using the "first vertex" provoking vertex rule; see issue #7. |
| |
| 5. IRIS GL had a provoking vertex convention for polygons where the |
| last vertex of a polygon primitive determined the flat shaded |
| color of the polygon. Should we support this convention? |
| |
| RESOLVED: No. |
| |
| Interesting IRIS GL applications relying on this convention |
| are assuredly non-existent at this point. This convention |
| also requires waiting until all the vertices for a polygon |
| (which OpenGL does not bound) are specified before the polygon |
| can begin being rasterized. The IRIS GL convention was dubious |
| for this reason and OpenGL's designers were correct to abandon |
| IRIS GL's polygon provoking vertex convention. |
| |
| 6. How should line loops behave? |
| |
| RESOLVED: Line loops in GL_FIRST_VERTEX_CONVENTION_EXT mode |
| should behave as though it were a line strip with the first |
| vertex repeated at the end. In other words, the first vertex |
| of the line loop provokes the color for the line primitive that |
| closes the line loop. |
| |
| Direct3D does not support line loops. |
| |
| 7. How are triangle fans handled? |
| |
| RESOLVED: The first vertex of a triangle fan is the spoke vertex. |
| Triangle fans in GL_FIRST_VERTEX_CONVENTION_EXT mode should use |
| the first non-spoke vertex of the primitive as the provoking |
| vertex. In other words, the spoke vertex is never the provoking |
| vertex (in either convention). |
| |
| The rationale for this is to match DirectX 9's triangle |
| fan behavior. The rationale for the DirectX 9 behavior is |
| (presumably) that if the spoke vertex was considered the "first |
| vertex" of every primitive in a triangle fan, every flat shaded |
| primitive in a triangle fan would necessarily have the spoke |
| vertex's color, which isn't very interesting. |
| |
| (DirectX 10 does not support triangle fans.) |
| |
| 8. How does the provoking vertex convention affect primitives |
| generated by a geometry shader? |
| |
| RESOLVED: The provoking vertex convention affects primitives |
| whether they are generated by geometry shaders or conventional |
| (non-geometry shader) primitive assembly. |
| |
| Geometry shaders only generate point, line strips, and triangle |
| strips (not line loops, triangle fans, polygons, or quads). |
| (So the GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT is |
| irrelevant when a geometry program or shader is active.) |
| |
| This makes the supporting the first and last vertex conventions |
| for primitives generated by geometry shaders "simple" because in |
| the points, line strip, and triangle strip cases, the convention |
| really is to use either first or last vertex to define the |
| provoking vertex (no caveats). |
| |
| There's no special specification language to support the fact that |
| the provoking vertex convention applies to primitives generated |
| by geometry shaders because flat shading behavior is described |
| in Chapter 3's rasterization discussion which is all subsequent |
| to the geometry shader processing inserted into Chapter 2. |
| |
| DirectX 10 geometry shaders can output flat attributes according |
| to Direct3D's "first vertex provokes" convention for line and |
| triangle output primitives from a geometry shader. So matching |
| the DirectX 10 geometry shader behavior for flat shading requires |
| setting the provoking vertex to GL_FIRST_VERTEX_CONVENTION_EXT. |
| |
| This said, the OpenGL default convention of "last vertex" for the |
| provoking vertex tends to be more useful for geometry shaders. |
| By deferring the computation of the flat shaded color to the |
| last vertex of every primitive, that tends to give the geometry |
| shader compiler the maximum allowance for scheduling computation |
| and texturing operations required to compute the flat shaded |
| color as long as possible (that is, until the last vertex of |
| the primitive). |
| |
| 9. Should there be an OPTION or #pragma for geometry shader assembly |
| and GLSL respectively to request the specific provoking vertex |
| convention for the shader? |
| |
| RESOLVED: No. |
| |
| The provoking vertex is context state that doesn't belong within |
| a shader as a pragma anymore than the stencil state belongs |
| within the shader. Overriding context state based on a pragma |
| in a shader introduces unfortunate validation interactions that |
| will slow down shader binds. |
| |
| Geometry shaders written for DirectX 10 and using flat attributes |
| expect the "first vertex" provoking vertex convention but the |
| application is better off specifying the proper provoking vertex |
| convention for shaders just as is done with other context state. |
| |
| TransGaming supports this resolution to not support a pragma. |
| |
| 10. How do geometry shader input primitives interact with this |
| extension? |
| |
| RESOLVED: Table 2.12 includes the new primitives types |
| introduced by geometry shaders (GL_LINES_ADJACENCY_ARB, |
| GL_LINE_STRIP_ADJACENCY_ARB, GL_TRIANGLES_ADJACENCY_ARB, and |
| GL_TRIANGLE_STRIP_ADJACENCY_ARB). However the entries for these |
| primitive types are only relevant when these new primitive types |
| are used with NO geometry shader enabled. |
| |
| When a geometry shader is enabled, the only primitive output types |
| are points, line strips, and triangle strips. |
| |
| 11. To what attribute set should the provoking vertex belong? |
| |
| RESOLVED: Lighting (GL_LIGHTING_BIT). |
| |
| This is because the provoking vertex bit is described in the |
| same context as the shade model (GL_SHADE_MODEL) setting, and |
| the shade model state is part of the lighting attribute set. |
| |
| 12. How should the allowance for handling quadrilateral primitives |
| be advertised? |
| |
| RESOLVED: Because this extension is intended to facilitate |
| supporting Direct3D content that depends on the Direct3D's |
| provoking vertex convention yet Direct3D does not support quad |
| primitives (as OpenGL provides with GL_QUAD_STRIP and GL_QUADS), |
| the particular provoking vertex behavior of quads is not crucial |
| to this extension's intended application. |
| |
| In the interest of making this extension's functionality for |
| triangle and line primitives broadly available (the primitives |
| Direct3D does support with a first vertex provoking vertex |
| convention), this extension does not mandate a single uniform |
| behavior for quad primitives. Mandating a particular behavior |
| for quad primitives would, for some implementations, encumber the |
| performance of this extension in the non-quad case or make this |
| implementation of this extension needlessly complex to implement. |
| |
| Instead the GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT |
| implementation-dependent boolean indicates whether or not quads |
| (generated by GL_QUADS or GL_QUAD_STRIP) should abide by the |
| provoking vertex convention or not. |
| |
| Whether or not the GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT |
| state is true or false, the provoking vertex behavior of quads |
| is well-defined in either case. |
| |
| The recommended, though implementation-dependent, value for |
| GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT is true because |
| this means quads, will like lines and triangles, follow the |
| GL_PROVOKING_VERTEX_EXT state as indicated. |
| |
| 13. How does the provoking vertex state interact with primitive |
| restart? |
| |
| RESOLVED: Orthogonally so no specific specification language |
| describing the interaction is required. |
| |
| Specifically a primitive restart acts as a glEnd/glBegin |
| sequence so it restarts the primitive numbering to 1 for the |
| vertex immediately following the restart index. |
| |
| 14. Should the provoking vertex behavior apply to both the primary |
| and secondary color? |
| |
| RESOLVED: Yes, the provoking vertex decides both the primary and |
| secondary color of a flat-shaded primitive. That's consistent |
| with Direct3D's provoking vertex convention as well as OpenGL's |
| current behavior. |
| |
| 15. Should the provoking vertex behavior be specified with a |
| glEnable/glDisable token instead of glProvokingVertexEXT? |
| |
| RESOLVED: The provoking vertex API is closely related |
| to glShadeModel which uses an enumerated mode rather than |
| glEnable/glDisable to specify flat or smooth shading so the API |
| mimics the glShadeModel approach. |
| |
| This results in a fairly readable API usage that is more easily |
| groaked by unfamiliar programmers: |
| |
| glProvokingVertexEXT(GL_FIRST_VERTEX_CONVENTION_EXT); |
| |
| instead of: |
| |
| glEnable(GL_FIRST_VERTEX_CONVENTION_EXT); |
| |
| It is also not clear that the provoking vertex convention is |
| really a single enable. The convention behaves differently |
| depending on the primitive type. For example, GL_POLYGON always |
| uses the first vertex as the provoking vertex regardless of the |
| provoking vertex state. |
| |
| 16. Does the OpenGL Shading Language (GLSL) 1.30 "flat" varying |
| qualifier respect the provoking vertex state? |
| |
| RESOLVED: Yes. |
| |
| The GLSL 1.30 specification says "This variable [qualified as |
| flat] will come from a single provoking vertex, as described by |
| the OpenGL Graphics System Specification." This extension amends |
| how the provoking vertex is described so no GLSL specification |
| update is required. This does imply that user-declared varyings |
| in a GLSL shader declared with "flat" will have the provoking |
| vertex convention applied to determine their value. |
| |
| 17. How does the provoking vertex apply to Direct3D 10? |
| |
| RESOLVED: Direct3D 10 has deprecated the D3DSHADEMODE state for |
| controlling flat or smooth (Gouraud) shading. However there is |
| still the concept of a provoking vertex (called the "leading |
| vertex" by Direct3D 10) which still corresponds to this |
| extension's "first vertex" convention. |
| |
| Use of the leading (provoking) vertex for constant (flat) |
| interpolation is indicated by Direct3D 10's "nointerpolation" |
| variable storage class (sometimes called an interpolation |
| modifier). |
| |
| 18. Does the NV_gpu_program4 "FLAT" attribute modifier respect the |
| provoking vertex state? |
| |
| RESOLVED: Yes. NVIDIA's NV_gpu_program4 extension, describing |
| an OpenGL assembly for Shader Model 4.0, allows a FLAT modifier |
| to be specified for fragment program inputs. The NV_gpu_program4 |
| specification says "If an attribute is flat-shaded, it will be |
| taken from the output attribute of the provoking vertex of the |
| primitive using the same data type." This extension amends |
| how the provoking vertex is described so no NV_gpu_program4 |
| specification update is required. |
| |
| 19. How does this extension interact with transform feedback? |
| |
| RESOLVED: Attribute components written out by transform feedback |
| are NOT affected by the flatshading or provoking vertex state. |
| |
| While this specification is written against OpenGL 2.1, transform |
| feedback was made core functionality with OpenGL 3.0 and then |
| the order of the transform feedback was moved in the OpenGL |
| 3.1 specification. Therefore the subsequent discussion uses |
| the more recent 3.1 sectioning. |
| |
| Specifically the OpenGL 3.1 specification (section 2.18: Transform |
| Feedback) says "The vertices are fed back after vertex color |
| clamping, but before clipping." |
| |
| This statement is unclear because flatshading (section 2.13.7: |
| Flatshading) happens inbetween vertex color clamping (section |
| 2.13.6: Clamping or Masking) and primitive clipping (section 2.20: |
| Primitive Clipping). |
| |
| Base on this issue the sentence is clarified to read: "The |
| vertices are fed back after vertex color clamping, but before |
| [flatshading and] clipping." |
| |
| For reference, the original EXT_transform_feedback extension has |
| this same language ("The vertices are fed back after vertex color |
| clamping, but before clipping.") but follows that sentence with: |
| "If a geometry shader is active, the vertices recorded are those |
| emitted from the geometry shader." Technically geometry shading |
| takes place prior to even vertex color clamping. |
| |
| Clearly flat shading needs to happen prior to clipping so that |
| clipped vertices can share the flat shaded attributes of the |
| primitive prior to any potential clipping. |
| |
| This resolution is consistent with DirectX 10's behavior. |
| Technically, DirectX 10 says that vertices output through |
| transform feedback (which DirectX 10 calls "stream output") |
| only have to be defined for constant attributes of the primitive's |
| leading vertex (constant attributes are those that OpenGL would |
| call flatshaded). Other constant attributes for non-leading |
| vertices may be undefined. Leaving such constant attributes |
| undefined is undesirable, particularly given how OpenGL operates. |
| It is well-defined and more useful to simply output the value |
| of the vertex's attribute prior to any flatshading. This is |
| particularly desirable for OpenGL because with this extension |
| (and even prior to supporting this extension), the provoking |
| vertex is not always the leading vertex. |
| |
| To clarify further, while this resolution is consistent with |
| DirectX 10, an OpenGL implementation that supports transform |
| feedback has no undefined behavior specified. The simplest way |
| to describe what happens is that attribute components written |
| out by transform feedback are the attribute component values |
| of vertices AFTER (optional) geometry shading and vertex color |
| clamping but PRIOR to flatshading and primitive clipping. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- --------- --------------------------------------------- |
| 12 5/11/09 mjk Resolve issue 12 with feedback from |
| Daniel Koch |
| 11 4/17/09 mjk grammar and typo fixes |
| 10 3/26/09 mjk typo fixes, more contributors listed, clarify |
| transform feedback interaction |
| 9 3/12/09 mjk dependencies on geometry shading extensions |
| 8 3/11/09 mjk Fix issues 2, 4 & 7, add issues 16, 17, & 18 |
| 7 3/7/09 mjk Fix line adj typo, re-order table |
| 6 3/3/09 mjk Assign enums, add issues 11-15 |
| 5 1/16/08 mjk Geometry shader interactions |
| 4 1/6/08 mjk Add line loop behavior, |
| change triangle fan |
| 3 1/31/07 mjk Jamie review feedback |
| 2 1/24/07 mjk Fix quad entries in table |
| 1 1/11/07 mjk Initial version |
| |