glium::program!
[−]
[src]
macro_rules! program { ($facade:expr,) => ( Err($crate::program::ProgramChooserCreationError::NoVersion) ); ($facade:expr,,$($rest:tt)*) => ( program!($facade,$($rest)*) ); ($facade:expr, $num:tt => $($rest:tt)*) => ( { let context = $crate::backend::Facade::get_context($facade); let version = program!(_parse_num_gl $num); program!(_inner, context, version, $($rest)*) } ); ($facade:expr, $num:tt es => $($rest:tt)*) => ( { let context = $crate::backend::Facade::get_context($facade); let version = program!(_parse_num_gles $num); program!(_inner, context, version, $($rest)*) } ); (_inner, $context:ident, $vers:ident, {$($ty:ident:$src:expr),+}$($rest:tt)*) => ( if $context.is_glsl_version_supported(&$vers) { let _vertex_shader: &str = ""; let _tessellation_control_shader: Option<&str> = None; let _tessellation_evaluation_shader: Option<&str> = None; let _geometry_shader: Option<&str> = None; let _fragment_shader: &str = ""; let _outputs_srgb: bool = false; let _uses_point_size: bool = false; $( program!(_program_ty $ty, $src, _vertex_shader, _tessellation_control_shader, _tessellation_evaluation_shader, _geometry_shader, _fragment_shader, _outputs_srgb, _uses_point_size); )+ let input = $crate::program::ProgramCreationInput::SourceCode { vertex_shader: _vertex_shader, tessellation_control_shader: _tessellation_control_shader, tessellation_evaluation_shader: _tessellation_evaluation_shader, geometry_shader: _geometry_shader, fragment_shader: _fragment_shader, transform_feedback_varyings: None, outputs_srgb: _outputs_srgb, uses_point_size: _uses_point_size, }; $crate::program::Program::new($context, input) .map_err(|err| $crate::program::ProgramChooserCreationError::from(err)) } else { program!($context, $($rest)*) } ); (_inner, $context:ident, $vers:ident, {$($ty:ident:$src:expr),+,}$($rest:tt)*) => ( program!(_inner, $context, $vers, {$($ty:$src),+} $($rest)*); ); (_program_ty vertex, $src:expr, $vs:ident, $tcs:ident, $tes:ident, $gs:ident, $fs:ident, $srgb:ident, $ps:ident) => ( let $vs = $src; ); (_program_ty tessellation_control, $src:expr, $vs:ident, $tcs:ident, $tes:ident, $gs:ident, $fs:ident, $srgb:ident, $ps:ident) => ( let $tcs = Some($src); ); (_program_ty tessellation_evaluation, $src:expr, $vs:ident, $tcs:ident, $tes:ident, $gs:ident, $fs:ident, $srgb:ident, $ps:ident) => ( let $tes = Some($src); ); (_program_ty geometry, $src:expr, $vs:ident, $tcs:ident, $tes:ident, $gs:ident, $fs:ident, $srgb:ident, $ps:ident) => ( let $gs = Some($src); ); (_program_ty fragment, $src:expr, $vs:ident, $tcs:ident, $tes:ident, $gs:ident, $fs:ident, $srgb:ident, $ps:ident) => ( let $fs = $src; ); (_program_ty point_size, $src:expr, $vs:ident, $tcs:ident, $tes:ident, $gs:ident, $fs:ident, $srgb:ident, $ps:ident) => ( let $ps = $src; ); (_program_ty outputs_srgb, $src:expr, $vs:ident, $tcs:ident, $tes:ident, $gs:ident, $fs:ident, $srgb:ident, $ps:ident) => ( let $srgb = $src; ); (_parse_num_gl $num:expr) => ( if $num == 100 { $crate::Version($crate::Api::GlEs, 1, 0) } else { let num: u32 = $num; $crate::Version($crate::Api::Gl, ($num / 100) as u8, ((num % 100) / 10) as u8) } ); (_parse_num_gles $num:expr) => ({ let num: u32 = $num; $crate::Version($crate::Api::GlEs, ($num / 100) as u8, (($num % 100) / 10) as u8) }); }
Builds a program depending on the GLSL version supported by the backend.
This is implemented with successive calls to is_glsl_version_supported()
.
Returns a glium::program::ProgramChooserCreationError
.
Example
let program = program!(&display, 300 => { vertex: r#" #version 300 fn main() { gl_Position = vec4(0.0, 0.0, 0.0, 1.0); } "#, fragment: r#" #version 300 out vec4 color; fn main() { color = vec4(1.0, 1.0, 0.0, 1.0); } "#, }, 110 => { vertex: r#" #version 110 fn main() { gl_Position = vec4(0.0, 0.0, 0.0, 1.0); } "#, fragment: r#" #version 110 fn main() { gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); } "#, }, 300 es => { vertex: r#" #version 110 fn main() { gl_Position = vec4(0.0, 0.0, 0.0, 1.0); } "#, fragment: r#" #version 110 fn main() { gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); } "#, }, );