Browse Source

Update name and fix nonuniformindex. (#2697)

* Add nonUniformIndex for CreateHandleFromHeap and change name to CreateResourceFromHeap.

* Check group when lower CreateResourceFromHeap.
Xiang Li 5 years ago
parent
commit
8156151a58

+ 6 - 1
include/dxc/DXIL/DxilInstructions.h

@@ -6999,7 +6999,7 @@ struct DxilInst_CreateHandleFromHeap {
   // Validation support
   // Validation support
   bool isAllowed() const { return true; }
   bool isAllowed() const { return true; }
   bool isArgumentListValid() const {
   bool isArgumentListValid() const {
-    if (2 != llvm::dyn_cast<llvm::CallInst>(Instr)->getNumArgOperands()) return false;
+    if (3 != llvm::dyn_cast<llvm::CallInst>(Instr)->getNumArgOperands()) return false;
     return true;
     return true;
   }
   }
   // Metadata
   // Metadata
@@ -7007,10 +7007,15 @@ struct DxilInst_CreateHandleFromHeap {
   // Operand indexes
   // Operand indexes
   enum OperandIdx {
   enum OperandIdx {
     arg_index = 1,
     arg_index = 1,
+    arg_nonUniformIndex = 2,
   };
   };
   // Accessors
   // Accessors
   llvm::Value *get_index() const { return Instr->getOperand(1); }
   llvm::Value *get_index() const { return Instr->getOperand(1); }
   void set_index(llvm::Value *val) { Instr->setOperand(1, val); }
   void set_index(llvm::Value *val) { Instr->setOperand(1, val); }
+  llvm::Value *get_nonUniformIndex() const { return Instr->getOperand(2); }
+  void set_nonUniformIndex(llvm::Value *val) { Instr->setOperand(2, val); }
+  bool get_nonUniformIndex_val() const { return (bool)(llvm::dyn_cast<llvm::ConstantInt>(Instr->getOperand(2))->getZExtValue()); }
+  void set_nonUniformIndex_val(bool val) { Instr->setOperand(2, llvm::Constant::getIntegerValue(llvm::IntegerType::get(Instr->getContext(), 1), llvm::APInt(1, (uint64_t)val))); }
 };
 };
 
 
 /// This instruction annotate handle with resource properties
 /// This instruction annotate handle with resource properties

+ 1 - 1
include/dxc/HlslIntrinsicOp.h

@@ -28,6 +28,7 @@ import hctdb_instrhelp
   IOP_AllocateRayQuery,
   IOP_AllocateRayQuery,
   IOP_CallShader,
   IOP_CallShader,
   IOP_CheckAccessFullyMapped,
   IOP_CheckAccessFullyMapped,
+  IOP_CreateResourceFromHeap,
   IOP_D3DCOLORtoUBYTE4,
   IOP_D3DCOLORtoUBYTE4,
   IOP_DeviceMemoryBarrier,
   IOP_DeviceMemoryBarrier,
   IOP_DeviceMemoryBarrierWithGroupSync,
   IOP_DeviceMemoryBarrierWithGroupSync,
@@ -41,7 +42,6 @@ import hctdb_instrhelp
   IOP_GetAttributeAtVertex,
   IOP_GetAttributeAtVertex,
   IOP_GetRenderTargetSampleCount,
   IOP_GetRenderTargetSampleCount,
   IOP_GetRenderTargetSamplePosition,
   IOP_GetRenderTargetSamplePosition,
-  IOP_GetResourceFromHeap,
   IOP_GroupMemoryBarrier,
   IOP_GroupMemoryBarrier,
   IOP_GroupMemoryBarrierWithGroupSync,
   IOP_GroupMemoryBarrierWithGroupSync,
   IOP_HitKind,
   IOP_HitKind,

+ 1 - 1
lib/DXIL/DxilOperations.cpp

@@ -1318,7 +1318,7 @@ Function *OP::GetOpFunc(OpCode opCode, Type *pOverloadType) {
   case OpCode::RayQuery_CommittedInstanceContributionToHitGroupIndex:A(pI32);     A(pI32); A(pI32); break;
   case OpCode::RayQuery_CommittedInstanceContributionToHitGroupIndex:A(pI32);     A(pI32); A(pI32); break;
 
 
     // Get handle from heap
     // Get handle from heap
-  case OpCode::CreateHandleFromHeap:   A(pRes);     A(pI32); A(pI32); break;
+  case OpCode::CreateHandleFromHeap:   A(pRes);     A(pI32); A(pI32); A(pI1);  break;
   case OpCode::AnnotateHandle:         A(pRes);     A(pI32); A(pRes); A(pI8);  A(pI8);  A(resProperty);break;
   case OpCode::AnnotateHandle:         A(pRes);     A(pI32); A(pRes); A(pI8);  A(pI8);  A(resProperty);break;
   // OPCODE-OLOAD-FUNCS:END
   // OPCODE-OLOAD-FUNCS:END
   default: DXASSERT(false, "otherwise unhandled case"); break;
   default: DXASSERT(false, "otherwise unhandled case"); break;

+ 5 - 2
lib/HLSL/HLOperationLower.cpp

@@ -5135,7 +5135,10 @@ Value *TranslateGetHandleFromHeap(CallInst *CI, IntrinsicOp IOP,
   Function *dxilFunc = hlslOP.GetOpFunc(opcode, helper.voidTy);
   Function *dxilFunc = hlslOP.GetOpFunc(opcode, helper.voidTy);
   IRBuilder<> Builder(CI);
   IRBuilder<> Builder(CI);
   Value *opArg = ConstantInt::get(helper.i32Ty, (unsigned)opcode);
   Value *opArg = ConstantInt::get(helper.i32Ty, (unsigned)opcode);
-  return Builder.CreateCall(dxilFunc, {opArg, CI->getArgOperand(HLOperandIndex::kUnaryOpSrc0Idx)});
+  return Builder.CreateCall(
+      dxilFunc, {opArg, CI->getArgOperand(HLOperandIndex::kUnaryOpSrc0Idx),
+                 // TODO: update nonUniformIndex later.
+                 Builder.getInt1(false)});
 }
 }
 }
 }
 
 
@@ -5181,6 +5184,7 @@ IntrinsicLower gLowerTable[] = {
     {IntrinsicOp::IOP_AllocateRayQuery, TranslateAllocateRayQuery, DXIL::OpCode::AllocateRayQuery},
     {IntrinsicOp::IOP_AllocateRayQuery, TranslateAllocateRayQuery, DXIL::OpCode::AllocateRayQuery},
     {IntrinsicOp::IOP_CallShader, TranslateCallShader, DXIL::OpCode::CallShader},
     {IntrinsicOp::IOP_CallShader, TranslateCallShader, DXIL::OpCode::CallShader},
     {IntrinsicOp::IOP_CheckAccessFullyMapped, TranslateCheckAccess, DXIL::OpCode::CheckAccessFullyMapped},
     {IntrinsicOp::IOP_CheckAccessFullyMapped, TranslateCheckAccess, DXIL::OpCode::CheckAccessFullyMapped},
+    {IntrinsicOp::IOP_CreateResourceFromHeap, TranslateGetHandleFromHeap, DXIL::OpCode::CreateHandleFromHeap},
     {IntrinsicOp::IOP_D3DCOLORtoUBYTE4, TranslateD3DColorToUByte4, DXIL::OpCode::NumOpCodes},
     {IntrinsicOp::IOP_D3DCOLORtoUBYTE4, TranslateD3DColorToUByte4, DXIL::OpCode::NumOpCodes},
     {IntrinsicOp::IOP_DeviceMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier},
     {IntrinsicOp::IOP_DeviceMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier},
     {IntrinsicOp::IOP_DeviceMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier},
     {IntrinsicOp::IOP_DeviceMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier},
@@ -5194,7 +5198,6 @@ IntrinsicLower gLowerTable[] = {
     {IntrinsicOp::IOP_GetAttributeAtVertex, TranslateGetAttributeAtVertex, DXIL::OpCode::AttributeAtVertex},
     {IntrinsicOp::IOP_GetAttributeAtVertex, TranslateGetAttributeAtVertex, DXIL::OpCode::AttributeAtVertex},
     {IntrinsicOp::IOP_GetRenderTargetSampleCount, TrivialNoArgOperation, DXIL::OpCode::RenderTargetGetSampleCount},
     {IntrinsicOp::IOP_GetRenderTargetSampleCount, TrivialNoArgOperation, DXIL::OpCode::RenderTargetGetSampleCount},
     {IntrinsicOp::IOP_GetRenderTargetSamplePosition, TranslateGetRTSamplePos, DXIL::OpCode::NumOpCodes},
     {IntrinsicOp::IOP_GetRenderTargetSamplePosition, TranslateGetRTSamplePos, DXIL::OpCode::NumOpCodes},
-    {IntrinsicOp::IOP_GetResourceFromHeap, TranslateGetHandleFromHeap, DXIL::OpCode::CreateHandleFromHeap},
     {IntrinsicOp::IOP_GroupMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier},
     {IntrinsicOp::IOP_GroupMemoryBarrier, TrivialBarrier, DXIL::OpCode::Barrier},
     {IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier},
     {IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, TrivialBarrier, DXIL::OpCode::Barrier},
     {IntrinsicOp::IOP_HitKind, TrivialNoArgWithRetOperation, DXIL::OpCode::HitKind},
     {IntrinsicOp::IOP_HitKind, TrivialNoArgWithRetOperation, DXIL::OpCode::HitKind},

+ 4 - 1
tools/clang/lib/CodeGen/CGHLSLMS.cpp

@@ -4078,7 +4078,7 @@ void LowerGetResourceFromHeap(
   llvm::Module &M = *HLM.GetModule();
   llvm::Module &M = *HLM.GetModule();
   llvm::Type *HandleTy = HLM.GetOP()->GetHandleType();
   llvm::Type *HandleTy = HLM.GetOP()->GetHandleType();
   unsigned GetResFromHeapOp =
   unsigned GetResFromHeapOp =
-      static_cast<unsigned>(IntrinsicOp::IOP_GetResourceFromHeap);
+      static_cast<unsigned>(IntrinsicOp::IOP_CreateResourceFromHeap);
   DenseMap<Instruction *, Instruction *> ResourcePtrToHandlePtrMap;
   DenseMap<Instruction *, Instruction *> ResourcePtrToHandlePtrMap;
 
 
   for (auto it : intrinsicMap) {
   for (auto it : intrinsicMap) {
@@ -4086,6 +4086,9 @@ void LowerGetResourceFromHeap(
     if (opcode != GetResFromHeapOp)
     if (opcode != GetResFromHeapOp)
       continue;
       continue;
     Function *F = it.first;
     Function *F = it.first;
+    HLOpcodeGroup group = hlsl::GetHLOpcodeGroup(F);
+    if (group != HLOpcodeGroup::HLIntrinsic)
+      continue;
     for (auto uit = F->user_begin(); uit != F->user_end();) {
     for (auto uit = F->user_begin(); uit != F->user_end();) {
       CallInst *CI = cast<CallInst>(*(uit++));
       CallInst *CI = cast<CallInst>(*(uit++));
       Instruction *ResPtr = cast<Instruction>(CI->getArgOperand(0));
       Instruction *ResPtr = cast<Instruction>(CI->getArgOperand(0));

+ 32 - 32
tools/clang/lib/Sema/gen_intrin_main_tables_15.h

@@ -59,22 +59,28 @@ static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args6[] =
 };
 };
 
 
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args7[] =
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args7[] =
+{
+    {"CreateResourceFromHeap", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_RESOURCE, 1, 1},
+    {"index", AR_QUAL_IN, 1, LITEMPLATE_SCALAR, 1, LICOMPTYPE_UINT, 1, 1},
+};
+
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args8[] =
 {
 {
     {"D3DCOLORtoUBYTE4", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_INT, 1, 4},
     {"D3DCOLORtoUBYTE4", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_INT, 1, 4},
     {"x", AR_QUAL_IN, 0, LITEMPLATE_VECTOR, 1, LICOMPTYPE_FLOAT, 1, 4},
     {"x", AR_QUAL_IN, 0, LITEMPLATE_VECTOR, 1, LICOMPTYPE_FLOAT, 1, 4},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args8[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args9[] =
 {
 {
     {"DeviceMemoryBarrier", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
     {"DeviceMemoryBarrier", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args9[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args10[] =
 {
 {
     {"DeviceMemoryBarrierWithGroupSync", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
     {"DeviceMemoryBarrierWithGroupSync", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args10[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args11[] =
 {
 {
     {"DispatchMesh", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
     {"DispatchMesh", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
     {"threadGroupCountX", AR_QUAL_IN, 1, LITEMPLATE_SCALAR, 1, LICOMPTYPE_UINT, 1, 1},
     {"threadGroupCountX", AR_QUAL_IN, 1, LITEMPLATE_SCALAR, 1, LICOMPTYPE_UINT, 1, 1},
@@ -83,65 +89,59 @@ static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args10[] =
     {"meshPayload", AR_QUAL_IN, 4, LITEMPLATE_SCALAR, 4, LICOMPTYPE_USER_DEFINED_TYPE, 1, 1},
     {"meshPayload", AR_QUAL_IN, 4, LITEMPLATE_SCALAR, 4, LICOMPTYPE_USER_DEFINED_TYPE, 1, 1},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args11[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args12[] =
 {
 {
     {"DispatchRaysDimensions", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_UINT, 1, 3},
     {"DispatchRaysDimensions", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_UINT, 1, 3},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args12[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args13[] =
 {
 {
     {"DispatchRaysIndex", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_UINT, 1, 3},
     {"DispatchRaysIndex", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_UINT, 1, 3},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args13[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args14[] =
 {
 {
     {"EvaluateAttributeAtSample", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
     {"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},
     {"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},
     {"index", AR_QUAL_IN, 2, LITEMPLATE_SCALAR, 2, LICOMPTYPE_UINT, 1, 1},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args14[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args15[] =
 {
 {
     {"EvaluateAttributeCentroid", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
     {"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},
     {"value", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args15[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args16[] =
 {
 {
     {"EvaluateAttributeSnapped", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
     {"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},
     {"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},
     {"offset", AR_QUAL_IN, 2, LITEMPLATE_VECTOR, 2, LICOMPTYPE_INT, 1, 2},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args16[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args17[] =
 {
 {
     {"GeometryIndex", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_UINT, 1, 1},
     {"GeometryIndex", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_UINT, 1, 1},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args17[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args18[] =
 {
 {
     {"GetAttributeAtVertex", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_NUMERIC, IA_R, IA_C},
     {"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},
     {"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},
     {"VertexID", AR_QUAL_IN, 2, LITEMPLATE_SCALAR, 2, LICOMPTYPE_UINT, 1, 1},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args18[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args19[] =
 {
 {
     {"GetRenderTargetSampleCount", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_UINT, 1, 1},
     {"GetRenderTargetSampleCount", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_UINT, 1, 1},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args19[] =
+static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args20[] =
 {
 {
     {"GetRenderTargetSamplePosition", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_FLOAT, 1, 2},
     {"GetRenderTargetSamplePosition", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_FLOAT, 1, 2},
     {"s", AR_QUAL_IN, 1, LITEMPLATE_SCALAR, 1, LICOMPTYPE_INT, 1, 1},
     {"s", AR_QUAL_IN, 1, LITEMPLATE_SCALAR, 1, LICOMPTYPE_INT, 1, 1},
 };
 };
 
 
-static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args20[] =
-{
-    {"GetResourceFromHeap", AR_QUAL_OUT, 0, LITEMPLATE_SCALAR, 0, LICOMPTYPE_RESOURCE, 1, 1},
-    {"index", AR_QUAL_IN, 1, LITEMPLATE_SCALAR, 1, LICOMPTYPE_UINT, 1, 1},
-};
-
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args21[] =
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args21[] =
 {
 {
     {"GroupMemoryBarrier", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
     {"GroupMemoryBarrier", 0, 0, LITEMPLATE_VOID, 0, LICOMPTYPE_VOID, 0, 0},
@@ -1500,20 +1500,20 @@ static const HLSL_INTRINSIC g_Intrinsics[] =
     {(UINT)hlsl::IntrinsicOp::IOP_AllocateRayQuery, false, false, -1, 2, g_Intrinsics_Args4},
     {(UINT)hlsl::IntrinsicOp::IOP_AllocateRayQuery, false, false, -1, 2, g_Intrinsics_Args4},
     {(UINT)hlsl::IntrinsicOp::IOP_CallShader, false, false, -1, 3, g_Intrinsics_Args5},
     {(UINT)hlsl::IntrinsicOp::IOP_CallShader, false, false, -1, 3, g_Intrinsics_Args5},
     {(UINT)hlsl::IntrinsicOp::IOP_CheckAccessFullyMapped, false, true, -1, 2, g_Intrinsics_Args6},
     {(UINT)hlsl::IntrinsicOp::IOP_CheckAccessFullyMapped, false, true, -1, 2, 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_DispatchMesh, false, false, -1, 5, g_Intrinsics_Args10},
-    {(UINT)hlsl::IntrinsicOp::IOP_DispatchRaysDimensions, false, true, -1, 1, g_Intrinsics_Args11},
-    {(UINT)hlsl::IntrinsicOp::IOP_DispatchRaysIndex, false, true, -1, 1, g_Intrinsics_Args12},
-    {(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeAtSample, false, true, -1, 3, g_Intrinsics_Args13},
-    {(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeCentroid, false, true, -1, 2, g_Intrinsics_Args14},
-    {(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeSnapped, false, true, -1, 3, g_Intrinsics_Args15},
-    {(UINT)hlsl::IntrinsicOp::IOP_GeometryIndex, false, true, -1, 1, g_Intrinsics_Args16},
-    {(UINT)hlsl::IntrinsicOp::IOP_GetAttributeAtVertex, false, true, -1, 3, g_Intrinsics_Args17},
-    {(UINT)hlsl::IntrinsicOp::IOP_GetRenderTargetSampleCount, false, true, -1, 1, g_Intrinsics_Args18},
-    {(UINT)hlsl::IntrinsicOp::IOP_GetRenderTargetSamplePosition, false, true, -1, 2, g_Intrinsics_Args19},
-    {(UINT)hlsl::IntrinsicOp::IOP_GetResourceFromHeap, false, true, -1, 2, g_Intrinsics_Args20},
+    {(UINT)hlsl::IntrinsicOp::IOP_CreateResourceFromHeap, false, true, -1, 2, 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_DispatchMesh, false, false, -1, 5, g_Intrinsics_Args11},
+    {(UINT)hlsl::IntrinsicOp::IOP_DispatchRaysDimensions, false, true, -1, 1, g_Intrinsics_Args12},
+    {(UINT)hlsl::IntrinsicOp::IOP_DispatchRaysIndex, false, true, -1, 1, g_Intrinsics_Args13},
+    {(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeAtSample, false, true, -1, 3, g_Intrinsics_Args14},
+    {(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeCentroid, false, true, -1, 2, g_Intrinsics_Args15},
+    {(UINT)hlsl::IntrinsicOp::IOP_EvaluateAttributeSnapped, false, true, -1, 3, g_Intrinsics_Args16},
+    {(UINT)hlsl::IntrinsicOp::IOP_GeometryIndex, false, true, -1, 1, g_Intrinsics_Args17},
+    {(UINT)hlsl::IntrinsicOp::IOP_GetAttributeAtVertex, false, true, -1, 3, g_Intrinsics_Args18},
+    {(UINT)hlsl::IntrinsicOp::IOP_GetRenderTargetSampleCount, false, true, -1, 1, g_Intrinsics_Args19},
+    {(UINT)hlsl::IntrinsicOp::IOP_GetRenderTargetSamplePosition, false, true, -1, 2, g_Intrinsics_Args20},
     {(UINT)hlsl::IntrinsicOp::IOP_GroupMemoryBarrier, false, false, -1, 1, g_Intrinsics_Args21},
     {(UINT)hlsl::IntrinsicOp::IOP_GroupMemoryBarrier, false, false, -1, 1, g_Intrinsics_Args21},
     {(UINT)hlsl::IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, false, false, -1, 1, g_Intrinsics_Args22},
     {(UINT)hlsl::IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync, false, false, -1, 1, g_Intrinsics_Args22},
     {(UINT)hlsl::IntrinsicOp::IOP_HitKind, false, true, -1, 1, g_Intrinsics_Args23},
     {(UINT)hlsl::IntrinsicOp::IOP_HitKind, false, true, -1, 1, g_Intrinsics_Args23},

+ 1 - 1
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap.hlsl

@@ -4,6 +4,6 @@
 
 
 uint ID;
 uint ID;
 float main(uint i:I): SV_Target {
 float main(uint i:I): SV_Target {
-  Buffer<float> buf = GetResourceFromHeap(ID);
+  Buffer<float> buf = CreateResourceFromHeap(ID);
   return buf[i];
   return buf[i];
 }
 }

+ 3 - 3
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap2.hlsl

@@ -17,8 +17,8 @@ globallycoherent RWBuffer<snorm float> buf1[2];
 uint ID;
 uint ID;
 float main(uint i:I): SV_Target {
 float main(uint i:I): SV_Target {
   S s;
   S s;
-  s.buf = GetResourceFromHeap(ID);
-  s.buf1[0] = GetResourceFromHeap(ID+1);
-  s.buf1[1] = GetResourceFromHeap(ID+2);
+  s.buf = CreateResourceFromHeap(ID);
+  s.buf1[0] = CreateResourceFromHeap(ID+1);
+  s.buf1[1] = CreateResourceFromHeap(ID+2);
   return s.buf[i] + s.buf1[0][i] + s.buf1[1][i];
   return s.buf[i] + s.buf1[0][i] + s.buf1[1][i];
 }
 }

+ 1 - 1
tools/clang/tools/dxcompiler/dxcdisassembler.cpp

@@ -1278,7 +1278,7 @@ static const char *OpCodeSignatures[] = {
   "()",  // GeometryIndex
   "()",  // GeometryIndex
   "(rayQueryHandle)",  // RayQuery_CandidateInstanceContributionToHitGroupIndex
   "(rayQueryHandle)",  // RayQuery_CandidateInstanceContributionToHitGroupIndex
   "(rayQueryHandle)",  // RayQuery_CommittedInstanceContributionToHitGroupIndex
   "(rayQueryHandle)",  // RayQuery_CommittedInstanceContributionToHitGroupIndex
-  "(index)",  // CreateHandleFromHeap
+  "(index,nonUniformIndex)",  // CreateHandleFromHeap
   "(res,resourceClass,resourceKind,props)"  // AnnotateHandle
   "(res,resourceClass,resourceKind,props)"  // AnnotateHandle
 };
 };
 // OPCODE-SIGS:END
 // OPCODE-SIGS:END

+ 1 - 1
utils/hct/gen_intrin_main.txt

@@ -324,7 +324,7 @@ void [[]] DispatchMesh(in uint threadGroupCountX, in uint threadGroupCountY, in
 // HL Op for allocating ray query object that default constructor uses
 // HL Op for allocating ray query object that default constructor uses
 uint [[hidden]] AllocateRayQuery(in uint flags);
 uint [[hidden]] AllocateRayQuery(in uint flags);
 
 
-resource [[rn]] GetResourceFromHeap(in uint index);
+resource [[rn]] CreateResourceFromHeap(in uint index);
 
 
 } namespace
 } namespace
 
 

+ 2 - 1
utils/hct/hctdb.py

@@ -1732,7 +1732,8 @@ class db_dxil(object):
 
 
         self.add_dxil_op("CreateHandleFromHeap", next_op_idx, "CreateHandleFromHeap", "create resource handle from heap", "v", "ro", [
         self.add_dxil_op("CreateHandleFromHeap", next_op_idx, "CreateHandleFromHeap", "create resource handle from heap", "v", "ro", [
             db_dxil_param(0, "res", "", "result"),
             db_dxil_param(0, "res", "", "result"),
-            db_dxil_param(2, "i32", "index", "heap index")])
+            db_dxil_param(2, "i32", "index", "heap index"),
+            db_dxil_param(3, "i1", "nonUniformIndex", "non-uniform resource index", is_const=True)])
         next_op_idx += 1
         next_op_idx += 1
 
 
         self.add_dxil_op("AnnotateHandle", next_op_idx, "AnnotateHandle", "annotate handle with resource properties", "v", "rn", [
         self.add_dxil_op("AnnotateHandle", next_op_idx, "AnnotateHandle", "annotate handle with resource properties", "v", "rn", [