Back to the OpenGL extension cross reference
WGL_ARB_pbuffer
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.
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);
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.
Implementation Support
List of OpenGL implementations supporting the WGL_ARB_pbuffer extension
Original File
Original text file for the WGL_ARB_pbuffer extension
Page generated on Sun Nov 20 18:35:55 2005