summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-06-13 16:29:58 -0700
committerGitHub <noreply@github.com>2024-06-13 16:29:58 -0700
commitcfef0c6f66c9d36ae2899c8c2790c3fe422a7700 (patch)
tree0e116769009ae7e4b3b16d2ef28f275bea5e1fd7
parent2407966e899f9e4f490b23a92fc06d5da20544cc (diff)
Metal: misc fixes and enable more tests. (#4374)
* Fix and enable tests for metal. * Fix. * Fix. * Fix tests. * Fix warnings. * Fix. --------- Co-authored-by: Yong He <yonghe@Yongs-Mac-mini.local>
-rw-r--r--source/slang/hlsl.meta.slang161
-rw-r--r--source/slang/slang-capabilities.capdef2
-rw-r--r--source/slang/slang-emit-hlsl.cpp2
-rw-r--r--source/slang/slang-emit-metal.cpp66
-rw-r--r--source/slang/slang-emit-metal.h2
-rw-r--r--source/slang/slang-ir-byte-address-legalize.cpp13
-rw-r--r--source/slang/slang-ir-insts.h3
-rw-r--r--source/slang/slang-ir.cpp12
-rw-r--r--tests/autodiff-dstdlib/determinant.slang1
-rw-r--r--tests/autodiff-dstdlib/dstdlib-mul-mat-mat.slang1
-rw-r--r--tests/autodiff-dstdlib/dstdlib-mul-mat-vec.slang1
-rw-r--r--tests/autodiff-dstdlib/dstdlib-mul-vec-mat.slang1
-rw-r--r--tests/autodiff-dstdlib/dstdlib-sqrt.slang1
-rw-r--r--tests/autodiff/custom-intrinsic.slang4
-rw-r--r--tests/autodiff/reverse-matrix-ops.slang1
-rw-r--r--tests/bindings/nested-parameter-block-2.slang1
-rw-r--r--tests/bugs/negative-literal.slang1
-rw-r--r--tests/bugs/op-assignment-unify-mat.slang2
-rw-r--r--tests/compute/byte-address-buffer.slang1
-rw-r--r--tests/compute/cbuffer-legalize.slang1
-rw-r--r--tests/compute/frem.slang1
-rw-r--r--tests/compute/matrix-layout-structured-buffer.slang1
-rw-r--r--tests/compute/non-square-column-major.slang8
-rw-r--r--tests/compute/non-square-row-major.slang19
-rw-r--r--tests/compute/non-square-row-major.slang.expected.txt3
-rw-r--r--tests/compute/structured-buffer-of-matrices.slang2
-rw-r--r--tests/compute/texture-simple.slang1
-rw-r--r--tests/hlsl-intrinsic/bit-cast.slang2
-rw-r--r--tests/hlsl-intrinsic/f16tof32.slang1
-rw-r--r--tests/hlsl-intrinsic/f32tof16.slang1
-rw-r--r--tests/hlsl-intrinsic/scalar-float.slang1
-rw-r--r--tests/hlsl-intrinsic/size-of/align-of-2.slang2
-rw-r--r--tests/hlsl-intrinsic/size-of/align-of-3.slang1
-rw-r--r--tests/hlsl-intrinsic/size-of/align-of-generic.slang1
-rw-r--r--tests/hlsl-intrinsic/size-of/align-of.slang1
-rw-r--r--tests/hlsl-intrinsic/size-of/size-of-2.slang1
-rw-r--r--tests/hlsl-intrinsic/size-of/size-of-3.slang1
-rw-r--r--tests/hlsl-intrinsic/size-of/size-of-generic.slang1
-rw-r--r--tests/hlsl-intrinsic/size-of/size-of.slang1
-rw-r--r--tests/hlsl-intrinsic/vector-float.slang1
-rw-r--r--tests/hlsl/packoffset.slang2
-rw-r--r--tests/ir/scalar-truncate.slang1
-rw-r--r--tests/language-feature/bit-cast/struct-bit-cast.slang1
-rw-r--r--tests/language-feature/bitfield/sizeof.slang3
-rw-r--r--tests/metal/stage-in.slang4
45 files changed, 199 insertions, 139 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 9a87604ae..10d183da2 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -1784,20 +1784,24 @@ extension __TextureImpl<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
{
switch (Shape.flavor)
{
+ case $(SLANG_TEXTURE_1D):
+ __intrinsic_asm "$c$0.sample($1, ($2).x, uint(($2).y))$z";
case $(SLANG_TEXTURE_2D):
- __intrinsic_asm "$0.sample($1, ($2).xy, uint(($2).z), level($3))";
+ __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z), level($3))$z";
case $(SLANG_TEXTURE_CUBE):
- __intrinsic_asm "$0.sample($1, ($2).xyz, uint(($2).w), level($3))";
+ __intrinsic_asm "$c$0.sample($1, ($2).xyz, uint(($2).w), level($3))$z";
}
}
else
{
switch (Shape.flavor)
{
+ case $(SLANG_TEXTURE_1D):
+ __intrinsic_asm "$c$0.sample($1, $2)$z";
case $(SLANG_TEXTURE_2D):
case $(SLANG_TEXTURE_3D):
case $(SLANG_TEXTURE_CUBE):
- __intrinsic_asm "$0.sample($1, $2, level($3))";
+ __intrinsic_asm "$c$0.sample($1, $2, level($3))$z";
}
}
// TODO: This needs to be handled by the capability system
@@ -1866,9 +1870,9 @@ extension __TextureImpl<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
switch (Shape.flavor)
{
case $(SLANG_TEXTURE_2D):
- __intrinsic_asm "$0.sample($1, ($2).xy, uint(($2).z), level($3), $4)";
+ __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z), level($3), $4)$z";
case $(SLANG_TEXTURE_CUBE):
- __intrinsic_asm "$0.sample($1, ($2).xyz, uint(($2).w), level($3), $4)";
+ __intrinsic_asm "$c$0.sample($1, ($2).xyz, uint(($2).w), level($3), $4)$z";
}
}
else
@@ -1878,7 +1882,7 @@ extension __TextureImpl<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
case $(SLANG_TEXTURE_2D):
case $(SLANG_TEXTURE_3D):
case $(SLANG_TEXTURE_CUBE):
- __intrinsic_asm "$0.sample($1, $2, level($3), $4)";
+ __intrinsic_asm "$c$0.sample($1, $2, level($3), $4)$z";
}
}
__intrinsic_asm "<invalid intrinsic>";
@@ -3883,7 +3887,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint Load(int location)
{
__target_switch
@@ -3899,7 +3903,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint2 Load2(int location)
{
__target_switch
@@ -3912,7 +3916,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint2 Load2(int location, int alignment)
{
__target_switch
@@ -3925,7 +3929,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint2 Load2Aligned(int location)
{
__target_switch
@@ -3941,7 +3945,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint3 Load3(int location)
{
__target_switch
@@ -3954,7 +3958,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint3 Load3(int location, int alignment)
{
__target_switch
@@ -3967,7 +3971,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint3 Load3Aligned(int location)
{
__target_switch
@@ -3983,7 +3987,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint4 Load4(int location)
{
__target_switch
@@ -3996,7 +4000,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint4 Load4(int location, int alignment)
{
__target_switch
@@ -4009,7 +4013,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
uint4 Load4Aligned(int location)
{
__target_switch
@@ -4025,7 +4029,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
T Load<T>(int location)
{
return __byteAddressBufferLoad<T>(this, location, 0);
@@ -4033,7 +4037,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
T Load<T>(int location, int alignment)
{
return __byteAddressBufferLoad<T>(this, location, alignment);
@@ -4041,7 +4045,7 @@ struct $(item.name)
[__NoSideEffect]
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
T LoadAligned<T>(int location)
{
return __byteAddressBufferLoad<T>(this, location, __naturalStrideOf<T>());
@@ -4894,7 +4898,7 @@ ${{{{
}
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
void Store(uint address, uint value)
{
__target_switch
@@ -4907,7 +4911,7 @@ ${{{{
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
void Store2(uint address, uint2 value)
{
__target_switch
@@ -4920,7 +4924,7 @@ ${{{{
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
void Store2(uint address, uint2 value, uint alignment)
{
__target_switch
@@ -4932,7 +4936,7 @@ ${{{{
}
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
void Store2Aligned(uint address, uint2 value)
{
__target_switch
@@ -4944,7 +4948,7 @@ ${{{{
}
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
void Store3(uint address, uint3 value)
{
__target_switch
@@ -4957,7 +4961,7 @@ ${{{{
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
void Store3(uint address, uint3 value, uint alignment)
{
__target_switch
@@ -4994,7 +4998,7 @@ ${{{{
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
void Store4(uint address, uint4 value, uint alignment)
{
__target_switch
@@ -5006,7 +5010,7 @@ ${{{{
}
[ForceInline]
- [require(cpp_cuda_glsl_hlsl_spirv, byteaddressbuffer_rw)]
+ [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)]
void Store4Aligned(uint address, uint4 value)
{
__target_switch
@@ -5685,7 +5689,7 @@ double asdouble(uint lowbits, uint highbits)
// Reinterpret bits as a float (HLSL SM 4.0)
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
float asfloat(int x)
{
__target_switch
@@ -5694,6 +5698,7 @@ float asfloat(int x)
case cuda: __intrinsic_asm "$P_asfloat($0)";
case glsl: __intrinsic_asm "intBitsToFloat";
case hlsl: __intrinsic_asm "asfloat";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$float result $x
};
@@ -5701,7 +5706,7 @@ float asfloat(int x)
}
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
float asfloat(uint x)
{
__target_switch
@@ -5710,6 +5715,7 @@ float asfloat(uint x)
case cuda: __intrinsic_asm "$P_asfloat($0)";
case glsl: __intrinsic_asm "uintBitsToFloat";
case hlsl: __intrinsic_asm "asfloat";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$float result $x
};
@@ -5718,13 +5724,14 @@ float asfloat(uint x)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
vector<float, N> asfloat(vector< int, N> x)
{
__target_switch
{
case glsl: __intrinsic_asm "intBitsToFloat";
case hlsl: __intrinsic_asm "asfloat";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$vector<float, N> result $x
};
@@ -5735,13 +5742,14 @@ vector<float, N> asfloat(vector< int, N> x)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
vector<float,N> asfloat(vector<uint,N> x)
{
__target_switch
{
case glsl: __intrinsic_asm "uintBitsToFloat";
case hlsl: __intrinsic_asm "asfloat";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$vector<float,N> result $x
};
@@ -5779,21 +5787,18 @@ matrix<float,N,M> asfloat(matrix<uint,N,M> x)
// No op
[__unsafeForceInlineEarly]
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, sm_4_0_version)]
float asfloat(float x)
{ return x; }
__generic<let N : int>
[__unsafeForceInlineEarly]
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, sm_4_0_version)]
vector<float,N> asfloat(vector<float,N> x)
{ return x; }
__generic<let N : int, let M : int>
[__unsafeForceInlineEarly]
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, sm_4_0_version)]
matrix<float,N,M> asfloat(matrix<float,N,M> x)
{ return x; }
@@ -5890,7 +5895,7 @@ vector<T,N> asinh(vector<T,N> x)
// Reinterpret bits as an int (HLSL SM 4.0)
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
int asint(float x)
{
__target_switch
@@ -5899,6 +5904,7 @@ int asint(float x)
case cuda: __intrinsic_asm "$P_asint($0)";
case glsl: __intrinsic_asm "floatBitsToInt";
case hlsl: __intrinsic_asm "asint";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$int result $x
};
@@ -5906,7 +5912,7 @@ int asint(float x)
}
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
int asint(uint x)
{
__target_switch
@@ -5915,6 +5921,7 @@ int asint(uint x)
case cuda: __intrinsic_asm "$P_asint($0)";
case glsl: __intrinsic_asm "int($0)";
case hlsl: __intrinsic_asm "asint";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$int result $x
};
@@ -5923,13 +5930,14 @@ int asint(uint x)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
vector<int, N> asint(vector<float, N> x)
{
__target_switch
{
case glsl: __intrinsic_asm "floatBitsToInt";
case hlsl: __intrinsic_asm "asint";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$vector<int, N> result $x
};
@@ -5940,13 +5948,14 @@ vector<int, N> asint(vector<float, N> x)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
vector<int, N> asint(vector<uint, N> x)
{
__target_switch
{
case glsl: __intrinsic_asm "ivec$N0($0)";
case hlsl: __intrinsic_asm "asint";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$vector<int, N> result $x
};
@@ -5984,21 +5993,18 @@ matrix<int, N, M> asint(matrix<uint, N, M> x)
// No op
[__unsafeForceInlineEarly]
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
int asint(int x)
{ return x; }
__generic<let N : int>
[__unsafeForceInlineEarly]
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
vector<int,N> asint(vector<int,N> x)
{ return x; }
__generic<let N : int, let M : int>
[__unsafeForceInlineEarly]
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
matrix<int,N,M> asint(matrix<int,N,M> x)
{ return x; }
@@ -6030,7 +6036,7 @@ void asuint(double value, out uint lowbits, out uint highbits)
// Reinterpret bits as a uint (HLSL SM 4.0)
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
uint asuint(float x)
{
__target_switch
@@ -6039,6 +6045,7 @@ uint asuint(float x)
case cuda: __intrinsic_asm "$P_asuint($0)";
case glsl: __intrinsic_asm "floatBitsToUint";
case hlsl: __intrinsic_asm "asuint";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$uint result $x
};
@@ -6046,7 +6053,7 @@ uint asuint(float x)
}
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
uint asuint(int x)
{
__target_switch
@@ -6055,6 +6062,7 @@ uint asuint(int x)
case cuda: __intrinsic_asm "$P_asuint($0)";
case glsl: __intrinsic_asm "uint($0)";
case hlsl: __intrinsic_asm "asuint";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$uint result $x
};
@@ -6063,13 +6071,14 @@ uint asuint(int x)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
vector<uint,N> asuint(vector<float,N> x)
{
__target_switch
{
case glsl: __intrinsic_asm "floatBitsToUint";
case hlsl: __intrinsic_asm "asuint";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$vector<uint,N> result $x
};
@@ -6080,13 +6089,14 @@ vector<uint,N> asuint(vector<float,N> x)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_4_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_4_0)]
vector<uint, N> asuint(vector<int, N> x)
{
__target_switch
{
case glsl: __intrinsic_asm "uvec$N0($0)";
case hlsl: __intrinsic_asm "asuint";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$vector<uint, N> result $x
};
@@ -6246,13 +6256,14 @@ matrix<float16_t,R,C> asfloat16<let R : int, let C : int>(matrix<uint16_t,R,C> v
[__unsafeForceInlineEarly]
[__readNone]
-[require(cuda_hlsl_spirv, shader5_sm_5_0)]
+[require(cuda_hlsl_metal_spirv, shader5_sm_5_0)]
int16_t asint16(float16_t value)
{
__target_switch
{
case cuda: __intrinsic_asm "__half_as_short";
case hlsl: __intrinsic_asm "asint16";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$int16_t result $value
};
@@ -6262,12 +6273,13 @@ int16_t asint16(float16_t value)
[__unsafeForceInlineEarly]
[__readNone]
-[require(cuda_hlsl_spirv, shader5_sm_5_0)]
+[require(cuda_hlsl_metal_spirv, shader5_sm_5_0)]
vector<int16_t,N> asint16<let N : int>(vector<float16_t,N> value)
{
__target_switch
{
case hlsl: __intrinsic_asm "asint16";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
default: return asuint16(value);
}
}
@@ -6286,13 +6298,14 @@ matrix<int16_t,R,C> asint16<let R : int, let C : int>(matrix<float16_t,R,C> valu
[__readNone]
[__unsafeForceInlineEarly]
-[require(cuda_hlsl_spirv, shader5_sm_5_0)]
+[require(cuda_hlsl_metal_spirv, shader5_sm_5_0)]
float16_t asfloat16(int16_t value)
{
__target_switch
{
case cuda: __intrinsic_asm "__short_as_half";
case hlsl: __intrinsic_asm "asfloat16";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$float16_t result $value
};
@@ -6302,12 +6315,13 @@ float16_t asfloat16(int16_t value)
[__unsafeForceInlineEarly]
[__readNone]
-[require(cuda_hlsl_spirv, shader5_sm_5_0)]
+[require(cuda_hlsl_metal_spirv, shader5_sm_5_0)]
vector<float16_t,N> asfloat16<let N : int>(vector<int16_t,N> value)
{
__target_switch
{
case hlsl: __intrinsic_asm "asfloat16";
+ case metal: __intrinsic_asm "as_type<$TR>($0)";
case spirv: return spirv_asm {
OpBitcast $$vector<float16_t,N> result $value
};
@@ -7687,7 +7701,7 @@ vector<T,N> exp10(vector<T,N> x)
__glsl_version(420)
__cuda_sm_version(6.0)
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
float f16tof32(uint value)
{
__target_switch
@@ -7696,6 +7710,7 @@ float f16tof32(uint value)
case hlsl: __intrinsic_asm "f16tof32($0)";
case cuda: __intrinsic_asm "__half2float(__ushort_as_half($0))";
case cpp: __intrinsic_asm "f16tof32($0)";
+ case metal: __intrinsic_asm "as_type<half>((ushort)($0))";
case spirv:
{
return spirv_asm {
@@ -7709,7 +7724,7 @@ float f16tof32(uint value)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
vector<float, N> f16tof32(vector<uint, N> value)
{
__target_switch
@@ -7734,7 +7749,7 @@ vector<float, N> f16tof32(vector<uint, N> value)
__glsl_version(420)
__cuda_sm_version(6.0)
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
uint f32tof16(float value)
{
__target_switch
@@ -7743,6 +7758,7 @@ uint f32tof16(float value)
case hlsl: __intrinsic_asm "f32tof16($0)";
case cuda: __intrinsic_asm "__half_as_ushort(__float2half($0))";
case cpp: __intrinsic_asm "f32tof16($0)";
+ case metal: __intrinsic_asm "as_type<ushort>((half)($0))";
case spirv:
{
return spirv_asm {
@@ -7756,7 +7772,7 @@ uint f32tof16(float value)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
vector<uint, N> f32tof16(vector<float, N> value)
{
__target_switch
@@ -7782,7 +7798,7 @@ vector<uint, N> f32tof16(vector<float, N> value)
__glsl_version(420)
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
float f16tof32(float16_t value)
{
__target_switch
@@ -7791,6 +7807,7 @@ float f16tof32(float16_t value)
case hlsl: __intrinsic_asm "f16tof32($0)";
case cuda: __intrinsic_asm "__half2float($0)";
case cpp: __intrinsic_asm "f16tof32($0)";
+ case metal: __intrinsic_asm "float($0)";
case spirv:
{
return spirv_asm {
@@ -7802,13 +7819,14 @@ float f16tof32(float16_t value)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
vector<float, N> f16tof32(vector<float16_t, N> value)
{
__target_switch
{
case cuda: __intrinsic_asm "__half2float";
case hlsl: __intrinsic_asm "f16tof32";
+ case metal: __intrinsic_asm "$TR($0)";
case spirv: return spirv_asm {
OpFConvert $$vector<float, N> result $value
};
@@ -7820,13 +7838,14 @@ vector<float, N> f16tof32(vector<float16_t, N> value)
// Convert to float16_t
__glsl_version(420)
[__readNone]
-[require(cuda_glsl_spirv, shader5_sm_5_0)]
+[require(cuda_glsl_metal_spirv, shader5_sm_5_0)]
float16_t f32tof16_(float value)
{
__target_switch
{
case cuda: __intrinsic_asm "__float2half";
case glsl: __intrinsic_asm "packHalf2x16(vec2($0,0.0))";
+ case metal: __intrinsic_asm "half($0)";
case spirv: return spirv_asm {
OpFConvert $$float16_t result $value
};
@@ -7835,12 +7854,13 @@ float16_t f32tof16_(float value)
__generic<let N : int>
[__readNone]
-[require(cuda_glsl_spirv, shader5_sm_5_0)]
+[require(cuda_glsl_metal_spirv, shader5_sm_5_0)]
vector<float16_t, N> f32tof16_(vector<float, N> value)
{
__target_switch
{
case cuda: __intrinsic_asm "__float2half";
+ case metal: __intrinsic_asm "$TR($0)";
case spirv: return spirv_asm {
OpFConvert $$vector<float16_t, N> result $value
};
@@ -7854,13 +7874,14 @@ vector<float16_t, N> f32tof16_(vector<float, N> value)
// Flip surface normal to face forward, if needed
__generic<T : __BuiltinFloatingPointType, let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, sm_4_0_version)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, sm_4_0_version)]
vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng)
{
__target_switch
{
case glsl: __intrinsic_asm "faceforward";
case hlsl: __intrinsic_asm "faceforward";
+ case metal: __intrinsic_asm "faceforward";
case spirv: return spirv_asm {
OpExtInst $$vector<T,N> result glsl450 FaceForward $n $i $ng
};
@@ -7871,7 +7892,7 @@ vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng)
// Find first set bit starting at high bit and working down
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
int firstbithigh(int value)
{
__target_switch
@@ -7880,6 +7901,7 @@ int firstbithigh(int value)
case cuda: __intrinsic_asm "$P_firstbithigh($0)";
case glsl: __intrinsic_asm "findMSB";
case hlsl: __intrinsic_asm "firstbithigh";
+ case metal: __intrinsic_asm "clz";
case spirv: return spirv_asm {
OpExtInst $$int result glsl450 FindSMsb $value
};
@@ -7888,13 +7910,14 @@ int firstbithigh(int value)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
vector<int, N> firstbithigh(vector<int, N> value)
{
__target_switch
{
case glsl: __intrinsic_asm "findMSB";
case hlsl: __intrinsic_asm "firstbithigh";
+ case metal: __intrinsic_asm "clz";
case spirv: return spirv_asm {
OpExtInst $$vector<int, N> result glsl450 FindSMsb $value
};
@@ -7904,7 +7927,7 @@ vector<int, N> firstbithigh(vector<int, N> value)
}
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
uint firstbithigh(uint value)
{
__target_switch
@@ -7913,6 +7936,7 @@ uint firstbithigh(uint value)
case cuda: __intrinsic_asm "$P_firstbithigh($0)";
case glsl: __intrinsic_asm "findMSB";
case hlsl: __intrinsic_asm "firstbithigh";
+ case metal: __intrinsic_asm "clz";
case spirv: return spirv_asm {
OpExtInst $$uint result glsl450 FindUMsb $value
};
@@ -7921,13 +7945,14 @@ uint firstbithigh(uint value)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
vector<uint,N> firstbithigh(vector<uint,N> value)
{
__target_switch
{
case glsl: __intrinsic_asm "findMSB";
case hlsl: __intrinsic_asm "firstbithigh";
+ case metal: __intrinsic_asm "clz";
case spirv: return spirv_asm {
OpExtInst $$vector<uint,N> result glsl450 FindUMsb $value
};
@@ -7938,7 +7963,7 @@ vector<uint,N> firstbithigh(vector<uint,N> value)
// Find first set bit starting at low bit and working up
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
int firstbitlow(int value)
{
__target_switch
@@ -7947,6 +7972,7 @@ int firstbitlow(int value)
case cuda: __intrinsic_asm "$P_firstbitlow($0)";
case glsl: __intrinsic_asm "findLSB";
case hlsl: __intrinsic_asm "firstbitlow";
+ case metal: __intrinsic_asm "ctz";
case spirv: return spirv_asm {
OpExtInst $$int result glsl450 FindILsb $value
};
@@ -7955,13 +7981,14 @@ int firstbitlow(int value)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
vector<int,N> firstbitlow(vector<int,N> value)
{
__target_switch
{
case glsl: __intrinsic_asm "findLSB";
case hlsl: __intrinsic_asm "firstbitlow";
+ case metal: __intrinsic_asm "ctz";
case spirv: return spirv_asm {
OpExtInst $$vector<int,N> result glsl450 FindILsb $value
};
@@ -7971,7 +7998,7 @@ vector<int,N> firstbitlow(vector<int,N> value)
}
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
uint firstbitlow(uint value)
{
__target_switch
@@ -7980,6 +8007,7 @@ uint firstbitlow(uint value)
case cuda: __intrinsic_asm "$P_firstbitlow($0)";
case glsl: __intrinsic_asm "findLSB";
case hlsl: __intrinsic_asm "firstbitlow";
+ case metal: __intrinsic_asm "ctz";
case spirv: return spirv_asm {
OpExtInst $$uint result glsl450 FindILsb $value
};
@@ -7988,13 +8016,14 @@ uint firstbitlow(uint value)
__generic<let N : int>
[__readNone]
-[require(cpp_cuda_glsl_hlsl_spirv, shader5_sm_5_0)]
+[require(cpp_cuda_glsl_hlsl_metal_spirv, shader5_sm_5_0)]
vector<uint,N> firstbitlow(vector<uint,N> value)
{
__target_switch
{
case glsl: __intrinsic_asm "findLSB";
case hlsl: __intrinsic_asm "firstbitlow";
+ case metal: __intrinsic_asm "ctz";
case spirv: return spirv_asm {
OpExtInst $$vector<uint,N> result glsl450 FindILsb $value
};
diff --git a/source/slang/slang-capabilities.capdef b/source/slang/slang-capabilities.capdef
index 53679be35..d003e4f41 100644
--- a/source/slang/slang-capabilities.capdef
+++ b/source/slang/slang-capabilities.capdef
@@ -149,9 +149,11 @@ alias cpp_glsl_hlsl_spirv = cpp | glsl | hlsl | spirv;
alias cpp_glsl_hlsl_metal_spirv = cpp | glsl | hlsl | metal | spirv;
alias cpp_hlsl = cpp | hlsl;
alias cuda_glsl_hlsl = cuda | glsl | hlsl;
+alias cuda_hlsl_metal_spirv = cuda | hlsl | metal | spirv;
alias cuda_glsl_hlsl_spirv = cuda | glsl | hlsl | spirv;
alias cuda_glsl_hlsl_metal_spirv = cuda | glsl | hlsl | metal | spirv;
alias cuda_glsl_spirv = cuda | glsl | spirv;
+alias cuda_glsl_metal_spirv = cuda | glsl | metal | spirv;
alias cuda_hlsl = cuda | hlsl;
alias cuda_hlsl_spirv = cuda | hlsl | spirv;
alias glsl_hlsl_spirv = glsl | hlsl | spirv;
diff --git a/source/slang/slang-emit-hlsl.cpp b/source/slang/slang-emit-hlsl.cpp
index adca798e6..72b2a08b0 100644
--- a/source/slang/slang-emit-hlsl.cpp
+++ b/source/slang/slang-emit-hlsl.cpp
@@ -714,7 +714,7 @@ bool HLSLSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOu
m_writer->emit("(");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
m_writer->emit(", ");
- emitOperand(inst->getOperand(2), getInfo(EmitOp::General));
+ emitOperand(inst->getOperand(inst->getOperandCount() - 1), getInfo(EmitOp::General));
m_writer->emit(")");
maybeCloseParens(needClose);
diff --git a/source/slang/slang-emit-metal.cpp b/source/slang/slang-emit-metal.cpp
index 794a31e41..07d5b9f6c 100644
--- a/source/slang/slang-emit-metal.cpp
+++ b/source/slang/slang-emit-metal.cpp
@@ -143,24 +143,36 @@ void MetalSourceEmitter::emitFuncParamLayoutImpl(IRInst* param)
auto layout = as<IRVarLayout>(layoutDecoration->getLayout());
if (!layout)
return;
+
for (auto rr : layout->getOffsetAttrs())
{
switch (rr->getResourceKind())
{
case LayoutResourceKind::MetalTexture:
- m_writer->emit(" [[texture(");
- m_writer->emit(rr->getOffset());
- m_writer->emit(")]]");
+ if (as<IRTextureTypeBase>(param->getDataType()) || as<IRTextureBufferType>(param->getDataType()))
+ {
+ m_writer->emit(" [[texture(");
+ m_writer->emit(rr->getOffset());
+ m_writer->emit(")]]");
+ }
break;
case LayoutResourceKind::MetalBuffer:
- m_writer->emit(" [[buffer(");
- m_writer->emit(rr->getOffset());
- m_writer->emit(")]]");
+ if (as<IRPtrTypeBase>(param->getDataType()) || as<IRHLSLStructuredBufferTypeBase>(param->getDataType()) ||
+ as<IRByteAddressBufferTypeBase>(param->getDataType()) ||
+ as<IRUniformParameterGroupType>(param->getDataType()))
+ {
+ m_writer->emit(" [[buffer(");
+ m_writer->emit(rr->getOffset());
+ m_writer->emit(")]]");
+ }
break;
case LayoutResourceKind::SamplerState:
- m_writer->emit(" [[sampler(");
- m_writer->emit(rr->getOffset());
- m_writer->emit(")]]");
+ if (as<IRSamplerStateTypeBase>(param->getDataType()))
+ {
+ m_writer->emit(" [[sampler(");
+ m_writer->emit(rr->getOffset());
+ m_writer->emit(")]]");
+ }
break;
case LayoutResourceKind::VaryingInput:
m_writer->emit(" [[stage_in]]");
@@ -314,6 +326,15 @@ bool MetalSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inO
}
break;
}
+ case kIROp_FRem:
+ {
+ m_writer->emit("fmod(");
+ emitOperand(inst->getOperand(0), getInfo(EmitOp::General));
+ m_writer->emit(", ");
+ emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
+ m_writer->emit(")");
+ return true;
+ }
case kIROp_Select:
{
m_writer->emit("select(");
@@ -374,7 +395,7 @@ bool MetalSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inO
m_writer->emit("[(");
emitOperand(offset, getInfo(EmitOp::General));
m_writer->emit(")>>2] = as_type<uint32_t>(");
- emitOperand(inst->getOperand(2), getInfo(EmitOp::General));
+ emitOperand(inst->getOperand(inst->getOperandCount() - 1), getInfo(EmitOp::General));
m_writer->emit(")");
return true;
}
@@ -587,9 +608,9 @@ void MetalSourceEmitter::emitSimpleTypeImpl(IRType* type)
m_writer->emit("matrix<");
emitType(matType->getElementType());
m_writer->emit(",");
- emitVal(matType->getColumnCount(), getInfo(EmitOp::General));
- m_writer->emit(",");
emitVal(matType->getRowCount(), getInfo(EmitOp::General));
+ m_writer->emit(",");
+ emitVal(matType->getColumnCount(), getInfo(EmitOp::General));
m_writer->emit("> ");
return;
}
@@ -760,7 +781,7 @@ bool MetalSourceEmitter::maybeEmitSystemSemantic(IRInst* inst)
return false;
}
-void MetalSourceEmitter::_emitUserSemantic(UnownedStringSlice semanticName, IRIntegerValue semanticIndex)
+bool MetalSourceEmitter::_emitUserSemantic(UnownedStringSlice semanticName, IRIntegerValue semanticIndex)
{
if (!semanticName.startsWithCaseInsensitive(toSlice("SV_")))
{
@@ -772,7 +793,9 @@ void MetalSourceEmitter::_emitUserSemantic(UnownedStringSlice semanticName, IRIn
m_writer->emit(semanticIndex);
}
m_writer->emit(")]]");
+ return true;
}
+ return false;
}
void MetalSourceEmitter::emitSemanticsImpl(IRInst* inst, bool allowOffsets)
@@ -785,8 +808,10 @@ void MetalSourceEmitter::emitSemanticsImpl(IRInst* inst, bool allowOffsets)
if (maybeEmitSystemSemantic(inst))
return;
- bool hasSemanticFromLayout = false;
- if (auto varLayout = findVarLayout(inst))
+ auto varLayout = findVarLayout(inst);
+ bool hasSemantic = false;
+
+ if (varLayout)
{
for (auto attr : varLayout->getAllAttrs())
{
@@ -797,18 +822,21 @@ void MetalSourceEmitter::emitSemanticsImpl(IRInst* inst, bool allowOffsets)
m_writer->emit(" [[attribute(");
m_writer->emit(offsetAttr->getOffset());
m_writer->emit(")]]");
+ return;
}
}
- else if (auto semanticAttr = as<IRSemanticAttr>(attr))
+ }
+ for (auto attr : varLayout->getAllAttrs())
+ {
+ if (auto semanticAttr = as<IRSemanticAttr>(attr))
{
auto semanticName = String(semanticAttr->getName()).toUpper();
- _emitUserSemantic(semanticAttr->getName(), semanticAttr->getIndex());
- hasSemanticFromLayout = true;
+ hasSemantic = _emitUserSemantic(semanticAttr->getName(), semanticAttr->getIndex());
}
}
}
- if (!hasSemanticFromLayout)
+ if (!hasSemantic)
{
if (auto semanticDecor = inst->findDecoration<IRSemanticDecoration>())
{
diff --git a/source/slang/slang-emit-metal.h b/source/slang/slang-emit-metal.h
index 8b014d604..32557bf27 100644
--- a/source/slang/slang-emit-metal.h
+++ b/source/slang/slang-emit-metal.h
@@ -76,7 +76,7 @@ protected:
void _emitHLSLDecorationSingleInt(const char* name, IRFunc* entryPoint, IRIntLit* val);
void _emitStageAccessSemantic(IRStageAccessDecoration* decoration, const char* name);
- void _emitUserSemantic(UnownedStringSlice semanticName, IRIntegerValue semanticIndex);
+ bool _emitUserSemantic(UnownedStringSlice semanticName, IRIntegerValue semanticIndex);
bool maybeEmitSystemSemantic(IRInst* inst);
};
diff --git a/source/slang/slang-ir-byte-address-legalize.cpp b/source/slang/slang-ir-byte-address-legalize.cpp
index 38bee566c..dba3ab5f5 100644
--- a/source/slang/slang-ir-byte-address-legalize.cpp
+++ b/source/slang/slang-ir-byte-address-legalize.cpp
@@ -1168,10 +1168,9 @@ struct ByteAddressBufferLegalizationContext
uint64Val, m_builder.getIntValue(m_builder.getUInt64Type(), 32)));
auto loOffset = offset;
auto hiOffset = emitOffsetAddIfNeeded(offset, 4);
- IRInst* storeLoArgs[] = { buffer, loOffset, loVal };
- IRInst* storeHiArgs[] = { buffer, hiOffset, hiVal };
- m_builder.emitIntrinsicInst(m_builder.getVoidType(), kIROp_ByteAddressBufferStore, 3, storeLoArgs);
- m_builder.emitIntrinsicInst(m_builder.getVoidType(), kIROp_ByteAddressBufferStore, 3, storeHiArgs);
+ IRInst* alignment = m_builder.getIntValue(m_builder.getUIntType(), 0);
+ m_builder.emitByteAddressBufferStore(buffer, loOffset, alignment, loVal);
+ m_builder.emitByteAddressBufferStore(buffer, hiOffset, alignment, hiVal);
return SLANG_OK;
}
else if (sizeAlignment.size < 4)
@@ -1202,14 +1201,12 @@ struct ByteAddressBufferLegalizationContext
mask = m_builder.emitBitNot(m_builder.getUIntType(), mask);
auto maskedData = m_builder.emitBitAnd(m_builder.getUIntType(), existingVal, mask);
auto newData = m_builder.emitBitOr(m_builder.getUIntType(), maskedData, shiftedData);
- IRInst* storeArgs[] = { buffer, alignedOffset, newData };
- m_builder.emitIntrinsicInst(m_builder.getVoidType(), kIROp_ByteAddressBufferStore, 3, storeArgs);
+ m_builder.emitByteAddressBufferStore(buffer, alignedOffset, newData);
return SLANG_OK;
}
}
{
- IRInst* storeArgs[] = { buffer, offset, value };
- m_builder.emitIntrinsicInst(m_builder.getVoidType(), kIROp_ByteAddressBufferStore, 3, storeArgs);
+ m_builder.emitByteAddressBufferStore(buffer, offset, value);
return SLANG_OK;
}
}
diff --git a/source/slang/slang-ir-insts.h b/source/slang/slang-ir-insts.h
index bc86fa7ee..4781ea2c3 100644
--- a/source/slang/slang-ir-insts.h
+++ b/source/slang/slang-ir-insts.h
@@ -3926,6 +3926,9 @@ public:
IRInst* emitOutImplicitCast(IRInst* type, IRInst* value);
IRInst* emitInOutImplicitCast(IRInst* type, IRInst* value);
+ IRInst* emitByteAddressBufferStore(IRInst* byteAddressBuffer, IRInst* offset, IRInst* value);
+ IRInst* emitByteAddressBufferStore(IRInst* byteAddressBuffer, IRInst* offset, IRInst* alignment, IRInst* value);
+
IRFunc* createFunc();
IRGlobalVar* createGlobalVar(
IRType* valueType);
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp
index b6d000d20..22ef4e6be 100644
--- a/source/slang/slang-ir.cpp
+++ b/source/slang/slang-ir.cpp
@@ -3213,6 +3213,18 @@ namespace Slang
return inst;
}
+ IRInst* IRBuilder::emitByteAddressBufferStore(IRInst* byteAddressBuffer, IRInst* offset, IRInst* value)
+ {
+ IRInst* args[] = { byteAddressBuffer, offset, getIntValue(getUIntType(), 0), value};
+ return emitIntrinsicInst(getVoidType(), kIROp_ByteAddressBufferStore, 4, args);
+ }
+
+ IRInst* IRBuilder::emitByteAddressBufferStore(IRInst* byteAddressBuffer, IRInst* offset, IRInst* alignment, IRInst* value)
+ {
+ IRInst* args[] = { byteAddressBuffer, offset, alignment, value };
+ return emitIntrinsicInst(getVoidType(), kIROp_ByteAddressBufferStore, 4, args);
+ }
+
IRInst* IRBuilder::emitReinterpret(IRInst* type, IRInst* value)
{
return emitIntrinsicInst((IRType*)type, kIROp_Reinterpret, 1, &value);
diff --git a/tests/autodiff-dstdlib/determinant.slang b/tests/autodiff-dstdlib/determinant.slang
index 86c7e4de7..d2e699551 100644
--- a/tests/autodiff-dstdlib/determinant.slang
+++ b/tests/autodiff-dstdlib/determinant.slang
@@ -1,6 +1,5 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<float> outputBuffer;
diff --git a/tests/autodiff-dstdlib/dstdlib-mul-mat-mat.slang b/tests/autodiff-dstdlib/dstdlib-mul-mat-mat.slang
index 266e0e633..6419e92aa 100644
--- a/tests/autodiff-dstdlib/dstdlib-mul-mat-mat.slang
+++ b/tests/autodiff-dstdlib/dstdlib-mul-mat-mat.slang
@@ -1,6 +1,5 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<float> outputBuffer;
diff --git a/tests/autodiff-dstdlib/dstdlib-mul-mat-vec.slang b/tests/autodiff-dstdlib/dstdlib-mul-mat-vec.slang
index 23313b99c..23ec9cabb 100644
--- a/tests/autodiff-dstdlib/dstdlib-mul-mat-vec.slang
+++ b/tests/autodiff-dstdlib/dstdlib-mul-mat-vec.slang
@@ -1,6 +1,5 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<float> outputBuffer;
diff --git a/tests/autodiff-dstdlib/dstdlib-mul-vec-mat.slang b/tests/autodiff-dstdlib/dstdlib-mul-vec-mat.slang
index 21313b5ba..a4e86091a 100644
--- a/tests/autodiff-dstdlib/dstdlib-mul-vec-mat.slang
+++ b/tests/autodiff-dstdlib/dstdlib-mul-vec-mat.slang
@@ -1,6 +1,5 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<float> outputBuffer;
diff --git a/tests/autodiff-dstdlib/dstdlib-sqrt.slang b/tests/autodiff-dstdlib/dstdlib-sqrt.slang
index 894c83e23..ee3fb94b7 100644
--- a/tests/autodiff-dstdlib/dstdlib-sqrt.slang
+++ b/tests/autodiff-dstdlib/dstdlib-sqrt.slang
@@ -1,6 +1,5 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<float> outputBuffer;
diff --git a/tests/autodiff/custom-intrinsic.slang b/tests/autodiff/custom-intrinsic.slang
index 7d82887e2..2ebd01099 100644
--- a/tests/autodiff/custom-intrinsic.slang
+++ b/tests/autodiff/custom-intrinsic.slang
@@ -1,6 +1,5 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<float> outputBuffer;
@@ -17,6 +16,7 @@ namespace myintrinsiclib
__target_intrinsic(cuda, "$P_exp($0)")
__target_intrinsic(cpp, "$P_exp($0)")
__target_intrinsic(spirv, "12 resultType resultId glsl450 27 _0")
+ __target_intrinsic(metal, "exp($0)")
[ForwardDerivative(d_myexp<T>)]
T myexp(T x);
@@ -33,6 +33,7 @@ namespace myintrinsiclib
__generic<T : IDFloat>
__target_intrinsic(hlsl, "sin($0)")
__target_intrinsic(glsl, "sin($0)")
+ __target_intrinsic(metal, "sin($0)")
__target_intrinsic(cuda, "$P_sin($0)")
__target_intrinsic(cpp, "$P_sin($0)")
__target_intrinsic(spirv, "12 resultType resultId glsl450 13 _0")
@@ -51,6 +52,7 @@ namespace myintrinsiclib
__generic<T : IDFloat>
__target_intrinsic(hlsl, "cos($0)")
__target_intrinsic(glsl, "cos($0)")
+ __target_intrinsic(metal, "cos($0)")
__target_intrinsic(cuda, "$P_cos($0)")
__target_intrinsic(cpp, "$P_cos($0)")
__target_intrinsic(spirv, "12 resultType resultId glsl450 14 _0")
diff --git a/tests/autodiff/reverse-matrix-ops.slang b/tests/autodiff/reverse-matrix-ops.slang
index 4f4a6f675..e7be41811 100644
--- a/tests/autodiff/reverse-matrix-ops.slang
+++ b/tests/autodiff/reverse-matrix-ops.slang
@@ -1,6 +1,5 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<float> outputBuffer;
diff --git a/tests/bindings/nested-parameter-block-2.slang b/tests/bindings/nested-parameter-block-2.slang
index 0ef42bcd1..38ce9232e 100644
--- a/tests/bindings/nested-parameter-block-2.slang
+++ b/tests/bindings/nested-parameter-block-2.slang
@@ -1,7 +1,6 @@
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -d3d12 -use-dxil -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
// nested-parameter-block-2.slang
struct CB
diff --git a/tests/bugs/negative-literal.slang b/tests/bugs/negative-literal.slang
index afb7d604a..66fc90edf 100644
--- a/tests/bugs/negative-literal.slang
+++ b/tests/bugs/negative-literal.slang
@@ -2,7 +2,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
RWStructuredBuffer<float> outputBuffer;
diff --git a/tests/bugs/op-assignment-unify-mat.slang b/tests/bugs/op-assignment-unify-mat.slang
index 317170687..5ee3897c3 100644
--- a/tests/bugs/op-assignment-unify-mat.slang
+++ b/tests/bugs/op-assignment-unify-mat.slang
@@ -1,4 +1,4 @@
-// We can't test on VK, as currently we don't support integer matrix types
+// We can't test on VK or metal, as currently we don't support integer matrix types
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -vk
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -cpu
diff --git a/tests/compute/byte-address-buffer.slang b/tests/compute/byte-address-buffer.slang
index 80a1e8e16..65356ec22 100644
--- a/tests/compute/byte-address-buffer.slang
+++ b/tests/compute/byte-address-buffer.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-d3d12 -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
// Confirm cross-compilation of `(RW)ByteAddressBuffer`
//
diff --git a/tests/compute/cbuffer-legalize.slang b/tests/compute/cbuffer-legalize.slang
index 5da305eab..d0c0a8777 100644
--- a/tests/compute/cbuffer-legalize.slang
+++ b/tests/compute/cbuffer-legalize.slang
@@ -1,6 +1,5 @@
//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj
//TEST(compute):COMPARE_COMPUTE:-shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT: uniform(data=[1 2 3 4]):name=C.p.c
//TEST_INPUT: Texture2D(size=4, content = one):name=C.p.t
diff --git a/tests/compute/frem.slang b/tests/compute/frem.slang
index 8d6551e79..893f29794 100644
--- a/tests/compute/frem.slang
+++ b/tests/compute/frem.slang
@@ -3,7 +3,6 @@
//TEST(compute):COMPARE_COMPUTE: -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE:-cpu -shaderobj -output-using-type
//TEST(compute):COMPARE_COMPUTE:-vk -shaderobj -emit-spirv-directly -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
// Test uses of floating-point `%` operator.
diff --git a/tests/compute/matrix-layout-structured-buffer.slang b/tests/compute/matrix-layout-structured-buffer.slang
index 588c93685..8ef7077f8 100644
--- a/tests/compute/matrix-layout-structured-buffer.slang
+++ b/tests/compute/matrix-layout-structured-buffer.slang
@@ -10,6 +10,7 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -xslang -matrix-layout-row-major -shaderobj -dx12
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -xslang -matrix-layout-column-major -shaderobj -dx12
+
//TEST_INPUT:ubuffer(data=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23], stride=48):name=gMatrices
RWStructuredBuffer<int3x4> gMatrices;
diff --git a/tests/compute/non-square-column-major.slang b/tests/compute/non-square-column-major.slang
index 09ed8e1c2..fd3ce6406 100644
--- a/tests/compute/non-square-column-major.slang
+++ b/tests/compute/non-square-column-major.slang
@@ -8,7 +8,7 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -output-using-type -xslang -matrix-layout-column-major -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -xslang -matrix-layout-column-major -shaderobj
//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -output-using-type -xslang -matrix-layout-column-major -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=METAL):-slang -output-using-type -shaderobj -mtl
// matrix<R, C>
//TEST_INPUT:cbuffer(data=[1.0 0.0 10.0 0.0 0.0 1.0 20.0 0.0]):name matrixBuffer
@@ -26,6 +26,12 @@ void computeMain(uint3 tid : SV_DispatchThreadID)
float2 r = mul(v, M);
+ // Metal always uses scalar layout + row major, so it is computing
+ // [1 0]
+ // [ 1 2 1] * [10 0] = [ 21 1 ]
+ // [0 1]
+ // METAL: 21
+ // METAL: 1
output[0] = r.x;
output[1] = r.y;
}
diff --git a/tests/compute/non-square-row-major.slang b/tests/compute/non-square-row-major.slang
index b9a9c2fbb..867231cd3 100644
--- a/tests/compute/non-square-row-major.slang
+++ b/tests/compute/non-square-row-major.slang
@@ -3,16 +3,16 @@
// Note! This test doesn't work on CUDA or CPU targets, because both these targets
// assume matrices are tightly packed, whereas GPU targets align rows to 16 bytes.
-//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -output-using-type -compile-arg -O3 -xslang -matrix-layout-row-major -shaderobj
-//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj
-//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -output-using-type -xslang -matrix-layout-row-major -shaderobj
-//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
+//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=PACKED):-cpu -compute -output-using-type -compile-arg -O3 -xslang -matrix-layout-row-major -shaderobj
+//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=ALIGNED):-slang -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj
+//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=ALIGNED):-slang -compute -dx12 -output-using-type -xslang -matrix-layout-row-major -shaderobj
+//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=ALIGNED):-vk -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj
+//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=PACKED):-cuda -compute -output-using-type -xslang -matrix-layout-row-major -shaderobj
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=PACKED): -slang -output-using-type -shaderobj -mtl
// matrix<R, C>
-//TEST_INPUT:cbuffer(data=[1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 10.0 20.0 0.0 0.0 ]):name matrixBuffer
+//TEST_INPUT:cbuffer(data=[1.0 2.0 3.0 4.0 5.0 6.0 0.0 0.0 10.0 20.0 0.0 0.0 ]):name matrixBuffer
ConstantBuffer<float3x2> matrixBuffer;
//TEST_INPUT:ubuffer(data=[0 0], stride=4):out,name output
@@ -27,6 +27,11 @@ void computeMain(uint3 tid : SV_DispatchThreadID)
float2 r = mul(v, M);
+ // ALIGNED: 21
+ // ALIGNED: 34
+
+ // PACKED: 12
+ // PACKED: 16
output[0] = r.x;
output[1] = r.y;
}
diff --git a/tests/compute/non-square-row-major.slang.expected.txt b/tests/compute/non-square-row-major.slang.expected.txt
deleted file mode 100644
index df7317d53..000000000
--- a/tests/compute/non-square-row-major.slang.expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-type: float
-11.000000
-22.000000
diff --git a/tests/compute/structured-buffer-of-matrices.slang b/tests/compute/structured-buffer-of-matrices.slang
index 507611d5a..f2afd4fae 100644
--- a/tests/compute/structured-buffer-of-matrices.slang
+++ b/tests/compute/structured-buffer-of-matrices.slang
@@ -15,7 +15,7 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -xslang -matrix-layout-row-major -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -xslang -matrix-layout-row-major -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -xslang -matrix-layout-row-major -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
+
// Note: we are using a buffer of floating-point matrices, but fill it with integer
// data, to allow this test to work on the Vulkan targets, which do not currently
diff --git a/tests/compute/texture-simple.slang b/tests/compute/texture-simple.slang
index b06be9a49..efa83edfb 100644
--- a/tests/compute/texture-simple.slang
+++ b/tests/compute/texture-simple.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile cs_6_0 -use-dxil -shaderobj -output-using-type
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type -render-feature hardware-device
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
// Doesn't work on CUDA, not clear why yet
//DISABLE_TEST_INPUT: Texture1D(format=R_Float32, size=4, content = one, mipMaps=1):name tLoad1D
diff --git a/tests/hlsl-intrinsic/bit-cast.slang b/tests/hlsl-intrinsic/bit-cast.slang
index 7d78c7f5a..e2726239b 100644
--- a/tests/hlsl-intrinsic/bit-cast.slang
+++ b/tests/hlsl-intrinsic/bit-cast.slang
@@ -3,7 +3,7 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
+//TEST(compute):COMPARE_COMPUTE_EX:-mtl -compute -shaderobj
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
diff --git a/tests/hlsl-intrinsic/f16tof32.slang b/tests/hlsl-intrinsic/f16tof32.slang
index c98db9b61..adfab41c9 100644
--- a/tests/hlsl-intrinsic/f16tof32.slang
+++ b/tests/hlsl-intrinsic/f16tof32.slang
@@ -3,7 +3,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -render-features half
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
RWStructuredBuffer<float> outputBuffer;
diff --git a/tests/hlsl-intrinsic/f32tof16.slang b/tests/hlsl-intrinsic/f32tof16.slang
index 244d82837..3360fed3b 100644
--- a/tests/hlsl-intrinsic/f32tof16.slang
+++ b/tests/hlsl-intrinsic/f32tof16.slang
@@ -3,7 +3,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -render-features half
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
RWStructuredBuffer<uint> outputBuffer;
diff --git a/tests/hlsl-intrinsic/scalar-float.slang b/tests/hlsl-intrinsic/scalar-float.slang
index 2b143dcd0..4623d4835 100644
--- a/tests/hlsl-intrinsic/scalar-float.slang
+++ b/tests/hlsl-intrinsic/scalar-float.slang
@@ -4,7 +4,6 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//DISABLED_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
RWStructuredBuffer<int> outputBuffer;
diff --git a/tests/hlsl-intrinsic/size-of/align-of-2.slang b/tests/hlsl-intrinsic/size-of/align-of-2.slang
index cc56bd782..7b973eab3 100644
--- a/tests/hlsl-intrinsic/size-of/align-of-2.slang
+++ b/tests/hlsl-intrinsic/size-of/align-of-2.slang
@@ -4,7 +4,7 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
+
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
diff --git a/tests/hlsl-intrinsic/size-of/align-of-3.slang b/tests/hlsl-intrinsic/size-of/align-of-3.slang
index f053224b9..064ea48e3 100644
--- a/tests/hlsl-intrinsic/size-of/align-of-3.slang
+++ b/tests/hlsl-intrinsic/size-of/align-of-3.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
diff --git a/tests/hlsl-intrinsic/size-of/align-of-generic.slang b/tests/hlsl-intrinsic/size-of/align-of-generic.slang
index 0fbeacbad..60851dec5 100644
--- a/tests/hlsl-intrinsic/size-of/align-of-generic.slang
+++ b/tests/hlsl-intrinsic/size-of/align-of-generic.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
diff --git a/tests/hlsl-intrinsic/size-of/align-of.slang b/tests/hlsl-intrinsic/size-of/align-of.slang
index 76b433d15..c5be345c8 100644
--- a/tests/hlsl-intrinsic/size-of/align-of.slang
+++ b/tests/hlsl-intrinsic/size-of/align-of.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
diff --git a/tests/hlsl-intrinsic/size-of/size-of-2.slang b/tests/hlsl-intrinsic/size-of/size-of-2.slang
index b82c04cb1..e91e46746 100644
--- a/tests/hlsl-intrinsic/size-of/size-of-2.slang
+++ b/tests/hlsl-intrinsic/size-of/size-of-2.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
diff --git a/tests/hlsl-intrinsic/size-of/size-of-3.slang b/tests/hlsl-intrinsic/size-of/size-of-3.slang
index 7b6640ebc..26ef3f861 100644
--- a/tests/hlsl-intrinsic/size-of/size-of-3.slang
+++ b/tests/hlsl-intrinsic/size-of/size-of-3.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
diff --git a/tests/hlsl-intrinsic/size-of/size-of-generic.slang b/tests/hlsl-intrinsic/size-of/size-of-generic.slang
index c98f5f371..ea448710f 100644
--- a/tests/hlsl-intrinsic/size-of/size-of-generic.slang
+++ b/tests/hlsl-intrinsic/size-of/size-of-generic.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
diff --git a/tests/hlsl-intrinsic/size-of/size-of.slang b/tests/hlsl-intrinsic/size-of/size-of.slang
index 205a6e360..fc531bc4e 100644
--- a/tests/hlsl-intrinsic/size-of/size-of.slang
+++ b/tests/hlsl-intrinsic/size-of/size-of.slang
@@ -4,7 +4,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
diff --git a/tests/hlsl-intrinsic/vector-float.slang b/tests/hlsl-intrinsic/vector-float.slang
index 357ad5a84..fcf9649c2 100644
--- a/tests/hlsl-intrinsic/vector-float.slang
+++ b/tests/hlsl-intrinsic/vector-float.slang
@@ -3,7 +3,6 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -output-using-type -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute -output-using-type -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer
RWStructuredBuffer<float4> outputBuffer;
diff --git a/tests/hlsl/packoffset.slang b/tests/hlsl/packoffset.slang
index 0097604a1..2acbb5ff8 100644
--- a/tests/hlsl/packoffset.slang
+++ b/tests/hlsl/packoffset.slang
@@ -2,6 +2,8 @@
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
//TEST:SIMPLE(filecheck=HLSL): -target hlsl -profile cs_5_0 -entry computeMain -line-directive-mode none
//TEST:SIMPLE(filecheck=GLSL): -target glsl -profile glsl_450 -stage compute -entry computeMain -line-directive-mode none
+
+// Metal does not support custom data layout.
//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
diff --git a/tests/ir/scalar-truncate.slang b/tests/ir/scalar-truncate.slang
index ebe8c15f4..ca1c5243c 100644
--- a/tests/ir/scalar-truncate.slang
+++ b/tests/ir/scalar-truncate.slang
@@ -1,6 +1,5 @@
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
RWStructuredBuffer<uint> outputBuffer;
diff --git a/tests/language-feature/bit-cast/struct-bit-cast.slang b/tests/language-feature/bit-cast/struct-bit-cast.slang
index de92ac8b0..630efb1e0 100644
--- a/tests/language-feature/bit-cast/struct-bit-cast.slang
+++ b/tests/language-feature/bit-cast/struct-bit-cast.slang
@@ -1,7 +1,6 @@
// struct-bit-cast.slang
//TEST(compute):COMPARE_COMPUTE: -shaderobj
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
// Test that bit_cast works for bit-reinterpreting one struct type as another.
diff --git a/tests/language-feature/bitfield/sizeof.slang b/tests/language-feature/bitfield/sizeof.slang
index e3ada9566..da390e275 100644
--- a/tests/language-feature/bitfield/sizeof.slang
+++ b/tests/language-feature/bitfield/sizeof.slang
@@ -1,5 +1,6 @@
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-cpu -output-using-type
-//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-mtl -output-using-type
+
// CHECK: 1
// CHECK-NEXT: 1
diff --git a/tests/metal/stage-in.slang b/tests/metal/stage-in.slang
index ee586847e..d494a76e0 100644
--- a/tests/metal/stage-in.slang
+++ b/tests/metal/stage-in.slang
@@ -11,8 +11,8 @@
// CHECK: struct vertexInput{{.*}}
// CHECK-NEXT:{
-// CHECK-NEXT: float4 position{{.*}} {{\[\[}}attribute(0){{\]\]}} {{\[\[}}user(POSITION){{\]\]}};
-// CHECK-NEXT: float4 color{{.*}} {{\[\[}}attribute(1){{\]\]}} {{\[\[}}user(COLOR){{\]\]}};
+// CHECK-NEXT: float4 position{{.*}} {{\[\[}}attribute(0){{\]\]}};
+// CHECK-NEXT: float4 color{{.*}} {{\[\[}}attribute(1){{\]\]}};
// CHECK-NEXT:};
// CHECK: {{\[\[}}vertex{{\]\]}} VOut{{.*}} main_vertex(vertexInput{{.*}}{{\[\[}}stage_in{{\]\]}}, uint vid{{.*}}{{\[\[}}vertex_id{{\]\]}}, uint instanceID{{.*}} {{\[\[}}instance_id{{\]\]}})