Skip to content

Commit 16bf5b6

Browse files
committed
Merge remote-tracking branch 'ms/main' into ser_dxilreorder_patch
2 parents 9328d0c + 8280d0f commit 16bf5b6

File tree

7 files changed

+348
-52
lines changed

7 files changed

+348
-52
lines changed

Diff for: include/dxc/DXIL/DxilConstants.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -503,11 +503,9 @@ enum class OpCode : unsigned {
503503
ReservedA0 = 259, // reserved
504504
ReservedA1 = 260, // reserved
505505
ReservedA2 = 261, // reserved
506-
ReservedB0 = 262, // reserved
507506
ReservedB28 = 290, // reserved
508507
ReservedB29 = 291, // reserved
509508
ReservedB30 = 292, // reserved
510-
ReservedB5 = 267, // reserved
511509
ReservedC0 = 293, // reserved
512510
ReservedC1 = 294, // reserved
513511
ReservedC2 = 295, // reserved
@@ -903,6 +901,8 @@ enum class OpCode : unsigned {
903901
HitObject_HitKind = 285, // Returns the HitKind of the hit
904902
HitObject_InstanceID = 283, // Returns the instance id committed on hit
905903
HitObject_InstanceIndex = 282, // Returns the instance index committed on hit
904+
HitObject_Invoke = 267, // Represents the invocation of the CH/MS shader
905+
// represented by the HitObject
906906
HitObject_IsHit = 270, // Returns `true` if the HitObject is a NOP-HitObject
907907
HitObject_IsMiss = 269, // Returns `true` if the HitObject represents a miss
908908
HitObject_IsNop = 271, // Returns `true` if the HitObject represents a nop
@@ -925,6 +925,8 @@ enum class OpCode : unsigned {
925925
287, // Returns a HitObject with updated shader table index
926926
HitObject_ShaderTableIndex =
927927
286, // Returns the shader table index set for this HitObject
928+
HitObject_TraceRay = 262, // Analogous to TraceRay but without invoking CH/MS
929+
// and returns the intermediate state as a HitObject
928930
HitObject_WorldRayDirection = 276, // Returns the ray direction in world space
929931
HitObject_WorldRayOrigin = 275, // Returns the ray origin in world space
930932
HitObject_WorldToObject3x4 = 280, // Returns the world to object space
@@ -1309,13 +1311,15 @@ enum class OpCodeClass : unsigned {
13091311
HitObject_Attributes,
13101312
HitObject_FromRayQuery,
13111313
HitObject_FromRayQueryWithAttrs,
1314+
HitObject_Invoke,
13121315
HitObject_LoadLocalRootTableConstant,
13131316
HitObject_MakeMiss,
13141317
HitObject_MakeNop,
13151318
HitObject_SetShaderTableIndex,
13161319
HitObject_StateMatrix,
13171320
HitObject_StateScalar,
13181321
HitObject_StateVector,
1322+
HitObject_TraceRay,
13191323

13201324
// Synchronization
13211325
AtomicBinOp,
@@ -1381,7 +1385,7 @@ enum class OpCodeClass : unsigned {
13811385
NumOpClasses_Dxil_1_7 = 153,
13821386
NumOpClasses_Dxil_1_8 = 174,
13831387

1384-
NumOpClasses = 188 // exclusive last value of enumeration
1388+
NumOpClasses = 190 // exclusive last value of enumeration
13851389
};
13861390
// OPCODECLASS-ENUM:END
13871391

Diff for: include/dxc/DXIL/DxilInstructions.h

+117
Original file line numberDiff line numberDiff line change
@@ -8850,6 +8850,92 @@ struct DxilInst_AllocateRayQuery2 {
88508850
}
88518851
};
88528852

8853+
/// This instruction Analogous to TraceRay but without invoking CH/MS and
8854+
/// returns the intermediate state as a HitObject
8855+
struct DxilInst_HitObject_TraceRay {
8856+
llvm::Instruction *Instr;
8857+
// Construction and identification
8858+
DxilInst_HitObject_TraceRay(llvm::Instruction *pInstr) : Instr(pInstr) {}
8859+
operator bool() const {
8860+
return hlsl::OP::IsDxilOpFuncCallInst(Instr,
8861+
hlsl::OP::OpCode::HitObject_TraceRay);
8862+
}
8863+
// Validation support
8864+
bool isAllowed() const { return true; }
8865+
bool isArgumentListValid() const {
8866+
if (16 != llvm::dyn_cast<llvm::CallInst>(Instr)->getNumArgOperands())
8867+
return false;
8868+
return true;
8869+
}
8870+
// Metadata
8871+
bool requiresUniformInputs() const { return false; }
8872+
// Operand indexes
8873+
enum OperandIdx {
8874+
arg_accelerationStructure = 1,
8875+
arg_rayFlags = 2,
8876+
arg_instanceInclusionMask = 3,
8877+
arg_rayContributionToHitGroupIndex = 4,
8878+
arg_multiplierForGeometryContributionToHitGroupIndex = 5,
8879+
arg_missShaderIndex = 6,
8880+
arg_Origin_X = 7,
8881+
arg_Origin_Y = 8,
8882+
arg_Origin_Z = 9,
8883+
arg_TMin = 10,
8884+
arg_Direction_X = 11,
8885+
arg_Direction_Y = 12,
8886+
arg_Direction_Z = 13,
8887+
arg_TMax = 14,
8888+
arg_payload = 15,
8889+
};
8890+
// Accessors
8891+
llvm::Value *get_accelerationStructure() const {
8892+
return Instr->getOperand(1);
8893+
}
8894+
void set_accelerationStructure(llvm::Value *val) {
8895+
Instr->setOperand(1, val);
8896+
}
8897+
llvm::Value *get_rayFlags() const { return Instr->getOperand(2); }
8898+
void set_rayFlags(llvm::Value *val) { Instr->setOperand(2, val); }
8899+
llvm::Value *get_instanceInclusionMask() const {
8900+
return Instr->getOperand(3);
8901+
}
8902+
void set_instanceInclusionMask(llvm::Value *val) {
8903+
Instr->setOperand(3, val);
8904+
}
8905+
llvm::Value *get_rayContributionToHitGroupIndex() const {
8906+
return Instr->getOperand(4);
8907+
}
8908+
void set_rayContributionToHitGroupIndex(llvm::Value *val) {
8909+
Instr->setOperand(4, val);
8910+
}
8911+
llvm::Value *get_multiplierForGeometryContributionToHitGroupIndex() const {
8912+
return Instr->getOperand(5);
8913+
}
8914+
void set_multiplierForGeometryContributionToHitGroupIndex(llvm::Value *val) {
8915+
Instr->setOperand(5, val);
8916+
}
8917+
llvm::Value *get_missShaderIndex() const { return Instr->getOperand(6); }
8918+
void set_missShaderIndex(llvm::Value *val) { Instr->setOperand(6, val); }
8919+
llvm::Value *get_Origin_X() const { return Instr->getOperand(7); }
8920+
void set_Origin_X(llvm::Value *val) { Instr->setOperand(7, val); }
8921+
llvm::Value *get_Origin_Y() const { return Instr->getOperand(8); }
8922+
void set_Origin_Y(llvm::Value *val) { Instr->setOperand(8, val); }
8923+
llvm::Value *get_Origin_Z() const { return Instr->getOperand(9); }
8924+
void set_Origin_Z(llvm::Value *val) { Instr->setOperand(9, val); }
8925+
llvm::Value *get_TMin() const { return Instr->getOperand(10); }
8926+
void set_TMin(llvm::Value *val) { Instr->setOperand(10, val); }
8927+
llvm::Value *get_Direction_X() const { return Instr->getOperand(11); }
8928+
void set_Direction_X(llvm::Value *val) { Instr->setOperand(11, val); }
8929+
llvm::Value *get_Direction_Y() const { return Instr->getOperand(12); }
8930+
void set_Direction_Y(llvm::Value *val) { Instr->setOperand(12, val); }
8931+
llvm::Value *get_Direction_Z() const { return Instr->getOperand(13); }
8932+
void set_Direction_Z(llvm::Value *val) { Instr->setOperand(13, val); }
8933+
llvm::Value *get_TMax() const { return Instr->getOperand(14); }
8934+
void set_TMax(llvm::Value *val) { Instr->setOperand(14, val); }
8935+
llvm::Value *get_payload() const { return Instr->getOperand(15); }
8936+
void set_payload(llvm::Value *val) { Instr->setOperand(15, val); }
8937+
};
8938+
88538939
/// This instruction Creates a new HitObject representing a committed hit from a
88548940
/// RayQuery
88558941
struct DxilInst_HitObject_FromRayQuery {
@@ -8987,6 +9073,37 @@ struct DxilInst_HitObject_MakeNop {
89879073
bool requiresUniformInputs() const { return false; }
89889074
};
89899075

9076+
/// This instruction Represents the invocation of the CH/MS shader represented
9077+
/// by the HitObject
9078+
struct DxilInst_HitObject_Invoke {
9079+
llvm::Instruction *Instr;
9080+
// Construction and identification
9081+
DxilInst_HitObject_Invoke(llvm::Instruction *pInstr) : Instr(pInstr) {}
9082+
operator bool() const {
9083+
return hlsl::OP::IsDxilOpFuncCallInst(Instr,
9084+
hlsl::OP::OpCode::HitObject_Invoke);
9085+
}
9086+
// Validation support
9087+
bool isAllowed() const { return true; }
9088+
bool isArgumentListValid() const {
9089+
if (3 != llvm::dyn_cast<llvm::CallInst>(Instr)->getNumArgOperands())
9090+
return false;
9091+
return true;
9092+
}
9093+
// Metadata
9094+
bool requiresUniformInputs() const { return false; }
9095+
// Operand indexes
9096+
enum OperandIdx {
9097+
arg_hitObject = 1,
9098+
arg_payload = 2,
9099+
};
9100+
// Accessors
9101+
llvm::Value *get_hitObject() const { return Instr->getOperand(1); }
9102+
void set_hitObject(llvm::Value *val) { Instr->setOperand(1, val); }
9103+
llvm::Value *get_payload() const { return Instr->getOperand(2); }
9104+
void set_payload(llvm::Value *val) { Instr->setOperand(2, val); }
9105+
};
9106+
89909107
/// This instruction Reorders the current thread
89919108
struct DxilInst_MaybeReorderThread {
89929109
llvm::Instruction *Instr;

Diff for: lib/DXIL/DxilOperations.cpp

+55-36
Original file line numberDiff line numberDiff line change
@@ -2303,16 +2303,16 @@ const OP::OpCodeProperty OP::m_OpCodeProps[(unsigned)OP::OpCode::NumOpCodes] = {
23032303
0,
23042304
{},
23052305
{}}, // Overloads: v
2306-
{OC::ReservedB0,
2307-
"ReservedB0",
2308-
OCC::Reserved,
2309-
"reserved",
2310-
Attribute::None,
2311-
0,
2312-
{},
2313-
{}}, // Overloads: v
23142306

23152307
// Shader Execution Reordering
2308+
{OC::HitObject_TraceRay,
2309+
"HitObject_TraceRay",
2310+
OCC::HitObject_TraceRay,
2311+
"hitObject_TraceRay",
2312+
Attribute::None,
2313+
1,
2314+
{{0x100}},
2315+
{{0x0}}}, // Overloads: u
23162316
{OC::HitObject_FromRayQuery,
23172317
"HitObject_FromRayQuery",
23182318
OCC::HitObject_FromRayQuery,
@@ -2345,15 +2345,16 @@ const OP::OpCodeProperty OP::m_OpCodeProps[(unsigned)OP::OpCode::NumOpCodes] = {
23452345
0,
23462346
{},
23472347
{}}, // Overloads: v
2348-
2349-
{OC::ReservedB5,
2350-
"ReservedB5",
2351-
OCC::Reserved,
2352-
"reserved",
2348+
{OC::HitObject_Invoke,
2349+
"HitObject_Invoke",
2350+
OCC::HitObject_Invoke,
2351+
"hitObject_Invoke",
23532352
Attribute::None,
2354-
0,
2355-
{},
2356-
{}}, // Overloads: v
2353+
1,
2354+
{{0x100}},
2355+
{{0x0}}}, // Overloads: u
2356+
2357+
//
23572358
{OC::MaybeReorderThread,
23582359
"MaybeReorderThread",
23592360
OCC::MaybeReorderThread,
@@ -3454,19 +3455,20 @@ void OP::GetMinShaderModelAndMask(OpCode C, bool bWithTranslation,
34543455
minor = 9;
34553456
return;
34563457
}
3457-
// Instructions: HitObject_FromRayQuery=263,
3458+
// Instructions: HitObject_TraceRay=262, HitObject_FromRayQuery=263,
34583459
// HitObject_FromRayQueryWithAttrs=264, HitObject_MakeMiss=265,
3459-
// HitObject_MakeNop=266, HitObject_IsMiss=269, HitObject_IsHit=270,
3460-
// HitObject_IsNop=271, HitObject_RayFlags=272, HitObject_RayTMin=273,
3461-
// HitObject_RayTCurrent=274, HitObject_WorldRayOrigin=275,
3462-
// HitObject_WorldRayDirection=276, HitObject_ObjectRayOrigin=277,
3463-
// HitObject_ObjectRayDirection=278, HitObject_ObjectToWorld3x4=279,
3464-
// HitObject_WorldToObject3x4=280, HitObject_GeometryIndex=281,
3465-
// HitObject_InstanceIndex=282, HitObject_InstanceID=283,
3466-
// HitObject_PrimitiveIndex=284, HitObject_HitKind=285,
3467-
// HitObject_ShaderTableIndex=286, HitObject_SetShaderTableIndex=287,
3460+
// HitObject_MakeNop=266, HitObject_Invoke=267, HitObject_IsMiss=269,
3461+
// HitObject_IsHit=270, HitObject_IsNop=271, HitObject_RayFlags=272,
3462+
// HitObject_RayTMin=273, HitObject_RayTCurrent=274,
3463+
// HitObject_WorldRayOrigin=275, HitObject_WorldRayDirection=276,
3464+
// HitObject_ObjectRayOrigin=277, HitObject_ObjectRayDirection=278,
3465+
// HitObject_ObjectToWorld3x4=279, HitObject_WorldToObject3x4=280,
3466+
// HitObject_GeometryIndex=281, HitObject_InstanceIndex=282,
3467+
// HitObject_InstanceID=283, HitObject_PrimitiveIndex=284,
3468+
// HitObject_HitKind=285, HitObject_ShaderTableIndex=286,
3469+
// HitObject_SetShaderTableIndex=287,
34683470
// HitObject_LoadLocalRootTableConstant=288, HitObject_Attributes=289
3469-
if ((263 <= op && op <= 266) || (269 <= op && op <= 289)) {
3471+
if ((262 <= op && op <= 267) || (269 <= op && op <= 289)) {
34703472
major = 6;
34713473
minor = 9;
34723474
mask =
@@ -5637,12 +5639,27 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) {
56375639
A(pV);
56385640
A(pI32);
56395641
break;
5640-
case OpCode::ReservedB0:
5641-
A(pV);
5642-
A(pI32);
5643-
break;
56445642

56455643
// Shader Execution Reordering
5644+
case OpCode::HitObject_TraceRay:
5645+
A(pHit);
5646+
A(pI32);
5647+
A(pRes);
5648+
A(pI32);
5649+
A(pI32);
5650+
A(pI32);
5651+
A(pI32);
5652+
A(pI32);
5653+
A(pF32);
5654+
A(pF32);
5655+
A(pF32);
5656+
A(pF32);
5657+
A(pF32);
5658+
A(pF32);
5659+
A(pF32);
5660+
A(pF32);
5661+
A(udt);
5662+
break;
56465663
case OpCode::HitObject_FromRayQuery:
56475664
A(pHit);
56485665
A(pI32);
@@ -5673,12 +5690,14 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) {
56735690
A(pHit);
56745691
A(pI32);
56755692
break;
5676-
5677-
//
5678-
case OpCode::ReservedB5:
5693+
case OpCode::HitObject_Invoke:
56795694
A(pV);
56805695
A(pI32);
5696+
A(pHit);
5697+
A(udt);
56815698
break;
5699+
5700+
//
56825701
case OpCode::MaybeReorderThread:
56835702
A(pV);
56845703
A(pI32);
@@ -6015,6 +6034,7 @@ llvm::Type *OP::GetOverloadType(OpCode opCode, llvm::Function *F) {
60156034
case OpCode::TempRegStore:
60166035
case OpCode::CallShader:
60176036
case OpCode::Pack4x8:
6037+
case OpCode::HitObject_Invoke:
60186038
case OpCode::HitObject_Attributes:
60196039
if (FT->getNumParams() <= 2)
60206040
return nullptr;
@@ -6056,6 +6076,7 @@ llvm::Type *OP::GetOverloadType(OpCode opCode, llvm::Function *F) {
60566076
return nullptr;
60576077
return FT->getParamType(5);
60586078
case OpCode::TraceRay:
6079+
case OpCode::HitObject_TraceRay:
60596080
if (FT->getNumParams() <= 15)
60606081
return nullptr;
60616082
return FT->getParamType(15);
@@ -6143,11 +6164,9 @@ llvm::Type *OP::GetOverloadType(OpCode opCode, llvm::Function *F) {
61436164
case OpCode::ReservedA0:
61446165
case OpCode::ReservedA1:
61456166
case OpCode::ReservedA2:
6146-
case OpCode::ReservedB0:
61476167
case OpCode::HitObject_FromRayQuery:
61486168
case OpCode::HitObject_MakeMiss:
61496169
case OpCode::HitObject_MakeNop:
6150-
case OpCode::ReservedB5:
61516170
case OpCode::MaybeReorderThread:
61526171
case OpCode::HitObject_SetShaderTableIndex:
61536172
case OpCode::HitObject_LoadLocalRootTableConstant:

Diff for: lib/DxilPIXPasses/DxilShaderAccessTracking.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -905,13 +905,14 @@ bool DxilShaderAccessTracking::runOnModule(Module &M) {
905905
case DXIL::OpCode::BufferUpdateCounter:
906906
readWrite = ShaderAccessFlags::Counter;
907907
break;
908+
case DXIL::OpCode::HitObject_TraceRay:
908909
case DXIL::OpCode::TraceRay: {
909910
// Read of AccelerationStructure; doesn't match function attribute
910-
auto res = GetResourceFromHandle(Call->getArgOperand(1), DM);
911-
if (res.accessStyle == AccessStyle::None) {
911+
auto Res = GetResourceFromHandle(Call->getArgOperand(1), DM);
912+
if (Res.accessStyle == AccessStyle::None) {
912913
continue;
913914
}
914-
if (EmitResourceAccess(DM, res, Call, HlslOP, Ctx,
915+
if (EmitResourceAccess(DM, Res, Call, HlslOP, Ctx,
915916
ShaderAccessFlags::Read)) {
916917
Modified = true;
917918
}

0 commit comments

Comments
 (0)