| '''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 |
| ) |
| |