Name

    SGIS_shared_multisample

Name Strings

    GL_SGIS_shared_multisample
    GLX_SGIS_shared_multisample

Version

    $Date: 1997/10/29 20:41:07 $ $Revision: 1.2 $

Number

    143

Dependencies

    GL_SGIS_multisample and GLX_SGIS_multisample are required

Overview

    While the OpenGL multisample extension (SGIS_multisample) provides
    good out-of-order antialiasing via subpixel samples, multisample
    hardware is very expensive because it multiplies the per-pixel
    framebuffer memory required to maintain color, depth, and stencil
    state by the number of samples.

    The cost-sensitive Location Based Entertainment (LBE) market
    desires good quality antialiasing, but the cost of maintaining
    multisample memory for every pixel in the framebuffer managed area
    is often prohibitive.  Low-end multi-channel visual simulation may
    have similar cost constraints.

    LBE applications typically render several channels that are output
    to different video display devices.  For example, an LBE
    application may render four 800x600 resolution channels, one per
    game player.  While the total managed area may be 1600x1200, each
    channel ends up being rendered serially.  With traditional
    multisampling (as specified by SGIS_multisample), multisample
    memory must be retained across the entire 1600x1200 managed area
    though in fact the application is never using more than an 800x600
    rectangle of multisample pixel state at any given time.

    This sharing of multisample framebuffer state can result in a
    substantial competitive advantage for high-end multi-channel
    multisampling hardware for LBE applications.  Unlike a "cheap PC
    per seat" solution, a high-end solution can be amortized by sharing
    both texture and multisample memory between the multiple channels
    (as well as host resources such as disk and CPUs).  For cheap PCs
    to have the same amount of texture memory and quality of
    antialiasing, texture and multisample memory have to be replicated
    in every PC.

    In a typical windowed environment, the entire framebuffer managed
    area must retain multisample state because windows can be moved
    dynamically and resized (up to the entire size of the managed
    area).  For LBE applications though, the layout of channel
    subrectangles in the framebuffer managed area is static and the
    LBE application monopolizes the graphics device (no other
    concurrent windowed apps).  Because of their channel-oriented,
    dedicated, cost-sensitive nature, LBE applications can benefit from
    a means to share the available multisample memory resources among
    all the channels.

    The SGIS_shared_multisample extension specifies a single
    multisample buffer subrectangle sized smaller than the total
    managed area that is both shared among multiple windows and
    repositionable within in a window.

    Use of the SGIS_shared_multisample extension is predicated on
    specially configuring the window system, typically via a command
    line option added to the window system server's startup command.
    When run in this mode, OpenGL applications will see the
    GL_SGIS_shared_multisample string advertised in the GL_EXTENSIONS
    string (along with the GL_SGIS_multisample string).  In this mode,
    the behavior of multisample extension changes.  Instead of the
    multisample buffer memory being retained per-pixel across the
    entire managed area, multisample memory is shared among multisample
    windows and repositionable within a multisample window.

    Switching windows or repositioning the multisample subrectangle
    will make undefined the shared state within the multisample, depth,
    stencil, and accumulation buffers.

    When rendering into a multisample window, fragments that fall
    outside the window's multisample subrectangle are discarded
    (scissored).  By default, the window's multisample rectangle is
    positioned at its window origin.

Issues

    *  As part of the pixel ownership test, when doing a ReadPixels,
       CopyPixels, CopyTexImage, or CopySubTexImage operation, are the
       sourced color pixels undefined if they are outside the
       multisample subrectangle, but otherwise would pass the pixel
       ownership test?  NO, such pixel read/copies should be DEFINED.

       This behavior is justified because the resolved color buffer is
       available for copying outside the multisample subrectangle, just
       not the multisample, depth, stencil, or accumulation buffer
       values.  LBE applications will likely find it useful to copy
       rendering results from the first channel into the others.  For
       example, copying a radar view shared among all the players into
       each channel.

       Note that copies or reads of depth or stencil (or multisamples
       or accumulation buffer contents if such contents were actually
       readable) will NOT be expected to be defined.

       The specification additions below only amend this with respect
       to ReadPixels, but other language in the 4.3.3 "Copying Pixels"
       and 3.8 "Texturing, Alternative Texture Image Specification
       Commands" sections imply that CopyPixels, CopyTexImage2D, and
       CopyTexImage1D will also not include scissoring against the
       multisample subrectangle as part of the pixel ownership test
       when sourcing from color buffers (not depth or stencil though).
       This is because these other operations read pixels as specified
       by the ReadPixels operation.

    *  Should the accumulation buffer be associated with the the
       multisample subrectangle, or should the accumulation buffer be
       retained (as are the color buffers) for pixels not within the
       multisample subrectangle?  If an accumulation buffer exists, it
       should be SHARED like the multisample buffer.

       This behavior is justified because accumulation buffers are big
       and expensive just like multisample buffers.  LBE apps still may
       want to use the accumulation buffer for motion blur or depth of
       field.  Like the multisample buffer, the accumulation buffer
       should be shared and retained only within the multisample
       subrectangle.

    *  What about auxiliary buffers?  Does the same logic for
       accumulation buffers apply?  UNRESOLVED.  This specification is
       currently written to assume that an auxiliary buffer is a color
       buffer and is not shared.

    *  If multiple GL clients must use framebuffers with a shared
       multisample subrectangle, how can they guarantee reliable
       rendering results?  WITH GLFLUSH.  Keep rendering temporally
       distinct with glFlush issued before rendering thread switches.

    *  Does it make sense for hardware to advertise more than one
       multisample subrectangle?  NO.  It would justified if you had
       two parallel command streams updating distinct channels since
       two channels would be rendering in parallel.  But if this was
       the case (thinking in the context of LBE applications), it
       probably makes more sense simply to have two distinct pipes.
       That's cheaper than trying to support a single pipe with
       parallel rendering streams, plus the channels are rendering
       independently (via screen space subdivision) anyway.

    *  Can you clear a window using a shared multisample buffer
       outside the multisample subrectangle?  NO.

       glClear is controlled by the pixel ownership test and if a
       fragment is not within the multisample subrectangle, it cannot
       pass the pixel ownership test when using a multisample
       subrectangle.

    *  What happens if you run a traditional (existing) multisample
       application on a window system advertising the shared
       multisample extension?  VERY UNSIGHTLY FRAME BUFFER FIGHTING.

       The app runs, but its multisample rendering will be constrained
       to the multisample subrectangle.  Multiple concurrent apps using
       multisampling will "fight" for their use of the shared
       multisample rectangle.

       The expectation is that you only configure a window system
       server to support shared multisample mode when running a single
       dedicated LBE-style channel API.  Note that you can still run
       non-multisampled windowed apps just fine concurrently with a
       shared multisample app.

    *  As written, this extension CHANGES the semantics of the
       existing GL_SGIS_multisample extension.  Should this new
       extension use a GLX attribute distinct from the one used by the
       GLX_SGIS_multisample extension?  NO.

       Users have to specially configure their window system server to
       get the special overloaded sharing behavior.  Plus LBE
       applications monopolize the system anyway.

       The advantage of overloading the existing multisample GLX
       attributes is that 3D toolkits (IRIS Performer, OpenGL++, OpenGL
       Optimizer) and multisample apps themselves won't have to be
       specially tweaked to try them out using the shared multisample
       mode.

    *  Can a single window system server be configured to advertise
       an 8 sample shared multisample framebuffer configuration and an
       4 sample shared multisample framebuffer configuration?  YES,
       the extension would allow such a case to be advertised.

       The idea would be perhaps the 4 sample shared multisample
       configuration could have a large width and height than the more
       memory intensive 8 sample shared multisample configuration.

    *  Both a GLX and GL extension?  YES.  The multisample subrectangle
       dimensions can be advertised for X visuals before actually
       creating an actual window.  Also allows different numbers of
       samples to be advertised (see above).

New Procedures and Functions

    void glMultisampleSubRectPosSGIS(GLint x,
				     GLint y);

New Tokens

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

	MULTISAMPLE_SUB_RECT_POSITION_SGIS
	MULTISAMPLE_SUB_RECT_DIMS_SGIS

    Accepted by the <attrib> parameter of glXGetConfig, and by the
    <attrib_list> parameter of glXChooseVisual: 

        GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS   0x8026
        GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS  0x8027

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

    None

Additions to Chapter 3 of the 1.1 Specification (Rasterization)

    None

Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations and
the Framebuffer)

    Section 4.1.1 (Pixel Ownership Test) is augmented as follows:

    4.1.1.x  "Scissoring to the Multisample Subrectangle"

    The value of MULTISAMPLE_SUB_RECT_DIMS_SGIS is an implementation
    dependent constant, and is queried by calling GetIntegerv with
    <pname> set to MULTISAMPLE_SUB_RECT_DIMS_SGIS.
    MULTISAMPLE_SUB_RECT_DIMS_SGIS specifies the width and height of
    the multisample subrectangle.  Neither the
    MULTISAMPLE_SUB_RECT_DIMS_SGIS width or height should be greater
    than zero if SAMPLE_BUFFERS_SGIS is zero.

    If SAMPLE_BUFFERS_SGIS is one and the
    MULTISAMPLE_SUB_RECT_DIMS_SGIS width and height are both greater
    than zero, the pixel ownership test is augmented to also discard
    fragments not within the multisample subrectangle.  Otherwise, the
    pixel ownership operates normally and irrespective of the
    multisample subrectangle.

    The state of MULTISAMPLE_SUB_RECT_POSITION_SGIS is set by:

       void MultisampleSubRectPosSGIS(GLint x,
				      GLint y);

    If either MULTISAMPLE_SUB_RECT_DIMS_SGIS width or height is zero or
    the GL is in color index mode, MultisampleSubRectPosSGIS generates
    the error INVALID_OPERATION.

    When MultisampleSubRectPosSGIS is executed, the contents of the
    multisample, depth, stencil, and accumulation buffers retained in
    the multisample subrectangle (but not the contents of the resolved
    color buffers) become undefined.  Also when a GL client connects to
    a different GL context, the multisample, depth, stencil and
    accumulation buffer values for all pixels within the multisample
    subrectangle (but not the resolved color buffers) become
    undefined.

    The multisample subrectangle can be shared between multiple
    framebuffers (windows).  Whenever the multisample subrectangle
    becomes undefined, the contents of the multisample, depth, stencil,
    and accumulation buffers (but not the contents of the resolved
    color buffers) for all GL framebuffers sharing the multisample
    subrectangle state become undefined.  When two or more GL clients
    access (render or readback) concurrently framebuffers that share
    the same multisample subrectangle (whether or not MULTISAMPLE_SGIS
    is enabled), the rendering results for ALL buffers (including color
    buffers) of all involved framebuffers are undefined.

    The origin of the multisample subrectangle is defined by
    (msrx,msry) specified by MULTISAMPLE_SUB_RECT_POSITION_SGIS in
    window coordinates.  The extent of the multisample subrectangle is
    defined by (msrwidth,msrheight) specified by
    MULTISAMPLE_SUB_RECT_DIMS_SGIS in window coordinates.

    A fragment with window coordinates (xw,yw) is within the
    multisample subrectangle if msrx <= xw < msrx + msrwidth and msry
    <= yw < msry + msrheight.

    4.2.4  "The Accumulation Buffer"

    Rewrite the sentence beginning "When the scissor test is enabled"
    that describes what color buffer pixels are updated by a RETURN
    Accum operation to read:

    If either of the MULTISAMPLE_SUB_RECT_DIMS_SGIS width or height is
    zero, when the scissor test is enabled, then only those pixels
    within the current scissor box are updated; otherwise, all pixels
    in the window are updated.  If the MULTISAMPLE_SUB_RECT_DIMS_SGIS
    width and height are both greater than zero, only those pixels
    within the current multisample subrectangle are updated; in
    addition, if scissoring is enabled, the updated pixels are further
    constrained to be within the scissor rectangle.

    4.3.2  "Reading Pixels"

    In the subsection "Obtaining Pixels from the Framebuffer", follow
    the sentence "Results are also undefined for individual pixels that
    are not owned by the current context." with:  For the purpose of
    reading the color buffers (not depth and stencil though), the pixel
    ownership test does not include scissoring against the multisample
    subrectangle.

Additions to Chapter 5 of the 1.1 Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.1 Specification (State and State Requests)

    None

Additions to the GLX Specification

    When called with <attribute> set to
    GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGI or
    GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS, glXGetConfig returns in
    parameter <value> the respective multisample subrectangle width or
    height of the specified visual.

    The GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGI and
    GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS attributes of a visual or
    framebuffer configuration determine the respective width and
    height dimensions of MULTISAMPLE_SUB_RECT_DIMS_SGIS for
    GLXDrawables created with the visual or framebuffer
    configuration.

    glXChooseVisual accepts GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGI and
    GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS in <attribList>, followed by
    the respective desired (non-negative) width or height of the
    multisample rectangle.  The smallest width or height of at least
    the specified size is preferred.  If the desired value is zero,
    visuals with zero multisample rectangle width or height are
    preferred.

    Multisample GLXDrawables that reside on the same screen share the
    same multisample subrectangle.  There is at most one shared
    multisample subrectangle per screen.

GLX Protocol

    A new GL rendering command is added. The following command is sent
    to the server as part of a glXRender request:

    MultisampleSubRectPosSGIS
            2           12              rendering command length
            2           ??              rendering command opcode
            4           INT32           x
            4           INT32           y

    Two new property type/property value pairs are included in the
    property list of each visual returned by glXGetVisualConfigs
    request.  The property type/property value pairs are encoded as.

    4           ENUM                    property type
                0x8026                  GLX_MULTISAMPLE_SUB_RECT_WIDTH
    4           INT32                   property value

    4           ENUM                    property type
                0x8027                  GLX_MULTISAMPLE_SUB_RECT_HEIGHT
    4           INT32                   property value

Errors

    None

New State

    Get Value                           Get Command     Type    Initial Value   Attribute
    ---------                           -----------     -----   -------------   ---------
    MULTISAMPLE_SUB_RECT_POSITION_SGIS  GetIntegerv     2 x Z   0,0             multisample

New Implementation Dependent State

    Get Value                       Get Command     Type    Minimum Value
    ---------                       -----------     -----   -------------
    MULTISAMPLE_SUB_RECT_DIMS_SGIS  GetIntegerv     2 x Z   0,0

