blob: b27a44e6b3f7b29bc69cdf120e3ec34246a17be8 [file] [log] [blame]
Name Strings
Graham Sellers, AMD (graham.sellers 'at'
Graham Sellers
Copyright (c) 2015 The Khronos Group Inc. Copyright terms at
Complete. Approved by the ARB on June 26, 2015.
Ratified by the Khronos Board of Promoters on August 7, 2015.
Last Modified Date: March 19, 2015
Revision: 1
ARB Extension #185
OpenGL 4.1 is required.
The extension is written against the OpenGL 4.5 Specification, Core Profile,
February 2, 2015 and the OpenGL Shading Language Specification,
version 4.50.5.
The gl_ViewportIndex and gl_Layer built-in variables were introduced by
the in OpenGL 4.1. These variables are available in un-extended OpenGL
only to the geometry shader. When written in the geometry shader, they
cause geometry to be directed to one of an array of several independent
viewport rectangles or framebuffer attachment layers, respectively.
In order to use any viewport or attachment layer other than zero, a
geometry shader must be present. Geometry shaders introduce processing
overhead and potential performance issues. The AMD_vertex_shader_layer
and AMD_vertex_shader_viewport_index extensions allowed the gl_Layer
and gl_ViewportIndex outputs to be written directly from the vertex shader
with no geometry shader present.
This extension effectively merges the AMD_vertex_shader_layer and
AMD_vertex_shader_viewport_index extensions together and extends them further
to allow both outputs to be written from tessellation evaluation shaders.
New Procedures and Functions
New Tokens
Additions to Chapter 9 of the OpenGL 4.5 (Core) Specification (Framebuffers
and Framebuffer Objects)
Modify section 9.8, "Layered Framebuffers" as follows:
Remove the bullet list explaining when layer number zero is used
and replace the language with:
The layer number of a fragment is zero if no vertex processing shader
(vertex, tessellation evaluation or geometry) statically assigns a value
to the built-in output gl_Layer.
Replace the following paragraph with:
Otherwise, the layer for each point, line, or triangle is taken from
the gl_Layer output of the last active vertex processing stage to one of
the vertices of the primitive. The vertex used is implementation-dependent.
To get defined results, all vertices of each primitive should set the same
value for gl_Layer. The layer number written by a vertex procesing shader
has no effect if the framebuffer is not layered.
Additions to Chapter 11 of the OpenGL 4.5 (Core) Specification (Programmable
Vertex Processing)
Add the following to Subsection, "Shader Outputs"
The built-in output gl_Layer is used in layered rendering, and is
discussed further in the next section.
The built-in output gl_ViewportIndex is used to direct rendering
to one of several viewports and is discussed further in the next section.
Move Subsection, "Layer and Viewport Selection" into a new section
11.4, "Layer and Viewport Selection", renumber surrounding sections
Replace all instances of "Geometry shaders" in Section 11.4 with
"Vertex, tessellation and geometry shaders".
Additions to Chapter 13 of the OpenGL 4.5 (Core) Specification (Fixed-Function
Vertex Post-Processing)
Modify section 13.6.1 "Controling the Viewport" as follows:
Replace the paragraph beginning "Multiple viewports are available ..."
Multiple viewports are available and are numbered zero through the value
of MAX_VIEWPORTS minus one. If an active vertex processing 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, tessellation or geometry shaders (if present) do not write to
gl_ViewportIndex, the viewport numbered zero is used by the viewport
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 language introducing "gl_Layer" on p.123 as follows:
Replace all instances of "geometry language" with "vertex, tessellation
evaluation and geometry languages".
Update numbering of "Layer and Viewport Selection" section to 11.4.
Modify the paragraph introducing "gl_ViewportIndex" on p.124 as follows:
The output variable gl_ViewportIndex is available only in the vertex,
tessellation evaluation 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. If no shader assigns
a value to gl_ViewportIndex, viewport transform and scissor rectangle zero
will be used. If a 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 11.4, "Layer and Viewport Selection"
in the OpenGL Graphics System Specification (Core Profile) for more information.
Additions to the AGL/GLX/WGL Specifications
GLX Protocol
New State
New Implementation Dependent State
1) Do we want to allow writes to these built-in variables from tessellation
RESOLVED: Yes, this is allowed in tessellation evaluation shaders. Note that
it is not possible to write either variable in the tessellation control shader.
2) What happens if gl_ViewportIndex or gl_Layer is written in the vertex
shader and a geometry shader is present?
RESOLVED: The value written by the last vertex processing stage is used.
If the last vertex processing stage (vertex, tessellation evaluation or
geometry) does not statically assign to gl_ViewportIndex or gl_Layer,
index or layer zero is assumed.
3) Are provoking vertex semantics honored for the purposes of writes to
gl_ViewportIndex in the VS?
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.
4) Do we want gl_ViewportIndexIn or gl_LayerIn inputs to shaders to allow
automatic passing of these variables along the pipe?
DISCUSSION: Rather not. This is just emualating things that the application
could and should do itself. Pushing built-ins down the pipe that aren't consuming
dedicated hardware resources just complicates things like counting rules and
ultimately ends up pretty inefficient.
Revision History
Rev. Date Author Changes
---- -------- -------- -----------------------------------------
1 03/19/2015 gsellers Initial version merging AMD_vertex_shader_viewport_index
and AMD_vertex_shader_layer