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
use device::{Device, Factory, Resources};
use extra::stream::Stream;
use render::{Renderer, RenderFactory};
use render::target::Output;
pub trait Window<R: Resources>: Output<R> {
fn swap_buffers(&mut self);
}
pub struct Canvas<W, D: Device, F> {
pub output: W,
pub device: D,
pub factory: F,
pub renderer: Renderer<D::Resources, D::CommandBuffer>,
}
pub trait IntoCanvas<W, D: Device, F> {
fn into_canvas(self) -> Canvas<W, D, F>;
}
impl<W, D: Device, F: Factory<D::Resources>> IntoCanvas<W, D, F> for (W, D, F) {
fn into_canvas(mut self) -> Canvas<W, D, F> {
let renderer = self.2.create_renderer();
Canvas {
output: self.0,
device: self.1,
factory: self.2,
renderer: renderer,
}
}
}
impl<D: Device, F: Factory<D::Resources>, O: Output<D::Resources>>
Stream<D::Resources> for Canvas<O, D, F> {
type CommandBuffer = D::CommandBuffer;
type Output = O;
fn get_output(&self) -> &O {
&self.output
}
fn access(&mut self) -> (&mut Renderer<D::Resources, D::CommandBuffer>, &O) {
(&mut self.renderer, &self.output)
}
}
impl<D: Device, F: Factory<D::Resources>, W: Window<D::Resources>> Canvas<W, D, F> {
pub fn present(&mut self) {
self.device.submit(self.renderer.as_buffer());
self.output.swap_buffers();
self.device.after_frame();
self.factory.cleanup();
self.renderer.reset();
}
}