63 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Slang Rust Bindings
 | 
						|
 | 
						|
Rust bindings for the [Slang](https://github.com/shader-slang/slang/) shader language. Supporting both the modern compilation and reflection API.
 | 
						|
 | 
						|
Currently mostly reflects the needs of our own [engine](https://github.com/FloatyMonkey/engine) but contributions are more than welcome.
 | 
						|
 | 
						|
## Example
 | 
						|
 | 
						|
```rust
 | 
						|
let global_session = slang::GlobalSession::new().unwrap();
 | 
						|
 | 
						|
let search_path = std::ffi::CString::new("shaders/directory").unwrap();
 | 
						|
 | 
						|
// All compiler options are available through this builder.
 | 
						|
let session_options = slang::OptionsBuilder::new()
 | 
						|
	.optimization(slang::OptimizationLevel::High)
 | 
						|
	.matrix_layout_row(true);
 | 
						|
 | 
						|
let target_desc = slang::TargetDescBuilder::new()
 | 
						|
	.format(slang::CompileTarget::Dxil)
 | 
						|
	.profile(self.global_session.find_profile("sm_6_5"));
 | 
						|
 | 
						|
let session_desc = slang::SessionDescBuilder::new()
 | 
						|
	.targets(&[*target_desc])
 | 
						|
	.search_paths(&[search_path.as_ptr()])
 | 
						|
	.options(&session_options);
 | 
						|
 | 
						|
let session = self.global_session.create_session(&session_desc).unwrap();
 | 
						|
 | 
						|
let module = session.load_module("filename.slang").unwrap();
 | 
						|
 | 
						|
let entry_point = module.find_entry_point_by_name("main").unwrap();
 | 
						|
 | 
						|
let program = session.create_composite_component_type(&[
 | 
						|
	module.downcast().clone(), entry_point.downcast().clone(),
 | 
						|
]).unwrap();
 | 
						|
 | 
						|
let linked_program = program.link().unwrap();
 | 
						|
 | 
						|
// Entry point to the reflection API.
 | 
						|
let reflection = linked_program.layout(0).unwrap();
 | 
						|
 | 
						|
let shader_bytecode = linked_program.entry_point_code(0, 0).unwrap();
 | 
						|
```
 | 
						|
 | 
						|
## Installation
 | 
						|
 | 
						|
Add the following to the `[dependencies]` section of your `Cargo.toml`:
 | 
						|
 | 
						|
```toml
 | 
						|
slang = { git = "https://github.com/FloatyMonkey/slang-rs.git" }
 | 
						|
```
 | 
						|
 | 
						|
Set the `SLANG_DIR` environment variable to the path of your Slang installation. Download the latest release from their [releases page](https://github.com/shader-slang/slang/releases). Copy `slang.dll` to your executable's directory.
 | 
						|
 | 
						|
To compile to DXIL bytecode you need the Microsoft DirectXShaderCompiler. Download the latest release from their [releases page](https://github.com/microsoft/DirectXShaderCompiler/releases). Copy `dxil.dll` and `dxcompiler.dll` to your executable's directory.
 | 
						|
 | 
						|
## Credits
 | 
						|
 | 
						|
Maintained by Lauro Oyen ([@laurooyen](https://github.com/laurooyen)).
 | 
						|
 | 
						|
Licensed under [MIT](LICENSE-MIT) or [Apache-2.0](LICENSE-APACHE).
 |