blob: d9dddb1e42f4180a767e3c8956002c248484d6fa [file] [log] [blame]
Name
EXT_geometry_shader
Name String
GL_EXT_geometry_shader
GL_EXT_geometry_point_size
Contact
Jon Leech (oddhack 'at' sonic.net)
Daniel Koch, NVIDIA (dkoch 'at' nvidia.com)
Contributors
Daniel Koch, NVIDIA (dkoch 'at' nvidia.com)
Pat Brown, NVIDIA (pbrown 'at' nvidia.com)
Slawomir Grajewski, Intel
Dominik Witczak, Mobica
Jesse Hall, Google
Maurice Ribble, Qualcomm
Bill Licea-Kane, Qualcomm
Graham Connor, Imagination
Ben Bowman, Imagination
Jonathan Putsman, Imagination
Contributors to ARB_geometry_shader4
Notice
Copyright (c) 2008-2016 The Khronos Group Inc. Copyright terms at
http://www.khronos.org/registry/speccopyright.html
Portions Copyright (c) 2013-2014 NVIDIA Corporation.
Status
Complete.
Version
Last Modified Date: May 31, 2016
Revision: 21
Number
OpenGL ES Extension #177
Dependencies
OpenGL ES 3.1 and OpenGL ES Shading Language 3.10 are required.
This specification is written against the OpenGL ES 3.1 (March 17, 2014)
and OpenGL ES 3.10 Shading Language (March 17, 2014) Specifications.
EXT_shader_io_blocks is required.
OES_sample_variables trivially affects the definition of this extension.
OES_texture_storage_multisample_2d_array affects the definition of this
extension.
OES_shader_multisample_interpolation trivially affects the definition of
this extension.
EXT_texture_buffer trivially affects the definition of this extension.
Overview
EXT_geometry_shader defines a new shader type available to be run on the
GPU, called a geometry shader. Geometry shaders are run after vertices are
transformed, but prior to color clamping, flatshading and clipping.
A geometry shader begins with a single primitive (point, line,
triangle). It can read the attributes of any of the vertices in the
primitive and use them to generate new primitives. A geometry shader has a
fixed output primitive type (point, line strip, or triangle strip) and
emits vertices to define a new primitive. A geometry shader can emit
multiple disconnected primitives. The primitives emitted by the geometry
shader are clipped and then processed like an equivalent primitive
specified by the application.
Furthermore, EXT_geometry_shader provides four additional primitive
types: lines with adjacency, line strips with adjacency, separate
triangles with adjacency, and triangle strips with adjacency. Some of the
vertices specified in these new primitive types are not part of the
ordinary primitives, instead they represent neighboring vertices that are
adjacent to the two line segment end points (lines/strips) or the three
triangle edges (triangles/tstrips). These vertices can be accessed by
geometry shaders and used to match up the vertices emitted by the geometry
shader with those of neighboring primitives.
Since geometry shaders expect a specific input primitive type, an error
will occur if the application presents primitives of a different type.
For example, if a geometry shader expects points, an error will occur at
drawing time if a primitive mode of TRIANGLES is specified.
This extension also adds the notion of layered framebuffer attachments
and framebuffers that can be used in conjunction with geometry shaders
to allow programs to direct primitives to a face of a cube map or layer
of a three-dimensional texture or two-dimensional array texture. The
layer used for rendering can be selected by the geometry shader at run
time. The framebuffer layer count present in GL 4.x and removed from
ES 3.1 is restored.
Not all geometry shader implementations have the ability to write the
point size from a geometry shader. Thus a second extension string and
shading language enable are provided for implementations which do
support geometry shader point size.
This extension relies on the EXT_shader_io_blocks extension to provide
the required functionality for declaring input and output blocks and
interfacing between shaders.
New Procedures and Functions
void FramebufferTextureEXT(enum target, enum attachment,
uint texture, int level);
New Tokens
Accepted by the <type> parameter of CreateShader and
CreateShaderProgramv, by the <pname> parameter of
GetProgramPipelineiv and returned in the <params> parameter of
GetShaderiv when <pname> is SHADER_TYPE:
GEOMETRY_SHADER_EXT 0x8DD9
Accepted by the <stages> parameter of UseProgramStages:
GEOMETRY_SHADER_BIT_EXT 0x00000004
Accepted by the <pname> parameter of GetProgramiv:
GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916
GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917
GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918
GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F
Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
GetFloatv, and GetInteger64v:
LAYER_PROVOKING_VERTEX_EXT 0x825E
MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C
MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32
MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123
MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124
MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A
MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF
MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5
MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD
MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7
Returned in the <data> parameter from a Get query with a <pname> of
LAYER_PROVOKING_VERTEX_EXT:
FIRST_VERTEX_CONVENTION_EXT 0x8E4D
LAST_VERTEX_CONVENTION_EXT 0x8E4E
UNDEFINED_VERTEX_EXT 0x8260
Accepted by the <target> parameter of BeginQuery, EndQuery,
GetQueryiv, and GetQueryObjectuiv:
PRIMITIVES_GENERATED_EXT 0x8C87
Accepted by the <mode> parameter of DrawArrays, DrawElements,
and other commands which draw primitives:
LINES_ADJACENCY_EXT 0xA
LINE_STRIP_ADJACENCY_EXT 0xB
TRIANGLES_ADJACENCY_EXT 0xC
TRIANGLE_STRIP_ADJACENCY_EXT 0xD
Accepted by the <pname> parameter of FramebufferParameteri,
and GetFramebufferParameteriv:
FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312
Accepted by the <pname> parameter of GetIntegerv, GetBooleanv,
GetInteger64v, and GetFloatv:
MAX_FRAMEBUFFER_LAYERS_EXT 0x9317
Returned by CheckFramebufferStatus:
FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
Accepted by the <pname> parameter of
GetFramebufferAttachmentParameteriv:
FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
Accepted by the <props> parameter of
GetProgramResourceiv:
REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309
Additions to the OpenGL ES 3.1 Specification
Modify chapter 3 "Dataflow Model"
Change the second paragraph, on p. 28:
... In the next stage vertices may be transformed, followed by assembly
into geometric primitives. Geometry shaders may then optionally generate
multiple new primitives from single input primitives. Optionally, the
results ...
Modify figure 3.1 "Block diagram of the OpenGL ES pipeline" to insert a
new box "Geometry Shader" following "Vertex Shader" and preceding
"Rasterization". Connect the Geometry Shader box to Transform Feedback
and Rasterization boxes, and remove the connection from Vertex Shader to
Transform Feedback. Extend the arrows from the boxes "Image Load/Store"
.. "Uniform Block" to the right of "Vertex Shader" to connect to the new
"Geometry Shader" box.
Modify section 4.2, "Query Objects and Asynchronous Queries" on p. 36
to add to the bullet list of supported query types
* Primitive queries with a target of PRIMITIVES_GENERATED_EXT (see
section 12.2) return information on the number of primitives processed
by the GL.
Replace the two paragraphs of chapter 7, "Programs and Shaders"
on p. 64 starting "Shader stages including ..." with:
Shader stages including vertex, geometry, fragment, and compute shaders
can be created, compiled, and linked into program objects.
Vertex shaders describe the operations that occur on vertex attributes.
Geometry shaders affect the processing of primitives assembled from
vertices (see section 11.1gs). Fragment shaders affect the processing of
fragments during rasterization (see chapter 14). A single program
object can contain all of these shaders, or any subset thereof.
Compute shaders ...
Add to table 7.1 "CreateShader <type> values" on p. 65:
<type> Shader Stage
------------------- ---------------
GEOMETRY_SHADER_EXT Geometry shader
Change bullet list describing reasons for link failure below the
LinkProgram command on p. 70:
... Linking can fail for a variety of reasons as specified in the OpenGL
ES Shading Language Specification, as well as any of the following
reasons:
* One or more of the shader objects attached to <program> are not
compiled successfully.
* More active uniform or active sampler variables are used in <program>
than allowed (see sections 7.6 and 7.9).
* The shaders do not use the same shader language version.
* <program> contains objects to form a geometry shader (see section
11.1gs), and
- <program> is not separable and contains no objects to form a
vertex shader; or
- the input primitive type, output primitive type, or maximum output
vertex count is not specified in the compiled geometry shader
object.
* <program> contains objects to form a compute shader (see section 17)
and
- <program> also contains objects to form any other type of shader.
If LinkProgram failed, ...
Modify section 7.3, "Program Objects":
Add to the second paragraph after UseProgram on p. 71:
The executable code ... the results of vertex and/or fragment processing
will be undefined. However, this is not an error. If there is no active
program for the geometry shader stage, that stage is ignored. If there
is no active program for the compute shader stage ...
Modify section 7.3.1, "Program Interfaces":
Modify table 7.2 "GetProgramResourceiv properties and supported
interfaces" on p. 81 to add "REFERENCED_BY_GEOMETRY_SHADER_EXT" to the
"Property" cell already containing REFERENCED_BY_<stage>_SHADER for
VERTEX, FRAGMENT, and COMPUTE stages, with the same supported
interfaces.
Add geometry shaders to the paragraph describing the REFERENCED_BY
properties, on p. 83:
For the properties REFERENCED_BY_VERTEX_SHADER,
REFERENCED_BY_GEOMETRY_SHADER_EXT, REFERENCED_BY_FRAGMENT_SHADER, and
REFERENCED_BY_COMPUTE_SHADER, a single integer is written to <params>,
identifying whether the active resource is referenced by the vertex,
geometry, fragment, or compute shaders, respectively, in the program
object. ...
Modify section 7.4, "Program Pipeline Objects" in the first paragraph
paragraph after UseProgramStages on p. 89:
... These stages may include vertex, geometry, fragment, or compute,
indicated respectively by VERTEX_SHADER_BIT, GEOMETRY_SHADER_BIT_EXT,
FRAGMENT_SHADER_BIT, or COMPUTE_SHADER_BIT. ...
Modify section 7.4.1, "Shader Interface Matching" on p. 91, changing
the second paragraph and adding a new paragraph:
Variables and block members declared as structures ... in the OpenGL ES
Shading Language Specification.
Geometry shader per-vertex input variables and blocks are required to be
declared as arrays, with each element representing input or output
values for a single vertex of a multi-vertex primitive. For the purposes
of interface matching, such variables and blocks are treated as though
they were not declared as arrays.
For program objects containing multiple shaders...
Modify section 7.4.2 "Program Pipeline Object State" on p. 92,
replacing the first bullet point:
* Unsigned integers are required to hold the names of the active program
and each of the current vertex, geometry, fragment, and compute stage
programs. Each integer is initially zero.
Modify section 7.6, "Uniform Variables"
Add to table 7.4 "Query targets for default uniform block storage ..."
on p. 96:
Shader Stage <pname> for querying default uniform block
storage, in components
---------------------------- -------------------------------------------
Geometry (see sec. 11.1gs.3) MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT
Add to table 7.5 "Query targets for combined uniform block storage ..."
on p. 97:
Shader Stage <pname> for querying combined uniform block
storage, in components
---------------------------- --------------------------------------------
Geometry MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT
Modify section 7.6.2, "Uniform Blocks" on p. 104, changing the second
paragraph of the section:
There is a set of implementation-dependent maximums for the number of
active uniform blocks used by each shader. If the number of uniform
blocks used by any shader in the program exceeds its corresponding
limit, the program will fail to link. The limits for vertex, geometry,
fragment, and compute shaders can be obtained by calling GetIntegerv
with <pname> values of MAX_VERTEX_UNIFORM_BLOCKS,
MAX_GEOMETRY_UNIFORM_BLOCKS_EXT, MAX_FRAGMENT_UNIFORM_BLOCKS, and
MAX_COMPUTE_UNIFORM_BLOCKS, respectively.
Modify section 7.7, "Atomic Counter Buffers" on p. 108, changing the
second paragraph of the section:
There is a set of implementation-dependent maximums for the number of
active atomic counter buffers referenced by each shader. If the number
of atomic counter buffers referenced by any shader in the program
exceeds its corresponding limit, the program will fail to link. The
limits for vertex, geometry, fragment, and compute shaders can be
obtained by calling GetIntegerv with <pname> values of
MAX_VERTEX_ATOMIC_COUNTER_BUFFERS,
MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT,
MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, or
MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS, respectively.
Modify section 7.8, "Shader Buffer Variables and Shader Storage Blocks"
on p. 110, changing the fourth paragraph:
If the number of active shader storage blocks referenced by the shaders
in a program exceeds implementation-dependent limits, the program will
fail to link. The limits for vertex, geometry, fragment, and compute
shaders can be obtained by calling GetIntegerv with pname values of
MAX_VERTEX_SHADER_STORAGE_BLOCKS,
MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT,
MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, and
MAX_COMPUTE_SHADER_STORAGE_BLOCKS, respectively. Additionally, a ...
Modify section 7.11.1 "Shader Memory Access Ordering" on p. 113 to add
to the list of ordering rules:
* The relative order of invocations of different shader types is largely
undefined. However, when executing a shader whose inputs are generated
from a previous programmable stage, the shader invocations from the
previous stage are guaranteed to have executed far enough to generate
final values for all next-stage inputs. That implies shader completion
for all stages except geometry; geometry shaders are guaranteed only
to have executed far enough to emit all needed vertices.
Modify section 7.12, "Shader, Program, and Program Pipeline Queries"
to add to the list of valid <pname>s for GetProgramiv on p. 121:
If <pname> is GEOMETRY_LINKED_VERTICES_OUT_EXT, the maximum number of
vertices the geometry shader will output is returned.
If <pname> is GEOMETRY_LINKED_INPUT_TYPE_EXT, the geometry shader input
type, which must be one of POINTS, LINES, LINES_ADJACENCY_EXT, TRIANGLES
or TRIANGLES_ADJACENCY_EXT, is returned.
If <pname> is GEOMETRY_LINKED_OUTPUT_TYPE_EXT, the current geometry shader
output type, which must be one of POINTS, LINE_STRIP or TRIANGLE_STRIP,
is returned.
If <pname> is GEOMETRY_SHADER_INVOCATIONS_EXT, the number of geometry
shader invocations per primitive will be returned.
Add to the Errors for GetProgramiv on p. 121:
An INVALID_OPERATION error is generated if
GEOMETRY_LINKED_VERTICES_OUT_EXT, GEOMETRY_LINKED_INPUT_TYPE_EXT,
GEOMETRY_LINKED_OUTPUT_TYPE_EXT, or GEOMETRY_SHADER_INVOCATIONS_EXT are
queried for a program which has not been linked successfully, or which
does not contain objects to form a geometry shader,
Modify section 7.13 "Required State" to change the last two paragraphs
of the section on p. 127:
This list of program object state is not complete. Tables 20.20-20.28
describe additional program object state specific to program binaries,
geometry shaders, and uniform blocks.
Table 20.29 describes state related to vertex and geometry shaders that
is not program object state.
Modify section 9.2, "Binding and Managing Framebuffer Objects" to add to
the list of bullet points for BindFramebuffer on p. 205:
* If the number of layers of each attachment are not all identical,
rendering will be limited to the smallest number of layers of any
attachment. If there are no attachments, the number of layers will be
taken from the framebuffer object's default layer count.
Modify section 9.2.1, "Framebuffer Object Parameters" to replace the
second and third paragraphs of the section, adding default and maximum
layer counts to FramebufferParameteri, on p. 206 and p. 207:
When a framebuffer has one or more attachments, the width, height, layer
count (section 9.7gs), sample count, and sample location pattern of the
framebuffer are derived from the properties of the framebuffer
attachments. When the framebuffer has no attachments, these properties
are taken from framebuffer parameters. When <pname> is
FRAMEBUFFER_DEFAULT_WIDTH, FRAMEBUFFER_DEFAULT_HEIGHT,
FRAMEBUFFER_DEFAULT_LAYERS_EXT, FRAMEBUFFER_DEFAULT_SAMPLES, or
FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS, the value in <param>
specifies the width, height, layer count, sample count, or sample
location pattern, respectively, used when the framebuffer has no
attachments.
When a framebuffer has no attachments, it is considered layered (section
9.7gs) if and only if the value of FRAMEBUFFER_DEFAULT_LAYERS_EXT is
non-zero. It is considered to have sample buffers ...
Modify the error for invalid parameter values on p. 207 to add
layer counts:
An INVALID_VALUE error is generated if <pname> is
FRAMEBUFFER_DEFAULT_WIDTH, FRAMEBUFFER_DEFAULT_HEIGHT,
FRAMEBUFFER_DEFAULT_LAYERS_EXT, or FRAMEBUFFER_DEFAULT_SAMPLES, and
<param> is either negative or greater than the value of the
corresponding implementation-dependent limits MAX_FRAMEBUFFER_WIDTH,
MAX_FRAMEBUFFER_HEIGHT, MAX_FRAMEBUFFER_LAYERS_EXT, or
MAX_FRAMEBUFFER_SAMPLES, respectively.
Replace the bullet list in section 9.2.2, "Attaching Images to
Framebuffer Objects" on p. 208:
There are several types of framebuffer-attachable images:
* The image of a renderbuffer object, which is always two-dimensional.
* A single level of a two-dimensional or two-dimensional multisample
texture.
* A single face of a cube map texture level, which is treated as a
two-dimensional image.
* A single layer of a two-dimensional array texture, two-dimensional
multidimensional array texture, or three-dimensional texture, which is
treated as a two-dimensional image.
Additionally, an entire level of a three-dimensional, cube map,
two-dimensional array, or two-dimensional multisample array texture can
be attached to an attachment point. Such attachments are treated as an
array of two-dimensional images, arranged in layers, and the
corresponding attachment point is considered to be <layered> (also see
section 9.7gs)
Modify section 9.2.3, "Framebuffer Object Queries"
In the description of GetFramebufferAttachmentParameteriv for texture
attachments, replace the bullet point for
FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER on p. 210:
* If <pname> is FRAMEBUFFER_ATTACHMENT_LAYERED_EXT then <params> will
contain TRUE if an entire level of a three-dimensional, cube map,
two-dimensional array, or two-dimensional multisample array texture is
attached. Otherwise, <params> will contain FALSE.
* If pname is FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER; the value of
FRAMEBUFFER_ATTACHMENT_OBJECT_NAME is the name of a three-dimensional,
or a two-dimensional array texture; and the value of
FRAMEBUFFER_ATTACHMENT_LAYERED_EXT is FALSE, then <params> will
contain the value of the texture layer which contains the attached
image.
Modify section 9.2.8, "Attaching Texture Images to a Framebuffer" on
p. 217:
The GL supports copying the rendered contents of the framebuffer into
the images of a texture object through the use of the routines
CopyTexImage* and CopyTexSubImage*. Additionally, the GL supports
rendering directly into the images of a texture object.
To render directly into a texture image, a specified level of a texture
object can be attached as one of the logical buffers of the currently
bound framebuffer object by calling
void FramebufferTextureEXT(enum target, enum attachment,
uint texture, int level);
<target> must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER, or FRAMEBUFFER.
FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. <attachment> must be one
of the attachment points of the framebuffer listed in table 9.1.
If <texture> is non-zero, the specified mipmap <level> of the texture
object named <texture> is attached to the framebuffer attachment point
named by <attachment>.
If <texture> is the name of a three-dimensional texture, cube map
texture, two-dimensional array, or two-dimensional multisample array
texture, the texture level attached to the framebuffer attachment point
is an array of images, and the framebuffer attachment is considered
<layered>.
Errors
An INVALID_ENUM error is generated if <target> is not DRAW_FRAMEBUFFER,
READ_FRAMEBUFFER, or FRAMEBUFFER.
An INVALID_ENUM error is generated if <attachment> is not one of the
attachments in table 9.1.
An INVALID_OPERATION error is generated if zero is bound to <target>.
An INVALID_VALUE error is generated if <texture> is not the name of a
texture object, or if <level> is not a supported texture level for
<texture>.
An INVALID_OPERATION error is generated if <texture> is the name of a
buffer texture.
Additionally, a specified image from a texture object can be attached as
one of the logical buffers of a currently bound framebuffer object by
calling
void FramebufferTexture2D
...
The command
void FramebufferTextureLayer(enum target, enum attachment,
uint texture, int level, int layer);
operates similarly to FramebufferTexture2D, except that it attaches a
single layer of a three-dimensional, two-dimensional array, or
two-dimensional multisample array texture level.
<target> and <attachment> are specified with the same values, and have
the same meanings as the corresponding arguments of
FramebufferTexture2D.
<level> specifies the mipmap level of the texture image to be attached
to the framebuffer.
If <texture> is a three-dimensional texture, then <level> must be
greater than or equal to zero and less than or equal to log2 of the
value of MAX_3D_TEXTURE_SIZE. If <texture> is a two-dimensional array
texture, then <level> must be greater than or equal to zero and no
larger than log2 of the value of MAX_TEXTURE_SIZE. If <texture> is a
two-dimensional multisample array texture, then <level> must be zero.
<layer> specifies the layer of a two-dimensional image within <texture>.
Unlike FramebufferTexture2D, no <textarget> parameter is accepted.
If <texture> is non-zero and the command does not result in an error,
the framebuffer attachment state corresponding to <attachment> is
updated as in the other FramebufferTexture commands, except that the
value of FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER is set to <layer>.
Errors
An INVALID_ENUM error is generated if <target> is not DRAW_FRAMEBUFFER,
READ_FRAMEBUFFER, or FRAMEBUFFER.
An INVALID_ENUM error is generated if <attachment> is not one of the
attachments in table 9.1.
An INVALID_VALUE error is generated if texture is non-zero and <level>
is not a supported texture level for <texture>, as described above.
An INVALID_VALUE error is generated if <texture> is non-zero and <layer>
is larger than the value of MAX_3D_TEXTURE_SIZE minus one (for
three-dimensional textures), or larger than the value of
MAX_ARRAY_TEXTURE_LAYERS minus one (for array textures).
An INVALID_VALUE error is generated if <texture> is non-zero and <layer>
is negative.
An INVALID_OPERATION error is generated if <texture> is non-zero and is
not the name of a three dimensional, two-dimensional multisample array,
or two-dimensional array texture.
Modify section 9.2.8.1, "Effects of Attaching a Texture Image" to add
to the list of bullet points on p. 220:
* If FramebufferTextureEXT is called and <texture> is the name of a
three-dimensional, cube map, two-dimensional multisample array, or
two-dimensional array texture, the value of
FRAMEBUFFER_ATTACHMENT_LAYERED_EXT is set to TRUE; otherwise it is set
to FALSE.
Modify section 9.4.1, "Framebuffer Completeness" to replace the bullet
point starting "If <image> is a three-dimensional texture" on p. 223:
* If <image> is a three-dimensional texture or a two-dimensional array
texture and the attachment is not layered, the selected layer is less
than the depth or layer count, respectively, of the texture.
* If <image> is a three-dimensional texture or a two-dimensional array
texture and the attachment is layered, the depth or layer count,
respectively, of the texture is less than or equal to the value of
MAX_FRAMEBUFFER_LAYERS_EXT.
Modify section 9.4.2 "Whole Framebuffer Completeness" to add to the list
of bullet points on p. 224:
* If any framebuffer attachment is layered, all populated attachments
must be layered. Additionally, all populated color attachments must be
from textures of the same target (i.e., three-dimensional, cube map,
two-dimensional array, or two-dimensional multisample array textures).
{ FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT }
Add new section 9.7gs on p. 229, following existing section 9.7
"Conversion to RGBA Values":
Section 9.7gs Layered Framebuffers
A framebuffer is considered to be layered if it is complete and all of
its populated attachments are layered. When rendering to a layered
framebuffer, each fragment generated by the GL is assigned a layer
number. The layer number for a fragment is zero if
* geometry shaders are disabled, or
* the current geometry shader does not statically assign a value to
the built-in output variable "gl_Layer".
Otherwise, the layer for each point, line, or triangle emitted by the
geometry shader is taken from the "gl_Layer" output of one of the
vertices of the primitive. The vertex used is implementation-dependent
and may be queried as described in section 11.1gs.4.
To get defined results, all vertices of each primitive emitted should
set the same value for "gl_Layer". Since the "EndPrimitive" built-in
function starts a new output primitive, defined results can be achieved
if "EndPrimitive" is called between two vertices emitted with different
layer numbers. A layer number written by a geometry shader has no effect
if the framebuffer is not layered.
When fragments are written to a layered framebuffer, the fragment's
layer number selects a single image from the array of images at each
attachment point to use for the stencil test (see section 4.1.4), depth
buffer test (see section 4.1.5), and for blending and color buffer
writes (see section 4.1.7). If the fragment's layer number is negative,
or greater than or equal to the minimum number of layers of any
attachment, the effects of the fragment on the framebuffer contents are
undefined.
When the Clear or ClearBuffer* commands are used to clear a layered
framebuffer attachment, all layers of the attachment are cleared.
When commands such as ReadPixels read from a layered framebuffer, the
image at layer zero of the selected attachment is always used to obtain
pixel values.
When cube map texture levels are attached to a layered framebuffer, there
are six layers attached, numbered zero through five. Each layer number is
mapped to a cube map face, as indicated in table 8.25.
Modify section 10.1, "Primitive Types" to add new figure 10.X1 and new
sections 10.1.7la, 10.1.7lsa, 10.1.7ta, and 10.1.7tsa following section
10.1.7, "Separate Triangles", on p. 234:
Section 10.1.7la Lines with Adjacency
Add figure 10.X1:
1 - - - 2----->3 - - - 4 1 - - - 2--->3--->4--->5 - - - 6
5 - - - 6----->7 - - - 8
(a) (b)
Figure 10.X1 (a) Lines with adjacency, (b) Line strip with adjacency.
The vertices connected with solid lines belong to the main primitives;
the vertices connected by dashed lines are the adjacent vertices that
may be used in a geometry shader.
Lines with adjacency are specified with <mode> LINES_ADJACENCY_EXT, and
are independent line segments where each endpoint has a corresponding
"adjacent" vertex that can be accessed by a geometry shader (see section
11.1gs). If a geometry shader is not active, the "adjacent" vertices are
ignored.
A line segment is drawn from the 4i + 2nd vertex to the 4i + 3rd vertex
for each i = 0, 1, ... , n-1, where there are 4n+k vertices passed. k is
either 0, 1, 2, or 3; if k is not zero, the final k vertices are
ignored. For line segment i, the 4i + 1st and 4i + 4th vertices are
considered adjacent to the 4i + 2nd and 4i + 3rd vertices, respectively.
See Figure 10.X1.
Section 10.1.7lsa Line Strips with Adjacency
Line strips with adjacency are specified with <mode>
LINE_STRIP_ADJACENCY_EXT and are similar to line strips, except that
each line segment has a pair of adjacent vertices that can be accessed
by a geometry shader. If a geometry shader is not active, the "adjacent"
vertices are ignored.
A line segment is drawn from the i + 2nd vertex to the i + 3rd vertex
for each i = 0, 1, ..., n-1, where there are n+3 vertices passed. If
there are fewer than four vertices, all vertices are ignored. For line
segment i, the i + 1st and i + 4th vertex are considered adjacent to the
i + 2nd and i + 3rd vertices, respectively. See Figure 10.X1.
Section 10.1.7ta Triangles with Adjacency
Add new figure 10.X2:
2 - - - 3 - - - 4 8 - - - 9 - - - 10
^\ ^\
\ | \ | \ | \ |
| \ | \
\ | \ | \ | \ |
| \ | \
\ | \ | \ | \ |
| v | v
1<------5 7<------11
\ | \ |
\ | \ |
\ | \ |
6 12
Figure 10.X2 Triangles with adjacency. The vertices connected with solid
lines belong to the main primitive; the vertices connected by dashed
lines are the adjacent vertices that may be used in a geometry shader.
Triangles with adjacency are specified with <mode> TRIANGLES_ADJACENCY_EXT,
and are similar to separate triangles except that
each triangle edge has an adjacent vertex that can be accessed by a
geometry shader. If a geometry shader is not active, the
"adjacent" vertices are ignored.
The 6i + 1st, 6i + 3rd, and 6i + 5th vertices (in that order) determine a
triangle for each i = 0, 1, ..., n-1, where there are 6n+k vertices
passed. k is either 0, 1, 2, 3, 4, or 5; if k is
non-zero, the final k vertices are ignored. For triangle i, the i + 2nd,
i + 4th, and i + 6th vertices are considered adjacent to edges from the i
+ 1st to the i + 3rd, from the i + 3rd to the i + 5th, and from the i +
5th to the i + 1st vertices, respectively. See Figure 10.X2.
Section 10.1.7 tsa Triangle Strips with Adjacency
Add figure 10.X3:
6 6
| \ | \
| \ | \
| \ | \
2 - - - 3- - - >6 2 - - - 3------>7 2 - - - 3------>7- - - 10
^\ ^^ | ^^ ^^ |
\ | \ | \ | \ | \ \ | \ | \
| \ | \ | | \ | \ |
\ | \ | \ | \ | \ \ | \ | \
| \ | \ | | \ | \ |
\ | \ | \ | \ | \ \ | \ | \
| v | vv | vv v|
1<------5 1<------5 - - - 8 1<------5<------9
\ | \ | \ | \ |
\ | \ | \ | \ |
\ | \ | \ | \ |
4 4 4 8
6 10
| \ | \
| \ | \
| \ | \
2 - - - 3------>7------>11
^^ ^^ |
\ | \ | \ | \
| \ | \ |
\ | \ | \ | \
| \ | \ |
\ | \ | \ | \
| vv vv
1<------5<------9 - - - 12
\ | \ |
\ | \ |
\ | \ |
4 8
Figure 10.X3 Triangle strips with adjacency. The vertices connected with
solid lines belong to the main primitives; the vertices connected by
dashed lines are the adjacent vertices that may be used in a geometry
shader.
Triangle strips with adjacency are specified with <mode>
TRIANGLE_STRIP_ADJACENCY_EXT and are similar to triangle strips except that
each line triangle edge has an adjacent vertex that can be accessed by a
geometry shader (see section 11.1gs). If a geometry shader is not
active, the "adjacent" vertices are ignored.
In triangle strips with adjacency, n triangles are drawn where there are
2 * (n+2) + k vertices passed. k is either 0 or 1; if k is 1, the
final vertex is ignored. If there are fewer than 6 vertices,
the entire primitive is ignored. Table 10.X1 describes
the vertices and order used to draw each triangle, and which vertices are
considered adjacent to each edge of the triangle. See Figure 10.X3.
Add table 10.X1:
primitive adjacent
vertices vertices
primitive 1st 2nd 3rd 1/2 2/3 3/1
--------------- ---- ---- ---- ---- ---- ----
only (i==0, n==1) 1 3 5 2 6 4
first (i==0) 1 3 5 2 7 4
middle (i odd) 2i+3 2i+1 2i+5 2i-1 2i+4 2i+7
middle (i even) 2i+1 2i+3 2i+5 2i-1 2i+7 2i+4
last (i==n-1, i odd) 2i+3 2i+1 2i+5 2i-1 2i+4 2i+6
last (i==n-1, i even) 2i+1 2i+3 2i+5 2i-1 2i+6 2i+4
Table 10.X1: Triangles generated by triangle strips with adjacency.
Each triangle is drawn using the vertices in the "1st", "2nd", and "3rd"
columns under "primitive vertices", in that order. The vertices in the
"1/2", "2/3", and "3/1" columns under "adjacent vertices" are considered
adjacent to the edges from the first to the second, from the second to
the third, and from the third to the first vertex of the triangle,
respectively. The six rows correspond to the six cases: the first and
only triangle (i=0, n=1), the first triangle of several (i=0, n>0),
"odd" middle triangles (i=1,3,5...), "even" middle triangles
(i=2,4,6,...), and special cases for the last triangle,
when i is either even or odd. For the purposes of this
table, the first vertex passed is numbered "1" and the
first triangle is numbered "0".
Modify section 10.5, "Drawing Commands using Vertex Arrays"
On p. 250 in the errors section for the DrawArraysIndirect command,
and on p. 254 in the errors section for the DrawElementsIndirect command,
delete the errors which state:
"An INVALID_OPERATION error is generated if transform feedback is
active and not paused."
(thus allowing transform feedback to work with indirect draw commands).
Modify section 11.1.2.1, "Output Variables" on p. 262, starting with the
second paragraph of the section:
The OpenGL ES Shading Language specification also defines a
set of built-in outputs that vertex shaders can write to (see
section 7.1 ("Built-In Language Variables") of the OpenGL ES Shading
Language Specification). These output variables
are used to communicate values to the next active stage in the
vertex processing pipeline; either the geometry shader, or the
fixed-function vertex processing stages leading to rasterization.
If the output variables are passed directly to the vertex processing
stages leading to rasterization, the values of all outputs are expected
to be interpolated across the primitive being rendered, unless
flatshaded. Otherwise the values of all outputs are collected by the
primitive assembly stage and passed on to the subsequent pipeline stage
once enough data for one primitive has been collected.
The number of components (individual scalar numeric values) of output
variables that can be written by the vertex shader, whether or not a
geometry shader is active, is given by the value of the
implementation-dependent constant MAX_VERTEX_OUTPUT_COMPONENTS.
For the purposes of counting input and output components
consumed by a shader, variables declared as vectors, matrices, and
arrays will all consume multiple components.
When a program is linked...
Additionally, when linking a program containing only a vertex and
fragment shader, there is a limit on the total number of components...
Each program object can specify a set of output variables from one
shader to be recorded in transform feedback mode (see section 12.1).
The variables that can be recorded are those emitted by the first active
shader, in order, from the following list:
* geometry shader
* vertex shader
The set of variables to record is specified with the command
void TransformFeedbackVaryings ...
Modify starting with the list of TransformFeedbackVaryings link failures
on p. 263:
... A program will fail to link if:
* the <count> specified by TransformFeedbackVaryings is non-zero, but
the program object has no vertex or geometry shader;
* any variable name specified in the <varyings> array is not declared as
a built-in or user-defined output variable in the shader stage whose
outputs can be recorded;
* any two entries in the <varyings> array specify the same output
variable;
* the total number of components to capture in any output in <varyings>
is greater than the value of
MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS and the buffer mode is
SEPARATE_ATTRIBS; or
* the total number of components to capture is greater than the value of
MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS and the buffer mode is
INTERLEAVED_ATTRIBS.
When a program is linked ...
Modify section 11.1.3 "Shader Execution"
Change the first paragraph of the section on p. 264:
If there is an active program object present for the vertex or geometry
shader stages, the executable code for those active programs is used to
process incoming vertex values. The following sequence of operations is
performed:
* Vertices are processed by the vertex shader (see section 11.1) and
assembled into primitives as described in sections 10.1 through 10.3.
* If the current program contains a geometry shader, each individual
primitive is processed by the geometry shader (see section 11.1gs).
Otherwise, primitives are passed through unmodified. If active, the
geometry shader consumes its input primitive. However, each geometry
shader invocation may emit new vertices, which are arranged into
primitives and passed to subsequent pipeline stages.
Following shader execution, the fixed-function operations described in
chapter 12 are applied.
Special considerations for ...
Rename section 11.1.3.1 "Shader Texturing" to "Shader Only Texturing"
on p. 264.
Modify the bullet list in section 11.1.3.5 "Texture Access" on p. 266 to
add a limit for geometry shaders:
* MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT (for geometry shaders)
Modify the bullet list in section 11.1.3.6 "Atomic Counter Access" on p.
268 to add a limit for geometry shaders:
* MAX_GEOMETRY_ATOMIC_COUNTERS_EXT (for geometry shaders)
Modify the bullet list in section 11.1.3.7 "Image Access" on p. 268 to
add a limit for geometry shaders:
* MAX_GEOMETRY_IMAGE_UNIFORMS_EXT (for geometry shaders)
Modify the bullet list in section 11.1.3.8 "Shader Storage Buffer
Access" on p. 268 to add a limit for geometry shaders:
* MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT (for geometry shaders)
Modify section 11.1.3.11 "Validation" to add to the list of validation
errors on p. 270:
* One program object is active for at least two shader stages and a
second program is active for a shader stage between two stages for
which the first program was active.
* There is an active program for the geometry stage with corresponding
executable shader, but there is no active program with an executable
vertex shader.
Add new section 11.1gs, "Geometry Shaders" on p. 272, following
section 11.1, "Vertex Shaders"
Section 11.1.gs Geometry Shaders
After vertices are processed, they are arranged into primitives, as
described in section 10.1 (Primitive Types). This section describes
<geometry shaders>, an additional pipeline stage defining operations to
further process those primitives. Geometry shaders are defined by source
code in the OpenGL ES Shading Language, in the same manner as vertex
shaders. They operate on a single primitive at a time and emit one or
more output primitives, all of the same type, which are then processed
like an equivalent GL primitive specified by the application. The
original primitive is discarded after geometry shader execution. The
inputs available to a geometry shader are the transformed attributes of
all the vertices that belong to the primitive. Additional <adjacency
primitives> are available which also make the transformed attributes of
neighboring vertices available to the shader. The results of the shader
are a new set of transformed vertices, arranged into primitives by the
shader.
The geometry shader pipeline stage is inserted after primitive assembly,
prior to transform feedback (see section 12.1), as discussed in section
11.1.3.
Geometry shaders are created as described in section 7.1 using a <type>
of GEOMETRY_SHADER_EXT. They are attached to and used in program objects
as described in section 7.3. When the program object currently in use
includes a geometry shader, its geometry shader is considered active,
and is used to process primitives. If the program object has no geometry
shader, this stage is bypassed.
A non-separable program object or program pipeline object that includes
a geometry shader must also include a vertex shader.
Errors
An INVALID_OPERATION error is generated by any command that transfers
vertices to the GL if the current program state has a geometry shader
but no vertex shader.
Section 11.1gs.1, Geometry Shader Input Primitives
A geometry shader can operate on one of five input primitive types.
Depending on the input primitive type, one to six input vertices are
available when the shader is executed. Each input primitive type
supports a subset of the primitives provided by the GL.
An INVALID_OPERATION error is generated by any command that transfers
vertices to the GL if a geometry shader is active and the primitive
<mode> parameter is incompatible with the input primitive type of the
geometry shader of the active geometry program object, as discussed
below.
A geometry shader that accesses more input vertices than are available
for a given input primitive type can be successfully compiled, because
the input primitive type is not part of the shader object. However, a
program object containing a shader object that accesses more input
vertices than are available for the input primitive type of the program
object will not link.
The input primitive type is specified in the geometry shader source code
using an input layout qualifier, as described in the OpenGL ES Shading
Language Specification. A program will fail to link if the input
primitive type is not specified by the geometry shader object attached
to the program. The input primitive type may be queried by calling
GetProgramiv with the symbolic constant GEOMETRY_LINKED_INPUT_TYPE_EXT.
The supported types and the corresponding OpenGL ES Shading Language
input layout qualifier keywords are:
Points (points)
Geometry shaders that operate on points are valid only for the POINTS
primitive type. There is only a single vertex available for each
geometry shader invocation.
Lines (lines)
Geometry shaders that operate on line segments are valid only for the
LINES, LINE_STRIP, and LINE_LOOP primitive types. There are two vertices
available for each geometry shader invocation. The first vertex refers
to the vertex at the beginning of the line segment and the second vertex
refers to the vertex at the end of the line segment. See also section
11.1gs.4.
Lines with Adjacency (lines_adjacency)
Geometry shaders that operate on line segments with adjacent vertices
are valid only for the LINES_ADJACENCY_EXT and LINE_STRIP_ADJACENCY_EXT
primitive types. There are four vertices available for each program
invocation. The second vertex refers to attributes of the vertex at the
beginning of the line segment and the third vertex refers to the vertex
at the end of the line segment. The first and fourth vertices refer to
the vertices adjacent to the beginning and end of the line segment,
respectively.
Triangles (triangles)
Geometry shaders that operate on triangles are valid for the TRIANGLES,
TRIANGLE_STRIP and TRIANGLE_FAN primitive types. There are three
vertices available for each program invocation. The first, second and
third vertices refer to attributes of the first, second and third vertex
of the triangle, respectively.
Triangles with Adjacency (triangles_adjacency)
Geometry shaders that operate on triangles with adjacent vertices are
valid for the TRIANGLES_ADJACENCY_EXT and TRIANGLE_STRIP_ADJACENCY_EXT
primitive types. There are six vertices available for each program
invocation. The first, third and fifth vertices refer to attributes of
the first, second and third vertex of the triangle, respectively. The
second, fourth and sixth vertices refer to attributes of the vertices
adjacent to the edges from the first to the second vertex, from the
second to the third vertex, and from the third to the first vertex,
respectively.
Section 11.1gs.2, Geometry Shader Output Primitives
A geometry shader can generate primitives of one of three types. The
supported output primitive types are points (POINTS), line strips
(LINE_STRIP), and triangle strips (TRIANGLE_STRIP). The vertices output
by the geometry shader are assembled into points, lines, or triangles
based on the output primitive type in the manner described in section
10.5. The resulting primitives are then further processed as described
in section 11.1gs.4. If the number of vertices emitted by the geometry
shader is not sufficient to produce a single primitive, nothing is
drawn. The number of vertices output by the geometry shader is limited
to a maximum count specified in the shader.
The output primitive type and maximum output vertex count are specified
in the geometry shader source code using an output layout qualifier, as
described in section 4.4.2.gs ("Geometry Outputs") of the OpenGL ES
Shading Language Specification. A program will fail to link if either
the output primitive type or maximum output vertex count are not
specified by the geometry shader object attached to the program. The
output primitive type and maximum output vertex count of a linked
program may be queried by calling GetProgramiv with the symbolic
constants GEOMETRY_LINKED_OUTPUT_TYPE_EXT and
GEOMETRY_LINKED_VERTICES_OUT_EXT, respectively.
Section 11.1gs.3 Geometry Shader Variables
Geometry shaders can access uniforms belonging to the current program
object. Limits on uniform storage and methods for manipulating uniforms
are described in section 7.6.
Geometry shaders also have access to samplers to perform texturing
operations, as described in section 7.9.
Geometry shaders can access the transformed attributes of all vertices
for their input primitive type using input variables. A vertex shader
writing to output variables generates the values of these input
variables. Values for any inputs that are not written by a vertex shader
are undefined. Additionally, a geometry shader has access to a built-in
variable that holds the ID of the current primitive. This ID is
generated by the primitive assembly stage that sits in between the
vertex and geometry shader.
Additionally, geometry shaders can write to one or more output variables
for each vertex they output. These values are optionally flatshaded
(using the OpenGL ES Shading Language varying qualifier "flat") and
clipped, then the clipped values interpolated across the primitive (if
not flatshaded). The results of these interpolations are available to
the fragment shader.
Section 11.1gs.4, Geometry Shader Execution Environment
If there is an active program for the geometry stage, the executable
version of the program's geometry shader is used to process primitives
resulting from the primitive assembly stage.
There are several special considerations for geometry shader execution
described in the following sections.
Section 11.1gs.4.1 Texture Access
Section 11.1.3.1 describes texture lookup functionality accessible to a
vertex shader. The texel fetch and texture size query functionality
described there also applies to geometry shaders.
Section 11.1gs.4.2 Instanced Geometry Shaders
For each input primitive received by the geometry shader pipeline stage,
the geometry shader may be run once or multiple times. The number of
times a geometry shader should be executed for each input primitive may
be specified using a layout qualifier in a geometry shader of a linked
program. If the invocation count is not specified in any layout
qualifier, the invocation count will be one.
Each separate geometry shader invocation is assigned a unique invocation
number. For a geometry shader with <N> invocations, each input primitive
spawns <N> invocations, numbered 0 through <N>-1. The built-in uniform
gl_InvocationID may be used by a geometry shader invocation to determine
its invocation number.
When executing instanced geometry shaders, the output primitives
generated from each input primitive are passed to subsequent pipeline
stages using the shader invocation number to order the output. The first
primitives received by the subsequent pipeline stages are those emitted
by the shader invocation numbered zero, followed by those from the
shader invocation numbered one, and so forth. Additionally, all output
primitives generated from a given input primitive are passed to
subsequent pipeline stages before any output primitives generated from
subsequent input primitives.
Section 11.1gs.4.3 Geometry Shader Inputs
Section 7.1 ("Built-In Language Variables") of the OpenGL ES Shading
Language Specification describes the built-in variable array gl_in[]
available as input to a geometry shader. gl_in[] receives values from
the equivalent built-in output variables written by the vertex shader.
Each array element of gl_in[] is a structure holding values for a
specific vertex of the input primitive. The length of gl_in[] is
determined by the geometry shader input type (see section 11.1gs.1). The
members of each element of the gl_in[] array are:
[[ If EXT_geometry_point_size is supported: ]]
* structure member gl_PointSize holds the per-vertex point size written
by the previous shader to its built-in output variable gl_PointSize.
If the previous shader does not write gl_PointSize, the value of
gl_PointSize is undefined.
* structure member gl_Position holds the per-vertex position, as written
by the previous shader to its built-in output variable gl_Position.
Note that writing to gl_Position from either the vertex or geometry
shader is optional (also see section 7.1 ("Built-In Language
Variables") of the OpenGL ES Shading Language Specification)
Geometry shaders also have available the built-in input variable
gl_PrimitiveIDIn, which is not an array and has no vertex shader
equivalent. It is filled with the number of primitives processed by the
drawing command which generated the input vertices. The first primitive
generated by a drawing command is numbered zero, and the primitive ID
counter is incremented after every individual point, line, or triangle
primitive is processed. For triangles drawn in point or line mode, the
primitive ID counter is incremented only once, even though multiple
points or lines may eventually be drawn. The counter is reset to zero
between each instance drawn. Restarting a primitive topology using the
primitive restart index has no effect on the primitive ID counter.
Similarly to the built-in inputs, each user-defined input has a value
for each vertex and thus needs needs to be declared as arrays or inside
input blocks declared as arrays. Declaring an array size is optional. If
no size is specified, it will be inferred by the linker from the input
primitive type. If a size is specified, it must match the number of
vertices for the input primitive type; otherwise a link error will
occur. The OpenGL ES Shading Language doesn't support multi-dimensional
arrays as shader inputs or outputs; therefore, user-defined geometry
shader inputs corresponding to vertex shader outputs declared as arrays
must be declared as array members of an input block that is itself
declared as an array. See section 4.3.6 ("Output Variables") of the
OpenGL ES Shading Language Specification for more information.
Similarly to the limit on vertex shader output components (see section
11.1.2.1), there is a limit on the number of components of input
variables that can be read by the geometry shader, given by the value of
the implementation-dependent constant MAX_GEOMETRY_INPUT_COMPONENTS_EXT.
When a program is linked, all components of any input read by a geometry
shader will count against this limit. A program whose geometry shader
exceeds this limit may fail to link, unless device-dependent
optimizations are able to make the program fit within available hardware
resources.
Component counting rules for different variable types and variable
declarations are the same as for MAX_VERTEX_OUTPUT_COMPONENTS (see
section 11.1.2.1).
Section 11.1gs.4.4 Geometry Shader Outputs
A geometry shader is limited in the number of vertices it may emit per
invocation. The maximum number of vertices a geometry shader can
possibly emit is specified in the geometry shader source and may be
queried after linking by calling GetProgramiv with the symbolic constant
GEOMETRY_LINKED_VERTICES_OUT_EXT. If a single invocation of a geometry
shader emits more vertices than this value, the emitted vertices may
have no effect.
There are two implementation-dependent limits on the value of
GEOMETRY_LINKED_VERTICES_OUT_EXT; it may not exceed the value of
MAX_GEOMETRY_OUTPUT_VERTICES_EXT, and the product of the total number of
vertices and the sum of all components of all active output variables
may not exceed the value of MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT.
LinkProgram will fail if it determines that the total component limit
would be violated.
A geometry shader can write to built-in as well as user-defined output
variables. These values are expected to be interpolated across the
primitive it outputs, unless they are specified to be flatshaded. To
enable seamlessly inserting or removing a geometry shader from a program
object, the rules, names and types of the built-in and user-defined
output variables are the same as for the vertex shader. Refer to section
11.1.2.1, and to sections 4.3.6 ("Output Variables") and 7.1 ("Built-In
Language Variables") of the the OpenGL ES Shading Language Specification
for more detail.
After a geometry shader emits a vertex, all output variables are
undefined, as described in section 8.12gs ("Geometry Shader Functions")
of the OpenGL Shading Language Specification.
The built-in output gl_Position is intended to hold the homogeneous
vertex position. Writing gl_Position is optional.
[[ If EXT_geometry_point_size is supported: ]]
The built-in output gl_PointSize, if written, holds the size of the
point to be rasterized, measured in pixels.
The built-in output gl_PrimitiveID holds the primitive ID counter read
by the fragment shader, replacing the value of gl_PrimitiveID generated
by drawing commands when no geometry shader is active. The geometry
shader must write to gl_PrimitiveID for the provoking vertex (see
section 12.3) of a primitive being generated, or the primitive ID
counter read by the fragment shader for that primitive is undefined.
The built-in output gl_Layer is used in layered rendering, and discussed
further in the next section.
Similarly to the limit on vertex shader output components (see section
11.1.2.1), there is a limit on the number of components of output
variables that can be written by the geometry shader, given by the value
of the implementation-dependent constant
MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT.
When a program is linked, all components of any output variable written
by a geometry shader will count against this limit. A program whose
geometry shader exceeds this limit may fail to link, unless
device-dependent optimizations are able to make the program fit within
available hardware resources.
Component counting rules for different variable types and variable
declarations are the same as for MAX_VERTEX_OUTPUT_COMPONENTS. (see
section 11.1.2.1).
Section 11.1gs.4.5 Layer Selection
Geometry shaders can be used to render to one of several different
layers of cube map textures, three-dimensional textures, or
two-dimensional texture arrays. This functionality allows an application
to bind an entire complex texture to a framebuffer object, and render
primitives to arbitrary layers computed at run time. For example, this
mechanism can be used to project and render a scene onto all six faces
of a cube map texture in one pass. The layer to render to is specified
by writing to the built-in output variable "gl_Layer". Layered rendering
requires the use of framebuffer objects (see section 9.7gs).
The specific vertex of a primitive that is used to select the rendering
layer is implementation-dependent and thus portable applications will
assign the same layer for all vertices in a primitive. The vertex
convention followed for "gl_Layer" may be determined by calling
GetIntegerv with the symbolic constant LAYER_PROVOKING_VERTEX_EXT. If
the value returned is FIRST_VERTEX_CONVENTION_EXT, selection is always
taken from the first vertex of a primitive. If the value returned is
LAST_VERTEX_CONVENTION_EXT, the selection is always taken from the last
vertex of a primitive. If the value returned is UNDEFINED_VERTEX_EXT,
the selection is not guaranteed to be taken from any specific vertex in
the primitive. The vertex considered the provoking vertex for particular
primitive types is given in table 12.2.
Section 11.1gs.4.6 Primitive Type Mismatches and Drawing Commands
An INVALID_OPERATION error is generated by any command that transfers
vertices to the GL, and no fragments will be rendered, if a mismatch
exists between the type of primitive being drawn and the input primitive
type of a geometry shader. A mismatch exists under any of the following
conditions:
* the input primitive type of the current geometry shader is
POINTS and <mode> is not POINTS,
* the input primitive type of the current geometry shader is
LINES and <mode> is not LINES, LINE_STRIP, or LINE_LOOP,
* the input primitive type of the current geometry shader is
TRIANGLES and <mode> is not TRIANGLES, TRIANGLE_STRIP or
TRIANGLE_FAN,
* the input primitive type of the current geometry shader is
LINES_ADJACENCY_EXT and <mode> is not LINES_ADJACENCY_EXT or
LINE_STRIP_ADJACENCY_EXT, or
* the input primitive type of the current geometry shader is
TRIANGLES_ADJACENCY_EXT and <mode> is not
TRIANGLES_ADJACENCY_EXT or TRIANGLE_STRIP_ADJACENCY_EXT.
Modify section 12.1, "Transform Feedback"
Replace the second paragraph of the section on p. 274:
The data captured in transform feedback mode depends on the active
programs on each of the shader stages. If a program is active for the
geometry shader stage, transform feedback captures the vertices of each
primitive emitted by the geometry shader. Otherwise, transform feedback
captures each primitive processed by the vertex shader.
Modify the second paragraph following ResumeTransformFeedback on p. 277
When transform feedback is active and not paused, all geometric
primitives generated must be compatible with the value of
<primitiveMode> passed to BeginTransformFeedback. If a geometry shader
is active, the type of primitive emitted by that shader is used instead
of the <mode> parameter passed to drawing commands for the purposes of
this error check. Any primitive type may be used while transform
feedback is paused.
Add table 12.1gs:
Transform Feedback Allowed render primitive
<primitiveMode> <modes>
-------------------+----------------------------------------
POINTS | POINTS
LINES | LINES, LINE_LOOP, LINE_STRIP
TRIANGLES | TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN
------------------------------------------------------------
Table 12.1gs: Legal combinations of the transform feedback
primitive mode, as passed to BeginTransformFeedback, and the
current primitive mode.
In the Errors section, replace "An INVALID_OPERATION error is generate
by DrawArrays and DrawArraysInstanced if <mode> is not identical to
<primitiveMode>" with:
An INVALID_OPERATION error is generated by any command that transfers
vertices to the GL if <mode> is not one of the allowed modes in table
12.1gs.
and delete the error condition which states:
An INVALID_OPERATION error is generated by any drawing commands other
than DrawArrays and DrawArraysInstanced while transform feedback is
active and not paused, regardless of mode.
Modify the last sentence of the second paragraph on p. 278:
When writing output variables that are arrays ... The value for any
output variable specified to be streamed to a buffer object but not
actually written by a vertex or geometry shader is undefined. The
results of appending an output variable to a transform feedback buffer
are undefined if any component of that variable would be written at an
offset not aligned to the size of the component.
Modify the sixth paragraph on p. 278:
In INTERLEAVED_ATTRIBS mode, the values of one or more output variables
written by a vertex or geometry shader are written, interleaved, ...
Modify the eighth paragraph on p. 278, describing errors on buffer
overflow:
The error INVALID_OPERATION ... as set by BindBufferRange. No vertices
of that primitive are recorded in any buffer object, and the counter
corresponding to the asynchronous query target
TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN (see section 12.2) is not
incremented.
Modify the second paragraph on p. 280:
When BeginTransformFeedback is called with an active program object
containing a vertex or geometry shader, the set of output variables
captured ...
Replace section 12.2, "Primitive Queries" on p. 281:
Primitive queries use query objects to track the number of primitives
that are generated by the GL and the number of primitives that are
written to buffer objects in transform feedback mode.
When BeginQuery is called with a target of PRIMITIVES_GENERATED_EXT, the
primitives generated count maintained by the GL is set to zero. When a
generated primitive query is active, the primitives-generated count is
incremented every time an emitted primitive reaches the transform
feedback stage (see section 12.1), whether or not transform feedback is
active. This counter counts the number of primitives emitted by a
geometry shader, if active, possibly further tessellated into separate
primitives during the transform feedback stage, if active.
When BeginQuery is called with a target of
TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, the transform feedback primitives
written count maintained by the GL is set to zero. When the transform
feedback primitive written query is active, the transform feedback
primitives written count is incremented every time the vertices of a
primitive are recorded into a buffer object. If transform feedback is
not active or if a primitive to be recorded does not fit in a buffer
object, this counter is not incremented.
These two types of queries can be used together to determine if all
primitives have been written to the bound feedback buffer; if both
queries are run simultaneously and the query results are equal, all
primitives have been written to the buffer. If the number of primitives
written is less than the number of primitives generated, the buffer
overflowed.
Modify section 12.5 "Coordinate Transformations" on p. 283:
<Clip coordinates> for a vertex result from shader execution, which
yields ...
Modify section 13.3, "Points"
Replace the second paragraph starting "The point size..." on p. 290:
The point size is determined by the last active stage before the
rasterizer:
* the geometry shader, if active; or
* the vertex shader, otherwise.
If the last active stage is not a vertex shader and does not statically
assign a value to gl_PointSize, the point size is 1.0. Otherwise, the
point size is taken from the shader built-in gl_PointSize written by
that stage.
[[ Note that it is impossible to assign a value to gl_PointSize if
EXT_geometry_point_size is not supported and enabled in the
geometry shader stage. ]]
If the last active stage is a vertex shader, the point size is taken
from the shader built-in gl_PointSize written by the vertex shader.
In all cases, the point size is clamped to the implementation-dependent
point size range. If the value written to gl_PointSize is less than or
equal to zero, or if no value is written to gl_PointSize (except as
noted above) the point size is undefined. The supported range ...
Modify section 14.2.2, "Shader Inputs"
Add a new paragraph following the paragraph starting "The built-in
variable gl_FrontFacing" on p. 305:
If a geometry shader is active, the built-in variable gl_PrimitiveID
contains the ID value emitted by the geometry shader for the provoking
vertex. If no geometry shader is active, gl_PrimitiveID contains the
number of primitives processed by the rasterizer since the last drawing
command was called. The first primitive generated by a drawing command
is numbered zero, and the primitive ID counter is incremented after
every individual point, line, or polygon primitive is processed.
The counter is reset to zero between each instance drawn.
Restarting a primitive using the primitive restart index (see section
10.3.4) has no effect on the primitive ID counter.
gl_PrimitiveID is only defined under the same conditions that
gl_VertexID is defined, as described under "Shader Inputs" in section
11.1.3.9.
Similarly to the limit on geometry shader output components (see section
11.1gs.4), there is a limit on the number of components of built-in and
user-defined input variables that can be read by the fragment shader,
given by the value of the implementation-dependent constant
MAX_FRAGMENT_INPUT_COMPONENTS.
When a program is linked ...
Modify section 16.2.1, "Blitting Pixel Rectangles" to add following the
paragraph starting "When values are written to the draw buffers" on p.
337:
If the read framebuffer is layered (see section 9.7gs), pixel values are
read from layer zero. If the draw framebuffer is layered, pixel values
are written to layer zero. If both read and draw framebuffers are
layered, the blit operation is still performed only on layer zero.
Modify the first sentence of chapter 17, "Compute Shaders" on p. 340:
In addition to graphics-oriented shading operations such as vertex,
geometry, and fragment shading, generic computation ...
Dependencies on OES_sample_variables
If OES_sample_variables is not supported, references to
the extension edits should be ignored.
Dependencies on OES_texture_storage_multisample_2d_array
If OES_texture_storage_multisample_2d_array is not supported, references
to two-dimensional multisample array textures should be ignored.
Dependencies on OES_shader_multisample_interpolation
If OES_shader_multisample_interpolation is not supported, references
to "sample in", "sample out" and the extension should be ignored.
Dependencies on EXT_texture_buffer
If EXT_texture_buffer is not supported, references to
buffer textures should be removed.
New State
Add to table 20.14, "Framebuffer (state per framebuffer object)":
Initial
Get Value Type Get Command Value Description Sec.
------------------------------ ---- ------------------------- ------- ------------------------ -----
FRAMEBUFFER_DEFAULT_LAYERS_EXT Z+ GetFramebufferParameteriv 0 default layer count of 9.2.1
framebuffer w/o
attachments
Add to table 20.15, "Framebuffer (state per attachment point)":
Initial
Get Value Type Get Command Value Description Sec.
---------------------------------------- ---- ----------------------------------- ------- ---------------------- -------
FRAMEBUFFER_ATTACHMENT_LAYERED_EXT B GetFramebufferAttachmentParameteriv FALSE Framebuffer attachment 9.2.8.1
is layered
Modify description of SHADER_TYPE in table 20.18, "Shader Object State":
Initial
Get Value Type Get Command Value Description Sec.
----------- ---- ----------- ------- ----------------------------- ----
SHADER_TYPE E GetShaderiv - Type of shader (shader stage) 7.1
Add to table 20.19, "Program Pipeline Object State":
Initial
Get Value Type Get Command Value Description Sec.
------------------ ---- -------------------- ------- ------------------------ ----
GEOMETRY_SHADER_EXT Z+ GetProgramPipelineiv 0 Name of current geometry 7.4
shader program object
Add to table 20.22, "Program Object State (cont.)":
Initial
Get Value Type Get Command Value Description Sec.
------------------------- ---- ------------ -------------- ------------------------ --------
GEOMETRY_LINKED_VERTICES_OUT_EXT Z+ GetProgramiv 0 Max.# of output vertices 11.1gs.4
GEOMETRY_LINKED_INPUT_TYPE_EXT E GetProgramiv TRIANGLES Primitive input type 11.1gs.1
GEOMETRY_LINKED_OUTPUT_TYPE_EXT E GetProgramiv TRIANGLE_STRIP Primitive output type 11.1gs.2
GEOMETRY_SHADER_INVOCATIONS_EXT Z+ GetProgramiv 1 # of times a geom. shader 7.12
should be executed for
each input primitive
Add to table 20.28, "Program Object Resource State (cont.)":
Initial
Get Value Type Get Command Value Description Sec.
--------------------------------- ---- -------------------- ------- ----------------------- -----
REFERENCED_BY_GEOMETRY_SHADER_EXT Z+ GetProgramResourceiv - active resource used by 7.3.1
geometry shader
Rename table 20.29, "Vertex Shader State (not part of program objects)"
to "Vertex and Geometry Shader State (not part of program objects)".
New Implementation Dependent State
Add to table 20.40, "Implementation-Dependent Values (cont.)":
Get Value Type Get Command Minimum Value Description Sec.
-------------------------- ---- ----------- ------------- -------------------------- --------
MAX_FRAMEBUFFER_LAYERS_EXT Z+ GetIntegerv 256 maximum layer count for 9.2.1
layered framebuffer object
LAYER_PROVOKING_VERTEX_EXT E GetIntegerv -- (*) vertex convention followed 11.1gs.4
by the gl_Layer GLSL
variable
Add new footnote:
(*) Note: Valid values are FIRST_VERTEX_CONVENTION_EXT,
LAST_VERTEX_CONVENTION_EXT, and UNDEFINED_VERTEX_EXT.
Add new table 20.43gs "Implementation Dependent Geometry Shader Limits"
following table 20.43 "Implementation Dependent Vertex Shader Limits":
Min.
Get Value Type Get Command Value Description Sec.
---------------------------------------- ---- ----------- ----- ----------------------- --------
MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT Z+ GetIntegerv 1024 Number of comp. for 11.1gs.3
geom. shader uniform
variables
MAX_GEOMETRY_UNIFORM_BLOCKS_EXT Z+ GetIntegerv 12 Max number of geom. 7.6.2
uniform buffers per
program
MAX_GEOMETRY_INPUT_COMPONENTS_EXT Z+ GetIntegerv 64 Max number of comp. 11.1gs.4
of inputs read by a
geom. shader
MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT Z+ GetIntegerv 64 Max number of comp. 11.1gs.4
of outputs written
by a geom. shader
MAX_GEOMETRY_OUTPUT_VERTICES_EXT Z+ GetIntegerv 256 Max number of vertices 11.1gs.4
that any geom. shader
can emit
MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT Z+ GetIntegerv 1024 Max number of total 11.1gs.4
comp. (all vertices) of
active outputs that a
geom. shader can emit
MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT Z+ GetIntegerv 16 Number of texture 11.1.3.5
image units accessible
by a geom. shader
MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT Z+ GetIntegerv 0 Number of atom. counter 7.7
buffers accessed
by a geom. shader
MAX_GEOMETRY_ATOMIC_COUNTERS_EXT Z+ GetIntegerv 0 Number of atomic 11.1.3.6
counters accessed by a
geom. shader
MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT Z+ GetIntegerv 0 Num. of shader storage 7.8
blocks accessed by a
geom. shader
MAX_GEOMETRY_SHADER_INVOCATIONS_EXT Z+ GetIntegerv 32 Max supported geom. 11.1gs.4
shader invocation count
Add to table 20.46 "Implementation Dependent Aggregate Shader Limits"
([fn] is a dagger mark referring to existing text in the table caption):
Minimum
Get Value Type Get Command Value Description Sec.
-------------------------------------------- ---- ----------- -------- ------------------------- --------
MAX_GEOMETRY_IMAGE_UNIFORMS_EXT Z+ GetIntegerv 0 Number of image variables 11.1.3.7
in geometry shaders
MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT Z+ GetIntegerv [fn] No. of words for geom. 7.6.2
shader uniform vars. in
all uniform blocks
(including default)
Modify existing entries in table 20.46:
Minimum
Get Value Type Get Command Value Description Sec.
-------------------------------------------- ---- ----------- -------- ------------------------- --------
MAX_UNIFORM_BUFFER_BINDINGS Z+ GetIntegerv 48 Max no. of uniform buf. 7.6.2
binding points
MAX_COMBINED_UNIFORM_BLOCKS Z+ GetIntegerv 36 Max. no. of uniform 7.6.2
buffers per program
MAX_COMBINED_TEXTURE_IMAGE_UNITS Z+ GetIntegerv 64 Total no. of tex. units 11.1.3.5
accessible by the GL
Additions to the OpenGL ES Shading Language 3.10 Specification
Including the following line in a shader can be used to control the
language features described in this extension:
#extension GL_EXT_geometry_shader : <behavior>
#extension GL_EXT_geometry_point_size : <behaviour>
where <behavior> is as specified in section 3.4.
A new preprocessor #define is added to the OpenGL ES Shading Language:
#define GL_EXT_geometry_shader 1
#define GL_EXT_geometry_point_size 1
If the EXT_geometry_shader extension is enabled, the
EXT_shader_io_blocks extension is also implicitly enabled.
Change the introduction to Chapter 2 "Overview of OpenGL ES Shading" as
follows:
The OpenGL ES Shading Language is actually several closely related
languages. These languages are used to create shaders for each of the
programmable processors contained in the OpenGL ES processing pipeline.
Currently, these processors are the compute, vertex, geometry, and
fragment processors.
Unless otherwise noted in this Specification, a language feature applies
to all languages, and common usage will refer to these languages as a
single language. The specific languages will be referred to by the name
of the processor they target: compute, vertex, geometry, or fragment.
Add new subsection 2.gs preceding subsection 2.2 "Fragment Processor":
Section 2.gs, Geometry Processor
The <geometry processor> is a programmable unit that operates on data
for incoming vertices for a primitive assembled after vertex processing
and outputs a sequence of vertices forming output primitives.
Compilation units written in the OpenGL ES Shading Language to run on
this processor are called <geometry shaders>. When a geometry shader is
compiled and linked, it results in a <geometry shader executable> that
runs on the geometry processor.
A single invocation of the geometry shader executable on the geometry
processor will operate on a declared input primitive with a fixed number
of vertices. This single invocation can emit a variable number of
vertices that are assembled into primitives of a declared output
primitive type and passed to subsequent pipeline stages.
Modify section 4.3.4 "Input Variables", adding following the paragraph
starting "It is expected that ... columns in the matrix" on p. 40:
Geometry shader input variables get the per-vertex values written out by
output variables of the same names in the previous active (vertex)
shader stage. For these inputs, "centroid in", "sample in", and
interpolation qualifiers are allowed, but are equivalent to "in". Since
geometry shaders operate on a set of vertices, each input variable or
input block (see section 4.3.9 "Interface Blocks") needs to be declared
as an array. For example,
in float foo[]; // geometry shader input for vertex "out float foo"
Each element of such an array corresponds to one vertex of the primitive
being processed. Each array can optionally have a size declared. The
array size will be set by (or if provided must be consistent with) the
input layout declaration(s) establishing the type of input primitive, as
described later in section 4.4.1 "Input Layout Qualifiers".
Some inputs and outputs are <arrayed>, meaning that for an interface
between two shader stages either the input or output declaration
requires an extra level of array indexing for the declarations to match.
For example, with the interface between a vertex shader and a geometry
shader, vertex shader output variables and geometry shader input
variables of the same name must match in type and qualification (other
than precision and "out" matching to "in"), except that the geometry
shader will have one more array dimension than the vertex shader, to
allow for vertex indexing. If such an arrayed interface variable is not
declared with the necessary additional input or output array dimension,
a link-time error will result.
For non-arrayed interfaces (meaning array dimensionally stays the same
between stages), it is a link-time error if the input variable is not
declared with the same type, including array dimensionality, and
qualification (other than precision and "out" matching to "in") as the
matching output variable.
Fragment shader inputs get per-fragment values...
Modify section 4.3.6 "Output Variables" starting with the third
paragraph of the section, as modified by
OES_shader_multisample_interpolation, on p. 42:
Vertex and geometry output variables output per-vertex data and are
declared using the "out", "centroid out", or "sample out" storage
qualifiers. ...
Individual vertex and geometry outputs are declared as in the following
examples: ...
...
flat out vec3 myColor;
sample out vec4 perSampleColor;
These can also appear in interface blocks, as described in section 4.3.9
"Interface Blocks". Interface blocks allow simpler addition of arrays to
the interface from vertex to geometry shader. They also allow a fragment
shader to have the same input interface as a geometry shader for a given
vertex shader.
Fragment outputs output per-fragment data ...
Modify section 4.3.9 "Interface Blocks" as modified by
EXT_shader_io_blocks, to add following the paragraph starting "When
using OpenGL ES API entry points to identify the name":
Geometry shader input blocks must be declared as arrays and follow the
array declaration and linking rules for all geometry shader inputs. All
other input and output block arrays must specify an array size.
Modify section 4.4.1 "Input Layout Qualifiers" as modified
by EXT_shader_io_blocks:
Insert a new section 4.4.1.gs, before section 4.4.1.fs:
Section 4.4.1.gs, Geometry Shader Inputs
Additional layout qualifier identifiers for geometry shader inputs
include primitive identifiers and an invocation count identifier:
<layout-qualifier-id>
points
lines
lines_adjacency
triangles
triangles_adjacency
invocations = integer-constant
The identifiers points, lines, lines_adjacency, triangles, and
triangles_adjacency are used to specify the type of input primitive
accepted by the geometry shader, and only one of these is accepted. The
geometry shader object in a program must declare this input primitive
layout, and all geometry shader input layout declarations in a program
must declare the same layout.
The identifier invocations is used to specify the number of times the
geometry shader executable is invoked for each input primitive received.
Invocation count declarations are optional. If no invocation count is
declared in any geometry shader in a program, the geometry shader will
be run once for each input primitive. If an invocation count is
declared, all such declarations must specify the same count. If a shader
specifies an invocation count greater than the implementation-dependent
maximum, it will fail to compile.
For example,
layout(triangles, invocations = 6) in;
will establish that all inputs to the geometry shader are triangles and
that the geometry shader executable is run six times for each triangle
processed.
All geometry shader input unsized array declarations will be sized by an
earlier input primitive layout qualifier, when present, as per the
following table.
Layout Size of Input Arrays
------------------- --------------------
points 1
lines 2
lines_adjacency 4
triangles 3
triangles_adjacency 6
The intrinsically declared input array gl_in[] will also be sized by any
input primitive-layout declaration. Hence, the expression
gl_in.length()
will return the value from the table above.
For inputs declared without an array size, including intrinsically
declared inputs (i.e., gl_in), a layout must be declared before any use
of the method length or other any array use that requires the array size
to be known.
It is a compile-time error if a layout declaration's array size (from
table above) does not match all the explicit array sizes specified in
declarations of an input variables in the same shader. The following
includes examples of compile-time errors:
// code sequence within one shader...
in vec4 Color1[]; // legal, size still unknown
in vec4 Color2[2]; // legal, size is 2
in vec4 Color3[3]; // illegal, input sizes are inconsistent
layout(lines) in; // legal for Color2, input size is 2, matching Color2
in vec4 Color4[3]; // illegal, contradicts layout of lines
layout(lines) in; // legal, matches other layout() declaration
layout(triangles) in; // illegal, does not match earlier layout() declaration
It is a link-time error if not all provided sizes (sized input arrays
and layout size) match in the geometry shader of a program.
Add new section 4.4.2.gs before section 4.4.2.fs, as added by
EXT_shader_io_blocks:
Section 4.4.2.gs Geometry Outputs
Geometry shaders can have two additional types of output layout
identifiers: an output primitive type and a maximum output vertex count.
The primitive type and vertex count identifiers are allowed only on the
interface qualifier out, not on an output block, block member, or
variable declaration.
The layout qualifier identifiers for geometry shader outputs are
layout-qualifier-id
points
line_strip
triangle_strip
max_vertices = integer-constant
The primitive type identifiers points, line_strip, and triangle_strip
are used to specify the type of output primitive produced by the
geometry shader, and only one of these is accepted. The geometry shader
object in a program must declare an output primitive type, and all
geometry shader output primitive type declarations in a program must
declare the same primitive type.
The vertex count identifier max_vertices is used to specify the maximum
number of vertices the shader will ever emit in a single invocation. The
geometry shader object in a program must declare a maximum output vertex
count, and all geometry shader output vertex count declarations in a
program must declare the same count.
In this example,
layout(triangle_strip, max_vertices = 60) out; // order does not matter
layout(max_vertices = 60) out; // redeclaration okay
layout(triangle_strip) out; // redeclaration okay
layout(points) out; // error, contradicts triangle_strip
layout(max_vertices = 30) out; // error, contradicts 60
all outputs from the geometry shader are triangles and at most 60
vertices will be emitted by the shader. It is an error for the maximum
number of vertices to be greater than gl_MaxGeometryOutputVertices.
All geometry shader output layout declarations in a program must declare
the same layout and same value for max_vertices. If geometry shaders are
in a program, there must be at least one geometry output layout
declaration somewhere in that program.
Modify section 4.7.4, "Default Precision Qualifiers":
Modify the third paragraph on p. 64:
"All languages except for the fragment language have the following
predeclared globally scoped default precision statements: ..."
Add new section 7.1.1gs following section 7.1.1 "Vertex Shader Special
Variables":
Section 7.1.1gs, Geometry Shader Special Variables
In the geometry language, the built-in variables are intrinsically
declared as:
[[ If EXT_geometry_point_size is supported and enabled: ]]
in gl_PerVertex {
highp vec4 gl_Position;
highp float gl_PointSize;
} gl_in[];
[[ Otherwise: ]]
in gl_PerVertex {
highp vec4 gl_Position;
} gl_in[];
in highp int gl_PrimitiveIDIn;
in highp int gl_InvocationID;
[[ If EXT_geometry_point_size is supported and enabled: ]]
out gl_PerVertex {
highp vec4 gl_Position;
highp float gl_PointSize;
};
[[ Otherwise: ]]
out gl_PerVertex {
highp vec4 gl_Position;
};
out highp int gl_PrimitiveID;
out highp int gl_Layer;
Section 7.1.1gs.1, Geometry Shader Input Variables
gl_Position contains the output written in the previous shader stage to
gl_Position.
[[ If EXT_geometry_point_size is supported: ]]
gl_PointSize contains the output written in the previous shader stage to
gl_PointSize.
gl_PrimitiveIDIn contains the number of primitives processed by the
shader since the current set of rendering primitives was started.
gl_InvocationID contains the invocation number assigned to the geometry
shader invocation. It is assigned integer values in the range [0, N-1],
where N is the number of geometry shader invocations per primitive.
Section 7.1.1gs.2, Geometry Shader Output Variables
gl_Position is used in the same fashion as the corresponding output
variable in the vertex shader. Its value is undefined after geometry
processing if the shader calls EmitVertex() without having written
gl_Position since the last EmitVertex(), or does not write it at all.
[[ If EXT_geometry_point_size is supported: ]]
gl_PointSize is used in the same fashion as the corresponding output
variable in the vertex shader.
gl_PrimitiveID is filled with a single integer that serves as a
primitive identifier to the fragment shader. This is then available to
fragment shaders, which will select the written primitive ID from the
provoking vertex of the primitive being shaded. If a fragment shader
using gl_PrimitiveID is active and a geometry shader is also active, the
geometry shader must write to gl_PrimitiveID or the fragment shader
input gl_PrimitiveID is undefined. See section 11.1gs.4 "Geometry Shader
Outputs" of the OpenGL ES Specification for more information.
gl_Layer is used to select a specific layer (or face and layer of a cube
map) of a multi-layer framebuffer attachment. The actual layer used will
come from one of the vertices in the primitive being shaded. Which
vertex the layer comes from is determined as discussed in section
11.1gs.4 of the OpenGL ES Specification but may be undefined, so it is
best to write the same layer value for all vertices of a primitive. If a
shader statically assigns a value to gl_Layer, layered rendering mode is
enabled. See section 11.1gs.4 "Geometry Shader Outputs"and section 9.7gs
"Layered Framebuffers" of the OpenGL ES Specification for more
information. If a shader statically assigns a value to gl_Layer, and
there is an execution path through the shader that does not set
gl_Layer, then the value of gl_Layer is undefined for executions of the
shader that take that path.
Modify section 7.1.2 "Fragment Shader Special Variables", as modified by
OES_sample_variables:
Add to the list of built-in variables:
in highp int gl_PrimitiveID;
in highp int gl_Layer;
Add descriptions of these variables:
The input variable gl_PrimitiveID is filled with the value written to
the gl_PrimitiveID geometry shader output, if a geometry shader is
present. Otherwise, it is filled with the number of primitives processed
by the shader since the current set of rendering primitives was started.
The input variable gl_Layer is filled with the value written to the
gl_Layer geometry shader output, if a geometry shader is present. If the
geometry stage does not dynamically assign a value to gl_Layer, the
value of gl_Layer in the fragment stage will be undefined. If the
geometry stage makes no static assignment to gl_Layer, the input value
in the fragment stage will be zero. Otherwise, the fragment stage will
read the same value written by the geometry stage, even if that value is
out of range. If a fragment shader contains a static access to gl_Layer,
it will count against the implementation defined limit for the maximum
number of inputs to the fragment stage.
Modify the description of gl_FrontFacing:
The input variable gl_FrontFacing is true if the fragment belongs to a
front-facing primitive. One use of this is to emulate two-sided lighting
by selecting one of two colors calculated by a vertex or geometry
shader.
Add to Section 7.2 "Built-In Constants", matching the
corresponding API implementation-dependent limits:
const mediump int gl_MaxGeometryInputComponents = 64;
const mediump int gl_MaxGeometryOutputComponents = 128;
const mediump int gl_MaxGeometryImageUniforms = 0;
const mediump int gl_MaxGeometryTextureImageUnits = 16;
const mediump int gl_MaxGeometryOutputVertices = 256;
const mediump int gl_MaxGeometryTotalOutputComponents = 1024;
const mediump int gl_MaxGeometryUniformComponents = 1024;
const mediump int gl_MaxGeometryAtomicCounters = 0;
const mediump int gl_MaxGeometryAtomicCounterBuffers = 0;
Modify gl_MaxCombinedTextureImageUnits to match the API:
const mediump int gl_MaxCombinedTextureImageUnits = 64;
Add new section 8.12gs preceding section 8.13 "Fragment Processing
Functions":
Section 8.12gs, Geometry Shader Functions
These functions are only available in geometry shaders. They are
described in more depth following the table.
Syntax Description
------------------- -----------------------------------------------
void EmitVertex() Emits the current values of output variables to
the current output primitive. On return from
this call, the values of output variables are
undefined.
void EndPrimitive() Completes the current output primitive and
starts a new one. No vertex is emitted.
The function EmitVertex() specifies that a vertex is completed. A vertex
is added to the current output primitive using the current values of all
built-in and user-defined output variables. The values of all output
variables are undefined after a call to EmitVertex(). If a geometry
shader invocation has emitted more vertices than permitted by the output
layout qualifier max_vertices, the results of calling EmitVertex() are
undefined.
The function EndPrimitive() specifies that the current output primitive
is completed and a new output primitive (of the same type) will be
started by any subsequent EmitVertex(). This function does not emit a
vertex. If the output layout is declared to be "points", calling
EndPrimitive() is optional.
A geometry shader starts with an output primitive containing no
vertices. When a geometry shader terminates, the current output
primitive is automatically completed. It is not necessary to call
EndPrimitive() if the geometry shader writes only a single primitive.
Modify section 8.16, "Shader Memory Control Functions" to change the
paragraph starting "When these functions return..." on p. 139:
When these functions return ... the execution of the original shader
invocation (e.g., fragment shader invocations for a primitive resulting
from a particular vertex or geometry shader invocation).
Issues
Note: These issues apply specifically to the definition of the
EXT_geometry_shader specification, which is based on the OpenGL
extension ARB_geometry_shader4 as updated in OpenGL 4.x. Resolved issues
from ARB_geometry_shader4 have been removed, but remain largely
applicable to this extension. ARB_geometry_shader4 can be found in the
OpenGL Registry.
(1) What functionality was removed from ARB_geometry_shader4 / GL 4.4?
- Interactions with features not supported by the underlying
ES 3.1 API and Shading Language, including:
* one-dimensional, rectangular, and cube map array textures (cube
map array textures are restored in EXT_texture_cube_map_array).
* vertex program point size mode
* viewport arrays and other support for multiple viewports
* multiple vertex streams (these require ARB_transform_feedback3)
* gl_ClipDistance shader inputs and outputs.
* CopyPixels and Bitmap
* fixed-functionality vertex and fragment shader stages
* "component" layout
* Implicit references to glPolygonMode
* References allowing or assuming more than one shader object per
pipeline stage.
- FramebufferTexture3D (use FramebufferTextureLayer instead).
- gl_MaxGeometryVaryingComponents
- gl_VerticesIn
- FramebufferTextureFaceARB (also removed from GL core)
- The FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT completeness condition,
also removed from desktop GL.
- Description of limitations of GeForce series 8 chips.
- GLSL two-dimensional arrays (already supported by GLSL-ES 3.10 in a
more general fashion). Note that while multi-dimensional arrays are
supported, they are explicitly not supported as shader inputs and
outputs, and that decision is respected here.
- multiple compilation units of the same shader type.
(2) What functionality was changed and added relative to
ARB_geometry_shader4 and GL 4.4?
- EXT_geometry_shader closely matches OpenGL 4.4 geometry shader
language, rather than ARB_geometry_shader language.
- In particular, input and output interface blocks were added from GL
4.4 / GLSL 4.40, via the required EXT_shader_io_blocks extension.
- Interactions were added with OpenGL ES 3.1 functionality including
separate shader objects, shader atomic counters, shader storage
buffer objects, and shader image load/store.
- Geometry instancing was added from ARB_gpu_shader5.
- FRAMEBUFFER_DEFAULT_LAYERS_EXT and MAX_FRAMEBUFFER_LAYERS_EXT state
and related spec language from ARB_framebuffer_no_attachments (it
was removed from OpenGL ES 3.1).
- PRIMITIVES_GENERATED_EXT query from OpenGL 3.0, to count primitives
due to geometry amplification by geometry shaders.
- LAYER_PROVOKING_VERTEX_EXT query from ARB_provoking_vertex /
ARB_viewport_array (but did not add ProvokingVertex control, just
this query).
- Specify undefined behavior when appending outputs to XFB buffers if
any component would be written at a misaligned offset, from
ARB_enhanced_layouts. Bug 11191 is tracking this into ES 3.1, as
it's not specific to geometry shaders.
- Writing point size from geometry shaders is optional functionality.
If it's not supported or written, the point size of 1.0 is used.
- Added precision qualifiers to builtins.
- Clarification from Bug 11508.
- Added program interface query properties relevant to geometry
shaders.
(3) Should GetActiveUniformBlockiv support queries for uniform blocks
and atomic counter buffers referenced by geometry shaders?
RESOLVED: No. Use the new generic program interface query supported by
OpenGL ES 3.1, following the behavior of features added to 3.1 such as
compute shaders, which also dropped these legacy tokens / queries.
(4) How are aggregate shader limits computed?
RESOLVED: Following the GL 4.4 model, but we restrict uniform
buffer bindings to 12/stage instead of 14, this results in
MAX_UNIFORM_BUFFER_BINDINGS = 48
This is 12 bindings/stage * 4 shader stages, allowing a static
partitioning of the bindings even though at most 5 stages can
appear in a program object).
MAX_COMBINED_UNIFORM_BLOCKS = 36
This is 12 blocks/stage * 3 stages, since compute shaders can't
be mixed with other stages.
MAX_COMBINED_TEXTURE_IMAGE_UNITS = 64
This is 16 textures/stage * 4 stages.
Khronos internal bugs 5870, 8891, and 9424 cover the ARB's thinking on
these limits for GL 4.0 and beyond.
(5) Are arrays supported as shader inputs and outputs?
RESOLVED: No. In several places in the tessellation and geometry API
language based on GL 4.4, it says that "the OpenGL ES Shading Language
doesn't support multi-dimensional arrays" and restricts declarations of
inputs and outputs which are array members to blocks themselves declared
as arrays.
Strictly speaking this is no longer true. GLSL-ES 3.10 supports
multi-dimensional arrays, but arrays of
arrays are not allowed as shader inputs or outputs.
Given this constraint, and since the same constraint is in OpenGL 4.4,
I've resolved this by continuing to limit array inputs and outputs
in this fashion, and change the language to "...doesn't support
multi-dimensional arrays as shader inputs or outputs".
(6) What component counting rules are used for inputs and outputs?
RESOLVED: In several places I've inserted language from OpenGL 4.4 to
the effect of
"Component counting rules for different variable types and variable
declarations are the same as for MAX_VERTEX_OUTPUT_COMPONENTS (see
section 11.1.2.1)."
I think this is essentially cleaning up an oversight in the earlier ARB
extension language but it is a bit orthogonal to the extension
functionality and I'm bringing it up in case this is a potential issue.
(7) What component counting rules are used for the default
uniform block?
RESOLVED: In several places I've inserted language from OpenGL 4.2 to
the effect of
"A uniform matrix in the default uniform block with single-precision
components will consume no more than 4 x min(r,c) uniform
components."
This is based on bug 5432 and is language that was later expanded in
OpenGL 4.4 and refactored into the generic "Uniform Variables" section,
which is something we should consider in the EXT extensions as well to
avoid duplication. I believe it is what we want but am noting it for the
same reason as the language in issue (7). I'm hoping to be able to
include this refactored language into the OpenGL ES 3.1 Specification,
so we can refer to it more easily here. Tracking bug 11192 has been
opened for this and this language was approved there.
(8) What should the minimum value of MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT
be?
RESOLVED: GL 4.4 has 512, but we use 1024 to match the ES vertex
shader limit.
(9) What should the minimum value of MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT
be?
RESOLVED: This was reduced to 64 in revision 20, from an initial value
of 128 (matching GL 4.4), to match the limits on vertex shader outputs
and fragment shader inputs (Bug 12823).
(10) What naming and token values should we use for
GEOMETRY_VERTICES_OUT_EXT, GEOMETRY_INPUT_TYPE_EXT, and
GEOMETRY_OUTPUT_TYPE_EXT?
DISCUSSION: In EXT_geometry_shader4 and ARB_geometry_shader4, the
vertice and input and output type are specified by a program parameter
state. OpenGL 3.2 requires this to be provided in the shader text and
provided a query for these values after linking. Since this was a
functionality change the similarly named enumerants were given different
values. Thus we have the following token names and enumerants in GL:
(from EXT_geometry_shader4)
GEOMETRY_VERTICES_OUT_EXT 0x8DDA
GEOMETRY_INPUT_TYPE_EXT 0x8DDB
GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC
(from ARB_geometry_shader4)
GEOMETRY_VERTICES_OUT_ARB 0x8DDA
GEOMETRY_INPUT_TYPE_ARB 0x8DDB
GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC
(from OpenGL 3.2)
GEOMETRY_VERTICES_OUT 0x8916
GEOMETRY_INPUT_TYPE 0x8917
GEOMETRY_OUTPUT_TYPE 0x8918
Now for this extensions we are providing the GL 3.2-type functionality
and thus we should use the token *values* from GL core. However,
it is expected that this extension will ship as an EXT, so we would
end up with:
GEOMETRY_VERTICES_OUT_EXT 0x8916
GEOMETRY_INPUT_TYPE_EXT 0x8917
GEOMETRY_OUTPUT_TYPE_EXT 0x8918
which gives us the same token names as the EXT_geometry_shader4 but
the same token values as OpenGL 3.2. This would potentially be
quite confusing if headers are mix and matched.
OPTIONS: If this extension ships as an EXT,
a) invent a new suffix. Ideally we'd have a different EXT-like suffix
to disambiguate between GL and ES multivendor extensions. However this
has not happened yet.
b) we use a _VENDOR suffix for these 3 enumerants to disambiguate them
c) change the tokens to GEOMETRY_LINKED_*_EXT, with the expectation that
we'd rename them back if this becomes core functionality.
RESOLVED. Pick c). We will include the "_LINKED" term in the tokens
to indicate that they represent the values generated at link time. At
such a time as this becomes core functionality in ES, they should
be renamed back to be the same as the GL tokens (possibly with an
alias for compatibility with this extension).
(11) How should we handle the enablement of input/output blocks in
non-geometry stages?
RESOLVED: Early drafts of this extension added a number
of capabilities that were not specific to geometry shaders, namely:
* allowed the declaration and use of input and output blocks
* moved the built-in "per-vertex" in/out variables into the
built-in gl_PerVertex block
* allowed the redeclaration of the gl_PerVertex block.
In OpenGL these capabilities are provided by the GLSL 1.50 version.
Furthermore, when separable programs are in use, OpenGL *requires*
that the gl_PerVertex block be declared in any shader which uses any of
its members (including vertex and fragment shaders).
Since this capability is being added as an extension to OpenGL ES 3.1
we don't have a core shading language version to hang this feature
off of and thus we need an extension to enable this.
Using the earlier drafts, we would have needed to use the
EXT_geometry_shader #extension in vertex or fragment shaders to enable
this functionality. Since this was rather unintuitive and this
functionality does have utility on it's own, we opted instead to pull
this out to a separate extension that is a required dependency
(EXT_shader_io_blocks).
The geometry (and tessellation) extensions will automatically imply
that the EXT_shader_io_blocks functionality is enabled, since it is
impossible to use them in a useful manner without accessing
gl_PerVertex input/output blocks.
(12) Due to HW limitations, some vendors may not be able
to support writing gl_PointSize from geometry shaders, how should we
accomodate this?
RESOLVED: There are two extensions described in this document. The
base extension does not support writing to gl_PointSize from geometry
shaders and the gl_PerVertex block does not include gl_PointSize.
Additionally there is a layered extension which provides the ability
to write to gl_PointSize from geometry shaders. When this extension
is enabled, the gl_PerVertex block does include gl_PointSize and it
can be written from geometry shaders as normal.
If the point-size extension is not supported, all points written
from a geometry shader will have size of one. If the point-size
extension is supported but not enabled, or if it's enabled but
gl_PointSize is not written, it as if a point size of one was written.
Otherwise, if you statically assign gl_PointSize in the last stage
before the rasterizer, the (potentially clamped) value written will
determine the size of the point for rasterization.
(13) Does this extension change how transform feedback operates
compared to unextended OpenGL ES 3.0 or 3.1?
RESOLVED: Yes. Because dynamic geometry amplification in a geometry
shader can make it difficult if not impossible to predict the amount
of geometry that may be generated in advance of executing the shader,
the draw-time error for transform feedback buffer overflow conditions
is removed and replaced with the GL behavior (primitives are not written
and the corresponding counter is not updated). Since we no longer
require being able to predict how much geometry will be generated, we
also lift the restriction that only DrawArray* commands are supported
and also support the DrawElements* commands for transform feedback.
We also allow Draw*Indirect to be used with transform feedback.
(14) Should GetShaderPrecisionFormat support the new GEOMETRY_SHADER_EXT
stage?
RESOLVED: No. Following the precedence of OpenGL ES 3.1 which did not
extend this query to COMPUTE_SHADERS due to the following reason:
GetShaderPrecisionFormat is listed in ES 3.0 appendix F.1 Legacy Features
whose use is not recommended. Adding new capabilities to a feature that
is effectively deprecated seems silly (Bug 11464).
Revision History
Rev. Date Author Changes
---- -------- --------- -------------------------------------------------
21 05/31/16 Jon Leech Note that primitive ID counters are reset to zero
after each instance drawn (Bug 14024).
20 07/23/15 Jon Leech Reduce minimum value of
MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT to 64 (Bug
12823).
19 10/08/14 dkoch change max_vertices identifier to integer-constant
to match rest of ES layout-qualifier-id's
(Bug 12878)
18 04/23/14 dkoch Add GetProgramPipelineiv to the list of functions
which accept GEOMETRY_SHADER token. Add issue 14.
(Bug 12152)
17 03/28/14 Jon Leech Sync with released ES 3.1 specs. Reflow text and
remove irrelevant footnote to table 20.40.
16 03/26/14 dkoch Update contributors, update issue 14 and
allow XFB with draw indirect.
15 03/10/14 Jon Leech Rebase on OpenGL ES 3.1 and change suffix to EXT.
Remove material now in the 3.1 spec and fix up
references between API and GLSL specs.
14 02/27/14 dkoch Fix typo in issue 14.
13 02/18/14 dkoch Resolve issues 5, 9, 10.
Resolve issue 11, by adding _LINKED to the
affected tokens.
Clarify XFB error relaxations and add issue 14
explaining the difference from ES 3.0.
12 02/12/14 dkoch Correct some entry points/token acceptance.
Explicitly delete error condition for non-arrayed
drawing commands with transform feedback.
11 01/16/14 dkoch Clarification from Bug 11508
Remove mention of multiple compilation units.
10 12/19/13 dkoch Move input and output interface block and
related functionality to separate extension.
Rewrote / renumbered the issues.
Added missing enum.
Add geometry point size extension.
Added precision qualifiers to builtins.
Remove duplicated edits to Shader Memory Access
9 12/02/13 dkoch Add Issues 11-14
8 11/21/13 dkoch Minor updates
- Remove DSA commands
- update MAX_FRAMEBUFFER_LAYERS_EXT to match MAX_ARRAY_TEXTURES (256)
7 11/20/13 Jon Leech Minor updates
- Sync with ES 3.1 spec language update.
- Refer to ES 3.1 instead of ES 3plus.
6 11/14/13 Jon Leech Minor updates
- Incorporate language tweak on output variables from bug 11100
5 11/08/13 Jon Leech Minor updates
- Incorporate language tweak from bug 11102.
4 11/08/13 Jon Leech Minor updates
- Remove FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT (token and
language is already in ES 3.0).
- Reorganize errors for commands completely described in this
specification into separate "Errors" subsections like GL 4.4.
- Add complete set of error conditions for FramebufferTextureEXT.
3 11/06/13 Jon Leech Updates based on Daniel Koch's feedback
- Remove references from desktop language allowing multiple shader
objects per stage.
- Clean up typos identified by Daniel.
- Disallow multi-dimensional arrays as shader inputs & outputs,
consistent with ES 3.1 multidimensional arrays and geometry_shader
issue 7.
- Drop implicit reference to nonexistent glPolygonMode in section
3.4.
- Drop FramebufferTexture3D in favor of FramebufferTextureLayer.
- Add trivial interactions with compute shaders.
- Drop gl_MaxGeometryVaryingComponents constant.
- Added FRAMEBUFFER_DEFAULT_LAYERS_EXT and
MAX_FRAMEBUFFER_LAYERS_EXT state, and related spec language from
ARB_framebuffer_no_attachments (it was removed from
ES 3.1).
- Added PRIMITIVES_GENERATED_EXT query from GL 3.0.
- Added LAYER_PROVOKING_VERTEX_EXT query from ARB_provoking_vertex /
ARB_viewport_array.
- Dropped reference to cube map array texture layer selection, this
will go in EXT_texture_cube_map_array.
2 11/03/13 Jon Leech
- Revisions based on NVIDIA feedback and first draft of
EXT_tessellation_shader.
- Rearrange descriptions of built-in variables in chapter 7 GLSL-ES
language.
- Fix minor inconsistencies and descriptions relative to GL 4.2/4.4
and EXT_tessellation_shader.
- Expand Issues list with open issues.
1 10/20/13 Jon Leech Initial version based on ARB_geometry_shader4.