diff --git a/examples/data/hello_triangle.frag b/examples/data/hello_triangle.frag new file mode 100644 index 000000000..74e14f410 --- /dev/null +++ b/examples/data/hello_triangle.frag @@ -0,0 +1,7 @@ +#version 450 + +layout(location = 0) out vec4 outColor; + +void main() { + outColor = vec4(1.0, 0.0, 0.0, 1.0); +} diff --git a/examples/data/hello_triangle.frag.spv b/examples/data/hello_triangle.frag.spv new file mode 100644 index 000000000..59e491519 Binary files /dev/null and b/examples/data/hello_triangle.frag.spv differ diff --git a/examples/data/hello_triangle.vert b/examples/data/hello_triangle.vert new file mode 100644 index 000000000..ac6dcc7c3 --- /dev/null +++ b/examples/data/hello_triangle.vert @@ -0,0 +1,15 @@ +#version 450 + +out gl_PerVertex { + vec4 gl_Position; +}; + +const vec2 positions[3] = vec2[3]( + vec2(0.0, -0.5), + vec2(0.5, 0.5), + vec2(-0.5, 0.5) +); + +void main() { + gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); +} diff --git a/examples/data/hello_triangle.vert.spv b/examples/data/hello_triangle.vert.spv new file mode 100644 index 000000000..9a3f5994b Binary files /dev/null and b/examples/data/hello_triangle.vert.spv differ diff --git a/examples/init.rs b/examples/hello_triangle.rs similarity index 56% rename from examples/init.rs rename to examples/hello_triangle.rs index 1e03e88ed..5b4450ae3 100644 --- a/examples/init.rs +++ b/examples/hello_triangle.rs @@ -10,4 +10,10 @@ fn main() { anisotropic_filtering: false, }, }); + let _vs = gn::device_create_shader_module(device, gn::ShaderModuleDescriptor { + code: include_bytes!("./data/hello_triangle.vert.spv"), + }); + let _fs = gn::device_create_shader_module(device, gn::ShaderModuleDescriptor { + code: include_bytes!("./data/hello_triangle.frag.spv"), + }); } diff --git a/src/device.rs b/src/device.rs index 36041ed6f..e9d200a37 100644 --- a/src/device.rs +++ b/src/device.rs @@ -1,7 +1,7 @@ use hal::{self, Device as _Device, QueueGroup}; use memory; -use {BufferHandle, CommandBufferHandle, DeviceHandle}; +use {BufferHandle, CommandBufferHandle, DeviceHandle, ShaderModuleHandle}; pub type BufferUsage = hal::buffer::Usage; @@ -12,6 +12,11 @@ pub struct BufferDescriptor { pub usage: BufferUsage, } +#[repr(C)] +pub struct ShaderModuleDescriptor<'a> { + pub code: &'a [u8], +} + #[repr(C)] pub struct CommandBufferDescriptor { } @@ -50,6 +55,20 @@ fn device_create_buffer( }) } +pub struct ShaderModule { + pub raw: B::ShaderModule, +} + +pub extern "C" +fn device_create_shader_module( + device: DeviceHandle, desc: ShaderModuleDescriptor +) -> ShaderModuleHandle { + let shader = device.device.create_shader_module(desc.code).unwrap(); + ShaderModuleHandle::new(ShaderModule { + raw: shader, + }) +} + pub extern "C" fn device_create_command_buffer( device: DeviceHandle, desc: CommandBufferDescriptor diff --git a/src/lib.rs b/src/lib.rs index e55095cd6..961c649aa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,6 +26,7 @@ pub type InstanceHandle = Handle; pub type AdapterHandle = Handle>; pub type DeviceHandle = Handle>; pub type BufferHandle = Handle>; +pub type ShaderModuleHandle = Handle>; pub type CommandBufferHandle = Handle>; pub type RenderPassHandle = Handle>; pub type ComputePassHandle = Handle>;