Struct glutin::ContextBuilder
source · pub struct ContextBuilder<'a> {
pub gl_attr: GlAttributes<&'a Context>,
/* private fields */
}
Expand description
Object that allows you to build Context
s.
Fields§
§gl_attr: GlAttributes<&'a Context>
The attributes to use to create the context.
Implementations§
source§impl<'a> ContextBuilder<'a>
impl<'a> ContextBuilder<'a>
sourcepub fn new() -> Self
pub fn new() -> Self
Initializes a new ContextBuilder
with default values.
Examples found in repository?
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
fn main() {
let mut events_loop = glutin::EventsLoop::new();
let window = glutin::WindowBuilder::new().with_title("A fantastic window!");
let context = glutin::ContextBuilder::new();
let gl_window = glutin::GlWindow::new(window, context, &events_loop).unwrap();
let _ = unsafe { gl_window.make_current() };
println!("Pixel format of the window's GL context: {:?}", gl_window.get_pixel_format());
let gl = support::load(&gl_window.context());
let mut running = true;
while running {
events_loop.poll_events(|event| {
println!("{:?}", event);
match event {
glutin::Event::WindowEvent { event, .. } => match event {
glutin::WindowEvent::CloseRequested => running = false,
glutin::WindowEvent::Resized(logical_size) => {
let dpi_factor = gl_window.get_hidpi_factor();
gl_window.resize(logical_size.to_physical(dpi_factor));
},
_ => (),
},
_ => ()
}
});
gl.draw_frame([1.0, 0.5, 0.7, 1.0]);
let _ = gl_window.swap_buffers();
}
}
More examples
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
fn main() {
let mut events_loop = glutin::EventsLoop::new();
let window = glutin::WindowBuilder::new()
.with_title("A transparent window!")
.with_decorations(false)
.with_transparency(true);
let context = glutin::ContextBuilder::new();
let gl_window = glutin::GlWindow::new(window, context, &events_loop).unwrap();
let _ = unsafe { gl_window.make_current() };
println!("Pixel format of the window's GL context: {:?}", gl_window.get_pixel_format());
let gl = support::load(&gl_window.context());
let mut running = true;
while running {
events_loop.poll_events(|event| {
println!("{:?}", event);
match event {
glutin::Event::WindowEvent { event, .. } => match event {
glutin::WindowEvent::CloseRequested => running = false,
glutin::WindowEvent::Resized(logical_size) => {
let dpi_factor = gl_window.get_hidpi_factor();
gl_window.resize(logical_size.to_physical(dpi_factor));
},
glutin::WindowEvent::KeyboardInput { input: glutin::KeyboardInput {
virtual_keycode: Some(glutin::VirtualKeyCode::Escape),
..
}, .. } => running = false,
_ => (),
},
_ => ()
}
});
gl.draw_frame([0.0; 4]);
let _ = gl_window.swap_buffers();
}
}
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
fn main() {
let mut events_loop = glutin::EventsLoop::new();
let mut windows = std::collections::HashMap::new();
for index in 0..3 {
let title = format!("Charming Window #{}", index + 1);
let window = glutin::WindowBuilder::new().with_title(title);
let context = glutin::ContextBuilder::new();
let gl_window = glutin::GlWindow::new(window, context, &events_loop).unwrap();
let _ = unsafe { gl_window.make_current() };
let gl = support::load(&gl_window.context());
let window_id = gl_window.id();
windows.insert(window_id, (gl_window, gl));
}
while !windows.is_empty() {
events_loop.poll_events(|event| {
println!("{:?}", event);
match event {
glutin::Event::WindowEvent { event, window_id } => match event {
glutin::WindowEvent::Resized(logical_size) => {
let gl_window = &windows[&window_id].0;
let dpi_factor = gl_window.get_hidpi_factor();
gl_window.resize(logical_size.to_physical(dpi_factor));
},
glutin::WindowEvent::CloseRequested => {
if windows.remove(&window_id).is_some() {
println!("Window with ID {:?} has been closed", window_id);
}
},
_ => (),
},
_ => (),
}
});
for (index, window) in windows.values().enumerate() {
let mut color = [1.0, 0.5, 0.7, 1.0];
color.swap(0, index % 3);
let _ = unsafe { window.0.make_current() };
window.1.draw_frame(color);
let _ = window.0.swap_buffers();
}
}
}
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 68 69 70 71 72 73 74 75 76
fn main() {
let mut events_loop = glutin::EventsLoop::new();
// enumerating monitors
let monitor = {
for (num, monitor) in events_loop.get_available_monitors().enumerate() {
println!("Monitor #{}: {:?}", num, monitor.get_name());
}
print!("Please write the number of the monitor to use: ");
io::stdout().flush().unwrap();
let mut num = String::new();
io::stdin().read_line(&mut num).unwrap();
let num = num.trim().parse().ok().expect("Please enter a number");
let monitor = events_loop.get_available_monitors().nth(num).expect("Please enter a valid ID");
println!("Using {:?}", monitor.get_name());
monitor
};
let window = glutin::WindowBuilder::new()
.with_title("Hello world!")
.with_fullscreen(Some(monitor));
let context = glutin::ContextBuilder::new();
let gl_window = glutin::GlWindow::new(window, context, &events_loop).unwrap();
let _ = unsafe { gl_window.make_current() };
let gl = support::load(&gl_window.context());
let mut fullscreen = true;
let mut running = true;
while running {
events_loop.poll_events(|event| {
println!("{:?}", event);
match event {
glutin::Event::WindowEvent { event, .. } => match event {
glutin::WindowEvent::CloseRequested => running = false,
glutin::WindowEvent::Resized(logical_size) => {
let dpi_factor = gl_window.get_hidpi_factor();
gl_window.resize(logical_size.to_physical(dpi_factor));
},
glutin::WindowEvent::KeyboardInput { input, .. } => {
match input.virtual_keycode {
Some(glutin::VirtualKeyCode::Escape) => running = false,
Some(glutin::VirtualKeyCode::F) if input.state == glutin::ElementState::Pressed => {
let monitor = if fullscreen {
None
} else {
Some(gl_window.get_current_monitor())
};
gl_window.set_fullscreen(monitor);
fullscreen = !fullscreen;
},
_ => (),
}
},
_ => (),
},
_ => ()
}
});
gl.draw_frame([1.0, 0.5, 0.7, 1.0]);
let _ = gl_window.swap_buffers();
}
}
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
fn main() {
let mut events_loop = glutin::EventsLoop::new();
let mut size = glutin::dpi::PhysicalSize::new(768., 480.);
let context = glutin::ContextBuilder::new();
let gl_context = glutin::Context::new(&events_loop, context, true).unwrap();
let window = glutin::WindowBuilder::new().with_title("A fantastic window!")
.with_dimensions(glutin::dpi::LogicalSize::from_physical(size, 1.0));
let context = glutin::ContextBuilder::new()
.with_shared_lists(&gl_context);
let gl_window = unsafe { glutin::GlWindow::new_shared(window, context, &events_loop).unwrap() };
let _ = unsafe { gl_window.make_current() };
println!("Pixel format of the window's GL context: {:?}", gl_window.get_pixel_format());
let glw = support::load(&gl_window.context());
let mut render_tex = 0;
unsafe {
glw.gl.GenTextures(1, &mut render_tex);
glw.gl.BindTexture(gl::TEXTURE_2D, render_tex);
glw.gl.TexStorage2D(
gl::TEXTURE_2D,
1,
gl::SRGB8_ALPHA8,
size.width as _,
size.height as _,
);
}
let mut window_fb = 0;
unsafe {
glw.gl.GenFramebuffers(1, &mut window_fb);
glw.gl.BindFramebuffer(gl::READ_FRAMEBUFFER, window_fb);
glw.gl.BindFramebuffer(gl::DRAW_FRAMEBUFFER, 0);
glw.gl.FramebufferTexture2D(
gl::READ_FRAMEBUFFER,
gl::COLOR_ATTACHMENT0,
gl::TEXTURE_2D,
render_tex,
0,
);
}
let _ = unsafe { gl_context.make_current() };
let glc = support::load(&gl_context);
let mut context_fb = 0;
unsafe {
glc.gl.GenFramebuffers(1, &mut context_fb);
glc.gl.BindFramebuffer(gl::FRAMEBUFFER, context_fb);
glc.gl.FramebufferTexture2D(
gl::FRAMEBUFFER,
gl::COLOR_ATTACHMENT0,
gl::TEXTURE_2D,
render_tex,
0,
);
glc.gl.Viewport(0, 0, size.width as _, size.height as _);
}
let mut running = true;
while running {
events_loop.poll_events(|event| {
println!("{:?}", event);
match event {
glutin::Event::WindowEvent { event, .. } => match event {
glutin::WindowEvent::CloseRequested => running = false,
glutin::WindowEvent::Resized(logical_size) => {
let _ = unsafe { gl_window.make_current() };
let dpi_factor = gl_window.get_hidpi_factor();
size = logical_size.to_physical(dpi_factor);
gl_window.resize(size);
unsafe {
let _ = gl_window.make_current();
glw.gl.DeleteTextures(1, &render_tex);
glw.gl.DeleteFramebuffers(1, &window_fb);
glw.gl.GenTextures(1, &mut render_tex);
glw.gl.BindTexture(gl::TEXTURE_2D, render_tex);
glw.gl.TexStorage2D(
gl::TEXTURE_2D,
1,
gl::SRGB8_ALPHA8,
size.width as _,
size.height as _,
);
glw.gl.GenFramebuffers(1, &mut window_fb);
glw.gl.BindFramebuffer(gl::READ_FRAMEBUFFER, window_fb);
glw.gl.BindFramebuffer(gl::DRAW_FRAMEBUFFER, 0);
glw.gl.FramebufferTexture2D(
gl::READ_FRAMEBUFFER,
gl::COLOR_ATTACHMENT0,
gl::TEXTURE_2D,
render_tex,
0,
);
let _ = gl_context.make_current();
glc.gl.DeleteFramebuffers(1, &context_fb);
glc.gl.GenFramebuffers(1, &mut context_fb);
glc.gl.BindFramebuffer(gl::FRAMEBUFFER, context_fb);
glc.gl.FramebufferTexture2D(
gl::FRAMEBUFFER,
gl::COLOR_ATTACHMENT0,
gl::TEXTURE_2D,
render_tex,
0,
);
glc.gl.Viewport(0, 0, size.width as _, size.height as _);
}
},
_ => (),
},
_ => ()
}
});
let _ = unsafe { gl_context.make_current() };
glc.draw_frame([1.0, 0.5, 0.7, 1.0]);
let _ = unsafe { gl_window.make_current() };
unsafe {
glw.gl.BlitFramebuffer(
0, 0, size.width as _, size.height as _,
0, 0, size.width as _, size.height as _,
gl::COLOR_BUFFER_BIT,
gl::NEAREST,
);
}
let _ = gl_window.swap_buffers();
}
unsafe {
let _ = gl_window.make_current();
glw.gl.DeleteTextures(1, &render_tex);
glw.gl.DeleteFramebuffers(1, &window_fb);
let _ = gl_context.make_current();
glc.gl.DeleteFramebuffers(1, &context_fb);
}
}
sourcepub fn with_gl(self, request: GlRequest) -> Self
pub fn with_gl(self, request: GlRequest) -> Self
Sets how the backend should choose the OpenGL API and version.
sourcepub fn with_gl_profile(self, profile: GlProfile) -> Self
pub fn with_gl_profile(self, profile: GlProfile) -> Self
Sets the desired OpenGL context profile.
sourcepub fn with_gl_debug_flag(self, flag: bool) -> Self
pub fn with_gl_debug_flag(self, flag: bool) -> Self
Sets the debug flag for the OpenGL context.
The default value for this flag is cfg!(debug_assertions)
, which means that it’s enabled
when you run cargo build
and disabled when you run cargo build --release
.
sourcepub fn with_gl_robustness(self, robustness: Robustness) -> Self
pub fn with_gl_robustness(self, robustness: Robustness) -> Self
Sets the robustness of the OpenGL context. See the docs of Robustness
.
sourcepub fn with_vsync(self, vsync: bool) -> Self
pub fn with_vsync(self, vsync: bool) -> Self
Requests that the window has vsync enabled.
By default, vsync is not enabled.
Share the display lists with the given Context
.
Examples found in repository?
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
fn main() {
let mut events_loop = glutin::EventsLoop::new();
let mut size = glutin::dpi::PhysicalSize::new(768., 480.);
let context = glutin::ContextBuilder::new();
let gl_context = glutin::Context::new(&events_loop, context, true).unwrap();
let window = glutin::WindowBuilder::new().with_title("A fantastic window!")
.with_dimensions(glutin::dpi::LogicalSize::from_physical(size, 1.0));
let context = glutin::ContextBuilder::new()
.with_shared_lists(&gl_context);
let gl_window = unsafe { glutin::GlWindow::new_shared(window, context, &events_loop).unwrap() };
let _ = unsafe { gl_window.make_current() };
println!("Pixel format of the window's GL context: {:?}", gl_window.get_pixel_format());
let glw = support::load(&gl_window.context());
let mut render_tex = 0;
unsafe {
glw.gl.GenTextures(1, &mut render_tex);
glw.gl.BindTexture(gl::TEXTURE_2D, render_tex);
glw.gl.TexStorage2D(
gl::TEXTURE_2D,
1,
gl::SRGB8_ALPHA8,
size.width as _,
size.height as _,
);
}
let mut window_fb = 0;
unsafe {
glw.gl.GenFramebuffers(1, &mut window_fb);
glw.gl.BindFramebuffer(gl::READ_FRAMEBUFFER, window_fb);
glw.gl.BindFramebuffer(gl::DRAW_FRAMEBUFFER, 0);
glw.gl.FramebufferTexture2D(
gl::READ_FRAMEBUFFER,
gl::COLOR_ATTACHMENT0,
gl::TEXTURE_2D,
render_tex,
0,
);
}
let _ = unsafe { gl_context.make_current() };
let glc = support::load(&gl_context);
let mut context_fb = 0;
unsafe {
glc.gl.GenFramebuffers(1, &mut context_fb);
glc.gl.BindFramebuffer(gl::FRAMEBUFFER, context_fb);
glc.gl.FramebufferTexture2D(
gl::FRAMEBUFFER,
gl::COLOR_ATTACHMENT0,
gl::TEXTURE_2D,
render_tex,
0,
);
glc.gl.Viewport(0, 0, size.width as _, size.height as _);
}
let mut running = true;
while running {
events_loop.poll_events(|event| {
println!("{:?}", event);
match event {
glutin::Event::WindowEvent { event, .. } => match event {
glutin::WindowEvent::CloseRequested => running = false,
glutin::WindowEvent::Resized(logical_size) => {
let _ = unsafe { gl_window.make_current() };
let dpi_factor = gl_window.get_hidpi_factor();
size = logical_size.to_physical(dpi_factor);
gl_window.resize(size);
unsafe {
let _ = gl_window.make_current();
glw.gl.DeleteTextures(1, &render_tex);
glw.gl.DeleteFramebuffers(1, &window_fb);
glw.gl.GenTextures(1, &mut render_tex);
glw.gl.BindTexture(gl::TEXTURE_2D, render_tex);
glw.gl.TexStorage2D(
gl::TEXTURE_2D,
1,
gl::SRGB8_ALPHA8,
size.width as _,
size.height as _,
);
glw.gl.GenFramebuffers(1, &mut window_fb);
glw.gl.BindFramebuffer(gl::READ_FRAMEBUFFER, window_fb);
glw.gl.BindFramebuffer(gl::DRAW_FRAMEBUFFER, 0);
glw.gl.FramebufferTexture2D(
gl::READ_FRAMEBUFFER,
gl::COLOR_ATTACHMENT0,
gl::TEXTURE_2D,
render_tex,
0,
);
let _ = gl_context.make_current();
glc.gl.DeleteFramebuffers(1, &context_fb);
glc.gl.GenFramebuffers(1, &mut context_fb);
glc.gl.BindFramebuffer(gl::FRAMEBUFFER, context_fb);
glc.gl.FramebufferTexture2D(
gl::FRAMEBUFFER,
gl::COLOR_ATTACHMENT0,
gl::TEXTURE_2D,
render_tex,
0,
);
glc.gl.Viewport(0, 0, size.width as _, size.height as _);
}
},
_ => (),
},
_ => ()
}
});
let _ = unsafe { gl_context.make_current() };
glc.draw_frame([1.0, 0.5, 0.7, 1.0]);
let _ = unsafe { gl_window.make_current() };
unsafe {
glw.gl.BlitFramebuffer(
0, 0, size.width as _, size.height as _,
0, 0, size.width as _, size.height as _,
gl::COLOR_BUFFER_BIT,
gl::NEAREST,
);
}
let _ = gl_window.swap_buffers();
}
unsafe {
let _ = gl_window.make_current();
glw.gl.DeleteTextures(1, &render_tex);
glw.gl.DeleteFramebuffers(1, &window_fb);
let _ = gl_context.make_current();
glc.gl.DeleteFramebuffers(1, &context_fb);
}
}
sourcepub fn with_multisampling(self, samples: u16) -> Self
pub fn with_multisampling(self, samples: u16) -> Self
Sets the multisampling level to request. A value of 0
indicates that multisampling must
not be enabled.
Panic
Will panic if samples
is not a power of two.
sourcepub fn with_depth_buffer(self, bits: u8) -> Self
pub fn with_depth_buffer(self, bits: u8) -> Self
Sets the number of bits in the depth buffer.
sourcepub fn with_stencil_buffer(self, bits: u8) -> Self
pub fn with_stencil_buffer(self, bits: u8) -> Self
Sets the number of bits in the stencil buffer.
sourcepub fn with_pixel_format(self, color_bits: u8, alpha_bits: u8) -> Self
pub fn with_pixel_format(self, color_bits: u8, alpha_bits: u8) -> Self
Sets the number of bits in the color buffer.
sourcepub fn with_stereoscopy(self) -> Self
pub fn with_stereoscopy(self) -> Self
Request the backend to be stereoscopic.
sourcepub fn with_srgb(self, srgb_enabled: bool) -> Self
pub fn with_srgb(self, srgb_enabled: bool) -> Self
Sets whether sRGB should be enabled on the window.
The default value is false
.
sourcepub fn with_double_buffer(self, double_buffer: Option<bool>) -> Self
pub fn with_double_buffer(self, double_buffer: Option<bool>) -> Self
Sets whether double buffering should be enabled.
The default value is None
.
Platform-specific
This option will be taken into account on the following platforms:
- MacOS
- Linux using GLX with X
- Windows using WGL
sourcepub fn with_hardware_acceleration(self, acceleration: Option<bool>) -> Self
pub fn with_hardware_acceleration(self, acceleration: Option<bool>) -> Self
Sets whether hardware acceleration is required.
The default value is Some(true)
Platform-specific
This option will be taken into account on the following platforms:
- MacOS
- Linux using EGL with either X or Wayland
- Windows using EGL or WGL
- Android using EGL