From 223ccd40599ffcd74b409c7321f2264b93aec4bd Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:45:23 -0700 Subject: Fix Metal pointer type emission in entry point parameters (#7759) * Fix Metal pointer type emission in entry point parameters Add missing default case in Metal emitter's address space switch to preserve pointer types. Previously, unrecognized address spaces would fall through without emitting pointer syntax, causing uint64_t* to become ulong instead of ulong constant*. Fixes #7605, #6174 * Treat AddressSpace::UserPointer as Global in Metal Also adding another test for `uniform` keyword --- tests/metal/metal-pointer-params.slang | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tests/metal/metal-pointer-params.slang (limited to 'tests') diff --git a/tests/metal/metal-pointer-params.slang b/tests/metal/metal-pointer-params.slang new file mode 100644 index 000000000..6bb7114ee --- /dev/null +++ b/tests/metal/metal-pointer-params.slang @@ -0,0 +1,28 @@ +//TEST:SIMPLE(filecheck=CHECK): -target metal -stage compute -entry computeMain +//TEST:SIMPLE(filecheck=CHK_AIR): -target metallib -stage compute -entry computeMain + +//TEST_INPUT:ubuffer(data=[0 0 0 0 0], stride=8):out,name=outputBuffer +RWStructuredBuffer outputBuffer; + +//CHECK: ulong{{.*}}device{{ *\*}} a +//CHECK-NEXT: long{{.*}}device{{ *\*}} b +//CHECK-NEXT: uint{{.*}}device{{ *\*}} c +//CHECK-NEXT: int{{.*}}device{{ *\*}} d +//CHECK-NEXT: float{{.*}}device{{ *\*}} e + +// "indirect_argument" means a pointer +//CHK_AIR: !"ulong", !"a{{[^"]*}}", !"air.indirect_argument" +//CHK_AIR: !"long", !"b{{[^"]*}}", !"air.indirect_argument" +//CHK_AIR: !"uint", !"c{{[^"]*}}", !"air.indirect_argument" +//CHK_AIR: !"int", !"d{{[^"]*}}", !"air.indirect_argument" +//CHK_AIR: !"float", !"e{{[^"]*}}", !"air.indirect_argument" + +[numthreads(1,1,1)] +void computeMain(uniform uint64_t* a, uniform int64_t* b, uniform uint32_t* c, uniform int32_t* d, uniform float* e) +{ + outputBuffer[0] = (uint64_t)(*a); + outputBuffer[1] = (uint64_t)(*b); + outputBuffer[2] = (uint64_t)(*c); + outputBuffer[3] = (uint64_t)(*d); + outputBuffer[4] = (uint64_t)(*e); +} -- cgit v1.2.3