blob: 444e2eb7e9c3f97bdcf497551d30793610f07dfb [file] [log] [blame]
Name
ANGLE_get_image
Name Strings
GL_ANGLE_get_image
Contributors
Jamie Madill
Contact
Jamie Madill (jmadill 'at' google.com)
Notice
Copyright (c) 2019 The Khronos Group Inc. Copyright terms at
http://www.khronos.org/registry/speccopyright.html
Status
Draft
Version
Version 1, October 21, 2019
Number
OpenGL ES Extension #??
Dependencies
Requires OpenGL ES 2.0
Written against the OpenGL ES 3.2 specification.
Overview
This extension allows the OpenGL application to query and read back Texture
and Renderbuffer pixel data. The OpenGL context exposes new queries for the
implementation pixel format and type similar to glReadPixels. The context
also exposes new commands to read back pixel data with these parameters.
New Procedures and Functions
void GetTexImageANGLE(GLenum target, GLint level, GLenum format, GLenum type,
void *pixels);
void GetRenderbufferImageANGLE(GLenum target, GLint level, GLenum format,
GLenum type, void *pixels);
New Tokens
None
Additions to the OpenGL ES Specification
Update section 8.11.2 "Texture Parameter Queries":
Change "<pname> must be one of IMAGE_FORMAT_COMPATIBILITY_TYPE, TEXTURE_-
IMMUTABLE_FORMAT, TEXTURE_IMMUTABLE_LEVELS, or one of the symbolic
values in table 8.19." to "<pname> must be one of IMAGE_FORMAT_COMPATIBILITY_-
TYPE, TEXTURE_IMMUTABLE_FORMAT, TEXTURE_IMMUTABLE_LEVELS, IMPLEMENTATION_-
COLOR_READ_TYPE, IMPLEMENTATION_COLOR_READ_FORMAT or one of the symbolic
values in table 8.19.".
Add a paragrah: "Querying <pname> with IMPLEMENTATION_COLOR_READ_TYPE or
IMPLEMENTATION_COLOR_READ_FORMAT returns the implementation-dependent read
format and type for use with GetTexImageANGLE."
Update section 9.2.6 "Renderbuffer Object Queries":
Add a paragraph: "If <pname> is IMPLEMENTATION_COLOR_READ_TYPE or
IMPLEMENTATION_COLOR_READ_FORMAT then <params> will contain the
implementation-dependent read format and type for use with
GetRenderbufferImageANGLE."
Add a section "Texture and Renderbuffer Image Queries":
Texture and Renderbuffer images may be obtained from a Texture or
Renderbuffer with the commands
void GetTexImageANGLE(GLenum target, GLint level, GLenum format, GLenum type,
void *pixels);
void GetRenderbufferImageANGLE(GLenum target, GLenum format, GLenum type,
void *pixels);
For GetTexImageANGLE, <target> specifies the target to which the texture
object is bound. target must be one of TEXTURE_2D, TEXTURE_3D,
TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY, indicating a two- or three-
dimensional, two-dimensional array, cube map array respectively. <target>
may also be one of the targets from table 8.20, indicating the
corresponding face of a cube map texture.
For GetRenderbufferImageANGLE, <target> must be RENDERBUFFER.
<level> is a level-of-detail number, <format> is a pixel format from table 8.5,
and <type> is a pixel type from table 8.4.
These commands obtain component groups from a texture or renderbuffer image
with the indicated level-of-detail. If <format> is a color format then the
components are assigned among R, G, B, and A, starting with the first group
in the first row, and continuing by obtaining groups in order from each row
and proceeding from the first row to the last, and from the first image to
the last for three-dimensional textures. Two-dimensional array and cube map
array textures are treated as three-dimensional images, 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 8.24.
If <format> is DEPTH_COMPONENT, DEPTH_STENCIL, or STENCIL_INDEX, then
each depth component and/or stencil index is assigned with the same ordering of
rows and images.
These groups are then packed and placed in client or pixel buffer object memory.
If a pixel pack buffer is bound (as indicated by a non-zero value of PIXEL_-
PACK_BUFFER_BINDING), <pixels> is an offset into the pixel pack buffer;
otherwise, <pixels> is a pointer to client memory. Pixel storage modes that are
applicable to ReadPixels are applied, as described in table 16.1 and section
16.1.2.
For three-dimensional, two-dimensional array, cube map array, and cube map
textures pixel storage operations are applied as if the image were two-
dimensional, except that the additional pixel storage state values
PACK_IMAGE_HEIGHT and PACK_SKIP_IMAGES are applied. The correspondence of texels
to memory locations is as defined for TexImage3D in section 8.5.
The row length, number of rows, image depth, and number of images are determined
by the size of the texture or renderbuffer image (including any borders).
Errors:
An INVALID_ENUM error is generated by GetTexImage if <target> is
not one of TEXTURE_2D, TEXTURE_3D, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY,
or one of the targets from table 8.20.
An INVALID_ENUM error is generated by GetRenderbufferImage is <target> is not
RENDERBUFFER.
An INVALID_VALUE error is generated if <level> is negative or larger than
the maximum allowable level.
An INVALID_OPERATION error is generated if any of the following mismatches
between <format> and the internal format of the texture or renderbuffer image
exist:
* <format> is a color format (one of the formats in table 8.3 whose target is
the color buffer) and the base internal format of the texture or renderbuffer
image is not a color format.
* <format> is DEPTH_COMPONENT and the base internal format is not
DEPTH_COMPONENT or DEPTH_STENCIL.
* <format> is DEPTH_STENCIL and the base internal format is not DEPTH_-
STENCIL.
* <format> is STENCIL_INDEX and the base internal format is not
STENCIL_INDEX or DEPTH_STENCIL.
* <format> is one of the integer formats in table 8.5 and the internal format
of the texture or renderbuffer image is not integer, or <format> is not one
of the integer formats in table 8.5 and the internal format is integer.
An INVALID_OPERATION error is generated if a pixel pack buffer object
is bound and packing the texture or renderbuffer image into the buffer’s
memory would exceed the size of the buffer.
An INVALID_OPERATION error is generated if a pixel pack buffer object
is bound and <pixels> is not evenly divisible by the number of basic machine
units needed to store in memory the GL data type corresponding to type (see
table 8.4).
Dependencies on ARB_texture_rectangle
TEXTURE_RECTANGLE is accepted by GetTexImageANGLE and GetRenderbufferImageANGLE.
An INVALID_VALUE error is generated if <level> is non-zero and the effective
<target> is TEXTURE_RECTANGLE.
New State
Add to table 21.10 "Textures (state per texture object)":
Get Value Type Get Command Initial Value Description Section
-------------------------------- ---- ----------- ------------- --------------------------- -------
IMPLEMENTATION_COLOR_READ_FORMAT E GetTextureParameteriv empty Implementation pixel format 8.11.2
IMPLEMENTATION_COLOR_READ_TYPE E GetTextureParameteriv empty Implementation pixel type 8.11.2
Add to table 21.17 "Renderbuffer (state per renderbuffer object)":
Get Value Type Get Command Initial Value Description Section
-------------------------------- ---- ----------- ------------- --------------------------- -------
IMPLEMENTATION_COLOR_READ_FORMAT E GetRenderbufferParameteriv empty Implementation pixel format 9.2.6
IMPLEMENTATION_COLOR_READ_TYPE E GetRenderbufferParameteriv empty Implementation pixel type 9.2.6
Issues
1) Should GetTexImageANGLE/GetRenderbufferImageANGLE only accept IMPLEMENTATION-
_COLOR_READ_FORMAT/TYPE or should they behave the same as GetTexImage in GL?
Resolved: Keep the spec wording closer to the desktop GL version. It should
not involve much additional implementation work except for validation.
Revision History
Rev. Date Author Changes
---- ------------- --------- ----------------------------------------
1 Oct 24, 2019 jmadill Initial version