diff --git a/include/dxc/HlslIntrinsicOp.h b/include/dxc/HlslIntrinsicOp.h index aae269cfa1..24e35b3719 100644 --- a/include/dxc/HlslIntrinsicOp.h +++ b/include/dxc/HlslIntrinsicOp.h @@ -111,6 +111,26 @@ enum class IntrinsicOp { IOP_WorldToObject = 99, IOP_WorldToObject3x4 = 100, IOP_WorldToObject4x3 = 101, + IOP___builtin_LinAlg_CopyConvertMatrix = 405, + IOP___builtin_LinAlg_CreateMatrix = 406, + IOP___builtin_LinAlg_FillMatrix = 407, + IOP___builtin_LinAlg_MatrixAccumulate = 416, + IOP___builtin_LinAlg_MatrixAccumulateToDescriptor = 420, + IOP___builtin_LinAlg_MatrixAccumulateToMemory = 421, + IOP___builtin_LinAlg_MatrixGetCoordinate = 408, + IOP___builtin_LinAlg_MatrixGetElement = 409, + IOP___builtin_LinAlg_MatrixLength = 410, + IOP___builtin_LinAlg_MatrixLoadFromDescriptor = 411, + IOP___builtin_LinAlg_MatrixLoadFromMemory = 412, + IOP___builtin_LinAlg_MatrixMatrixMultiply = 417, + IOP___builtin_LinAlg_MatrixMatrixMultiplyAccumulate = 418, + IOP___builtin_LinAlg_MatrixOuterProduct = 422, + IOP___builtin_LinAlg_MatrixQueryAccumulatorLayout = 419, + IOP___builtin_LinAlg_MatrixSetElement = 413, + IOP___builtin_LinAlg_MatrixStoreToDescriptor = 414, + IOP___builtin_LinAlg_MatrixStoreToMemory = 415, + IOP___builtin_LinAlg_MatrixVectorMultiply = 423, + IOP___builtin_LinAlg_MatrixVectorMultiplyAdd = 424, IOP___builtin_MatVecMul = 390, IOP___builtin_MatVecMulAdd = 391, IOP___builtin_OuterProductAccumulate = 392, @@ -411,7 +431,7 @@ enum class IntrinsicOp { IOP_usign = 355, MOP_InterlockedUMax = 356, MOP_InterlockedUMin = 357, - Num_Intrinsics = 405, + Num_Intrinsics = 425, }; inline bool HasUnsignedIntrinsicOpcode(IntrinsicOp opcode) { switch (opcode) { diff --git a/lib/HLSL/HLOperationLower.cpp b/lib/HLSL/HLOperationLower.cpp index f8a7907c91..956ac2cade 100644 --- a/lib/HLSL/HLOperationLower.cpp +++ b/lib/HLSL/HLOperationLower.cpp @@ -7536,6 +7536,47 @@ constexpr IntrinsicLower gLowerTable[] = { DXIL::OpCode::RayQuery_CommittedTriangleObjectPosition}, {IntrinsicOp::MOP_DxHitObject_TriangleObjectPosition, EmptyLower, DXIL::OpCode::HitObject_TriangleObjectPosition}, + + {IntrinsicOp::IOP___builtin_LinAlg_CopyConvertMatrix, EmptyLower, + DXIL::OpCode::CopyConvertMatrix}, + {IntrinsicOp::IOP___builtin_LinAlg_CreateMatrix, EmptyLower, + DXIL::OpCode::CreateMatrix}, + {IntrinsicOp::IOP___builtin_LinAlg_FillMatrix, EmptyLower, + DXIL::OpCode::FillMatrix}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixGetCoordinate, EmptyLower, + DXIL::OpCode::MatrixGetCoordinate}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixGetElement, EmptyLower, + DXIL::OpCode::MatrixGetElement}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixLength, EmptyLower, + DXIL::OpCode::MatrixLength}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixLoadFromDescriptor, EmptyLower, + DXIL::OpCode::MatrixLoadFromDescriptor}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixLoadFromMemory, EmptyLower, + DXIL::OpCode::MatrixLoadFromMemory}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixSetElement, EmptyLower, + DXIL::OpCode::MatrixSetElement}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixStoreToDescriptor, EmptyLower, + DXIL::OpCode::MatrixStoreToDescriptor}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixStoreToMemory, EmptyLower, + DXIL::OpCode::MatrixStoreToMemory}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixAccumulate, EmptyLower, + DXIL::OpCode::MatrixAccumulate}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixMatrixMultiply, EmptyLower, + DXIL::OpCode::MatrixMulOp}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixMatrixMultiplyAccumulate, + EmptyLower, DXIL::OpCode::MatrixMulOp}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixQueryAccumulatorLayout, EmptyLower, + DXIL::OpCode::MatrixQueryAccumulatorLayout}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixAccumulateToDescriptor, EmptyLower, + DXIL::OpCode::MatrixAccumulateToDescriptor}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixAccumulateToMemory, EmptyLower, + DXIL::OpCode::MatrixAccumulateToMemory}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixOuterProduct, EmptyLower, + DXIL::OpCode::MatrixOuterProduct}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixVectorMultiply, EmptyLower, + DXIL::OpCode::MatrixVecMul}, + {IntrinsicOp::IOP___builtin_LinAlg_MatrixVectorMultiplyAdd, EmptyLower, + DXIL::OpCode::MatrixVecMulAdd}, }; constexpr size_t NumLowerTableEntries = sizeof(gLowerTable) / sizeof(gLowerTable[0]); diff --git a/utils/hct/gen_intrin_main.txt b/utils/hct/gen_intrin_main.txt index 8b10f733a8..3b20c13ccb 100644 --- a/utils/hct/gen_intrin_main.txt +++ b/utils/hct/gen_intrin_main.txt @@ -395,6 +395,37 @@ void [[min_sm=6.10]] __builtin_OuterProductAccumulate(in LinAlg InputVector1, void [[min_sm=6.10]] __builtin_VectorAccumulate(in LinAlg InputVector, in RWByteAddressBuffer MatrixBuffer, in uint MatrixOffset); +// LinAlg intrinsics + +// TODO: Update return type for CreateMatrix to MatrixRef +// TODO: Replace all int MatrixRef with MatrixRef type +// TODO: Replace all int GroupSharedMem with groupshared memory +void [[min_sm=6.10]] __builtin_LinAlg_CreateMatrix(); +void [[min_sm=6.10]] __builtin_LinAlg_FillMatrix(int MatrixRef, numeric value); +void [[min_sm=6.10]] __builtin_LinAlg_CopyConvertMatrix(int MatrixRefDest, int MatrixRefSrc, bool transpose); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixLoadFromDescriptor(int MatrixRef, resource buf, int32_only offset, int32_only stride, int32_only layout); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixLoadFromMemory(int MatrixRef, int GroupSharedMem, int32_only offset, int32_only stride, int32_only layout); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixLength(int MatrixRef); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixGetCoordinate(int MatrixRef, int32_only threadLocalIndex); +numeric [[min_sm=6.10]] __builtin_LinAlg_MatrixGetElement(int MatrixRef, int32_only threadLocalIndex); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixSetElement(int MatrixRef, int32_only threadLocalIndex, numeric value); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixStoreToDescriptor(int MatrixRef, resource buf, int32_only offset, int32_only stride, int32_only layout); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixStoreToMemory(int MatrixRef, int GroupSharedMem, int32_only offset, int32_only stride, int32_only layout); +int32_only [[min_sm=6.10]] __builtin_LinAlg_MatrixQueryAccumulatorLayout(); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixMatrixMultiply(int MatrixRefA, int MatrixRefB, int MatrixRefC); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixMatrixMultiplyAccumulate(int MatrixRefA, int MatrixRefB, int MatrixRefC); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixAccumulate(int MatrixRefRHS, int MatrixRefLHS); + +// TODO: Fix vector types +void [[min_sm=6.10]] __builtin_LinAlg_MatrixVectorMultiply(int MatrixRef); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixVectorMultiplyAdd(int MatrixRef); + +void [[min_sm=6.10]] __builtin_LinAlg_MatrixAccumulateToDescriptor(int MatrixRef, resource buf, int32_only offset, int32_only stride, int32_only layout); +void [[min_sm=6.10]] __builtin_LinAlg_MatrixAccumulateToMemory(int MatrixRef, int GroupSharedMem, int32_only offset, int32_only stride, int32_only layout); + +// TODO: Fix vector types +void [[min_sm=6.10]] __builtin_LinAlg_MatrixOuterProduct(int MatrixRef); + } namespace diff --git a/utils/hct/hlsl_intrinsic_opcodes.json b/utils/hct/hlsl_intrinsic_opcodes.json index e2d3c6f290..e09e31cbfe 100644 --- a/utils/hct/hlsl_intrinsic_opcodes.json +++ b/utils/hct/hlsl_intrinsic_opcodes.json @@ -1,6 +1,6 @@ { "IntrinsicOpCodes": { - "Num_Intrinsics": 405, + "Num_Intrinsics": 425, "IOP_AcceptHitAndEndSearch": 0, "IOP_AddUint64": 1, "IOP_AllMemoryBarrier": 2, @@ -405,6 +405,26 @@ "IOP_TriangleObjectPosition": 401, "MOP_CandidateTriangleObjectPosition": 402, "MOP_CommittedTriangleObjectPosition": 403, - "MOP_DxHitObject_TriangleObjectPosition": 404 + "MOP_DxHitObject_TriangleObjectPosition": 404, + "IOP___builtin_LinAlg_CopyConvertMatrix": 405, + "IOP___builtin_LinAlg_CreateMatrix": 406, + "IOP___builtin_LinAlg_FillMatrix": 407, + "IOP___builtin_LinAlg_MatrixGetCoordinate": 408, + "IOP___builtin_LinAlg_MatrixGetElement": 409, + "IOP___builtin_LinAlg_MatrixLength": 410, + "IOP___builtin_LinAlg_MatrixLoadFromDescriptor": 411, + "IOP___builtin_LinAlg_MatrixLoadFromMemory": 412, + "IOP___builtin_LinAlg_MatrixSetElement": 413, + "IOP___builtin_LinAlg_MatrixStoreToDescriptor": 414, + "IOP___builtin_LinAlg_MatrixStoreToMemory": 415, + "IOP___builtin_LinAlg_MatrixAccumulate": 416, + "IOP___builtin_LinAlg_MatrixMatrixMultiply": 417, + "IOP___builtin_LinAlg_MatrixMatrixMultiplyAccumulate": 418, + "IOP___builtin_LinAlg_MatrixQueryAccumulatorLayout": 419, + "IOP___builtin_LinAlg_MatrixAccumulateToDescriptor": 420, + "IOP___builtin_LinAlg_MatrixAccumulateToMemory": 421, + "IOP___builtin_LinAlg_MatrixOuterProduct": 422, + "IOP___builtin_LinAlg_MatrixVectorMultiply": 423, + "IOP___builtin_LinAlg_MatrixVectorMultiplyAdd": 424 } }