瀏覽代碼

[spirv] fix CheckAccessFullyMapped without sampler (#2257)

Fixes #2256
Jaebaek Seo 6 年之前
父節點
當前提交
d052dd245d

+ 3 - 2
tools/clang/lib/SPIRV/CapabilityVisitor.cpp

@@ -325,8 +325,8 @@ bool CapabilityVisitor::visit(SpirvDecoration *decor) {
       break;
     }
     case spv::BuiltIn::FragSizeEXT: {
-      addExtension(Extension::EXT_fragment_invocation_density,
-                   "SV_ShadingRate", loc);
+      addExtension(Extension::EXT_fragment_invocation_density, "SV_ShadingRate",
+                   loc);
       addCapability(spv::Capability::FragmentDensityEXT);
       break;
     }
@@ -381,6 +381,7 @@ bool CapabilityVisitor::visit(SpirvImageSparseTexelsResident *instr) {
   addCapabilityForType(instr->getResultType(), instr->getSourceLocation(),
                        instr->getStorageClass());
   addCapability(spv::Capability::ImageGatherExtended);
+  addCapability(spv::Capability::SparseResidency);
   return true;
 }
 

+ 15 - 0
tools/clang/test/CodeGenSPIRV/intrinsics.check-access-fully-mapped.without-sampler.hlsl

@@ -0,0 +1,15 @@
+// Run: %dxc -T ps_6_0 -E main
+
+// This test checks if capability visitor emits SparseResidency capability
+// correctly when OpImageSparseTexelsResident is used.
+
+// CHECK: OpCapability SparseResidency
+
+void main() {
+  uint status;
+
+// CHECK: [[residency_code:%\d+]] = OpLoad %uint %status
+// CHECK:         [[result:%\d+]] = OpImageSparseTexelsResident %bool [[residency_code]]
+// CHECK:                           OpStore %result [[result]]
+  bool result = CheckAccessFullyMapped(status);
+}

+ 4 - 3
tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp

@@ -1065,6 +1065,9 @@ TEST_F(FileTest, IntrinsicsAbort) {
 TEST_F(FileTest, IntrinsicsCheckAccessFullyMapped) {
   runFileTest("intrinsics.check-access-fully-mapped.hlsl");
 }
+TEST_F(FileTest, IntrinsicsCheckAccessFullyMappedWithoutSampler) {
+  runFileTest("intrinsics.check-access-fully-mapped.without-sampler.hlsl");
+}
 TEST_F(FileTest, IntrinsicsGetRenderTargetSampleCount) {
   runFileTest("intrinsics.get-render-target-sample-count.hlsl",
               Expect::Failure);
@@ -1982,9 +1985,7 @@ TEST_F(FileTest, VulkanShaderRecordBufferNVOffset) {
   // Checks the behavior of [[vk::offset]] with [[vk::shader_record_nv]]
   runFileTest("vk.shader-record-nv.offset.hlsl");
 }
-TEST_F(FileTest, VulkanShadingRate) {
-  runFileTest("vk.shading-rate.hlsl");
-}
+TEST_F(FileTest, VulkanShadingRate) { runFileTest("vk.shading-rate.hlsl"); }
 TEST_F(FileTest, VulkanShadingRateError) {
   runFileTest("vk.shading-rate.vs-error.hlsl", Expect::Failure);
 }