| | '''OpenGL extension APPLE.fence |
| | |
| | This module customises the behaviour of the |
| | OpenGL.raw.GL.APPLE.fence to provide a more |
| | Python-friendly API |
| | |
| | Overview (from the spec) |
| | |
| | This extension is provided a finer granularity of synchronizing GL command |
| | completion than offered by standard OpenGL, which currently offers only two |
| | mechanisms for synchronization: Flush and Finish. Since Flush merely assures |
| | the user that the commands complete in a finite (though undetermined) amount |
| | of time, it is, thus, of only modest utility. Finish, on the other hand, |
| | stalls CPU execution until all pending GL commands have completed forcing |
| | completely synchronous operation, which most often not the desired result. |
| | This extension offers a middle ground - the ability to "finish" a subset of |
| | the command stream, and the ability to determine whether a given command has |
| | completed or not. |
| | |
| | This extension introduces the concept of a "fence" to the OpenGL command |
| | stream with SetFenceAPPLE. Once the fence is inserted into the command |
| | stream, it can be tested for its completion with TestFenceAPPLE. Moreover, |
| | the application may also request a partial Finish up to a particular "fence" |
| | using the FinishFenceAPPLE command -- that is, all commands prior to the |
| | fence will be forced to complete until control is returned to the calling |
| | process. These new mechanisms allow for synchronization between the host |
| | CPU and the GPU, which may be accessing the same resources (typically |
| | memory). |
| | |
| | Fences are created and deleted, as are other objects in OpenGL, specifically |
| | with GenFencesAPPLE and DeleteFencesAPPLE. The former returns a list of |
| | unused fence names and the later deletes the provided list of fence names. |
| | |
| | In addition to being able to test or finish a fence this extension allows |
| | testing for other types of completion, including texture objects, vertex |
| | array objects, and draw pixels. This allows the client to use |
| | TestObjectAPPLE or FinishObjectAPPLE with FENCE_APPLE, TEXTURE, |
| | VERTEX_ARRAY, or DRAW_PIXELS_APPLE with the same type of results as |
| | TestFenceAPPLE and FinishFenceAPPLE. Specifically, using the FENCE_APPLE |
| | type is equivalent to calling TestFenceAPPLE or FinishFenceAPPLE with the |
| | particular fence name. Using TEXTURE as the object type tests or waits for |
| | completion of a specific texture, meaning when there are no pending |
| | rendering commands which use that texture object. Using the VERTEX_ARRAY |
| | type will test or wait for drawing commands using that particular vertex |
| | array object name. Finally, DRAW_PIXELS_APPLE will wait or test for |
| | completion of all pending DrawPixels commands. These tests and finishes |
| | operate with the same limitations and results as test and finish fence. |
| | |
| | One use of this extension is in conjunction with APPLE_vertex_array_range to |
| | determine when graphics hardware has completed accessing vertex data from a |
| | vertex array range. Once a fence has been tested TRUE or finished, all |
| | vertex indices issued before the fence must have completed being accessed. |
| | This ensures that the vertex data memory corresponding to the issued vertex |
| | indices can be safely modified (assuming no other outstanding vertex indices |
| | are issued subsequent to the fence). |
| | |
| | The official definition of this extension is available here: |
| | http://www.opengl.org/registry/specs/APPLE/fence.txt |
| | ''' |
| | from OpenGL import platform, constant, arrays |
| | from OpenGL import extensions, wrapper |
| | import ctypes |
| | from OpenGL.raw.GL import _types, _glgets |
| | from OpenGL.raw.GL.APPLE.fence import * |
| | from OpenGL.raw.GL.APPLE.fence import _EXTENSION_NAME |
| |
|
| | def glInitFenceAPPLE(): |
| | '''Return boolean indicating whether this extension is available''' |
| | from OpenGL import extensions |
| | return extensions.hasGLExtension( _EXTENSION_NAME ) |
| |
|
| | glGenFencesAPPLE=wrapper.wrapper(glGenFencesAPPLE).setOutput( |
| | 'fences',size=lambda x:(x,),pnameArg='n',orPassIn=True |
| | ) |
| | |
| | glDeleteFencesAPPLE=wrapper.wrapper(glDeleteFencesAPPLE).setInputArraySize( |
| | 'fences', None |
| | ) |
| | |