Name

    AMD_shader_stencil_value_export

Name Strings

    GL_AMD_shader_stencil_value_export

Contact

    Graham Sellers, AMD (graham.sellers 'at' amd.com)

Status

    Shipping

Version

    Last Modified Date:         12/12/2013
    Author Revision:            2

Number

    OpenGL Extension #444

Dependencies

    OpenGL 2.0 or ARB_fragment_shader is required.

    The AMD_shader_stencil_export extension affects the definition of this
    extension.

    The AMD_stencil_operation_extended extension is required.

    This extension is written against the OpenGL Shading Language (GLSL)
    Specification, Version 4.00.7.

Overview

    OpenGL includes stencil testing functionality that allows an application
    specified value (the reference value) to be compared against the content
    of a stencil buffer and fragments kept or discarded based on the results
    of this test. In addition to updating the stencil buffer with simple
    operations such as inversion or incrementation, this reference value may be
    written directly into the stencil buffer.

        AMD_stencil_operation_extended further extended the number of
    operations that may be performed on the stencil buffer to include logical
    and arithmetic operations. It also introduced new state, the stencil
    operation source value, to allow these new operations to be performed on
    the stencil buffer using an application supplied constant value as a source
    value, rather than the reference value used in the stencil test.

        The AMD_shader_stencil_export extension allowed the reference value
    used for the stencil test to be generated and exported from a fragment
    shader. This extension provides similar functionality for the stencil
    operation source value, allowing it to be generated in and exported from
    the fragment shader too.

IP Status

    None.

New Procedures and Functions

    None.

New Tokens

    None.

Modifications to the OpenGL 4.0 (Core Profile) Specification

    None.

Modifications to Chapter 3 of the OpenGL Shading Language Specification,
Version 4.00.7

    Add new Section 3.3.x, GL_AMD_shader_stencil_value_export Extension, p.15

    3.3.x GL_AMD_shader_stencil_value_export

    To use the GL_AMD_shader_stencil_value_export extension in a shader it must
    be enabled using the #extension directive.

    The shading language preprocessor #define GL_AMD_shader_stencil_value_export
    will be defined to 1 if the GL_AMD_shader_stencil_value_export extension is
    supported.

Modifications to Chapter 7 of the OpenGL Shading Language Specification,
Version 4.00.7 (Built-in Variables)

    Modify Section 7.1, "Built-in Language Variables":

    Add to the list of built-in special variables for the fragment language,
    p.86:

        out int gl_FragStencilValueAMD;

    Insert the following paragraph, after the paragraph describing
    gl_FragStencilRefAMD (as introduced by AMD_shader_stencil_export) on p.89:

    Writing to gl_FragStencilValueAMD will establish the stencil operation
    source value for the fragment being processed. Only the least significant
    STENCIL_BITS bits of the integer gl_FragStencilValueAMD are considered and
    higher order bits are discarded. If stencil buffering is enabled and no
    shader writes to gl_FragStencilValueAMD, the fixed function value for
    stencil operation source will be used as the fragment's stencil operation
    source value. If a shader statically assignes a value to
    gl_FragStencilValueAMD, and there is an execution path through the shader
    that does not set gl_FragStencilValueAMD, then the value of the fragment's
    stencil operation source value may be undefined for executions of the
    shader that take that path. That is, if the set of linked shaders
    statically contain a write to gl_FragStencilValueAMD, then it is
    responsible for always writing it.

    Modify the paragraph on p.89, describing the 'discard' keyword:

    If a shader executes the discard keyword, the fragment is discarded, and
    the values of any user-defined fragment outputs, gl_FragDepth,
    gl_FragStencilRefAMD, and gl_FragStencilValueAMD become irrelevant.

Additions to the AGL/GLX/WGL Specifications

    None.

GLX Protocol

    None.

Errors

    None.

New State

    None.

New Implementation Dependent State

    None.

Dependencies on AMD_shader_stencil_export

    If AMD_shader_stencil_export is not supported, remove all references to
    gl_FragStencilRefAMD.

Issues

    1) What is the behavior of gl_FragStencilValueAMD with respect to masks,
       significant bits and so on?

    The behavior of the value written to gl_FragStencilValueAMD is the same
    as that of the fixed function value set through glStencilOpValueAMD. That
    is, the value is not masked until the result of the operation is written
    to the stencil buffer. Bits that cannot be represented by the stencil
    buffer are simply discarded.

Revision History

    Rev.    Date      Author    Changes
    ----  ----------  --------  -----------------------------------------
    2     12/12/2013  gsellers  Minor cleanup ready for posting.
    1     06/10/2010  gsellers  Initial revision
