summaryrefslogtreecommitdiffstats
path: root/examples/reflection-parameter-blocks/common.slang
diff options
context:
space:
mode:
Diffstat (limited to 'examples/reflection-parameter-blocks/common.slang')
-rw-r--r--examples/reflection-parameter-blocks/common.slang113
1 files changed, 113 insertions, 0 deletions
diff --git a/examples/reflection-parameter-blocks/common.slang b/examples/reflection-parameter-blocks/common.slang
new file mode 100644
index 000000000..d8f812246
--- /dev/null
+++ b/examples/reflection-parameter-blocks/common.slang
@@ -0,0 +1,113 @@
+// shader.slang
+
+// This module is part of the `reflection-parameter-blocks`
+// example program.
+//
+// This module is split out from the files that define
+// individual programs, so that we can share some type
+// definitions and utility functions between all of
+// the programs and keep them focused on just defining
+// the shader entry points.
+
+struct Mesh
+{
+ float4x4 modelToWorld;
+ float4x4 modelToWorld_inverseTranspose;
+}
+
+struct Material
+{
+ Texture2D albedoMap;
+ Texture2D glossMap;
+ Texture2D normalMap;
+ SamplerState sampler;
+}
+
+interface ILight
+{
+}
+
+struct DirectionalLight : ILight
+{
+ float3 dir;
+ float3 intensity;
+}
+
+struct ShadowedLight<L : ILight> : ILight
+{
+ L light;
+ Texture2D shadowMap;
+ SamplerComparisonState shadowSampler;
+ float4x4 worldToShadow;
+}
+
+struct EnvironmentMap
+{
+ TextureCube texture;
+ SamplerState sampler;
+}
+
+struct Environment
+{
+ ShadowedLight<DirectionalLight> sunLight;
+ EnvironmentMap envMap;
+ RWStructuredBuffer<float4> output;
+}
+
+struct View
+{
+ float4x4 worldToView;
+ float4x4 viewToProj;
+}
+
+// While the Slang compilation library will *reflect* all of
+// the shader parameters that a program declares,
+// back-ends (such as the SPIR-V code generator) will often
+// strip out parameters that are not used as part of the
+// computation that a shader performs.
+//
+// When shader parameters are stripped from the output
+// binary code, the runtime system for a particular API
+// (e.g., the Vulkan validation layer) cannot check
+// whether a program is correctly handling the binding
+// of those parameters.
+//
+// Our example entry points will thus make use of some
+// utility routines that serve the purpose of allowing
+// us to ensure that specific parameters are seen as
+// "used" during code generation.
+
+void use(inout float4 r, float4 v) { r += v; }
+void use(inout float4 r, float3 v) { r.xyz += v; }
+
+void use(inout float4 r, Texture2D t, SamplerState s)
+{
+ use(r, t.SampleLevel(s, r.xy, 0));
+}
+
+void use(inout float4 r, RWStructuredBuffer<float4> b)
+{
+ use(r, b[int(r.x)]);
+ b[int(r.x)] = r;
+}
+
+void use(inout float4 r, Environment e)
+{
+ use(r, e.sunLight.light.dir);
+ use(r, e.output);
+}
+
+void use(inout float4 r, View v)
+{
+ use(r, v.worldToView[0]);
+}
+
+void use(inout float4 r, Material m)
+{
+ use(r, m.normalMap, m.sampler);
+}
+
+void use(inout float4 r, Mesh m)
+{
+ use(r, m.modelToWorld[0]);
+}