Name

    AMD_draw_buffers_blend

Name Strings

    GL_AMD_draw_buffers_blend

Contributors

    Mark Young
    Graham Sellers
    Timothy Lamb
    Pierre Boudier
    Nick Haemel

Contact

    Mark Young, AMD (mark.young 'at' amd.com)

Status

    In progress

Version

    Last Modified Date:         July 10, 2009
    Author Revision:            3

Number

    366

Dependencies

    The extension is written against the OpenGL 2.0 Specification.

    OpenGL 2.0 is required.

    EXT_draw_buffers2 is required.

Overview

    This extension builds upon the ARB_draw_buffers and EXT_draw_buffers2
    extensions. In ARB_draw_buffers (part of OpenGL 2.0), separate values
    could be written to each color buffer.  This was further enhanced by
    EXT_draw_buffers2 by adding in the ability to enable blending and to set
    color write masks independently per color output.

    This extension provides the ability to set individual blend equations and
    blend functions for each color output.

New Procedures and Functions

   void BlendFuncIndexedAMD(uint buf, enum src, enum dst);

   void BlendFuncSeparateIndexedAMD(uint buf, enum srcRGB, enum dstRGB,
                                    enum srcAlpha, enum dstAlpha);

   void BlendEquationIndexedAMD(uint buf, enum mode);

   void BlendEquationSeparateIndexedAMD(uint buf, enum modeRGB,
                                        enum modeAlpha);

New Tokens

    None.

Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)

    None.

Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)

    None.

Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment
Operations and the Frame Buffer)

    Modify the first two paragraphs of section 4.1.8 (Blending - Blending
    Equation), p206, to read as follows:

        "Blending is controlled by the blend equation.  This equation can be
        simultaneously set to the same value for all draw buffers using the
        commands:
    
           void BlendEquation(enum mode);
    
           void BlendEquationSeparate(enum modeRGB, enum modeAlpha);
    
        or for an individual draw buffer using the indexed versions of the
        same commands:
    
            void BlendEquationIndexedAMD(uint buf, enum mode);
    
            void BlendEquationSeparateIndexedAMD(uint buf
                                                 enum modeRGB,
                                                 enum modeAlpha);
    
        BlendEquationSeparate and BlendEquationSeparateIndexedAMD separate
        out the blend equations into an RGB argument and an Alpha argument.
        <modeRGB> determine the RGB blend function while <modeAlpha>
        determines the alpha equation.  BlendEquation and
        BlendEquationIndexedAMD control both the RGB and Alpha blend
        equations with a single argument <mode>.  <modeRGB> and <modeAlpha>
        must each be one of FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT,
        MIN_MAX, or LOGIC_OP.  BlendEquationIndexedAMD and
        BlendEquationSeparateIndexedAMD argument <buf> sets the blend
        equations for an individual draw buffer.  The blend equations for
        DRAW_BUFFERi are modified by passing i as the parameter <buf>."


    Modify the first two paragraphs of section 4.1.8 (Blending - Blending
    Functions), p207, to read as follows:

        "The weighting factors used by the blend equation are determined by
        the blend functions.  Blend functions are simultaneously specified for
        all draw buffers using the commands:

        void BlendFunc(enum src, enum dst);

        void BlendFuncSeparate(enum srcRGB, enum dstRGB,
                               enum srcAlpha, enum dstAlpha);

        or for an individual draw buffer using the indexed versions of the
        same commands:
    
            void BlendFuncIndexedAMD(uint buf, enum src, enum dst);
    
            void BlendFuncSeparateIndexedAMD(uint buf, enum srcRGB,
                                             enum dstRGB, enum srcAlpha,
                                             enum dstAlpha);
    
        BlendFuncSeparate and BlendFuncSeparateIndexedAMD arguments <srcRGB>
        and <dstRGB> determine the source and destination RGB blend functions,
        respectively, while <srcAlpha> and <dstAlpha> determine the source and
        destination alpha blend functions.  BlendFunc and BlendFuncIndexedAMD
        arguments <src> determines both RGB and alpha source functions, while
        <dst> determines both RGB and alpha destination functions.
        BlendFuncSeparateIndexedAMD and BlendFuncIndexedAMD argument <buf>
        sets the blend functions for an indivual draw buffer.  The blend
        functions for DRAW_BUFFERi are modified by passing i as the parameter
        <buf>."


    Modify the first paragraph of section 4.1.8 (Blending - Blending
    State), p209, to read as follows:

        "For each of n draw buffers, the state required for blending is two
        integers for the RGB and alpha blend equations, four integers
        indicating the source and destination RGB and alpha blending functions,
        four floating-point values to store the RGBA constant blend color, and
        a bit indicating whether blending is enabled or disabled.  For all draw
        buffers, the initial blend equations for RGB and alpha are both
        FUNC_ADD.  The initial blending functions for all draw buffers are ONE
        for the source RGB and alpha functions, and ZERO for the destination
        RGB and alpha functions.  For all draw buffers initial constant blend
        color is (R, G, B, A) = (0, 0, 0, 0).  Initially, blending is disabled
        for all draw buffers."

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.

Additions to Appendix A of the OpenGL 2.0 Specification (Invariance)

    None.

Additions to the AGL/GLX/WGL Specifications

    None.

Errors

    The error INVALID_ENUM is generated if the <buf> parameter of
    BlendFuncIndexedAMD, BlendFuncSeparateIndexedAMD, BlendEquationIndexedAMD,
    or BlendEquatioSeparateIndexedAMD is outside the range
    [0, MAX_DRAW_BUFFERS-1].

    The error INVALID_ENUM is generated by BlendFuncIndexedAMD
    if either <src>, or <dst> is not an accepted value.

    The error INVALID_ENUM is generated by BlendFuncSeparateIndexedAMD
    if either <srcRGB>, <dstRGB>, <srcAlpha>, or <dstAlpha> is not
    an accepted value.

    The error INVALID_ENUM is generated if the <mode> parameter of
    BlendEquationIndexedAMD is not one of FUNC_ADD, FUNC_SUBTRACT,
    FUNC_REVERSE_SUBTRACT, MAX, or MIN.

    The error INVALID_ENUM is generated if either the <modeRGB> or <modeAlpha>
    parameter of BlendEquationSeparateIndexedAMD is not one of
    FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, MAX, or MIN.

    The error INVALID_OPERATION is generated if any of these new entry-points
    are executed between the execution of glBegin and the corresponding
    execution of glEnd.

New State

    Modify (table 6.20, p281), modifying the entries for BLEND_SRC_RGB,
    BLEND_SRC_ALPHA, BLEND_DST_RGB, BLEND_DST_ALPHA, BLEND_EQUATION_RGB,
    and BLEND_EQUATION_ALPHA and adding new indexed versions as well.


    Get Target               Type Get Command           Initial Value  Description                                     Section       Attribute
    ----------               ---- --------------------- -------------- ----------------------------------------------- ------- -------------------
    BLEND_SRC_RGB            Z15  GetIntegerv           ONE            Blending source RGB function for draw buffer 0  4.1.8   color-buffer
      (v1.3:BLEND_SRC)

    BLEND_SRC_RGB            Z15  GetIntegerIndexedvEXT ONE            Blending source RGB function for draw buffer i  4.1.8   color-buffer
      (v1.3:BLEND_SRC)                                                 where i is specified as <buf>

    BLEND_SRC_ALPHA          Z15  GetIntegerv           ONE            Blending source A function for draw buffer 0    4.1.8   color-buffer

    BLEND_SRC_ALPHA          Z15  GetIntegerIndexedvEXT ONE            Blending source A function for draw buffer i    4.1.8   color-buffer
                                                                        where i is specified as <buf>

    BLEND_DST_RGB            Z14  GetIntegerv           ZERO           Blending dest. RGB function for draw buffer 0   4.1.8   color-buffer
      (v1.3:BLEND DST)

    BLEND_DST_RGB            Z14  GetIntegerIndexedvEXT ZERO           Blending dest. RGB function for draw buffer i   4.1.8   color-buffer
      (v1.3:BLEND DST)                                                  where i is specified as <buf>

    BLEND_DST_ALPHA          Z14  GetIntegerv           ZERO           Blending dest. A function for draw buffer 0     4.1.8   color-buffer

    BLEND_DST_ALPHA          Z14  GetIntegerIndexedvEXT ZERO           Blending dest. A function for draw buffer i     4.1.8   color-buffer
                                                                        where i is specified as <buf>

    BLEND_EQUATION_RGB       Z5   GetIntegerv           FUNC_ADD       RGB blending equation for draw buffer 0         4.1.8   color-buffer
      (v1.5: BLEND EQUATION)

    BLEND_EQUATION_RGB       Z5   GetIntegerIndexedvEXT FUNC_ADD       RGB blending equation for draw buffer i         4.1.8   color-buffer
      (v1.5: BLEND EQUATION)                                            where i is specified as <buf>

    BLEND_EQUATION_ALPHA     Z5   GetIntegerv           FUNC_ADD       Alpha blending equation for draw buffer 0       4.1.8   color-buffer

    BLEND_EQUATION_ALPHA     Z5   GetIntegerIndexedvEXT FUNC_ADD       Alpha blending equation for draw buffer i       4.1.8   color-buffer
                                                                        where i is specified as <buf>

Issues

    1.  What should we call this?

        PROPOSED: Suggestions currently are
             AMD_draw_buffers_blend
             AMD_drawbuffers_blend
             AMD_mrt_blend


    2.  Should this be an AMDX extension or just AMD?

        PROPOSED: We propose AMD since the functionality currently exists in
        DX 10.1 and is used by developers in that API.


    3.  What effect does using the non-indexed versions of the blend function
        or equation entry-points have upon the new indexed per draw buffer
        versions?

        RESOLVED: Similar to the way EXT_draw_buffers2 handles the indexed
        and non-indexed ColorMask interaction in issue 3.  The non-indexed
        versions of the functions will set all buffers to the passed in
        parameters.

        For example, BlendFunc will set all color buffer blend functions to
        the values passed in.

    4.  Should the new functions be ---Indexed (as in EXT_draw_buffers2) or
        ---i (as in OpenGL 3.0 core)?

        RESOLVED: For consistency with EXT_draw_buffers2, leave them as
        ---Indexed. If this functionality is promoted to core in a later
        version of OpenGL, they can be changed to ---i.

Revision History

    #3, July 10, 2009: Jon Leech
	Assign extension number, minor formatting cleanup for registry.

    #2, March 26, 2009: myoung
        Tightened up language. Resolved some issues.

    #1, March 25, 2009: myoung
        Internal spec development.
