Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion include/dxc/HlslIntrinsicOp.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,26 @@ enum class IntrinsicOp {
IOP_WorldToObject = 99,
IOP_WorldToObject3x4 = 100,
IOP_WorldToObject4x3 = 101,
IOP___builtin_LinAlg_CopyConvertMatrix = 405,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Is there a required order for these? In the other files they seemed to be sorted by opcode

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah yeah, this is an interesting topic. There is some info below but there are a lot of moving parts. Happy to chat more if below is unclear

  • This is generated code, and this is where it was placed by the generator
  • They are actually ordered, but they are ordered alphabetically not by opcode value. The extra __ for __builtin somewhat hides that fact since it's not visually obvious
  • The values here are internal so they can be renumbered without issue but it was decided they shouldn't be

This may raise the question "how is it that 99% of the opcodes have the number that matches their alphabetic order" to which the answer is: until very recently the generator would renumber every opcode any time a new intrinsic was added. This created a lot of ordering churn, large diffs, and merge conflicts and was generally not a good thing to be doing so it was turned off

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, sounds good

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,
Expand Down Expand Up @@ -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) {
Expand Down
41 changes: 41 additions & 0 deletions lib/HLSL/HLOperationLower.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
Expand Down
31 changes: 31 additions & 0 deletions utils/hct/gen_intrin_main.txt
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,37 @@ void [[min_sm=6.10]] __builtin_OuterProductAccumulate(in LinAlg<c> InputVector1,

void [[min_sm=6.10]] __builtin_VectorAccumulate(in LinAlg<c> 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


Expand Down
24 changes: 22 additions & 2 deletions utils/hct/hlsl_intrinsic_opcodes.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"IntrinsicOpCodes": {
"Num_Intrinsics": 405,
"Num_Intrinsics": 425,
"IOP_AcceptHitAndEndSearch": 0,
"IOP_AddUint64": 1,
"IOP_AllMemoryBarrier": 2,
Expand Down Expand Up @@ -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
}
}