A very rough in development C# binding for the Slang shading language that target .NET 8+.
Bindings written against 2025.24.1.
Not all bindings have been implemented yet! Notably missing are the ones for reflection.
- Some types may also be incorrect (especially around Slang types and things like size_t)
- Test works but must be run one at a time due to global state in Slang.
- SlangTerminatedChars
- ICompileRequest
- IByteCodeRunner
- Attribute/UserAttribute
- Reflection APIs
- IModulePrecompileService_Experimental
- slang_createByteCodeRunner
The versioning of this library follows the versioning of the underlying Slang library where the Revision part is used to indicate changes in the bindings.
For Example:
SlangShaderSharp 2025.21.2.0 corresponds to Slang library version 2025.21.2.
SlangShaderSharp 2025.21.2.1 corresponds to Slang library version 2025.21.2 with changes in the bindings only.
// 1. Create Global Session
Slang.CreateGlobalSession(Slang.ApiVersion, out var globalSession).Succeeded.ShouldBeTrue();
// 2. Create Session
var sessionDesc = new SessionDesc
{
Targets = [new TargetDesc { Format = SlangCompileTarget.Wgsl }],
// Slang supports using the preprocessor.
PreprocessorMacros = [
new PreprocessorMacroDesc("BIAS_VALUE", "1138"),
new PreprocessorMacroDesc("OTHER_MACRO", "float")
],
};
globalSession.CreateSession(sessionDesc, out var session).Succeeded.ShouldBeTrue();
// 3. Load module
var module = session.LoadModuleFromSource("test", "test.slang", Slang.CreateBlob("""
StructuredBuffer<float> buffer0;
StructuredBuffer<float> buffer1;
RWStructuredBuffer<float> result;
[shader("compute")]
[numthreads(1,1,1)]
void computeMain(uint3 threadId : SV_DispatchThreadID)
{
uint index = threadId.x;
result[index] = buffer0[index] + buffer1[index];
}
"""u8), out var moduleLoadError);
module.ShouldNotBeNull(moduleLoadError?.AsString ?? "Unknown Error");
// 4. Query Entry Points
module.FindEntryPointByName("computeMain", out var entryPoint).Succeeded.ShouldBeTrue();
// 5. Compose Modules + Entry Points
session.CreateCompositeComponentType([module, entryPoint], out var composedProgram, out _).Succeeded.ShouldBeTrue();
// 6. Link
composedProgram.Link(out _, out var linkError).Succeeded.ShouldBeTrue(linkError?.AsString ?? "Unknown Error");
// 7. Get Target Kernel Code
composedProgram.GetEntryPointCode(0, 0, out var wgslCode, out _).Succeeded.ShouldBeTrue();
// Output
_ = wgslCode.AsString;
// Done
Slang.Shutdown();Eventually this should be moved to a GitHub Action.
- Update
update_slang.ps1to point towards the desired Slang version. - Run
update_slang.ps1. - Adjust any bindings as needed to incorporate any changes in the header files (diff compare the header files to make this easy!)