Skip to content

Commit 70ee672

Browse files
authored
Merge main to staging-sm6.9 (#7368)
Merge main into staging-sm6.9
2 parents 86dd84d + 9ef5d8a commit 70ee672

28 files changed

Lines changed: 933 additions & 200 deletions

include/dxc/DXIL/DxilConstants.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,6 +1583,11 @@ const unsigned kMSStoreOutputColOpIdx = 3;
15831583
const unsigned kMSStoreOutputVIdxOpIdx = 4;
15841584
const unsigned kMSStoreOutputValOpIdx = 5;
15851585

1586+
// HitObject::TraceRay
1587+
const unsigned kHitObjectTraceRay_RayDescOpIdx = 7;
1588+
const unsigned kHitObjectTraceRay_PayloadOpIdx = 15;
1589+
const unsigned kHitObjectTraceRay_NumOp = 16;
1590+
15861591
// MatVec Ops
15871592
const unsigned kMatVecMulInputVectorIdx = 1;
15881593
const unsigned kMatVecMulIsInputUnsignedIdx = 2;

include/dxc/HLSL/HLOperations.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,14 @@ const unsigned kNodeHandleToResCastOpIdx = 1;
433433
const unsigned kAnnotateNodeHandleNodePropIdx = 2;
434434
const unsigned kAnnotateNodeRecordHandleNodeRecordPropIdx = 2;
435435

436+
// HitObject::MakeMiss
437+
const unsigned kHitObjectMakeMiss_NumOp = 8;
438+
const unsigned kHitObjectMakeMissRayDescOpIdx = 4;
439+
440+
// HitObject::TraceRay
441+
const unsigned kHitObjectTraceRay_RayDescOpIdx = 8;
442+
const unsigned kHitObjectTraceRay_NumOp = 10;
443+
436444
// Linear Algebra Operations
437445

438446
// MatVecMul

lib/HLSL/HLOperationLower.cpp

Lines changed: 190 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@
1212
// //
1313
///////////////////////////////////////////////////////////////////////////////
1414

15+
#include "dxc/DXIL/DxilConstants.h"
1516
#define _USE_MATH_DEFINES
1617
#include <array>
1718
#include <cmath>
1819
#include <functional>
1920
#include <unordered_set>
2021

22+
#include "dxc/DXIL/DxilConstants.h"
23+
#include "dxc/DXIL/DxilInstructions.h"
2124
#include "dxc/DXIL/DxilModule.h"
2225
#include "dxc/DXIL/DxilOperations.h"
2326
#include "dxc/DXIL/DxilResourceProperties.h"
@@ -5717,58 +5720,61 @@ Value *TranslateCallShader(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
57175720
return Builder.CreateCall(F, {opArg, ShaderIndex, Parameter});
57185721
}
57195722

5720-
Value *TranslateTraceRay(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
5721-
HLOperationLowerHelper &helper,
5722-
HLObjectOperationLowerHelper *pObjHelper,
5723-
bool &Translated) {
5724-
hlsl::OP *hlslOP = &helper.hlslOP;
5725-
5726-
Value *rayDesc = CI->getArgOperand(HLOperandIndex::kTraceRayRayDescOpIdx);
5727-
Value *payLoad = CI->getArgOperand(HLOperandIndex::kTraceRayPayLoadOpIdx);
5728-
5729-
Value *opArg = hlslOP->GetU32Const(static_cast<unsigned>(opcode));
5730-
5731-
Value *Args[DXIL::OperandIndex::kTraceRayNumOp];
5732-
Args[0] = opArg;
5733-
for (unsigned i = 1; i < HLOperandIndex::kTraceRayRayDescOpIdx; i++) {
5734-
Args[i] = CI->getArgOperand(i);
5735-
}
5736-
IRBuilder<> Builder(CI);
5723+
static unsigned LoadRayDescElementsIntoArgs(Value **Args, hlsl::OP *OP,
5724+
IRBuilder<> &Builder,
5725+
Value *RayDescPtr, unsigned Index) {
57375726
// struct RayDesc
57385727
//{
57395728
// float3 Origin;
57405729
// float TMin;
57415730
// float3 Direction;
57425731
// float TMax;
57435732
//};
5744-
Value *zeroIdx = hlslOP->GetU32Const(0);
5745-
Value *origin = Builder.CreateGEP(rayDesc, {zeroIdx, zeroIdx});
5746-
origin = Builder.CreateLoad(origin);
5747-
unsigned index = DXIL::OperandIndex::kTraceRayRayDescOpIdx;
5748-
Args[index++] = Builder.CreateExtractElement(origin, (uint64_t)0);
5749-
Args[index++] = Builder.CreateExtractElement(origin, 1);
5750-
Args[index++] = Builder.CreateExtractElement(origin, 2);
5733+
Value *ZeroIdx = OP->GetU32Const(0);
5734+
Value *Origin = Builder.CreateGEP(RayDescPtr, {ZeroIdx, ZeroIdx});
5735+
Origin = Builder.CreateLoad(Origin);
5736+
Args[Index++] = Builder.CreateExtractElement(Origin, (uint64_t)0);
5737+
Args[Index++] = Builder.CreateExtractElement(Origin, 1);
5738+
Args[Index++] = Builder.CreateExtractElement(Origin, 2);
57515739

5752-
Value *tmin = Builder.CreateGEP(rayDesc, {zeroIdx, hlslOP->GetU32Const(1)});
5753-
tmin = Builder.CreateLoad(tmin);
5754-
Args[index++] = tmin;
5740+
Value *TMinPtr = Builder.CreateGEP(RayDescPtr, {ZeroIdx, OP->GetU32Const(1)});
5741+
Args[Index++] = Builder.CreateLoad(TMinPtr);
57555742

5756-
Value *direction =
5757-
Builder.CreateGEP(rayDesc, {zeroIdx, hlslOP->GetU32Const(2)});
5758-
direction = Builder.CreateLoad(direction);
5743+
Value *DirectionPtr =
5744+
Builder.CreateGEP(RayDescPtr, {ZeroIdx, OP->GetU32Const(2)});
5745+
Value *Direction = Builder.CreateLoad(DirectionPtr);
57595746

5760-
Args[index++] = Builder.CreateExtractElement(direction, (uint64_t)0);
5761-
Args[index++] = Builder.CreateExtractElement(direction, 1);
5762-
Args[index++] = Builder.CreateExtractElement(direction, 2);
5747+
Args[Index++] = Builder.CreateExtractElement(Direction, (uint64_t)0);
5748+
Args[Index++] = Builder.CreateExtractElement(Direction, 1);
5749+
Args[Index++] = Builder.CreateExtractElement(Direction, 2);
5750+
5751+
Value *TMaxPtr = Builder.CreateGEP(RayDescPtr, {ZeroIdx, OP->GetU32Const(3)});
5752+
Args[Index++] = Builder.CreateLoad(TMaxPtr);
5753+
return Index;
5754+
}
5755+
5756+
Value *TranslateTraceRay(CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
5757+
HLOperationLowerHelper &Helper,
5758+
HLObjectOperationLowerHelper *pObjHelper,
5759+
bool &Translated) {
5760+
hlsl::OP *OP = &Helper.hlslOP;
5761+
5762+
Value *RayDesc = CI->getArgOperand(HLOperandIndex::kTraceRayRayDescOpIdx);
5763+
Value *PayLoad = CI->getArgOperand(HLOperandIndex::kTraceRayPayLoadOpIdx);
5764+
5765+
Value *Args[DXIL::OperandIndex::kTraceRayNumOp];
5766+
Args[0] = OP->GetU32Const(static_cast<unsigned>(OpCode));
5767+
for (unsigned i = 1; i < HLOperandIndex::kTraceRayRayDescOpIdx; i++)
5768+
Args[i] = CI->getArgOperand(i);
57635769

5764-
Value *tmax = Builder.CreateGEP(rayDesc, {zeroIdx, hlslOP->GetU32Const(3)});
5765-
tmax = Builder.CreateLoad(tmax);
5766-
Args[index++] = tmax;
5770+
IRBuilder<> Builder(CI);
5771+
LoadRayDescElementsIntoArgs(Args, OP, Builder, RayDesc,
5772+
DXIL::OperandIndex::kTraceRayRayDescOpIdx);
57675773

5768-
Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx] = payLoad;
5774+
Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx] = PayLoad;
57695775

5770-
Type *Ty = payLoad->getType();
5771-
Function *F = hlslOP->GetOpFunc(opcode, Ty);
5776+
Type *Ty = PayLoad->getType();
5777+
Function *F = OP->GetOpFunc(OpCode, Ty);
57725778

57735779
return Builder.CreateCall(F, Args);
57745780
}
@@ -6183,19 +6189,114 @@ Value *TranslateUnpack(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
61836189

61846190
// Shader Execution Reordering.
61856191
namespace {
6186-
Value *TranslateHitObjectMake(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
6187-
HLOperationLowerHelper &helper,
6188-
HLObjectOperationLowerHelper *pObjHelper,
6192+
Value *TranslateHitObjectMake(CallInst *CI, IntrinsicOp IOP, OP::OpCode Opcode,
6193+
HLOperationLowerHelper &Helper,
6194+
HLObjectOperationLowerHelper *ObjHelper,
61896195
bool &Translated) {
6190-
return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches
6196+
hlsl::OP *HlslOP = &Helper.hlslOP;
6197+
IRBuilder<> Builder(CI);
6198+
unsigned SrcIdx = 1;
6199+
Value *HitObjectPtr = CI->getArgOperand(SrcIdx++);
6200+
if (Opcode == OP::OpCode::HitObject_MakeNop) {
6201+
Value *HitObject = TrivialDxilOperation(
6202+
Opcode, {nullptr}, Type::getVoidTy(CI->getContext()), CI, HlslOP);
6203+
Builder.CreateStore(HitObject, HitObjectPtr);
6204+
DXASSERT(
6205+
CI->use_empty(),
6206+
"Default ctor return type is a Clang artifact. Value must not be used");
6207+
return nullptr;
6208+
}
6209+
6210+
DXASSERT_NOMSG(CI->getNumArgOperands() ==
6211+
HLOperandIndex::kHitObjectMakeMiss_NumOp);
6212+
Value *RayFlags = CI->getArgOperand(SrcIdx++);
6213+
Value *MissShaderIdx = CI->getArgOperand(SrcIdx++);
6214+
DXASSERT_NOMSG(SrcIdx == HLOperandIndex::kHitObjectMakeMissRayDescOpIdx);
6215+
Value *RayDescOrigin = CI->getArgOperand(SrcIdx++);
6216+
Value *RayDescOriginX =
6217+
Builder.CreateExtractElement(RayDescOrigin, (uint64_t)0);
6218+
Value *RayDescOriginY =
6219+
Builder.CreateExtractElement(RayDescOrigin, (uint64_t)1);
6220+
Value *RayDescOriginZ =
6221+
Builder.CreateExtractElement(RayDescOrigin, (uint64_t)2);
6222+
6223+
Value *RayDescTMin = CI->getArgOperand(SrcIdx++);
6224+
Value *RayDescDirection = CI->getArgOperand(SrcIdx++);
6225+
Value *RayDescDirectionX =
6226+
Builder.CreateExtractElement(RayDescDirection, (uint64_t)0);
6227+
Value *RayDescDirectionY =
6228+
Builder.CreateExtractElement(RayDescDirection, (uint64_t)1);
6229+
Value *RayDescDirectionZ =
6230+
Builder.CreateExtractElement(RayDescDirection, (uint64_t)2);
6231+
6232+
Value *RayDescTMax = CI->getArgOperand(SrcIdx++);
6233+
DXASSERT_NOMSG(SrcIdx == CI->getNumArgOperands());
6234+
6235+
Value *OutHitObject = TrivialDxilOperation(
6236+
Opcode,
6237+
{nullptr, RayFlags, MissShaderIdx, RayDescOriginX, RayDescOriginY,
6238+
RayDescOriginZ, RayDescTMin, RayDescDirectionX, RayDescDirectionY,
6239+
RayDescDirectionZ, RayDescTMax},
6240+
Helper.voidTy, CI, HlslOP);
6241+
Builder.CreateStore(OutHitObject, HitObjectPtr);
6242+
return nullptr;
61916243
}
61926244

61936245
Value *TranslateMaybeReorderThread(CallInst *CI, IntrinsicOp IOP,
6194-
OP::OpCode opcode,
6195-
HLOperationLowerHelper &helper,
6246+
OP::OpCode OpCode,
6247+
HLOperationLowerHelper &Helper,
61966248
HLObjectOperationLowerHelper *pObjHelper,
61976249
bool &Translated) {
6198-
return nullptr; // TODO: Merge SER DXIL patches
6250+
hlsl::OP *OP = &Helper.hlslOP;
6251+
6252+
// clang-format off
6253+
// Match MaybeReorderThread overload variants:
6254+
// void MaybeReorderThread(<Op>,
6255+
// HitObject Hit);
6256+
// void MaybeReorderThread(<Op>,
6257+
// uint CoherenceHint,
6258+
// uint NumCoherenceHintBitsFromLSB );
6259+
// void MaybeReorderThread(<Op>,
6260+
// HitObject Hit,
6261+
// uint CoherenceHint,
6262+
// uint NumCoherenceHintBitsFromLSB);
6263+
// clang-format on
6264+
const unsigned NumHLArgs = CI->getNumArgOperands();
6265+
DXASSERT_NOMSG(NumHLArgs >= 2);
6266+
6267+
// Use a NOP HitObject for MaybeReorderThread without HitObject.
6268+
Value *HitObject = nullptr;
6269+
unsigned HLIndex = 1;
6270+
if (3 == NumHLArgs) {
6271+
HitObject = TrivialDxilOperation(DXIL::OpCode::HitObject_MakeNop, {nullptr},
6272+
Type::getVoidTy(CI->getContext()), CI, OP);
6273+
} else {
6274+
Value *FirstParam = CI->getArgOperand(HLIndex);
6275+
DXASSERT_NOMSG(isa<PointerType>(FirstParam->getType()));
6276+
IRBuilder<> Builder(CI);
6277+
HitObject = Builder.CreateLoad(FirstParam);
6278+
HLIndex++;
6279+
}
6280+
6281+
// If there are trailing parameters, these have to be the two coherence bit
6282+
// parameters
6283+
Value *CoherenceHint = nullptr;
6284+
Value *NumCoherenceHintBits = nullptr;
6285+
if (2 != NumHLArgs) {
6286+
DXASSERT_NOMSG(HLIndex + 2 == NumHLArgs);
6287+
CoherenceHint = CI->getArgOperand(HLIndex++);
6288+
NumCoherenceHintBits = CI->getArgOperand(HLIndex++);
6289+
DXASSERT_NOMSG(Helper.i32Ty == CoherenceHint->getType());
6290+
DXASSERT_NOMSG(Helper.i32Ty == NumCoherenceHintBits->getType());
6291+
} else {
6292+
CoherenceHint = UndefValue::get(Helper.i32Ty);
6293+
NumCoherenceHintBits = OP->GetU32Const(0);
6294+
}
6295+
6296+
TrivialDxilOperation(
6297+
OpCode, {nullptr, HitObject, CoherenceHint, NumCoherenceHintBits},
6298+
Type::getVoidTy(CI->getContext()), CI, OP);
6299+
return nullptr;
61996300
}
62006301

62016302
Value *TranslateHitObjectFromRayQuery(CallInst *CI, IntrinsicOp IOP,
@@ -6211,15 +6312,54 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP,
62116312
HLOperationLowerHelper &Helper,
62126313
HLObjectOperationLowerHelper *pObjHelper,
62136314
bool &Translated) {
6214-
return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches
6315+
hlsl::OP *OP = &Helper.hlslOP;
6316+
IRBuilder<> Builder(CI);
6317+
6318+
const unsigned DxilNumArgs = DxilInst_HitObject_TraceRay::arg_payload + 1;
6319+
DXASSERT_NOMSG(CI->getNumArgOperands() ==
6320+
HLOperandIndex::kHitObjectTraceRay_NumOp);
6321+
Value *Args[DxilNumArgs];
6322+
Value *OpArg = OP->GetU32Const(static_cast<unsigned>(OpCode));
6323+
Args[0] = OpArg;
6324+
6325+
unsigned DestIdx = 1, SrcIdx = 1;
6326+
Value *HitObjectPtr = CI->getArgOperand(SrcIdx++);
6327+
Args[DestIdx++] = CI->getArgOperand(SrcIdx++);
6328+
for (; SrcIdx < HLOperandIndex::kHitObjectTraceRay_RayDescOpIdx;
6329+
++SrcIdx, ++DestIdx) {
6330+
Args[DestIdx] = CI->getArgOperand(SrcIdx);
6331+
}
6332+
6333+
Value *RayDescPtr = CI->getArgOperand(SrcIdx++);
6334+
DestIdx = LoadRayDescElementsIntoArgs(Args, OP, Builder, RayDescPtr, DestIdx);
6335+
Value *Payload = CI->getArgOperand(SrcIdx++);
6336+
Args[DestIdx++] = Payload;
6337+
6338+
DXASSERT_NOMSG(SrcIdx == CI->getNumArgOperands());
6339+
DXASSERT_NOMSG(DestIdx == DxilNumArgs);
6340+
6341+
Function *F = OP->GetOpFunc(OpCode, Payload->getType());
6342+
6343+
Value *OutHitObject = Builder.CreateCall(F, Args);
6344+
Builder.CreateStore(OutHitObject, HitObjectPtr);
6345+
return nullptr;
62156346
}
62166347

62176348
Value *TranslateHitObjectInvoke(CallInst *CI, IntrinsicOp IOP,
62186349
OP::OpCode OpCode,
62196350
HLOperationLowerHelper &Helper,
62206351
HLObjectOperationLowerHelper *pObjHelper,
62216352
bool &Translated) {
6222-
return nullptr; // TODO: Merge SER DXIL patches
6353+
unsigned SrcIdx = 1;
6354+
Value *HitObjectPtr = CI->getArgOperand(SrcIdx++);
6355+
Value *Payload = CI->getArgOperand(SrcIdx++);
6356+
DXASSERT_NOMSG(SrcIdx == CI->getNumArgOperands());
6357+
6358+
IRBuilder<> Builder(CI);
6359+
Value *HitObject = Builder.CreateLoad(HitObjectPtr);
6360+
TrivialDxilOperation(OpCode, {nullptr, HitObject, Payload},
6361+
Payload->getType(), CI, &Helper.hlslOP);
6362+
return nullptr;
62236363
}
62246364

62256365
Value *TranslateHitObjectGetAttributes(CallInst *CI, IntrinsicOp IOP,
@@ -7162,11 +7302,9 @@ IntrinsicLower gLowerTable[] = {
71627302
{IntrinsicOp::MOP_InterlockedUMin, TranslateMopAtomicBinaryOperation,
71637303
DXIL::OpCode::NumOpCodes},
71647304
{IntrinsicOp::MOP_DxHitObject_MakeNop, TranslateHitObjectMake,
7165-
DXIL::OpCode::NumOpCodes_Dxil_1_8}, // FIXME: Just a placeholder Dxil
7166-
// opcode
7305+
DXIL::OpCode::HitObject_MakeNop},
71677306
{IntrinsicOp::IOP_DxMaybeReorderThread, TranslateMaybeReorderThread,
7168-
DXIL::OpCode::NumOpCodes_Dxil_1_8}, // FIXME: Just a placeholder Dxil
7169-
// opcode
7307+
DXIL::OpCode::MaybeReorderThread},
71707308
{IntrinsicOp::IOP_Vkstatic_pointer_cast, UnsupportedVulkanIntrinsic,
71717309
DXIL::OpCode::NumOpCodes},
71727310
{IntrinsicOp::IOP_Vkreinterpret_pointer_cast, UnsupportedVulkanIntrinsic,

lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,6 +1540,8 @@ void isSafeForScalarRepl(Instruction *I, uint64_t Offset, AllocaInfo &Info) {
15401540
// basing on IOP?
15411541
IntrinsicOp opcode = static_cast<IntrinsicOp>(GetHLOpcode(CI));
15421542
if (IntrinsicOp::IOP_TraceRay == opcode ||
1543+
IntrinsicOp::MOP_DxHitObject_TraceRay == opcode ||
1544+
IntrinsicOp::MOP_DxHitObject_Invoke == opcode ||
15431545
IntrinsicOp::IOP_ReportHit == opcode ||
15441546
IntrinsicOp::IOP_CallShader == opcode) {
15451547
return MarkUnsafe(Info, User);
@@ -2775,6 +2777,14 @@ void SROA_Helper::RewriteCall(CallInst *CI) {
27752777
RewriteCallArg(CI, HLOperandIndex::kCallShaderPayloadOpIdx,
27762778
/*bIn*/ true, /*bOut*/ true);
27772779
} break;
2780+
case IntrinsicOp::MOP_DxHitObject_MakeMiss: {
2781+
if (OldVal ==
2782+
CI->getArgOperand(HLOperandIndex::kHitObjectMakeMissRayDescOpIdx)) {
2783+
RewriteWithFlattenedHLIntrinsicCall(CI, OldVal, NewElts,
2784+
/*loadElts*/ true);
2785+
DeadInsts.push_back(CI);
2786+
}
2787+
} break;
27782788
case IntrinsicOp::MOP_TraceRayInline: {
27792789
if (OldVal ==
27802790
CI->getArgOperand(HLOperandIndex::kTraceRayInlineRayDescOpIdx)) {

tools/clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1047,8 +1047,17 @@ bool CGDebugInfo::TryCollectHLSLRecordElements(const RecordType *Ty,
10471047
unsigned VecSize = hlsl::GetHLSLVecSize(QualTy);
10481048
unsigned ElemSizeInBits = CGM.getContext().getTypeSize(ElemQualTy);
10491049
unsigned CurrentAlignedOffset = 0;
1050+
SmallString<8> FieldNameBuf;
10501051
for (unsigned ElemIdx = 0; ElemIdx < VecSize; ++ElemIdx) {
1051-
StringRef FieldName = StringRef(&"xyzw"[ElemIdx], 1);
1052+
StringRef FieldName;
1053+
if (VecSize <= 4) {
1054+
FieldName = StringRef(&"xyzw"[ElemIdx], 1);
1055+
} else {
1056+
FieldNameBuf.clear();
1057+
llvm::raw_svector_ostream OS(FieldNameBuf);
1058+
OS << 'c' << ElemIdx;
1059+
FieldName = OS.str();
1060+
}
10521061
CurrentAlignedOffset =
10531062
llvm::RoundUpToAlignment(CurrentAlignedOffset, AlignBits);
10541063
llvm::DIType *FieldType =

tools/clang/lib/SPIRV/DeclResultIdMapper.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3522,7 +3522,8 @@ SpirvVariable *DeclResultIdMapper::createSpirvInterfaceVariable(
35223522
// Decorate with PerPrimitiveNV for per-primitive out variables.
35233523
spvBuilder.decoratePerPrimitiveNV(varInstr,
35243524
varInstr->getSourceLocation());
3525-
} else {
3525+
} else if (stageVar.getSemanticInfo().getKind() !=
3526+
hlsl::Semantic::Kind::DomainLocation) {
35263527
spvBuilder.decoratePatch(varInstr, varInstr->getSourceLocation());
35273528
}
35283529
}

0 commit comments

Comments
 (0)