Skip to content

Commit 80a330f

Browse files
Implement AnyValue marshalling for 8-bit integers (shader-slang#6059)
* Implement anyvalue marshalling for 8-bit integers * Fix missing offset from int8/uint8 case * Disable anyvalue 8-bit test for DXIL Because it doesn't support 8-bit values anyway. --------- Co-authored-by: Yong He <yonghe@outlook.com>
1 parent 9b977e5 commit 80a330f

File tree

3 files changed

+118
-3
lines changed

3 files changed

+118
-3
lines changed

source/slang/slang-ir-any-value-marshalling.cpp

+46-3
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,25 @@ struct AnyValueMarshallingContext
375375
}
376376
case kIROp_Int8Type:
377377
case kIROp_UInt8Type:
378+
if (fieldOffset < static_cast<uint32_t>(anyValInfo->fieldKeys.getCount()))
379+
{
380+
auto srcVal = builder->emitLoad(concreteVar);
381+
srcVal = builder->emitCast(builder->getType(kIROp_UIntType), srcVal);
382+
auto dstAddr = builder->emitFieldAddress(
383+
uintPtrType,
384+
anyValueVar,
385+
anyValInfo->fieldKeys[fieldOffset]);
386+
auto dstVal = builder->emitLoad(dstAddr);
387+
dstVal = builder->emitBitfieldInsert(
388+
dstVal->getFullType(),
389+
dstVal,
390+
srcVal,
391+
builder->getIntValue(builder->getUIntType(), 8 * intraFieldOffset),
392+
builder->getIntValue(builder->getUIntType(), 8));
393+
builder->emitStore(dstAddr, dstVal);
394+
}
395+
advanceOffset(1);
396+
break;
378397
case kIROp_UInt64Type:
379398
case kIROp_Int64Type:
380399
case kIROp_DoubleType:
@@ -600,11 +619,35 @@ struct AnyValueMarshallingContext
600619
advanceOffset(2);
601620
break;
602621
}
622+
case kIROp_Int8Type:
623+
case kIROp_UInt8Type:
624+
if (fieldOffset < static_cast<uint32_t>(anyValInfo->fieldKeys.getCount()))
625+
{
626+
auto srcAddr = builder->emitFieldAddress(
627+
uintPtrType,
628+
anyValueVar,
629+
anyValInfo->fieldKeys[fieldOffset]);
630+
auto srcVal = builder->emitLoad(srcAddr);
631+
srcVal = builder->emitBitfieldExtract(
632+
srcVal->getFullType(),
633+
srcVal,
634+
builder->getIntValue(builder->getUIntType(), 8 * intraFieldOffset),
635+
builder->getIntValue(builder->getUIntType(), 8));
636+
if (dataType->getOp() == kIROp_Int8Type)
637+
{
638+
srcVal = builder->emitCast(builder->getType(kIROp_Int8Type), srcVal);
639+
}
640+
else
641+
{
642+
srcVal = builder->emitCast(builder->getType(kIROp_UInt8Type), srcVal);
643+
}
644+
builder->emitStore(concreteVar, srcVal);
645+
}
646+
advanceOffset(1);
647+
break;
603648
case kIROp_UInt64Type:
604649
case kIROp_Int64Type:
605650
case kIROp_DoubleType:
606-
case kIROp_Int8Type:
607-
case kIROp_UInt8Type:
608651
case kIROp_PtrType:
609652
#if SLANG_PTR_IS_64
610653
case kIROp_IntPtrType:
@@ -832,7 +875,7 @@ SlangInt _getAnyValueSizeRaw(IRType* type, SlangInt offset)
832875
return alignUp(offset, 2) + 2;
833876
case kIROp_UInt8Type:
834877
case kIROp_Int8Type:
835-
return -1;
878+
return offset + 1;
836879
case kIROp_VectorType:
837880
{
838881
auto vectorType = static_cast<IRVectorType*>(type);
+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Test anyvalue packing of 8bit types.
2+
3+
//TEST_DISABLED(compute):COMPARE_COMPUTE_EX:-slang -compute -cuda -output-using-type
4+
//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -render-feature int16
5+
//TEST_DISABLED(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile sm_6_2 -use-dxil -output-using-type
6+
7+
[anyValueSize(20)]
8+
interface IInterface
9+
{
10+
float run();
11+
}
12+
13+
struct Val : IInterface
14+
{
15+
int8_t v0;
16+
uint8_t v1;
17+
float f0;
18+
uint16_t v2;
19+
uint8_t v3;
20+
uint32_t v4;
21+
uint8_t v5;
22+
float run()
23+
{
24+
return v0 + v1 + f0 + v2 + v3 + v4 + v5;
25+
}
26+
};
27+
28+
struct UserDefinedPackedType
29+
{
30+
uint values[5];
31+
};
32+
33+
//TEST_INPUT:ubuffer(data=[0 0 0], stride=4):out,name=gOutputBuffer
34+
RWStructuredBuffer<float> gOutputBuffer;
35+
36+
//TEST_INPUT: type_conformance Val:IInterface = 11
37+
38+
[numthreads(1, 1, 1)]
39+
void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
40+
{
41+
UserDefinedPackedType objStorage;
42+
objStorage.values[0] = 0xA5A50201;
43+
objStorage.values[1] = asuint(3.0f);
44+
objStorage.values[2] = 4u|(0xA505u<<16u);
45+
objStorage.values[3] = 6;
46+
objStorage.values[4] = 7;
47+
48+
IInterface dynamicObj = createDynamicObject<IInterface, UserDefinedPackedType>(11, objStorage);
49+
float result = dynamicObj.run();
50+
gOutputBuffer[0] = result;
51+
52+
Val v;
53+
v.v0 = 1;
54+
v.v1 = 2;
55+
v.f0 = 3;
56+
v.v2 = 4;
57+
v.v3 = 5;
58+
v.v4 = 6;
59+
v.v5 = 7;
60+
61+
IInterface dynamicObj1 = createDynamicObject<IInterface, Val>(11, v);;
62+
gOutputBuffer[1] = dynamicObj1.run();
63+
64+
var packed = reinterpret<UserDefinedPackedType, Val>(v);
65+
var unpacked = reinterpret<Val, UserDefinedPackedType>(packed);
66+
gOutputBuffer[2] = unpacked.run();
67+
}
68+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
type: float
2+
28.0
3+
28.0
4+
28.0

0 commit comments

Comments
 (0)