|
12 | 12 | // //
|
13 | 13 | ///////////////////////////////////////////////////////////////////////////////
|
14 | 14 |
|
| 15 | +#include "dxc/DXIL/DxilConstants.h" |
15 | 16 | #define _USE_MATH_DEFINES
|
16 | 17 | #include <array>
|
17 | 18 | #include <cmath>
|
@@ -6183,19 +6184,114 @@ Value *TranslateUnpack(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
|
6183 | 6184 |
|
6184 | 6185 | // Shader Execution Reordering.
|
6185 | 6186 | namespace {
|
6186 |
| -Value *TranslateHitObjectMake(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode, |
6187 |
| - HLOperationLowerHelper &helper, |
6188 |
| - HLObjectOperationLowerHelper *pObjHelper, |
| 6187 | +Value *TranslateHitObjectMake(CallInst *CI, IntrinsicOp IOP, OP::OpCode Opcode, |
| 6188 | + HLOperationLowerHelper &Helper, |
| 6189 | + HLObjectOperationLowerHelper *ObjHelper, |
6189 | 6190 | bool &Translated) {
|
6190 |
| - return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches |
| 6191 | + hlsl::OP *HlslOP = &Helper.hlslOP; |
| 6192 | + IRBuilder<> Builder(CI); |
| 6193 | + unsigned SrcIdx = 1; |
| 6194 | + Value *HitObjectPtr = CI->getArgOperand(SrcIdx++); |
| 6195 | + if (Opcode == OP::OpCode::HitObject_MakeNop) { |
| 6196 | + Value *HitObject = TrivialDxilOperation( |
| 6197 | + Opcode, {nullptr}, Type::getVoidTy(CI->getContext()), CI, HlslOP); |
| 6198 | + Builder.CreateStore(HitObject, HitObjectPtr); |
| 6199 | + DXASSERT( |
| 6200 | + CI->use_empty(), |
| 6201 | + "Default ctor return type is a Clang artifact. Value must not be used"); |
| 6202 | + return nullptr; |
| 6203 | + } |
| 6204 | + |
| 6205 | + DXASSERT_NOMSG(CI->getNumArgOperands() == |
| 6206 | + HLOperandIndex::kHitObjectMakeMiss_NumOp); |
| 6207 | + Value *RayFlags = CI->getArgOperand(SrcIdx++); |
| 6208 | + Value *MissShaderIdx = CI->getArgOperand(SrcIdx++); |
| 6209 | + DXASSERT_NOMSG(SrcIdx == HLOperandIndex::kHitObjectMakeMissRayDescOpIdx); |
| 6210 | + Value *RayDescOrigin = CI->getArgOperand(SrcIdx++); |
| 6211 | + Value *RayDescOriginX = |
| 6212 | + Builder.CreateExtractElement(RayDescOrigin, (uint64_t)0); |
| 6213 | + Value *RayDescOriginY = |
| 6214 | + Builder.CreateExtractElement(RayDescOrigin, (uint64_t)1); |
| 6215 | + Value *RayDescOriginZ = |
| 6216 | + Builder.CreateExtractElement(RayDescOrigin, (uint64_t)2); |
| 6217 | + |
| 6218 | + Value *RayDescTMin = CI->getArgOperand(SrcIdx++); |
| 6219 | + Value *RayDescDirection = CI->getArgOperand(SrcIdx++); |
| 6220 | + Value *RayDescDirectionX = |
| 6221 | + Builder.CreateExtractElement(RayDescDirection, (uint64_t)0); |
| 6222 | + Value *RayDescDirectionY = |
| 6223 | + Builder.CreateExtractElement(RayDescDirection, (uint64_t)1); |
| 6224 | + Value *RayDescDirectionZ = |
| 6225 | + Builder.CreateExtractElement(RayDescDirection, (uint64_t)2); |
| 6226 | + |
| 6227 | + Value *RayDescTMax = CI->getArgOperand(SrcIdx++); |
| 6228 | + DXASSERT_NOMSG(SrcIdx == CI->getNumArgOperands()); |
| 6229 | + |
| 6230 | + Value *OutHitObject = TrivialDxilOperation( |
| 6231 | + Opcode, |
| 6232 | + {nullptr, RayFlags, MissShaderIdx, RayDescOriginX, RayDescOriginY, |
| 6233 | + RayDescOriginZ, RayDescTMin, RayDescDirectionX, RayDescDirectionY, |
| 6234 | + RayDescDirectionZ, RayDescTMax}, |
| 6235 | + Helper.voidTy, CI, HlslOP); |
| 6236 | + Builder.CreateStore(OutHitObject, HitObjectPtr); |
| 6237 | + return nullptr; |
6191 | 6238 | }
|
6192 | 6239 |
|
6193 | 6240 | Value *TranslateMaybeReorderThread(CallInst *CI, IntrinsicOp IOP,
|
6194 |
| - OP::OpCode opcode, |
6195 |
| - HLOperationLowerHelper &helper, |
| 6241 | + OP::OpCode OpCode, |
| 6242 | + HLOperationLowerHelper &Helper, |
6196 | 6243 | HLObjectOperationLowerHelper *pObjHelper,
|
6197 | 6244 | bool &Translated) {
|
6198 |
| - return nullptr; // TODO: Merge SER DXIL patches |
| 6245 | + hlsl::OP *OP = &Helper.hlslOP; |
| 6246 | + |
| 6247 | + // clang-format off |
| 6248 | + // Match MaybeReorderThread overload variants: |
| 6249 | + // void MaybeReorderThread(<Op>, |
| 6250 | + // HitObject Hit); |
| 6251 | + // void MaybeReorderThread(<Op>, |
| 6252 | + // uint CoherenceHint, |
| 6253 | + // uint NumCoherenceHintBitsFromLSB ); |
| 6254 | + // void MaybeReorderThread(<Op>, |
| 6255 | + // HitObject Hit, |
| 6256 | + // uint CoherenceHint, |
| 6257 | + // uint NumCoherenceHintBitsFromLSB); |
| 6258 | + // clang-format on |
| 6259 | + const unsigned NumHLArgs = CI->getNumArgOperands(); |
| 6260 | + DXASSERT_NOMSG(NumHLArgs >= 2); |
| 6261 | + |
| 6262 | + // Use a NOP HitObject for MaybeReorderThread without HitObject. |
| 6263 | + Value *HitObject = nullptr; |
| 6264 | + unsigned HLIndex = 1; |
| 6265 | + if (3 == NumHLArgs) { |
| 6266 | + HitObject = TrivialDxilOperation(DXIL::OpCode::HitObject_MakeNop, {nullptr}, |
| 6267 | + Type::getVoidTy(CI->getContext()), CI, OP); |
| 6268 | + } else { |
| 6269 | + Value *FirstParam = CI->getArgOperand(HLIndex); |
| 6270 | + DXASSERT_NOMSG(isa<PointerType>(FirstParam->getType())); |
| 6271 | + IRBuilder<> Builder(CI); |
| 6272 | + HitObject = Builder.CreateLoad(FirstParam); |
| 6273 | + HLIndex++; |
| 6274 | + } |
| 6275 | + |
| 6276 | + // If there are trailing parameters, these have to be the two coherence bit |
| 6277 | + // parameters |
| 6278 | + Value *CoherenceHint = nullptr; |
| 6279 | + Value *NumCoherenceHintBits = nullptr; |
| 6280 | + if (2 != NumHLArgs) { |
| 6281 | + DXASSERT_NOMSG(HLIndex + 2 == NumHLArgs); |
| 6282 | + CoherenceHint = CI->getArgOperand(HLIndex++); |
| 6283 | + NumCoherenceHintBits = CI->getArgOperand(HLIndex++); |
| 6284 | + DXASSERT_NOMSG(Helper.i32Ty == CoherenceHint->getType()); |
| 6285 | + DXASSERT_NOMSG(Helper.i32Ty == NumCoherenceHintBits->getType()); |
| 6286 | + } else { |
| 6287 | + CoherenceHint = UndefValue::get(Helper.i32Ty); |
| 6288 | + NumCoherenceHintBits = OP->GetU32Const(0); |
| 6289 | + } |
| 6290 | + |
| 6291 | + TrivialDxilOperation( |
| 6292 | + OpCode, {nullptr, HitObject, CoherenceHint, NumCoherenceHintBits}, |
| 6293 | + Type::getVoidTy(CI->getContext()), CI, OP); |
| 6294 | + return nullptr; |
6199 | 6295 | }
|
6200 | 6296 |
|
6201 | 6297 | Value *TranslateHitObjectFromRayQuery(CallInst *CI, IntrinsicOp IOP,
|
@@ -6968,11 +7064,9 @@ IntrinsicLower gLowerTable[] = {
|
6968 | 7064 | {IntrinsicOp::MOP_InterlockedUMin, TranslateMopAtomicBinaryOperation,
|
6969 | 7065 | DXIL::OpCode::NumOpCodes},
|
6970 | 7066 | {IntrinsicOp::MOP_DxHitObject_MakeNop, TranslateHitObjectMake,
|
6971 |
| - DXIL::OpCode::NumOpCodes_Dxil_1_8}, // FIXME: Just a placeholder Dxil |
6972 |
| - // opcode |
| 7067 | + DXIL::OpCode::HitObject_MakeNop}, |
6973 | 7068 | {IntrinsicOp::IOP_DxMaybeReorderThread, TranslateMaybeReorderThread,
|
6974 |
| - DXIL::OpCode::NumOpCodes_Dxil_1_8}, // FIXME: Just a placeholder Dxil |
6975 |
| - // opcode |
| 7069 | + DXIL::OpCode::MaybeReorderThread}, |
6976 | 7070 | {IntrinsicOp::IOP_Vkstatic_pointer_cast, UnsupportedVulkanIntrinsic,
|
6977 | 7071 | DXIL::OpCode::NumOpCodes},
|
6978 | 7072 | {IntrinsicOp::IOP_Vkreinterpret_pointer_cast, UnsupportedVulkanIntrinsic,
|
|
0 commit comments