XXX - Not complete.

Name

    SGIX_dmbuffer

Name Strings

    GLX_SGIX_dm_buffer

Version

    $Date: 1997/09/26 09:48:00 $ $Revision: 1.6 $

Number

    86

Dependencies

    SGIX_FBConfig is required
    SGI_make_current_read is required.
    SGIX_pbuffer

Overview

    This extension introduces a new type of GLXPbuffer, a DM or Digital
    Media pbuffer.  A DM pbuffer is a GLXPbuffer that adopts one or more 
    of its buffers from an externally defined and allocated DMbuffer. 
    In this way it resembles a GLXPixmap that attaches to an existing
    X pixmap.  Like a standard pbuffer it can be used as a non-displayable
    rendering area, or as a read source for pixel data.  The externally
    defined buffers of the DM pbuffer can be sequentially associated 
    with other DM buffers of the same size and configuration.  

    .  The DM pbuffer is described with a new attrib passed to 
       glXCreateGLXPbuffer.  

    .  A new GLX command allows associating a compatible DMbuffer with 
       the DM GLXPbuffer.  At associate time the DM buffers described 
       by the DMparams are used directly as the corresponding 
       buffers of the GLXPbuffer drawable, as described by the FBconfig.  
       All other buffers that are part of the config will be created by
       GL without externally referenceable names.  A DM pbuffer must be
       associated with a compatible DMbuffer before it can be made current
       to a GLX context. 

    .  The externally defined buffers of the DM pbuffer can be changed at 
       any time by successfully associating a new DMbuffer with the GLXPbuffer 
       through the associate command.  It will be the application's 
       responsibility to synchronize DMedia, GLX, and GL commands that 
       effect the contents of the DM pbuffer.

    .  Any direct GLX rendering context that satisfies config compatibility
       can be used to render to or read from a DM GLXPbuffer.
       A currently associated DMbuffer may simultaneously be in use by 
       other clients on the same Display, but will not be destroyed
       while associated with a GLXPbuffer.  When the GLXpbuffer is
       destroyed, all buffers that have no remaining clients, including
       the DMbuffer, will be freed.

    DM GLXPbuffers are proposed as a means for OpenGL to access buffers
    generated by the VL, compression, and other digital media libraries in 
    a uniform way.  The DMbuffer and DMparams descriptors are left 
    intentionally abstract so that the GLX extension can adapt to future 
    DM library changes.  
    The initial implementation will require that the DMparams descriptor
    supply at least pixel format and packing information, and that the  
    DMbuffer provide the size and location of a colorbuffer.  GLX will do 
    compatibility checking when possible based on the config, params, and 
    buffer information at associate time. 
     
Issues


New Procedures and Functions

    Bool glXAssociateDMPbufferSGIX(Display *dpy,
				   GLXPbufferSGIX pbuffer,
                                   DMparams *params,
                                   DMbuffer dmbuffer);

New Tokens

    Accepted by the <attrib_list> parameter of glXCreateGLXPbufferSGIX
    and by the <attribute> parameter of glXQueryGLXPbufferSGIX:

        GLX_DIGITAL_MEDIA_PBUFFER_SGIX             0x8024


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

    None

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    None

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame buffer)

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

    None.

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

    None.

Additions to the GLX Specification

    XXX - not complete yet

    [Add the following to section 3.2.3 on Offscreen Rendering]

    To create a GLXPbuffer call:

        GLXPbuffer glXCreateGLXPbufferSGIX(Display *dpy,
                                           GLXFBConfig config,
                                           unsigned int width,
                                           unsigned int height,
                                           int *attrib_list);

    This creates a single GLXPbuffer and returns its XID. <width> and <height>
    specify the pixel width and height of the rectangular pbuffer and
    <attrib_list> specifies a list of attributes for the pbuffer. Currently
    only three attributes can be specified in <attrib_list>:
    GLX_PRESERVED_CONTENTS_SGIX, GLX_LARGEST_PBUFFER_SGIX and
    GLX_DIGITAL_MEDIA_PBUFFER_SGIX.

    [Add following the section on the GLX_PRESERVED_CONTENTS_SGIX attrib]

    The resulting pbuffer, when made current, will contain color buffers 
    and ancillary buffers as specified by <config>. It is possible to create 
    a pbuffer with back buffers and to swap the front and back buffers by 
    calling glXSwapBuffers. Note that some pbuffers use framebuffer resources 
    so applications should consider deallocating them when they are not in use.

    If the GLX_DIGITAL_MEDIA_PBUFFER_SGIX attribute is set to True in
    <attrib_list>, then one or more of the pbuffer's color or ancillary 
    buffers may be shared with those of a currently associated DMbuffer.  
    Buffers described by the pbuffer's GLXFBConfig which are not defined
    by the DMbuffer, are GLX resources that remain associated with the
    DM pbuffer until it is destroyed.
    An implementation may fail glXCreateGLXPbufferSGIX and generate a
    BadMatch error when the sepcified <config> does not describe a  
    drawable that is compatible with any supported DMbuffers.

    The GLXPbuffer is associated with a DMbuffer by calling:

        Bool glXAssociateDMPbufferSGIX(Display *dpy,
                                       GLXPbufferSGIX pbuffer,
                                       DMparams *params,
                                       DMbuffer dmbuffer);

    The parameter <display> specifies a connection to an X server, and must 
    match the display used to create the GLXPbuffer <pbuffer>.  The 
    DMparams <params> arg specifies the digital media characteristics
    of the <dmbuffer> that will be associated with the DM pbuffer.  
    If glXAssociateDMbufferSGIX succeeds, any previously associated DMbuffer
    is released and a value of True is returned.  Subsequent GL commands 
    effect <dmbuffer> as they would any standard pbuffer.  If a newly 
    released DMbuffer has no remaining clients, its buffers will also be freed. 
    A BadMatch error is generated when the specified DMparams or DMbuffer
    are not compatible with the <pbuffer>, and a value of False is returned.

    Before the DM pbuffer can be made current to a GLXContext, it must 
    be associated with a compatible DMbuffer.  glXMakeCurrentReadSGI will 
    return False and generate a GLXBadDrawable error when a DM pbuffer 
    drawable has no associated DMbuffer.

    A GLXPbuffer is destroyed by calling:

        void glXDestroyGLXPbufferSGIX(Display *dpy,
                                      GLXPbuffer pbuf);

    The GLXPbuffer will be destroyed once it is no longer current to any
    client. When a GLXPbuffer is destroyed, any memory resources that
    attached to it, are freed, and its XID is made available for reuse.
    Associated DMbuffers are released, and if they no lonnger have a 
    client, are also freed. 

Errors

    XXX - not complete yet

New State

    None.

New Implementation Dependent State

    None.

