1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
use super::*;
/// Represents an OpenGL context.
///
/// A `Context` is normally associated with a single Window, however `Context`s
/// can be *shared* between multiple windows or be headless.
///
/// # Example
///
/// ```no_run
/// # use glutin::ContextTrait;
/// # fn main() {
/// # let el = glutin::EventsLoop::new();
/// # let wb = glutin::WindowBuilder::new();
/// # let some_context = glutin::ContextBuilder::new()
/// # .build_windowed(wb, &el)
/// # .unwrap();
/// let cb = glutin::ContextBuilder::new()
/// .with_vsync(true)
/// .with_multisampling(8)
/// .with_shared_lists(some_context.context());
/// # }
/// ```
pub struct Context {
pub(crate) context: platform::Context,
}
impl ContextTrait for Context {
unsafe fn make_current(&self) -> Result<(), ContextError> {
self.context.make_current()
}
fn is_current(&self) -> bool {
self.context.is_current()
}
fn get_proc_address(&self, addr: &str) -> *const () {
self.context.get_proc_address(addr)
}
fn get_api(&self) -> Api {
self.context.get_api()
}
}
impl Context {
/// Builds the given GL context.
///
/// One notable limitation of the Wayland backend when it comes to shared
/// contexts is that both contexts must use the same events loop.
///
/// Errors can occur in two scenarios:
/// - If the window could not be created (via permission denied,
/// incompatible system, out of memory, etc.). This should be very rare.
/// - If the OpenGL context could not be created. This generally happens
/// because the underlying platform doesn't support a requested feature.
pub fn new_headless(
el: &winit::EventsLoop,
cb: ContextBuilder,
dims: dpi::PhysicalSize,
) -> Result<Self, CreationError> {
let ContextBuilder { pf_reqs, gl_attr } = cb;
let gl_attr = gl_attr.map_sharing(|ctx| &ctx.context);
platform::Context::new_headless(el, &pf_reqs, &gl_attr, dims)
.map(|context| Context { context })
}
}