blob: df8d13e470a896f9653de51c296e678d01b13e87 [file] [log] [blame]
Name
ARB_direct_state_access
Name Strings
GL_ARB_direct_state_access
Contact
Graham Sellers (graham.sellers 'at' amd.com)
Christophe Riccio (christophe.riccio 'at' unity3d.com)
Contributors
Graham Sellers, AMD
Piers Daniell, NVIDIA
Christophe Riccio, Unity
Daniel Rákos, AMD
Daniel Koch, NVIDIA
Pat Brown, NVIDIA
Jon Leech
Members of the OpenGL ARB working group
Contributors to GL_EXT_direct_state_access
Notice
Copyright (c) 2014 The Khronos Group Inc. Copyright terms at
http://www.khronos.org/registry/speccopyright.html
Status
Complete.
Approved by the ARB on June 26, 2014.
Ratified by the Khronos Board of Promoters on August 7, 2014.
Version
Last Modified Date: June 14, 2018
Author Revision: 50
Number
ARB Extension #164
Dependencies
OpenGL 2.0 is required.
This extension is written against the OpenGL 4.4 (core) specification.
Overview
In unextended OpenGL, most mutation of state contained in objects is through
an indirection known as a binding. Objects are attached to a context (either
directly or indirectly via a container) and then commands to modify or
query their state are issued on that context, indirecting through its
attachments and into the underlying object. This is known as `bind-to-edit'.
This extension derives from the GL_EXT_direct_state_access extension, which
added accessors for most state on most objects, allowing it to be queried
and modified without the object needing to be bound to a context. In cases
where a single property of an object is to be modified, directly accessing
its state can be more efficient than binding the object to the context and
then indirecting through it. Further, directly accessing the state of
objects through their names rather than by bind-to-edit does not disturb
the bindings of the current context, which is useful for tools, middleware
and other applications that are unaware of the outer state but it can also
avoid cases of redundant state changes.
There are several subtle differences between this extension and the older
GL_EXT_direct_state_access extension. First, this extension only expands
functionality that still exists in core profile OpenGL. Second, any function
that only partially avoids bind-to-edit (for example, explicitly specifying
a texture unit, bypassing the active texture selector but still indirecting
through a texture binding) has been omitted. Finally, the original extension
effectively allowed any function to create new objects whereas in unextended
OpenGL, only binding functions created objects (bind-to-create), even if
their names were obtained through one of the glGen* functions. This
extension does not allow on-the-spot creation of objects. Rather than rely
on bind-to-create (which would defeat the purpose of the extension), we add
glCreate* functions that produce new names that represent state vectors
initialized to their default values. Due to this last change, several
functions no longer require their <target> parameters, and so where
applicable, this parameter is absent from this extension.
New Procedures and Functions
/* Transform Feedback object functions */
void CreateTransformFeedbacks(sizei n, uint *ids);
void TransformFeedbackBufferBase(uint xfb, uint index,
uint buffer);
void TransformFeedbackBufferRange(uint xfb, uint index,
uint buffer, intptr offset, sizeiptr size);
void GetTransformFeedbackiv(uint xfb, enum pname, int *param);
void GetTransformFeedbacki_v(uint xfb, enum pname, uint index,
int *param);
void GetTransformFeedbacki64_v(uint xfb, enum pname, uint index,
int64 *param);
/* Buffer object functions */
void CreateBuffers(sizei n, uint *buffers);
void NamedBufferStorage(uint buffer,
sizeiptr size,
const void *data,
bitfield flags);
void NamedBufferData(uint buffer,
sizeiptr size,
const void *data,
enum usage);
void NamedBufferSubData(uint buffer,
intptr offset, sizeiptr size,
const void *data);
void CopyNamedBufferSubData(uint readBuffer, uint writeBuffer,
intptr readOffset, intptr writeOffset,
sizeiptr size);
void ClearNamedBufferData(uint buffer,
enum internalformat,
enum format,
enum type,
const void *data);
void ClearNamedBufferSubData(uint buffer,
enum internalformat,
intptr offset,
sizeiptr size,
enum format,
enum type,
const void *data);
void *MapNamedBuffer(uint buffer, enum access);
void *MapNamedBufferRange(uint buffer,
intptr offset, sizeiptr length,
bitfield access);
boolean UnmapNamedBuffer(uint buffer);
void FlushMappedNamedBufferRange(uint buffer, intptr offset,
sizeiptr length);
void GetNamedBufferParameteriv(uint buffer,
enum pname, int *params);
void GetNamedBufferParameteri64v(uint buffer,
enum pname, int64 *params);
void GetNamedBufferPointerv(uint buffer,
enum pname, void **params);
void GetNamedBufferSubData(uint buffer,
intptr offset, sizeiptr size, void *data);
/* Framebuffer object functions */
void CreateFramebuffers(sizei n, uint *framebuffers);
void NamedFramebufferRenderbuffer(uint framebuffer,
enum attachment,
enum renderbuffertarget,
uint renderbuffer);
void NamedFramebufferParameteri(uint framebuffer,
enum pname,
int param);
void NamedFramebufferTexture(uint framebuffer,
enum attachment,
uint texture, int level);
void NamedFramebufferTextureLayer(uint framebuffer,
enum attachment,
uint texture, int level, int layer);
void NamedFramebufferDrawBuffer(uint framebuffer, enum mode);
void NamedFramebufferDrawBuffers(uint framebuffer, sizei n,
const enum *bufs);
void NamedFramebufferReadBuffer(uint framebuffer, enum mode);
void InvalidateNamedFramebufferData(uint framebuffer,
sizei numAttachments,
const enum *attachments);
void InvalidateNamedFramebufferSubData(uint framebuffer,
sizei numAttachments,
const enum *attachments,
int x, int y,
sizei width, sizei height);
void ClearNamedFramebufferiv(uint framebuffer, enum buffer,
int drawbuffer, const int *value);
void ClearNamedFramebufferuiv(uint framebuffer, enum buffer,
int drawbuffer, const uint *value);
void ClearNamedFramebufferfv(uint framebuffer, enum buffer,
int drawbuffer, float *value);
void ClearNamedFramebufferfi(uint framebuffer, enum buffer,
int drawbuffer, float depth, int stencil);
void BlitNamedFramebuffer(uint readFramebuffer,
uint drawFramebuffer,
int srcX0,
int srcY0,
int srcX1,
int srcY1,
int dstX0,
int dstY0,
int dstX1,
int dstY1,
bitfield mask,
enum filter);
enum CheckNamedFramebufferStatus(uint framebuffer, enum target);
void GetNamedFramebufferParameteriv(uint framebuffer,
enum pname,
int *param);
void GetNamedFramebufferAttachmentParameteriv(uint framebuffer,
enum attachment,
enum pname,
int *params);
/* Renderbuffer object functions */
void CreateRenderbuffers(sizei n, uint *renderbuffers);
void NamedRenderbufferStorage(uint renderbuffer,
enum internalformat,
sizei width, sizei height);
void NamedRenderbufferStorageMultisample(uint renderbuffer,
sizei samples,
enum internalformat,
sizei width, sizei height);
void GetNamedRenderbufferParameteriv(uint renderbuffer,
enum pname, int *params);
/* Texture object functions */
void CreateTextures(enum target, sizei n, uint *textures);
void TextureBuffer(uint texture,
enum internalformat, uint buffer);
void TextureBufferRange(uint texture,
enum internalformat, uint buffer,
intptr offset, sizeiptr size);
void TextureStorage1D(uint texture, sizei levels,
enum internalformat,
sizei width);
void TextureStorage2D(uint texture, sizei levels,
enum internalformat,
sizei width, sizei height);
void TextureStorage3D(uint texture, sizei levels,
enum internalformat,
sizei width, sizei height, sizei depth);
void TextureStorage2DMultisample(uint texture, sizei samples,
enum internalformat, sizei width,
sizei height,
boolean fixedsamplelocations);
void TextureStorage3DMultisample(uint texture, sizei samples,
enum internalformat, sizei width,
sizei height, sizei depth,
boolean fixedsamplelocations);
void TextureSubImage1D(uint texture, int level,
int xoffset, sizei width,
enum format, enum type,
const void *pixels);
void TextureSubImage2D(uint texture, int level,
int xoffset, int yoffset,
sizei width, sizei height,
enum format, enum type,
const void *pixels);
void TextureSubImage3D(uint texture, int level,
int xoffset, int yoffset, int zoffset,
sizei width, sizei height, sizei depth,
enum format, enum type,
const void *pixels);
void CompressedTextureSubImage1D(uint texture, int level,
int xoffset,
sizei width,
enum format,
sizei imageSize, const void *data);
void CompressedTextureSubImage2D(uint texture, int level,
int xoffset, int yoffset,
sizei width, sizei height,
enum format,
sizei imageSize, const void *data);
void CompressedTextureSubImage3D(uint texture, int level,
int xoffset, int yoffset, int zoffset,
sizei width, sizei height, sizei depth,
enum format,
sizei imageSize, const void *data);
void CopyTextureSubImage1D(uint texture,
int level,
int xoffset,
int x, int y,
sizei width);
void CopyTextureSubImage2D(uint texture,
int level,
int xoffset, int yoffset,
int x, int y,
sizei width, sizei height);
void CopyTextureSubImage3D(uint texture,
int level,
int xoffset, int yoffset, int zoffset,
int x, int y,
sizei width, sizei height);
void TextureParameterf(uint texture,
enum pname, float param);
void TextureParameterfv(uint texture,
enum pname, const float *param);
void TextureParameteri(uint texture,
enum pname, int param);
void TextureParameterIiv(uint texture,
enum pname, const int *params);
void TextureParameterIuiv(uint texture,
enum pname, const uint *params);
void TextureParameteriv(uint texture,
enum pname, const int *param);
void GenerateTextureMipmap(uint texture);
void BindTextureUnit(uint unit, uint texture);
void GetTextureImage(uint texture, int level,
enum format, enum type,
sizei bufSize,
void *pixels);
void GetCompressedTextureImage(uint texture, int level,
sizei bufSize,
void *pixels);
void GetTextureLevelParameterfv(uint texture,
int level,
enum pname, float *params);
void GetTextureLevelParameteriv(uint texture,
int level,
enum pname, int *params);
void GetTextureParameterfv(uint texture,
enum pname, float *params);
void GetTextureParameterIiv(uint texture,
enum pname, int *params);
void GetTextureParameterIuiv(uint texture,
enum pname, uint *params);
void GetTextureParameteriv(uint texture,
enum pname, int *params);
/* Vertex Array object functions */
void CreateVertexArrays(sizei n, uint *arrays);
void DisableVertexArrayAttrib(uint vaobj, uint index);
void EnableVertexArrayAttrib(uint vaobj, uint index);
void VertexArrayElementBuffer(uint vaobj, uint buffer);
void VertexArrayVertexBuffer(uint vaobj, uint bindingindex, uint buffer,
intptr offset, sizei stride);
void VertexArrayVertexBuffers(uint vaobj, uint first, sizei count,
const uint *buffers,
const intptr *offsets,
const sizei *strides);
void VertexArrayAttribFormat(uint vaobj, uint attribindex, int size,
enum type, boolean normalized,
uint relativeoffset);
void VertexArrayAttribIFormat(uint vaobj, uint attribindex, int size,
enum type, uint relativeoffset);
void VertexArrayAttribLFormat(uint vaobj, uint attribindex, int size,
enum type, uint relativeoffset);
void VertexArrayAttribBinding(uint vaobj, uint attribindex,
uint bindingindex);
void VertexArrayBindingDivisor(uint vaobj, uint bindingindex,
uint divisor);
void GetVertexArrayiv(uint vaobj,
enum pname,
int *param);
void GetVertexArrayIndexediv(uint vaobj,
uint index,
enum pname,
int *param);
void GetVertexArrayIndexed64iv(uint vaobj,
uint index,
enum pname,
int64 *param);
/* Sampler object functions */
void CreateSamplers(sizei n, uint *samplers);
/* Program Pipeline object functions */
void CreateProgramPipelines(sizei n, uint *pipelines);
/* Query object functions */
void CreateQueries(enum target, sizei n, uint *ids);
void GetQueryBufferObjectiv(uint id, uint buffer, enum pname,
intptr offset);
void GetQueryBufferObjectuiv(uint id, uint buffer, enum pname,
intptr offset);
void GetQueryBufferObjecti64v(uint id, uint buffer, enum pname,
intptr offset);
void GetQueryBufferObjectui64v(uint id, uint buffer, enum pname,
intptr offset);
New Tokens
Accepted by the <pname> parameter of GetTextureParameter{if}v and
GetTextureParameterI{i ui}v:
TEXTURE_TARGET 0x1006
Accepted by the <pname> parameter of GetQueryObjectiv:
QUERY_TARGET 0x82EA
Accepted by the <pname> parameter of GetIntegeri_v:
TEXTURE_BINDING_1D <existing>
TEXTURE_BINDING_1D_ARRAY <existing>
TEXTURE_BINDING_2D <existing>
TEXTURE_BINDING_2D_ARRAY <existing>
TEXTURE_BINDING_2D_MULTISAMPLE <existing>
TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY <existing>
TEXTURE_BINDING_3D <existing>
TEXTURE_BINDING_BUFFER <existing>
TEXTURE_BINDING_CUBE_MAP <existing>
TEXTURE_BINDING_CUBE_MAP_ARRAY <existing>
TEXTURE_BINDING_RECTANGLE <existing>
Additions to Chapter 2 of the OpenGL 4.4 (core) Specification (OpenGL
Fundamentals)
Replace the final paragraph of Section 2.5.1.1, "Name Spaces, Name
Generation and Object Creation" with the following:
Objects may also be created directly by functions that return a new
name or names representing a freshly initialized object. Some functions
return a single object name directly whereas others are able to create a
large number of new objects, returning their names in an array. Examples of
the former are CreateProgram for program objects and FenceSync for fence
sync objects. Examples of the latter are CreateBuffers, CreateTextures and
CreateVertexArrays for buffers, textures and vertex arrays, respectively.
Additions to Chapter 4 of the OpenGL 4.4 (core) Specification (Event Model)
Modifications to Section 4.2, "Query Objects and Asynchronous Queries"
(Insert the following after the description of GenQueries and before the
introduction of DeleteQueries, p 39)
Query objects may also be created with the command
void CreateQueries(enum target, sizei n, uint *ids);
CreateQueries returns <n> previously unused query object names in <ids>,
each representing a new query object with the specified <target>.
<target> must be one of the query object targets described in section
4.2.
The initial state of the resulting query object is that the result is
marked available (the value of QUERY_RESULT_AVAILABLE) for the query
object is TRUE) and the result value (the value of QUERY_RESULT) is
zero.
Errors
An INVALID_ENUM error is generated if <target> is not one of the query
object targets described in section 4.2.
An INVALID_VALUE error is generated if <n> is negative.
(Modify the introduction of GetQueryObject* as follows, p. ??, to add
the QUERY_TARGET <pname> and the GetQueryBufferObject* commands)
The state of a query object may be queried with the commands
void GetQueryObjectiv(uint id,enum pname,int *params);
void GetQueryObjectuiv(uint id,enum pname,uint *params);
void GetQueryObjecti64v(uint id,enum pname,int64 *params);
void GetQueryObjectui64v(uint id,enum pname,uint64 *params);
void GetQueryBufferObjectiv(uint id,uint buffer,enum pname,intptr offset);
void GetQueryBufferObjectuiv(uint id,uint buffer,enum pname,intptr offset);
void GetQueryBufferObjecti64v(uint id,uint buffer,enum pname,intptr offset);
void GetQueryBufferObjectui64v(uint id,uint buffer,enum pname,intptr offset);
<id> is the name of a query object.
For GetQueryBufferObject*, <buffer> is the name of a buffer object and
<offset> is an offset into <buffer> at which the queried value is
written.
For GetQueryObject*, the queried value may be returned either in client
memory or in a buffer object. If zero is bound to the current query
result buffer binding point (see QUERY_RESULT in
section~\ref{vert:vbo:bind), then <params> is treated as a pointer into
client memory at which the queried value is written. Otherwise, <params>
is treated as an offset into the query result buffer object at which the
queried value is written.
There may be an indeterminate delay ...
If <pname> is QUERY_TARGET, then the target of the query object is
returned as a single integer.
If <pname> is QUERY_RESULT, then the query object's result value is
returned as a single integer. If the value ...
If <pname> is QUERY_RESULT_NO_WAIT, then the query object's result value
is returned as a single integer if the result ...
If multiple queries are issued using the same object name prior to
calling these query commands, the result and availability information
returned ...
Errors
An INVALID_OPERATION error is generated if <id> is not the name of a
query object, or if the query object named by <id> is currently active.
An INVALID_OPERATION error is generated by GetQueryBufferObject* if
<buffer> is not the name of an existing buffer object.
An INVALID_ENUM error is generated if <pname> is not QUERY_RESULT,
QUERY_RESULT_AVAILABLE, QUERY_RESULT_NO_WAIT, or QUERY_TARGET.
An INVALID_OPERATION error is generated if the query writes to a buffer
object, and the specified buffer offset would cause data to be written
beyond the bounds of that buffer object.
An INVALID_VALUE error is generated by GetQueryBufferObject* if <offset>
is negative.
Modifications to Section 4.3, "Time Queries"
(Add following the description of QueryCounter on p. 45)
A timer query object is created with the commands
void QueryCounter(uint id, enum target);
... <id> must be the name of an existing query object of that type.
Alternatively, TIMESTAMP query objects can be created by calling
CreateQueries with <target> set to TIMESTAMP.
When QueryCounter is called ... for that object is marked available.
Timer queries can be used within a BeginQuery / EndQuery block where the
<target> is ...
(Retain the remainder of the section.)
Additions to Chapter 6 of the OpenGL 4.4 (core) Specification (Buffer Objects)
(Insert the following before the introduction of DeleteBuffers, p. 53)
In addition to generating an unused name and then binding it to a target
with BindBuffer, a buffer object may also be created with the command
void CreateBuffers(sizei n, uint *buffers);
CreateBuffers returns <n> previously unused buffer names in <buffers>, each
representing a new buffer object initialized as if it had been bound to
an unspecified target.
Errors
An INVALID_VALUE error is generated if <n> is negative.
Modifications to Section 6.2, "Creating and Modifying Buffer Object Data Stores"
(Modify the introduction of BufferStorage as follows, p. 59)
The data store of a buffer object is created with the commands
void BufferStorage(enum target, sizeiptr size,
const void *data, bitfield flags);
void NamedBufferStorage(uint buffer, sizeiptr size,
const void *data, bitfield flags);
For BufferStorage, the data store belongs to the buffer object bound to
<target>, which must be one of the values listed in table 6.1. For
NamedBufferStorage, <buffer> is the name of the buffer object. <size> is
the size of the data store in basic machine units, and <flags> contains
a bitfield describing the intended usage of the data store.
The data store of the buffer object is allocated as a result of these
commands, and cannot be de-allocated ...
(Retain the remainder of the section, but replace references to
"BufferStorage" with "*BufferStorage").
Errors
An INVALID_OPERATION error is generated by NamedBufferStorage if
<buffer> is not the name of an existing buffer object.
(Modify the introduction of BufferData as follows, p. 61)
A mutable data store may be allocated for a buffer object with the
commands
void BufferData(enum target, sizeiptr size,
const void *data, enum usage);
void NamedBufferData(uint buffer, sizeiptr size,
const void *data, enum usage);
For BufferData, the buffer object is that bound to <target>, which must
be one of the targets listed in table 6.1. For NamedBufferData, <buffer>
is the name of the buffer object.
<size> is the size of the data store in basic machine units, <data>
points to the source data in client memory, and <usage> indicates the
expected application usage pattern of the data store.
If <data> is non-NULL ...
(Retain the remainder of the section, but replace references to
"BufferData" with "*BufferData").
Errors
An INVALID_OPERATION error is generated by NamedBufferData if <buffer>
is not the name of an existing buffer object.
(Modify the introduction of BufferSubData as follows, p. 63)
To modify some or all of the data contained in a buffer object's data
store, the client may use the commands
void BufferSubData(enum target, intptr offset,
sizeiptr size, const void *data);
void NamedBufferSubData(uint buffer, intptr offset,
sizeiptr size, const void *data);
For BufferSubData, <target> specifies the target to which the buffer
object is bound, and must be one of the values listed in table 6.1. For
NamedBufferSubData, <buffer> is the name of the buffer object.
(Retain the remainder of the section.)
Errors
An INVALID_OPERATION error is generated by NamedBufferSubData if
<buffer> is not the name of an existing buffer object.
Modifications to Section 6.2.1, "Clearing Buffer Object Data Stores"
(Modify the introduction of ClearBufferSubData as follows, p. 64)
To fill all or part of a buffer object's data store with constant
values, use the commands
void ClearBufferSubData(enum target, enum internalformat, intptr offset,
sizeiptr size, enum format, enum type,
const void *data);
void ClearNamedBufferSubData(uint buffer, enum internalformat,
intptr offset, sizeiptr size, enum format,
enum type, const void *data);
For ClearBufferSubData, the buffer object is that bound to <target>,
which must be one of the values listed in table 6.1. For
ClearNamedBufferSubData, <buffer> is the name of the buffer object.
(Retain the remainder of the section.)
Errors
An INVALID_OPERATION error is generated by ClearNamedBufferSubData if
<buffer> is not the name of an existing buffer object.
(Retain the remainder of the section.)
(Modify the introduction of ClearBufferData as follows, p. 65)
The commands
void ClearBufferData(enum target, enum internalformat, enum format,
enum type, const void *data);
void ClearNamedBufferData(uint buffer, enum internalformat, enum format,
enum type, const void *data);
are respectively equivalent to
ClearBufferSubData(target, internalformat, 0, size,
format, type, data);
and
ClearNamedBufferSubData(buffer, internalformat, 0, size,
format, type, data);
where <size> is the value of BUFFER_SIZE for the destination buffer
object.
Modifications to Section 6.3, "Mapping and Unmapping Buffer Data"
(Modify the introduction of MapBufferRange as follows, p. 65)
All or part of the data store of a buffer object may be mapped into the
client's address space with the commands
void *MapBufferRange(enum target, intptr offset, sizeiptr length,
bitfield acesss);
void *MapNamedBufferRange(uint buffer, intptr offset, sizeiptr length,
bitfield access);
For MapBufferRange, the buffer object is that bound to <target>, which
and must be one of the values listed in table 6.1. For
MapNamedBufferRange, <buffer> is the name of the buffer object.
<offset> and <length> indicate the range of data in the buffer object
that is to be mapped, in terms of basic machine units. <access> is a
bitfield containing flags which describe the requested mapping. These
flags are described below.
(Retain the remainder of the section, but replace further references
to "MapBufferRange" with "Map*BufferRange").
Errors
An INVALID_OPERATION error is generated by MapNamedBufferRange if
<buffer> is not the name of an existing buffer object.
(Modify the introduction of MapBuffer with the following, p. 69)
The entire data store of a buffer object can be mapped into the client's
address space with the commands
void *MapBuffer(enum target, enum access);
void *MapNamedBuffer(uint buffer, enum access);
These commands are respectively equivalent to
MapBufferRange(target, 0, length, flags);
and
MapNamedBufferRange(buffer, 0, length, flags);
where <length> is ...
(Retain remainder of the section.)
(Modify the introduction of FlushMappedBufferRange as follows, p. 69)
If a buffer object is mapped with the MAP_FLUSH_EXPLICIT_BIT flag,
modifications to the mapped range may be indicated with the commands
void FlushMappedBufferRange(enum target,
intptr offset,
sizeiptr length);
void FlushMappedNamedBufferRange(uint buffer,
intptr offset,
sizeiptr length);
For FlushMappedBufferRange, the buffer object is that bound to <target>,
which must be one of the targets listed in Table 6.1. For
FlushMappedNamedBufferRange, <buffer> is the name of the buffer object.
<offset> and <length> ...
Retain the remainder of Section 6.3, but replace the two further references
to FlushMappedBufferRange with "FlushMapped*BufferRange").
Errors
An INVALID_OPERATION error is generated by FlushMappedNamedBufferRange
if <buffer> is not the name of an existing buffer object.
Modifications to Section 6.3.1, "Unmapping Buffers"
(Modify the introduction of UnmapBuffer as follows, p. 70)
After the client ..., the mapping must be relinquished with one
of the commands
boolean UnmapBuffer(enum target);
boolean UnmapNamedBuffer(uint buffer);
For UnmapBuffer, the buffer object is that bound to <target>, which must
be one of the targets listed in table 6.1. For UnmapNamedBuffer,
<buffer> is the name of the buffer object.
Unmapping a mapped buffer ...
(Retain the remainder of Section 6.3.1, but replace any further
reference to "UnmapBuffer" with "Unmap*Buffer").
If an error is generated, FALSE is returned.
Errors
An INVALID_OPERATION error is generated by UnmapNamedBuffer if <buffer>
is not the name of an existing buffer object.
An INVALID_OPERATION error is generated if the buffer object's
data store is already in the unmapped state.
Modifications to Section 6.6, "Copying Between Buffers"
(Modify the introduction of CopyBufferSubData as follows, p. 72)
All or part of the data store of a buffer object may be copied to the
data store of another buffer object with the commands
void CopyBufferSubData(enum readTarget, enum writeTarget,
intptr readOffset, intptr writeOffset,
sizeiptr size);
void CopyNamedBufferSubData(uint readBuffer, uint writeBuffer,
intptr readOffset, intptr writeOffset,
sizeiptr size);
For CopyBufferSubData, <readTarget> and <writeTarget> are the targets to
which the source and destination buffers are bound, and each must be one
of the targets listed in table 6.1. For CopyNamedBufferSubData,
<readBuffer> and <writeBuffer> are the names of the source and
destination buffers, respectively.
While any of these targets may be used, COPY_READ_BUFFER and
COPY_WRITE_BUFFER are provided specifically for copies, so that they can
be used without affecting other buffer binding targets that may be in
use.
<writeOffset> and <size> specify the range of data in the destination
buffer object that is to be replaced, in terms of basic machine units.
<readOffset> and <size> specify the range of data in the source buffer
object that is to be copied to the corresponding region of the
destination buffer object.
(Replace references in the Errors section of "the buffer object bound to
<readTarget> / <writeTarget>" with "the source / destination buffer
object", respectively).
Errors
An INVALID_OPERATION error is generated by CopyNamedBufferSubData if
<readBuffer> or <writeBuffer> is not the name of an existing buffer
object.
Modifications to Section 6.7, "Buffer Object Queries"
(Replace the introduction of GetBufferParameteri{64}v with the following,
p. 73)
To query information about a buffer object, use the commands
void GetBufferParameteriv(enum target, enum pname, int *data);
void GetBufferParamereri64v(enum target, enum pname, int64 *data);
void GetNamedBufferParameteriv(uint buffer, enum pname, int *data);
void GetNamedBufferParameteri64v(uint buffer, enum pname, int64 *data);
For GetBufferParameter*, the buffer object is that bound to <target>,
which must be one of the targets listed in table 6.1. For
GetNamedBufferParameter*, <buffer> is the name of the buffer object.
<pname> must be one of the buffer object parameters in table 6.2, other
than BUFFER_MAP_POINTER. The value of the specified parameter of the
target buffer object is returned in <data>.
Errors
An INVALID_OPERATION error is generated by GetNamedBufferParameter* if
<buffer> is not the name of an existing buffer object.
(Replace the introduction of GetBufferSubData with the following, p. 73)
To query the data store of a buffer object, use the commands
void GetBufferSubData(enum target, intptr offset,
sizeiptr size, void *data);
void GetNamedBufferSubData(uint buffer, intptr offset,
sizeiptr size, void *data);
For GetBufferSubData, <target> specifies the target to which the source
buffer object is bound, and must be one of the values listed in table
6.1. For GetNamedBufferSubData, <buffer> specifies the name of the source
buffer object.
<offset> and <size> indicate ...
(Retain the remainder of the section, but replace references to
"the buffer object bound to <target>" with "the source buffer object").
Errors
An INVALID_OPERATION error is generated by GetNamedBufferSubData if
<buffer> is not the name of an existing buffer object.
(Replace the introduction of GetBufferPointerv with the following, p. 74)
While part or all of the data store of a buffer object is mapped, the
pointer to the mapped range of the data store can be queried with the
commands
void GetBufferPointerv(enum target, enum pname, const void **params);
void GetNamedBufferPointerv(uint buffer, enum pname,
const void **params);
For GetBufferPointerv, the buffer object is that bound tp <target>,
which must be one of the targets listed in table 6.1. For
GetNamedBufferPointerv, <buffer> is the name of the buffer object.
(Retain the remainder of the section.)
Errors
An INVALID_OPERATION error is generated by GetNamedBufferPointerv if
<buffer> is not the name of an existing buffer object.
Additions to Chapter 7 of the OpenGL 4.4 (core) Specification (Programs and
Shaders)
Modifications to Section 7.4, "Program Pipeline Objects"
(Insert the following after the description of BindProgramPipeline, p. 110)
Program pipeline objects may also be created with the command
void CreateProgramPipelines(sizei n, uint *pipelines);
CreateProgramPipelines returns <n> previously unused program pipeline
names in <pipelines>, each representing a new program pipeline object
which is a state vector comprising all the state and with the same
initial values listed in table 23.31.
Errors
An INVALID_VALUE error is generated if <n> is negative.
Additions to Chapter 8 of the OpenGL 4.4 (core) Specification (Textures and
Samplers)
Modifications to Section 8.1, "Texture Objects"
(Insert the following after the description of BindTextures, p. 164)
The command
void BindTextureUnit(uint unit, uint texture);
binds an existing texture object to the texture unit numbered <unit>.
<texture> must be zero or the name of an existing texture object. When
<texture> is the name of an existing texture object, that object is
bound to the target, in the corresponding texture unit, that was
specified when the object was created. When <texture> is zero, each of
the targets enumerated at the beginning of this section is reset to its
default texture for the corresponding texture image unit.
Errors
An INVALID_OPERATION error is generated by BindTextureUnit if <texture>
is not zero or the name of an existing texture object.
Texture objects may also be created with the command
void CreateTextures(enum target, sizei n, uint *textures);
CreateTextures returns <n> previously unused texture names in
<textures>, each representing a new texture object that is a state
vector comprising all the state and with the same initial values listed
in section 8.22. The new texture objects are and remain textures of the
dimensionality and type specified by <target> until they are deleted.
Errors
An INVALID_VALUE error is generated if <n> is negative.
Modifications to Section 8.2, "Sampler Objects"
(Insert the following after the description of GenSamplers, p. 165)
Sampler objects may also be created with the command
void CreateSamplers(sizei n, uint *samplers);
CreateSamplers returns <n> previously unused sampler names in
<samplers>, each representing a new sampler object which is a state
vector comprising all the state and with the same initial values listed
in table 23.18.
Errors
An INVALID_VALUE error is generated if <n> is negative.
Modifications to Section 8.6, "Alternate Texture Image Specification"
(Modify introduction and add to the list of commands comprising
TexSubImage*D and CopyTexSubImage*D, p. 201)
To respecify only a rectangular subregion of the texel array of a
texture object, use the commands
...
void TextureSubImage1D(uint texture,
int level, int xoffset, sizei width,
enum format, enum type,
const void *pixels);
void TextureSubImage2D(uint texture,
int level, int xoffset, int yoffset,
sizei width, sizei height,
enum format, enum type,
const void *pixels);
void TextureSubImage3D(uint texture,
int level,
int xoffset, int yoffset, int zoffset,
sizei width, sizei height, sizei depth,
enum format, enum type,
const void *pixels);
void CopyTextureSubImage1D(uint texture,
int level,
int xoffset,
int x, int y,
sizei width);
void CopyTextureSubImage2D(uint texture,
int level,
int xoffset, int yoffset,
int x, int y,
sizei width, sizei height);
void CopyTextureSubImage3D(uint texture,
int level,
int xoffset, int yoffset, int zoffset,
int x, int y,
sizei width, sizei height);
For *TexSubImage*, the texture object is that bound to <target>. For
*TextureSubImage*, <texture> is the name of the texture object. <target>
or the effective target of <texture> (the value of TEXTURE_TARGET; see
section 8.10) must match each command as shown in table 8.subtarg.
Command Name Valid <target>s or effective <target>s
--------------------- --------------------------------------
TexSubImage1D TEXTURE_1D
CopyTexSubImage1D
TextureSubImage1D
CopyTextureSubImage1D
TexSubImage2D TEXTURE_2D,
CopyTexSubImage2D TEXTURE_1D_ARRAY,
TextureSubImage2D TEXTURE_RECTANGLE, or one of the
CopyTextureSubImage2D cube map face targets from table 8.18
TextureSubImage2D TEXTURE_2D,
CopyTextureSubImage2D TEXTURE_1D_ARRAY, or
TEXTURE_RECTANGLE
TexSubImage3D TEXTURE_3D,
CopyTexSubImage3D TEXTURE_2D_ARRAY, or
TEXTURE_CUBE_MAP_ARRAY
TextureSubImage3D TEXTURE_3D,
CopyTextureSubImage3D TEXTURE_2D_ARRAY,
TEXTURE_CUBE_MAP_ARRAY or
TEXTURE_CUBE_MAP
----------------------------------------------------------------
Table 8.subtarg: Valid texture <target> parameters or effective
<texture> targets for texture subimage commands.
No change is made to the <internalformat> ...
The <level> parameter of each command specifies ...
Errors
An INVALID_ENUM error is generated by *TexSubImage* if <target> does
not match the command, as shown in table 8.subtarg.
An INVALID_OPERATION error is generated by *TextureSubImage* if
<texture> is not the name of an existing texture object.
An INVALID_OPERATION error is generated by *TextureSubImage* if the
effective target of <texture> does not match the command, as shown in
table 8.subtarg.
An INVALID_VALUE error is generated if the effective <target> is
TEXTURE_RECTANGLE and <level> is not zero.
Modifications to Section 8.7, "Compressed Texture Images"
To respecify only a rectangular subregion of the texel array of an
texture object, with incoming data stored in a specific compressed
format, use the commands
...
void CompressedTextureSubImage1D(uint texture, int level,
int xoffset, sizei width,
enum format,
sizei imageSize, const void *data);
void CompressedTextureSubImage2D(uint texture, int level,
int xoffset, int yoffset,
sizei width, sizei height,
enum format,
sizei imageSize, const void *data);
void CompressedTextureSubImage3D(uint texture, int level,
int xoffset, int yoffset,
int zoffset,
sizei width, sizei height,
sizei depth, enum format,
sizei imageSize, const void *data);
Modify the following text, beginning "respecify only a rectangular
region ..." as follows:
The <target>, <texture>, <level>, <xoffset>, <yoffset>, <zoffset>,
<width>, <height>, and <depth> parameters have the same meaning as in
the corresponding commands from section 8.6 without the Compressed
prefix (where those parameters are present). <data> points to compressed
image data stored in the compressed image format corresponding to
<format>.
...
Errors
Modify existing errors to apply to all forms of the commands by dropping
"bound to <target>" phrasing and using "effective <target>" instead of
"<target>".
An INVALID_OPERATION error is generated by CompressedTextureSubImage*D
if <texture> is not the name of an existing texture object.
An INVALID_OPERATION error is generated by CompressedTextureSubImage*D
if the effective <target> is TEXTURE_RECTANGLE.
Modifications to Section 8.9, "Buffer Textures"
(Modify the introduction of TexBuffer with the following, p. 214)
The commands
void TexBufferRange(enum target, enum internalformat,
uint buffer, intptr offset, sizeiptr size);
void TextureBufferRange(uint texture, enum internalformat,
uint buffer, intptr offset, sizeiptr size);
attach the range of the storage for the buffer object named <buffer> for
<size> basic machine units, starting at <offset> (also in basic machine
units) to a buffer texture.
For TexBufferRange, the buffer texture is that currently bound to
<target>. For TextureBufferRange, <texture> is the name of the buffer
texture. <target> or the effective target of <texture> must be
TEXTURE_BUFFER
If <buffer> is zero, then any buffer object attached to the buffer
texture is detached, the values <offset> and <size> are ignored and the
state for <offset> and <size> for the buffer texture are reset to zero.
<internalformat> specifies the storage format for the texel array found
in the range of the attached buffer object, and must be one of the sized
internal formats from table 8.15.
Errors
Modify existing errors to apply to all forms of the commands by using
"effective <target>" instead of "<target>".
An INVALID_OPERATION error is generated by TextureBufferRange if
<texture> is not the name of an existing texture object.
(Replace the introduction of TexBuffer with the following, p. 214)
The commands
TexBuffer(enum target, enum internalformat, uint buffer);
TextureBuffer(uint texture, enum internalformat, uint buffer);
are respectively equivalent to
TexBufferRange(<target>, <internalformat>, <buffer>, 0, size);
and
TextureBufferRange(<texture>, <internalformat>, <buffer>, 0, size);
where <size> is set to the value of BUFFER_SIZE for <buffer>.
(Retain the remainder of the section.)
Modifications to Section 8.10, "Texture Parameters"
(Modify introduction to the section)
Texture parameters control how the texel array of a texture object is
treated when specified or changed, and when applied to a fragment. Each
parameter is set with the commands
void TexParameter{if}(enum target, enum pname, T param);
void TexParameter{if}v(enum target, enum pname, const T *params);
void TexParameterI{i ui}v(enum target, enum pname, const T *params);
void TextureParameter{if}(uint texture, enum pname, T param);
void TextureParameter{if}v(uint texture, enum pname, const T *params);
void TextureParameterI{i ui}v(uint texture, enum pname, const T *params);
For TexParameter*, the texture object is that bound to <target>. For
TextureParameter*, <texture> is the name of the texture object. <target>
or the effective target of <texture> must be one of [insert existing
list of valid texture targets].
...
Errors
Modify existing errors to apply to all forms of the commands by using
"effective <target>" instead of "<target>".
An INVALID_OPERATION error is generated by TextureParameter* if
<texture> is not the name of an existing texture object.
Modifications to Section 8.11.2, "Texture Parameter Queries", p. 220
Parameters of a texture object may be queried with the commands
void GetTexParameter{if}v(enum target, enum pname, T *params);
void GetTexParameterI{i ui}v(enum target, enum pname, T *params);
void GetTextureParameter{if}v(uint texture, enum pname, T *params);
void GetTextureParameterI{i ui}v(uint texture, enum pname, T *params);
For GetTexParameter*, the texture object is that bound to <target>. For
GetTextureParameter*, <texture> is the name of the texture object.
The value of texture parameter <pname> for the texture is returned in
<params>.
<target> or the effective target of <texture> must be one of TEXTURE_1D,
TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY,
TEXTURE_RECTANGLE, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY,
TEXTURE_2D_MULTISAMPLE, or TEXTURE_2D_MULTISAMPLE_ARRAY, indicating the
currently bound one-, two-, or three-dimensional, one- or
two-dimensional array, rectangle, cube map, cube map array,
two-dimensional multisample, or two-dimensional multisample array
texture object.
<pname> must be one of IMAGE_FORMAT_COMPATIBILITY_TYPE,
TEXTURE_IMMUTABLE_FORMAT, TEXTURE_IMMUTABLE_LEVELS, TEXTURE_TARGET,
TEXTURE_VIEW_MIN_LEVEL, TEXTURE_VIEW_NUM_LEVELS, TEXTURE_VIEW_MIN_LAYER,
TEXTURE_VIEW_NUM_LAYERS, or one of the symbolic values in table 8.16.
Querying pname TEXTURE_BORDER_COLOR with GetTex*ParameterIiv or
GetTex*ParameterIuiv returns the border color values as signed integers or
unsigned integers, respectively; otherwise the values are returned as
described in section 2.2.2. If the border color is queried with a type
that does not match the original type with which it was specified, the
result is undefined.
Querying <pname> TEXTURE_TARGET returns the <effective target> of the
texture object. For GetTexParameter*, this is the <target> parameter.
For GetTextureParameter*, it is the target to which <texture> was
initially bound when it was created, or the value of the <target>
parameter to the call to CreateTextures which created the texture.
Errors
Modify existing errors to apply to all forms of the commands by using
"effective <target>" instead of "<target>".
An INVALID_OPERATION error is generated by GetTextureParameter* if
<texture> is not the name of an existing texture object.
Modifications to Section 8.11.3, "Texture Level Parameter Queries", p. 220
Parameters of a specified level-of-detail of a texture object may
be queried with the commands
void GetTexLevelParameter{if}v(enum target, int level,
enum pname, T *params);
void GetTextureLevelParameter{if}v(uint texture, int level,
enum pname, T *params);
For GetTexLevelParameter*, the texture object is that bound to <target>.
For GetTextureLevelParameter*, <texture> is the name of the texture
object.
The value of texture parameter <pname> for level-of-detail <level> of
the texture is returned in <params>. <pname> must be one of the symbolic
values in tables 23.16- 23.17.
The effective target of the texture object must be one of [incorporate
the existing list of valid targets, but remove "one of the cube map face
targets from table 8.18" and "one of the six distinct 2D images making
up the cube map texture object"] ...
For GetTexLevelParameter* only, target may also be one of the cube map
face targets from table 8.18, indicating one of the six distinct
two-dimensional images making up the cube map texture object. Note that
TEXTURE_CUBE_MAP is not a valid target parameter for
GetTexLevelParameter*.
For GetTextureLevelParameter* only, texture may also be a cube map
texture object. In this case the query is always performed for face zero
(the TEXTURE_CUBE_MAP_POSITIVE_X face), since there is no way to
specify another face.
<level> determins which level-of-detail's state is returned...
Errors
Modify existing errors to apply to all forms of the commands by using
"effective texture target" instead of "<target>".
An INVALID_OPERATION error is generated by GetTextureLevelParameter* if
<texture> is not the name of an existing texture object.
Modifications to Section 8.11.4, "Texture Image Queries"
(Replace the first paragraph with the following, p. 223)
Texture images may be obtained from a texture object with the commands
void GetTexImage(enum target, int level, enum format,
enum type, void *pixels);
void GetTextureImage(uint texture, int level, enum format,
enum type, sizei bufSize, void *pixels);
For GetTexImage, <target> specifies the target to which the texture
object is bound. <target> must be one of TEXTURE_1D, TEXTURE_2D,
TEXTURE_3D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY
or TEXTURE_RECTANGLE, indicating a one-, two- or three-dimensional, one-
or two-dimensional array, cube map array or rectangle texture,
respectively, of one of the targets from table 8.18, indicating the
corresponding face of a cube map texture.
For GetTextureImage, <texture> is the name of the texture object
containing the image to be retrieved. In addition to the types of
textures accepted by the Get*TexImage commands, GetTextureImage also
accepts cube map texture objects (with effective <target>
TEXTURE_CUBE_MAP).
<level> is a level-of-detail number, <format> is a pixel format from
table 8.3, and <type> is a pixel type from table 8.2.
For GetTextureImage, <bufSize> is the size of the buffer to receive the
retrieved pixel data. GetTextureImage does not write more than <bufSize>
bytes into <pixels>.
(Modify remaining paragraphs as shown)
These commands obtain component groups ... where the layers are treated
as rows or images. Cube map textures are treated as three-dimensional
images with a depth of 6, where the cube map faces are ordered as image
layers as shown in table 9.2
These groups are then packed and placed ...
For three-dimensional, two-dimensional array, cube map array, and cube
map textures, pixel storage operations are applied as if ...
The row length ...
Errors
Replace references to <lod> by <level>.
An INVALID_OPERATION error is generated by GetTextureImage if <texture>
is not the name of an existing texture object.
An INVALID_ENUM error is generated if the effective <target> is not one
of TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY,
TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY, TEXTURE_RECTANGLE, one of the
targets from table 8.18 (for GetTexImage and GetnTexImage only), or
TEXTURE_CUBE_MAP (for GetTextureImage only).
An INVALID_OPERATION error is generated by GetTextureImage if the buffer
size required to store the requested data is greater than <bufSize>
(Replace the introduction of GetCompressedTexImage by the following, p. 225)
Texture images stored in compressed form may be obtained with the
commands
void GetCompressedTexImage(enum target, int level, void *pixels);
void GetCompressedTextureImage(uint texture, int level, sizei bufSize,
void *pixels);
For GetCompressedTexImage, the texture is that
which is bound to <target>.
For GetCompressedTextureImage, <texture> is the name of the texture object.
<target>, <level>, <bufSize> and <pixels> are interpreted in the same
manner as the corresponding parameters of GetTexImage and
GetTextureImage.
GetCompressedTexImage writes <n> ubytes of compressed image data to the
pixel pack buffer or client memory pointed to by <pixels>, while
GetCompressedTextureImage writes min(n, bufSize) ubytes. <n> is the
value of TEXTURE_COMPRESSED_IMAGE_SIZE for the texture image. The
compressed image data is formatted according to the definition of the
texture's internal format.
By default the pixel storage modes ...
Errors
An INVALID_OPERATION error is generated by GetCompressedTextureImage if
<texture> is not the name of an existing texture object.
An INVALID_VALUE error is generated if <level> is negative, or greater
than the maximum allowable level.
An INVALID_OPERATION error is generated if the texture image is stored
with an uncompressed internal format.
An INVALID_OPERATION error is generated if a pixel pack buffer object is
bound and packing the texture image into the buffer's memory would
exceed the size of the buffer.
An INVALID_OPERATION error is generated by GetCompressedTextureImage if
the buffer size required to store the requested data is greated than
<bufSize>.
Modifications to Section 8.14.4, "Manual Mipmap Generation"
(Modify the introduction of GenerateMipmap by the following, p. 237)
Mipmaps can be generated manually for a texture object with the commands
void GenerateMipmap(enum target);
void GenerateTextureMipmap(uint texture);
For GenerateMipmap, <target> specifies the target to which the texture
object is bound. For GenerateTextureMipmap, <texture> is the name of the
texture object.
<target> or the effective target of <texture> must be
one of TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, or
TEXTURE_CUBE_MAP_ARRAY.
If <target> or the effective target of <texture> is TEXTURE_CUBE_MAP or
TEXTURE_CUBE_MAP_ARRAY, then the texture object must be cube complete or
cube array complete respectively, as defined in section 8.17.
(include the remainder of the description of GenerateMipmap, starting
with "Mipmap generation replaces...")
Errors
An INVALID_ENUM error is generated by GenerateMipmap if <target> is
not one of the valid targets listed above.
An INVALID_OPERATION error is generated by GenerateTextureMipmap if
<texture> is not the name of an existing texture object.
An INVALID_OPERATION error is generated by GenerateTextureMipmap if the
effective <target> is not one of the valid targets listed above.
An INVALID_OPERATION error is generated by GenerateTextureMipmap if the
effective <target> is TEXTURE_CUBE_MAP or TEXTURE_CUBE_MAP_ARRAY, and
the texture object is not cube complete or cube array complete,
respectively.
Modifications to Section 8.19, "Immutable-Format Texture Images"
(Replace the list of "generic" errors generated by these commands,
following the third paragraph of the section)
The TexStorage* commands specify properties of the texture object bound
to the <target> parameter of each command.
The TextureStorage* commands behave similarly to the equivalent
TexStorage* commands, but specify properties of the texture object named
by the <texture> parameter of each command. The effective target of
<texture> must be compatible with the <target> parameter of the
equivalent TexStore* command.
Errors
An INVALID_OPERATION error is generated by TexStorage* if zero is bound
to <target>.
An INVALID_OPERATION error is generated by TextureStorage* if <texture>
is not the name of an existing texture object.
An INVALID_VALUE error is generated if <width>, <height>, <depth> or
<levels> is less than 1, for commands with the corresponding parameters.
An INVALID_ENUM error is generated if <internalformat> is one of the
unsized base internal formats listed in table 8.11.
(Modify the introduction of TexStorage1D as follows, p. 247)
The commands
void TexStorage1D(enum target, sizei levels,
enum internalformat, sizei width);
void TextureStorage1D(uint texture, sizei levels,
enum internalformat, sizei width);
specify all the levels of a one-dimensional texture (or, for
TexStorage1D, proxy) at the same time. TexStorage1D is described by the
pseudocode below:
(Include original TexStorage1D pseudocode, p. 247)
(add to the Errors section for TexStorage1D)
Errors
In addition to the generic errors described at the start of this
section,
An INVALID_OPERATION error is generated by TextureStorage1D if
the effective <target> is not TEXTURE_1D.
(Modify the introduction of TexStorage2D as follows, 247)
The commands
void TexStorage2D(enum target, sizei levels, enum internalformat,
sizei width, sizei height);
void TextureStorage2D(uint texture, sizei levels, enum internalformat,
sizei width, sizei height);
specify all the levels of a two-dimensional, cube-map, one-dimensional
array or rectangle texture (or, for TexStorage2D, proxy) at the same
time. TexStorage2D is described by the <target>-dependent pseudocode
below:
(Include original TexStorage2D pseudocode, p. 248)
(add to the Errors section for TexStorage2D)
Errors
In addition to the generic errors described at the start of this
section,
An INVALID_OPERATION error is generated by TextureStorage2D if the
effective <target> is not one of those listed above.
(Modify the introduction of TexStorage3D as follows, p. 249)
The commands
void TexStorage3D(enum target, sizei levels, enum internalformat,
sizei width, sizei height, sizei depth);
void TextureStorage3D(uint texture, sizei levels, enum internalformat,
sizei width, sizei height, sizei depth);
specify all the levels of a three-dimensional, two-dimensional array
texture or cube-map array texture (or, for TexStorage3D, proxy).
TexStorage3D is described by the <target>-dependent pseudocode below:
(Include original TexStorage3D pseudocode, p. 249)
(add to the Errors section for TexStorage3D)
Errors
In addition to the generic errors described at the start of this
section,
An INVALID_OPERATION error is generated by TextureStorage3D if the
effective <target> is not one of those listed above.
(Modify the introduction of TexStorage2DMultisample as follows, p. 250)
The commands
void TexStorage2DMultisample(enum target, sizei samples,
enum internalformat, sizei width,
sizei height,
boolean fixedsamplelocations);
void TextureStorage2DMultisample(uint texture, sizei samples,
enum internalformat, sizei width,
sizei height,
boolean fixedsamplelocations);
specify a two-dimensional multisample texture (or, for
TexStorage2DMultisample, proxy). For TexStorage2DMultisample, <target>
must be TEXTURE_2D_MULTISAMPLE or PROXY_TEXTURE_2D_MULTISAMPLE. Calling
TexStorage2DMultisample is equivalent to calling TexImage2DMultisample
with the equivalently named parameters set to the same values, except
that the resulting texture has immutable format.
Errors
In addition to the generic errors described at the start of this
section,
An INVALID_OPERATION error is generated by TextureStorage2DMultisample
if the effective <target> is not TEXTURE_2D_MULTISAMPLE.
(Modify the introduction of TexStorage3DMultisample as follows, p. 250)
The commands
void TexStorage3DMultisample(enum target, sizei samples,
enum internalformat, sizei width,
sizei height, sizei depth,
boolean fixedsamplelocations);
void TextureStorage3DMultisample(uint texture, sizei samples,
enum internalformat, sizei width,
sizei height, sizei depth,
boolean fixedsamplelocations);
specify a two-dimensional multisample array texture (or, for
TexStorage3DMultisample, proxy). For TexStorage3DMultisample, <target>
must be TEXTURE_2D_MULTISAMPLE_ARRAY or
PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY.
Calling TexStorage3DMultisample is equivalent to calling
TexImage3DMultisample with the equivalently named parameters set to the
same values, except that the resulting texture has immutable format.
Errors
In addition to the generic errors described at the start of this
section,
An INVALID_OPERATION error is generated by TextureStorage3DMultisample
if the effective <target> is not TEXTURE_2D_MULTISAMPLE_ARRAY.
Additions to Chapter 9 of the OpenGL 4.4 (core) Specification (Framebuffers and
Framebuffer Objects)
Modifications to Section 9.2, "Binding and Managing Framebuffer Objects"
(Insert the following, after the description of BindFramebuffer, p. 272)
Framebuffer objects may also be created with the command
void CreateFramebuffers(sizei n, uint *framebuffers);
CreateFramebuffers returns <n> previously unused framebuffer names in
<framebuffers>, each representing a new framebuffer object which is a
state vector, comprising all the state and with the same initial values
listed in table 23.24, as well as one set of the state values listed in
table 23.25 for each attachment point of the framebuffer, with the same
initial values.
Errors
An INVALID_VALUE error is generated by CreateFramebuffers if <n> is
negative.
Modifications to Section 9.2.1, "Framebuffer Object Parameters"
(Modify the introduction of FramebufferParameteri as follows, p. 274)
Parameters of a framebuffer object are set using the commands
void FramebufferParameteri(enum target, enum pname, int param);
void NamedFramebufferParameteri(uint framebuffer, enum pname, int param);
For FramebufferParameteri, the framebuffer object is that bound to
<target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER, or
FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
NamedFramebufferParameteri, <framebuffer> is the name of the framebuffer
object.
<pname> specifies the parameter of the framebuffer object to set.
When a framebuffer ...
Errors
An INVALID_OPERATION error is generated by NamedFramebufferParameteri if
<framebuffer> is not the name of an existing framebuffer object.
Modifications to Section 9.2.3, "Framebuffer Object Queries"
(Modify the introduction of GetFramebufferParameteriv as follows, p. 277)
Parameters of a framebuffer object may be queried with the commands
void GetFramebufferParameteriv(enum target,
enum pname,
int *params);
void GetNamedFramebufferParameteriv(uint framebuffer,
enum pname,
int *params);
For GetFramebufferParameteriv, the framebuffer object is that bound to
<target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER, or
FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
GetNamedFramebufferParameteriv, <framebuffer> may be zero, indicating
the default draw framebuffer, or the name of the framebuffer object.
The value of framebuffer parameter <pname> for the framebuffer object is
returned in <params>.
Errors
An INVALID_OPERATION error is generated by
GetNamedFramebufferParameteriv if <framebuffer> is not zero or the name
of an existing framebuffer object.
(Modify the introduction of GetFramebufferAttachmentParameter as
follows, p. 277)
Attachments of a framebuffer object or buffers of a default framebuffer
may be queried with the commands
void GetFramebufferAttachmentParameteriv(enum target,
enum attachment,
enum pname,
int *params);
void GetNamedFramebufferAttachmentParameteriv(uint framebuffer,
enum attachment,
enum pname,
int *params);
For GetFramebufferAttachmentParameteriv, the framebuffer object is that
bound to <target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER, or
FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
GetNamedFramebufferAttachmentParameteriv, <framebuffer> is zero or the
name of the framebuffer object. If <framebuffer> is zero, then the
default draw framebuffer is queried.
If a default framebuffer is queried, then <attachment> must be one of
FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, or BACK_RIGHT, identifying a color
buffer; DEPTH, identifying the depth buffer; or STENCIL, identifying the
stencil buffer.
Otherwise, <attachment> must be one of the framebuffer object attachment
points listed in table 9.1
(Retain the remainder of the section, but replace the reference to
"GetFramebufferAttachmentParameteriv" with
"GetNamedFramebufferAttachmentParameteriv or
GetFramebuffferAttachmentParameteriv", p. 278)
Errors
An INVALID_OPERATION error is generated by
GetNamedFramebufferAttachmentParameteriv if <framebuffer> is not zero or
the name of an existing framebuffer object.
Modifications to Section 9.2.4, "Renderbuffer Objects"
(Insert the following after the description of BindRenderbuffer, p. 280)
New renderbuffers may also be created with the command
void CreateRenderbuffers(sizei n, uint *renderbuffers);
CreateRenderbuffers returns <n> previously unused renderbuffer names in
<renderbuffers>, each representing a new renderbuffer object which is a
state vector comprising all the state and with the initial values listed
in table 23.27. The state of each renderbuffer object is as if a name
returned from GenRenderbuffers had been bound to the RENDERBUFFER
target, except that any existing binding to RENDERBUFFER is not
affected.
Errors
An INVALID_VALUE error is generated by CreateRenderbuffers if <n> is
negative.
(Replace the introduction of RenderbufferStorageMultisample with the
following, p. 282)
The data storage, format, dimensions, and number of samples of a
renderbuffer object's image are established with the commands
void RenderbufferStorageMultisample(enum target,
sizei samples,
enum internalformat,
sizei width, sizei height);
void NamedRenderbufferStorageMultisample(uint renderbuffer,
sizei samples,
enum internalformat,
sizei width, sizei height);
For RenderbufferStorageMultisample, the renderbuffer object is that
bound to <target>, which must be RENDERBUFFER. For
NamedRenderbuferStorageMultisample, <renderbuffer> is the name of the
renderbuffer object.
<internalformat> must be color-renderable, depth-renderable, or
stencil-renderable (as defined in section 9.4). <width> and <height> are
the dimensions, in pixels, of the renderbuffer.
(Retain the remainder of the section, but replace further references to
"RenderbufferStorageMultisample" with "*RenderbufferStorageMultisample")
Errors
An INVALID_OPERATION error is generated by
NamedRenderbufferStorageMultisample if <renderbuffer> is not the name of
an existing renderbuffer object.
(Insert the following at the end of Section 9.2.4, p. 283)
The command
void NamedRenderbufferStorage(uint renderbuffer,
enum internalformat,
sizei width, sizei height);
is equivalent to
NamedRenderbufferStorageMultisample(renderbuffer, 0, internalfomat,
width, height);
Modifications to Section 9.2.6, "Renderbuffer Object Queries"
(Replace the introduction of GetRenderbufferParameteriv by the following,
p. 283)
Parameters of a renderbuffer object may be queried with the commands
void GetRenderbufferParameteriv(enum target,
enum pname, int *params);
void GetNamedRenderbufferParameteriv(uint renderbuffer,
enum pname, int *params);
For GetRenderbufferParameteriv, the renderbuffer object is that bound to
<target>, which must be RENDERBUFFER. For
GetNamedRenderbufferParameteriv, <renderbuffer> is the name of the
renderbuffer object.
The value of renderbuffer parameter <pname> for the renderbuffer object
is returned in <params>. <pname> must be one of the symbolic values...
(Retain the remainder of the section but replace instances of "the
renderbuffer currently bound to <target>" with "the renderbuffer
object", p. 284)
Errors
An INVALID_OPERATION error is generated by GetRenderbufferParameteriv if
zero is bound to <target>.
An INVALID_OPERATION error is generated by
GetNamedRenderbufferParameteriv if <renderbuffer> is not the name of an
existing renderbuffer object.
Modifications to Section 9.2.7, "Attaching Renderbuffer Images to a
Framebuffer"
(Modify the introduction of FramebufferRenderbuffer as follows, p. 284)
A renderbuffer object can be attached as one of the logical buffers of a
framebuffer object with the commands
void FramebufferRenderbuffer(enum target, enum attachment,
enum renderbuffertarget,
uint renderbuffer);
void NamedFramebufferRenderbuffer(uint framebuffer,
enum attachment,
enum renderbuffertarget,
uint renderbuffer);
For FramebufferRenderbuffer the framebuffer object is that bound to
<target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or
FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
NamedFramebufferRenderbuffer, <framebuffer> is the name of the
framebuffer object.
(Retain the remainder of the section but replace instances of
"FramebufferRenderbuffer" with "*FramebufferRenderbuffer", and of "the
framebuffer bound to <target>" with "the framebuffer object".
Errors
An INVALID_OPERATION error is generated by NamedFramebufferRenderbuffer
if <framebuffer> is not the name of an existing framebuffer object.
Modifications to Section 9.2.8, "Attaching Texture Images to a
Framebuffer"
(Modify the introduction of FramebufferTexture as follows, p. 286)
To render directly into a texture image, a specified level of a texture
object can be attached as one of the logical buffers of a framebuffer
object with the commands
void FramebufferTexture(enum target, enum attachment,
uint texture, int level);
void NamedFramebufferTexture(uint framebuffer, enum attachment,
uint texture, int level);
For FramebufferTexture, the framebuffer object is that bound to
<target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or
FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
NamedFramebufferTexture, <framebuffer> is the name of the framebuffer
object.
<attachment> must be one of the attachment points of the framebuffer
listed in table 9.1.
If <texture> is zero, any image or array of images attached to the
attachment point named by <attachment> is detached. Any additional
parameters (<level>) are ignored when <texture> is zero.
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,
one- or two-dimensional array texture, cube map array texture, 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.
(Retain the remainder of the section.)
Errors
An INVALID_OPERATION error is generated by NamedFramebufferTexture if
<framebuffer> is not the name of an existing framebuffer object.
(Replace the introduction of FramebufferTextureLayer with the following,
p. 288)
A single layer of a three-dimensional or array texture object can be
attached as one of the logical buffers of a framebuffer object with the
commands
void FramebufferTextureLayer(enum target, enum attachment,
uint texture,
int level, int layer);
void NamedFramebufferTextureLayer(uint framebuffer, enum attachment,
uint texture,
int level, int layer);
These commands operate identically to the equivalent FramebufferTexture
and NamedFramebufferTexture commands, respectively, except for the
additional <layer> argument which selects a layer of the texture object
to attach.
<layer> specifies the layer of a one- or two-dimensional image within
<texture>, except for cube map and cube map array textures. For cube map
textures, <layer> is translated into a cube map face as described in
table 9.2. For cube map array textures, <layer> is translated into an
array layer and a cube map face as described for layer-face numbers in
section 8.5.3.
If <texture> is a three-dimensional texture, then ...
Errors
In addition to the corresponding errors for FramebufferTexture and
NamedFramebufferTexture when called with the same parameters (other than
<layer>):
An INVALID_OPERATION error is generated by NamedFramebufferTextureLayer
if <framebuffer> is not the name of an existing framebuffer object.
(Remove the final two paragraphs of section 9.2.8, starting "Unlike
FramebufferTexture3D...")
Modifications to Section 9.2.8.1, "Effects of Attaching a Texture Image"
(change all references to FramebufferTexture* to *FramebufferTexture*,
to include the NamedFramebufferTexture* variants)
Modifications to Section 9.4.2, "Whole Framebuffer Completeness"
(Replace the defintion of CheckFramebufferStatus, p. 297)
The status of a framebuffer object or default framebuffer can be queried
with the commands
enum CheckFramebufferStatus(enum target);
enum CheckNamedFramebufferStatus(uint framebuffer, enum target);
For CheckFramebufferStatus, the framebuffer object is that bound to
<target>. For CheckNamedFramebufferStatus, <framebuffer> is zero or the
name of the framebuffer object.
<target> must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or FRAMEBUFFER.
FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER.
If <framebuffer> is zero, then the status of the default read or draw
framebuffer (as determined by <target>) is returned.
A value is returned that identifies whether or not the framebuffer
object or default framebuffer is complete when treated as a read or draw
framebuffer (as determined by <target>). If the framebuffer object is
complete, then FRAMEBUFFER_COMPLETE is returned. Otherwise, the value
returned is one of the error codes defined at the start of section 9.4.2
identifying one of the rules of framebuffer completeness that is
violated.
Errors
If CheckFramebufferStatus generates an error, zero is returned.
An INVALID_ENUM error is generated by CheckFramebufferStatus and
CheckNamedFramebufferStatus if <target> is not DRAW_FRAMEBUFFER,
READ_FRAMEBUFFER or FRAMEBUFFER.
An INVALID_OPERATION error is generated by CheckNamedFramebufferStatus
if <framebuffer> is not zero or the name of an existing framebuffer
object.
Additions to Chapter 10 of the OpenGL 4.4 (core) Specification (Vertex
Specification and Drawing Commands)
Modifications to Section 10.3, "Vertex Arrays"
(Insert the following after the introduction of vertex arrays, first
paragraph of Section 10.3, p. 314)
All of the state required to represent the vertex arrays is
stored in a vertex array object (VAO).
(Insert all of Section 10.4, "Vertex Array Objects" as new section 10.3.1,
renumber subsequent sections and delete the original section 10.4, p. 314)
(Insert the following after the description of BindVertexArray, p. 327)
Vertex array objects may also be created with the command
void CreateVertexArrays(sizei n, uint *arrays);
CreateVertexArrays returns <n> previously unused vertex array object
names in <arrays>, each representing a state vector comprising all the
state and with the same initial values listed in tables 23.3 and 23.4.
Errors
An INVALID_VALUE error is generated by CreateVertexArrays if <n> is
negative.
(Insert the following after the description of IsVertexArray, p. 327)
To bind a buffer object to the element array buffer bind point of a
vertex array object, use the command
void VertexArrayElementBuffer(uint vaobj, uint buffer);
<vaobj> is
[compatibility profile:
zero, indicating the default vertex array object, or]
the name of the vertex array object, and <buffer> is zero or the name of
the buffer object. If <buffer> is zero, any existing element array
buffer binding to <vaobj> is removed.
Errors
An INVALID_OPERATION error is generated by VertexArrayElementBuffer if
<vaobj> is not
[compatibility profile: zero or]
the name of an existing vertex array object.
An INVALID_OPERATION error is generated if <buffer> is not zero or the
name of an existing buffer object.
(Modify the introduction of EnableVertexAttribArray and
DisableVertexAttribArray with the following, p. 320)
An individual generic vertex attribute array in a vertex array object
is enabled with the commands
void EnableVertexAttribArray(uint index);
void EnableVertexArrayAttrib(uint vaobj, uint index);
and is disabled with the commands
void DisableVertexAttribArray(uint index);
void DisableVertexArrayAttrib(uint vaobj, uint index);
<index> is the generic vertex attribute array to enable or disable. For
EnableVertexAttribArray and DisableVertexAttribArray, the vertex array
object is the currently bound vertex array object. For
EnableVertexArrayAttrib and DisableVertexArrayAttrib, <vaobj> is
[compatibility profile:
zero, indicating the default vertex array object, or]
the name of the vertex array object.
Errors
An INVALID_OPERATION error is generated by EnableVertexAttribArray and
DisableVertexAttribArray if no vertex array object is bound.
An INVALID_OPERATION error is generated by EnableVertexArrayAttrib and
DisableVertexArrayAttrib if <vaobj> is not
[compatibility profile: zero or]
the name of an existing vertex array object.
An INVALID_VALUE error is generated if <index> is greater than or equal
to the value of MAX_VERTEX_ATTRIBS.
Modifications to Subsection 10.3.2 (which was previously 10.3.1),
"Specifying Arrays for Generic Vertex Attributes"
(Replace the introduction of the subsection with the following, p. 314)
To specify the organization of arrays storing generic vertex attributes
of a vertex array object, use the commands
void VertexAttribFormat(uint attribindex, int size,
enum type, boolean normalized,
uint relativeoffset);
void VertexAttribIFormat(uint attribindex, int size,
enum type, uint relativeoffset);
void VertexAttribLFormat(uint attribindex, int size,
enum type, uint relativeoffset);
void VertexArrayAttribFormat(uint vaobj, uint attribindex, int size,
enum type, boolean normalized,
uint relativeoffset);
void VertexArrayAttribIFormat(uint vaobj, uint attribindex, int size,
enum type, uint relativeoffset);
void VertexArrayAttribLFormat(uint vaobj, uint attribindex, int size,
enum type, uint relativeoffset);
For VertexAttrib*Format, the vertex array object is that bound to
VERTEX_ARRAY_BINDING. For VertexArrayAttrib*Format, <vaobj> is
[compatibility profile:
zero, indicating the default vertex array object, or]
the name of the vertex array object.
(Retain remainder of language.)
Errors
An INVALID_OPERATION error is generated by VertexArrayAttrib*Format if
<vaobj> is not
[compatibility profile: zero or]
the name of an existing vertex array object.
(Modify the introduction of BindVertexBuffer with the following, p. 317)
The source of data for a generic vertex attribute may be determined by
attaching a buffer object to a vertex array object with the commands
void BindVertexBuffer(uint bindingindex, uint buffer,
intptr offset, sizei stride);
void VertexArrayVertexBuffer(uint vaobj, uint bindingindex,
uint buffer, intptr offset,
sizei stride);
For BindVertexBuffer, the vertex array object is the currently bound
vertex array object. For VertexArrayVertexBuffer, <vaobj> is
[compatibility profile:
zero, indicating the default vertex array object, or]
the name of the vertex array object.
<buffer> is either zero or
[compatibility profile: an unused name.
core profile: a name returned by GenBuffers or CreateBuffers.]
If <buffer> is zero, any buffer object attached to <bindingindex> is
detached.
If <buffer> is not the name of an existing buffer object, the GL first
creates a new state vector, initialized with a zero-sized memory buffer
and comprising all the state and with the same initial values listed in
table 6.2, just as for BindBuffer. <buffer> is then attached to the
specified <bindingindex> of the vertex array object.
When sourcing vertex data from the buffer object, <offset> specifies the
offset in basic machine units of the first element in the vertex buffer.
Pointers to the <i>th and <i+1>st elements of the array differ by
<stride> basic machine units, the pointer to the <i+1>st element being
greater.
If the operation is successful no change is made to the state of the
buffer object, and any previous attachment to <bindingindex> is broken.
Errors
[core profile only:
An INVALID_OPERATION error is generated by BindVertexBuffer if no vertex
array object is bound.
An INVALID_OPERATION error is generated if <buffer> is not zero or a
name returned from a previous call to GenBuffers or CreateBuffers, or if
such a name has since been deleted with DeleteBuffers.
]
An INVALID_OPERATION error is generated by VertexArrayVertexBuffer if
<vaobj> is not
[compatibility profile: zero or]
the name of an existing vertex array object.
An INVALID_VALUE error is generated if <bindingindex> is greater than or
equal to the value of MAX_VERTEX_ATTRIB_BINDINGS.
An INVALID_VALUE error is generated if <stride> or <offset> is negative,
or if <stride> is greater than the value of MAX_VERTEX_ATTRIB_STRIDE.
The source of data for multiple vertex attributes may be determined by
attaching multiple existing buffer objects to a vertex array object with
the commands
void BindVertexBuffers(uint first, sizei count,
const uint *buffers,
const intptr *offsets,
const sizei *strides);
void VertexArrayVertexBuffers(uint vaobj, uint first, sizei count,
const uint *buffers,
const intptr *offsets,
const sizei *strides);
For BindVertexBuffers, the vertex array object is the currently bound
vertex array object. For VertexArrayVertexBuffers, <vaobj> is
[compatibility profile:
zero, indicating the default vertex array object, or]
the name of the vertex array object.
<count> existing buffer objects are attached to vertex buffer binding
points numbered <first> through <first> + <count> - 1. ...
BindVertexBuffers is equivalent (assuming no errors are generated) to
(Retain pseudocode example)
except the buffers will not be created if they do not exist.
VertexArrayVertexBuffers is equivalent to the pseudocode above, but
replacing BindVertexBuffer(args) with VertexArrayVertexBuffers(vaobj,
args).
The values specified ...
Errors
[core profile only:
An INVALID_OPERATION error is generated by BindVertexBuffers if no
vertex array object is bound.
]
An INVALID_OPERATION error is generated by VertexArrayVertexBuffer if
<vaobj> is not
[compatibility profile: zero or]
the name of an existing vertex array object.
(Retain existing list of errors)
(Modify the introduction of VertexAttribBinding with the following, p. 340)
The association between a vertex attribute and the vertex buffer binding
used by that attribute is set by the commands
void VertexAttribBinding(uint attribindex, uint bindingindex);
void VertexArrayAttribBinding(uint vaobj, uint attribindex,
uint bindingindex);
For VertexAttribBinding, the vertex array object is the currently bound
vertex array object. For VertexArrayAttribBinding, <vaobj> is
[compatibility profile:
zero, indicating the default vertex array object, or]
the name of the vertex array object.
Errors
An INVALID_OPERATION error is generated by VertexArrayAttribBinding if
<vaobj> is not
[compatibility profile: zero or]
the name of an existing vertex array object.
Modifications to Subsection 10.3.3, "Vertex Attribute Divisors"
(Replace the description of VertexBindingDivisor, p. 320)
The divisor value for attributes taken from a target vertex array object
is set with the commands
void VertexBindingDivisor(uint bindingindex, uint divisor);
void VertexArrayBindingDivisor(uint vaobj, uint bindingindex,
uint divisor);
For VertexBindingDivisor, the vertex array object is the currently bound
vertex array object. For VertexArrayBindingDivisor, <vaobj> is
[compatibility profile:
zero, indicating the default vertex array object, or]
the name of the vertex array object. These commands set the divisor for
the buffer bound to the specified <bindingindex> of the vertex array
object to <divisor>.
Errors
An INVALID_OPERATION error is generated by VertexArrayBindingDivisor if
<vaobj> is not
[compatibility profile: zero or]
the name of an existing vertex array object.
An INVALID_VALUE error is generated if <bindingindex> is greater than or
equal to the value of MAX_VERTEX_ATTRIB_BINDINGS.
Modifications to Section 10.4, "Vertex Array Objects"
(Move this section to subsection 10.3.1 and delete Section 10.4,
renumber subsequent section, p. 325)
Modifications to Section 10.5 (was 10.6), "Vertex Array and Vertex Array
Object Queries"
(Insert the following at the start of the section, p. 338)
To query parameters of a vertex array object, use the command
void GetVertexArrayiv(uint vaobj, enum pname, int *param);
<vaobj> is
[compatibility profile:
zero, indicating the default vertex array object, or]
the name of the vertex array object. The value of parameter <pname> for
attribute <index> of <vaobj> is returned in <param>. <pname> must be
ELEMENT_ARRAY_BUFFER_BINDING.
Errors
An INVALID_OPERATION error is generated if <vaobj> is not
[compatibility profile: zero or]
the name of an existing vertex array object.
An INVALID_ENUM error is generated if <pname> is not
ELEMENT_ARRAY_BUFFER_BINDING.
To query parameters of an attribute of a vertex array object, use
the commands
void GetVertexArrayIndexediv(uint vaobj,
uint index,
enum pname,
int *param);
void GetVertexArrayIndexed64iv(uint vaobj,
uint index,
enum pname,
int64 *param);
<vaobj> is
[compatibility profile:
zero, indicating the default vertex array object, or]
the name of the vertex array object. The value of parameter <pname> for
attribute <index> of <vaobj> is returned in <param>.
For GetVertexArrayIndexediv, <pname> must be one of
VERTEX_ATTRIB_ARRAY_ENABLED, VERTEX_ATTRIB_ARRAY_SIZE,
VERTEX_ATTRIB_ARRAY_STRIDE, VERTEX_ATTRIB_ARRAY_TYPE,
VERTEX_ATTRIB_ARRAY_NORMALIZED, VERTEX_ATTRIB_ARRAY_INTEGER,
VERTEX_ATTRIB_ARRAY_LONG, VERTEX_ATTRIB_ARRAY_DIVISOR, or
VERTEX_ATTRIB_RELATIVE_OFFSET. For GetVertexArrayIndexed64iv, <pname>
must be VERTEX_BINDING_OFFSET.
Errors
An INVALID_OPERATION error is generated if <vaobj> is not
[compatibility profile: zero or]
the name of an existing vertex array object.
An INVALID_VALUE error is generated if <index> is greater than or equal
to the value of MAX_VERTEX_ATTRIBS.
An INVALID_ENUM error is generated if <pname> is not one of the valid
values listed above for the corresponding command.
Additions to Chapter 13 of the OpenGL 4.4 (core) Specification (Fixed-Function
Vertex Post-Processing)
Modifications to Section 13.2.2, "Transform Feedback Primitive Capture"
(Insert the following after the description of BindTransformFeedback, p.
398)
New transform feedback objects may also be created with the command
void CreateTransformFeedbacks(sizei n, uint *ids);
CreateTransformFeedbacks returns <n> previously unused transform
feedback object names in <ids>, each representing a new state vector,
comprising the state and with all the same initial values listed in
table 23.48.
Errors
An INVALID_VALUE error is generated by CreateTransformFeedbacks if <n>
is negative.
(Replace the paragraph beginning with "Regions of buffer objects are
bound as ..." after the description of ResumeTransformFeedback, p. 400)
Regions of buffer objects are bound as targets of the currently bound
transform feedback object by calling one of the BindBuffer* commands
(see sections 6.1 and 6.2) with <target> set to
TRANSFORM_FEEDBACK_BUFFER. Alternatively, regions of buffer objects may
be bound directly to a transform feedback object with the commands
void TransformFeedbackBufferRange(uint xfb, uint index,
uint buffer, intptr offset,
sizeiptr size);
void TransformFeedbackBufferBase(uint xfb, uint index, uint buffer);
<xfb> must be zero or the name of an existing transform feedback object,
and <buffer> must be the name of an existing buffer object.
TransformFeedbackBufferRange and TransformFeedbackBufferBase behave
similarly to BindBufferRange and BindBufferBase, respectively, except
that the target of the operation is <xfb>, and they do not affect any
binding to the generic TRANSFORM_FEEDBACK_BUFFER target.
Errors
An INVALID_OPERATION error is generated if <xfb> is not zero or the name
of an existing transform feedback object.
An INVALID_VALUE error is generated if <buffer> is not zero or the name
of an existing buffer object.
An INVALID_VALUE error is generated if <index> is greater than or equal
to the number of binding points for transform feedback, as described in
section 6.7.1.
An INVALID_VALUE error is generated by TransformFeedbackBufferRange if
<offset> is negative.
An INVALID_VALUE error is generated by TransformFeedbackBufferRange if
<size> is less than or equal to zero.
An INVALID_VALUE error is generated by TransformFeedbackBufferRange if
<offset> or <size> do not satisfy the constraints described for those
parameters for transform feedback array bindings, as described in
section 6.7.1.
Additions to Chapter 17 of the OpenGL 4.4 (core) Specification (Writing
Fragments and Samples to the Framebuffer)
Modifications to Section 17.4.1, "Selecting Buffers for Writing"
(Modify the introduction and description of DrawBuffer with the following,
p. 467)
The first such operation is controlling the color buffers into which each
of the fragment color values is written. This is accomplished with one of
DrawBuffer, NamedFramebufferDrawBuffer, DrawBuffers or
NamedFramebufferDrawBuffers.
The set of buffers of a framebuffer object to which fragment color zero
is written is controlled with the commands
void DrawBuffer(enum buf);
void NamedFramebufferDrawBuffer(uint framebuffer, enum buf);
For DrawBuffer, the framebuffer object is that bound to the
DRAW_FRAMEBUFFER binding. For NamedFramebufferDrawBuffer, <framebuffer>
is zero or the name of a framebuffer object. If <framebuffer> is zero,
then the default framebuffer is affected.
Errors
An INVALID_OPERATION error is generated by NamedFramebufferDrawBuffer if
<framebuffer> is not zero or the name of an existing framebuffer object.
An INVALID_OPERATION error is generated if the default framebuffer is
affected and <buf> is a value (other than NONE) that does not indicate
one of the color buffers allocated to the default framebuffer.
An INVALID_OPERATION error is generated if a framebuffer object is
affected and <buf> is one of the constants from table 17.4 (other than
NONE), or COLOR_ATTACHMENT<m> and <m> is greater than or equal to the
value of MAX_COLOR_ATTACHMENTS.
(Modify the introduction and description of DrawBuffers with the following,
p. 469)
The set of buffers of a framebuffer object to which all fragment colors
are written is controlled with the commands
void DrawBuffers(sizei n, const enum *bufs);
void NamedFramebufferDrawBuffers(uint framebuffer, sizei n,
const enum *bufs);
For DrawBuffer, the framebuffer object is that bound to the
DRAW_FRAMEBUFFER binding. For NamedFramebufferDrawBuffer, <framebuffer>
is zero or the name of a framebuffer object. If <framebuffer> is zero,
then the default framebuffer is affected.
(Modify the language in the following paragraphs referring to
"DRAW_FRAMEBUFFER_BINDING" to read "DRAW_FRAMEBUFFER_BINDING or
<framebuffer>", p. 469)
(Modify the sentences beginning with "If the GL is bound to" to read "If
the referenced framebuffer is", p. 469)
Errors
An INVALID_OPERATION error is generated by NamedFramebufferDrawBuffers
if <framebuffer> is not zero or the name of an existing framebuffer
object.
An INVALID_OPERATION error is generated if the default framebuffer is
affected and any value in <bufs> is a constant (other than NONE or BACK)
that does not indicate one of the color buffers allocated to the default
framebuffer.
An INVALID_OPERATION error is generated if a framebuffer object is
affected and any value in <bufs> is a constant from table 17.6, or
COLOR_ATTACHMENT<m> and <m> is greater than or equal to the value of
MAX_COLOR_ATTACHMENTS.
Modifications in Section 17.4.3.1, "Clearing Individual Buffers".
(Modify the introduction of ClearBuffer{if ui}v with the following, p. 474)
Individual buffers of a framebuffer object may be cleared with the
commands
void ClearBuffer{if ui}v(enum buffer, int drawbuffer, const T* value);
void ClearNamedFramebuffer{if ui}v(uint framebuffer, enum buffer,
int drawbuffer, const T* value);
For ClearBuffer*, the framebuffer object is that bound to the
DRAW_FRAMEBUFFER binding. For ClearNamedFramebuffer*, <framebuffer> is
zero or the name of a framebuffer object. If <framebuffer> is zero, then
the default framebuffer is affected.
<buffer> and <drawbuffer> identify a buffer to clear, and <value>
specifies the values to clear it to. The *fv, *iv, and *uiv forms of
these commands should be used to clear fixed- and floating-point, signed
integer, and unsigned integer color buffers respectively.
(Retain remainder of section, but insert references to ClearFramebuffer*
wherever there are additional references to ClearBuffer*, p. 474-475)
(Modify the introduction of ClearBufferfi with the following, p. 475)
Both depth and stencil buffers of a framebuffer object may be cleared
with the commands
void ClearBufferfi(enum buffer, int drawbuffer, float depth, int stencil);
void ClearNamedFramebufferfi(uint framebuffer, enum buffer, int drawbuffer,
float depth, int stencil);
For ClearBufferfi, the framebuffer object is that bound to the
DRAW_FRAMEBUFFER binding. For ClearNamedFramebufferfi, <framebuffer> is
zero or the name of a framebuffer object. If <framebuffer> is zero, then
the default framebuffer is affected.
<buffer> must be DEPTH_STENCIL ...
Errors
An INVALID_OPERATION error is generated by ClearNamedFramebuffer* if
<framebuffer> is not zero or the name of an existing framebuffer object.
Modifications in Section 17.4.4, "Invalidating Framebuffer Contents"
(Modify the introduction of InvalidateSubFramebuffer as following, p. 476)
To signal that the GL need not preserve all contents of a framebuffer
object (invalidating portions of every pixel or a subregion of pixels),
use the commands
void InvalidateSubFramebuffer(enum target, sizei numAttachments,
const enum *attachments, inx x,
int y, sizei width, sizei height);
void InvalidateNamedFramebufferSubData(uint framebuffer,
sizei numAttachments,
const enum *attachments,
int x, int y,
sizei width, sizei height);
For InvalidateSubFramebuffer, the framebuffer object is that bound to
<target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or
FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
InvalidateNamedFramebufferSubData, <framebuffer> is the name of the
framebuffer object. If <framebuffer> is zero, the default draw
framebuffer is affected.
(Retain the remainder of the language)
Errors
An INVALID_OPERATION error is generated by
InvalidateNamedFramebufferSubData if <framebuffer> is not zero or the
name of an existing framebuffer object.
(Modify the introduction of InvalidateFramebuffer with the following,
p. 477)
The commands
void InvalidateFramebuffer(enum target, sizei numAttachments,
const enum *attachments);
void InvalidateNamedFramebufferData(uint framebuffer,
sizei numAttachments,
const enum *attachments);
are equivalent to
InvalidateSubFramebuffer(target, numAttachments, attachments,
0, 0, vw, vh);
and
InvalidateNamedFramebufferSubData(framebuffer, numAttachments,
attachments, 0, 0, vw, vh);
respectively, where <vw> and <vh> are equal to the maximum viewport width
and height, respectively, obtained by querying MAX_VIEWPORT_DIMS.
Additions to Chapter 18 of the OpenGL 4.4 (core) Specification (Reading and
Copying Pixels)
Modifications in Section 18.2.1 "Selecting Buffers for Reading"
(Modify the introduction of ReadBuffer with the following, p. 478)
When reading pixels from a color buffer of a framebuffer object, the
buffer selected for reading is termed the <read buffer>, and is
controlled with the commands
void ReadBuffer(enum src);
void NamedFramebufferReadBuffer(uint framebuffer, enum src);
For ReadBuffer, the framebuffer object is that bound to
READ_FRAMEBUFFER. For NamedFramebufferReadBuffer, <framebuffer> is zero
or the name of the framebuffer object. If <framebuffer> is zero, the
default read framebuffer is affected.
If the default framebuffer is affected (see chapter 9), <src> must be
one of the values listed in table 17.4 ...
If a framebuffer object is affected, <src> must be one of the values
listed in table 17.5 ...
(Retain the remainder of this section)
Errors
An INVALID_OPERATION error is generated by NamedFramebufferReadBuffer if
<framebuffer> is not zero or the name of an existing framebuffer object.
An INVALID_OPERATION error is generated if the default framebuffer is
affected, and <src> is a value (other than NONE) that does not indicate
any of the color buffers allocated to the default framebuffer.
An INVALID_OPERATION error is generated if a framebuffer object is
affected, <src> is one of the constants from table 17.4 (other than
NONE, or COLOR_ATTACHMENTm where m is greater than or equal to the value
of MAX_COLOR_ATTACHMENTS.
Modifications in Section 18.3.1 "Blitting Pixel Rectangles"
(Modify the introduction of BlitFramebuffer with the following, p. 487)
To transfer a rectangle of pixel values from one region of a source
framebuffer to another region of a destination framebuffer, use the
commands The commands
void BlitFramebuffer(int srcX0, int srcY0,
int srcX1, int srcY1,
int dstX0, int dstY0,
int dstX1, int dstY1,
bitfield mask, enum filter);
void BlitNamedFramebuffer(uint readFramebuffer, uint drawFramebuffer,
int srcX0, int srcY0,
int srcX1, int srcY1,
int dstX0, int dstY0,
int dstX1, int dstY1,
bitfield mask, enum filter);
For BlitFramebuffer, the source and destination framebuffers are those
bound to READ_FRAMEBUFFER and DRAW_FRAMEBUFFER respectively. For
BlitNamedFramebuffer, <readFramebuffer> and <drawFramebuffer> are the
names of the source and destination framebuffers respectively.
If no framebuffer is bound to READ_FRAMEBUFFER or DRAW_FRAMEBUFFER (for
BlitFramebuffer), or if <readFramebuffer> or <drawFramebuffer> is zero
(for BlitNamedFramebuffer), then the default read or draw framebuffer is
used as the corresponding source or destination framebuffer,
respectively.
<mask> is zero or the bitwise OR ...
(Retain the remainder of this section)
Errors
An INVALID_OPERATION error is generated by BlitNamedFramebuffer if
<readFramebuffer> or <drawFramebuffer> is not zero or the name of an
existing framebuffer object.
Additions to Chapter 22 of the OpenGL 4.4 (core) specification, "Context State
Queries"
(Add Subsection 22.4, "Transform Feedback State Queries", p. 527)
State of the currently bound transform feedback object may be queried by
calling GetIntegerv, GetIntegeri_v, GetInteger64i_v, GetBooleanv, or
other simple query functions with <pname> set to one of the tokens
listed in table 23.48.
Alternatively, the state of a transform feedback object may be queried
with the commands
void GetTransformFeedbackiv(uint xfb, enum pname, int *param);
void GetTransformFeedbacki_v(uint xfb, enum pname, uint index,
int *param);
void GetTransformFeedbacki64_v(uint xfb, enum pname, uint index,
int64 *param);
<xfb> must be zero, indicating the default transform feedback object, or
the name of an existing transform feedback object. <pname> must be one
of the tokens listed in table 23.48, depending on the command name as
shown in the errors section below. For indexed state, <index> is the
index of the transform feedback stream. <param> is the address of a
variable to receive the result of the query.
Errors
An INVALID_OPERATION error is generated by GetTransformFeedbackiv,
GetTransformFeedbacki_v and GetTransformFeedbacki64_v if <xfb> is not
zero or the name of an existing transform feedback object.
An INVALID_ENUM error is generated by GetTransformFeedbackiv if <pname>
is not TRANSFORM_FEEDBACK_PAUSED or TRANSFORM_FEEDBACK_ACTIVE.
An INVALID_ENUM error is generated by GetTransformFeedbacki_v if <pname>
is not TRANSFORM_FEEDBACK_BUFFER_BINDING.
An INVALID_ENUM error is generated by GetTransformFeedbacki64_v if
<pname> is not TRANSFORM_FEEDBACK_BUFFER_START or
TRANSFORM_FEEDBACK_BUFFER_SIZE.
An INVALID_VALID error is generated by GetTransformFeedbacki_v and
GetTransformFeedbacki64_v if <index> is greater than or equal to the
number of binding points for transform feedback, as described in section
6.7.1.
(Add Subsection 22.5, "Indexed Binding State Queries", p. 527)
The name of the texture object bound to the active texture unit may be
queried by calling GetIntegerv with <pname> TEXTURE_BINDING_1D,
TEXTURE_BINDING_1D_ARRAY, TEXTURE_BINDING_2D, TEXTURE_BINDING_2D_ARRAY,
TEXTURE_BINDING_2D_MULTISAMPLE, TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY,
TEXTURE_BINDING_3D, TEXTURE_BINDING_BUFFER, TEXTURE_BINDING_CUBE_MAP,
TEXTURE_BINDING_CUBE_MAP_ARRAY, or TEXTURE_BINDING_RECTANGLE.
Likewise, the current sampler bound to the active
texture unit may be queried by calling GetIntegerv with <pname>
SAMPLER_BINDING.
To query the bound texture or sampler object bound to a specific texture
unit without changing the active texture selector, call GetIntegeri_v
with one of the valid <pname>s listed above, and with <index> set to the
zero-based texture unit index to be queried.
Additions to the AGL/GLX/WGL Specifications
TBD.
GLX Protocol
TBD.
New State
Append to Table 23.15, "Textures (state per texture object)"
+-----------------------------------+-------+------------------------+---------------------+------------------------------------+---------+
| Get Value | Type | Get Command | Initial Value | Description | Sec. |
+-----------------------------------+-------+------------------------+---------------------+------------------------------------+---------+
| TEXTURE_TARGET | E | GetTexParameteriv | NONE | Target of texture object | 8.11 |
| | | GetTextureParameteriv | | | |
+-----------------------------------+-------+------------------------+---------------------+------------------------------------+---------+
Append to Table 23.44, "Query Object State"
+-----------------------------------+-------+--------------------+--------------------------------+------------------------------------+---------+
| Get Value | Type | Get Command | Initial Value | Description | Sec. |
+-----------------------------------+-------+--------------------+--------------------------------+------------------------------------+---------+
| QUERY_TARGET | E | GetQueryObjectiv | NONE | Target of query object | 4.2 |
+-----------------------------------+-------+--------------------+--------------------------------+------------------------------------+---------+
Modified state tables
Modify Table 23.3, "Vertex Array Object State"
Add GetVertexArrayAttribiv in 'Get Command' for
VERTEX_ATTRIB_ARRAY_ENABLED,
VERTEX_ATTRIB_ARRAY_SIZE,
VERTEX_ATTRIB_ARRAY_STRIDE,
VERTEX_ATTRIB_ARRAY_TYPE,
VERTEX_ATTRIB_ARRAY_NORMALIZED,
VERTEX_ATTRIB_ARRAY_INTEGER,
VERTEX_ATTRIB_ARRAY_LONG,
VERTEX_ATTRIB_ARRAY_DIVISOR, and
VERTEX_ATTRIB_RELATIVE_OFFSET states
Modify Table 23.4, "Vertex Array Object State"
Add GetVertexArrayiv in 'Get Command' for
ELEMENT_ARRAY_BUFFER_BINDING state
Add GetVertexArrayIndexediv in 'Get Command' for
VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
VERTEX_ATTRIB_BINDING,
VERTEX_ATTRIB_RELATIVE_OFFSET,
VERTEX_BINDING_OFFSET, and
VERTEX_BINDING_STRIDE states
Add GetVertexArrayIndexed64iv in 'Get Command' for
VERTEX_BINDING_OFFSET state
Modify Table 23.6, "Buffer Object State"
Add GetNamedBufferSubData in 'Get Command' for
the entry described as "Buffer data".
Add GetNamedBufferParameteri64v in 'Get Command' for
BUFFER_USAGE,
BUFFER_ACCESS,
BUFFER_ACCESS_FLAGS, and
BUFFER_MAP_LENGTH states
Add GetNamedBufferParameteriv in 'Get Command' for
BUFFER_SIZE,
BUFFER_MAP_OFFSET,
BUFFER_MAP_LENGTH,
BUFFER_IMMUTABLE_STORAGE,
BUFFER_STORAGE_FLAGS, and
BUFFER_MAPPED states
Add GetNamedBufferPointerv in 'Get Command' for
BUFFER_MAP_POINTER state
Modify Table 23.12, "Textures (state per texture unit)"
Add GetIntegeri_v in 'Get Command' for
TEXTURE_BINDING_1D,
TEXTURE_BINDING_1D_ARRAY,
TEXTURE_BINDING_2D,
TEXTURE_BINDING_2D_ARRAY,
TEXTURE_BINDING_2D_MULTISAMPLE,
TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY
TEXTURE_BINDING_3D,
TEXTURE_BINDING_BUFFER,
TEXTURE_BINDING_CUBE_MAP,
TEXTURE_BINDING_CUBE_MAP_ARRAY, and
TEXTURE_BINDING_RECTANGLE states
Modify Table 23.14, "Textures (state per texture object)"
Add GetTextureParameteriv in 'Get Command' for
TEXTURE_SWIZZLE_R,
TEXTURE_SWIZZLE_G,
TEXTURE_SWIZZLE_B,
TEXTURE_SWIZZLE_A,
TEXTURE_MIN_FILTER,
TEXTURE_MAG_FILTER,
TEXTURE_WRAP_S,
TEXTURE_WRAP_T,
TEXTURE_WRAP_R,
DEPTH_STENCIL_TEXTURE_MODE,
TEXTURE_COMPARE_MODE,
TEXTURE_COMPARE_FUNC,
IMAGE_FORMAT_COMPATIBILITY_TYPE,
TEXTURE_IMMUTABLE_FORMAT,
TEXTURE_IMMUTABLE_LEVELS,
TEXTURE_VIEW_MIN_LEVEL,
TEXTURE_VIEW_NUM_LEVELS,
TEXTURE_VIEW_MIN_LAYER and
TEXTURE_VIEW_NUM_LAYERS states
Add GetTextureParameterfv in 'Get Command' for
TEXTURE_BORDER_COLOR,
TEXTURE_MIN_LOD,
TEXTURE_MAX_LOD,
TEXTURE_BASE_LEVEL,
TEXTURE_MAX_LEVEL and
TEXTURE_LOD_BIAS states.
Modify Table 23.16 and 2317, "Textures (state per texture image)"
Add GetTextureLevelParameterv in 'Get Command' for each state of
the table.
Modify Table 23.25. "Framebuffer (state per attachment point)"
Add GetNamedFramebufferAttachmentParameteriv in 'Get Command'
for each state of the table.
Modify Table 23.27. "Renderbuffer (state per renderbuffer object)"
Add GetNamedRenderbufferParameteriv in 'Get Command' for
RENDERBUFFER_WIDTH,
RENDERBUFFER_HEIGHT,
RENDERBUFFER_INTERNAL_FORMAT,
RENDERBUFFER_RED_SIZE,
RENDERBUFFER_GREEN_SIZE,
RENDERBUFFER_BLUE_SIZE,
RENDERBUFFER_ALPHA_SIZE,
RENDERBUFFER_DEPTH_SIZE,
RENDERBUFFER_STENCIL_SIZE, and
RENDERBUFFER_SAMPLES states
Modify Table 23.48, "Transform Feedback State"
Add GetTransformFeedbackiv in 'Get Command' for
TRANSFORM_FEEDBACK_BUFFER_BINDING,
TRANSFORM_FEEDBACK_PAUSED and
TRANSFORM_FEEDBACK_ACTIVE states
Add GetTransformFeedbacki64_v in 'Get Command' for
TRANSFORM_FEEDBACK_BUFFER_START and
TRANSFORM_FEEDBACK_BUFFER_SIZE states
Add GetTransformFeedbacki_v in 'Get Command' for
TRANSFORM_FEEDBACK_BUFFER_BINDING state
New Implementation Dependent State
None.
Usage Examples
Example 1:
// Bind to Edit
void streamChunks(const Chunks & chunks)
{
GLuint restore = 0;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, restore)
glBindBuffer(GL_ARRAY_BUFFER, chunks.buffer());
uint8* pointer = reinterpret_cast<uint8*>(glMapBufferRange(
GL_ARRAY_BUFFER, 0, chunks.size(), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT));
for(std::size_t i = 0; i < chunks.count(); ++i)
{
// Do something
glFlushMappedBufferRange(GL_ARRAY_BUFFER, chunks.offset(), chunks.length());
}
glUnmapNamedBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, restore);
}
// Direct State Access, stream while rendering, no rendering state polution
void streamChunks(const Chunks & chunks)
{
uint8* pointer = reinterpret_cast<uint8*>(glMapNamedBufferRange(
chunks.buffer(), 0, chunks.size(), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT));
for(int i = 0; i < chunks.count(); ++i)
{
// Do something
glFlushMappedNamedBufferRange(chunks.buffer(), chunks.offset(), chunks.length());
}
glUnmapNamedBuffer(chunks.buffer());
}
Example 2: Creating a buffer object without polluting the OpenGL states
// Bind to Create
GLuint CreateBuffer()
{
// Save the previous bound buffer
GLuint restoreBuffer = 0;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &restoreBuffer);
// Reserve the buffer name and create the buffer object
uint buffer = 0;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
// Restaure the previous bound buffer to avoid polluting
// the rendering states
glBindBuffer(GL_ARRAY_BUFFER, restoreBuffer);
return buffer;
}
// Direct State Access
GLuint CreateBuffer()
{
GLuint buffer = 0;
glCreateBuffer(1, &buffer);
return buffer;
}
Example 3: Creating a vertex array object without polluting the OpenGL states
// OpenGL 3.0 Bind to Create for vertex array object
GLuint CreateVertexArray(GLuint BufferName[])
{
// Save the previous bound vertex array and array buffer
GLuint restoreVertexArray = 0;
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &restoreVertexArray);
GLuint restoreBuffer = 0;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &restoreBuffer);
glGenVertexArrays(1, &VertexArrayName);
glBindVertexArray(VertexArrayName);
glEnableVertexAttribArray(semantic::attr::POSITION);
glEnableVertexAttribArray(semantic::attr::TEXCOORD);
glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::VERTEX]);
glVertexAttribPointer(semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), BUFFER_OFFSET(0));
glVertexAttribPointer(semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), BUFFER_OFFSET(sizeof(glm::vec2)));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]);
// The GL_ARRAY_BUFFER_BINDING is a context state, not a vertex array state.
glBindBuffer(GL_ARRAY_BUFFER, restoreBuffer);
glBindVertexArray(restoreVertexArray);
return vertexArrayName;
}
// OpenGL 4.3 Bind to Create for vertex array object
GLuint CreateVertexArray(GLuint BufferName[])
{
// Save the previous bound vertex array
GLuint restoreVertexArray = 0;
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &restoreVertexArray);
GLuint vertexArrayName = 0;
glGenVertexArrays(1, &vertexArrayName);
glBindVertexArray(VertexArrayName);
glEnableVertexAttribArray(semantic::attr::POSITION);
glEnableVertexAttribArray(semantic::attr::TEXCOORD);
glVertexAttribBinding(semantic::attr::POSITION, 0);
glVertexAttribFormat(semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, 0);
glVertexAttribBinding(semantic::attr::TEXCOORD, 0);
glVertexAttribFormat(semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]);
glBindVertexBuffer(0, BufferName[buffer::VERTEX], 0, 0);
glBindVertexArray(restoreVertexArray);
return vertexArrayName;
}
// Direct State Access
GLuint CreateVertexArray(GLuint BufferName[])
{
GLuint vertexArrayName = 0;
glCreateVertexArrays(1, &vertexArrayName);
glEnableVertexArrayAttrib(VertexArrayName, semantic::attr::POSITION);
glEnableVertexArrayAttrib(VertexArrayName, semantic::attr::TEXCOORD);
glVertexArrayAttribBinding(VertexArrayName, semantic::attr::POSITION, 0);
glVertexArrayAttribFormat(VertexArrayName, semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, 0);
glVertexArrayAttribBinding(VertexArrayName, semantic::attr::TEXCOORD, 0);
glVertexArrayAttribFormat(VertexArrayName, semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2);
glVertexArrayElementBuffer(VertexArrayName, BufferName[buffer::ELEMENT]);
glVertexArrayVertexBuffer(VertexArrayName, 0, BufferName[buffer::VERTEX], 0, 0);
return vertexArrayName;
}
Example 4: Querying the bound texture to a texture image unit for debugging
// Select to query
// We need the <target> or we need to loop over all the possible targets
GLuint GetBoundTexture(GLenum target, GLuint unit)
{
GLuint restore = 0;
glGetIntegerv(GL_ACTIVE_TEXTURE, &restore);
glActiveTexture(unit);
GLuint name = 0;
glGetIntegerv(target, &name);
glActiveTexture(restore);
}
// Direct State Access
// target_binding is e.g. GL_TEXTURE_BINDING_2D for the 2D texture
GLuint GetBoundTexture(GLenum target_binding, GLuint unit)
{
GLuint name = 0;
glGetIntegeri_v(target_binding, unit, &name);
return name;
}
Transistioning guide to ARB_direct_state_access
This section is only for the purpose of transistioning an application to
the modern direct state access approach. It is not part of the specification
as such.
TBD.
Interactions with OpenGL 3.0 or ARB_framebuffer_object
If neither OpenGL 3.0 nor ARB_framebuffer_object are supported,
ignore the support for GenerateTextureMipmap, NamedFramebufferRenderbuffer,
NamedFramebufferTexture, NamedFramebufferTextureLayer,
NamedFramebufferDrawBuffer, NamedFramebufferDrawBuffers,
NamedFramebufferReadBuffer, ClearNamedFramebufferiv,
ClearNamedFramebufferuiv, ClearNamedFramebufferfv, ClearNamedFramebufferfi,
BlitNamedFramebuffer, GetNamedFramebufferAttachmentParameteriv,
CheckNamedFramebufferStatus, CreateRenderbuffers, NamedRenderbufferStorage,
NamedRenderbufferStorageMultisample and GetNamedRenderbufferParameteriv.
Interactions with OpenGL 3.0 or ARB_map_buffer_range
If neither OpenGL 3.0 nor ARB_map_buffer_range are supported,
ignore the support for MapNamedBufferRange and FlushMappedNamedBufferRange
Interactions with OpenGL 3.0 or ARB_vertex_array_object
If neither OpenGL 3.0 nor ARB_vertex_array_object are supported,
ignore the support for CreateVertexArrays, DisableVertexArrayAttrib,
EnableVertexArrayAttrib, VertexArrayElementBuffer, GetVertexArrayiv,
and GetVertexArrayIndexediv.
Interactions with OpenGL 3.1 or ARB_copy_buffer
If neither OpenGL 3.1 nor ARB_copy_buffer are supported,
ignore the support for CopyNamedBufferSubData.
Interactions with OpenGL 3.3 or ARB_instanced_arrays
If neither OpenGL 3.3 nor ARB_instanced_arrays are supported,
ignore the support for VertexArrayAttribDivisor and
VertexArrayBindingDivisor.
Interactions with OpenGL 3.3 or ARB_sampler_objects
If neither OpenGL 4.1 nor ARB_separate_shader_objects are supported,
ignore the support for CreateSamplers.
Interactions with OpenGL 4.0 or ARB_transform_feedback2
If neither OpenGL 4.0 nor ARB_transform_feedback2 are supported,
ignore the support for CreateTransformFeedbacks, GetTransformFeedbackiv,
GetTransformFeedbacki_v, GetTransformFeedbacki64_v, and TextureBuffer.
Interactions with OpenGL 4.1 or ARB_vertex_attrib_64bit
If neither OpenGL 4.1 nor ARB_vertex_attrib_64bit are supported,
ignore the support for VertexArrayAttribLFormat.
Interactions with OpenGL 4.1 or ARB_separate_shader_objects
If neither OpenGL 4.1 nor ARB_separate_shader_objects are supported,
ignore the support for CreateProgramPipelines.
Interactions with OpenGL 4.2 or ARB_texture_storage
If neither OpenGL 4.2 nor ARB_texture_storage are supported,
ignore the support for TextureStorage1D, TextureStorage2D and
TextureStorage3D.
Interactions with OpenGL 4.3 or ARB_texture_storage_multisample
If neither OpenGL 4.2 nor ARB_texture_storage are supported,
ignore the support for TextureStorage2DMultisample and
TextureStorage3DMultisample.
Interactions with OpenGL 4.3 or ARB_vertex_attrib_binding
If neither OpenGL 4.3 nor ARB_vertex_attrib_binding are supported,
ignore the support for VertexArrayVertexBuffer, VertexArrayAttribFormat,
VertexArrayAttribIFormat, VertexArrayAttribLFormat,
VertexArrayAttribBinding, VertexArrayBindingDivisor.
Interactions with OpenGL 4.3 or ARB_invalidate_subdata
If neither OpenGL 4.3 nor ARB_invalidate_subdata are supported,
ignore the support for InvalidateNamedFramebufferData and
InvalidateNamedFramebufferSubData.
Interactions with OpenGL 4.3 or ARB_texture_buffer_range
If neither OpenGL 4.3 nor ARB_texture_buffer_range are supported,
ignore the support for TextureBufferRange.
Interactions with OpenGL 4.3 or ARB_clear_buffer_object
If neither OpenGL 4.3 nor ARB_clear_buffer_object are supported,
ignore the support for ClearNamedBufferData and ClearNamedBufferSubData.
Interactions with OpenGL 4.3 or ARB_framebuffer_no_attachments
If neither OpenGL 4.3 nor ARB_framebuffer_no_attachments are supported,
ignore the support for NamedFramebufferParameteri and GetNamedFramebufferParameteriv.
Interactions with OpenGL 4.4 or ARB_buffer_storage
If neither OpenGL 4.3 nor ARB_buffer_storage are supported,
ignore the support for NamedBufferStorage.
Interactions with OpenGL 4.4 or ARB_clear_texture
If neither OpenGL 4.4 nor ARB_clear_texture are supported,
ignore the support for ClearNamedBufferData and ClearNamedBufferSubData.
Interactions with OpenGL 4.4 or ARB_multi_bind
If neither OpenGL 4.4 nor ARB_multi_bind are supported,
ignore the support for VertexArrayVertexBuffers.
Interactions with OpenGL 4.4 or ARB_query_buffer_object
If neither OpenGL 4.4 nor ARB_query_buffer_object are supported, ignore
the support for GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
GetQueryBufferObjecti64v and GetQueryBufferObjectui64v.
TODO
Document more errors. Currently, only the errors that check the new
parameters are documented. Errors for parameters equivalent to the non-DSA
versions of functions are not documented.
Add Usage Examples
Add Transitioning guide to ARB_direct_state_access
Add language for 9.2.3 Framebuffer Object Queries
Describe bufSize
Issues left: 0
What vendors extensions, vendor needs to resolve interaction with ARB_direct_state_access
Issues
0) What are the difference between ARB_direct_state_access and
EXT_direct_state_access?
<TBD>
1) Should MultiBind be the only way to bind functions in DSA?
Do we need BindTextureUnit to replace the couple ActiveTexture and
BindTexture? Do we need both VertexArrayVertexBuffer and
VertexArrayVertexBuffers?
RESOLVED: No, both approaches are arguably valuable, add
BindTextureUnit, VertexArrayVertexBuffer and
VertexArrayVertexBuffers.
2) NamedBufferData (and the corresponding function from the original EXT)
do not include the <target> parameter. Does implementations may make
initial assumptions about the usage of a data store based on this
parameter. Where did it go? Should we bring it back?
RESOLVED: No need for a target parameter for buffer. Implemetations
don't make usage assumption based on the <target> parameter. Only one
vendor extension do so AMD_pinned_memory. A for consistent approach
to specify a buffer usage would be to add a new flag for that <flags>
parameter of BufferStorage.
3) Do we need <target> parameters to all the APIs? There are several APIs
that either only allow one value, or for which the <target> parameter
is of debatable worth.
RESOLVED: Only keep the target parameter when it is functional.
4) Do we need a <target> for query object creation?
RESOLVED: Yes. You can immediately query a result, and the number of
bytes written depends on the target.
5) This extension omits TextureImageND (mutable texture definitions), but
includes CompressedTextureImageND (mutable, compressed texture). Why?
Can't we have immutable compressed textures?
RESOLVED: The core specification does not include
CompressedTexStorageND, only CompressedTexImageND because immutable
textures created with TextureStorageND can be both compressed and
uncompressed.
6) Do TransformFeedbackBufferBase and TransformFeedbackBufferRange need
a <target> parameter, as the only acceptable value should be
TRANSFORM_FEEDBACK_BUFFER?
RESOLVED: No.
7) Do TransformFeedbackBufferBase and TransformFeedbackBufferRange also
bind the buffer to the generic TRANSFORM_FEEDBACK_BUFFER target as
well as the indexed one as BindBuffer{Base/Range} would?
RESOLVED: No.
8) Do we need the support for query conversions for DSA queries?
For example, with the default transform feedback we can retrive the
state values for TRANSFORM_FEEDBACK_BUFFER_START and
TRANSFORM_FEEDBACK_BUFFER_SIZE using GetDoublev.
RESOLVED: No.
9) The language for VertexArrayVertexBuffer is inserted in subsection
10.3.1 after BindVertexBuffer, but vertex array objects are not
introduced until 10.4 - after all the state that they encapsulate.
This is backwards. We should probably give a brief overview of what
vertex arrays are (first paragraph or so of 10.3), followed by
introducing the VAO itself ("All the state required to represent
vertex arrays is stored in a VAO. Blah blah."), followed by most of
section 10.4, followed by all the state that's in the VAO (what is
currently section 10.3). This allows the clean introduction of all
vertex array state in both DSA and direct-to-context form. Should we
make this change?
RESOLVED: YES. This draft moves section 10.4 to a new subsection at
the start of section 10.3 and deletes the original 10.4. This allows
the remainder of section 10.3 to refer back to VAOs.
10) What should be called GetVertexArrayIntegeri_v?
This name is inconsistent with OpenGL convensions and there are
already two precedent in the specification
A/ In the core specification and alternative to "i" for indexed is to
use "Indexed", but there is no precedent for the
GetVertexArrayIntegeri_v construct.
glDepthRangeIndexed
glEndQueryIndexed
glGetQueryIndexediv
glScissorIndexedv
glViewportIndexedfv
Following this precedent for GetVertexArrayIntegeri_v and rename it
GetVertexArrayIndexediv.
B/ Another precedent is:
void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
"Iiv" is not very explicit out of context.
RESOLVED: GetVertexArrayIndexediv
11) Do we need GetVertexArrayAttribPointerv?
RESOLVED: No. Following the line of the resolution of issue 31, if we
don't provide a DSA API for VertexAttrib*Pointer, there is no client
vertex array support and pointer to query, hence this function as no
purpose.
12) What's the purpose of the new Create* API?
With the Gen* API, objects are not created, only an object name is
reserved. The actual operation creating the object happen after and
may require additional informations: texture and query object requires
a target to create the approciate data store.
The following function can create actually object:
BindTexture
BindBuffer
BindFramebuffer
BindVertexArray
BindProgramPipeline
BindRenderbuffer
FenceSync
BeginQuery*
QueryCounter
SamplerParameter*
UseProgramStages
The Create* API is an alternative to the Gen* + Call approach to
create an object where the object is created when its name is
reserved.
13) What should GetTransformFeedbackBooleanv be called?
RESOLVED: We don't need it! The OpenGL specification doesn't have
precedent for GetTransformFeedbackBooleanv but there are boolean
states. For example VERTEX_ATTRIB_ARRAY_ENABLED is queried with
GetVertexAttribiv of GetVertexArrayiv
14) Does InvalidateNamedFramebufferData and
InvalidateNamedFramebufferSubData need a <target> parameter?
RESOLVED: No. For Invalidate{Sub,}Framebuffer the <target> parameter is
only used to select between the framebuffer at the read binding point
and the one at the draw binding point. Since the framebuffer being
invalidated is identified directly by the <framebuffer> parameter, no
<target> is necessary.
15) What should we do with the PixelStore?
They have that B2E flavor except that instead of binding an object
to edit it, we need to query/set states to edit some objects like
selectors. Just like B2E, there are generating side effects in
applications. Hence, it is worth to investigate how we could DSA
PixelStore.
PixelStore interacts with TextureSubImage*, CompressedTextureSubImage*
functions that we are adding in this extension, and ReadPixels.
Possible solutions for this issue:
a) Add a pointer parameter to the functions concerned taking a
structure. with all the pixel store states. If null is passed,
use the default pixel store states.
b) A pixel store object. (hard to imagine, different from other APIs,
where to store those in an engine?)
c) Adding pixel store states to the texture object.
An alternative would be allowing the user to submit a structure with
all the pixel store parameters.
The interactions with sparse textures make it PixelStore particularly
interesting.
RESOLVED: The primary motivation for this extension is getting rid of
selectors. Pixel store parameters are just global state. Fixing that
is beyond the scope of this extension (and there is a lot of other
state too!).
16) Do we need DSA for UniformSubroutinesuiv?
RESOLVED: Deferred. Do subroutines have a future?
17) How do we resolve the inconsistency between Create* and Gen* APIs?
The Create API is typically equivalent to the Gen API and Binding
the object.
For example:
// Direct State Access
uint buffer;
CreateBuffer(1, &buffer);
Is the logical equivalent to:
// Bind to Edit
uint restoreBuffer;
GetIntegerv(ARRAY_BUFFER_BINDING, &restoreBuffer);
uint buffer;
GenBuffers(1, &buffer);
BindBuffer(ARRAY_BUFFER, buffer);
BindBuffer(ARRAY_BUFFER, restoreBuffer);
Typically with DSA objects are created with [Create] while [Gen+Bind]
is used to create the objects with B2E. Unfortunately, [Gen+Bind]
is not systematic:
In OpenGL 4.4, here is the functions that create objects:
- BindTexture
- BindBuffer
- BindProgramPipeline
- BindRenderbuffer
- BindSampler
- UseProgramStages
- SamplerParameter*
- GetSamplerParameter*
- IsSampler
- BeginQuery
- BeginQueryIndexed
- QueryCounter
Effectively, the sampler object behaves as if it was created at Gen*.
The query API is resolved with CreateQueries that effectively
creates the query object with a target that can also be TIMESTAMP
which is used with QueryCounter with the Gen* method.
An approach to make the B2E API more consistent without breaking
compatibility would be allowing any program pipeline function to
create the program pipeline object so that effectively
GenProgramPipelines would behave like CreateProgramPipelines.
RESOLVED: Only the Create* API provide a consistent behaviour.
We can't really fix the Gen* consistency but all the DSA functions
behave identically if we use the Create* API. That is:
1/ The object is effectively created by Create*
2/ A DSA function modifying an object, won't generated an invalid
operation error if that object was created with the corresponding
Create* function and if that object was deleted by the
corresponding Delete* function.
18) Should we take the DSA effort further to improve API consistency
further so that we could have a clear message so say "this is the
DSA API"?
All the DSA functions could have the prefix "DSA" so that if we want
an understandable message for the community would be:
"All the DSA functions starts by glDSA".
Considering the request for clarity by the OpenGL community, it seems
valuable to consider this idea.
However, a lot of the DSA API is already in the core specification.
To provide this API consistency, we would need to create aliases for
existing functions.
Propose changes:
1/ Rename all functions introduced by this extension removing
"Named" and adding the prefix "DSA"
2/ Add aliases to the following DSA functions already in core:
ClearTexImage -> DSAClearTexImage
ClearTexSubImage -> DSAClearTexSubImage
InvalidateTexSubImage -> DSAInvalidateTexSubImage
InvalidateTexImage -> DSAInvalidateTexImage
InvalidateBufferSubData -> DSAInvalidateBufferSubData
InvalidateBufferData -> DSAInvalidateBufferData
CompileShader -> DSACompileShader
TextureView -> DSATexView
CopyImageSubData -> DSACopyImageSubData
UseProgramStages -> DSAProgramPipelineStages
ProgramParameteri -> DSAProgramParameteri
ProgramUniform* -> DSAProgramUniform*
ProgramBinary -> DSAProgramBinary
LinkProgram -> DSALinkProgram
GetProgramBinary -> DSAGetProgramBinary
GetProgramInfoLog -> DSAGetProgramInfoLog
CreateShaderProgram -> DSACreateShaderProgram
SamplerParameter* -> DSASamplerParameter*
GetSamplerParameter* -> DSAGetSamplerParameter*
ValidateProgramPipeline -> DSAValidateProgramPipeline
UseProgramStages -> DSAProgramPipelineStages
GetProgramPipelineInfoLog -> DSAGetProgramPipelineInfoLog
GetProgramInterfaceiv -> DSAGetProgramInterfaceiv
GetProgramResourceIndex -> DSAGetProgramResourceIndex
GetProgramResourceName -> DSAGetProgramResourceName
GetProgramResourceiv -> DSAGetProgramResourceiv
GetProgramResourceLocation -> DSAGetProgramResourceLocation
GetProgramResourceLocationIndex -> DSAGetProgramResourceLocationIndex
GetAttachedShaders -> DSAGetAttachedShaders
GetShaderiv -> DSAGetShaderiv
GetShaderSource -> DSAGetShaderSource
GetShaderPrecisionFormat -> DSAGetShaderPrecisionFormat
GetProgramInfoLog -> DSAGetProgramInfoLog
GetUniformfv -> DSAGetUniformfv
GetUniformiv -> DSAGetUniformiv
GetUniformuiv -> DSAGetUniformuiv
GetUniformdv -> DSAGetUniformdv
GetProgramStageiv -> DSAGetProgramStageiv
CreateShader -> DSACreateShaders
CreateProgram -> DSACreatePrograms
GetSynciv -> DSAGetSynciv
FenceSync -> DSAFenceSync
WaitSync -> DSAWaitSync
ClientWaitSync -> DSAClientWaitSync
Do we want to add delete functions?
RESOLVED: No. Some people liked this, some didn't. Some liked the
prefix idea, but not the letters "DSA" (who wants to explain that in
5 years?). Some people liked the idea of aliasing existing commands
and some didn't. Some had other ideas for naming conventions. In the
end we opted for "get 'er done!" and as a result we will have GL 4.5
with DSA in it.
For those who really want the prefixed API, this can easily be done
by renaming the commands when they are dynamically loaded.
Additionally, with DSA, a C++ interface for GL can easily be written
which will hide all the ugly details off things like C function names.
19) Can we use DSA functions on default objects? Default framebuffer,
transform feedback, program pipeline, texture, vertex array?
RESOLVED:
- Default textures: NO. There are too many texture objects named
zero, the default textures are rarely used, and adding selectors
to all the commands is too much work for a corner case.
- Default vertex array objects: YES, but only in the compatibility
profile, where they exist (see issue 40).
- Default transform feedback and program pipeline objects; YES.
- Default framebuffer objects: YES, with certain exceptions as
described in issue 34.
20) Should we introduce glCreate* function capable to create multiple
program and shader objects? Same for glDelete*.
RESOLVED: There is very little value to add these functions. Unless we
figure out a way to add more value to it, from the resolution of issue
18 for example, no need to add them.
21) Why do we have TransformFeedbackBufferBase/Range but nothing for
atomic counters, SSBOs, or UBOs?
RESOLVED: TransformFeedbackBufferBase/Range are the DSA version of
BindBufferBase and BindBufferRange on transform feedback object with
the Bind To Edit API. Atomic counters, SSBOs and UBOs binding are
exclusively context states. There is no object to attach them to.
22) How should we query the bound textures with the DSA API?
With the current specification we need to use bind to edit:
GLuint GetTextureName(GLuint unit, GLenum target)
{
GLuint restore = 0;
glGetIntegerv(GL_ACTIVE_TEXTURE, &restore);
glActiveTexture(unit);
GLuint name;
glGetIntegerv(target, &name);
glActiveTexture(restore);
return name;
}
Furthermore, with this extension <target> is a texture object state,
not an input.
An approach to resolve this issue is using glGetIntegeri_v for
textures:
void glGetIntegeri_v(GLenum target_binding,
GLuint index,
GLint * data);
<target_binding> is e.g. GL_TEXTURE_BINDING_2D for the
two-dimensional texture binding.
Instead of using GL_TEXTURE0, an integer <index> identifies a
texture unit.
NOTE: In the initially released version of this extension,
queries of form
glGetIntegeri_v(GL_TEXTURE_BINDING, index, &texname);
were supported. This was a mistake and was not implementable,
because there can always be multiple different bindings to a
texture unit for different targets. This token and the
corresponding state has been removed from this extension and
from the OpenGL 4.5 API Specification. The glGetIntegeri_v query
is still supported, but the target-specific binding tokens must
be passed.
23) Do state tables chapter 23 needs to be updated to contain DSA queries too?
RESOLVED: Yes.
24) Do we need DSA functions for mutable textures?
RESOLVED: No. Immutable texture is a more robust approach to handle
textures
25) Should the DSA API collapse Texture*ND functions into a single
function per functionality?
- New extensions ARB_geometry_shader4, ARB_clear_texture,
ARB_sparse_texture, ARB_copy_image have move away from separate ND
functions
- The TEXTURE_TARGET state allows IHVs baking the <target> parameter
into the texture object. ISVs would like to do the same but can't
because the target is required to select the correct texture
function. Typically, if we fill a GL_TEXTURE_2D or a
GL_TEXTURE_2D_ARRAY we need to call respectively TexSubImage2D or
TexSubImage3D. A collapse glTexSubImage using three coordinates
would resolve this issue.
What the set of texture functions do we want?
a) All ND functions:
void TextureStorage1D(uint texture, sizei levels, enum internalformat,
sizei width);
void TextureStorage2D(uint texture, sizei levels, enum internalformat,
sizei width, sizei height);
void TextureStorage3D(uint texture, sizei levels, enum internalformat,
sizei width, sizei height, sizei depth);
void TextureStorage2DMultisample(uint texture, sizei samples, enum internalformat,
sizei width, sizei height,
boolean fixedsamplelocations);
void TextureStorage3DMultisample(uint texture, sizei samples, enum internalformat,
sizei width, sizei height, sizei depth,
boolean fixedsamplelocations);
void TextureSubImage1D(uint texture, int level,
int xoffset, sizei width,
enum format, enum type, const void *pixels);
void TextureSubImage2D(uint texture, int level,
int xoffset, int yoffset,
sizei width, sizei height,
enum format, enum type, const void *pixels);
void TextureSubImage3D(uint texture, int level,
int xoffset, int yoffset, int zoffset,
sizei width, sizei height, sizei depth,
enum format, enum type, const void *pixels);
void CompressedTextureSubImage1D(uint texture, int level,
int xoffset, sizei width,
enum format, sizei imageSize, const void *data);
void CompressedTextureSubImage2D(uint texture, int level,
int xoffset, int yoffset,
sizei width, sizei height,
enum format, sizei imageSize, const void *data);
void CompressedTextureSubImage3D(uint texture, int level,
int xoffset, int yoffset, int zoffset,
sizei width, sizei height, sizei depth,
enum format, sizei imageSize, const void *data);
void CopyTextureSubImage1D(uint texture, int level,
int xoffset,
int x, int y,
sizei width);
void CopyTextureSubImage2D(uint texture, int level,
int xoffset, int yoffset,
int x, int y,
sizei width, sizei height);
void CopyTextureSubImage3D(uint texture, int level,
int xoffset, int yoffset, int zoffset,
int x, int y,
sizei width, sizei height);
b) Collapsed ND functions (all addressed with 3D coordinates):
void TextureStorage(uint texture, sizei levels, enum internalformat,
sizei width, sizei height, sizei depth);
void TextureStorageMultisample(uint texture, sizei samples, enum internalformat,
sizei width, sizei height, sizei depth,
boolean fixedsamplelocations);
void TextureSubImage(uint texture, int level,
int xoffset, int yoffset, int zoffset,
sizei width, sizei height, sizei depth,
enum format, enum type, const void *pixels);
void CompressedTextureSubImage(uint texture, int level,
int xoffset, int yoffset, int zoffset,
sizei width, sizei height, sizei depth,
enum format, sizei imageSize, const void *data);
void CopyTextureSubImage(uint texture, int level,
int xoffset, int yoffset, int zoffset,
int x, int y,
sizei width, sizei height);
c) Both a) and b)
RESOLVED: a) All the ND versions only. This is what matches the OpenGL
4.4 set of functionality.
26) DSA functions for VertexAttrib are missing, do we want them?
The list of the functions concerned is:
void VertexAttrib{1234}{sfd}( uint index, T values );
void VertexAttrib{123}{sfd}v( uint index, const T *values );
void VertexAttrib4{bsifd ub us ui}v( uint index, const T *values );
void VertexAttrib4Nub( uint index, ubyte x, ubyte y, ubyte z, ubyte w );
void VertexAttrib4N{bsi ub us ui}v( uint index, const T *values );
void VertexAttribI{1234}{i ui}( uint index, T values );
void VertexAttribI{1234}{i ui}v( uint index, const T *values );
void VertexAttribI4{b s ub us}v( uint index, const T *values );
void VertexAttribL{1234}d( uint index, const T values );
void VertexAttribL{1234}dv( uint index, const T *values );
void VertexAttribP{1234}ui(uint index,enum type,boolean normalized,uint value);
void VertexAttribP{1234}uiv(uint index,enum type,boolean normalized,const uint *value);
RESOLVED: The default vertex attribute value is not a VAO state. No
need to add any function. We can still use the existing functions on a
software design based on DSA.
27) Should we add multi bind versions of TransformFeedbackBufferBase and
TransformFeedbackBufferRange?
RESOLVED: No. On the contrary to the vertex array object, the
transform feedback object doesn't contain a lot of state and actually
most of the states are relatived to the bound buffers.
The purpose of BindVertexBuffers for the VAOs it to quickly switch
buffers while remaining the same set of buffers in the rendering loop.
With the transform buffer object, we essentially only have buffers. If
the OpenGL programmer want to quickly switch transform feedback
buffers, he can create multiple transform feedback objects.
28) What ARB only extensions have interactions with
ARB_direct_state_access?
RESOLVED: GL_ARB_sparse_texture and GL_ARB_sparse_buffer
29) Are we missing CreateSync?
RESOLVED: No. Sync object are created with FenceSync which behave
similarly to the new Create* API expect that it returns a handle. The
sync object is perfectly compatible with the DSA programming paradigm.
30) Do we need NamedFramebufferTextureND?
RESOLVED: No. In unextended OpenGL 4.4 there is at least one case that
NamedFramebufferTexture and NamedFramebufferTextureLayer can't handle:
non layered rendering to a cube map. In this extension, we extend
FramebufferTextureLayer (and NamedFramebufferTextureLayer) to allow
non-layered rendering to cube map faces. See also Issue 36.
31) Do we need VertexArray*Offset? These are present in
EXT_direct_state_access.
RESOLVED: No. GL 4.4 intoduced ARB_vertex_attrib_binding which allows
separately changing the buffer (via BindVertexBuffer) and setting the
format (via VertexAttribFormat). In this version we provide DSA routines
to match these: VertexArrayVertexBuffer and VertexArrayAttribFormat.
Futhermore, no need to add VertexArrayAttribBinding, we can use
VertexArrayBindingDivisor which is based on ARB_vertex_attrib_binding
too.
UNRESOLVED: If there's no VertexArrayAttribBinding, the example
code needs to be rewritten accordingly.
32) Do we need DSA for renderbuffer?
RESOLVED: Keep renderbuffers. We don't need them as texture objects
are a superset of renderbuffer objects but the group decided to keep
them.
33) Atomic buffers only have a shader binding qualifier but no API.
Should we add ProgramAtomicBufferBinding?
RESOLVED: Deferred.
34) Can the default framebuffer be targeted? If so, how?
RESOLVED: YES, with certain exceptions. Most commands accepting a
<framebuffer> name accept zero and explicitly target the default
read or draw framebuffer in this case, matching behavior of the
non-Named versions. CheckFramebufferStatus adds a <target> selector.
There is a minor loss of functionality for
GetNamedFramebufferParameteriv,
GetNamedFramebufferAttachmentParameteriv,
InvalidateNamedFramebufferSubData, and
InvalidateNamedFramebufferData. These commands accept <framebuffer>
zero and target the default draw framebuffer. They cannot be used to
target the default read framebuffer without adding an explicit
selector, which we felt was too much work for a corner case.
DISCUSSION: Christophe suggested using CreateFramebuffers to create
non-zero names for the read and draw framebuffer objects. We decided
not to do this as it's quite complex to work out all the details.
35) Does the CheckNamedFramebufferStatus need a <target> parameter to
specify what type of completeness should be checked for?
RESOLVED: Yes.
DISCUSSION: CheckFramebufferStatus checks framebuffer completeness
independently for the "read framebuffer" and the "draw framebuffer"
cases and it's not because one is complete that the other is
complete as well.
Three approaches to resolve this issue:
a) Add a <target> to CheckNamedFramebufferStatus. The
EXT_framebuffer_object way with clearer language.
b) Add a <target> to the framebuffer object just like we did for
the texture object and the query object.
c) Always check for both. The application can use ReadBuffer(NONE)
or DrawBuffer(NONE) if it is really concerned by respectively
only the "read framebuffer" or "draw framebuffer" case.
36) Can we fix FramebufferTexture?
OpenGL 4.4 has 5 different functions to attach textures to a
framebuffer where each function has specific behaviors, that either
attached a texture image, enable layered or both according to the
target. Specific functions like FramebufferTexture1D and
FramebufferTexture3D apply only on the target 1D and target 3D
respectively. Finally, we can only attach cube map faces using
FramebufferTexture2D while there is no specific functional
limitation to be able to do it with FramebufferTextureLayer. This
inconsistency is largely due to legacy.
FramebufferTexture, single layer:
- one-or two-dimensional texture
- rectangle texture
- two-dimensional multisample texture
FramebufferTexture, Layered:
- three-dimensional texture
- cube map texture
- one-or two-dimensional array texture
- two-dimensional multisample array texture
- cube map array texture (intended - Bug 12336)
FramebufferTextureLayer, single layer:
- three-dimensional texture
- cube map array texture
- one-or two-dimensional array texture
- two-dimensional multisample array texture
[*missing* cube map face]
FramebufferTexture1D, single layer:
- one-dimensional texture
FramebufferTexture2D, single layer:
- cube map face
- rectangle texture
- two-dimensional texture
- two-dimensional multisample texture
FramebufferTexture3D, single layer:
- three-dimensional texture
DSA is an opportunity for some clean up.
RESOLVED. We will add NamedFramebufferTexture and
NamedFramebufferTextureLayer, but not NamedFramebufferTexture1D/2D/3D.
We'll augment FramebufferTextureLayer and NamedFramebufferTextureLayer
with support for cube map textures, so that these methods are
complete replacements for the (now legacy) FramebufferTextureND functions.
37) How to handle UNPACK_SKIP_IMAGES pixel store state if we
resolve issue 25 by collapsing Texture*ND functions?
DISCUSSION:
The OpenGL 4.4 core specification specify a specific behavior for
TexImage2D where UNPACK_SKIP_IMAGES is ignored using the following
language:
"For the purposes of decoding the texture image, TexImage2D is
equivalent to calling TexImage3D with corresponding arguments and
depth of 1, except that UNPACK_SKIP_IMAGES is ignored"
However, the specification doesn't clarify anything for regarding
the equivalent issue UNPACK_SKIP_ROWS with TexImage1D which seems to
imply that UNPACK_SKIP_IMAGES and UNPACK_SKIP_ROWS have inconsistent
behaviours.
A threaded producer and consumer OpenGL implementation might perform
the unparking on the application thread in which case it may have no
information about the texture object states, hence no access to the
implied texture target that could have been used to select whether
UNPACK_SKIP_IMAGES should be ignore or not.
In practice, even if UNPACK_SKIP_IMAGES was active for TexImage2D,
it would have an effect only if the default value (zero) is replaced
by a positive value.
The theory behind collapsing Tex*ND functions is that any set of
coordinates is a generalization of any set of coordinates with N or
less coordinates. There is no reason to forbid UNPACK_SKIP_IMAGES or
UNPACK_SKIP_ROWS for collapsed any Tex* functions.
We can't simply relax UNPACK_SKIP_IMAGES on TexImage2D because an
application may rely on the side effects of this behavior which
would result in a backward compatibility break.
RESOLVED: Not applicable. We didn't include these commands.
38) Do we need the CopyTextureImageSubData command?
RESOLVED. No. It is already a DSA command. It would allow us to get
rid of the (mostly meaningless) <target> parameter, but that is not a
selector and it wouldn't be full replacement as it can't support
renderbuffers.
39) Do we need BeginNamedQuery / EndNamedQuery / QueryNamedCounter?
RESOLVED. No. CreateQueries adds a <target>, so strictly speaking the
<target> command isn't needed for BeginQuery/EndQuery, but in the end,
this also isn't a selector, so we decided not to change it.
40) Should commands accepting a vertex array object name allow it to be
zero in the compatibility profile?
RESOLVED: Yes. All commands accepting <vaobj> names accept zero,
indicating the default VAO, in the compatibility profile only.
DISCUSSION: this case may have been overlooked because the extension
was written against the core profile specification. EXT_dsa doesn't
appear to allow it, although the error discussion there doesn't
exclude it, either (with the odd result that it may imply that a VAO
named zero will be created if it doesn't exist).
The introduction says that "this extension only expands
functionality that still exists in core profile OpenGL." However,
this is in tension with the desire to not have loss of functionality
with the non-DSA functions in this case, and the resolution of issue
19 is that DSA functions *can* be used on default objects.
41) Can READ_BUFFER and DRAW_BUFFERi state be queried with
GetNamedFramebufferParameteriv?
RESOLVED: No. The non-DSA query does not support these
tokens so neither does the DSA query.
Previous versions of the extension contained the following state
table additions:
"Modify Table 23.24, "Framebuffer (state per framebuffer object)"
Add GetNamedFramebufferParameteriv in 'Get Command' for
DRAW_BUFFERi and READ_BUFFER states"
However, there was no corresponding spec language change explaining
how these additional tokens worked, and vendors did not implement
support for it.
Revision History
Rev. Date Author Changes
---- ----------- --------- ---------------------------------------------
50 14 Jun 2018 T. Karras Use English variable names and fix API usage
in examples.
49 23 Jul 2017 Jon Leech Replace the long list of valid <target>
parameters for BeginQueryIndexed,
EndQueryIndexed, and GetQueryIndexediv
with a reference to the list of query
targets in section 4.2 (gitlab #18).
48 29 Sep 2016 Jon Leech Add interaction with ARB_query_buffer_object
(Bug 13490).
47 22 Oct 2015 Jon Leech Add missing drawbuffer parameter to
ClearNamedFramebufferfi (public Bug 1394,
Bug 13469).
46 25 Jun 2015 Jon Leech Add issue 41 noting that read and drawbuffer
state cannot be queried with
GetNamedFramebufferParameteriv (Bug 14207).
45 20 Apr 2015 Jon Leech Change generated error fo *TexSubImage* with
invalid <target> to INVALID_ENUM instead of
INVALID_VALUE (Bug 13563).
44 27 Jan 2015 Jon Leech Remove unimplementable TEXTURE_BINDING token
and state, and update Issue 22 (Bug 13278).
43 26 Sep 2014 Jon Leech Add GetQueryBufferObject* to New Commands +
minor spacing fixes.
42 18 Sep 2014 Jon Leech Add GetQueryBufferObject* queries (Bug 1214).
41 24 Jul 2014 Jon Leech Allow cube map textures to be queried with
GetTextureLevelParameter*. Don't allow
cube map face targets as effective targets
of *TextureSubImage2D, but do allow cube
map textures as effective targets of the
corresponding *3D commands (Bug 12451).
40 17 Jul 2014 Jon Leech Remove TRANSFORM_FEEDBACK_BUFFER_BINDING as
a valid target for GetTransformFeedbackiv
(Bug 12462).
39 17 Jul 2014 criccio Fix missing VertexArrayAttribBinding function
38 16 Jul 2014 Jon Leech Fix drawBuffer -> drawbuffer capitalization.
37 15 Jul 2014 Jon Leech Specify that a zero <framebuffer> argument
to GetNamedFramebufferParameteriv queries
the default draw framebuffer, matching API
spec.
36 10 Jul 2014 Jon Leech Fix error condition for
Check*FramebufferStatus.
35 03 Jul 2014 Jon Leech Fix error condition for BindTextureUnit.
34 29 Jun 2014 Jon Leech Fix typo in spec prototype for
TextureStorage2D. Clarify that not all
GetTransformFeedback* commands accept
all token names from the state table.
33 16 Jun 2014 Jon Leech Fix typos.
Require GetTextureImage to accept cube map
texture objects and to respect
three-dimensional pixel pack state in this
case (Bug 12329).
32 16 Jun 2014 Jon Leech Reflow Issues list and add issue 40.
Finish merging errors and language from
core API spec.
Allow CheckNamedFramebufferStatus to
accept a zero <framebuffer> argument,
indicating the default read or draw
framebuffer.
Remove VERTEX_ATTRIB_ARRAY_POINTER query
and add VERTEX_ATTRIB_RELATIVE_OFFSET (Bug
12330).
Allow commands taking vertex object names
to accept the name zero, indicating the
default VAO, in the compatibility profile
only (issues 19, 40).
Add parameter validation errors for
TransformFeedbackBuffer{Base,Range} and
GetTransformFeedback{i,i64}_v.
31 12 Jun 2014 Jon Leech Merge updated errors and language from the
core API spec (only done up through
CreateRenderbuffers, more to be done).
30 08 Jun 2014 Jon Leech Merged errors into body in new spec style
(still not up to date with 4.5 API spec).
Remove VertexArrayAttribBinding per issue
31. Allow querying the default draw
framebuffer with
GetFramebufferAttachmentParameteriv
(making errors consistent with spec body).
Reflow a few paragraphs and adjust
indentation for consistency. Assign enum
values for QUERY_TARGET, TEXTURE_BINDING,
and TEXTURE_TARGET.
29 06 Jun 2014 Jon Leech Remove 'or if such an object has been deleted'
language from object name validation errors,
since an 'existing' object has by definition
not been deleted. Remove tabs.
28 03 Jun 2014 Jon Leech Fix typo 'img' -> 'pixels'.
27 30 May 2014 dkoch Resolved issue 30, 36, and supporting edits.
Resolved issue 25 and removed collapsed
commands variants. Resolved issue 37.
Resolved issue 15, 18 (wontfix).
Removed CopyTextureImageSubData (Issue 38).
Removed Begin/EndNamedQuery/QueryNamedCounter
(Issue 39).
Rename BindTextureBase to BindTextureUnit
26 28 May 2014 criccio Improved the structural consistency.
25 27 May 2014 criccio Documented issue 36.
Added proposed language to resolve issue 36.
24 26 May 2014 criccio Added issue 36.
Added issue 37.
23 26 May 2014 dkoch Fix typos, parameter names and references.
22 23 May 2014 criccio Renamed CopyTextureSubImageData into
CopyTextureImageSubData from Daniel comments.
Updated issue 18 discussion.
Added collapsed texture functions languages.
Issue 25 is still to be fixed.
Added new sample.
21 22 May 2014 criccio Fixed Get*TextureImage parameters order.
Completed modification to tables chapter 23.
Added missing GetVertexArrayIndexed64iv.
Fixed accepted enum for GetVertexArray*.
20 21 May 2014 criccio Document issue 35 with the three alternatives
envisioned.
Clean up.
19 21 May 2014 dkoch Added FramebufferTexture*D, QueryNamedCounter.
Fixed CheckNamedFramebufferStatus and Issue 35.
18 21 May 2014 criccio Fixed typos.
Integrated Daniel review.
Document issue 34.
Updated table chapter 23.
17 20 May 2014 criccio There is no default VAO in core profile, fix
functions allowing zero.
Added invalid operation error on
TextureBuffer.
16 19 May 2014 criccio Documented issue 30 and resolved it.
Added issue 34.
Added all the errors relative the object name
passed to the new DSA functions.
15 18 May 2014 criccio Resolved issue 19 and added errors relative
to this issue.
Updated and resolved issue 12.
Updated and resolved issue 24.
Resolved issue 27.
Added language for query object interaction.
Added issue 32.
Resolved issue 11 accordingly to the
resolution of issue 31.
Updated and resolved issue 29.
Resolved issue 20.
Added example 1 to 3.
Document issue 25 and 18.
Added issue 33 and 34.
14 17 May 2014 criccio Resolved issue 22.
Add comments to the resolution of issue 31.
Added language for missing functions.
13 17 May 2014 dkoch Finish removing GetTransformFeedbackBooleanv.
Added NamedFramebufferTextureND (Issue 30).
Removed VertexArray*Offset (Issue 31).
Minor editorial changes.
12 16 May 2014 criccio Added BeginNamedQuery and EndNamedQuery
function and a target state to the query
object to complete the resolution of issue 4.
Removed GetTransformFeedbackBooleanv function
and added modifications for transform feedback
state table to list the DSA functions to query
the transform feedback states.
11 16 May 2014 dkoch Fixed various typos. Resolved issue 4, 13, 14.
Fixed prototypes and description of
InvalidateNamed{Sub}Framebuffer.
10 16 May 2014 criccio Added issues 0, 22, 24 to 29.
Resolved issue 26.
Fixed the language for GetCompressedTextureImage
and GetTextureImage: <pixels> and <level>
instead of <img> and <lod>.
Additional reorganization of "New Procedures
and Functions" section.
Added dependence to OpenGL 2.0.
Added interactions with all the extensions
concerned since OpenGL 2.0.
9 16 May 2014 criccio Fixed BlitNamedFramebuffer language inconsistency.
Added list of missing functions in todo section.
Reorganized "New Procedures and Functions"
section for better readability.
8 16 May 2014 criccio Applied DanielK: Typos, renamed
VERTEX_ARRAY_ELEMENT_BINDING into
ELEMENT_ARRAY_BUFFER_BINDING.
Added and fixed issue 21.
7 15 May 2014 criccio Removed left over for CompressedTextureImage1D,
CompressedTextureImage2D and
CompressedTextureImage3D.
Removed left over for CopyTextureImage1D,
CopyTextureImage2D, TextureImage1D,
TextureImage2D and TextureImage3D.
Added and resolve issue 10.
Fixed GetVertexArrayAttribPointerv prototype
and language.
Added issue 11.
Resolved issue 5 and 3.
Resolved issue 6 and fix associated prototype.
Added issues 12 to 20.
Updated issue 1 and 8 to be less specific.
Added Transistioning guide to
ARB_direct_state_access section.
6 15 May 2014 gsellers More updates. Will it ever end?
5 15 Apr 2014 criccio Clean up, typos.
4 2 Apr 2014 gsellers More updates.
3 7 Fev 2014 gsellers More updates. Ready for initial review. All
functions mostly documented.
2 30 Jan 2014 gsellers Updates - documented more functions.
1 23 Dec 2013 gsellers Initial revision based on EXT_dsa.