Browse Source

Support static global resource. (#105)

Xiang Li 8 years ago
parent
commit
2ab6ca4359

+ 5 - 5
lib/HLSL/DxilGenerationPass.cpp

@@ -412,11 +412,11 @@ public:
     std::unordered_map<Instruction *, Value *> handleMap;
     std::unordered_map<Instruction *, Value *> handleMap;
     GenerateDxilResourceHandles(handleMap);
     GenerateDxilResourceHandles(handleMap);
     GenerateDxilCBufferHandles(handleMap);
     GenerateDxilCBufferHandles(handleMap);
-    if (NotOptimized || m_HasDbgInfo) {
-      // For module which not promote mem2reg.
-      // Add local resource load to handle map.
-      MapLocalDxilResourceHandles(handleMap);
-    }
+
+    // Map local or static global resource to global resource.
+    // Require inline for static global resource.
+    MapLocalDxilResourceHandles(handleMap);
+
     // Take care phi node of resource.
     // Take care phi node of resource.
     AddCreateHandleForPhiNode(handleMap, m_pHLModule->GetOP());
     AddCreateHandleForPhiNode(handleMap, m_pHLModule->GetOP());
 
 

+ 19 - 0
tools/clang/test/CodeGenHLSL/static_resource.hlsl

@@ -0,0 +1,19 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// CHECK: @main
+
+float4 Tex2D(Texture2D<float4> t,
+  SamplerState s, float2 c) {
+  return t.Sample(s, c);
+}
+
+SamplerState g_ss;
+Texture2D<float4> g_texture;
+
+static SamplerState s = g_ss;
+static Texture2D<float4> t = g_texture;
+
+float4 main(float2 c: T) : SV_Target {
+
+  return Tex2D(t, s, c);
+}

+ 21 - 0
tools/clang/test/CodeGenHLSL/static_resource2.hlsl

@@ -0,0 +1,21 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// CHECK: @main
+
+float4 Tex2D(Texture2D<float4> t,
+  SamplerState s, float2 c) {
+  return t.Sample(s, c);
+}
+
+SamplerState g_ss;
+Texture2D<float4> g_texture;
+
+static struct {
+  SamplerState s;
+  Texture2D<float4> t;
+} RES = { g_ss, g_texture };
+
+float4 main(float2 c: T) : SV_Target {
+
+  return Tex2D(RES.t, RES.s, c);
+}

+ 10 - 0
tools/clang/unittests/HLSL/CompilerTest.cpp

@@ -501,6 +501,8 @@ public:
   TEST_METHOD(CodeGenSrv_Typed_Load2)
   TEST_METHOD(CodeGenSrv_Typed_Load2)
   TEST_METHOD(CodeGenStaticGlobals)
   TEST_METHOD(CodeGenStaticGlobals)
   TEST_METHOD(CodeGenStaticGlobals2)
   TEST_METHOD(CodeGenStaticGlobals2)
+  TEST_METHOD(CodeGenStaticResource)
+  TEST_METHOD(CodeGenStaticResource2)
   TEST_METHOD(CodeGenStruct_Buf1)
   TEST_METHOD(CodeGenStruct_Buf1)
   TEST_METHOD(CodeGenStruct_BufHasCounter)
   TEST_METHOD(CodeGenStruct_BufHasCounter)
   TEST_METHOD(CodeGenStruct_BufHasCounter2)
   TEST_METHOD(CodeGenStruct_BufHasCounter2)
@@ -2662,6 +2664,14 @@ TEST_F(CompilerTest, CodeGenStaticGlobals2) {
   CodeGenTest(L"..\\CodeGenHLSL\\staticGlobals2.hlsl");
   CodeGenTest(L"..\\CodeGenHLSL\\staticGlobals2.hlsl");
 }
 }
 
 
+TEST_F(CompilerTest, CodeGenStaticResource) {
+  CodeGenTest(L"..\\CodeGenHLSL\\static_resource.hlsl");
+}
+
+TEST_F(CompilerTest, CodeGenStaticResource2) {
+  CodeGenTest(L"..\\CodeGenHLSL\\static_resource2.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenStruct_Buf1) {
 TEST_F(CompilerTest, CodeGenStruct_Buf1) {
   CodeGenTest(L"..\\CodeGenHLSL\\struct_buf1.hlsl");
   CodeGenTest(L"..\\CodeGenHLSL\\struct_buf1.hlsl");
 }
 }