Skip to content

Commit c08eee7

Browse files
waywardmonkeysgrovesNL
authored andcommitted
Update dev-dependencies: cocoa, glam, winit.
1 parent 0b4e1e8 commit c08eee7

File tree

8 files changed

+361
-331
lines changed

8 files changed

+361
-331
lines changed

Cargo.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ paste = "1"
3434
version = "0.2.4"
3535

3636
[dev-dependencies]
37-
cocoa = "0.24.0"
37+
cocoa = "0.25.0"
3838
cty = "0.2.1"
39-
winit = "0.27"
39+
winit = "0.29"
4040
sema = "0.1.4"
4141
png = "0.17"
42-
glam = "0.22"
42+
glam = "0.27"
4343
rand = "0.8"
4444

4545
[[example]]

examples/circle/main.rs

+87-78
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use metal::*;
33
use winit::{
44
event::{Event, WindowEvent},
55
event_loop::{ControlFlow, EventLoop},
6-
platform::macos::WindowExtMacOS,
6+
raw_window_handle::{HasWindowHandle, RawWindowHandle},
77
};
88

99
use cocoa::{appkit::NSView, base::id as cocoa_id};
@@ -33,7 +33,7 @@ pub struct AAPLVertex {
3333

3434
fn main() {
3535
// Create a window for viewing the content
36-
let event_loop = EventLoop::new();
36+
let event_loop = EventLoop::new().unwrap();
3737
let size = winit::dpi::LogicalSize::new(800, 600);
3838

3939
let window = winit::window::WindowBuilder::new()
@@ -100,9 +100,11 @@ fn main() {
100100
layer.set_presents_with_transaction(false);
101101

102102
unsafe {
103-
let view = window.ns_view() as cocoa_id;
104-
view.setWantsLayer(YES);
105-
view.setLayer(mem::transmute(layer.as_ref()));
103+
if let Ok(RawWindowHandle::AppKit(rw)) = window.window_handle().map(|wh| wh.as_raw()) {
104+
let view = rw.ns_view.as_ptr() as cocoa_id;
105+
view.setWantsLayer(YES);
106+
view.setLayer(mem::transmute(layer.as_ref()));
107+
}
106108
}
107109

108110
let draw_size = window.inner_size();
@@ -119,80 +121,87 @@ fn main() {
119121
)
120122
};
121123

122-
event_loop.run(move |event, _, control_flow| {
123-
autoreleasepool(|| {
124-
// ControlFlow::Wait pauses the event loop if no events are available to process.
125-
// This is ideal for non-game applications that only update in response to user
126-
// input, and uses significantly less power/CPU time than ControlFlow::Poll.
127-
*control_flow = ControlFlow::Wait;
128-
129-
match event {
130-
Event::WindowEvent {
131-
event: WindowEvent::CloseRequested,
132-
..
133-
} => {
134-
println!("The close button was pressed; stopping");
135-
*control_flow = ControlFlow::Exit
136-
}
137-
Event::MainEventsCleared => {
138-
// Queue a RedrawRequested event.
139-
window.request_redraw();
140-
}
141-
Event::RedrawRequested(_) => {
142-
// It's preferrable to render in this event rather than in MainEventsCleared, since
143-
// rendering in here allows the program to gracefully handle redraws requested
144-
// by the OS.
145-
let drawable = match layer.next_drawable() {
146-
Some(drawable) => drawable,
147-
None => return,
148-
};
149-
150-
// Create a new command buffer for each render pass to the current drawable
151-
let command_buffer = command_queue.new_command_buffer();
152-
153-
// Obtain a renderPassDescriptor generated from the view's drawable textures.
154-
let render_pass_descriptor = RenderPassDescriptor::new();
155-
handle_render_pass_color_attachment(
156-
&render_pass_descriptor,
157-
drawable.texture(),
158-
);
159-
handle_render_pass_sample_buffer_attachment(
160-
&render_pass_descriptor,
161-
&counter_sample_buffer,
162-
);
163-
164-
// Create a render command encoder.
165-
let encoder =
166-
command_buffer.new_render_command_encoder(&render_pass_descriptor);
167-
encoder.set_render_pipeline_state(&pipeline_state);
168-
// Pass in the parameter data.
169-
encoder.set_vertex_buffer(0, Some(&vbuf), 0);
170-
// Draw the triangles which will eventually form the circle.
171-
encoder.draw_primitives(MTLPrimitiveType::TriangleStrip, 0, 1080);
172-
encoder.end_encoding();
173-
174-
resolve_samples_into_buffer(
175-
&command_buffer,
176-
&counter_sample_buffer,
177-
&destination_buffer,
178-
);
179-
180-
// Schedule a present once the framebuffer is complete using the current drawable.
181-
command_buffer.present_drawable(&drawable);
182-
183-
// Finalize rendering here & push the command buffer to the GPU.
184-
command_buffer.commit();
185-
command_buffer.wait_until_completed();
186-
187-
let mut cpu_end = 0;
188-
let mut gpu_end = 0;
189-
device.sample_timestamps(&mut cpu_end, &mut gpu_end);
190-
handle_timestamps(&destination_buffer, cpu_start, cpu_end, gpu_start, gpu_end);
124+
event_loop
125+
.run(move |event, event_loop| {
126+
autoreleasepool(|| {
127+
// ControlFlow::Wait pauses the event loop if no events are available to process.
128+
// This is ideal for non-game applications that only update in response to user
129+
// input, and uses significantly less power/CPU time than ControlFlow::Poll.
130+
event_loop.set_control_flow(ControlFlow::Wait);
131+
132+
match event {
133+
Event::AboutToWait => window.request_redraw(),
134+
Event::WindowEvent { event, .. } => {
135+
match event {
136+
WindowEvent::CloseRequested => {
137+
println!("The close button was pressed; stopping");
138+
event_loop.exit();
139+
}
140+
WindowEvent::RedrawRequested => {
141+
// It's preferrable to render in this event rather than in MainEventsCleared, since
142+
// rendering in here allows the program to gracefully handle redraws requested
143+
// by the OS.
144+
let drawable = match layer.next_drawable() {
145+
Some(drawable) => drawable,
146+
None => return,
147+
};
148+
149+
// Create a new command buffer for each render pass to the current drawable
150+
let command_buffer = command_queue.new_command_buffer();
151+
152+
// Obtain a renderPassDescriptor generated from the view's drawable textures.
153+
let render_pass_descriptor = RenderPassDescriptor::new();
154+
handle_render_pass_color_attachment(
155+
&render_pass_descriptor,
156+
drawable.texture(),
157+
);
158+
handle_render_pass_sample_buffer_attachment(
159+
&render_pass_descriptor,
160+
&counter_sample_buffer,
161+
);
162+
163+
// Create a render command encoder.
164+
let encoder = command_buffer
165+
.new_render_command_encoder(&render_pass_descriptor);
166+
encoder.set_render_pipeline_state(&pipeline_state);
167+
// Pass in the parameter data.
168+
encoder.set_vertex_buffer(0, Some(&vbuf), 0);
169+
// Draw the triangles which will eventually form the circle.
170+
encoder.draw_primitives(MTLPrimitiveType::TriangleStrip, 0, 1080);
171+
encoder.end_encoding();
172+
173+
resolve_samples_into_buffer(
174+
&command_buffer,
175+
&counter_sample_buffer,
176+
&destination_buffer,
177+
);
178+
179+
// Schedule a present once the framebuffer is complete using the current drawable.
180+
command_buffer.present_drawable(&drawable);
181+
182+
// Finalize rendering here & push the command buffer to the GPU.
183+
command_buffer.commit();
184+
command_buffer.wait_until_completed();
185+
186+
let mut cpu_end = 0;
187+
let mut gpu_end = 0;
188+
device.sample_timestamps(&mut cpu_end, &mut gpu_end);
189+
handle_timestamps(
190+
&destination_buffer,
191+
cpu_start,
192+
cpu_end,
193+
gpu_start,
194+
gpu_end,
195+
);
196+
}
197+
_ => (),
198+
}
199+
}
200+
_ => (),
191201
}
192-
_ => (),
193-
}
194-
});
195-
});
202+
});
203+
})
204+
.unwrap();
196205
}
197206

198207
// If we want to draw a circle, we need to draw it out of the three primitive

examples/mesh-shader/main.rs

+58-48
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ use core_graphics_types::geometry::CGSize;
66
use metal::*;
77
use objc::{rc::autoreleasepool, runtime::YES};
88
use std::mem;
9-
use winit::platform::macos::WindowExtMacOS;
109

1110
use winit::{
1211
event::{Event, WindowEvent},
1312
event_loop::ControlFlow,
13+
raw_window_handle::{HasWindowHandle, RawWindowHandle},
1414
};
1515

1616
fn prepare_render_pass_descriptor(descriptor: &RenderPassDescriptorRef, texture: &TextureRef) {
@@ -23,13 +23,13 @@ fn prepare_render_pass_descriptor(descriptor: &RenderPassDescriptorRef, texture:
2323
}
2424

2525
fn main() {
26-
let events_loop = winit::event_loop::EventLoop::new();
26+
let event_loop = winit::event_loop::EventLoop::new().unwrap();
2727
let size = winit::dpi::LogicalSize::new(800, 600);
2828

2929
let window = winit::window::WindowBuilder::new()
3030
.with_inner_size(size)
3131
.with_title("Metal Mesh Shader Example".to_string())
32-
.build(&events_loop)
32+
.build(&event_loop)
3333
.unwrap();
3434

3535
let device = Device::system_default().expect("no device found");
@@ -40,9 +40,11 @@ fn main() {
4040
layer.set_presents_with_transaction(false);
4141

4242
unsafe {
43-
let view = window.ns_view() as cocoa_id;
44-
view.setWantsLayer(YES);
45-
view.setLayer(mem::transmute(layer.as_ref()));
43+
if let Ok(RawWindowHandle::AppKit(rw)) = window.window_handle().map(|wh| wh.as_raw()) {
44+
let view = rw.ns_view.as_ptr() as cocoa_id;
45+
view.setWantsLayer(YES);
46+
view.setLayer(mem::transmute(layer.as_ref()));
47+
}
4648
}
4749

4850
let draw_size = window.inner_size();
@@ -70,49 +72,57 @@ fn main() {
7072

7173
let command_queue = device.new_command_queue();
7274

73-
events_loop.run(move |event, _, control_flow| {
74-
autoreleasepool(|| {
75-
*control_flow = ControlFlow::Poll;
75+
event_loop
76+
.run(move |event, event_loop| {
77+
autoreleasepool(|| {
78+
event_loop.set_control_flow(ControlFlow::Poll);
7679

77-
match event {
78-
Event::WindowEvent { event, .. } => match event {
79-
WindowEvent::CloseRequested => *control_flow = ControlFlow::Exit,
80-
WindowEvent::Resized(size) => {
81-
layer.set_drawable_size(CGSize::new(size.width as f64, size.height as f64));
80+
match event {
81+
Event::AboutToWait => {
82+
window.request_redraw();
8283
}
83-
_ => (),
84-
},
85-
Event::MainEventsCleared => {
86-
window.request_redraw();
84+
Event::WindowEvent { event, .. } => match event {
85+
WindowEvent::CloseRequested => event_loop.exit(),
86+
WindowEvent::Resized(size) => {
87+
layer.set_drawable_size(CGSize::new(
88+
size.width as f64,
89+
size.height as f64,
90+
));
91+
}
92+
WindowEvent::RedrawRequested => {
93+
let drawable = match layer.next_drawable() {
94+
Some(drawable) => drawable,
95+
None => return,
96+
};
97+
98+
let render_pass_descriptor = RenderPassDescriptor::new();
99+
100+
prepare_render_pass_descriptor(
101+
&render_pass_descriptor,
102+
drawable.texture(),
103+
);
104+
105+
let command_buffer = command_queue.new_command_buffer();
106+
let encoder =
107+
command_buffer.new_render_command_encoder(&render_pass_descriptor);
108+
109+
encoder.set_render_pipeline_state(&pipeline_state);
110+
encoder.draw_mesh_threads(
111+
MTLSize::new(1, 1, 1),
112+
MTLSize::new(1, 1, 1),
113+
MTLSize::new(1, 1, 1),
114+
);
115+
116+
encoder.end_encoding();
117+
118+
command_buffer.present_drawable(&drawable);
119+
command_buffer.commit();
120+
}
121+
_ => (),
122+
},
123+
_ => {}
87124
}
88-
Event::RedrawRequested(_) => {
89-
let drawable = match layer.next_drawable() {
90-
Some(drawable) => drawable,
91-
None => return,
92-
};
93-
94-
let render_pass_descriptor = RenderPassDescriptor::new();
95-
96-
prepare_render_pass_descriptor(&render_pass_descriptor, drawable.texture());
97-
98-
let command_buffer = command_queue.new_command_buffer();
99-
let encoder =
100-
command_buffer.new_render_command_encoder(&render_pass_descriptor);
101-
102-
encoder.set_render_pipeline_state(&pipeline_state);
103-
encoder.draw_mesh_threads(
104-
MTLSize::new(1, 1, 1),
105-
MTLSize::new(1, 1, 1),
106-
MTLSize::new(1, 1, 1),
107-
);
108-
109-
encoder.end_encoding();
110-
111-
command_buffer.present_drawable(&drawable);
112-
command_buffer.commit();
113-
}
114-
_ => {}
115-
}
116-
});
117-
});
125+
});
126+
})
127+
.unwrap();
118128
}

0 commit comments

Comments
 (0)