From 8c778870aa29853a28a350bdac6f0107e19a139f Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Tue, 18 Jun 2024 20:05:29 -0400 Subject: Metal: Implement fix for non vector4 texture Load/Sample (#4417) * Metal: Implement fix for non vector4 texture Load/Sample 1. Fixes buffer-swizzle-store 2. Added test cases to texture.slang to cover all types * remove 1d lod support and buffer swizzle store this can be enabled later --- source/slang/hlsl.meta.slang | 102 +++++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 51 deletions(-) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index c85b9c0ce..24bbf1429 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -1135,11 +1135,11 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_1D): - __intrinsic_asm "$0.sample($1, ($2).x, uint(($2).y))"; + __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))"; + __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z))$z"; case $(SLANG_TEXTURE_CUBE): - __intrinsic_asm "$0.sample($1, ($2).xyz, uint(($2).w))"; + __intrinsic_asm "$c$0.sample($1, ($2).xyz, uint(($2).w))$z"; } } else @@ -1150,7 +1150,7 @@ extension __TextureImpl case $(SLANG_TEXTURE_2D): case $(SLANG_TEXTURE_3D): case $(SLANG_TEXTURE_CUBE): - __intrinsic_asm ".sample"; + __intrinsic_asm "$c$0.sample($1, $2)$z"; } } // TODO: This needs to be handled by the capability system @@ -1219,7 +1219,7 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, ($2).xy, uint(($2).z), $3)"; + __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z), $3)$z"; } } else @@ -1228,7 +1228,7 @@ extension __TextureImpl { case $(SLANG_TEXTURE_2D): case $(SLANG_TEXTURE_3D): - __intrinsic_asm ".sample"; + __intrinsic_asm "$c$0.sample($1, $2, $3)$z"; } } // TODO: This needs to be handled by the capability system @@ -1267,7 +1267,7 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, ($2).xy, uint(($2).z), min_lod_clamp($4), $3)"; + __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z), min_lod_clamp($4), $3)$z"; } } else @@ -1276,7 +1276,7 @@ extension __TextureImpl { case $(SLANG_TEXTURE_2D): case $(SLANG_TEXTURE_3D): - __intrinsic_asm "$0.sample($1, $2, min_lod_clamp($4), $3)"; + __intrinsic_asm "$c$0.sample($1, $2, min_lod_clamp($4), $3)$z"; } } // TODO: This needs to be handled by the capability system @@ -1333,9 +1333,9 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, ($2).xy, uint(($2).z), bias($3))"; + __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z), bias($3))$z"; case $(SLANG_TEXTURE_CUBE): - __intrinsic_asm "$0.sample($1, ($2).xyz, uint(($2).w), bias($3))"; + __intrinsic_asm "$c$0.sample($1, ($2).xyz, uint(($2).w), bias($3))$z"; } } else @@ -1345,7 +1345,7 @@ extension __TextureImpl case $(SLANG_TEXTURE_2D): case $(SLANG_TEXTURE_3D): case $(SLANG_TEXTURE_CUBE): - __intrinsic_asm "$0.sample($1, $2, bias($3))"; + __intrinsic_asm "$c$0.sample($1, $2, bias($3))$z"; } } // TODO: This needs to be handled by the capability system @@ -1383,7 +1383,7 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, ($2).xy, uint(($2).z), bias($3), $4)"; + __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z), bias($3), $4)$z"; } } else @@ -1392,7 +1392,7 @@ extension __TextureImpl { case $(SLANG_TEXTURE_2D): case $(SLANG_TEXTURE_3D): - __intrinsic_asm "$0.sample($1, $2, bias($3), $4)"; + __intrinsic_asm "$c$0.sample($1, $2, bias($3), $4)$z"; } } // TODO: This needs to be handled by the capability system @@ -1637,9 +1637,9 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, ($2).xy, uint(($2).z), gradient2d($3, $4))"; + __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z), gradient2d($3, $4))$z"; case $(SLANG_TEXTURE_CUBE): - __intrinsic_asm "$0.sample($1, ($2).xyz, uint(($2).w), gradientcube($3, $4))"; + __intrinsic_asm "$c$0.sample($1, ($2).xyz, uint(($2).w), gradientcube($3, $4))$z"; } } else @@ -1647,11 +1647,11 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, $2, gradient2d($3, $4))"; + __intrinsic_asm "$c$0.sample($1, $2, gradient2d($3, $4))$z"; case $(SLANG_TEXTURE_3D): - __intrinsic_asm "$0.sample($1, $2, gradient3d($3, $4))"; + __intrinsic_asm "$c$0.sample($1, $2, gradient3d($3, $4))$z"; case $(SLANG_TEXTURE_CUBE): - __intrinsic_asm "$0.sample($1, $2, gradientcube($3, $4))"; + __intrinsic_asm "$c$0.sample($1, $2, gradientcube($3, $4))$z"; } } // TODO: This needs to be handled by the capability system @@ -1688,7 +1688,7 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, ($2).xy, uint(($2).z), gradient2d($3, $4), $5)"; + __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z), gradient2d($3, $4), $5)$z"; } } else @@ -1696,9 +1696,9 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, $2, gradient2d($3, $4), $5)"; + __intrinsic_asm "$c$0.sample($1, $2, gradient2d($3, $4), $5)$z"; case $(SLANG_TEXTURE_3D): - __intrinsic_asm "$0.sample($1, $2, gradient3d($3, $4), $5)"; + __intrinsic_asm "$c$0.sample($1, $2, gradient3d($3, $4), $5)$z"; } } // TODO: This needs to be handled by the capability system @@ -1737,7 +1737,7 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, ($2).xy, uint(($2).z), gradient2d($3, $4), min_lod_clamp($6), $5)"; + __intrinsic_asm "$c$0.sample($1, ($2).xy, uint(($2).z), gradient2d($3, $4), min_lod_clamp($6), $5)$z"; } } else @@ -1745,9 +1745,9 @@ extension __TextureImpl switch (Shape.flavor) { case $(SLANG_TEXTURE_2D): - __intrinsic_asm "$0.sample($1, $2, gradient2d($3, $4), min_lod_clamp($6), $5)"; + __intrinsic_asm "$c$0.sample($1, $2, gradient2d($3, $4), min_lod_clamp($6), $5)$z"; case $(SLANG_TEXTURE_3D): - __intrinsic_asm "$0.sample($1, $2, gradient3d($3, $4), min_lod_clamp($6), $5)"; + __intrinsic_asm "$c$0.sample($1, $2, gradient3d($3, $4), min_lod_clamp($6), $5)$z"; } } // TODO: This needs to be handled by the capability system @@ -2385,35 +2385,35 @@ extension __TextureImpl(($1).xy), uint(($1).z), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))$z"; else // T read(uint2 coord, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z))$z"; } else { if (isArray == 1) // Tv read(uint2 coord, uint array, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))$z"; else // Tv read(uint2 coord, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z))$z"; } break; case $(SLANG_TEXTURE_3D): if (isShadow == 0 && isArray == 0) // Tv read(uint3 coord, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xyz), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xyz), uint(($1).w))$z"; break; case $(SLANG_TEXTURE_CUBE): if (isShadow == 1) @@ -2423,7 +2423,7 @@ extension __TextureImpl(($1).xy), uint(($1).z), uint(($1).w))"; else // T read(uint2 coord, uint face, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))$z"; } else { @@ -2432,7 +2432,7 @@ extension __TextureImpl(($1).xy), uint(($1).z), uint(($1).w))"; else // Tv read(uint2 coord, uint face, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))$z"; } break; } @@ -2583,20 +2583,20 @@ extension __TextureImpl(($1).xy), uint(($1).z), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z))$z"; else // T read(uint2 coord, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z))"; + __intrinsic_asm "$c$0.read(vec(($1).xy))$z"; } else { if (isArray == 1) // Tv read(uint2 coord, uint array, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z))$z"; else // Tv read(uint2 coord, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z))"; + __intrinsic_asm "$c$0.read(vec(($1).xy))$z"; } break; case $(SLANG_TEXTURE_3D): if (isShadow == 0 && isArray == 0) // Tv read(uint3 coord, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xyz), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xyz))$z"; break; case $(SLANG_TEXTURE_CUBE): if (isShadow == 1) @@ -2826,7 +2826,7 @@ extension __TextureImpl(($1).xy), uint(($1).z)%6, uint(($1).z)/6, uint(($1).w))"; else // T read(uint2 coord, uint face, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))$z"; } else { @@ -2835,7 +2835,7 @@ extension __TextureImpl(($1).xy), uint(($1).z)%6, uint(($1).z)/6, uint(($1).w))"; else // Tv read(uint2 coord, uint face, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z), uint(($1).w))$z"; } break; } @@ -3044,20 +3044,20 @@ extension __TextureImpl(($1).xy), uint(($1).z), $2)"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z), $2)$z"; else // T read(uint2 coord, uint sample) const - __intrinsic_asm "$0.read(vec(($1).xy), $2)"; + __intrinsic_asm "$c$0.read(vec(($1).xy), $2)$z"; } else { if (isArray == 1) // The document seems to have a typo. `lod` must mean `sample`. // Tv read(uint2 coord, uint array, uint lod = 0) const - __intrinsic_asm "$0.read(vec(($1).xy), uint(($1).z), $2)"; + __intrinsic_asm "$c$0.read(vec(($1).xy), uint(($1).z), $2)$z"; else // Tv read(uint2 coord, uint sample) const - __intrinsic_asm "$0.read(vec(($1).xy), $2)"; + __intrinsic_asm "$c$0.read(vec(($1).xy), $2)$z"; } break; } @@ -15010,7 +15010,7 @@ extension __TextureImpl __target_switch { case hlsl: __intrinsic_asm ".Load"; - case metal: __intrinsic_asm "$0.read(uint($1))"; + case metal: __intrinsic_asm "$c$0.read(uint($1))$z"; case glsl: __intrinsic_asm "$(glslLoadFuncName)($0, $1)$z"; case spirv: return spirv_asm { %sampled:__sampledType(T) = $(spvLoadInstName) $this $location; -- cgit v1.2.3