1. Fix IgnoreHit and AcceptHitAndEndSearch.
2. Support init list for RayDesc. 3. Remove range_id for lib. 4. Update some test.
This commit is contained in:
Родитель
66516234b1
Коммит
fdf2c31ca6
|
@ -2151,8 +2151,8 @@ ID Name Description
|
|||
152 WorldToObject Matrix for transforming from world-space to object-space.
|
||||
153 RayTMin float representing the parametric starting point for the ray.
|
||||
154 CurrentRayT float representing the current parametric ending point for the ray
|
||||
155 AcceptHitAndEndSearch Used in an any hit shader to reject an intersection and terminate the shader
|
||||
156 CommitHitAndStopRay Used in an any hit shader to abort the ray query and the intersection shader (if any). The current hit is committed and execution passes to the closest hit shader with the closest hit recorded so far
|
||||
155 IgnoreHit Used in an any hit shader to reject an intersection and terminate the shader
|
||||
156 AcceptHitAndEndSearch Used in an any hit shader to abort the ray query and the intersection shader (if any). The current hit is committed and execution passes to the closest hit shader with the closest hit recorded so far
|
||||
157 TraceRay returns the view index
|
||||
158 ReportHit returns true if hit was accepted
|
||||
159 CallShader Call a shader in the callable shader table supplied through the DispatchRays() API
|
||||
|
|
|
@ -288,8 +288,8 @@ namespace DXIL {
|
|||
// Enumeration for operations specified by DXIL
|
||||
enum class OpCode : unsigned {
|
||||
// AnyHit Terminals
|
||||
AcceptHitAndEndSearch = 155, // Used in an any hit shader to reject an intersection and terminate the shader
|
||||
CommitHitAndStopRay = 156, // Used in an any hit shader to abort the ray query and the intersection shader (if any). The current hit is committed and execution passes to the closest hit shader with the closest hit recorded so far
|
||||
AcceptHitAndEndSearch = 156, // Used in an any hit shader to abort the ray query and the intersection shader (if any). The current hit is committed and execution passes to the closest hit shader with the closest hit recorded so far
|
||||
IgnoreHit = 155, // Used in an any hit shader to reject an intersection and terminate the shader
|
||||
|
||||
// Binary float
|
||||
FMax = 35, // returns a if a >= b, else b
|
||||
|
@ -542,7 +542,7 @@ namespace DXIL {
|
|||
enum class OpCodeClass : unsigned {
|
||||
// AnyHit Terminals
|
||||
AcceptHitAndEndSearch,
|
||||
CommitHitAndStopRay,
|
||||
IgnoreHit,
|
||||
|
||||
// Binary uint with carry or borrow
|
||||
BinaryWithCarryOrBorrow,
|
||||
|
|
|
@ -4828,12 +4828,12 @@ struct DxilInst_CurrentRayT {
|
|||
};
|
||||
|
||||
/// This instruction Used in an any hit shader to reject an intersection and terminate the shader
|
||||
struct DxilInst_AcceptHitAndEndSearch {
|
||||
struct DxilInst_IgnoreHit {
|
||||
llvm::Instruction *Instr;
|
||||
// Construction and identification
|
||||
DxilInst_AcceptHitAndEndSearch(llvm::Instruction *pInstr) : Instr(pInstr) {}
|
||||
DxilInst_IgnoreHit(llvm::Instruction *pInstr) : Instr(pInstr) {}
|
||||
operator bool() const {
|
||||
return hlsl::OP::IsDxilOpFuncCallInst(Instr, hlsl::OP::OpCode::AcceptHitAndEndSearch);
|
||||
return hlsl::OP::IsDxilOpFuncCallInst(Instr, hlsl::OP::OpCode::IgnoreHit);
|
||||
}
|
||||
// Validation support
|
||||
bool isAllowed() const { return true; }
|
||||
|
@ -4844,12 +4844,12 @@ struct DxilInst_AcceptHitAndEndSearch {
|
|||
};
|
||||
|
||||
/// This instruction Used in an any hit shader to abort the ray query and the intersection shader (if any). The current hit is committed and execution passes to the closest hit shader with the closest hit recorded so far
|
||||
struct DxilInst_CommitHitAndStopRay {
|
||||
struct DxilInst_AcceptHitAndEndSearch {
|
||||
llvm::Instruction *Instr;
|
||||
// Construction and identification
|
||||
DxilInst_CommitHitAndStopRay(llvm::Instruction *pInstr) : Instr(pInstr) {}
|
||||
DxilInst_AcceptHitAndEndSearch(llvm::Instruction *pInstr) : Instr(pInstr) {}
|
||||
operator bool() const {
|
||||
return hlsl::OP::IsDxilOpFuncCallInst(Instr, hlsl::OP::OpCode::CommitHitAndStopRay);
|
||||
return hlsl::OP::IsDxilOpFuncCallInst(Instr, hlsl::OP::OpCode::AcceptHitAndEndSearch);
|
||||
}
|
||||
// Validation support
|
||||
bool isAllowed() const { return true; }
|
||||
|
|
|
@ -375,13 +375,6 @@ public:
|
|||
|
||||
void SetShaderProperties(DxilFunctionProps *props);
|
||||
|
||||
// Shader resource information only needed before linking.
|
||||
// Use constant as rangeID for resource in a library.
|
||||
// When link the library, replace these constants with real rangeID.
|
||||
struct ResourceLinkInfo {
|
||||
llvm::Constant *ResRangeID;
|
||||
};
|
||||
|
||||
private:
|
||||
// Signatures.
|
||||
std::unique_ptr<DxilEntrySignature> m_EntrySignature;
|
||||
|
@ -393,12 +386,6 @@ private:
|
|||
std::vector<std::unique_ptr<DxilCBuffer> > m_CBuffers;
|
||||
std::vector<std::unique_ptr<DxilSampler> > m_Samplers;
|
||||
|
||||
// Save resource link for library, when link replace it with real resource ID.
|
||||
std::vector<ResourceLinkInfo> m_SRVsLinkInfo;
|
||||
std::vector<ResourceLinkInfo> m_UAVsLinkInfo;
|
||||
std::vector<ResourceLinkInfo> m_CBuffersLinkInfo;
|
||||
std::vector<ResourceLinkInfo> m_SamplersLinkInfo;
|
||||
|
||||
// Geometry shader.
|
||||
DXIL::InputPrimitive m_InputPrimitive;
|
||||
unsigned m_MaxVertexCount;
|
||||
|
@ -455,8 +442,6 @@ private:
|
|||
// DXIL metadata serialization/deserialization.
|
||||
llvm::MDTuple *EmitDxilResources();
|
||||
void LoadDxilResources(const llvm::MDOperand &MDO);
|
||||
void EmitDxilResourcesLinkInfo();
|
||||
void LoadDxilResourcesLinkInfo();
|
||||
llvm::MDTuple *EmitDxilShaderProperties();
|
||||
void LoadDxilShaderProperties(const llvm::MDOperand &MDO);
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@ import hctdb_instrhelp
|
|||
IOP_AllMemoryBarrierWithGroupSync,
|
||||
IOP_CallShader,
|
||||
IOP_CheckAccessFullyMapped,
|
||||
IOP_CommitHitAndStopRay,
|
||||
IOP_CurrentRayT,
|
||||
IOP_D3DCOLORtoUBYTE4,
|
||||
IOP_DeviceMemoryBarrier,
|
||||
|
@ -41,6 +40,7 @@ import hctdb_instrhelp
|
|||
IOP_GroupMemoryBarrier,
|
||||
IOP_GroupMemoryBarrierWithGroupSync,
|
||||
IOP_HitKind,
|
||||
IOP_IgnoreHit,
|
||||
IOP_InstanceID,
|
||||
IOP_InstanceIndex,
|
||||
IOP_InterlockedAdd,
|
||||
|
|
|
@ -206,8 +206,6 @@ public:
|
|||
if (!DM.GetShaderModel()->IsLib()) {
|
||||
AllocateDxilResources(DM);
|
||||
PatchCreateHandle(DM);
|
||||
} else {
|
||||
PatchCreateHandleForLib(DM);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
@ -222,8 +220,6 @@ private:
|
|||
void ApplyRewriteMap(DxilModule &DM);
|
||||
// Add lowbound to create handle range index.
|
||||
void PatchCreateHandle(DxilModule &DM);
|
||||
// Add lowbound to create handle range index for library.
|
||||
void PatchCreateHandleForLib(DxilModule &DM);
|
||||
};
|
||||
|
||||
void DxilCondenseResources::ApplyRewriteMap(DxilModule &DM) {
|
||||
|
@ -421,100 +417,6 @@ void DxilCondenseResources::PatchCreateHandle(DxilModule &DM) {
|
|||
}
|
||||
}
|
||||
|
||||
static Value *PatchRangeIDForLib(DxilModule &DM, IRBuilder<> &Builder,
|
||||
Value *rangeIdVal,
|
||||
std::unordered_map<PHINode *, Value *> &phiMap,
|
||||
DXIL::ResourceClass ResClass) {
|
||||
Value *linkRangeID = nullptr;
|
||||
if (isa<ConstantInt>(rangeIdVal)) {
|
||||
unsigned rangeId = cast<ConstantInt>(rangeIdVal)->getLimitedValue();
|
||||
|
||||
const DxilModule::ResourceLinkInfo &linkInfo =
|
||||
DM.GetResourceLinkInfo(ResClass, rangeId);
|
||||
linkRangeID = Builder.CreateLoad(linkInfo.ResRangeID);
|
||||
} else {
|
||||
if (PHINode *phi = dyn_cast<PHINode>(rangeIdVal)) {
|
||||
auto it = phiMap.find(phi);
|
||||
if (it == phiMap.end()) {
|
||||
unsigned numOperands = phi->getNumOperands();
|
||||
|
||||
PHINode *phiRangeID = Builder.CreatePHI(phi->getType(), numOperands);
|
||||
phiMap[phi] = phiRangeID;
|
||||
|
||||
std::vector<Value *> rangeIDs(numOperands);
|
||||
for (unsigned i = 0; i < numOperands; i++) {
|
||||
Value *V = phi->getOperand(i);
|
||||
BasicBlock *BB = phi->getIncomingBlock(i);
|
||||
IRBuilder<> Builder(BB->getTerminator());
|
||||
rangeIDs[i] = PatchRangeIDForLib(DM, Builder, V, phiMap, ResClass);
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < numOperands; i++) {
|
||||
Value *V = rangeIDs[i];
|
||||
BasicBlock *BB = phi->getIncomingBlock(i);
|
||||
phiRangeID->addIncoming(V, BB);
|
||||
}
|
||||
linkRangeID = phiRangeID;
|
||||
} else {
|
||||
linkRangeID = it->second;
|
||||
}
|
||||
} else if (SelectInst *si = dyn_cast<SelectInst>(rangeIdVal)) {
|
||||
IRBuilder<> Builder(si);
|
||||
Value *trueVal =
|
||||
PatchRangeIDForLib(DM, Builder, si->getTrueValue(), phiMap, ResClass);
|
||||
Value *falseVal = PatchRangeIDForLib(DM, Builder, si->getFalseValue(),
|
||||
phiMap, ResClass);
|
||||
linkRangeID = Builder.CreateSelect(si->getCondition(), trueVal, falseVal);
|
||||
} else if (CastInst *cast = dyn_cast<CastInst>(rangeIdVal)) {
|
||||
if (cast->getOpcode() == CastInst::CastOps::ZExt &&
|
||||
cast->getOperand(0)->getType() == Type::getInt1Ty(DM.GetCtx())) {
|
||||
// select cond, 1, 0.
|
||||
IRBuilder<> Builder(cast);
|
||||
Value *trueVal = PatchRangeIDForLib(
|
||||
DM, Builder, ConstantInt::get(cast->getType(), 1), phiMap,
|
||||
ResClass);
|
||||
Value *falseVal = PatchRangeIDForLib(
|
||||
DM, Builder, ConstantInt::get(cast->getType(), 0), phiMap,
|
||||
ResClass);
|
||||
linkRangeID =
|
||||
Builder.CreateSelect(cast->getOperand(0), trueVal, falseVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
return linkRangeID;
|
||||
}
|
||||
|
||||
void DxilCondenseResources::PatchCreateHandleForLib(DxilModule &DM) {
|
||||
Function *createHandle = DM.GetOP()->GetOpFunc(DXIL::OpCode::CreateHandle,
|
||||
Type::getVoidTy(DM.GetCtx()));
|
||||
DM.CreateResourceLinkInfo();
|
||||
for (User *U : createHandle->users()) {
|
||||
CallInst *handle = cast<CallInst>(U);
|
||||
DxilInst_CreateHandle createHandle(handle);
|
||||
DXASSERT_NOMSG(createHandle);
|
||||
|
||||
DXIL::ResourceClass ResClass =
|
||||
static_cast<DXIL::ResourceClass>(createHandle.get_resourceClass_val());
|
||||
|
||||
std::unordered_map<PHINode *, Value*> phiMap;
|
||||
Value *rangeID = createHandle.get_rangeId();
|
||||
IRBuilder<> Builder(handle);
|
||||
Value *linkRangeID = PatchRangeIDForLib(
|
||||
DM, Builder, rangeID, phiMap, ResClass);
|
||||
|
||||
// Dynamic rangeId is not supported - skip and let validation report the
|
||||
// error.
|
||||
if (!linkRangeID)
|
||||
continue;
|
||||
// Update rangeID to linkinfo rangeID.
|
||||
handle->setArgOperand(DXIL::OperandIndex::kCreateHandleResIDOpIdx,
|
||||
linkRangeID);
|
||||
if (rangeID->user_empty() && isa<Instruction>(rangeID)) {
|
||||
cast<Instruction>(rangeID)->eraseFromParent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char DxilCondenseResources::ID = 0;
|
||||
|
||||
bool llvm::AreDxilResourcesDense(llvm::Module *M, hlsl::DxilResourceBase **ppNonDense) {
|
||||
|
@ -568,11 +470,6 @@ public:
|
|||
bool hasResource = DM.GetCBuffers().size() || DM.GetUAVs().size() ||
|
||||
DM.GetSRVs().size() || DM.GetSamplers().size();
|
||||
|
||||
// TODO: remove this.
|
||||
// Create resoure link info for lib.
|
||||
if (hasResource && m_bIsLib)
|
||||
DM.CreateResourceLinkInfo();
|
||||
|
||||
if (!hasResource || m_bIsLib)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -864,55 +864,6 @@ const vector<unique_ptr<DxilResource> > &DxilModule::GetUAVs() const {
|
|||
return m_UAVs;
|
||||
}
|
||||
|
||||
static void CreateResourceLinkConstant(Module &M, DxilResourceBase *pRes,
|
||||
std::vector<DxilModule::ResourceLinkInfo> &resLinkInfo) {
|
||||
Type *i32Ty = Type::getInt32Ty(M.getContext());
|
||||
const bool IsConstantTrue = true;
|
||||
Constant *NullInitVal = nullptr;
|
||||
GlobalVariable *rangeID = new GlobalVariable(
|
||||
M, i32Ty, IsConstantTrue, llvm::GlobalValue::ExternalLinkage, NullInitVal,
|
||||
pRes->GetGlobalName() + "_rangeID");
|
||||
|
||||
resLinkInfo.emplace_back(DxilModule::ResourceLinkInfo{rangeID});
|
||||
}
|
||||
|
||||
void DxilModule::CreateResourceLinkInfo() {
|
||||
DXASSERT(GetShaderModel()->IsLib(), "only for library profile");
|
||||
DXASSERT(m_SRVsLinkInfo.empty() && m_UAVsLinkInfo.empty() &&
|
||||
m_CBuffersLinkInfo.empty() && m_SamplersLinkInfo.empty(),
|
||||
"else resource link info was already created");
|
||||
Module &M = *m_pModule;
|
||||
for (auto &SRV : m_SRVs) {
|
||||
CreateResourceLinkConstant(M, SRV.get(), m_SRVsLinkInfo);
|
||||
}
|
||||
for (auto &UAV : m_UAVs) {
|
||||
CreateResourceLinkConstant(M, UAV.get(), m_UAVsLinkInfo);
|
||||
}
|
||||
for (auto &CBuffer : m_CBuffers) {
|
||||
CreateResourceLinkConstant(M, CBuffer.get(), m_CBuffersLinkInfo);
|
||||
}
|
||||
for (auto &Sampler : m_Samplers) {
|
||||
CreateResourceLinkConstant(M, Sampler.get(), m_SamplersLinkInfo);
|
||||
}
|
||||
}
|
||||
|
||||
const DxilModule::ResourceLinkInfo &
|
||||
DxilModule::GetResourceLinkInfo(DXIL::ResourceClass resClass,
|
||||
unsigned rangeID) const {
|
||||
switch (resClass) {
|
||||
case DXIL::ResourceClass::UAV:
|
||||
return m_UAVsLinkInfo[rangeID];
|
||||
case DXIL::ResourceClass::CBuffer:
|
||||
return m_CBuffersLinkInfo[rangeID];
|
||||
case DXIL::ResourceClass::Sampler:
|
||||
return m_SamplersLinkInfo[rangeID];
|
||||
default:
|
||||
DXASSERT(DXIL::ResourceClass::SRV == resClass,
|
||||
"else invalid resource class");
|
||||
return m_SRVsLinkInfo[rangeID];
|
||||
}
|
||||
}
|
||||
|
||||
void DxilModule::LoadDxilResourceBaseFromMDNode(MDNode *MD, DxilResourceBase &R) {
|
||||
return m_pMDHelper->LoadDxilResourceBaseFromMDNode(MD, R);
|
||||
}
|
||||
|
@ -1301,7 +1252,6 @@ void DxilModule::EmitDxilMetadata() {
|
|||
m_pMDHelper->EmitRootSignature(*m_RootSignature.get());
|
||||
}
|
||||
if (m_pSM->IsLib()) {
|
||||
EmitDxilResourcesLinkInfo();
|
||||
NamedMDNode *fnProps = m_pModule->getOrInsertNamedMetadata(
|
||||
DxilMDHelper::kDxilFunctionPropertiesMDName);
|
||||
for (auto &&pair : m_DxilFunctionPropsMap) {
|
||||
|
@ -1357,7 +1307,6 @@ void DxilModule::LoadDxilMetadata() {
|
|||
m_pMDHelper->LoadDxilViewIdState(*m_pViewIdState.get());
|
||||
|
||||
if (loadedModule->IsLib()) {
|
||||
LoadDxilResourcesLinkInfo();
|
||||
NamedMDNode *fnProps = m_pModule->getNamedMetadata(
|
||||
DxilMDHelper::kDxilFunctionPropertiesMDName);
|
||||
size_t propIdx = 0;
|
||||
|
@ -1500,82 +1449,6 @@ void DxilModule::LoadDxilResources(const llvm::MDOperand &MDO) {
|
|||
}
|
||||
}
|
||||
|
||||
static MDTuple *CreateResourcesLinkInfo(std::vector<DxilModule::ResourceLinkInfo> &LinkInfoList,
|
||||
unsigned size, LLVMContext &Ctx) {
|
||||
DXASSERT(size == LinkInfoList.size(), "link info size must match resource size");
|
||||
if (LinkInfoList.empty())
|
||||
return nullptr;
|
||||
|
||||
vector<Metadata *> MDVals;
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
MDVals.emplace_back(ValueAsMetadata::get(LinkInfoList[i].ResRangeID));
|
||||
}
|
||||
return MDNode::get(Ctx, MDVals);
|
||||
}
|
||||
|
||||
void DxilModule::EmitDxilResourcesLinkInfo() {
|
||||
// Emit SRV base records.
|
||||
MDTuple *pTupleSRVs =
|
||||
CreateResourcesLinkInfo(m_SRVsLinkInfo, m_SRVs.size(), m_Ctx);
|
||||
|
||||
// Emit UAV base records.
|
||||
MDTuple *pTupleUAVs =
|
||||
CreateResourcesLinkInfo(m_UAVsLinkInfo, m_UAVs.size(), m_Ctx);
|
||||
|
||||
// Emit CBuffer base records.
|
||||
MDTuple *pTupleCBuffers =
|
||||
CreateResourcesLinkInfo(m_CBuffersLinkInfo, m_CBuffers.size(), m_Ctx);
|
||||
|
||||
// Emit Sampler records.
|
||||
MDTuple *pTupleSamplers =
|
||||
CreateResourcesLinkInfo(m_SamplersLinkInfo, m_Samplers.size(), m_Ctx);
|
||||
|
||||
if (pTupleSRVs != nullptr || pTupleUAVs != nullptr ||
|
||||
pTupleCBuffers != nullptr || pTupleSamplers != nullptr) {
|
||||
m_pMDHelper->EmitDxilResourceLinkInfoTuple(pTupleSRVs, pTupleUAVs,
|
||||
pTupleCBuffers, pTupleSamplers);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
LoadResourcesLinkInfo(const llvm::MDTuple *pMD,
|
||||
std::vector<DxilModule::ResourceLinkInfo> &LinkInfoList,
|
||||
unsigned size, DxilMDHelper *pMDHelper) {
|
||||
if (!pMD) {
|
||||
IFTBOOL(size == 0, DXC_E_INCORRECT_DXIL_METADATA);
|
||||
return;
|
||||
}
|
||||
unsigned operandSize = pMD->getNumOperands();
|
||||
IFTBOOL(operandSize == size, DXC_E_INCORRECT_DXIL_METADATA);
|
||||
for (unsigned i = 0; i < operandSize; i++) {
|
||||
Constant *rangeID =
|
||||
dyn_cast<Constant>(pMDHelper->ValueMDToValue(pMD->getOperand(i)));
|
||||
LinkInfoList.emplace_back(DxilModule::ResourceLinkInfo{rangeID});
|
||||
}
|
||||
}
|
||||
|
||||
void DxilModule::LoadDxilResourcesLinkInfo() {
|
||||
const llvm::MDTuple *pSRVs, *pUAVs, *pCBuffers, *pSamplers;
|
||||
m_pMDHelper->LoadDxilResourceLinkInfoTuple(pSRVs, pUAVs, pCBuffers,
|
||||
pSamplers);
|
||||
|
||||
// Load SRV base records.
|
||||
LoadResourcesLinkInfo(pSRVs, m_SRVsLinkInfo, m_SRVs.size(),
|
||||
m_pMDHelper.get());
|
||||
|
||||
// Load UAV base records.
|
||||
LoadResourcesLinkInfo(pUAVs, m_UAVsLinkInfo, m_UAVs.size(),
|
||||
m_pMDHelper.get());
|
||||
|
||||
// Load CBuffer records.
|
||||
LoadResourcesLinkInfo(pCBuffers, m_CBuffersLinkInfo, m_CBuffers.size(),
|
||||
m_pMDHelper.get());
|
||||
|
||||
// Load Sampler records.
|
||||
LoadResourcesLinkInfo(pSamplers, m_SamplersLinkInfo, m_Samplers.size(),
|
||||
m_pMDHelper.get());
|
||||
}
|
||||
|
||||
MDTuple *DxilModule::EmitDxilShaderProperties() {
|
||||
vector<Metadata *> MDVals;
|
||||
|
||||
|
|
|
@ -290,8 +290,8 @@ const OP::OpCodeProperty OP::m_OpCodeProps[(unsigned)OP::OpCode::NumOpCodes] = {
|
|||
{ OC::CurrentRayT, "CurrentRayT", OCC::CurrentRayT, "currentRayT", false, false, true, false, false, false, false, false, false, false, Attribute::ReadNone, },
|
||||
|
||||
// AnyHit Terminals void, h, f, d, i1, i8, i16, i32, i64, udt, function attribute
|
||||
{ OC::IgnoreHit, "IgnoreHit", OCC::IgnoreHit, "ignoreHit", true, false, false, false, false, false, false, false, false, false, Attribute::NoReturn, },
|
||||
{ OC::AcceptHitAndEndSearch, "AcceptHitAndEndSearch", OCC::AcceptHitAndEndSearch, "acceptHitAndEndSearch", true, false, false, false, false, false, false, false, false, false, Attribute::NoReturn, },
|
||||
{ OC::CommitHitAndStopRay, "CommitHitAndStopRay", OCC::CommitHitAndStopRay, "commitHitAndStopRay", true, false, false, false, false, false, false, false, false, false, Attribute::NoReturn, },
|
||||
|
||||
// Indirect Shader Invocation void, h, f, d, i1, i8, i16, i32, i64, udt, function attribute
|
||||
{ OC::TraceRay, "TraceRay", OCC::TraceRay, "traceRay", false, false, false, false, false, false, false, false, false, true, Attribute::None, },
|
||||
|
@ -853,8 +853,8 @@ Function *OP::GetOpFunc(OpCode OpCode, Type *pOverloadType) {
|
|||
case OpCode::CurrentRayT: A(pF32); A(pI32); break;
|
||||
|
||||
// AnyHit Terminals
|
||||
case OpCode::IgnoreHit: A(pV); A(pI32); break;
|
||||
case OpCode::AcceptHitAndEndSearch: A(pV); A(pI32); break;
|
||||
case OpCode::CommitHitAndStopRay: A(pV); A(pI32); break;
|
||||
|
||||
// Indirect Shader Invocation
|
||||
case OpCode::TraceRay: A(pV); A(pI32); A(pRes); A(pI32); A(pI32); A(pI32); A(pI32); A(pI32); A(pF32); A(pF32); A(pF32); A(pF32); A(pF32); A(pF32); A(pF32); A(pF32); A(udt); break;
|
||||
|
@ -1013,8 +1013,8 @@ llvm::Type *OP::GetOverloadType(OpCode OpCode, llvm::Function *F) {
|
|||
case OpCode::LegacyDoubleToUInt32:
|
||||
case OpCode::WaveAllBitCount:
|
||||
case OpCode::WavePrefixBitCount:
|
||||
case OpCode::IgnoreHit:
|
||||
case OpCode::AcceptHitAndEndSearch:
|
||||
case OpCode::CommitHitAndStopRay:
|
||||
return Type::getVoidTy(m_Ctx);
|
||||
case OpCode::CheckAccessFullyMapped:
|
||||
case OpCode::AtomicBinOp:
|
||||
|
|
|
@ -84,7 +84,7 @@ static const char *s_ResourceDimNames[(unsigned)DxilResourceBase::Kind::NumEntri
|
|||
"invalid", "1d", "2d", "2dMS", "3d",
|
||||
"cube", "1darray", "2darray", "2darrayMS", "cubearray",
|
||||
"buf", "rawbuf", "structbuf", "cbuffer", "sampler",
|
||||
"tbuffer", "raytracingacceleration",
|
||||
"tbuffer", "ras",
|
||||
};
|
||||
|
||||
const char *DxilResourceBase::GetResDimName() const {
|
||||
|
|
|
@ -607,8 +607,8 @@ static bool ValidateOpcodeInProfile(DXIL::OpCode opcode,
|
|||
// RayDispatchIndex=145, RayDispatchDimension=146, WorldRayOrigin=147,
|
||||
// WorldRayDirection=148, ObjectRayOrigin=149, ObjectRayDirection=150,
|
||||
// ObjectToWorld=151, WorldToObject=152, RayTMin=153, CurrentRayT=154,
|
||||
// AcceptHitAndEndSearch=155, CommitHitAndStopRay=156, TraceRay=157,
|
||||
// ReportHit=158, CallShader=159, CreateHandleFromResourceStructForLib=160
|
||||
// IgnoreHit=155, AcceptHitAndEndSearch=156, TraceRay=157, ReportHit=158,
|
||||
// CallShader=159, CreateHandleFromResourceStructForLib=160
|
||||
if (141 <= op && op <= 160)
|
||||
return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 3));
|
||||
return true;
|
||||
|
|
|
@ -4408,7 +4408,6 @@ IntrinsicLower gLowerTable[static_cast<unsigned>(IntrinsicOp::Num_Intrinsics)] =
|
|||
{IntrinsicOp::IOP_AllMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier},
|
||||
{IntrinsicOp::IOP_CallShader, TranslateCallShader, DXIL::OpCode::CallShader},
|
||||
{IntrinsicOp::IOP_CheckAccessFullyMapped, TranslateCheckAccess, DXIL::OpCode::CheckAccessFullyMapped},
|
||||
{IntrinsicOp::IOP_CommitHitAndStopRay, TrivialNoArgOperation, DXIL::OpCode::CommitHitAndStopRay},
|
||||
{IntrinsicOp::IOP_CurrentRayT, TrivialNoArgWithRetOperation, DXIL::OpCode::CurrentRayT},
|
||||
{IntrinsicOp::IOP_D3DCOLORtoUBYTE4, TranslateD3DColorToUByte4, DXIL::OpCode::NumOpCodes},
|
||||
{IntrinsicOp::IOP_DeviceMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier},
|
||||
|
@ -4422,6 +4421,7 @@ IntrinsicLower gLowerTable[static_cast<unsigned>(IntrinsicOp::Num_Intrinsics)] =
|
|||
{IntrinsicOp::IOP_GroupMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier},
|
||||
{IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier},
|
||||
{IntrinsicOp::IOP_HitKind, TrivialNoArgWithRetOperation, DXIL::OpCode::HitKind},
|
||||
{IntrinsicOp::IOP_IgnoreHit, TrivialNoArgOperation, DXIL::OpCode::IgnoreHit},
|
||||
{IntrinsicOp::IOP_InstanceID, TrivialNoArgWithRetOperation, DXIL::OpCode::InstanceID},
|
||||
{IntrinsicOp::IOP_InstanceIndex, TrivialNoArgWithRetOperation, DXIL::OpCode::InstanceIndex},
|
||||
{IntrinsicOp::IOP_InterlockedAdd, TranslateIopAtomicBinaryOperation, DXIL::OpCode::NumOpCodes},
|
||||
|
|
|
@ -9814,7 +9814,12 @@ bool FlattenedTypeIterator::pushTrackerForType(QualType type, MultiExprArg::iter
|
|||
}
|
||||
|
||||
ArTypeObjectKind objectKind = m_source.GetTypeObjectKind(type);
|
||||
|
||||
if (objectKind == ArTypeObjectKind::AR_TOBJ_OBJECT) {
|
||||
// Treat ray desc as compound.
|
||||
ArBasicKind kind = m_source.GetTypeElementKind(type);
|
||||
if (kind == AR_OBJECT_RAY_DESC)
|
||||
objectKind = AR_TOBJ_COMPOUND;
|
||||
}
|
||||
QualType elementType;
|
||||
unsigned int elementCount;
|
||||
const RecordType* recordType;
|
||||
|
@ -9883,10 +9888,12 @@ bool FlattenedTypeIterator::pushTrackerForType(QualType type, MultiExprArg::iter
|
|||
m_source.GetMatrixOrVectorElementType(type),
|
||||
GetHLSLVecSize(type), nullptr));
|
||||
return true;
|
||||
case ArTypeObjectKind::AR_TOBJ_OBJECT:
|
||||
case ArTypeObjectKind::AR_TOBJ_OBJECT: {
|
||||
// Object have no sub-types.
|
||||
m_typeTrackers.push_back(FlattenedTypeIterator::FlattenedTypeTracker(type.getCanonicalType(), 1, expression));
|
||||
m_typeTrackers.push_back(FlattenedTypeIterator::FlattenedTypeTracker(
|
||||
type.getCanonicalType(), 1, expression));
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
DXASSERT(false, "unreachable");
|
||||
return false;
|
||||
|
|
|
@ -53,84 +53,84 @@ static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args5[] =
|
|||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args6[] =
|
||||
{
|
||||
{"CommitHitAndStopRay", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args7[] =
|
||||
{
|
||||
{"CurrentRayT", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_FLOAT, 1, 1},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args8[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args7[] =
|
||||
{
|
||||
{"D3DCOLORtoUBYTE4", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_INT, 1, 4},
|
||||
{"x", AR_QUAL_IN, 0, LITEMPLATE_VECTOR, 1, LICOMPTYPE_FLOAT, 1, 4},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args9[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args8[] =
|
||||
{
|
||||
{"DeviceMemoryBarrier", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args10[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args9[] =
|
||||
{
|
||||
{"DeviceMemoryBarrierWithGroupSync", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args11[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args10[] =
|
||||
{
|
||||
{"EvaluateAttributeAtSample", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
|
||||
{"value", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
|
||||
{"index", AR_QUAL_IN, 2, LITEMPLATE_SCALAR, 2, LICOMPTYPE_UINT, 1, 1},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args12[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args11[] =
|
||||
{
|
||||
{"EvaluateAttributeCentroid", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
|
||||
{"value", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args13[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args12[] =
|
||||
{
|
||||
{"EvaluateAttributeSnapped", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
|
||||
{"value", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
|
||||
{"offset", AR_QUAL_IN, 2, LITEMPLATE_VECTOR, 2, LICOMPTYPE_INT, 1, 2},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args14[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args13[] =
|
||||
{
|
||||
{"GetAttributeAtVertex", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
|
||||
{"value", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
|
||||
{"VertexID", AR_QUAL_IN, 2, LITEMPLATE_SCALAR, 2, LICOMPTYPE_UINT, 1, 1},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args15[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args14[] =
|
||||
{
|
||||
{"GetRenderTargetSampleCount", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_UINT, 1, 1},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args16[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args15[] =
|
||||
{
|
||||
{"GetRenderTargetSamplePosition", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_FLOAT, 1, 2},
|
||||
{"s", AR_QUAL_IN, 1, LITEMPLATE_SCALAR, 1, LICOMPTYPE_INT, 1, 1},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args17[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args16[] =
|
||||
{
|
||||
{"GroupMemoryBarrier", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args18[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args17[] =
|
||||
{
|
||||
{"GroupMemoryBarrierWithGroupSync", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args19[] =
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args18[] =
|
||||
{
|
||||
{"HitKind", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_UINT, 1, 1},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args19[] =
|
||||
{
|
||||
{"IgnoreHit", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
|
||||
};
|
||||
|
||||
static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args20[] =
|
||||
{
|
||||
{"InstanceID", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_UINT, 1, 1},
|
||||
|
@ -1374,20 +1374,20 @@ static const HLSL_INTRINSIC g_Intrinsics[] =
|
|||
{(UINT)hlsl::IntrinsicOp::IOP_AllMemoryBarrierWithGroupSync, false, false, -1, 1, g_Intrinsics_Args3},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_CallShader, false, false, -1, 3, g_Intrinsics_Args4},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_CheckAccessFullyMapped, false, true, -1, 2, g_Intrinsics_Args5},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_CommitHitAndStopRay, false, false, -1, 1, g_Intrinsics_Args6},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_CurrentRayT, false, true, -1, 1, g_Intrinsics_Args7},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_D3DCOLORtoUBYTE4, false, true, -1, 2, g_Intrinsics_Args8},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_DeviceMemoryBarrier, false, false, -1, 1, g_Intrinsics_Args9},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_DeviceMemoryBarrierWithGroupSync, false, false, -1, 1, g_Intrinsics_Args10},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeAtSample, false, true, -1, 3, g_Intrinsics_Args11},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeCentroid, false, true, -1, 2, g_Intrinsics_Args12},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeSnapped, false, true, -1, 3, g_Intrinsics_Args13},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GetAttributeAtVertex, false, true, -1, 3, g_Intrinsics_Args14},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GetRenderTargetSampleCount, false, true, -1, 1, g_Intrinsics_Args15},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GetRenderTargetSamplePosition, false, true, -1, 2, g_Intrinsics_Args16},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GroupMemoryBarrier, false, false, -1, 1, g_Intrinsics_Args17},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, false, false, -1, 1, g_Intrinsics_Args18},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_HitKind, false, true, -1, 1, g_Intrinsics_Args19},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_CurrentRayT, false, true, -1, 1, g_Intrinsics_Args6},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_D3DCOLORtoUBYTE4, false, true, -1, 2, g_Intrinsics_Args7},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_DeviceMemoryBarrier, false, false, -1, 1, g_Intrinsics_Args8},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_DeviceMemoryBarrierWithGroupSync, false, false, -1, 1, g_Intrinsics_Args9},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeAtSample, false, true, -1, 3, g_Intrinsics_Args10},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeCentroid, false, true, -1, 2, g_Intrinsics_Args11},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeSnapped, false, true, -1, 3, g_Intrinsics_Args12},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GetAttributeAtVertex, false, true, -1, 3, g_Intrinsics_Args13},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GetRenderTargetSampleCount, false, true, -1, 1, g_Intrinsics_Args14},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GetRenderTargetSamplePosition, false, true, -1, 2, g_Intrinsics_Args15},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GroupMemoryBarrier, false, false, -1, 1, g_Intrinsics_Args16},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, false, false, -1, 1, g_Intrinsics_Args17},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_HitKind, false, true, -1, 1, g_Intrinsics_Args18},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_IgnoreHit, false, false, -1, 1, g_Intrinsics_Args19},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_InstanceID, false, true, -1, 1, g_Intrinsics_Args20},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_InstanceIndex, false, true, -1, 1, g_Intrinsics_Args21},
|
||||
{(UINT)hlsl::IntrinsicOp::IOP_InterlockedAdd, false, false, -1, 3, g_Intrinsics_Args22},
|
||||
|
|
|
@ -95,19 +95,21 @@
|
|||
// CHECK: %struct.Resources = type { %class.Texture2D, %class.Texture2D.0, %class.Texture2D, %class.Texture2D.0, %class.RWTexture2D, %class.RWTexture2D, %class.RWTexture2D, %class.RWTexture2D, %struct.SamplerComparisonState, %struct.SamplerState, %struct.SamplerComparisonState, %struct.SamplerState, <4 x float> }
|
||||
|
||||
// CHECK: %RWTex2_UAV_2d = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 7, i1 false)
|
||||
// CHECK: %MyTB_texture_tbuffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 4, i32 11, i1 false)
|
||||
|
||||
// CHECK: %Tex1_texture_2d = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false)
|
||||
// CHECK: %Samp2_sampler = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 3, i32 0, i32 0, i1 false)
|
||||
|
||||
// CHECK: %tbuf4_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 8, i32 4, i1 false)
|
||||
// CHECK: %tbuf2_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 7, i32 2, i1 false)
|
||||
// CHECK: %tbuf3_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 6, i32 6, i1 false)
|
||||
// CHECK: %tbuf1_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 5, i32 35, i1 false)
|
||||
// CHECK: %buf2_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 4, i32 55, i1 false)
|
||||
// CHECK: %buf1_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 3, i32 104, i1 false)
|
||||
// CHECK: %buf4_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 2, i32 1, i1 false)
|
||||
|
||||
// CHECK: %MyCB_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 11, i1 false)
|
||||
// CHECK: %MyTB_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 4, i32 11, i1 false)
|
||||
|
||||
// CHECK: %tbuf4_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 8, i32 4, i1 false)
|
||||
// CHECK: %tbuf2_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 7, i32 2, i1 false)
|
||||
// CHECK: %tbuf3_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 6, i32 6, i1 false)
|
||||
// CHECK: %tbuf1_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 5, i32 35, i1 false)
|
||||
|
||||
// CHECK: %Tex2_texture_2d = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 1, i32 30, i1 false)
|
||||
// CHECK: %Tex3_texture_2d = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 2, i32 94, i1 false)
|
||||
|
|
|
@ -21,7 +21,7 @@ Special c_special;
|
|||
|
||||
static const Special s_special = { { 1, 2, 3, 4}, { 1, 2, 3 } };
|
||||
|
||||
// CHECK: define void
|
||||
// CHECK: define <4 x float>
|
||||
// CHECK: fn1
|
||||
// @"\01?fn1@@YA?AV?$vector@M$03@@USpecial@@@Z"
|
||||
float4 fn1(in Special in1: SEMANTIC_IN) : SEMANTIC_OUT {
|
||||
|
@ -36,7 +36,7 @@ float4 fn1(in Special in1: SEMANTIC_IN) : SEMANTIC_OUT {
|
|||
return in1.member + (float)s_testa[i];
|
||||
}
|
||||
|
||||
// CHECK: define void
|
||||
// CHECK: define <4 x float>
|
||||
// CHECK: fn2
|
||||
// @"\01?fn2@@YA?AV?$vector@M$03@@USpecial@@@Z"
|
||||
float4 fn2(in Special in1: SEMANTIC_IN) : SEMANTIC_OUT {
|
||||
|
@ -44,7 +44,7 @@ float4 fn2(in Special in1: SEMANTIC_IN) : SEMANTIC_OUT {
|
|||
return in1.member + (float)s_special.a[i];
|
||||
}
|
||||
|
||||
// CHECK: define void
|
||||
// CHECK: define <4 x float>
|
||||
// CHECK: fn3
|
||||
// @"\01?fn3@@YA?AV?$vector@M$03@@USpecial@@@Z"
|
||||
float4 fn3(in Special in1: SEMANTIC_IN) : SEMANTIC_OUT {
|
||||
|
@ -59,7 +59,7 @@ float4 fn3(in Special in1: SEMANTIC_IN) : SEMANTIC_OUT {
|
|||
return in1.member + (float)in1.a[i];
|
||||
}
|
||||
|
||||
// CHECK: define void
|
||||
// CHECK: define <4 x float>
|
||||
// CHECK: fn4
|
||||
// @"\01?fn4@@YA?AV?$vector@M$03@@USpecial@@@Z"
|
||||
float4 fn4(in Special in1: SEMANTIC_IN) : SEMANTIC_OUT {
|
||||
|
|
|
@ -43,7 +43,7 @@ struct MyParam {
|
|||
// Declare_CallShader(MyParam);
|
||||
|
||||
// CHECK: ; S sampler NA NA S0 s1 1
|
||||
// CHECK: ; RTAS texture byte r/o T0 t5 1
|
||||
// CHECK: ; RTAS texture i32 ras T0 t5 1
|
||||
// CHECK: ; T texture f32 2d T1 t1 1
|
||||
|
||||
// CHECK: @RTAS_rangeID = external constant i32
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
// RUN: %dxc -T lib_6_1 %s | FileCheck %s
|
||||
|
||||
// Make sure load resource rangeID when select resource.
|
||||
// CHECK:load i32, i32* @ReadBuffer1_rangeID
|
||||
// CHECK:load i32, i32* @ReadBuffer_rangeID
|
||||
// Make sure createHandleFromResourceStructForLib is used for resource.
|
||||
// CHECK:call %dx.types.Handle @"dx.op.createHandleFromResourceStructForLib.%struct.ByteAddressBuffer*
|
||||
// CHECK:call %dx.types.Handle @"dx.op.createHandleFromResourceStructForLib.%struct.ByteAddressBuffer*
|
||||
// CHECK:call %dx.types.Handle @"dx.op.createHandleFromResourceStructForLib.%struct.RWByteAddressBuffer*
|
||||
|
||||
RWByteAddressBuffer outputBuffer : register(u0);
|
||||
ByteAddressBuffer ReadBuffer : register(t0);
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
// RUN: %dxc -T lib_6_2 %s | FileCheck %s
|
||||
|
||||
// CHECK: call void @dx.op.acceptHitAndEndSearch(i32 155)
|
||||
// CHECK: call void @dx.op.commitHitAndStopRay(i32 156)
|
||||
// CHECK: call void @dx.op.acceptHitAndEndSearch(i32 156)
|
||||
// CHECK: call void @dx.op.ignoreHit(i32 155)
|
||||
|
||||
float4 emit(uint shader) {
|
||||
if (shader < 2)
|
||||
AcceptHitAndEndSearch();
|
||||
if (shader < 9)
|
||||
CommitHitAndStopRay();
|
||||
IgnoreHit();
|
||||
return 2.6;
|
||||
}
|
|
@ -4,10 +4,10 @@
|
|||
// CHECK: emit
|
||||
|
||||
struct M {
|
||||
float2 a;
|
||||
float3 a;
|
||||
Texture2D<float4> tex;
|
||||
};
|
||||
|
||||
float4 emit(M m) {
|
||||
return tex.Load(a);
|
||||
return m.tex.Load(m.a);
|
||||
}
|
|
@ -981,8 +981,8 @@ static const char *OpCodeSignatures[] = {
|
|||
"(row,col)", // WorldToObject
|
||||
"()", // RayTMin
|
||||
"()", // CurrentRayT
|
||||
"()", // IgnoreHit
|
||||
"()", // AcceptHitAndEndSearch
|
||||
"()", // CommitHitAndStopRay
|
||||
"(AccelerationStructure,RayFlags,InstanceInclusionMask,RayContributionToHitGroupIndex,MultiplierForGeometryContributionToShaderIndex,MissShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax,payload)", // TraceRay
|
||||
"(THit,HitKind,Attributes)", // ReportHit
|
||||
"(ShaderIndex,Parameter)", // CallShader
|
||||
|
|
|
@ -272,8 +272,8 @@ void [[]] TraceRay(in acceleration_struct AccelerationStructure, in uint RayFla
|
|||
|
||||
bool [[]] ReportHit(in float THit, in uint HitKind, in udt Attributes);
|
||||
void [[]] CallShader(in uint ShaderIndex, inout udt Parameter);
|
||||
void [[]] IgnoreHit();
|
||||
void [[]] AcceptHitAndEndSearch();
|
||||
void [[]] CommitHitAndStopRay();
|
||||
uint<2> [[rn]] RayDispatchIndex();
|
||||
uint<2> [[rn]] RayDispatchDimension();
|
||||
// group: Ray Vectors
|
||||
|
|
|
@ -308,7 +308,7 @@ class db_dxil(object):
|
|||
for i in "RayTMin,CurrentRayT".split(","):
|
||||
self.name_idx[i].category = "RayT"
|
||||
self.name_idx[i].shader_model = 6,3
|
||||
for i in "AcceptHitAndEndSearch,CommitHitAndStopRay".split(","):
|
||||
for i in "IgnoreHit,AcceptHitAndEndSearch".split(","):
|
||||
self.name_idx[i].category = "AnyHit Terminals"
|
||||
self.name_idx[i].shader_model = 6,3
|
||||
for i in "TraceRay,ReportHit,CallShader".split(","):
|
||||
|
@ -1198,11 +1198,11 @@ class db_dxil(object):
|
|||
db_dxil_param(0, "f", "", "result")])
|
||||
next_op_idx += 1
|
||||
|
||||
self.add_dxil_op("AcceptHitAndEndSearch", next_op_idx, "AcceptHitAndEndSearch", "Used in an any hit shader to reject an intersection and terminate the shader", "v", "nr", [
|
||||
self.add_dxil_op("IgnoreHit", next_op_idx, "IgnoreHit", "Used in an any hit shader to reject an intersection and terminate the shader", "v", "nr", [
|
||||
db_dxil_param(0, "v", "", "")])
|
||||
next_op_idx += 1
|
||||
|
||||
self.add_dxil_op("CommitHitAndStopRay", next_op_idx, "CommitHitAndStopRay", "Used in an any hit shader to abort the ray query and the intersection shader (if any). The current hit is committed and execution passes to the closest hit shader with the closest hit recorded so far", "v", "nr", [
|
||||
self.add_dxil_op("AcceptHitAndEndSearch", next_op_idx, "AcceptHitAndEndSearch", "Used in an any hit shader to abort the ray query and the intersection shader (if any). The current hit is committed and execution passes to the closest hit shader with the closest hit recorded so far", "v", "nr", [
|
||||
db_dxil_param(0, "v", "", "")])
|
||||
next_op_idx += 1
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче