| | '''OpenGL extension EXT.framebuffer_multisample |
| | |
| | This module customises the behaviour of the |
| | OpenGL.raw.GL.EXT.framebuffer_multisample to provide a more |
| | Python-friendly API |
| | |
| | Overview (from the spec) |
| | |
| | This extension extends the EXT_framebuffer_object framework to |
| | enable multisample rendering. |
| | |
| | The new operation RenderbufferStorageMultisampleEXT() allocates |
| | storage for a renderbuffer object that can be used as a multisample |
| | buffer. A multisample render buffer image differs from a |
| | single-sample render buffer image in that a multisample image has a |
| | number of SAMPLES that is greater than zero. No method is provided |
| | for creating multisample texture images. |
| | |
| | All of the framebuffer-attachable images attached to a framebuffer |
| | object must have the same number of SAMPLES or else the framebuffer |
| | object is not "framebuffer complete". If a framebuffer object with |
| | multisample attachments is "framebuffer complete", then the |
| | framebuffer object behaves as if SAMPLE_BUFFERS is one. |
| | |
| | In traditional multisample rendering, where |
| | DRAW_FRAMEBUFFER_BINDING_EXT is zero and SAMPLE_BUFFERS is one, the |
| | GL spec states that "the color sample values are resolved to a |
| | single, displayable color each time a pixel is updated." There are, |
| | however, several modern hardware implementations that do not |
| | actually resolve for each sample update, but instead postpones the |
| | resolve operation to a later time and resolve a batch of sample |
| | updates at a time. This is OK as long as the implementation behaves |
| | "as if" it had resolved a sample-at-a-time. Unfortunately, however, |
| | honoring the "as if" rule can sometimes degrade performance. |
| | |
| | In contrast, when DRAW_FRAMEBUFFER_BINDING_EXT is an |
| | application-created framebuffer object, MULTISAMPLE is enabled, and |
| | SAMPLE_BUFFERS is one, there is no implicit per-sample-update |
| | resolve. Instead, the application explicitly controls when the |
| | resolve operation is performed. The resolve operation is affected |
| | by calling BlitFramebufferEXT (provided by the EXT_framebuffer_blit |
| | extension) where the source is a multisample application-created |
| | framebuffer object and the destination is a single-sample |
| | framebuffer object (either application-created or window-system |
| | provided). |
| | |
| | This design for multisample resolve more closely matches current |
| | hardware, but still permits implementations which choose to resolve |
| | a single sample at a time. If hardware that implementes the |
| | multisample resolution "one sample at a time" exposes |
| | EXT_framebuffer_multisample, it could perform the implicit resolve |
| | to a driver-managed hidden surface, then read from that surface when |
| | the application calls BlitFramebufferEXT. |
| | |
| | Another motivation for granting the application explicit control |
| | over the multisample resolve operation has to do with the |
| | flexibility afforded by EXT_framebuffer_object. Previously, a |
| | drawable (window or pbuffer) had exclusive access to all of its |
| | buffers. There was no mechanism for sharing a buffer across |
| | multiple drawables. Under EXT_framebuffer_object, however, a |
| | mechanism exists for sharing a framebuffer-attachable image across |
| | several framebuffer objects, as well as sharing an image between a |
| | framebuffer object and a texture. If we had retained the "implicit" |
| | resolve from traditional multisampled rendering, and allowed the |
| | creation of "multisample" format renderbuffers, then this type of |
| | sharing would have lead to two problematic situations: |
| | |
| | * Two contexts, which shared renderbuffers, might perform |
| | competing resolve operations into the same single-sample buffer |
| | with ambiguous results. |
| | |
| | * It would have introduced the unfortunate ability to use the |
| | single-sample buffer as a texture while MULTISAMPLE is ENABLED. |
| | |
| | By using the BlitFramebufferEXT from EXT_framebuffer_blit as an |
| | explicit resolve to serialize access to the multisampled contents |
| | and eliminate the implicit per-sample resolve operation, we avoid |
| | both of these problems. |
| | |
| | The official definition of this extension is available here: |
| | http://www.opengl.org/registry/specs/EXT/framebuffer_multisample.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.EXT.framebuffer_multisample import * |
| | from OpenGL.raw.GL.EXT.framebuffer_multisample import _EXTENSION_NAME |
| |
|
| | def glInitFramebufferMultisampleEXT(): |
| | '''Return boolean indicating whether this extension is available''' |
| | from OpenGL import extensions |
| | return extensions.hasGLExtension( _EXTENSION_NAME ) |
| |
|
| |
|
| | |