back  Return to list

GL_NV_packed_depth_stencil
homeprevnext Name
  
    NV_packed_depth_stencil  
  
homeprevnext Name Strings
  
    GL_NV_packed_depth_stencil  
  
homeprevnext Contact
  
    Matt Craighead, NVIDIA Corporation (mcraighead 'at' nvidia.com)  
  
homeprevnext Notice
  
    Copyright NVIDIA Corporation, 2000, 2001.  
  
homeprevnext IP Status
  
    NVIDIA Proprietary.  
  
homeprevnext Status
  
    Shipping (version 1.1)  
  
homeprevnext Version
      
    NVIDIA Date: August 22, 2001 (version 1.1)  
    $Date$ $Revision$  
    $Id: //sw/main/docs/OpenGL/specs/GL_NV_packed_depth_stencil.txt#3 $  
  
homeprevnext Number
  
    226  
  
homeprevnext Dependencies
  
    Written based on the wording of the OpenGL 1.2.1 specification.  
  
    SGIX_depth_texture affects the definition of this extension.  
  
homeprevnext 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.  
  
    Many applications, such as parallel rendering applications, may also  
    wish to draw to or read back from both the depth and stencil buffers  
    at the same time.  Currently this requires two separate operations,  
    reducing performance.  Since the buffers are interleaved, drawing to  
    or reading from both should be no more expensive than using just one;  
    in some cases, it may even be cheaper.  
  
    This extension provides a new data format, GL_DEPTH_STENCIL_NV, that  
    can be used with the glDrawPixels, glReadPixels, and glCopyPixels  
    commands, as well as a packed data type, GL_UNSIGNED_INT_24_8_NV,  
    that is meant to be used with GL_DEPTH_STENCIL_NV.  No other formats  
    are supported with GL_DEPTH_STENCIL_NV.  If SGIX_depth_texture is  
    supported, GL_DEPTH_STENCIL_NV/GL_UNSIGNED_INT_24_8_NV data can also  
    be used for textures; this provides a more efficient way to supply  
    data for a 24-bit depth texture.  
  
    GL_DEPTH_STENCIL_NV data, when passed through the pixel path,  
    undergoes both depth and stencil operations.  The depth data is  
    scaled and biased by the current GL_DEPTH_SCALE and GL_DEPTH_BIAS,  
    while the stencil data is shifted and offset by the current  
    GL_INDEX_SHIFT and GL_INDEX_OFFSET.  The stencil data is also put  
    through the stencil-to-stencil pixel map.  
  
    glDrawPixels of GL_DEPTH_STENCIL_NV data operates similarly to that  
    of GL_STENCIL_INDEX data, bypassing the OpenGL fragment pipeline  
    entirely, unlike the treatment of GL_DEPTH_COMPONENT data.  The  
    stencil and depth masks are applied, as are the pixel ownership and  
    scissor tests, but all other operations are skipped.  
  
    glReadPixels of GL_DEPTH_STENCIL_NV data reads back a rectangle from  
    both the depth and stencil buffers.  
  
    glCopyPixels of GL_DEPTH_STENCIL_NV data copies a rectangle from  
    both the depth and stencil buffers.  Like glDrawPixels, it applies  
    both the stencil and depth masks but skips the remainder of the  
    OpenGL fragment pipeline.  
  
    glTex[Sub]Image[1,2,3]D of GL_DEPTH_STENCIL_NV data loads depth data  
    into a depth texture.  glGetTexImage of GL_DEPTH_STENCIL_NV data can  
    be used to retrieve depth data from a depth texture.  
  
homeprevnext Issues
  
    *   Depth data has a format of GL_DEPTH_COMPONENT, and stencil data  
        has a format of GL_STENCIL_INDEX.  So shouldn't the enumerant be  
        called GL_DEPTH_COMPONENT_STENCIL_INDEX_NV?  
  
        RESOLVED: No, this is fairly clumsy.  
  
    *   Should we support CopyPixels?  
  
        RESOLVED: Yes.  Right now copying stencil data means masking off  
        just the stencil bits, while copying depth data has strange  
        unintended consequences (fragment operations) and is difficult to  
        implement.  It is easy and useful to add CopyPixels support.  
  
    *   Should we support textures?  
  
        RESOLVED: Yes.  24-bit depth textures have no good format without  
        this extension.  
  
    *   Should the depth/stencil format support other standard types,  
        like GL_FLOAT or GL_UNSIGNED_INT?  
  
        RESOLVED: No, this extension is designed to be minimalist.  
        Supporting more types gains little because the new types will  
        just require data format conversions.  Our goal is to match the  
        native format of the buffer, not add broad new classes of  
        functionality.  
  
    *   Should the 24/8 format be supported for other formats, such as  
        LUMINANCE_ALPHA?  Should we support an 8/24 reversed format as  
        well?  
  
        RESOLVED: No and no, this adds implementation burden and gains us  
        little, if anything.  
  
    *   Does anything need to be written in the spec on the topic of  
        using GL_DEPTH_STENCIL_NV formats for glTexImage* or  
        glGetTexImage?  
  
        RESOLVED: No.  Since the SGIX_depth_texture extension spec was  
        never actually written (the additions to Section 3 are "XXX -  
        lots" and a few brief notes on how it's intended to work), it's  
        impossible to write what would essentially be amendments to that  
        spec.  
  
        However, it is worthwhile to mention here the intended behavior.  
        When downloading into a depth component texture, the stencil  
        indices are ignored, and when retrieving a depth component  
        texture, the stencil indices obtained from the texture are  
        undefined.  
  
    *   Should anything be said about performance?  
  
        RESOLVED: No, not in the spec.  However, common sense should  
        apply.  Apps should probably check that GL_DEPTH_BITS is 24 and  
        that GL_STENCIL_BITS is 8 before using either the new DrawPixels  
        or ReadPixels formats.  CopyPixels is probably safe regardless of  
        the size of either buffer.  The 24/8 format should probably only  
        be used with 24-bit depth textures.  
  
homeprevnext New Procedures and Functions
  
    None.  
  
homeprevnext New Tokens
  
    Accepted by the <format> parameter of DrawPixels, ReadPixels,  
    TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D,  
    TexSubImage3D, and GetTexImage, and by the <type> parameter of  
    CopyPixels:  
  
        DEPTH_STENCIL_NV                               0x84F9  
  
    Accepted by the <type> parameter of DrawPixels, ReadPixels,  
    TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D,  
    TexSubImage3D, and GetTexImage:  
  
        UNSIGNED_INT_24_8_NV                           0x84FA  
  
homeprevnext Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation)
  
    None.  
  
homeprevnext Additions to Chapter 3 of the OpenGL 1.2.1 Specification (Rasterization)
  
    Update the first paragraph on page 90 to say:  
  
    "... If the GL is in color index mode and <format> is not one of  
    COLOR_INDEX, STENCIL_INDEX, DEPTH_COMPONENT, or DEPTH_STENCIL_NV,  
    then the error INVALID_OPERATION occurs.  If <type> is BITMAP and  
    <format> is not COLOR_INDEX or STENCIL_INDEX then the error  
    INVALID_ENUM occurs.  If <format> is DEPTH_STENCIL_NV and <type> is  
    not UNSIGNED_INT_24_8_NV then the error INVALID_ENUM occurs.  Some  
    additional constraints on the combinations of <format> and <type>  
    values that are accepted is discussed below."  
  
    Add a row to Table 3.5 (page 91):  
  
      type Parameter                GL Type    Special  
      ------------------------------------------------  
      ...                           ...        ...  
      UNSIGNED_INT_2_10_10_10_REV   uint       Yes  
      UNSIGNED_INT_24_8_NV          uint       Yes  
  
    Add a row to Table 3.6 (page 92):  
  
      Format Name       Element Meaning and Order      Target Buffer  
      ------------------------------------------------------------------  
      ...               ...                            ...  
      DEPTH_COMPONENT   Depth                          Depth  
      DEPTH_STENCIL_NV  Depth and Stencil Index        Depth and Stencil  
      ...               ...                            ...  
  
    Add a row to Table 3.8 (page 94):  
  
      type Parameter               GL Type  Components  Pixel Formats  
      ------------------------------------------------------------------  
      ...                          ...      ...         ...  
      UNSIGNED_INT_2_10_10_10_REV  uint     4           RGBA,BGRA  
      UNSIGNED_INT_24_8_NV         uint     2           DEPTH_STENCIL_NV  
  
    Update the last paragraph on page 93 to say:  
  
    "Calling DrawPixels with a <type> of UNSIGNED_BYTE_3_3_2, ...,  
    UNSIGNED_INT_2_10_10_10_REV, or UNSIGNED_INT_24_8_NV is a special  
    case in which all the components of each group are packed into a  
    single unsigned byte, unsigned short, or unsigned int, depending on  
    the type."  
  
    Add the following diagram to Table 3.11 (page 97):  
  
    UNSIGNED_INT_24_8_NV  
  
       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 98):  
  
      Format           |  1st     2nd     3rd     4th  
      -----------------+-------------------------------  
      ...              |  ...     ...     ...     ...  
      BGRA             |  blue    green   red     alpha  
      DEPTH_STENCIL_NV |  depth   stencil N/A     N/A  
  
    Add the following paragraph to the end of the section "Conversion to  
    floating-point" (page 99):  
  
    "For groups of components that contain both standard components and  
    index elements, such as DEPTH_STENCIL_NV, the index elements are not  
    converted."  
  
    Update the last paragraph in the section "Conversion to Fragments"  
    (page 100) to say:  
  
    "... Groups arising from DrawPixels with a <format> of STENCIL_INDEX  
    or DEPTH_STENCIL_NV are treated specially and are described in  
    section 4.3.1."  
  
    Update the first paragraph of section 3.6.5 "Pixel Transfer  
    Operations" (pages 100-101) to say:  
  
    "The GL defines five kinds of pixel groups:  
  
       1. RGBA component: Each group comprises four color components:  
          red, green, blue, and alpha.  
       2. Depth component: Each group comprises a single depth component.  
       3. Color index: Each group comprises a single color index.  
       4. Stencil index: Each group comprises a single stencil index.  
       5. Depth/stencil: Each group comprises a depth component and a  
          stencil index."  
  
    Update the first paragraph in the section "Arithmetic on Components"  
    (page 101) to say:  
  
    "This step applies only to RGBA component and depth component groups  
    and the depth components in depth/stencil groups. ..."  
  
    Update the first paragraph in the section "Arithmetic on Indices"  
    (page 101) to say:  
  
    "This step applies only to color index and stencil index groups and  
    the stencil indices in depth/stencil groups. ..."  
  
    Update the first paragraph in the section "Stencil Index Lookup"  
    (page 102) to say:  
  
    "This step applies only to stencil index groups and the stencil  
    indices in depth/stencil groups. ..."  
  
homeprevnext Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment Operations and the Frame Buffer)
  
    Replace section 4.3.1 "Writing to the Stencil Buffer" (page 156) with  
    the following:  
  
    "4.3.1 Writing to the Stencil Buffer or to the Depth and Stencil  
    Buffers  
  
    The operation of DrawPixels was described in section 3.6.4, except if  
    the <format> argument was STENCIL_INDEX or DEPTH_STENCIL_NV.  In this  
    case, all operations described for DrawPixels take place, but window  
    (x,y) coordinates, each with the corresponding stencil index or depth  
    value and stencil index, are produced in lieu of fragments.  Each  
    coordinate-data pair is sent directly to the per-fragment operations,  
    bypassing the texture, fog, and antialiasing application stages of  
    rasterization.  Each pair is then treated as a fragment for purposes  
    of the pixel ownership and scissor tests; all other per-fragment  
    operations are bypassed.  Finally, each stencil index is written to  
    its indicated location in the framebuffer, subject to the current  
    setting of StencilMask, and if a depth component is present, if the  
    setting of DepthMask is not FALSE, it is also written to the  
    framebuffer; the setting of DepthTest is ignored.  
  
    The error INVALID_OPERATION results if there is no stencil buffer, or  
    if the <format> argument was DEPTH_STENCIL_NV, if there is no depth  
    buffer."  
  
    Add the following paragraph after the second paragraph of the  
    section "Obtaining Pixels from the Framebuffer" (page 158):  
  
    "If the <format> is DEPTH_STENCIL_NV, then values are taken from both  
    the depth buffer and the stencil buffer.  If there is no depth buffer  
    or if there is no stencil buffer, the error INVALID_OPERATION  
    occurs.  If the <type> parameter is not UNSIGNED_INT_24_8_NV, the  
    error INVALID_ENUM occurs."  
  
    Update the third paragraph on page 159 to say:  
  
    "If the GL is in RGBA mode, and <format> is one of RED, GREEN, BLUE,  
    ALPHA, RGB, RGBA, BGR, BGRA, LUMINANCE, or LUMINANCE_ALPHA, then red,  
    green, blue, and alpha values are obtained from the framebuffer  
  
    Update the first sentence of the section "Conversion of RGBA values"  
    (page 159) to say:  
  
    "This step applies only if the GL is in RGBA mode, and then only if  
    <format> is neither STENCIL_INDEX, DEPTH_COMPONENT, nor  
    DEPTH_STENCIL_NV."  
  
    Update the section "Conversion of Depth values" (page 159) to say:  
  
    "This step applies only if <format> is DEPTH_COMPONENT or  
    DEPTH_STENCIL_NV.  Each element taken from the depth buffer is taken  
    to be a fixed-point value in [0,1] with m bits, where m is the number  
    of bits in the depth buffer (see section 2.10.1)."  
  
    Add a row to Table 4.6 (page 160):  
  
      type Parameter         Index Mask  
      ---------------------------------  
      ...                    ...  
      INT                    2^31-1  
      UNSIGNED_INT_24_8_NV   2^8-1  
  
    Add the following paragraph to the end of the section "Final  
    Conversion" (page 160):  
  
    "For a depth/stencil pair, first the depth component is clamped to  
    [0,1].  Then the appropriate conversion formula from Table 4.7 is  
    applied to the depth component, while the index is masked by the  
    value given in Table 4.6 or converted to a GL float data type if the  
    <type> is FLOAT."  
  
    Add a row to Table 4.7 (page 161):  
  
      type Parameter                GL Type  Component Conversion ...  
      ------------------------------------------------------------------  
      ...                           ...      ...  
      UNSIGNED_INT_2_10_10_10_REV   uint     c = (2^N - 1)f  
      UNSIGNED_INT_24_8_NV          uint     c = (2^N - 1)f (depth only)  
  
    Update the second and third paragraphs of section 4.3.3 (page 162) to  
    say:  
  
    "<type> is a symbolic constant that must be one of COLOR, STENCIL,  
    DEPTH, or DEPTH_STENCIL_NV, indicating that the values to be  
    transfered are colors, stencil values, depth values, or depth/stencil  
    pairs, respectively. The first four arguments have the same  
    interpretation as the corresponding arguments to ReadPixels.  
  
    Values are obtained from the framebuffer, converted (if appropriate),  
    then subjected to the pixel transfer operations described in section  
    3.6.5, just as if ReadPixels were called with the corresponding  
    arguments.  If the <type> is STENCIL, DEPTH, or DEPTH_STENCIL_NV,  
    then it is as if the <format> for ReadPixels were STENCIL_INDEX,  
    DEPTH_COMPONENT, or DEPTH_STENCIL_NV, respectively.  If the <type> is  
    COLOR, then if the GL is in RGBA mode, it is as if the <format> were  
    RGBA, while if the GL is in color index mode, it is as if the  
    <format> were COLOR_INDEX."  
  
homeprevnext Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions)
  
    None.  
  
homeprevnext Additions to Chapter 6 of the OpenGL 1.2.1 Specification (State and State Requests)
  
    None.  
  
homeprevnext GLX Protocol
  
    None.  
  
homeprevnext Errors
  
    The error INVALID_ENUM is generated if DrawPixels or ReadPixels is  
    called where format is DEPTH_STENCIL_NV and type is not  
    UNSIGNED_INT_24_8_NV.  
  
    The error INVALID_OPERATION is generated if DrawPixels or ReadPixels  
    is called where type is UNSIGNED_INT_24_8_NV and format is not  
    DEPTH_STENCIL_NV.  
  
    The error INVALID_OPERATION is generated if DrawPixels or ReadPixels  
    is called where format is DEPTH_STENCIL_NV and there is not both a  
    depth buffer and a stencil buffer.  
  
    The error INVALID_OPERATION is generated if CopyPixels is called  
    where type is DEPTH_STENCIL_NV and there is not both a depth buffer  
    and a stencil buffer.  
  
homeprevnext New State
  
    None.  
  
homeprevnext Revision History
  
    August 22, 2001 - Fixed a small typo in the updates to Section 4.3.3.  
    August 22, 2001 - Fixed a small typo in the updates to Section 4.3.3.  
Valid XHTML 1.1! Valid CSS! Last update: November 14, 2006.
Cette page doit être lue avec un navigateur récent respectant le standard XHTML 1.1.