Name

    WGL_ARB_pbuffer

Name Strings

    WGL_ARB_pbuffer

Contact

    Dale Kirkland, 3Dlabs (dlkirkla 'at' 3dlabs.com)
    Bimal Podder, Intel (bimal.poddar 'at' intel.com)
    Steve Urquhart, Intelligraphics (steveu 'at' intelligraphics.com)

Status

    Complete. Approved by ARB on March 15, 2000

Version

    Last Modified Date: 03/12/2002
    Author Revision: 1.1

    Based on:  WGL_EXT_pbuffer specification
	       Date: 4/21/1999	 Version 1.8

Number

    ARB Extension #11

Dependencies

    WGL_ARB_extensions_string is required.
    WGL_ARB_pixel_format is required.
    WGL_ARB_make_current_read affects the definition of this extension.

Overview

    This extension defines pixel buffers (pbuffer for short). Pbuffers
    are additional non-visible rendering buffers for an OpenGL
    renderer. Pbuffers are equivalent to a window that has the same
    pixel format descriptor with the following exceptions:

    1.	There is no rendering to a pbuffer by GDI.

    2.	The pixel format descriptors used for a pbuffer can only be
	those that are supported by the ICD.  Generic formats are not
	valid.

    3.	The allocation of a pbuffer can fail if there are insufficient
	resources (i.e., all the pbuffer memory has been allocated).

    4.	The pixel buffer might be lost if a display mode change occurs.
	A query is provided that can be called after a display mode
	change to determine the state of the pixel buffer.

    The intent of the pbuffer semantics is to enable implementations to
    allocate pbuffers in non-visible frame buffer memory.  These
    pbuffers are intended to be "static" resources in that a program
    will typically allocate them only once rather than as a part of its
    rendering loop.  (Pbuffers should be deallocated when the program
    is no longer using them -- for example, if the program is
    iconified.)

    The frame buffer resources that are associated with a pbuffer are
    also static and are deallocated when the pbuffer is destroyed or
    possibly when a display mode change occurs.

IP Status

    TBD

Issues

    1. Should the OPTIMUM width and heights and PBUFFER_LARGEST_ARB be
       taken out of the spec since they may be misleading or hard for
       some implementations to support?

       PBUFFER_LARGEST_ARB has been left in the extension.  It was
       originally requested by an application.	The OPTIMUM queries
       have been removed to match the GLX pixel buffer specification.


New Procedures and Functions

    DECLARE_HANDLE(HPBUFFERARB);

    HPBUFFERARB wglCreatePbufferARB(HDC hDC,
				    int iPixelFormat,
				    int iWidth,
				    int iHeight,
				    const int *piAttribList);

    HDC wglGetPbufferDCARB(HPBUFFERARB hPbuffer);

    int wglReleasePbufferDCARB(HPBUFFERARB hPbuffer,
			       HDC hDC);

    BOOL wglDestroyPbufferARB(HPBUFFERARB hPbuffer);

    BOOL wglQueryPbufferARB(HPBUFFERARB hPbuffer,
			    int iAttribute,
			    int *piValue);

New Tokens

    Accepted by the <attribute> parameter of wglChoosePixelFormatEXT:

      WGL_DRAW_TO_PBUFFER_ARB		   0x202D

    Accepted by the <attribute> parameter of
    wglGetPixelFormatAttribivEXT, and wglGetPixelFormatAttribfvEXT:

      WGL_DRAW_TO_PBUFFER_ARB		   0x202D
      WGL_MAX_PBUFFER_PIXELS_ARB	   0x202E
      WGL_MAX_PBUFFER_WIDTH_ARB		   0x202F
      WGL_MAX_PBUFFER_HEIGHT_ARB	   0x2030

    Accepted by the <piAttribList> parameter of wglCreatePbufferARB:

      WGL_PBUFFER_LARGEST_ARB		   0x2033

    Accepted by the <iAttribute> parameter of wglQueryPbufferARB:

      WGL_PBUFFER_WIDTH_ARB		   0x2034
      WGL_PBUFFER_HEIGHT_ARB		   0x2035
      WGL_PBUFFER_LOST_ARB		   0x2036

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

    None

Additions to Chapter 3 of the 1.2 Specification (Rasterization)

    None

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

    None

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

    None

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

    None

Additions to the GLX Specification

    This specification is written for WGL.

GLX Protocol

    This specification is written for WGL.

Additions to the WGL Specification

    A pixel buffer (pbuffer) can be created with wglCreatePbufferARB
    which returns a handle associated with the pbuffer.

      HPBUFFERARB wglCreatePbufferARB(HDC hDC,
				      int iPixelFormat,
				      int iWidth,
				      int iHeight,
				      const int *piAttribList);

    <hDC> specifies a device context for the device on which the
    pbuffer is created. <iPixelFormat> specifies a non-generic pixel
    format descriptor index.  Support for pbuffers may be restricted
    to specific pixel formats.	Use wglGetPixelFormatAttribivEXT or
    wglGetPixelFormatAttribfvEXT to query the WGL_DRAW_TO_PBUFFER_ARB
    attribute to determine which pixel formats support the creation of
    pbuffers.

    <iWidth> and <iHeight> specify the pixel width and height of the
    rectangular pbuffer.

    <piAttribList> is a list of attributes {type, value} pairs
    containing integer attribute values.  All of the attributes in the
    <piAttribList> are followed by the corresponding required value.
    The list is terminated with a value of 0.

    The following attributes are supported by wglCreatePbufferARB:

      WGL_PBUFFER_LARGEST_ARB	  If this attribute is set to a
				  non-zero value, the largest
				  available pbuffer is allocated
				  when the allocation of the pbuffer
				  would otherwise fail due to
				  insufficient resources.  The width
				  or height of the allocated pbuffer
				  never exceeds <iWidth> and <iHeight>,
				  respectively.  Use wglQueryPbufferARB
				  to retrieve the dimensions of the
				  allocated pbuffer.

    The resulting pbuffer will contain color buffers and ancillary
    buffers as specified by <iPixelFormat>.  Note that pbuffers use
    framebuffer resources so applications should consider deallocating
    them when they are not in use.

    It is possible to create a pbuffer with back buffers and to swap
    the front and back buffers by calling wglSwapLayerBuffers.	The
    contents of the back buffers after the swap depends on the
    <iPixelFormat>.  (Pbuffers are the same as windows in this respect.)

    When wglCreatePbufferARB fails to create a pbuffer, NULL is
    returned.  To get extended error information, call GetLastError.
    Possible errors are as follows:

      ERROR_INVALID_PIXEL_FORMAT     Pixel format is not valid.

      ERROR_NO_SYSTEM_RESOURCES      Insufficient resources exist.

      ERROR_INVALID_DATA	     <iWidth> or <iHeight> is negative
				     or zero.

      ERROR_INVALID_DATA	     <piAttribList> is not a valid
				     attribute.

    To create a device context for the pbuffer, call

      HDC wglGetPbufferDCARB(HPBUFFERARB hPbuffer);

    where <hPbuffer> is a handle returned from a previous call to
    wglCreatePbufferARB.  A device context is returned by
    wglGetPbufferDCARB which can be used to associate a rendering
    context with the pbuffer.  Any rendering context created with
    a wglCreateContext that is "compatible" with the <iPixelFormat> may
    be used to render into the pbuffer. (See the description of
    wglCreateContext, wglMakeCurrent, and wglMakeCurrentReadEXT for a
    definition of "compatible".)

    When wglGetPbufferDCARB fails, NULL is returned.  To get extended
    error information, call GetLastError. Possible errors are as
    follows:

      ERROR_INVALID_HANDLE	     <hPbuffer> is not a valid handle.

    To release a device context obtained from a previous call to
    wglGetPbufferDCARB, call

	int wglReleasePbufferDCARB(HPBUFFERARB hPbuffer,
				   HDC hDC);

    If the return value is a value of 1, the device context was released.
    If the device context was not released, the return value is 0.  To
    get extended error information, call GetLastError. Possible errors
    are as follows:

      ERROR_INVALID_HANDLE	     <hPbuffer> is not a valid handle.
      ERROR_DC_NOT_FOUND	     <hDC> is not a valid DC.

    A pbuffer is destroyed by calling

      BOOL wglDestroyPbufferARB(HPBUFFERARB hPbuffer);

    The pbuffer is destroyed once it is no longer current to any
    rendering context.	When a pbuffer is destroyed, any memory
    resources that are attached to it are freed and its handle is no
    longer valid.

    If wglDestroyPbufferARB fails, FALSE is returned.  To get extended
    error information, call GetLastError. Possible errors are as
    follows:

      ERROR_INVALID_HANDLE	     <hPbuffer> is not a valid handle.

    To query the maximum width, height, or number of pixels in any
    given pbuffer for a specific pixel format, use
    wglGetPixelFormatAttribivEXT or wglGetPixelFormatAttribfvEXT with
    <attribute> set to one of WGL_MAX_PBUFFER_WIDTH_ARB,
    WGL_MAX_PBUFFER_HEIGHT_ARB, or WGL_MAX_PBUFFER_PIXELS_ARB.

    WGL_MAX_PBUFFER_WIDTH_ARB and WGL_MAX_PBUFFER_HEIGHT_ARB indicate
    the maximum width and height that can be passed into
    wglCreatePbufferARB and WGL_MAX_PBUFFER_PIXELS_ARB indicates the
    maximum number of pixels (width x height) for a pbuffer.  Note
    that an implementation may return a value for
    WGL_MAX_PBUFFER_PIXELS_ARB that is less than the maximum width
    times the maximum height.  Also, the value for
    WGL_MAX_PBUFFER_PIXELS_ARB is static and assumes that no other
    pbuffers are contending for the framebuffer memory.  Thus it may
    not be possible to allocate a pbuffer of the size given by
    WGL_MAX_PBUFFER_PIXELS_ARB.

    To query an attribute associated with a specific pbuffer, call

      BOOL wglQueryPbufferARB(HPBUFFERARB hPbuffer,
			      int iAttribute,
			      int *piValue);

    with <hPbuffer> set to a previously returned pbuffer handle.
    <iAttribute> must be set to one of WGL_PBUFFER_WIDTH_ARB,
    WGL_PBUFFER_HEIGHT_ARB, or WGL_PBUFFER_LOST_ARB.

    The WGL_PBUFFER_LOST_ARB query can be used to determine if the
    pixel buffer memory was lost due to a display mode change.	A value
    of TRUE is returned in <iAttribute> if the display mode change lost
    the memory for the pixel buffer.  It is not an error to render to
    a pixel buffer in this state, but the effect of rendering to it is
    the same as if the pixel buffer was destroyed:  the context state
    will be updated, but the values of the returned pixels are
    undefined.	The pixel buffer must be destroyed and recreated if
    the pixel buffer memory has been lost.  A value of FALSE is
    returned to indicate that the contents of the pixel buffer are
    unaffected by the display mode change.

    If wglQueryPbufferARB fails, FALSE is returned.  To get extended
    error information, call GetLastError. Possible errors are as
    follows:

      ERROR_INVALID_HANDLE	<hPbuffer> is not a valid handle.
      ERROR_INVALID_DATA	<iAttribute> is not a valid attribute.

Dependencies on WGL_ARB_pixel_format

    The WGL_ARB_pixel_format extension must be used to determine a
    pixel format that can be used to create the pixel buffer.

Dependencies on WGL_ARB_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_ARB_extensions_string extension.

New State

    None

New Implementation Dependent State

    None

Conformance Testing

    All of the current conformance tests can be run on a pixel buffer
    to validate its conformance.  The only change to the conformance
    tests would be to create a context for the pixel buffer.

Revision History

    12/16/1999	0.1
	- First ARB draft based on the EXT specification.

    02/28/2000	0.2
	- Added a query for a damaged pixel buffer due to a display
	  mode change.

    03/15/2000	0.3
	- Changed the lost definition of a pixel buffer.
	- Removed the OPTIMAL size queries.
	- Added a dependency on WGL_ARB_pixel_format.

    03/22/2000	1.0
	- Changed "mode change" to "display mode change".
	- Added the condition that the resources associated with a
	  pbuffer may be lost due to a display mode change.
	- Fixed issue 1 to address the OPTIMUM values.
	- Added the declaration of HPBUFFERARB in the Procedures and
	  Functions section.
	- Changed the wording of "undamaged" to "unaffected"
	- Approved by ARB: 10-0-0.

    03/12/2002	1.1
	- Updated contact information.
