| 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. |