Extract PixelFormatRequirements from BuilderAttribs

This commit is contained in:
Pierre Krieger 2015-09-21 09:33:41 +02:00
parent 48fe9b2644
commit 58b3bfb4fb
3 changed files with 49 additions and 40 deletions

View file

@ -471,16 +471,16 @@ impl Window {
// full color size and hope for the best. Another hiccup is that // full color size and hope for the best. Another hiccup is that
// `NSOpenGLPFAColorSize` also includes `NSOpenGLPFAAlphaSize`, // `NSOpenGLPFAColorSize` also includes `NSOpenGLPFAAlphaSize`,
// so we have to account for that as well. // so we have to account for that as well.
let alpha_depth = builder.alpha_bits.unwrap_or(8); let alpha_depth = builder.pf_reqs.alpha_bits.unwrap_or(8);
let color_depth = builder.color_bits.unwrap_or(24) + alpha_depth; let color_depth = builder.pf_reqs.color_bits.unwrap_or(24) + alpha_depth;
let mut attributes = vec![ let mut attributes = vec![
NSOpenGLPFADoubleBuffer as u32, NSOpenGLPFADoubleBuffer as u32,
NSOpenGLPFAClosestPolicy as u32, NSOpenGLPFAClosestPolicy as u32,
NSOpenGLPFAColorSize as u32, color_depth as u32, NSOpenGLPFAColorSize as u32, color_depth as u32,
NSOpenGLPFAAlphaSize as u32, alpha_depth as u32, NSOpenGLPFAAlphaSize as u32, alpha_depth as u32,
NSOpenGLPFADepthSize as u32, builder.depth_bits.unwrap_or(24) as u32, NSOpenGLPFADepthSize as u32, builder.pf_reqs.depth_bits.unwrap_or(24) as u32,
NSOpenGLPFAStencilSize as u32, builder.stencil_bits.unwrap_or(8) as u32, NSOpenGLPFAStencilSize as u32, builder.pf_reqs.stencil_bits.unwrap_or(8) as u32,
NSOpenGLPFAOpenGLProfile as u32, profile, NSOpenGLPFAOpenGLProfile as u32, profile,
]; ];
@ -491,7 +491,7 @@ impl Window {
attributes.push(NSOpenGLPFAColorFloat as u32); attributes.push(NSOpenGLPFAColorFloat as u32);
} }
builder.multisampling.map(|samples| { builder.pf_reqs.multisampling.map(|samples| {
attributes.push(NSOpenGLPFAMultisample as u32); attributes.push(NSOpenGLPFAMultisample as u32);
attributes.push(NSOpenGLPFASampleBuffers as u32); attributes.push(1); attributes.push(NSOpenGLPFASampleBuffers as u32); attributes.push(1);
attributes.push(NSOpenGLPFASamples as u32); attributes.push(samples as u32); attributes.push(NSOpenGLPFASamples as u32); attributes.push(samples as u32);

View file

@ -371,13 +371,7 @@ pub struct BuilderAttribs<'a> {
#[allow(dead_code)] #[allow(dead_code)]
headless: bool, headless: bool,
strict: bool, strict: bool,
multisampling: Option<u16>, pf_reqs: PixelFormatRequirements,
depth_bits: Option<u8>,
stencil_bits: Option<u8>,
color_bits: Option<u8>,
alpha_bits: Option<u8>,
stereoscopy: bool,
srgb: Option<bool>,
window: WindowAttributes, window: WindowAttributes,
opengl: GlAttributes<&'a platform::Window>, opengl: GlAttributes<&'a platform::Window>,
} }
@ -387,13 +381,7 @@ impl BuilderAttribs<'static> {
BuilderAttribs { BuilderAttribs {
headless: false, headless: false,
strict: false, strict: false,
multisampling: None, pf_reqs: Default::default(),
depth_bits: None,
stencil_bits: None,
color_bits: None,
alpha_bits: None,
stereoscopy: false,
srgb: None,
window: Default::default(), window: Default::default(),
opengl: Default::default(), opengl: Default::default(),
} }
@ -408,13 +396,7 @@ impl<'a> BuilderAttribs<'a> {
let new_attribs = BuilderAttribs { let new_attribs = BuilderAttribs {
headless: self.headless, headless: self.headless,
strict: self.strict, strict: self.strict,
multisampling: self.multisampling, pf_reqs: self.pf_reqs,
depth_bits: self.depth_bits,
stencil_bits: self.stencil_bits,
color_bits: self.color_bits,
alpha_bits: self.alpha_bits,
stereoscopy: self.stereoscopy,
srgb: self.srgb,
window: self.window, window: self.window,
opengl: GlAttributes { opengl: GlAttributes {
sharing: None, sharing: None,
@ -434,27 +416,27 @@ impl<'a> BuilderAttribs<'a> {
{ {
// filtering formats that don't match the requirements // filtering formats that don't match the requirements
let iter = iter.into_iter().filter(|&(_, ref format)| { let iter = iter.into_iter().filter(|&(_, ref format)| {
if format.color_bits < self.color_bits.unwrap_or(0) { if format.color_bits < self.pf_reqs.color_bits.unwrap_or(0) {
return false; return false;
} }
if format.alpha_bits < self.alpha_bits.unwrap_or(0) { if format.alpha_bits < self.pf_reqs.alpha_bits.unwrap_or(0) {
return false; return false;
} }
if format.depth_bits < self.depth_bits.unwrap_or(0) { if format.depth_bits < self.pf_reqs.depth_bits.unwrap_or(0) {
return false; return false;
} }
if format.stencil_bits < self.stencil_bits.unwrap_or(0) { if format.stencil_bits < self.pf_reqs.stencil_bits.unwrap_or(0) {
return false; return false;
} }
if !format.stereoscopy && self.stereoscopy { if !format.stereoscopy && self.pf_reqs.stereoscopy {
return false; return false;
} }
if let Some(req_ms) = self.multisampling { if let Some(req_ms) = self.pf_reqs.multisampling {
match format.multisampling { match format.multisampling {
Some(val) if val >= req_ms => (), Some(val) if val >= req_ms => (),
_ => return false _ => return false
@ -465,7 +447,7 @@ impl<'a> BuilderAttribs<'a> {
} }
} }
if let Some(srgb) = self.srgb { if let Some(srgb) = self.pf_reqs.srgb {
if srgb != format.srgb { if srgb != format.srgb {
return false; return false;
} }
@ -529,6 +511,33 @@ impl<'a> BuilderAttribs<'a> {
} }
} }
/// VERY UNSTABLE! Describes how the backend should choose a pixel format.
#[derive(Clone, Debug)]
#[allow(missing_docs)]
pub struct PixelFormatRequirements {
pub multisampling: Option<u16>,
pub depth_bits: Option<u8>,
pub stencil_bits: Option<u8>,
pub color_bits: Option<u8>,
pub alpha_bits: Option<u8>,
pub stereoscopy: bool,
pub srgb: Option<bool>,
}
impl Default for PixelFormatRequirements {
fn default() -> PixelFormatRequirements {
PixelFormatRequirements {
multisampling: None,
depth_bits: None,
stencil_bits: None,
color_bits: None,
alpha_bits: None,
stereoscopy: false,
srgb: None,
}
}
}
/// Attributes to use when creating a window. /// Attributes to use when creating a window.
#[derive(Clone)] #[derive(Clone)]
pub struct WindowAttributes { pub struct WindowAttributes {

View file

@ -110,38 +110,38 @@ impl<'a> WindowBuilder<'a> {
/// Will panic if `samples` is not a power of two. /// Will panic if `samples` is not a power of two.
pub fn with_multisampling(mut self, samples: u16) -> WindowBuilder<'a> { pub fn with_multisampling(mut self, samples: u16) -> WindowBuilder<'a> {
assert!(samples.is_power_of_two()); assert!(samples.is_power_of_two());
self.attribs.multisampling = Some(samples); self.attribs.pf_reqs.multisampling = Some(samples);
self self
} }
/// Sets the number of bits in the depth buffer. /// Sets the number of bits in the depth buffer.
pub fn with_depth_buffer(mut self, bits: u8) -> WindowBuilder<'a> { pub fn with_depth_buffer(mut self, bits: u8) -> WindowBuilder<'a> {
self.attribs.depth_bits = Some(bits); self.attribs.pf_reqs.depth_bits = Some(bits);
self self
} }
/// Sets the number of bits in the stencil buffer. /// Sets the number of bits in the stencil buffer.
pub fn with_stencil_buffer(mut self, bits: u8) -> WindowBuilder<'a> { pub fn with_stencil_buffer(mut self, bits: u8) -> WindowBuilder<'a> {
self.attribs.stencil_bits = Some(bits); self.attribs.pf_reqs.stencil_bits = Some(bits);
self self
} }
/// Sets the number of bits in the color buffer. /// Sets the number of bits in the color buffer.
pub fn with_pixel_format(mut self, color_bits: u8, alpha_bits: u8) -> WindowBuilder<'a> { pub fn with_pixel_format(mut self, color_bits: u8, alpha_bits: u8) -> WindowBuilder<'a> {
self.attribs.color_bits = Some(color_bits); self.attribs.pf_reqs.color_bits = Some(color_bits);
self.attribs.alpha_bits = Some(alpha_bits); self.attribs.pf_reqs.alpha_bits = Some(alpha_bits);
self self
} }
/// Request the backend to be stereoscopic. /// Request the backend to be stereoscopic.
pub fn with_stereoscopy(mut self) -> WindowBuilder<'a> { pub fn with_stereoscopy(mut self) -> WindowBuilder<'a> {
self.attribs.stereoscopy = true; self.attribs.pf_reqs.stereoscopy = true;
self self
} }
/// Sets whether sRGB should be enabled on the window. `None` means "I don't care". /// Sets whether sRGB should be enabled on the window. `None` means "I don't care".
pub fn with_srgb(mut self, srgb_enabled: Option<bool>) -> WindowBuilder<'a> { pub fn with_srgb(mut self, srgb_enabled: Option<bool>) -> WindowBuilder<'a> {
self.attribs.srgb = srgb_enabled; self.attribs.pf_reqs.srgb = srgb_enabled;
self self
} }