Name

    WGL_ARB_buffer_region

Name Strings

    WGL_ARB_buffer_region

Contact

    Dale Kirkland, NVIDIA (dkirkland 'at' nvidia.com)

Notice

    Copyright (c) 1999-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Complete. Approved by ARB on 12/8/1999

Version

    Last Modified Date: March 12, 2002
    Revision: 1.1

Number

    ARB Extension #4

Dependencies

    The extension is written against the OpenGL 1.2.1 Specification
    although it should work on any previous OpenGL specification.

    The WGL_EXT_extensions_string extension is required.

Overview

    The buffer region extension is a mechanism that allows an area of
    an OpenGL window to be saved in off-screen memory for quick
    restores.  The off-screen memory can either be frame buffer memory
    or system memory, although frame buffer memory might offer optimal
    performance.

    A buffer region can be created for the front color, back color,
    depth, and/or stencil buffer.  Multiple buffer regions for the same
    buffer type can exist.

IP Status

    None

Issues

    1. Do we need the glBufferRegionEnabled call that is in the
       Kinetix extensions?

       The reason behind this function was so that a single driver
       could be used on adapters with various amounts of memory -- the
       extension would always be present but its use would depend on a
       separate call.  The same functionality could be achieved by not
       advertising this extension or always returning a value of NULL
       from wglCreateBufferRegionARB.

    2. Should the width/height be specified on the create.

       Because applications create regions that are not used, it would
       be better to leave the size as a parameter on the save.

    3. Should information be added to the create to allow for layer
       support?

       Layer support has been added.

    4. Which DC gets used for buffer region operations?

       The DC that was allocated on the CreateBufferRegionARB call is
       saved and used for subsequent save and restore operations.  It
       must remain valid during the life of the buffer region.  This is
       analogous to the RC method for handling the DC.

    5. Does the driver do a flush before the save and restore?

       In keeping with the same paradigm as SwapBuffers, a flush will
       be made by the driver for the RC bound to the calling thread
       before the save and restore operations.

    6. Which coordinate system is used?

       The KTX_buffer_region and WIN_swap_hint extensions specify the
       (x,y) origin as the lower left corner of the rectangle.  This
       extension adopts the same philosophy.


New Procedures and Functions

    HANDLE wglCreateBufferRegionARB(HDC hDC,
                                    int iLayerPlane,
                                    UINT uType)

    VOID wglDeleteBufferRegionARB(HANDLE hRegion)

    BOOL wglSaveBufferRegionARB(HANDLE hRegion,
                                int x,
                                int y,
                                int width,
                                int height)

    BOOL wglRestoreBufferRegionARB(HANDLE hRegion,
                                   int x,
                                   int y,
                                   int width,
                                   int height,
                                   int xSrc,
                                   int ySrc)


New Tokens

    Accepted by the <uType> parameter of wglCreateBufferRegionARB is the
    bitwise OR of any of the following values:

      WGL_FRONT_COLOR_BUFFER_BIT_ARB          0x00000001
      WGL_BACK_COLOR_BUFFER_BIT_ARB           0x00000002
      WGL_DEPTH_BUFFER_BIT_ARB                0x00000004
      WGL_STENCIL_BUFFER_BIT_ARB              0x00000008


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

    None


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

    None


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

    None


Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions)

    None


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

    None


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

    None


Additions to the GLX Specification

    None

GLX Protocol

    None

Additions to the WGL Specification

    A buffer region can be created with wglCreateBufferRegionARB
    which returns a handle associated with the buffer region.

      HANDLE wglCreateBufferRegionARB(HDC hDC,
                                      INT iLayerPlane,
                                      UINT uType)

    <hDC> specifies a device context for the device on which the buffer
    region is created. <iLayerPlane> specifies the layer.  Positive
    values identify overlay planes, negative values identify underlay
    planes.  A value of 0 identifies the main plane.

    <uType> is a bitwise OR of any of the following values indicating
    which buffers can be saved or restored.  Multiple bits can be set
    and may result in better performance if multiple buffers are saved
    or restored.

        WGL_FRONT_COLOR_BUFFER_BIT_ARB
        WGL_BACK_COLOR_BUFFER_BIT_ARB
        WGL_DEPTH_BUFFER_BIT_ARB
        WGL_STENCIL_BUFFER_BIT_ARB

    For stereo windows, WGL_FRONT_COLOR_BUFFER_BIT_ARB implies both the
    left and right front buffers, and WGL_BACK_COLOR_BUFFER_BIT_ARB
    implies both the left and right back buffers.

    When wglCreateBufferRegionARB fails to create a buffer region, a
    value of NULL is returned.  To get extended error information, call
    GetLastError.

    Image, depth, and stencil data can be saved into the buffer region
    by calling wglSaveBufferRegionARB.

      BOOL wglSaveBufferRegionARB(HANDLE hRegion,
                                  int x,
                                  int y,
                                  int width,
                                  int height)

    <hRegion> is a handle to a buffer region previously created with
    wglCreateBufferRegionARB.  The DC specified when the region was
    created is used as the device context specifying the window.

    <x> and <y> specify the window position for the source rectangle.
    <width> and <height> specify the width and height of the source
    rectangle.  Data outside the window for the specified rectangle is
    undefined.  The OpenGL coordinate system is used for specifying the
    rectangle (<x> and <y> specify the lower-left corner of the
    rectangle).

    If an RC is current to the calling thread, a flush will occur
    before the save operation.

    The saved buffer region area can be freed by calling
    wglSaveBufferRegionARB with <width> or <height> set to a value
    of 0.

    If the call to wglSaveBufferRegionARB is successful, a value of
    TRUE is returned.  Otherwise, a value of FALSE is returned.  To
    get extended error information, call GetLastError.

    A previously saved region can be restored (multiple times) with
    the wglRestoreBufferRegionARB function.

      BOOL wglRestoreBufferRegionARB(HANDLE hRegion,
                                     int x,
                                     int y,
                                     int width,
                                     int height,
                                     int xSrc,
                                     int ySrc)

    <hRegion> is a handle to a buffer region previously created with
    wglCreateBufferRegionARB.  The DC specified when the region was
    created is used as the device context specifying the window.

    <x> and <y> specify the window position for the destination
    rectangle.  <width> and <height> specify the width and height of
    the destination rectangle.  The OpenGL coordinate system is used
    for specifying the rectangle (<x> and <y> specify the lower-left
    corner of the rectangle).

    <xSrc> and <ySrc> specify the position in the buffer region for
    the source of the data.  Any portion of the rectangle outside of
    the saved region is ignored.

    If an RC is current to the calling thread, a flush will occur
    before the restore operation.

    If the call to wglRestoreBufferRegionARB is successful, a value of
    TRUE is returned.  Otherwise, a value of FALSE is returned.  To
    get extended error information, call GetLastError.

    The buffer region can be deleted with wglDeleteBufferRegionARB.

      VOID wglDeleteBufferRegionARB(HANDLE hRegion)

    <hRegion> is a handle to a buffer region previously created with
    wglCreateBufferRegionARB.  Any saved data associated with <hRegion>
    is discarded.  The DC used to create the region must still be valid
    for the delete to work.

Dependencies on WGL_EXT_extensions_string

    Because there is no way to extend wgl, these calls are defined in
    the ICD and can be called by obtaining the address with
    wglGetProcAddress.  Because this extension is a WGL extension, it
    is not included in the GL_EXTENSIONS string.  Its existence can be
    determined with the WGL_EXT_extensions_string extension.

Errors

    ERROR_NO_SYSTEM_RESOURCES is generated if memory cannot be
    allocated for storing the saved data.

    ERROR_INVALID_HANDLE is generated if <hRegion> is not a valid
    handle that was previously returned by wglCreateBufferRegionARB.

    ERROR_INVALID_DATA is generated if <uType> is zero or includes
    an undefined bit.

    ERROR_INVALID_DATA is generated if <width> or <height> is negative.

New State

    None

New Implementation Dependent State

    None

Conformance Test

    1. Clear the window to blue.
    2. Save an area of the window using wglSaveBufferRegionARB.
    3. Clear the window to red.
    4. Restore the area of the window using wglRestoreBufferRegionARB.
    5. Verify that the area was restored.
    6. Repeat for the depth buffer.
    7. Repeat for the stencil buffer.
    8. Repeat for image and depth buffer.

Revision History

    12/10/99  1.0  ARB extension - based on the wgl_buffer_region
                   extension.
    03/12/02  1.1  Updated contact information.
