summaryrefslogtreecommitdiffstats
path: root/tests/language-server
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2025-07-14 18:51:57 -0700
committerGitHub <noreply@github.com>2025-07-15 01:51:57 +0000
commit37143802781d8d480361d7c23202347ae3acf094 (patch)
tree300a6f60f2ddd3a0d7f14ab07665dfff5d67f31c /tests/language-server
parentdb06fbb163877b8823507b162ee7f2dfca8520f0 (diff)
Fix language server crash. (#7756)
* Fix language server crash. * Fix tests. * Fix. * Revert changes.
Diffstat (limited to 'tests/language-server')
-rw-r--r--tests/language-server/robustness-9.slang137
1 files changed, 137 insertions, 0 deletions
diff --git a/tests/language-server/robustness-9.slang b/tests/language-server/robustness-9.slang
new file mode 100644
index 000000000..daf6b9edb
--- /dev/null
+++ b/tests/language-server/robustness-9.slang
@@ -0,0 +1,137 @@
+//TEST:LANG_SERVER(filecheck=CHECK):
+
+RWTexture2D<float4> texFrame; // Output texture
+uniform float iTime;
+// In seconds
+uniform float2 iResolution; // Screen size
+
+static const float kInfinity = asfloat(0x7f800000);
+static const uint32_t kIdNone = 0xFFFFFFFF;
+
+struct Intersection
+{
+ float t = kInfinity;
+ uint32_t id = kIdNone;
+
+ bool missed() {
+ return id == kIdNone;
+ }
+
+ [mutating]
+ void update(uint32_t newId, float newT)
+ {
+ if(newT >= 0 && newT < t)
+ {
+ t = newT;
+ id = newId;
+ }
+ }
+};
+
+struct Ray
+{
+ float3 origin;
+ float3 direction;
+ float3 at(float t)
+ {
+ return mad(origin, direction, float3(t));
+ }
+};
+
+// Returns the t-value of the intersection of the infinite line
+// with the plane given by
+// `dot(planeNormal, p) == planeDist`.
+float intersectPlane(Ray ray, float3 planeNormal, float planeDist)
+{
+ // dot(planeNormal, o + d * t) == planeDist
+ // -> dot(planeNormal, o) + t * dot(planeNormal, d) == planeDist
+ // -> t = (planeDist - dot(planeNormal, o)) / dot(planeNormal, d)
+ return (planeDist - dot(planeNormal, ray.origin))
+ / dot(planeNormal, ray.direction);
+}
+
+float2 sortLoHi(float2 v)
+{
+
+
+struct OBB
+{
+ // Note that these are more parameters than we need;
+ // technically, the sides of an OBB must all be perpendicular,
+ // so there's only 3 (position) + 3 (side lengths) + 3 (rotation)
+ // degrees of freedom.
+ float3 corner;
+ float3 edges[3];
+
+ // Returns the t-value of the intersection of the OBB with
+ // the ray.
+ // The returned t-value may be negative; i.e. this assumes
+ // the camera is outside of the box.
+ // On miss, returns infinity.
+ float intersect(Ray ray)
+ {
+ ray.origin -= corner;
+
+ float2 tCloseFar;
+ float tFar;
+ [ForceUnroll]
+ for(int i = 0; i < 3; i++)
+ {
+ const float3 edge = edges[i];
+ const float edgeDist = dot(edge, ray.origin);
+ const float factor = rcp(dot(edge, ray.direction));
+ float2 slab = (float2(0, dot(edge, edge)) - edgeDist)
+ * factor;
+ slab =
+ if(i == 0)
+ {
+ tClose = min(slab.x, slab.y);
+ tFar = max(slab.x, slab.y);
+ }
+ else
+ {
+ tClose = min3(tClose, slab.x, slab.y);
+ tFar = max3(tFar, slab.x, slab.y);
+ }
+ thisSlab = sortLoHi(thisSlab);
+ tCloseFar.x =
+ }
+ return kInfinity;
+ }
+};
+
+[shader("compute")]
+[numthreads(16, 16, 1)]
+void main(uint2 thread: SV_DispatchThreadID)
+{
+ float2 uv = (2.0 * float2(thread) - iResolution.xy) / iResolution.y;
+
+ // Right-handed Z-up coordinate system, same as Blender's
+ Ray ray;
+ ray.origin = float3(0, -4, 4);
+ static const float kSqrtP5 = sqrt(.5);
+ ray.direction = float3(
+ uv.x,
+ kSqrtP5 -kSqrtP5 * uv.y,
+ -kSqrtP5 -kSqrtP5 * uv.y
+ );
+
+ Intersection intersection;
+ intersection.update(0, intersectPlane(ray, float3(0,0,1), 0));
+ OBB obb = OBB(float3(-1,-1,-1),{float3(2,0,0),float3(0,2,0), float3(0,0,2)});
+ intersection.update(1, obb.intersect(ray));
+
+ float3 color;
+ if(intersection.missed())
+ {
+ color = float3(0.0, 0.0, 1.0);
+ }
+ else
+ {
+ color = float3(intersection.t / 10.0);
+ }
+//COMPLETE:134,31
+ texFrame[thread] = float4(color, 1.0);
+}
+
+// CHECK: color