Skip to content

Commit b678d82

Browse files
[SM6.10] Reserve LinAlg HLSL intrinsics (#8026)
Similar to #8015 this PR reserved HL opcodes for the HLSL intrinsics required for the LinAlg feature. The Codegen for each function is set to `EmptyLower` which raises a not implemented error if the intrinsic is seen. `lib/HLSL/HLOperationLower.cpp` and `utils/hct/gen_intrin_main.txt` are the real changes, the rest is generated code. --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 8e2e899 commit b678d82

4 files changed

Lines changed: 115 additions & 3 deletions

File tree

include/dxc/HlslIntrinsicOp.h

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,26 @@ enum class IntrinsicOp {
111111
IOP_WorldToObject = 99,
112112
IOP_WorldToObject3x4 = 100,
113113
IOP_WorldToObject4x3 = 101,
114+
IOP___builtin_LinAlg_CopyConvertMatrix = 405,
115+
IOP___builtin_LinAlg_CreateMatrix = 406,
116+
IOP___builtin_LinAlg_FillMatrix = 407,
117+
IOP___builtin_LinAlg_MatrixAccumulate = 416,
118+
IOP___builtin_LinAlg_MatrixAccumulateToDescriptor = 420,
119+
IOP___builtin_LinAlg_MatrixAccumulateToMemory = 421,
120+
IOP___builtin_LinAlg_MatrixGetCoordinate = 408,
121+
IOP___builtin_LinAlg_MatrixGetElement = 409,
122+
IOP___builtin_LinAlg_MatrixLength = 410,
123+
IOP___builtin_LinAlg_MatrixLoadFromDescriptor = 411,
124+
IOP___builtin_LinAlg_MatrixLoadFromMemory = 412,
125+
IOP___builtin_LinAlg_MatrixMatrixMultiply = 417,
126+
IOP___builtin_LinAlg_MatrixMatrixMultiplyAccumulate = 418,
127+
IOP___builtin_LinAlg_MatrixOuterProduct = 422,
128+
IOP___builtin_LinAlg_MatrixQueryAccumulatorLayout = 419,
129+
IOP___builtin_LinAlg_MatrixSetElement = 413,
130+
IOP___builtin_LinAlg_MatrixStoreToDescriptor = 414,
131+
IOP___builtin_LinAlg_MatrixStoreToMemory = 415,
132+
IOP___builtin_LinAlg_MatrixVectorMultiply = 423,
133+
IOP___builtin_LinAlg_MatrixVectorMultiplyAdd = 424,
114134
IOP___builtin_MatVecMul = 390,
115135
IOP___builtin_MatVecMulAdd = 391,
116136
IOP___builtin_OuterProductAccumulate = 392,
@@ -411,7 +431,7 @@ enum class IntrinsicOp {
411431
IOP_usign = 355,
412432
MOP_InterlockedUMax = 356,
413433
MOP_InterlockedUMin = 357,
414-
Num_Intrinsics = 405,
434+
Num_Intrinsics = 425,
415435
};
416436
inline bool HasUnsignedIntrinsicOpcode(IntrinsicOp opcode) {
417437
switch (opcode) {

lib/HLSL/HLOperationLower.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7536,6 +7536,47 @@ constexpr IntrinsicLower gLowerTable[] = {
75367536
DXIL::OpCode::RayQuery_CommittedTriangleObjectPosition},
75377537
{IntrinsicOp::MOP_DxHitObject_TriangleObjectPosition, EmptyLower,
75387538
DXIL::OpCode::HitObject_TriangleObjectPosition},
7539+
7540+
{IntrinsicOp::IOP___builtin_LinAlg_CopyConvertMatrix, EmptyLower,
7541+
DXIL::OpCode::CopyConvertMatrix},
7542+
{IntrinsicOp::IOP___builtin_LinAlg_CreateMatrix, EmptyLower,
7543+
DXIL::OpCode::CreateMatrix},
7544+
{IntrinsicOp::IOP___builtin_LinAlg_FillMatrix, EmptyLower,
7545+
DXIL::OpCode::FillMatrix},
7546+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixGetCoordinate, EmptyLower,
7547+
DXIL::OpCode::MatrixGetCoordinate},
7548+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixGetElement, EmptyLower,
7549+
DXIL::OpCode::MatrixGetElement},
7550+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixLength, EmptyLower,
7551+
DXIL::OpCode::MatrixLength},
7552+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixLoadFromDescriptor, EmptyLower,
7553+
DXIL::OpCode::MatrixLoadFromDescriptor},
7554+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixLoadFromMemory, EmptyLower,
7555+
DXIL::OpCode::MatrixLoadFromMemory},
7556+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixSetElement, EmptyLower,
7557+
DXIL::OpCode::MatrixSetElement},
7558+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixStoreToDescriptor, EmptyLower,
7559+
DXIL::OpCode::MatrixStoreToDescriptor},
7560+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixStoreToMemory, EmptyLower,
7561+
DXIL::OpCode::MatrixStoreToMemory},
7562+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixAccumulate, EmptyLower,
7563+
DXIL::OpCode::MatrixAccumulate},
7564+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixMatrixMultiply, EmptyLower,
7565+
DXIL::OpCode::MatrixMulOp},
7566+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixMatrixMultiplyAccumulate,
7567+
EmptyLower, DXIL::OpCode::MatrixMulOp},
7568+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixQueryAccumulatorLayout, EmptyLower,
7569+
DXIL::OpCode::MatrixQueryAccumulatorLayout},
7570+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixAccumulateToDescriptor, EmptyLower,
7571+
DXIL::OpCode::MatrixAccumulateToDescriptor},
7572+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixAccumulateToMemory, EmptyLower,
7573+
DXIL::OpCode::MatrixAccumulateToMemory},
7574+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixOuterProduct, EmptyLower,
7575+
DXIL::OpCode::MatrixOuterProduct},
7576+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixVectorMultiply, EmptyLower,
7577+
DXIL::OpCode::MatrixVecMul},
7578+
{IntrinsicOp::IOP___builtin_LinAlg_MatrixVectorMultiplyAdd, EmptyLower,
7579+
DXIL::OpCode::MatrixVecMulAdd},
75397580
};
75407581
constexpr size_t NumLowerTableEntries =
75417582
sizeof(gLowerTable) / sizeof(gLowerTable[0]);

utils/hct/gen_intrin_main.txt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,37 @@ void [[min_sm=6.10]] __builtin_OuterProductAccumulate(in LinAlg<c> InputVector1,
395395

396396
void [[min_sm=6.10]] __builtin_VectorAccumulate(in LinAlg<c> InputVector, in RWByteAddressBuffer MatrixBuffer, in uint MatrixOffset);
397397

398+
// LinAlg intrinsics
399+
400+
// TODO: Update return type for CreateMatrix to MatrixRef
401+
// TODO: Replace all int MatrixRef with MatrixRef type
402+
// TODO: Replace all int GroupSharedMem with groupshared memory
403+
void [[min_sm=6.10]] __builtin_LinAlg_CreateMatrix();
404+
void [[min_sm=6.10]] __builtin_LinAlg_FillMatrix(int MatrixRef, numeric value);
405+
void [[min_sm=6.10]] __builtin_LinAlg_CopyConvertMatrix(int MatrixRefDest, int MatrixRefSrc, bool transpose);
406+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixLoadFromDescriptor(int MatrixRef, resource buf, int32_only offset, int32_only stride, int32_only layout);
407+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixLoadFromMemory(int MatrixRef, int GroupSharedMem, int32_only offset, int32_only stride, int32_only layout);
408+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixLength(int MatrixRef);
409+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixGetCoordinate(int MatrixRef, int32_only threadLocalIndex);
410+
numeric [[min_sm=6.10]] __builtin_LinAlg_MatrixGetElement(int MatrixRef, int32_only threadLocalIndex);
411+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixSetElement(int MatrixRef, int32_only threadLocalIndex, numeric value);
412+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixStoreToDescriptor(int MatrixRef, resource buf, int32_only offset, int32_only stride, int32_only layout);
413+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixStoreToMemory(int MatrixRef, int GroupSharedMem, int32_only offset, int32_only stride, int32_only layout);
414+
int32_only [[min_sm=6.10]] __builtin_LinAlg_MatrixQueryAccumulatorLayout();
415+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixMatrixMultiply(int MatrixRefA, int MatrixRefB, int MatrixRefC);
416+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixMatrixMultiplyAccumulate(int MatrixRefA, int MatrixRefB, int MatrixRefC);
417+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixAccumulate(int MatrixRefRHS, int MatrixRefLHS);
418+
419+
// TODO: Fix vector types
420+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixVectorMultiply(int MatrixRef);
421+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixVectorMultiplyAdd(int MatrixRef);
422+
423+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixAccumulateToDescriptor(int MatrixRef, resource buf, int32_only offset, int32_only stride, int32_only layout);
424+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixAccumulateToMemory(int MatrixRef, int GroupSharedMem, int32_only offset, int32_only stride, int32_only layout);
425+
426+
// TODO: Fix vector types
427+
void [[min_sm=6.10]] __builtin_LinAlg_MatrixOuterProduct(int MatrixRef);
428+
398429
} namespace
399430

400431

utils/hct/hlsl_intrinsic_opcodes.json

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"IntrinsicOpCodes": {
3-
"Num_Intrinsics": 405,
3+
"Num_Intrinsics": 425,
44
"IOP_AcceptHitAndEndSearch": 0,
55
"IOP_AddUint64": 1,
66
"IOP_AllMemoryBarrier": 2,
@@ -405,6 +405,26 @@
405405
"IOP_TriangleObjectPosition": 401,
406406
"MOP_CandidateTriangleObjectPosition": 402,
407407
"MOP_CommittedTriangleObjectPosition": 403,
408-
"MOP_DxHitObject_TriangleObjectPosition": 404
408+
"MOP_DxHitObject_TriangleObjectPosition": 404,
409+
"IOP___builtin_LinAlg_CopyConvertMatrix": 405,
410+
"IOP___builtin_LinAlg_CreateMatrix": 406,
411+
"IOP___builtin_LinAlg_FillMatrix": 407,
412+
"IOP___builtin_LinAlg_MatrixGetCoordinate": 408,
413+
"IOP___builtin_LinAlg_MatrixGetElement": 409,
414+
"IOP___builtin_LinAlg_MatrixLength": 410,
415+
"IOP___builtin_LinAlg_MatrixLoadFromDescriptor": 411,
416+
"IOP___builtin_LinAlg_MatrixLoadFromMemory": 412,
417+
"IOP___builtin_LinAlg_MatrixSetElement": 413,
418+
"IOP___builtin_LinAlg_MatrixStoreToDescriptor": 414,
419+
"IOP___builtin_LinAlg_MatrixStoreToMemory": 415,
420+
"IOP___builtin_LinAlg_MatrixAccumulate": 416,
421+
"IOP___builtin_LinAlg_MatrixMatrixMultiply": 417,
422+
"IOP___builtin_LinAlg_MatrixMatrixMultiplyAccumulate": 418,
423+
"IOP___builtin_LinAlg_MatrixQueryAccumulatorLayout": 419,
424+
"IOP___builtin_LinAlg_MatrixAccumulateToDescriptor": 420,
425+
"IOP___builtin_LinAlg_MatrixAccumulateToMemory": 421,
426+
"IOP___builtin_LinAlg_MatrixOuterProduct": 422,
427+
"IOP___builtin_LinAlg_MatrixVectorMultiply": 423,
428+
"IOP___builtin_LinAlg_MatrixVectorMultiplyAdd": 424
409429
}
410430
}

0 commit comments

Comments
 (0)