| | '''OpenGL extension APPLE.object_purgeable |
| | |
| | This module customises the behaviour of the |
| | OpenGL.raw.GL.APPLE.object_purgeable to provide a more |
| | Python-friendly API |
| | |
| | Overview (from the spec) |
| | |
| | This extension provides the ability to mark the storage of OpenGL |
| | objects as "purgeable". |
| | |
| | Many of today's modern virtual memory systems include the concept of |
| | purgeability in order to avoid unnecessary paging when the object |
| | contents are no longer needed. In OpenGL, objects such as textures, |
| | vertex buffers, pixel buffers, and renderbuffers all have |
| | significant storage requirements. By default, the OpenGL is |
| | required to preserve the contents of these objects regardless of |
| | system resource stress, such as vram shortage or physical memory |
| | shortage. Often this is accomplished by temporarily paging the |
| | contents of objects that are not currently needed to some kind of |
| | secondary storage area. This paging operation can be an unnecessary |
| | computational expense in the cases where the data is not going to be |
| | used again or where the content can be reproduced by the application |
| | with less expense than the paging operation would require. |
| | |
| | This extension defines a mechanism for the application to mark the |
| | storage of OpenGL objects as "purgeable" in order to influence these |
| | paging operations. The application can further control the |
| | semantics of making object storage "purgeable" with two options |
| | ("volatile" and "released") and "unpurgeable" with two options |
| | ("undefined" and "retained") |
| | |
| | Applications that use this extension will typically follow one of |
| | two operational models. The typical model for most applications is |
| | to mark an object storage as "purgeable" with the "volatile" option, |
| | and then later mark the storage as "unpurgeable" with the "retained" |
| | option. When this happens, the application may or may not need to |
| | respecify the object contents, depending on the whether the object |
| | storage was actually released. The application can find out whether |
| | the storage was released by examining the return value of the |
| | function which marks the storage as "unpurgeable". This model is |
| | useful when the application does not know at the time it marks the |
| | object storage as "purgeable" whether it will later need those |
| | contents to be valid. |
| | |
| | Another operational model is for an application to mark the storage |
| | for an object as "purgeable" with the "released" option, and then |
| | later mark the object "unpurgeable" with the "undefined" option. In |
| | this latter model, the application intends to unconditionally reload |
| | the object contents later on, and so it tells the GL that it is okay |
| | if the contents are "undefined" when the storage is re-allocated. |
| | |
| | Note that in both models, it is possible for the contents to become |
| | undefined since they could have actually been purged from the system |
| | in either case. The various options are still useful, however, |
| | since they give more information to the GL about what the |
| | application expects to happen and the GL can use this information to |
| | make better predictions about which paging choices will be more |
| | efficient. |
| | |
| | The official definition of this extension is available here: |
| | http://www.opengl.org/registry/specs/APPLE/object_purgeable.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.object_purgeable import * |
| | from OpenGL.raw.GL.APPLE.object_purgeable import _EXTENSION_NAME |
| |
|
| | def glInitObjectPurgeableAPPLE(): |
| | '''Return boolean indicating whether this extension is available''' |
| | from OpenGL import extensions |
| | return extensions.hasGLExtension( _EXTENSION_NAME ) |
| |
|
| | glGetObjectParameterivAPPLE=wrapper.wrapper(glGetObjectParameterivAPPLE).setOutput( |
| | 'params',size=_glgets._glget_size_mapping,pnameArg='pname',orPassIn=True |
| | ) |
| | |