Reduce choose_config complexity
This commit is contained in:
parent
f8c97baf1d
commit
4b97ed8eba
|
@ -5,6 +5,7 @@ use crate::backend::egl::display::{EGLDisplay, EGLDisplayHandle};
|
|||
use crate::backend::egl::native::NativeSurface;
|
||||
use crate::backend::egl::{native, EGLSurface};
|
||||
use crate::backend::graphics::{PixelFormat, SwapBuffersError};
|
||||
use std::os::raw::c_int;
|
||||
use std::ptr;
|
||||
use std::sync::Arc;
|
||||
|
||||
|
@ -266,3 +267,70 @@ impl Default for PixelFormatRequirements {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl PixelFormatRequirements {
|
||||
/// Append the requirements to the given attribute list
|
||||
pub fn create_attributes(&self, out: &mut Vec<c_int>, logger: &slog::Logger) -> Result<(), Error> {
|
||||
if let Some(hardware_accelerated) = self.hardware_accelerated {
|
||||
out.push(ffi::egl::CONFIG_CAVEAT as c_int);
|
||||
out.push(if hardware_accelerated {
|
||||
trace!(logger, "Setting CONFIG_CAVEAT to NONE");
|
||||
ffi::egl::NONE as c_int
|
||||
} else {
|
||||
trace!(logger, "Setting CONFIG_CAVEAT to SLOW_CONFIG");
|
||||
ffi::egl::SLOW_CONFIG as c_int
|
||||
});
|
||||
}
|
||||
|
||||
if let Some(color) = self.color_bits {
|
||||
trace!(logger, "Setting RED_SIZE to {}", color / 3);
|
||||
out.push(ffi::egl::RED_SIZE as c_int);
|
||||
out.push((color / 3) as c_int);
|
||||
trace!(
|
||||
logger,
|
||||
"Setting GREEN_SIZE to {}",
|
||||
color / 3 + if color % 3 != 0 { 1 } else { 0 }
|
||||
);
|
||||
out.push(ffi::egl::GREEN_SIZE as c_int);
|
||||
out.push((color / 3 + if color % 3 != 0 { 1 } else { 0 }) as c_int);
|
||||
trace!(
|
||||
logger,
|
||||
"Setting BLUE_SIZE to {}",
|
||||
color / 3 + if color % 3 == 2 { 1 } else { 0 }
|
||||
);
|
||||
out.push(ffi::egl::BLUE_SIZE as c_int);
|
||||
out.push((color / 3 + if color % 3 == 2 { 1 } else { 0 }) as c_int);
|
||||
}
|
||||
|
||||
if let Some(alpha) = self.alpha_bits {
|
||||
trace!(logger, "Setting ALPHA_SIZE to {}", alpha);
|
||||
out.push(ffi::egl::ALPHA_SIZE as c_int);
|
||||
out.push(alpha as c_int);
|
||||
}
|
||||
|
||||
if let Some(depth) = self.depth_bits {
|
||||
trace!(logger, "Setting DEPTH_SIZE to {}", depth);
|
||||
out.push(ffi::egl::DEPTH_SIZE as c_int);
|
||||
out.push(depth as c_int);
|
||||
}
|
||||
|
||||
if let Some(stencil) = self.stencil_bits {
|
||||
trace!(logger, "Setting STENCIL_SIZE to {}", stencil);
|
||||
out.push(ffi::egl::STENCIL_SIZE as c_int);
|
||||
out.push(stencil as c_int);
|
||||
}
|
||||
|
||||
if let Some(multisampling) = self.multisampling {
|
||||
trace!(logger, "Setting SAMPLES to {}", multisampling);
|
||||
out.push(ffi::egl::SAMPLES as c_int);
|
||||
out.push(multisampling as c_int);
|
||||
}
|
||||
|
||||
if self.stereoscopy {
|
||||
error!(logger, "Stereoscopy is currently unsupported (sorry!)");
|
||||
return Err(Error::NoAvailablePixelFormat);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -214,65 +214,7 @@ impl<B: native::Backend, N: native::NativeDisplay<B>> EGLDisplay<B, N> {
|
|||
(_, _) => unreachable!(),
|
||||
};
|
||||
|
||||
if let Some(hardware_accelerated) = reqs.hardware_accelerated {
|
||||
out.push(ffi::egl::CONFIG_CAVEAT as c_int);
|
||||
out.push(if hardware_accelerated {
|
||||
trace!(self.logger, "Setting CONFIG_CAVEAT to NONE");
|
||||
ffi::egl::NONE as c_int
|
||||
} else {
|
||||
trace!(self.logger, "Setting CONFIG_CAVEAT to SLOW_CONFIG");
|
||||
ffi::egl::SLOW_CONFIG as c_int
|
||||
});
|
||||
}
|
||||
|
||||
if let Some(color) = reqs.color_bits {
|
||||
trace!(self.logger, "Setting RED_SIZE to {}", color / 3);
|
||||
out.push(ffi::egl::RED_SIZE as c_int);
|
||||
out.push((color / 3) as c_int);
|
||||
trace!(
|
||||
self.logger,
|
||||
"Setting GREEN_SIZE to {}",
|
||||
color / 3 + if color % 3 != 0 { 1 } else { 0 }
|
||||
);
|
||||
out.push(ffi::egl::GREEN_SIZE as c_int);
|
||||
out.push((color / 3 + if color % 3 != 0 { 1 } else { 0 }) as c_int);
|
||||
trace!(
|
||||
self.logger,
|
||||
"Setting BLUE_SIZE to {}",
|
||||
color / 3 + if color % 3 == 2 { 1 } else { 0 }
|
||||
);
|
||||
out.push(ffi::egl::BLUE_SIZE as c_int);
|
||||
out.push((color / 3 + if color % 3 == 2 { 1 } else { 0 }) as c_int);
|
||||
}
|
||||
|
||||
if let Some(alpha) = reqs.alpha_bits {
|
||||
trace!(self.logger, "Setting ALPHA_SIZE to {}", alpha);
|
||||
out.push(ffi::egl::ALPHA_SIZE as c_int);
|
||||
out.push(alpha as c_int);
|
||||
}
|
||||
|
||||
if let Some(depth) = reqs.depth_bits {
|
||||
trace!(self.logger, "Setting DEPTH_SIZE to {}", depth);
|
||||
out.push(ffi::egl::DEPTH_SIZE as c_int);
|
||||
out.push(depth as c_int);
|
||||
}
|
||||
|
||||
if let Some(stencil) = reqs.stencil_bits {
|
||||
trace!(self.logger, "Setting STENCIL_SIZE to {}", stencil);
|
||||
out.push(ffi::egl::STENCIL_SIZE as c_int);
|
||||
out.push(stencil as c_int);
|
||||
}
|
||||
|
||||
if let Some(multisampling) = reqs.multisampling {
|
||||
trace!(self.logger, "Setting SAMPLES to {}", multisampling);
|
||||
out.push(ffi::egl::SAMPLES as c_int);
|
||||
out.push(multisampling as c_int);
|
||||
}
|
||||
|
||||
if reqs.stereoscopy {
|
||||
error!(self.logger, "Stereoscopy is currently unsupported (sorry!)");
|
||||
return Err(Error::NoAvailablePixelFormat);
|
||||
}
|
||||
reqs.create_attributes(&mut out, &self.logger)?;
|
||||
|
||||
out.push(ffi::egl::NONE as c_int);
|
||||
out
|
||||
|
|
Loading…
Reference in New Issue