pub struct MTLCommandBuffer(/* private fields */);Implementations§
Source§impl MTLCommandBuffer
impl MTLCommandBuffer
Sourcepub unsafe fn render_command_encoder_with_descriptor(
&self,
descriptor: *mut MTLRenderPassDescriptor,
) -> *mut MTLRenderCommandEncoder
pub unsafe fn render_command_encoder_with_descriptor( &self, descriptor: *mut MTLRenderPassDescriptor, ) -> *mut MTLRenderCommandEncoder
Examples found in repository?
examples/hello_triangle.rs (line 91)
19fn main() {
20 let width = 1280;
21 let height = 720;
22
23 let app = unsafe {
24 let app = NSApplication::shared_application().as_ref().unwrap();
25 app.set_activation_policy(NSApplicationActivationPolicy::Regular);
26 setup_top_menu(app);
27 app.finish_launching();
28
29 #[cfg(debug_assertions)]
30 app.activate_ignoring_other_apps(true);
31
32 app
33 };
34
35 let window = unsafe { create_window(width, height) };
36
37 let device = unsafe { util::mtl_create_system_default_device().as_mut().unwrap() };
38
39 let layer = unsafe {
40 let layer = core_animation::CAMetalLayer::new();
41 layer.set_device(&mut *device);
42 layer.set_pixel_format(MTLPixelFormat::BGRA8Unorm);
43 layer.set_framebuffer_only(false);
44 layer
45 };
46
47 unsafe {
48 let view = window.content_view().as_ref().unwrap();
49 view.set_wants_layer(true);
50 view.set_layer(layer.as_mut_ptr() as *mut core_animation::CALayer);
51 }
52
53 let mut pipeline_state = unsafe {
54 let shader_source = include_str!("hello_triangle.metal");
55 let shader_library = compile_shader_lib(device, shader_source);
56 create_pipeline_state(device, &shader_library)
57 };
58
59 let command_queue = unsafe { device.new_command_queue() };
60
61 let mut position_buffer = unsafe {
62 let positions: [(f32, f32); 3] = [
63 (0.0, 0.75),
64 (0.75, -0.75),
65 (-0.75, -0.75),
66 ];
67
68 device.new_buffer_with_bytes_length_options(
69 positions.as_ptr() as *const _,
70 mem::size_of_val(&positions),
71 MTLResourceOptions::CPU_CACHE_MODE_WRITE_COMBINED | MTLResourceOptions::STORAGE_MODE_MANAGED
72 )
73 };
74
75 let mut termination_requested = false;
76 let mut frame_count = 0;
77
78 while !termination_requested {
79 unsafe {
80 let _context = AutoReleaseContext::new();
81
82 poll_events(&app, &mut termination_requested);
83
84 let cmd_buffer = command_queue.command_buffer().as_mut().unwrap();
85
86 let drawable = layer.next_drawable();
87 let output_texture = (&*drawable).texture().as_mut().unwrap();
88
89 let mut render_pass_descriptor = create_render_pass_descriptor(output_texture);
90
91 let encoder = cmd_buffer.render_command_encoder_with_descriptor(&mut *render_pass_descriptor).as_ref().unwrap();
92 encoder.set_render_pipeline_state(&mut *pipeline_state);
93
94 encoder.set_vertex_buffer_offset_at_index(&mut *position_buffer, 0, 0);
95
96 let displacement: (f32, f32) = {
97 let radius = 0.1;
98 let speed = 0.05;
99
100 (
101 radius * f32::cos(frame_count as f32 * speed),
102 radius * f32::sin(frame_count as f32 * speed)
103 )
104 };
105 encoder.set_vertex_bytes_offset_at_index(
106 &displacement as *const (f32, f32) as *const _,
107 mem::size_of_val(&displacement),
108 1
109 );
110
111 encoder.draw_primitives_vertex_start_vertex_count(
112 MTLPrimitiveType::Triangle,
113 0,
114 3
115 );
116
117 encoder.end_encoding();
118
119 frame_count += 1;
120
121 cmd_buffer.present_drawable(drawable as *mut MTLDrawable);
122 cmd_buffer.commit();
123 }
124 }
125
126 println!("Terminated gracefully.");
127}pub unsafe fn compute_command_encoder(&self) -> *mut MTLComputeCommandEncoder
pub unsafe fn acceleration_structure_command_encoder( &self, ) -> *mut MTLAccelerationStructureCommandEncoder
Sourcepub unsafe fn commit(&self)
pub unsafe fn commit(&self)
Examples found in repository?
examples/hello_triangle.rs (line 122)
19fn main() {
20 let width = 1280;
21 let height = 720;
22
23 let app = unsafe {
24 let app = NSApplication::shared_application().as_ref().unwrap();
25 app.set_activation_policy(NSApplicationActivationPolicy::Regular);
26 setup_top_menu(app);
27 app.finish_launching();
28
29 #[cfg(debug_assertions)]
30 app.activate_ignoring_other_apps(true);
31
32 app
33 };
34
35 let window = unsafe { create_window(width, height) };
36
37 let device = unsafe { util::mtl_create_system_default_device().as_mut().unwrap() };
38
39 let layer = unsafe {
40 let layer = core_animation::CAMetalLayer::new();
41 layer.set_device(&mut *device);
42 layer.set_pixel_format(MTLPixelFormat::BGRA8Unorm);
43 layer.set_framebuffer_only(false);
44 layer
45 };
46
47 unsafe {
48 let view = window.content_view().as_ref().unwrap();
49 view.set_wants_layer(true);
50 view.set_layer(layer.as_mut_ptr() as *mut core_animation::CALayer);
51 }
52
53 let mut pipeline_state = unsafe {
54 let shader_source = include_str!("hello_triangle.metal");
55 let shader_library = compile_shader_lib(device, shader_source);
56 create_pipeline_state(device, &shader_library)
57 };
58
59 let command_queue = unsafe { device.new_command_queue() };
60
61 let mut position_buffer = unsafe {
62 let positions: [(f32, f32); 3] = [
63 (0.0, 0.75),
64 (0.75, -0.75),
65 (-0.75, -0.75),
66 ];
67
68 device.new_buffer_with_bytes_length_options(
69 positions.as_ptr() as *const _,
70 mem::size_of_val(&positions),
71 MTLResourceOptions::CPU_CACHE_MODE_WRITE_COMBINED | MTLResourceOptions::STORAGE_MODE_MANAGED
72 )
73 };
74
75 let mut termination_requested = false;
76 let mut frame_count = 0;
77
78 while !termination_requested {
79 unsafe {
80 let _context = AutoReleaseContext::new();
81
82 poll_events(&app, &mut termination_requested);
83
84 let cmd_buffer = command_queue.command_buffer().as_mut().unwrap();
85
86 let drawable = layer.next_drawable();
87 let output_texture = (&*drawable).texture().as_mut().unwrap();
88
89 let mut render_pass_descriptor = create_render_pass_descriptor(output_texture);
90
91 let encoder = cmd_buffer.render_command_encoder_with_descriptor(&mut *render_pass_descriptor).as_ref().unwrap();
92 encoder.set_render_pipeline_state(&mut *pipeline_state);
93
94 encoder.set_vertex_buffer_offset_at_index(&mut *position_buffer, 0, 0);
95
96 let displacement: (f32, f32) = {
97 let radius = 0.1;
98 let speed = 0.05;
99
100 (
101 radius * f32::cos(frame_count as f32 * speed),
102 radius * f32::sin(frame_count as f32 * speed)
103 )
104 };
105 encoder.set_vertex_bytes_offset_at_index(
106 &displacement as *const (f32, f32) as *const _,
107 mem::size_of_val(&displacement),
108 1
109 );
110
111 encoder.draw_primitives_vertex_start_vertex_count(
112 MTLPrimitiveType::Triangle,
113 0,
114 3
115 );
116
117 encoder.end_encoding();
118
119 frame_count += 1;
120
121 cmd_buffer.present_drawable(drawable as *mut MTLDrawable);
122 cmd_buffer.commit();
123 }
124 }
125
126 println!("Terminated gracefully.");
127}pub unsafe fn wait_until_completed(&self)
pub unsafe fn add_completed_handler<F>(&self, block: F)
Sourcepub unsafe fn present_drawable(&self, drawable: *mut MTLDrawable)
pub unsafe fn present_drawable(&self, drawable: *mut MTLDrawable)
Examples found in repository?
examples/hello_triangle.rs (line 121)
19fn main() {
20 let width = 1280;
21 let height = 720;
22
23 let app = unsafe {
24 let app = NSApplication::shared_application().as_ref().unwrap();
25 app.set_activation_policy(NSApplicationActivationPolicy::Regular);
26 setup_top_menu(app);
27 app.finish_launching();
28
29 #[cfg(debug_assertions)]
30 app.activate_ignoring_other_apps(true);
31
32 app
33 };
34
35 let window = unsafe { create_window(width, height) };
36
37 let device = unsafe { util::mtl_create_system_default_device().as_mut().unwrap() };
38
39 let layer = unsafe {
40 let layer = core_animation::CAMetalLayer::new();
41 layer.set_device(&mut *device);
42 layer.set_pixel_format(MTLPixelFormat::BGRA8Unorm);
43 layer.set_framebuffer_only(false);
44 layer
45 };
46
47 unsafe {
48 let view = window.content_view().as_ref().unwrap();
49 view.set_wants_layer(true);
50 view.set_layer(layer.as_mut_ptr() as *mut core_animation::CALayer);
51 }
52
53 let mut pipeline_state = unsafe {
54 let shader_source = include_str!("hello_triangle.metal");
55 let shader_library = compile_shader_lib(device, shader_source);
56 create_pipeline_state(device, &shader_library)
57 };
58
59 let command_queue = unsafe { device.new_command_queue() };
60
61 let mut position_buffer = unsafe {
62 let positions: [(f32, f32); 3] = [
63 (0.0, 0.75),
64 (0.75, -0.75),
65 (-0.75, -0.75),
66 ];
67
68 device.new_buffer_with_bytes_length_options(
69 positions.as_ptr() as *const _,
70 mem::size_of_val(&positions),
71 MTLResourceOptions::CPU_CACHE_MODE_WRITE_COMBINED | MTLResourceOptions::STORAGE_MODE_MANAGED
72 )
73 };
74
75 let mut termination_requested = false;
76 let mut frame_count = 0;
77
78 while !termination_requested {
79 unsafe {
80 let _context = AutoReleaseContext::new();
81
82 poll_events(&app, &mut termination_requested);
83
84 let cmd_buffer = command_queue.command_buffer().as_mut().unwrap();
85
86 let drawable = layer.next_drawable();
87 let output_texture = (&*drawable).texture().as_mut().unwrap();
88
89 let mut render_pass_descriptor = create_render_pass_descriptor(output_texture);
90
91 let encoder = cmd_buffer.render_command_encoder_with_descriptor(&mut *render_pass_descriptor).as_ref().unwrap();
92 encoder.set_render_pipeline_state(&mut *pipeline_state);
93
94 encoder.set_vertex_buffer_offset_at_index(&mut *position_buffer, 0, 0);
95
96 let displacement: (f32, f32) = {
97 let radius = 0.1;
98 let speed = 0.05;
99
100 (
101 radius * f32::cos(frame_count as f32 * speed),
102 radius * f32::sin(frame_count as f32 * speed)
103 )
104 };
105 encoder.set_vertex_bytes_offset_at_index(
106 &displacement as *const (f32, f32) as *const _,
107 mem::size_of_val(&displacement),
108 1
109 );
110
111 encoder.draw_primitives_vertex_start_vertex_count(
112 MTLPrimitiveType::Triangle,
113 0,
114 3
115 );
116
117 encoder.end_encoding();
118
119 frame_count += 1;
120
121 cmd_buffer.present_drawable(drawable as *mut MTLDrawable);
122 cmd_buffer.commit();
123 }
124 }
125
126 println!("Terminated gracefully.");
127}Trait Implementations§
Source§impl Message for MTLCommandBuffer
impl Message for MTLCommandBuffer
Source§unsafe fn send_message<A, R>(
&self,
sel: Sel,
args: A,
) -> Result<R, MessageError>
unsafe fn send_message<A, R>( &self, sel: Sel, args: A, ) -> Result<R, MessageError>
Sends a message to self with the given selector and arguments. Read more
Source§fn verify_message<A, R>(&self, sel: Sel) -> Result<(), MessageError>
fn verify_message<A, R>(&self, sel: Sel) -> Result<(), MessageError>
Verifies that the argument and return types match the encoding of the
method for the given selector. Read more
Auto Trait Implementations§
impl Freeze for MTLCommandBuffer
impl RefUnwindSafe for MTLCommandBuffer
impl Send for MTLCommandBuffer
impl Sync for MTLCommandBuffer
impl Unpin for MTLCommandBuffer
impl UnwindSafe for MTLCommandBuffer
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