'''OpenGL extension NV.gpu_affinity This module customises the behaviour of the OpenGL.raw.WGL.NV.gpu_affinity to provide a more Python-friendly API Overview (from the spec) On systems with more than one GPU it is desirable to be able to select which GPU(s) in the system become the target for OpenGL rendering commands. This extension introduces the concept of a GPU affinity mask. OpenGL rendering commands are directed to the GPU(s) specified by the affinity mask. GPU affinity is immutable. Once set, it cannot be changed. This extension also introduces the concept called affinity-DC. An affinity-DC is a device context with a GPU affinity mask embedded in it. This restricts the device context to only allow OpenGL commands to be sent to the GPU(s) in the affinity mask. Handles for the GPUs present in a system are enumerated with the command wglEnumGpusNV. An affinity-DC is created by calling wglCreateAffinityDCNV. This function takes a list of GPU handles, which make up the affinity mask. An affinity-DC can also indirectly be created by obtaining a DC from a pBuffer handle, by calling wglGetPbufferDC, which in turn was created from an affinity-DC by calling wglCreatePbuffer. A context created from an affinity DC will inherit the GPU affinity mask from the DC. Once inherited, it cannot be changed. Such a context is called an affinity-context. This restricts the affinity-context to only allow OpenGL commands to be sent to those GPU(s) in its affinity mask. Once created, this context can be used in two ways: 1. Make the affinity-context current to an affinity-DC. This will only succeed if the context's affinity mask is the same as the affinity mask in the DC. There is no window associated with an affinity DC, therefore this is a way to achieve off-screen rendering to an OpenGL context. This can either be rendering to a pBuffer, or an application created framebuffer object. In the former case, the affinity-mask of the pBuffer DC, which is obtained from a pBuffer handle, will be the same affinity-mask as the DC used to created the pBuffer handle. In the latter case, the default framebuffer object will be incomplete because there is no window-system created framebuffer. Therefore, the application will have to create and bind a framebuffer object as the target for rendering. 2. Make the affinity-context current to a DC obtained from a window. Rendering only happens to the sub rectangles(s) of the window that overlap the parts of the desktop that are displayed by the GPU(s) in the affinity mask of the context. Sharing OpenGL objects between affinity-contexts, by calling wglShareLists, will only succeed if the contexts have identical affinity masks. It is not possible to make a regular context (one without an affinity mask) current to an affinity-DC. This would mean a way for a context to inherit affinity information, which makes the context affinity mutable, which is counter to the premise of this extension. The official definition of this extension is available here: http://www.opengl.org/registry/specs/NV/gpu_affinity.txt ''' from OpenGL import platform, constant, arrays from OpenGL import extensions, wrapper import ctypes from OpenGL.raw.WGL import _types, _glgets from OpenGL.raw.WGL.NV.gpu_affinity import * from OpenGL.raw.WGL.NV.gpu_affinity import _EXTENSION_NAME def glInitGpuAffinityNV(): '''Return boolean indicating whether this extension is available''' from OpenGL import extensions return extensions.hasGLExtension( _EXTENSION_NAME ) ### END AUTOGENERATED SECTION