Quellcode durchsuchen

fix crash when has sampler as return type. (#2736)

Xiang Li vor 5 Jahren
Ursprung
Commit
73e5b381c7

+ 1 - 3
lib/DXIL/DxilResourceProperties.cpp

@@ -102,9 +102,7 @@ DxilResourceProperties loadFromConstant(const Constant &C,
 DxilResourceProperties
 loadFromAnnotateHandle(DxilInst_AnnotateHandle &annotateHandle, llvm::Type *Ty,
                        const ShaderModel &SM) {
-
-  ConstantStruct *ResProp =
-      cast<ConstantStruct>(annotateHandle.get_props());
+  Constant *ResProp = cast<Constant>(annotateHandle.get_props());
   return loadFromConstant(
       *ResProp, (DXIL::ResourceClass)annotateHandle.get_resourceClass_val(),
       (DXIL::ResourceKind)annotateHandle.get_resourceKind_val());

+ 3 - 4
tools/clang/lib/CodeGen/CGCall.cpp

@@ -3074,7 +3074,6 @@ void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,
     return;
   }
   // HLSL Change Ends.
-
   args.add(EmitAnyExprToTemp(E), type);
 }
 
@@ -3270,9 +3269,6 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
     SRetPtr = ReturnValue.getValue();
     if (!SRetPtr) {
       SRetPtr = CreateMemTemp(RetTy);
-      // HLSL Change begin.
-      CGM.getHLSLRuntime().MarkRetTemp(*this, SRetPtr, RetTy);
-      // HLSL Change end.
       if (HaveInsertPoint() && ReturnValue.isUnused()) {
         uint64_t size =
             CGM.getDataLayout().getTypeAllocSize(ConvertTypeForMem(RetTy));
@@ -3280,6 +3276,9 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
           UnusedReturnSize = size;
       }
     }
+    // HLSL Change begin.
+    CGM.getHLSLRuntime().MarkRetTemp(*this, SRetPtr, RetTy);
+    // HLSL Change end.
     if (IRFunctionArgs.hasSRetArg()) {
       IRCallArgs[IRFunctionArgs.getSRetArgNo()] = SRetPtr;
     } else {

+ 3 - 5
tools/clang/lib/CodeGen/CGHLSLMS.cpp

@@ -720,11 +720,9 @@ DxilResourceProperties CGMSHLSLRuntime::BuildResourceProperty(QualType resTy) {
   } break;
   case DXIL::ResourceClass::Sampler: {
     DxilSampler::SamplerKind kind = KeywordToSamplerKind(RD->getName());
-
-    RP.Class = DXIL::ResourceClass::Sampler;
-    RP.Kind = DXIL::ResourceKind::Sampler;
-    if (kind == DXIL::SamplerKind::Comparison)
-      RP.Kind = DXIL::ResourceKind::SamplerComparison;
+    DxilSampler Sampler;
+    Sampler.SetSamplerKind(kind);
+    RP = resource_helper::loadFromResourceBase(&Sampler);
   }
   default:
     break;

+ 15 - 0
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/annotateHandle.hlsl

@@ -0,0 +1,15 @@
+// RUN: %dxc -T ps_6_6 %s | %FileCheck %s
+
+// Make sure sampler and texture get correct annotateHandle.
+
+// CHECK-DAG:call %dx.types.Handle @dx.op.annotateHandle(i32 217, %dx.types.Handle {{.*}}, i8 0, i8 2, %dx.types.ResourceProperties { i32 9, i32 0 }
+// CHECK-DAG:call %dx.types.Handle @dx.op.annotateHandle(i32 217, %dx.types.Handle {{.*}}, i8 3, i8 14, %dx.types.ResourceProperties zeroinitializer
+
+SamplerState samplers : register(s0);
+SamplerState foo() { return samplers; }
+Texture2D t0 : register(t0);
+[RootSignature("DescriptorTable(SRV(t0)),DescriptorTable(Sampler(s0))")]
+float4 main( float2 uv : TEXCOORD ) : SV_TARGET {
+  float4 val = t0.Sample(foo(), uv);
+  return val;
+}