Skip to content

Commit

Permalink
changed all examples to use the autoreleasepool function
Browse files Browse the repository at this point in the history
  • Loading branch information
adamnemecek authored and grovesNL committed Sep 5, 2020
1 parent 656d39c commit ae3733c
Show file tree
Hide file tree
Showing 6 changed files with 231 additions and 280 deletions.
56 changes: 24 additions & 32 deletions examples/argument-buffer/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,31 @@
// http://opensource.org/licenses/MIT>, at your option. This file may not be
// copied, modified, or distributed except according to those terms.

#[macro_use]
extern crate objc;

use objc::rc::autoreleasepool;
use metal::*;

use cocoa::foundation::NSAutoreleasePool;

fn main() {
let pool = unsafe { NSAutoreleasePool::new(cocoa::base::nil) };

let device = Device::system_default().expect("no device found");

let desc1 = ArgumentDescriptor::new();
desc1.set_data_type(MTLDataType::Texture);
let desc2 = ArgumentDescriptor::new();
desc2.set_data_type(MTLDataType::Sampler);
desc2.set_index(1);

let encoder = device.new_argument_encoder(&Array::from_slice(&[desc1, desc2]));
println!("{:?}", encoder);

let buffer = device.new_buffer(encoder.encoded_length(), MTLResourceOptions::empty());
encoder.set_argument_buffer(&buffer, 0);

let sampler = {
let descriptor = SamplerDescriptor::new();
descriptor.set_support_argument_buffers(true);
device.new_sampler(&descriptor)
};
encoder.set_sampler_state(1, &sampler);
println!("{:?}", sampler);

unsafe {
let () = msg_send![pool, release];
}
autoreleasepool(|| {
let device = Device::system_default().expect("no device found");

let desc1 = ArgumentDescriptor::new();
desc1.set_data_type(MTLDataType::Texture);
let desc2 = ArgumentDescriptor::new();
desc2.set_data_type(MTLDataType::Sampler);
desc2.set_index(1);

let encoder = device.new_argument_encoder(&Array::from_slice(&[desc1, desc2]));
println!("{:?}", encoder);

let buffer = device.new_buffer(encoder.encoded_length(), MTLResourceOptions::empty());
encoder.set_argument_buffer(&buffer, 0);

let sampler = {
let descriptor = SamplerDescriptor::new();
descriptor.set_support_argument_buffers(true);
device.new_sampler(&descriptor)
};
encoder.set_sampler_state(1, &sampler);
println!("{:?}", sampler);
});
}
42 changes: 17 additions & 25 deletions examples/bind/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,30 @@
// http://opensource.org/licenses/MIT>, at your option. This file may not be
// copied, modified, or distributed except according to those terms.

#[macro_use]
extern crate objc;

use objc::rc::autoreleasepool;
use metal::*;

use cocoa::foundation::NSAutoreleasePool;

fn main() {
let pool = unsafe { NSAutoreleasePool::new(cocoa::base::nil) };

let device = Device::system_default().expect("no device found");

let buffer = device.new_buffer(4, MTLResourceOptions::empty());
let sampler = {
let descriptor = SamplerDescriptor::new();
device.new_sampler(&descriptor)
};
autoreleasepool(|| {
let device = Device::system_default().expect("no device found");

let queue = device.new_command_queue();
let cmd_buf = queue.new_command_buffer();
let buffer = device.new_buffer(4, MTLResourceOptions::empty());
let sampler = {
let descriptor = SamplerDescriptor::new();
device.new_sampler(&descriptor)
};

let encoder = cmd_buf.new_compute_command_encoder();
let queue = device.new_command_queue();
let cmd_buf = queue.new_command_buffer();

encoder.set_buffers(2, &[Some(&buffer), None], &[4, 0]);
encoder.set_sampler_states(1, &[Some(&sampler), None]);
let encoder = cmd_buf.new_compute_command_encoder();

encoder.end_encoding();
cmd_buf.commit();
encoder.set_buffers(2, &[Some(&buffer), None], &[4, 0]);
encoder.set_sampler_states(1, &[Some(&sampler), None]);

println!("Everything is bound");
encoder.end_encoding();
cmd_buf.commit();

unsafe {
let () = msg_send![pool, release];
}
println!("Everything is bound");
});
}
161 changes: 76 additions & 85 deletions examples/compute/compute-argument-buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,97 +5,88 @@
// http://opensource.org/licenses/MIT>, at your option. This file may not be
// copied, modified, or distributed except according to those terms.

#[macro_use]
extern crate objc;

use metal::*;

use cocoa::foundation::NSAutoreleasePool;

use std::mem;
use objc::rc::autoreleasepool;
use metal::*;

static LIBRARY_SRC: &str = include_str!("compute-argument-buffer.metal");

fn main() {
let pool = unsafe { NSAutoreleasePool::new(cocoa::base::nil) };
let device = Device::system_default().expect("no device found");
let command_queue = device.new_command_queue();

let data = [
1u32, 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,
];

let buffer = device.new_buffer_with_data(
unsafe { mem::transmute(data.as_ptr()) },
(data.len() * mem::size_of::<u32>()) as u64,
MTLResourceOptions::CPUCacheModeDefaultCache,
);

let sum = {
let data = [0u32];
device.new_buffer_with_data(
autoreleasepool(|| {
let device = Device::system_default().expect("no device found");
let command_queue = device.new_command_queue();

let data = [
1u32, 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,
];

let buffer = device.new_buffer_with_data(
unsafe { mem::transmute(data.as_ptr()) },
(data.len() * mem::size_of::<u32>()) as u64,
MTLResourceOptions::CPUCacheModeDefaultCache,
)
};

let command_buffer = command_queue.new_command_buffer();
let encoder = command_buffer.new_compute_command_encoder();

let library = device
.new_library_with_source(LIBRARY_SRC, &CompileOptions::new())
.unwrap();
let kernel = library.get_function("sum", None).unwrap();

let argument_encoder = kernel.new_argument_encoder(0);
let arg_buffer = device.new_buffer(
argument_encoder.encoded_length(),
MTLResourceOptions::empty(),
);
argument_encoder.set_argument_buffer(&arg_buffer, 0);
argument_encoder.set_buffer(0, &buffer, 0);
argument_encoder.set_buffer(1, &sum, 0);

let pipeline_state_descriptor = ComputePipelineDescriptor::new();
pipeline_state_descriptor.set_compute_function(Some(&kernel));

let pipeline_state = device
.new_compute_pipeline_state_with_function(
pipeline_state_descriptor.compute_function().unwrap(),
)
.unwrap();

encoder.set_compute_pipeline_state(&pipeline_state);
encoder.set_buffer(0, Some(&arg_buffer), 0);

encoder.use_resource(&buffer, MTLResourceUsage::Read);
encoder.use_resource(&sum, MTLResourceUsage::Write);

let width = 16;

let thread_group_count = MTLSize {
width,
height: 1,
depth: 1,
};

let thread_group_size = MTLSize {
width: (data.len() as u64 + width) / width,
height: 1,
depth: 1,
};

encoder.dispatch_thread_groups(thread_group_count, thread_group_size);
encoder.end_encoding();
command_buffer.commit();
command_buffer.wait_until_completed();

let ptr = sum.contents() as *mut u32;

unsafe {
assert_eq!(465, *ptr);
let () = msg_send![pool, release];
}
);

let sum = {
let data = [0u32];
device.new_buffer_with_data(
unsafe { mem::transmute(data.as_ptr()) },
(data.len() * mem::size_of::<u32>()) as u64,
MTLResourceOptions::CPUCacheModeDefaultCache,
)
};

let command_buffer = command_queue.new_command_buffer();
let encoder = command_buffer.new_compute_command_encoder();

let library = device
.new_library_with_source(LIBRARY_SRC, &CompileOptions::new())
.unwrap();
let kernel = library.get_function("sum", None).unwrap();

let argument_encoder = kernel.new_argument_encoder(0);
let arg_buffer = device.new_buffer(
argument_encoder.encoded_length(),
MTLResourceOptions::empty(),
);
argument_encoder.set_argument_buffer(&arg_buffer, 0);
argument_encoder.set_buffer(0, &buffer, 0);
argument_encoder.set_buffer(1, &sum, 0);

let pipeline_state_descriptor = ComputePipelineDescriptor::new();
pipeline_state_descriptor.set_compute_function(Some(&kernel));

let pipeline_state = device
.new_compute_pipeline_state_with_function(
pipeline_state_descriptor.compute_function().unwrap(),
)
.unwrap();

encoder.set_compute_pipeline_state(&pipeline_state);
encoder.set_buffer(0, Some(&arg_buffer), 0);

encoder.use_resource(&buffer, MTLResourceUsage::Read);
encoder.use_resource(&sum, MTLResourceUsage::Write);

let width = 16;

let thread_group_count = MTLSize {
width,
height: 1,
depth: 1,
};

let thread_group_size = MTLSize {
width: (data.len() as u64 + width) / width,
height: 1,
depth: 1,
};

encoder.dispatch_thread_groups(thread_group_count, thread_group_size);
encoder.end_encoding();
command_buffer.commit();
command_buffer.wait_until_completed();

let ptr = sum.contents() as *mut u32;
});
}
25 changes: 9 additions & 16 deletions examples/compute/embedded-lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,20 @@
// http://opensource.org/licenses/MIT>, at your option. This file may not be
// copied, modified, or distributed except according to those terms.

#[macro_use]
extern crate objc;

use metal::*;

use cocoa::foundation::NSAutoreleasePool;
use objc::rc::autoreleasepool;

fn main() {
let library_data = include_bytes!("shaders.metallib");

let pool = unsafe { NSAutoreleasePool::new(cocoa::base::nil) };
let device = Device::system_default().expect("no device found");

let library = device.new_library_with_data(&library_data[..]).unwrap();
let kernel = library.get_function("sum", None).unwrap();
autoreleasepool(|| {
let device = Device::system_default().expect("no device found");

println!("Function name: {}", kernel.name());
println!("Function type: {:?}", kernel.function_type());
println!("OK");
let library = device.new_library_with_data(&library_data[..]).unwrap();
let kernel = library.get_function("sum", None).unwrap();

unsafe {
let () = msg_send![pool, release];
}
println!("Function name: {}", kernel.name());
println!("Function type: {:?}", kernel.function_type());
println!("OK");
});
}
Loading

0 comments on commit ae3733c

Please sign in to comment.