pub struct GPUBuilder<'a> { /* private fields */ }Implementations§
Source§impl<'a> GPUBuilder<'a>
impl<'a> GPUBuilder<'a>
Sourcepub fn set_window(self, window: &'a mut Window) -> Self
pub fn set_window(self, window: &'a mut Window) -> Self
Sets the window for this GPU instance.
This is useful for creating a GPU instance that is bound to a specific window. The window must be created before this GPU instance.
Sourcepub fn set_adapter(self, adapter: &'a GPUAdapter) -> Self
pub fn set_adapter(self, adapter: &'a GPUAdapter) -> Self
Sets the GPU adapter for this GPU instance.
This is useful for creating a GPU instance that uses a specific GPU adapter.
The adapter can be queried using the Engine::query_gpu_adapter function.
Examples found in repository?
examples/gpu_adapter.rs (line 30)
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7 let mut window = runner
8 .create_window("Engine Example", Point2::new(800, 600))
9 .build()
10 .expect("Failed to create window");
11
12 let adapters = est_render::gpu::query_gpu_adapter(Some(&window));
13 if adapters.is_empty() {
14 eprintln!("No GPU adapters found. Exiting.");
15 return;
16 }
17
18 let selected_adapter = adapters
19 .iter()
20 .find(|adapter| adapter.backend_enum == AdapterBackend::Vulkan)
21 .cloned();
22
23 if selected_adapter.is_none() {
24 eprintln!("No suitable GPU adapter found. Exiting.");
25 return;
26 }
27
28 let adapter = selected_adapter.unwrap();
29 let mut gpu = est_render::gpu::new(Some(&mut window))
30 .set_adapter(&adapter)
31 .build()
32 .expect("Failed to create GPU");
33
34 while runner.pool_events(None) {
35 for event in runner.get_events() {
36 match event {
37 Event::WindowClosed { .. } => {
38 return;
39 }
40 _ => {}
41 }
42 }
43
44 if let Ok(mut cmd) = gpu.begin_command() {
45 if let Ok(mut rp) = cmd.begin_renderpass() {
46 rp.set_clear_color(Color::LIGHTBLUE);
47 }
48 }
49 }
50}pub fn set_limits(self, limits: Limits) -> Self
Sourcepub fn build(self) -> Result<GPU, String>
pub fn build(self) -> Result<GPU, String>
Examples found in repository?
examples/clear_color.rs (line 14)
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7
8 let mut window = runner
9 .create_window("Clear Color Example", Point2::new(800, 600))
10 .build()
11 .expect("Failed to create window");
12
13 let mut gpu = est_render::gpu::new(Some(&mut window))
14 .build()
15 .expect("Failed to create GPU");
16
17 while runner.pool_events(None) {
18 for event in runner.get_events() {
19 match event {
20 Event::WindowClosed { .. } => {
21 return;
22 }
23 _ => {}
24 }
25 }
26
27 if let Ok(mut cmd) = gpu.begin_command() {
28 let surface = cmd.get_surface_texture();
29 if surface.is_err() {
30 println!("Failed to get surface texture: {:?}", surface.err());
31 continue;
32 }
33
34 // Or you could use `cmd.begin_renderpass()` directly
35 if let Ok(mut rp) = cmd.renderpass_builder()
36 .add_surface_color_attachment(surface.as_ref().unwrap(), Some(&BlendState::ALPHA_BLEND))
37 .build()
38 {
39 rp.set_clear_color(Color::BLUE);
40 }
41 }
42 }
43}More examples
examples/gpu_adapter.rs (line 31)
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7 let mut window = runner
8 .create_window("Engine Example", Point2::new(800, 600))
9 .build()
10 .expect("Failed to create window");
11
12 let adapters = est_render::gpu::query_gpu_adapter(Some(&window));
13 if adapters.is_empty() {
14 eprintln!("No GPU adapters found. Exiting.");
15 return;
16 }
17
18 let selected_adapter = adapters
19 .iter()
20 .find(|adapter| adapter.backend_enum == AdapterBackend::Vulkan)
21 .cloned();
22
23 if selected_adapter.is_none() {
24 eprintln!("No suitable GPU adapter found. Exiting.");
25 return;
26 }
27
28 let adapter = selected_adapter.unwrap();
29 let mut gpu = est_render::gpu::new(Some(&mut window))
30 .set_adapter(&adapter)
31 .build()
32 .expect("Failed to create GPU");
33
34 while runner.pool_events(None) {
35 for event in runner.get_events() {
36 match event {
37 Event::WindowClosed { .. } => {
38 return;
39 }
40 _ => {}
41 }
42 }
43
44 if let Ok(mut cmd) = gpu.begin_command() {
45 if let Ok(mut rp) = cmd.begin_renderpass() {
46 rp.set_clear_color(Color::LIGHTBLUE);
47 }
48 }
49 }
50}examples/drawing.rs (line 14)
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7
8 let mut window = runner
9 .create_window("Drawing Example", Point2::new(800, 600))
10 .build()
11 .expect("Failed to create window");
12
13 let mut gpu = est_render::gpu::new(Some(&mut window))
14 .build()
15 .expect("Failed to create GPU");
16
17 while runner.pool_events(None) {
18 for event in runner.get_events() {
19 match event {
20 Event::WindowClosed { .. } => {
21 return;
22 }
23 _ => {}
24 }
25 }
26
27 if let Ok(mut cmd) = gpu.begin_command() {
28 if let Ok(mut gp) = cmd.begin_renderpass() {
29 gp.set_clear_color(Color::BLUE); // Set the clear color to blue
30
31 gp.set_blend(0, Some(&BlendState::ALPHA_BLEND));
32 if let Some(mut drawing) = gp.begin_drawing() {
33 drawing.draw_rect_filled(
34 Vector2::new(100.0, 100.0),
35 Vector2::new(200.0, 200.0),
36 Color::RED,
37 );
38
39 drawing.draw_circle_filled(Vector2::new(400.0, 300.0), 50.0, 25, Color::GREEN);
40 }
41
42 gp.set_blend(0, Some(&BlendState::ADDITIVE_BLEND));
43 if let Some(mut drawing) = gp.begin_drawing() {
44 drawing.draw_text(
45 "Hello, World!",
46 Vector2::new(300.0, 500.0),
47 Color::WHITE,
48 );
49 }
50 }
51 }
52 }
53}examples/font.rs (line 14)
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7
8 let mut window = runner
9 .create_window("Font Example", Point2::new(800, 600))
10 .build()
11 .expect("Failed to create window");
12
13 let mut gpu = est_render::gpu::new(Some(&mut window))
14 .build()
15 .expect("Failed to create GPU");
16
17 let mut font_manager = est_render::font::new();
18
19 let font = font_manager
20 .load_font("Arial", None, 20.0)
21 .expect("Failed to load font");
22
23 // Generate baked text texture
24 let texture = font
25 .create_baked_text(&mut gpu, "Hello, World!\nThis is a clear color example.")
26 .expect("Failed to create baked text");
27
28 while runner.pool_events(None) {
29 for event in runner.get_events() {
30 match event {
31 Event::WindowClosed { .. } => {
32 return;
33 }
34 _ => {}
35 }
36 }
37
38 if let Ok(mut cmd) = gpu.begin_command() {
39 if let Ok(mut gp) = cmd.begin_renderpass() {
40 gp.set_clear_color(Color::BLUE);
41
42 // The best texture blend for font rendering, others may has artifacts like black borders
43 gp.set_blend(0, Some(&BlendState::ADDITIVE_BLEND));
44
45 if let Some(mut drawing) = gp.begin_drawing() {
46 let size: Vector2 = texture.size().into();
47
48 // Baked text rendering
49 drawing.set_texture(Some(&texture));
50 drawing.draw_rect_image(Vector2::new(0.0, 0.0), size, Color::WHITE);
51
52 // Online text rendering
53 drawing.set_font(&font);
54 drawing.draw_text(
55 "Hello, World!\nThis is a clear color example.",
56 Vector2::new(size.x, 0.0),
57 Color::WHITE,
58 );
59 }
60 }
61 }
62 }
63}examples/texture_atlas.rs (line 14)
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7
8 let mut window = runner
9 .create_window("Clear Color Example", Point2::new(800, 600))
10 .build()
11 .expect("Failed to create window");
12
13 let mut gpu = est_render::gpu::new(Some(&mut window))
14 .build()
15 .expect("Failed to create GPU");
16
17 let texture_atlas = gpu
18 .create_texture_atlas()
19 .add_texture_file(
20 "example_texture",
21 "./examples/resources/test1.png",
22 )
23 .add_texture_file(
24 "example_texture2",
25 "./examples/resources/test2.png",
26 )
27 .build()
28 .expect("Failed to create texture atlas");
29
30 while runner.pool_events(None) {
31 for event in runner.get_events() {
32 match event {
33 Event::WindowClosed { .. } => {
34 return;
35 }
36 _ => {}
37 }
38 }
39
40 if let Ok(mut cmd) = gpu.begin_command() {
41 if let Ok(mut gp) = cmd.begin_renderpass() {
42 gp.set_clear_color(Color::BLUEVIOLET);
43 gp.set_blend(0, Some(&BlendState::NONE));
44
45 if let Some(mut drawing) = gp.begin_drawing() {
46 drawing.set_texture_atlas(Some((&texture_atlas, "example_texture")));
47 drawing.draw_rect_image(
48 Vector2::new(100.0, 100.0),
49 Vector2::new(200.0, 200.0),
50 Color::WHITE,
51 );
52 drawing.set_texture_atlas(Some((&texture_atlas, "example_texture2")));
53 drawing.draw_rect_image(
54 Vector2::new(350.0, 100.0),
55 Vector2::new(200.0, 200.0),
56 Color::WHITE,
57 );
58 drawing.draw_circle_image(Vector2::new(600.0, 200.0), 100.0, 20, Color::WHITE);
59 }
60 }
61 }
62 }
63}examples/msaa.rs (line 13)
5fn main() {
6 let mut runner = est_render::runner::new().expect("Failed to create runner");
7 let mut window = runner
8 .create_window("Engine Example", Point2::new(800, 600))
9 .build()
10 .expect("Failed to create window");
11
12 let mut gpu = est_render::gpu::new(Some(&mut window))
13 .build()
14 .expect("Failed to create GPU");
15
16 let mut msaa_texture = Some(
17 gpu.create_texture()
18 .set_render_target(Point2::new(800, 600), None)
19 .set_usage(TextureUsage::Sampler)
20 .set_sample_count(SampleCount::SampleCount4)
21 .build()
22 .expect("Failed to create MSAA texture"),
23 );
24
25 let mut msaa_count = SampleCount::SampleCount4;
26 let mut window_size = Point2::new(800, 600);
27
28 while runner.pool_events(None) {
29 for event in runner.get_events() {
30 match event {
31 Event::WindowClosed { .. } => {
32 return;
33 }
34 Event::KeyboardInput { key, pressed, .. } => {
35 if !*pressed {
36 continue;
37 }
38
39 let mut need_recreate = false;
40 if *key == "1" {
41 msaa_count = SampleCount::SampleCount1;
42 need_recreate = true;
43 }
44
45 if *key == "2" {
46 msaa_count = SampleCount::SampleCount2;
47 need_recreate = true;
48 }
49
50 if *key == "3" {
51 msaa_count = SampleCount::SampleCount4;
52 need_recreate = true;
53 }
54
55 if *key == "4" {
56 msaa_count = SampleCount::SampleCount8;
57 need_recreate = true;
58 }
59
60 if need_recreate {
61 if msaa_count == SampleCount::SampleCount1 {
62 msaa_texture = None;
63 } else {
64 msaa_texture = Some(
65 gpu.create_texture()
66 .set_render_target(
67 Point2::new(window_size.x, window_size.y),
68 None,
69 )
70 .set_usage(TextureUsage::Sampler)
71 .set_sample_count(msaa_count)
72 .build()
73 .expect("Failed to recreate MSAA texture"),
74 );
75 }
76 }
77 }
78 Event::WindowResized { size, .. } => {
79 if size.x <= 0 || size.y <= 0 {
80 eprintln!("Invalid window size: {:?}", size);
81 continue;
82 }
83
84 window_size = *size;
85
86 // Resize the MSAA texture to match the new window size
87 msaa_texture = Some(
88 gpu.create_texture()
89 .set_render_target(Point2::new(size.x, size.y), None)
90 .set_usage(TextureUsage::Sampler)
91 .set_sample_count(msaa_count)
92 .build()
93 .expect("Failed to resize MSAA texture"),
94 );
95 }
96 _ => {}
97 }
98 }
99
100 if let Ok(mut cmd) = gpu.begin_command() {
101 if let Ok(mut rp) = cmd.begin_renderpass() {
102 rp.set_clear_color(Color::BLACK);
103 if let Some(texture) = msaa_texture.as_ref() {
104 rp.push_msaa_texture(texture);
105 }
106
107 if let Some(mut drawing) = rp.begin_drawing() {
108 let pos1 = Vector2::new(0.0, 0.0);
109 let pos2 = Vector2::new(800.0, 0.0);
110 let pos3 = Vector2::new(400.0, 600.0);
111
112 // Draw a full triangle covering the window
113 drawing.draw_triangle_filled(pos1, pos2, pos3, Color::BLUE);
114 }
115 }
116 }
117 }
118}Additional examples can be found in:
Auto Trait Implementations§
impl<'a> Freeze for GPUBuilder<'a>
impl<'a> !RefUnwindSafe for GPUBuilder<'a>
impl<'a> !Send for GPUBuilder<'a>
impl<'a> !Sync for GPUBuilder<'a>
impl<'a> Unpin for GPUBuilder<'a>
impl<'a> !UnwindSafe for GPUBuilder<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more