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 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
use raw_window_handle::HasRawWindowHandle; use std::ffi::c_void; use std::marker::PhantomData; #[cfg(target_os = "windows")] mod win; #[cfg(target_os = "windows")] use win as platform; #[cfg(target_os = "linux")] mod x11; #[cfg(target_os = "linux")] use crate::x11 as platform; #[cfg(target_os = "macos")] mod macos; #[cfg(target_os = "macos")] use macos as platform; pub struct GlConfig { pub version: (u8, u8), pub profile: Profile, pub red_bits: u8, pub blue_bits: u8, pub green_bits: u8, pub alpha_bits: u8, pub depth_bits: u8, pub stencil_bits: u8, pub samples: Option<u8>, pub srgb: bool, pub double_buffer: bool, pub vsync: bool, } impl Default for GlConfig { fn default() -> Self { GlConfig { version: (3, 2), profile: Profile::Core, red_bits: 8, blue_bits: 8, green_bits: 8, alpha_bits: 8, depth_bits: 24, stencil_bits: 8, samples: None, srgb: true, double_buffer: true, vsync: false, } } } #[derive(PartialEq, Eq)] pub enum Profile { Compatibility, Core, } #[derive(Debug)] pub enum GlError { InvalidWindowHandle, VersionNotSupported, CreationFailed, } pub struct GlContext { context: platform::GlContext, phantom: PhantomData<*mut ()>, } impl GlContext { pub fn create( parent: &impl HasRawWindowHandle, config: GlConfig, ) -> Result<GlContext, GlError> { platform::GlContext::create(parent, config).map(|context| GlContext { context, phantom: PhantomData, }) } pub fn make_current(&self) { self.context.make_current(); } pub fn make_not_current(&self) { self.context.make_not_current(); } pub fn get_proc_address(&self, symbol: &str) -> *const c_void { self.context.get_proc_address(symbol) } pub fn swap_buffers(&self) { self.context.swap_buffers(); } }