use std::os::raw::c_void;
use device_gl::{Device, Factory, Resources as Res, create as gl_create, create_main_targets_raw};
use glutin::{NotCurrent, PossiblyCurrent, Context};
use core::format::{Format, DepthFormat, RenderFormat};
use core::handle::{DepthStencilView, RawDepthStencilView, RawRenderTargetView, RenderTargetView};
use core::memory::Typed;
use core::texture::Dimensions;
pub fn init_headless<Cf, Df>(context: Context<NotCurrent>, dim: Dimensions)
-> (Context<PossiblyCurrent>, Device, Factory,
RenderTargetView<Res, Cf>, DepthStencilView<Res, Df>)
where
Cf: RenderFormat,
Df: DepthFormat,
{
let (ctx, device, factory, color_view, ds_view) = init_headless_raw(context, dim,
Cf::get_format(),
Df::get_format());
(ctx, device, factory, Typed::new(color_view), Typed::new(ds_view))
}
pub fn init_headless_raw(context: Context<NotCurrent>, dim: Dimensions, color: Format, depth: Format)
-> (Context<PossiblyCurrent>, Device, Factory,
RawRenderTargetView<Res>, RawDepthStencilView<Res>)
{
let context = unsafe { context.make_current().unwrap() };
let (device, factory) = gl_create(|s| context.get_proc_address(s) as *const c_void);
let (color_view, ds_view) = create_main_targets_raw(dim, color.0, depth.0);
(context, device, factory, color_view, ds_view)
}
#[cfg(test)]
mod tests {
use super::*;
use core::format::{DepthStencil, Rgba8};
use core::texture::AaMode;
use core::Device;
#[test]
fn test_headless() {
use glutin::{ContextBuilder, EventsLoop};
let dim = (256, 256, 8, AaMode::Multi(4));
let events_loop = EventsLoop::new();
let context = ContextBuilder::new()
.with_hardware_acceleration(Some(false))
.build_headless(&events_loop, (dim.0 as u32, dim.1 as u32).into())
.expect("Failed to build headless context");
let (_, mut device, _, _, _) = init_headless::<Rgba8, DepthStencil>(context, dim);
device.cleanup();
}
}