summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorkaizhangNV <149626564+kaizhangNV@users.noreply.github.com>2025-05-06 10:51:07 -0500
committerGitHub <noreply@github.com>2025-05-06 08:51:07 -0700
commit10376faffee1ab51b2d23c311212b5724c3c6ac6 (patch)
tree52deee8642f55a85eb43ceaace2234df67439253 /source
parentb0187cdb13ebbf1eaaf101cbfe8860a73280d644 (diff)
Add interger pack/unpack intrinsic to glsl (#6997)
* Add interger pack/unpack intrinsic to glsl Add unpack8, unpack16 and pack32 intrinsics to glsl. * add unit test * fix lowering logic for 'bitcast' * format
Diffstat (limited to 'source')
-rw-r--r--source/slang/glsl.meta.slang78
-rw-r--r--source/slang/hlsl.meta.slang4
-rw-r--r--source/slang/slang-ir-extract-value-from-type.cpp19
3 files changed, 98 insertions, 3 deletions
diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang
index 0ea7d1c89..00ad88add 100644
--- a/source/slang/glsl.meta.slang
+++ b/source/slang/glsl.meta.slang
@@ -17,6 +17,10 @@
// Section 4.1. 'asic Types'
//
+public typealias f16vec2 = half2;
+public typealias f16vec3 = half3;
+public typealias f16vec4 = half4;
+
public typealias vec2 = vector<float, 2>;
public typealias vec3 = vector<float, 3>;
public typealias vec4 = vector<float, 4>;
@@ -93,6 +97,10 @@ public typealias dmat4x2 = matrix<double, 4, 2>;
public typealias dmat4x3 = matrix<double, 4, 3>;
public typealias dmat4x4 = matrix<double, 4, 4>;
+public typealias f16mat2x2 = matrix<half, 2, 2>;
+public typealias f16mat2x3 = matrix<half, 2, 3>;
+public typealias f16mat2x4 = matrix<half, 2, 4>;
+
public out float4 gl_Position : SV_Position;
public out float gl_PointSize : SV_PointSize;
@@ -724,6 +732,76 @@ public uvec2 unpackDouble2x32(double v)
}
}
+/// Unpack a 32-bit unsigned integer into 4 8-bit unsigned integers.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public u8vec4 unpack8(uint32_t u);
+
+/// Unpack a 32-bit signed integer into 4 8-bit signed integers.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public i8vec4 unpack8(int32_t u);
+
+/// Unpack a 16-bit unsigned integer into 2 8-bit unsigned integers.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public u8vec2 unpack8(uint16_t u);
+
+/// Unpack a 16-bit signed integer into 2 8-bit signed integers.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public i8vec2 unpack8(int16_t u);
+
+/// Unpack a 32-bit unsigned integer into 2 16-bit unsigned integers.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public u16vec2 unpack16(uint32_t u);
+
+/// Unpack a 32-bit signed integer into 2 16-bit signed integers.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public i16vec2 unpack16(int32_t u);
+
+/// Pack 2 16-bit unsigned integers into a 32-bit unsigned integer.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public uint32_t pack32(u16vec2 v);
+
+/// Pack 2 16-bit signed integers into a 32-bit signed integer.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public int32_t pack32(i16vec2 v);
+
+/// Pack 4 8-bit unsigned integers into a 32-bit unsigned integer.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public uint32_t pack32(u8vec4 v);
+
+/// Pack 4 8-bit signed integers into a 32-bit signed integer.
+[__readNone]
+[ForceInline]
+[require(cpp_cuda_glsl_hlsl_spirv, pack_vector)]
+__intrinsic_op($(kIROp_BitCast))
+public int32_t pack32(i8vec4 v);
+
//
// Section 8.5. Geometric Functions
//
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 07160ae9d..99eba0a42 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -25598,14 +25598,14 @@ int32_t2 __unpackInt2x16ToInt32(uint packedValue)
[ForceInline]
uint __packUint2x16(uint32_t2 unpackedValue)
{
- return unpackedValue.x | (unpackedValue.y << 16U);
+ return (unpackedValue.x & 0xFFFF) | (unpackedValue.y << 16U);
}
[__readNone]
[ForceInline]
uint __packInt2x16(int32_t2 unpackedValue)
{
- return uint(unpackedValue.x | (unpackedValue.y << 16U));
+ return uint((unpackedValue.x & 0xFFFF) | (unpackedValue.y << 16U));
}
//@public:
diff --git a/source/slang/slang-ir-extract-value-from-type.cpp b/source/slang/slang-ir-extract-value-from-type.cpp
index acb17068f..621532a38 100644
--- a/source/slang/slang-ir-extract-value-from-type.cpp
+++ b/source/slang/slang-ir-extract-value-from-type.cpp
@@ -274,6 +274,23 @@ IRInst* extractMultiByteValueAtOffset(
src,
firstHalfSize,
offset);
+ switch (firstHalfSize)
+ {
+ case 1:
+ firstHalf =
+ builder.emitBitAnd(uintType, firstHalf, builder.getIntValue(uintType, 0xFF));
+ break;
+ case 2:
+ firstHalf =
+ builder.emitBitAnd(uintType, firstHalf, builder.getIntValue(uintType, 0xFFFF));
+ break;
+ case 3:
+ firstHalf =
+ builder.emitBitAnd(uintType, firstHalf, builder.getIntValue(uintType, 0xFFFFFF));
+ break;
+ default:
+ break;
+ }
auto restSize = size - firstHalfSize;
auto secondHalf = extractMultiByteValueAtOffset(
builder,
@@ -284,7 +301,7 @@ IRInst* extractMultiByteValueAtOffset(
restSize,
offset + firstHalfSize);
uint32_t shift = firstHalfSize * 8;
- resultValue = builder.emitAdd(
+ resultValue = builder.emitBitOr(
builder.getUIntType(),
firstHalf,
builder.emitShl(