blob: aba2638d65357a2b952745776c564fd9ddb07521 [file] [log] [blame]
Name
OES_packed_depth_stencil
Name Strings
GL_OES_packed_depth_stencil
Contributors
Maurice Ribble
Contributors to EXT_packed_depth_stencil
Contact
Benj Lipchak, Apple (lipchak 'at' apple.com)
Notice
Copyright (c) 2007-2013 The Khronos Group Inc. Copyright terms at
http://www.khronos.org/registry/speccopyright.html
Specification Update Policy
Khronos-approved extension specifications are updated in response to
issues and bugs prioritized by the Khronos OpenGL ES Working Group. For
extensions which have been promoted to a core Specification, fixes will
first appear in the latest version of that core Specification, and will
eventually be backported to the extension document. This policy is
described in more detail at
https://www.khronos.org/registry/OpenGL/docs/update_policy.php
Status
Ratified by the Khronos BOP, March 20, 2008.
Version
Last Modified Date: September 17, 2009
Revision: #3
Number
OpenGL ES Extension #43
Dependencies
OpenGL ES 1.0 is required.
OES_framebuffer_object or OpenGL ES 2.0 is required.
Written based on the wording of the OpenGL 2.0 specification.
OES_depth_texture affects the definition of this extension.
Overview
Many OpenGL implementations have chosen to interleave the depth and stencil
buffers into one buffer, often with 24 bits of depth precision and 8 bits of
stencil data. 32 bits is more than is needed for the depth buffer much of
the time; a 24-bit depth buffer, on the other hand, requires that reads and
writes of depth data be unaligned with respect to power-of-two boundaries.
On the other hand, 8 bits of stencil data is more than sufficient for most
applications, so it is only natural to pack the two buffers into a single
buffer with both depth and stencil data. OpenGL never provides direct
access to the buffers, so the OpenGL implementation can provide an interface
to applications where it appears the one merged buffer is composed of two
logical buffers.
One disadvantage of this scheme is that OpenGL lacks any means by which this
packed data can be handled efficiently. For example, when an application
reads from the 24-bit depth buffer, using the type GL_UNSIGNED_SHORT will
lose 8 bits of data, while GL_UNSIGNED_INT has 8 too many. Both require
expensive format conversion operations. A 24-bit format would be no more
suitable, because it would also suffer from the unaligned memory accesses
that made the standalone 24-bit depth buffer an unattractive proposition in
the first place.
If OES_depth_texture is supported, a new data format, GL_DEPTH_STENCIL_OES,
as well as a packed data type, UNSIGNED_INT_24_8_OES, together can be used
with glTex[Sub]Image2D. This provides an efficient way to supply data for a
24-bit depth texture. When a texture with DEPTH_STENCIL_OES data is bound
for texturing, only the depth component is accessible through the texture
fetcher.
This extension also provides a new sized internal format,
DEPTH24_STENCIL8_OES, which can be used for renderbuffer storage. When a
renderbuffer or texture image with a DEPTH_STENCIL_OES base internal format
is attached to both the depth and stencil attachment points of a framebuffer
object, then it becomes both the depth and stencil buffers of the
framebuffer. This fits nicely with hardware that interleaves both depth and
stencil data into a single buffer.
New Procedures and Functions
None.
New Tokens
Accepted by the <format> parameter of TexImage2D and TexSubImage2D and by the
<internalformat> parameter of TexImage2D:
DEPTH_STENCIL_OES 0x84F9
Accepted by the <type> parameter of TexImage2D and TexSubImage2D:
UNSIGNED_INT_24_8_OES 0x84FA
Accepted by the <internalformat> parameter of RenderbufferStorage, and
returned in the <params> parameter of GetRenderbufferParameteriv when
<pname> is RENDERBUFFER_INTERNAL_FORMAT:
DEPTH24_STENCIL8_OES 0x88F0
Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation)
Update section 2.15.4, after the bullet list on page 86, to add this line:
"The stencil index texture internal component is ignored if the base
internal format is DEPTH_STENCIL_OES.
If a vertex shader uses..."
Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)
Add a row to Table 3.5 (page 128):
type Parameter GL Type Special
------------------------------------------------
... ... ...
UNSIGNED_INT_24_8_OES uint Yes
Add a row to Table 3.6 (page 129):
Format Name Element Meaning and Order Target Buffer
------------------------------------------------------------------
... ... ...
DEPTH_COMPONENT Depth Depth
DEPTH_STENCIL_OES Depth and Stencil Index Depth and Stencil
... ... ...
Add a row to Table 3.8 (page 132):
type Parameter GL Type Components Pixel Formats
------------------------------------------------------------------
... ... ... ...
UNSIGNED_INT_24_8_OES uint 2 DEPTH_STENCIL_OES
Add the following diagram to Table 3.11 (page 134):
UNSIGNED_INT_24_8_OES
31 30 29 28 27 26 ... 12 11 10 9 8 7 6 5 4 3 2 1 0
+----------------------------------+---------------+
| 1st Component | 2nd Component |
+----------------------------------+---------------+
Add a row to Table 3.12 (page 135):
Format | 1st 2nd 3rd 4th
------------------+-------------------------------
... | ... ... ... ...
DEPTH_STENCIL_OES | depth stencil N/A N/A
Add the following paragraph to the end of the section "Conversion to
floating-point" (page 135-136):
"For groups of components that contain both standard components and index
elements, such as DEPTH_STENCIL_OES, the index elements are not converted."
In section 3.8.1 "Texture Image Specification", update page 151 to
say:
"The selected groups are processed exactly as for DrawPixels, stopping just
before final conversion. Each R, G, B, A, or depth value so generated is
clamped to [0, 1], while the stencil index values are masked by 2^n-1, where
n is the number of stencil bits in the internal format resolution (see
below).
Components are then selected from the resulting R, G, B, A, depth, or
stencil index values to obtain a texture with the base internal format
specified by <internalformat>. Table 3.15 summarizes the mapping of R, G,
B, A, depth, or stencil values to texture components, as a function of the
base internal format of the texture image. <internalformat> may be
specified as one of the eight internal format symbolic constants listed in
table 3.15, as one of ...
Textures with a base internal format of DEPTH_COMPONENT or DEPTH_STENCIL_OES
are supported by texture image specification commands only if <target> is
TEXTURE_2D. Using this format in conjunction with any other <target> will
result in an INVALID_OPERATION error.
Textures with a base internal format of DEPTH_COMPONENT or DEPTH_STENCIL_OES
require either depth component data or depth/stencil component data.
Textures with other base internal formats require RGBA component data. The
error INVALID_OPERATION is generated if the base internal format is
DEPTH_COMPONENT or DEPTH_STENCIL_OES and <format> is not DEPTH_COMPONENT or
DEPTH_STENCIL_OES, or if the base internal format is not DEPTH_COMPONENT or
DEPTH_STENCIL_OES and <format> is DEPTH_COMPONENT or DEPTH_STENCIL_OES."
Add a row to table 3.15 (page 153), and update the title of the
second column:
Base Internal Format RGBA, Depth and Stencil Values Internal Components
-------------------------------------------------------------------------
... ... ...
DEPTH_STENCIL_OES Depth,Stencil D,S
... ... ...
Update the caption for table 3.15 (page 153)
"Table 3.15: Conversion from RGBA, depth, and stencil pixel components to
internal texture components. See section 3.8.13 for a description of the
texture components R, G, B, A, L, I, D, and S."
Add a new section between sections 3.8.9 and 3.8.10, after the first
paragraph on page 177:
"3.8.9-1/2 Depth/Stencil Textures
If the texture image has a base internal format of DEPTH_STENCIL_OES, then
the stencil index texture component is ignored. The texture value Tau does
not include a stencil index component, but includes only the depth
component."
Update the first paragraph of section 3.8.15 "Texture Application",
on page 189, to say:
"...Otherwise, a texture value is found according to the parameter
values of the currently bound texture image of the appropriate
dimensionality using the rules given in sections 3.8.6 through
3.8.9. Note that the texture value may contain R, G, B, A, L, I, or
D components, but it does not contain an S component. If the
texture's base internal format is DEPTH_STENCIL_OES, for the
purposes of texture application, it is as if the base internal
format was DEPTH..."
Update section 3.11.2, after the bullet list on page 195, to add this line:
"The stencil index texture internal component is ignored if the base
internal format is DEPTH_STENCIL_OES.
If a fragment shader uses..."
Additions to Chapter 4 of the OpenGL ES 2.0 Specification
In section 4.4.5 "Framebuffer Completeness", modify the definition of
"depth-renderable" and "stencil-renderable" to say:
"* An internal format is depth-renderable if it is one of the sized
internal formats that has a depth-renderable internal format value of
DEPTH_COMPONENT16 or DEPTH24_STENCIL8_OES. No other formats are depth-
renderable.
* An internal format is stencil-renderable if it is one of the sized
internal formats that has a stencil-renderable internal format value
of STENCIL_INDEX8 or DEPTH24_STENCIL8_OES. No other formats are
stencil-renderable."
Additions to Chapter 5 of the OpenGL 2.0 Specification (Special
Functions)
None.
Additions to Chapter 6 of the OpenGL 2.0 Specification (State and State
Requests)
None.
GLX Protocol
None.
Interactions with OES_depth_texture
If OES_depth_texture is not available, mentions of DEPTH_STENCIL_OES and
UNSIGNED_INT_24_8_OES as format/type combinations accepted by TexImage2D and
TexSubImage2D are omitted.
Errors
The error INVALID_ENUM is generated if RenderbufferStorage is called with an
<internalformat> that is not RGB, RGBA, DEPTH_COMPONENT, STENCIL_INDEX,
DEPTH_STENCIL_OES, or one of the internal formats from table 3.16 or table
2.nnn that has a base internal format of RGB, RGBA, DEPTH_COMPONENT,
STENCIL_INDEX, or DEPTH_STENCIL_OES."
New State
None.
Usage Example
(1) Attach a DEPTH_STENCIL_OES texture image to an FBO as both the depth and
stencil buffers.
glGenFramebuffers(1, &fb);
glGenTextures(1, &tex_color);
glGenTextures(1, &tex_depthstencil);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
// Setup color texture (mipmap)
glBindTexture(GL_TEXTURE_2D, tex_color);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGenerateMipmap(GL_TEXTURE_2D);
glFramebufferTexture2D(GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, tex_color, 0);
// Setup depth_stencil texture (not mipmap)
glBindTexture(GL_TEXTURE_2D, tex_depthstencil);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES,
512, 512, 0, GL_DEPTH_STENCIL_OES,
GL_UNSIGNED_INT_24_8_OES, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
GL_TEXTURE_2D, tex_depthstencil, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER,
GL_STENCIL_ATTACHMENT,
GL_TEXTURE_2D, tex_depthstencil, 0);
// Check framebuffer completeness at the end of initialization.
loop {
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
<render to color, depth, and stencil textures>
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, tex_color);
glGenerateMipmap(GL_TEXTURE_2D);
<draw to the window, reading from the color texture>
glBindTexture(GL_TEXTURE_2D, tex_depthstencil);
<draw to the window, reading depth from the depthstencil texture>
}
Issues
1) What are the differences between this extension and
EXT_packed_depth_stencil?
RESOLVED: The following are the only differences:
* No support for 1D or 3D textures
* No support for proxy targets
* Sized internal format only used for RenderbufferStorage
* Format and internal format must match for TexImage2D
* No support for DrawPixels, ReadPixels, CopyPixels,
CopyTexImage2D, or CopyTexSubImage2D
* No support for GetTexLevelParameter, so no TEXTURE_STENCIL_SIZE_EXT
* No support for GetTexImage
Revision History
#03 09/17/2009 Jon Leech Add glCopyTexSubImage2D to
exclusions from OpenGL in
issue 1 (bug 5335).
#02 01/20/2009 Benj Lipchak Make the OES_depth_texture interactions
more explicit.
#01 10/02/2007 Benj Lipchak Start with EXT_packed_depth_stencil,
rename OES and remove non-ES stuff.