skia / external / github.com / KhronosGroup / OpenGL-Registry / af0cc3e97875b3c4b7f6b23786495c94475d6368 / . / extensions / AMD / AMD_vertex_shader_viewport_index.txt

Name | |

AMD_vertex_shader_viewport_index | |

Name Strings | |

GL_AMD_vertex_shader_viewport_index | |

Contact | |

Graham Sellers, AMD (graham.sellers 'at' amd.com) | |

Contributors | |

Graham Sellers | |

Status | |

Shipping. | |

Version | |

Last Modified Date: March 15, 2012 | |

Revision: 2 | |

Number | |

416 | |

Dependencies | |

OpenGL 4.1 or ARB_viewport_array is required. | |

The extension is written against the OpenGL 4.2 Specification, Core Profile, | |

January 19, 2011 and the OpenGL Shading Language Specification, | |

version 4.20.11. | |

Overview | |

The gl_ViewportIndex built-in variable was introduced by the | |

ARB_viewport_array extension and OpenGL 4.1. This variable is available | |

in un-extended OpenGL only to the geometry shader. When written in the | |

geometry shader, it causes geometry to be directed to one of an array | |

of several independent viewport rectangles. | |

In order to use any viewport other than zero, a geometry shader must be | |

present. Geometry shaders introduce processing overhead and potential | |

performance issues. This extension exposes the gl_ViewportIndex built-in | |

variable to the vertex shader, allowing the functionality introduced by | |

ARB_viewport_array to be accessed without requiring a geometry shader to | |

be present. | |

New Procedures and Functions | |

None. | |

New Tokens | |

None. | |

Additions to Chapter 2 of the OpenGL 4.2 (Core) Specification (OpenGL Operation) | |

Add the following paragraph to the "Output Variables" subsection of | |

section 2.11, "Vertex Shaders" on p. 106. | |

The built-in special variable gl_ViewportIndex, if written, is used to | |

direct rendering to one of several viewports and is discussed further in | |

the next section. | |

Insert the following subsection after the "Shader Outputs" subsection on | |

p.106. | |

"Viewport Selection" | |

Vertex shaders can be used to render to one of several different | |

viewport rectangles. The destination viewport rectangle for a primitive | |

may be specified by writing to the built-in output variable | |

gl_ViewportIndex in the vertex shader. This functionality allows a vertex | |

shader to direct rendering to one of several viewport rectangles. The | |

specific vertex of a primitive from which gl_ViewportIndex is taken | |

is implementation defined and may be determined by calling GetIntegerv with | |

the symbolic constant VIEWPORT_INDEX_PROVOKING_VERTEX. | |

If the value returned is PROVOKING_VERTEX then vertex selection follows the | |

convention specified to ProvokingVertex (see Section 2.19). If the value | |

returned is FIRST_VERTEX_CONVENTION, selection is always taken from the | |

first vertex of the primitive. If the value returned is | |

LAST_VERTEX_CONVENTION, the selection is always taken from the last vertex | |

of the primitive. If the value returned is UNDEFINED_VERTEX, the selection | |

is not guaranteed to be taken from any specific vertex. The vertex | |

considered the provoking vertex for particular primitive types is given | |

in table 2.15. | |

Replace the second paragraph of the "Layer and Viewport Selection" subsection | |

of section 2.13, "Geometry Shaders", p.135 (which describes | |

gl_ViewportIndex) with: | |

The special built-in variable gl_ViewportIndex is available to geometry | |

shaders to direct rendering to a specific viewport in an array of | |

viewports and has the same effect as the similarly named variable in the | |

vertex shader. | |

Modify section 2.14.1 "Controling the Viewport" as follows: | |

Multiple viewports are available and are numbered zero through the value | |

of MAX_VIEWPORTS minus one. If a vertex or geometry shader is active and | |

writes to gl_ViewportIndex, the viewport transformation uses the viewport | |

corresponding to the value assigned to gl_ViewportIndex taken from an | |

implementation-dependent primitive vertex. If the value of the viewport | |

index is outside the range zero to the value of MAX_VIEWPORTS minus one, | |

the results of the viewport transformation are undefined. If the active | |

vertex shaders or geometry shaders (if present) do not write to | |

gl_ViewportIndex, the viewport numbered zero is used by the viewport | |

transformation. | |

Additions to Chapter 3 of the OpenGL 4.2 (Core) Specification (Rasterization) | |

None. | |

Additions to Chapter 4 of the OpenGL 4.2 (Core) Specification (Per-Fragment Operations | |

and the Framebuffer) | |

None. | |

Additions to Chapter 5 of the OpenGL 4.2 (Core) Specification (Special | |

Functions) | |

None. | |

Additions to Chapter 6 of the OpenGL 4.2 (Core) Specification (State and | |

State Requests) | |

None. | |

Additions to Chapter 7 of the OpenGL Shading Language Specification, Version 4.20 | |

Add to the list of vertex shader built-in variables, Section 7.1, p. 97: | |

out int gl_ViewportIndex; | |

Modify the first paragraph on p.101, describing gl_ViewpotIndex as follows: | |

The output variable gl_ViewportIndex is available only in the vertex and | |

geometry languages and provides the index of the viewport to which the next | |

primitive assembled from the resulting vertices or emitted from the | |

geometry shader (if present) should be drawn. Primitives generated during | |

primitive assembly will undergo viewport transformation and scissor testing | |

using the viewport transformation and scissor rectangle selected by the | |

value of gl_ViewportIndex. The viewport index used will come from one of | |

the vertices in the primitive being processed. However, which vertex the | |

viewport index comes from is implementation-dependent, so it is best to use | |

the same viewport index for all vertices of the primitive. If a vertex or | |

geometry shader (if present) does not assign a value to gl_ViewportIndex, | |

viewport transform and scissor rectangle zero will be used. If a vertex | |

or geometry shader statically assigns a value to gl_ViewportIndex and there | |

is a path through the shader that does not assign a value to | |

gl_ViewportIndex, the value of gl_ViewportIndex is undefined for executions | |

of the shader that take that path. See section 2.11.11, under "Output | |

Variables" of the OpenGL Graphics System Specification (Core Profile) for | |

more information. | |

Additions to the AGL/GLX/WGL Specifications | |

None. | |

GLX Protocol | |

None. | |

Errors | |

None. | |

New State | |

None. | |

New Implementation Dependent State | |

None. | |

Issues | |

1) What happens when there is a tessellation shader in the pipe? | |

RESOVED: gl_ViewportIndex is not exposed to tessellation shaders. The | |

primary motivation for this extension is to allow simple applications using | |

only vertex and fragment shaders to take advantage of multiple viewports. | |

To use vertex-shader specified viewport indices in a program that uses | |

tessellation, the viewport index can be passed from vertex to control to | |

evaluation shader and then a geometry shader can be used to initialize | |

gl_ViewportIndex as would be the case in the absence of this extension. | |

2) What happens if gl_ViewportIndex is written in the vertex shader and | |

a geometry shader is present? | |

RESOLVED: The value written in the VS is lost. If the GS writes | |

gl_ViewportIndex, that value is used, otherwise the zeroth viewport | |

is used. | |

3) Are provoking vertex semantics honored for the purposes of writes to | |

gl_ViewportIndex in the VS? | |

RESOLVED: Yes, they are. Query VIEWPORT_INDEX_PROVOKING_VERTEX to determine | |

the 'provokingness' of gl_ViewportIndex. In general, though, it's best | |

practice to ensure that all vertices of a single primitive (including | |

strips, fans and loops) have the same value for gl_ViewportIndex. | |

Revision History | |

Rev. Date Author Changes | |

---- -------- -------- ----------------------------------------- | |

2 03/15/2012 gsellers Finalize for posting in public repository | |

1 04/05/2011 gsellers Initial draft |