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:
Xiang Li 2018-02-05 18:44:20 -08:00 коммит произвёл Tex Riddell
Родитель 66516234b1
Коммит fdf2c31ca6
22 изменённых файлов: 86 добавлений и 321 удалений

Просмотреть файл

@ -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