summaryrefslogtreecommitdiffstats
path: root/third_party/rust/metal/examples/reflection
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /third_party/rust/metal/examples/reflection
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/metal/examples/reflection')
-rw-r--r--third_party/rust/metal/examples/reflection/main.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/third_party/rust/metal/examples/reflection/main.rs b/third_party/rust/metal/examples/reflection/main.rs
new file mode 100644
index 0000000000..058199cc35
--- /dev/null
+++ b/third_party/rust/metal/examples/reflection/main.rs
@@ -0,0 +1,75 @@
+// Copyright 2016 GFX developers
+//
+// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
+// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
+// http://opensource.org/licenses/MIT>, at your option. This file may not be
+// copied, modified, or distributed except according to those terms.
+
+use metal::*;
+use objc::rc::autoreleasepool;
+
+const PROGRAM: &'static str = r"
+ #include <metal_stdlib>
+
+ using namespace metal;
+
+ typedef struct {
+ float2 position;
+ float3 color;
+ } vertex_t;
+
+ struct ColorInOut {
+ float4 position [[position]];
+ float4 color;
+ };
+
+ vertex ColorInOut vs(device vertex_t* vertex_array [[ buffer(0) ]],
+ unsigned int vid [[ vertex_id ]])
+ {
+ ColorInOut out;
+
+ out.position = float4(float2(vertex_array[vid].position), 0.0, 1.0);
+ out.color = float4(float3(vertex_array[vid].color), 1.0);
+
+ return out;
+ }
+
+ fragment float4 ps(ColorInOut in [[stage_in]])
+ {
+ return in.color;
+ };
+";
+
+fn main() {
+ autoreleasepool(|| {
+ let device = Device::system_default().expect("no device found");
+
+ let options = CompileOptions::new();
+ let library = device.new_library_with_source(PROGRAM, &options).unwrap();
+ let (vs, ps) = (
+ library.get_function("vs", None).unwrap(),
+ library.get_function("ps", None).unwrap(),
+ );
+
+ let vertex_desc = VertexDescriptor::new();
+
+ let desc = RenderPipelineDescriptor::new();
+ desc.set_vertex_function(Some(&vs));
+ desc.set_fragment_function(Some(&ps));
+ desc.set_vertex_descriptor(Some(vertex_desc));
+
+ println!("{:?}", desc);
+
+ let reflect_options = MTLPipelineOption::ArgumentInfo | MTLPipelineOption::BufferTypeInfo;
+ let (_, reflection) = device
+ .new_render_pipeline_state_with_reflection(&desc, reflect_options)
+ .unwrap();
+
+ println!("Vertex arguments: ");
+ let vertex_arguments = reflection.vertex_arguments();
+ for index in 0..vertex_arguments.count() {
+ let argument = vertex_arguments.object_at(index).unwrap();
+ println!("{:?}", argument);
+ }
+ });
+}