| Name | 
 |  | 
 |     WGL_I3D_image_buffer | 
 |  | 
 | Name Strings | 
 |  | 
 |     WGL_I3D_image_buffer | 
 |  | 
 | Contact | 
 |  | 
 |     Dale Kirkland, Intense3D (kirkland 'at' intense3d.com) | 
 |  | 
 | Status | 
 |  | 
 |     Complete | 
 |  | 
 | Version | 
 |  | 
 |     Date: 04/18/2000   Revision 1.0 | 
 |  | 
 | Number | 
 |  | 
 |     253 | 
 |  | 
 | 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 image buffer extension provides an interface to allocate one | 
 |     or more memory buffers to be used for GL image functions.  These | 
 |     functions include DrawPixels, ReadPixels, TexImage*D, and | 
 |     TexSubImage*D. | 
 |  | 
 |     The advantage of an image buffer over normal allocated memory is | 
 |     as follows: | 
 |  | 
 |       o The image buffer may be allocated on the graphics adapter. | 
 |  | 
 |       o The image buffer may be locked once by the implementation thus | 
 |         avoiding a call to the OS to lock the memory down each use. | 
 |  | 
 |       o The data in the image buffer may be transferred to the adapter | 
 |         using non-snooping accesses. | 
 |  | 
 |       o Multiple events may be associated with the image buffer so that | 
 |         the data can be transferred asynchronously. | 
 |  | 
 |     Since the image buffer is created and maintained by a specific | 
 |     graphics driver, a DC is required to create the image buffer. | 
 |     However, the image buffer can be used with any RC created for the | 
 |     graphics driver associated with the DC. | 
 |  | 
 | IP Status | 
 |  | 
 |     None | 
 |  | 
 | Issues | 
 |  | 
 |     None | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     LPVOID wglCreateImageBufferI3D(HDC hDC, | 
 |                                    DWORD dwSize, | 
 |                                    UINT uFlags) | 
 |  | 
 |     BOOL wglDestroyImageBufferI3D(HDC hDC, | 
 |                                   LPVOID pAddress) | 
 |  | 
 |     BOOL wglAssociateImageBufferEventsI3D(HDC hdc, | 
 |                                           HANDLE *pEvent, | 
 |                                           LPVOID *pAddress, | 
 |                                           DWORD *pSize, | 
 |                                           UINT count) | 
 |  | 
 |     BOOL wglReleaseImageBufferEventsI3D(HDC hdc, | 
 |                                         LPVOID *pAddress, | 
 |                                         UINT count) | 
 |  | 
 | New Tokens | 
 |  | 
 |     Accepted by the <uFlags> parameter of wglCreateImageBufferI3D: | 
 |  | 
 |       WGL_IMAGE_BUFFER_MIN_ACCESS_I3D        0x00000001 | 
 |       WGL_IMAGE_BUFFER_LOCK_I3D              0x00000002 | 
 |  | 
 | 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 WGL Specification | 
 |  | 
 |     An image buffer is memory allocated by the GL implementation that | 
 |     can be used to store an image for more efficient transfers to the | 
 |     graphics adapter.  An image buffer is used with the following GL | 
 |     image functions:  DrawPixels, ReadPixels, TexImage*D, and | 
 |     TexSubImage*D. | 
 |  | 
 |     An image buffer is created by calling wglCreateImageBufferI3D: | 
 |  | 
 |       LPVOID wglCreateImageBufferI3D(HDC hDC, | 
 |                                      DWORD dwSize, | 
 |                                      UINT uFlags) | 
 |  | 
 |     <hDC> is a device context for the graphics adapter or a window | 
 |     residing on the graphics adapter that supports the image buffer | 
 |     extension.  The image buffer can only be used for an RC created | 
 |     on the graphics adapter associated with <hDC>. | 
 |  | 
 |     <dwSize> is the requested byte size of the image buffer.  The | 
 |     minimum size is implementation-dependent, but at least <dwSize> | 
 |     will be allocated for the image buffer. | 
 |  | 
 |     <uFlags> specifies information about the intended usage of the | 
 |     image buffer. | 
 |  | 
 |       WGL_IMAGE_BUFFER_MIN_ACCESS_I3D | 
 |          The image buffer is minimally accessed by the application; | 
 |          rather, the buffer is loaded by a device (disk, graphics | 
 |          adapter, etc.).  The implementation may take advantage of | 
 |          this and allocate memory that could be slower for the | 
 |          host, but faster for devices.  Also, the memory may be | 
 |          allocated as uncached so that the data in the image buffer | 
 |          does not have to be "snooped" during the transfer to or | 
 |          from the graphics adapter. | 
 |  | 
 |       WGL_IMAGE_BUFFER_LOCK_I3D | 
 |          The image buffer memory is locked or allocated out of | 
 |          memory that is not swapped. | 
 |  | 
 |     If memory is available on the graphics adapter, the implementation | 
 |     may choose to use it for the allocation of an image buffer. | 
 |     However, the memory must behave like system memory in that it can | 
 |     be read and written by system devices or the host. | 
 |  | 
 |     If an image buffer is successfully created, a pointer is returned | 
 |     to the image buffer memory.  The boundary alignment for the image | 
 |     buffer is at least the native alignment of the system (usually | 
 |     32- or 64-bit alignment). | 
 |  | 
 |     An image buffer can be destroyed by calling the function | 
 |     wglDestroyImageBufferI3D. | 
 |  | 
 |       BOOL wglDestroyImageBufferI3D(HDC hDC, | 
 |                                     LPVOID pAddress) | 
 |  | 
 |     <pAddress> is a pointer to an image buffer that was obtained from | 
 |     a previous call to wglCreateImageBufferI3D.  The implementation | 
 |     will wait for any outstanding calls that use the image buffer to | 
 |     complete before it is destroyed.  If there is an event associated | 
 |     with the image buffer, it must be freed by the caller after the | 
 |     image buffer is destroyed. | 
 |  | 
 |     If the call is successful, a value of TRUE is returned and the | 
 |     resources associated with the image buffer are freed. | 
 |  | 
 |     One or more events may be associated with the image buffer by | 
 |     calling the function wglAssociateImageBufferEventsI3D.  Each | 
 |     event can be associated with a region of the image buffer to allow | 
 |     asynchronous transfers between the image buffer and the graphics | 
 |     adapter. | 
 |  | 
 |       BOOL wglAssociateImageBufferEventsI3D(HDC hdc, | 
 |                                             HANDLE *pEvent, | 
 |                                             LPVOID *pAddress, | 
 |                                             DWORD *pSize, | 
 |                                             UINT count) | 
 |  | 
 |     <pEvent> points to an array of events, each of which was created | 
 |     with CreateEvent as a manual reset event with the initial state | 
 |     set to TRUE (i.e. both the <bManualReset> and <bInitialState> | 
 |     arguments must be set to a value of TRUE).  All events must be | 
 |     unique to only one portion of an image buffer (i.e., events | 
 |     cannot be shared). | 
 |  | 
 |     For each event in <pEvent>, a region in the image buffer is defined | 
 |     by the corresponding <pAddress> and <pSize> entry.  <count> | 
 |     specifies the number of events (and associated regions). | 
 |  | 
 |     All regions for a call to wglAssociateImageBufferEventsI3D must be | 
 |     for the same image buffer.  Additional events can be added at any | 
 |     time.  Regions must not overlap.  The entire image buffer can be | 
 |     defined as a single region. | 
 |  | 
 |     Each region in an image buffer can be used as the image for | 
 |     DrawPixels, ReadPixels, TexImage*D, and TexSubImage*D calls. | 
 |     Once a call is made to a GL image function, the caller must wait | 
 |     for the transfer to complete using WaitForSingleObject before the | 
 |     image buffer can be modified (for DrawPixels, TexImage*D, or | 
 |     TexSubImage*D) or read (for ReadPixels). | 
 |  | 
 |     If an event is not specified for a region, the GL call using that | 
 |     region will complete its transfer before it returns. | 
 |  | 
 |     Events can be disassociated with their region by calling | 
 |     wglReleaseImageBufferEventsI3D. | 
 |  | 
 |       BOOL wglReleaseImageBufferEventsI3D(HDC hdc, | 
 |                                           LPVOID *pAddress, | 
 |                                           UINT count) | 
 |  | 
 |     <pAddress> points to an array of regions previously associated | 
 |     with events.  <count> is the number of regions in the array.  If an | 
 |     event is associated with the specified region, it is released.  All | 
 |     regions specified by <pAddress> must be for the same image buffer. | 
 |  | 
 |     When an image buffer is destroyed using wglDestroyImageBufferI3D, | 
 |     all events for that image buffer are released.  It is the | 
 |     responsibility of the application to delete events that are no | 
 |     longer associated with an image buffer. | 
 |  | 
 | 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 | 
 |  | 
 |     If the wglCreateImageBufferI3D function succeeds, a pointer to an | 
 |     image buffer is returned.  If the function fails, a value of NULL | 
 |     is returned.  To get extended error information, call GetLastError. | 
 |  | 
 |       ERROR_DC_NOT_FOUND         The <hDC> was not valid. | 
 |  | 
 |       ERROR_NO_SYSTEM_RESOURCES  There was insufficient resources to | 
 |                                  support the request. | 
 |  | 
 |       ERROR_INVALID_DATA         <dwSize> is not a positive value. | 
 |  | 
 |     If the wglDestroyImageBufferI3D function succeeds, a value of TRUE | 
 |     is returned.  If the function fails, a value of FALSE is returned. | 
 |     To get extended error information, call GetLastError. | 
 |  | 
 |       ERROR_DC_NOT_FOUND         The <hDC> was not valid. | 
 |  | 
 |     If the wglAssociateImageBufferEventsI3D or | 
 |     wglReleaseImageBufferEventsI3D functions succeed, a value of TRUE | 
 |     is returned.  If the function fails, a value of FALSE is returned. | 
 |     To get extended error information, call GetLastError. | 
 |  | 
 |       ERROR_DC_NOT_FOUND         The <hDC> was not valid. | 
 |  | 
 |       ERROR_INVALID_DATA         The regions specified by <pAddress> | 
 |                                  are not valid for the specified image | 
 |                                  buffer. | 
 |  | 
 | New State | 
 |  | 
 |     None | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     None | 
 |  | 
 | Revision History | 
 |  | 
 |     11/15/1999  0.1  First draft. | 
 |     11/24/1999  0.2  Fixed various typos. | 
 |     03/16/2000  0.3  Changed to add multiple events for a single image | 
 |                      buffer. | 
 |     04/18/2000  1.0  Released driver to ISVs. |