summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorwinmad <winmad.wlf@gmail.com>2023-03-22 22:04:28 -0700
committerGitHub <noreply@github.com>2023-03-22 22:04:28 -0700
commit44ab0952f0321e2a3b988cc9b3f502c7ab440e5a (patch)
tree8f9ed4761d8eb67a09133e8983404d79d1320166 /tests
parent259a015feb9d4ab65e8fbba32f6c777e92780cc7 (diff)
Create a simplified Falcor material system in slang test (#2721)
* Duplicate an example of differentiating Falcor's material system * Add a second BSDF * WIP: update test; grad didn't pass through * Finalize test --------- Co-authored-by: Lifan Wu <lifanw@nvidia.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/autodiff/material/DiffuseMaterial.slang17
-rw-r--r--tests/autodiff/material/DiffuseMaterialInstance.slang26
-rw-r--r--tests/autodiff/material/GlossyMaterial.slang17
-rw-r--r--tests/autodiff/material/GlossyMaterialInstance.slang39
-rw-r--r--tests/autodiff/material/IBSDF.slang7
-rw-r--r--tests/autodiff/material/IMaterial.slang10
-rw-r--r--tests/autodiff/material/IMaterialInstance.slang7
-rw-r--r--tests/autodiff/material/MaterialSystem.slang8
-rw-r--r--tests/autodiff/material/diff-falcor-material-system.slang46
-rw-r--r--tests/autodiff/material/diff-falcor-material-system.slang.expected.txt7
10 files changed, 184 insertions, 0 deletions
diff --git a/tests/autodiff/material/DiffuseMaterial.slang b/tests/autodiff/material/DiffuseMaterial.slang
new file mode 100644
index 000000000..e762e17c8
--- /dev/null
+++ b/tests/autodiff/material/DiffuseMaterial.slang
@@ -0,0 +1,17 @@
+//TEST_IGNORE_FILE:
+
+__exported import IMaterial;
+__exported import DiffuseMaterialInstance;
+
+struct DiffuseMaterial : IMaterial
+{
+ float3 baseColor;
+
+ typedef DiffuseMaterialInstance MaterialInstance;
+
+ DiffuseMaterialInstance setupMaterialInstance()
+ {
+ DiffuseMaterialInstance mi = { {baseColor} };
+ return mi;
+ }
+};
diff --git a/tests/autodiff/material/DiffuseMaterialInstance.slang b/tests/autodiff/material/DiffuseMaterialInstance.slang
new file mode 100644
index 000000000..ca6bfc69a
--- /dev/null
+++ b/tests/autodiff/material/DiffuseMaterialInstance.slang
@@ -0,0 +1,26 @@
+//TEST_IGNORE_FILE:
+
+__exported import IMaterialInstance;
+__exported import IBSDF;
+
+struct DiffuseBSDF : IBSDF
+{
+ float3 albedo;
+
+ [TreatAsDifferentiable]
+ float3 eval(const float3 wiLocal, const float3 woLocal)
+ {
+ return albedo;
+ }
+};
+
+struct DiffuseMaterialInstance : IMaterialInstance
+{
+ DiffuseBSDF bsdf;
+
+ [TreatAsDifferentiable]
+ float3 eval(const float3 wi, const float3 wo)
+ {
+ return bsdf.eval(wi, wo);
+ }
+};
diff --git a/tests/autodiff/material/GlossyMaterial.slang b/tests/autodiff/material/GlossyMaterial.slang
new file mode 100644
index 000000000..59cee5afe
--- /dev/null
+++ b/tests/autodiff/material/GlossyMaterial.slang
@@ -0,0 +1,17 @@
+//TEST_IGNORE_FILE:
+
+__exported import IMaterial;
+__exported import GlossyMaterialInstance;
+
+struct GlossyMaterial : IMaterial
+{
+ float3 baseColor;
+
+ typedef GlossyMaterialInstance MaterialInstance;
+
+ GlossyMaterialInstance setupMaterialInstance()
+ {
+ GlossyMaterialInstance mi = { { baseColor } };
+ return mi;
+ }
+};
diff --git a/tests/autodiff/material/GlossyMaterialInstance.slang b/tests/autodiff/material/GlossyMaterialInstance.slang
new file mode 100644
index 000000000..b1430e62c
--- /dev/null
+++ b/tests/autodiff/material/GlossyMaterialInstance.slang
@@ -0,0 +1,39 @@
+//TEST_IGNORE_FILE:
+
+__exported import IMaterialInstance;
+__exported import IBSDF;
+
+struct GlossyBSDF : IBSDF
+{
+ float3 albedo;
+
+ [BackwardDifferentiable]
+ float3 getAlbedo()
+ {
+ return albedo;
+ }
+
+ [ForwardDerivativeOf(getAlbedo)]
+ DifferentialPair<float3> __fwd_d_getAlbedo()
+ {
+ return diffPair(albedo, float3(1.f));
+ }
+
+ [BackwardDifferentiable]
+ float3 eval(const float3 wiLocal, const float3 woLocal)
+ {
+ float3 a = getAlbedo();
+ return a * a;
+ }
+};
+
+struct GlossyMaterialInstance : IMaterialInstance
+{
+ GlossyBSDF bsdf;
+
+ [BackwardDifferentiable]
+ float3 eval(const float3 wi, const float3 wo)
+ {
+ return bsdf.eval(wi, wo);
+ }
+};
diff --git a/tests/autodiff/material/IBSDF.slang b/tests/autodiff/material/IBSDF.slang
new file mode 100644
index 000000000..41b0957db
--- /dev/null
+++ b/tests/autodiff/material/IBSDF.slang
@@ -0,0 +1,7 @@
+//TEST_IGNORE_FILE:
+
+interface IBSDF
+{
+ [BackwardDifferentiable]
+ float3 eval(const float3 wi, const float3 wo);
+}
diff --git a/tests/autodiff/material/IMaterial.slang b/tests/autodiff/material/IMaterial.slang
new file mode 100644
index 000000000..4bdaac2bc
--- /dev/null
+++ b/tests/autodiff/material/IMaterial.slang
@@ -0,0 +1,10 @@
+//TEST_IGNORE_FILE:
+
+__exported import IMaterialInstance;
+
+interface IMaterial
+{
+ associatedtype MaterialInstance : IMaterialInstance;
+
+ MaterialInstance setupMaterialInstance();
+}
diff --git a/tests/autodiff/material/IMaterialInstance.slang b/tests/autodiff/material/IMaterialInstance.slang
new file mode 100644
index 000000000..fb13f8982
--- /dev/null
+++ b/tests/autodiff/material/IMaterialInstance.slang
@@ -0,0 +1,7 @@
+//TEST_IGNORE_FILE:
+
+interface IMaterialInstance
+{
+ [BackwardDifferentiable]
+ float3 eval(const float3 wi, const float3 wo);
+}
diff --git a/tests/autodiff/material/MaterialSystem.slang b/tests/autodiff/material/MaterialSystem.slang
new file mode 100644
index 000000000..5e733fad9
--- /dev/null
+++ b/tests/autodiff/material/MaterialSystem.slang
@@ -0,0 +1,8 @@
+//TEST_IGNORE_FILE:
+
+__exported import IMaterial;
+
+IMaterial createMaterialClassConformance(int type, float3 value)
+{
+ return createDynamicObject<IMaterial, float3>(type, value);
+}
diff --git a/tests/autodiff/material/diff-falcor-material-system.slang b/tests/autodiff/material/diff-falcor-material-system.slang
new file mode 100644
index 000000000..1cb8275fa
--- /dev/null
+++ b/tests/autodiff/material/diff-falcor-material-system.slang
@@ -0,0 +1,46 @@
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
+//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<float> outputBuffer;
+
+import MaterialSystem;
+import DiffuseMaterial;
+import DiffuseMaterialInstance;
+import GlossyMaterial;
+import GlossyMaterialInstance;
+
+//TEST_INPUT: type_conformance DiffuseMaterial:IMaterial = 0
+//TEST_INPUT: type_conformance GlossyMaterial:IMaterial = 1
+
+[BackwardDifferentiable]
+float3 evalBSDF(int type)
+{
+ float3 wi = normalize(float3(0.5, 0.2, 0.8));
+ float3 wo = normalize(float3(-0.1, -0.3, 0.9));
+
+ IMaterial material = createMaterialClassConformance(type, float3(0.9f, 0.6f, 0.2f));
+ let mi = material.setupMaterialInstance();
+ float3 f = mi.eval(wi, wo);
+ return f;
+}
+
+[numthreads(1, 1, 1)]
+void computeMain(uint3 dispatchThreadID: SV_DispatchThreadID)
+{
+ {
+ DifferentialPair<float3> dp_f = __fwd_diff(evalBSDF)(0);
+
+ outputBuffer[0] = dp_f.d[0];
+ outputBuffer[1] = dp_f.d[1];
+ outputBuffer[2] = dp_f.d[2];
+ }
+
+ {
+ DifferentialPair<float3> dp_f = __fwd_diff(evalBSDF)(1);
+
+ outputBuffer[3] = dp_f.d[0];
+ outputBuffer[4] = dp_f.d[1];
+ outputBuffer[5] = dp_f.d[2];
+ }
+}
diff --git a/tests/autodiff/material/diff-falcor-material-system.slang.expected.txt b/tests/autodiff/material/diff-falcor-material-system.slang.expected.txt
new file mode 100644
index 000000000..e60005477
--- /dev/null
+++ b/tests/autodiff/material/diff-falcor-material-system.slang.expected.txt
@@ -0,0 +1,7 @@
+type: float
+0.0
+0.0
+0.0
+1.8
+1.2
+0.4 \ No newline at end of file