Name

    AMD_framebuffer_multisample_advanced

Name Strings

    GL_AMD_framebuffer_multisample_advanced

Contact

    Marek Olsak, AMD (marek.olsak 'at' amd.com)

Status

    Complete.

Version

    Last Modified Date:  June 28, 2018
    Revision #1

Number

    OpenGL Extension #523
    OpenGL ES Extension #303

Dependencies

    OpenGL dependencies:

        Requires GL_ARB_framebuffer_object.

    OpenGL ES dependencies:

        Requires OpenGL ES 3.0.

    This extension is written against the OpenGL 4.5 (Core Profile)
    specification.

Overview

    This extension extends ARB_framebuffer_object by allowing compromises
    between image quality and memory footprint of multisample
    antialiasing.

    ARB_framebuffer_object introduced RenderbufferStorageMultisample
    as a method of defining the parameters for a multisample render
    buffer. This function takes a <samples> parameter that has strict
    requirements on behavior such that no compromises in the final image
    quality are allowed. Additionally, ARB_framebuffer_object requires
    that all framebuffer attachments have the same number of samples.

    This extension extends ARB_framebuffer_object by providing a new
    function, RenderbufferStorageMultisampleAdvancedAMD, that
    distinguishes between samples and storage samples for color
    renderbuffers where the number of storage samples can be less than
    the number of samples. This extension also allows non-matching sample
    counts between color and depth/stencil renderbuffers.

    This extension does not require any specific combination of sample
    counts to be supported.

IP Status

    No known IP issues.

New Procedures and Functions

    void RenderbufferStorageMultisampleAdvancedAMD(
             enum target, sizei samples, sizei storageSamples,
             enum internalformat, sizei width, sizei height );

    void NamedRenderbufferStorageMultisampleAdvancedAMD(
             uint renderbuffer, sizei samples, sizei storageSamples,
             enum internalformat, sizei width, sizei height );

New Tokens

    Accepted by the <pname> parameter of GetRenderbufferParameteriv:

        RENDERBUFFER_STORAGE_SAMPLES_AMD            0x91B2

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
    GetInteger64v, GetFloatv, GetDoublev:

        MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD           0x91B3
        MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD   0x91B4
        MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD   0x91B5
        NUM_SUPPORTED_MULTISAMPLE_MODES_AMD         0x91B6
        SUPPORTED_MULTISAMPLE_MODES_AMD             0x91B7

Additions to Chapter 9 of the OpenGL 4.5 (Core Profile) Specification
(Framebuffers and Framebuffer Objects)

    In section 9.2.3.1, "Multisample Queries", remove the last paragraph
    beginning with "Otherwise" and add:

    Otherwise, the value of SAMPLES is equal to the value of
    RENDERBUFFER_SAMPLES or TEXTURE_SAMPLES (depending on the type of
    attachments) of color attachments if any is present. If there is no
    color attachment, SAMPLES is equal to the same value from the depth or
    stencil attachment, whichever is present.

    An implementation may only support a subset of the possible
    combinations of sample counts of textures and renderbuffers attached
    to a framebuffer object. The number of supported combinations is
    NUM_SUPPORTED_MULTISAMPLE_MODES_AMD. SUPPORTED_MULTISAMPLE_MODES_AMD
    is an array of NUM_SUPPORTED_MULTISAMPLE_MODES_AMD triples of integers
    where each triple contains a valid combination of sample counts in
    the form {color samples, color storage samples, depth and stencil
    samples}. The first element in each triple is at least 2. The second
    and third element in each triple are at least 1 and are not greater
    than the first element.

    In section 9.2.4, "Renderbuffer Objects", replace the description of
    (Named)RenderbufferStorageMultisample:

    The data storage, format, dimensions, number of samples, and number of
    storage samples of a renderbuffer object’s image are established with
    the commands

      void RenderbufferStorageMultisampleAdvancedAMD( enum target,
          sizei samples, sizei storageSamples, enum internalformat,
          sizei width, sizei height );

      void NamedRenderbufferStorageMultisampleAdvancedAMD(
          uint renderbuffer, sizei samples, sizei storageSamples,
          enum internalformat, sizei width, sizei height );

    For RenderbufferStorageMultisampleAdvancedAMD, the renderbuffer object
    is that bound to <target>, which must be RENDERBUFFER.
    For NamedRenderbufferStorageMultisampleAdvancedAMD, <renderbuffer> is
    the name of the renderbuffer object.

    <internalformat> must be color-renderable, depth-renderable, or
    stencil-renderable (as defined in section 9.4). <width> and <height>
    are the dimensions in pixels of the renderbuffer.

    Upon success, *RenderbufferStorageMultisampleAdvancedAMD deletes any
    existing data store for the renderbuffer image, and the contents of
    the data store are undefined. RENDERBUFFER_WIDTH is set to <width>,
    RENDERBUFFER_HEIGHT is set to <height>, and RENDERBUFFER_INTERNAL_-
    FORMAT is set to <internalformat>.

    If <samples> is zero, then <storageSamples> must be zero, and
    RENDERBUFFER_SAMPLES and RENDERBUFFER_STORAGE_SAMPLES_AMD are set to
    zero. Otherwise <samples> represents a request for a desired minimum
    number of samples and <storageSamples> represents a request for
    a desired minimum number of storage samples, where <storageSamples>
    must not be greater than <samples>. Since different implementations
    may support different sample counts for multisampled rendering,
    the actual number of samples and the actual number of storage samples
    allocated for the renderbuffer image are implementation-dependent.
    However, the resulting value for RENDERBUFFER_SAMPLES is guaranteed
    to be greater than or equal to <samples> and no more than the next
    larger sample count supported by the implementation, and the resulting
    value for RENDERBUFFER_STORAGE_SAMPLES_AMD is guaranteed to be greater
    than or equal to <storageSamples>, no more than the next larger
    storage sample count supported by the implementation, and no more than
    RENDERBUFFER_SAMPLES.

    A GL implementation may vary its allocation of internal component
    resolution based on any *RenderbufferStorageMultisampleAdvancedAMD
    parameter (except <target> and <renderbuffer>), but the allocation and
    chosen internal format must not be a function of any other state and
    cannot be changed once they are established.

    Remove the first 4 errors and add these errors:

    An INVALID_ENUM error is generated by RenderbufferStorageMultisample-
    AdvancedAMD if <target> is not RENDERBUFFER.

    An INVALID_OPERATION error is generated by NamedRenderbufferStorage-
    MultisampleAdvancedAMD if <renderbuffer> is not the name of
    an existing renderbuffer object.

    An INVALID_VALUE error is generated if <samples>, <storageSamples>,
    <width>, or <height> is negative.

    An INVALID_OPERATION error is generated if <internalformat> is a color
    format and <samples> is greater than the implementation-dependent
    limit MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD.

    An INVALID_OPERATION error is generated if <internalformat> is a color
    format and <storageSamples> is greater than the implementation-
    dependent limit MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD.

    An INVALID_OPERATION error is generated if <storageSamples> is greater
    than <samples>.

    An INVALID_OPERATION error is generated if <internalformat> is a depth
    or stencil format and <samples> is greater than the maximum number of
    samples supported for <internalformat> (see GetInternalformativ
    in section 22.3).

    An INVALID_OPERATION error is generated if <internalformat> is a depth
    or stencil format and <storageSamples> is not equal to <samples>.

    Finish the section as follows:

    The commands

        void RenderbufferStorageMultisample( enum target,
            sizei samples, enum internalformat, sizei width,
            sizei height );
        void RenderbufferStorage( enum target, enum internalformat,
            sizei width, sizei height );

    are equivalent to

        RenderbufferStorageMultisampleAdvancedAMD(target, samples,
            samples, internalformat, width, height);

    and

        RenderbufferStorageMultisampleAdvancedAMD(target, 0, 0,
            internalformat, width, height);

    respectively.

    The commands

        void NamedRenderbufferStorageMultisample( uint renderbuffer,
            sizei samples, enum internalformat, sizei width,
            sizei height );
        void NamedRenderbufferStorage( uint renderbuffer,
            enum internalformat, sizei width, sizei height );

    are equivalent to

        NamedRenderbufferStorageMultisampleAdvancedAMD(renderbuffer,
            samples, samples, internalformat, width, height);

    and

        NamedRenderbufferStorageMultisampleAdvancedAMD(renderbuffer,
            0, 0, internalformat, width, height);

    respectively.

    In section 9.2.5, "Required Renderbuffer Formats", replace the last
    paragraph with:

    Implementations must support creation of renderbuffers in these
    required formats with sample counts up to and including:
    * MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD as color renderbuffer samples
    * MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD as color renderbuffer
      storage samples
    * MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD as depth and stencil
      samples

    with the exception that the signed and unsigned integer formats are
    required only to support creation of renderbuffers with up to
    the value of MAX_INTEGER_SAMPLES samples and storage samples, which
    must be at least one.

    In section 9.2.6, "Renderbuffer Object Queries", replace the paragraph
    mentioning RENDERBUFFER_SAMPLES with:

    If <pname> is RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT,
    RENDERBUFFER_INTERNAL_FORMAT, RENDERBUFFER_SAMPLES, or
    RENDERBUFFER_STORAGE_SAMPLES_AMD then <params> will contain the width
    in pixels, height in pixels, internal format, number of samples, or
    number of storage samples, respectively, of the image of
    the renderbuffer object.

    In section 9.4.1, "Framebuffer Attachment Completeness", remove
    the bullet beginning with "If <image> has multisample samples" and
    replace the last 3 bullets about <attachment> with:

    If <attachment> is COLOR_ATTACHMENTi, then <image> must have a color-
    renderable internal format, the sample count must be less than or
    equal to the value of the implementation-dependent limit
    MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD, and the storage sample count must
    be less than or equal to the value of the implementation-dependent
    limit MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD.

    If <attachment> is DEPTH_ATTACHMENT, then <image> must have a depth-
    renderable internal format, and its sample count must be less than or
    equal to the value of the implementation-dependent limit
    MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD.

    If <attachment> is STENCIL_ATTACHMENT, then <image> must have
    a stencil-renderable internal format, and its sample count must be
    less than or equal to the value of the implementation-dependent limit
    MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD.

    In section 9.4.2, replace the bullet mentioning RENDERBUFFER_SAMPLES
    with:

    * The value of RENDERBUFFER_SAMPLES of a color attachment defines its
    <number of color samples>; the value of RENDERBUFFER_STORAGE_SAMPLES
    of a color attachment defines its <number of color storage samples>;
    the value of RENDERBUFFER_SAMPLES of a depth or stencil attachment
    defines its <number of depth-stencil samples> for each separately;
    the value of TEXTURE_SAMPLES of a color attachment defines both its
    <number of color samples> and its <number of color storage samples>;
    the value of TEXTURE_SAMPLES of a depth or stencil attachment defines
    its <number of depth-stencil samples> for each separately. If any of
    the defined values is 0, it is treated as 1. Any undefined value is
    treated as equal to any number. For all attachment values that are
    defined, all values of <number of color samples> must be equal, all
    values of <number of color storage samples> must be equal, all values
    of <number of depth-stencil samples> must be equal, and the triple
    {<number of color samples>, <number of color storage samples>, <number
    of depth-stencil samples>} must be in SUPPORTED_MULTISAMPLE_MODES_AMD
    or must be equal to {1, 1, 1}.

    { FRAMEBUFFER_INCOMPLETE_MULTISAMPLE }

Additions to Chapter 17 of the OpenGL 4.5 (Core Profile) Specification
(Writing Fragments and Samples to the Framebuffer)

    In section 17.3.10, "Additional Multisample Fragment Operations", add
    this paragraph after the "If MULTISAMPLE is enabled" paragraph:

    If there are fewer color storage samples (see section 9.2.4) than
    the value of SAMPLES, the number of color storage samples determines
    the number of unique color values that can be stored per pixel.
    The implementation must determine which samples within a pixel share
    the same color value, write that value into 1 color storage sample,
    and remember a mapping between color samples and color storage
    samples to be able to map color storage samples back to color samples.
    The color value equality determination is done in an implementation-
    specific manner, but the implementation must at least recognize a set
    of color samples coming from the same primitive as 1 storage sample if
    sample shading (see section 14.3.1.1) is disabled. If there are not
    enough color storage samples per pixel to store all incoming color
    values, the excessive color values are not stored and the color samples
    with unstored values are marked as having an unknown value. Color
    samples with an unknown value will not contribute to the final color
    value of the pixel when all color samples are resolved by
    BlitFramebuffer (see section 18.3.1).

    If there are fewer depth and stencil samples than the value of SAMPLES
    and implementation-specific optimizations are unable to represent more
    depth and stencil samples within the given storage, the missing depth
    and stencil values should be pulled from or derived from the nearest
    existing depth and stencil samples within the same pixel. The mapping
    from missing to existing depth and stencil samples is implementation-
    specific, but the mapping must be at least:
    * injective if missing samples < existing samples
    * bijective if missing samples = existing samples
    * surjective if missing samples > existing samples
    Depth and stencil tests operate as if the number of depth and stencil
    samples was equal to the value of SAMPLES.

Errors

    An INVALID_ENUM error is generated by RenderbufferStorageMultisample-
    AdvancedAMD if <target> is not RENDERBUFFER.

    An INVALID_OPERATION error is generated by NamedRenderbufferStorage-
    MultisampleAdvancedAMD if <renderbuffer> is not the name of
    an existing renderbuffer object.

    An INVALID_VALUE error is generated if <samples>, <storageSamples>,
    <width>, or <height> is negative.

    An INVALID_OPERATION error is generated if <internalformat> is a color
    format and <samples> is greater than the implementation-dependent
    limit MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD.

    An INVALID_OPERATION error is generated if <internalformat> is a color
    format and <storageSamples> is greater than the implementation-
    dependent limit MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD.

    An INVALID_OPERATION error is generated if <storageSamples> is greater
    than <samples>.

    An INVALID_OPERATION error is generated if <internalformat> is a depth
    or stencil format and <samples> is greater than the maximum number of
    samples supported for <internalformat> (see GetInternalformativ
    in section 22.3).

    An INVALID_OPERATION error is generated if <internalformat> is a depth
    or stencil format and <storageSamples> is not equal to <samples>.

New State

    Add to Table 23.27, "Renderbuffer (state per renderbuffer object)"
                                                                        Initial
    Get Value                         Type  Get Command                 Value    Description             Section
    --------------------------------  ----  --------------------------  -------  ----------------------  -------
    RENDERBUFFER_STORAGE_SAMPLES_AMD   Z+   GetRenderbufferParameteriv  0        No. of storage samples  9.2.4

New Implementation Dependent Values
                                                                       Minimum
    Get Value                                 Type        Get Command  Value    Description                             Section
    ----------------------------------------  ----------  -----------  -------  ---------------------------------------  -------
    MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD             Z+      GetIntegerv  4        Max. no. of color samples supported by   9.2.4
                                                                                framebuffer objects.
    MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD     Z+      GetIntegerv  4        Max. no. of color storage samples        9.2.4
                                                                                supported by framebuffer objects.
    MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD     Z+      GetIntegerv  4        Max. no. of depth and stencil samples    9.2.4
                                                                                supported by framebuffer objects.
    NUM_SUPPORTED_MULTISAMPLE_MODES_AMD           Z+      GetIntegerv  1        No. of supported combinations of color   9.2.4
                                                                                samples, color storage samples, and
                                                                                depth-stencil samples by framebuffer
                                                                                objects.
    SUPPORTED_MULTISAMPLE_MODES_AMD           n * 3 x Z+  GetIntegerv  -        NUM_SUPPORTED_MULTISAMPLE_MODES_AMD (n)  9.2.4
                                                                                triples of integers. Each triple is
                                                                                a unique combination of color samples,
                                                                                color storage samples, and depth-stencil
                                                                                samples supported by framebuffer objects.

AMD Implementation Details

    The following multisample modes are supported by AMD's open source
    OpenGL driver:

                 Color    Depth &
        Color    storage  stencil
        samples  samples  samples
        =======  =======  =======
        16       8        8
        16       4        8
        16       2        8
        16       4        4
        16       2        4
        16       2        2
        -------  -------  -------
        8        8        8
        8        4        8
        8        2        8
        8        4        4
        8        2        4
        8        2        2
        -------  -------  -------
        4        4        4
        4        2        4
        4        2        2
        -------  -------  -------
        2        2        2

Issues

    None.

Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------  --------------------------------------------
     1    06/28/18  mareko    Initial version
