[llvm] [SPIR-V] Fix OpTypeImage capability requirements for Vulkan (PR #192626)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 17 03:33:34 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-spir-v
Author: Arseniy Obolenskiy (aobolensk)
<details>
<summary>Changes</summary>
Emit StorageImageMultisample for 2D multisampled storage images and ImageMSArray for 2D multisampled arrayed images
---
Full diff: https://github.com/llvm/llvm-project/pull/192626.diff
2 Files Affected:
- (modified) llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp (+7-1)
- (modified) llvm/test/CodeGen/SPIRV/image_dim.ll (+41-3)
``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
index aec9b15df9189..ac4decc455c33 100644
--- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
@@ -965,7 +965,9 @@ void RequirementHandler::initAvailableCapabilitiesForVulkan(
Capability::StorageImageArrayDynamicIndexing,
Capability::DerivativeControl, Capability::MinLod,
Capability::ImageQuery, Capability::ImageGatherExtended,
- Capability::Addresses, Capability::VulkanMemoryModelKHR});
+ Capability::Addresses, Capability::VulkanMemoryModelKHR,
+ Capability::StorageImageMultisample,
+ Capability::ImageMSArray});
// Became core in Vulkan 1.2
if (ST.isAtLeastSPIRVVer(VersionTuple(1, 5))) {
@@ -1059,8 +1061,12 @@ static void addOpTypeImageReqs(const MachineInstr &MI,
break;
case SPIRV::Dim::DIM_2D:
if (IsMultisampled && NoSampler)
+ Reqs.addRequirements(SPIRV::Capability::StorageImageMultisample);
+ if (IsMultisampled && IsArrayed)
Reqs.addRequirements(SPIRV::Capability::ImageMSArray);
break;
+ case SPIRV::Dim::DIM_3D:
+ break;
case SPIRV::Dim::DIM_Cube:
Reqs.addRequirements(SPIRV::Capability::Shader);
if (IsArrayed)
diff --git a/llvm/test/CodeGen/SPIRV/image_dim.ll b/llvm/test/CodeGen/SPIRV/image_dim.ll
index 7c97e87bd4734..693e26a98455f 100644
--- a/llvm/test/CodeGen/SPIRV/image_dim.ll
+++ b/llvm/test/CodeGen/SPIRV/image_dim.ll
@@ -1,8 +1,46 @@
-; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
+; Test OpTypeImage dimension-based capability requirements.
+; target("spirv.Image", SampledType, Dim, Depth, Arrayed, MS, Sampled, Format)
-; CHECK-SPIRV-DAG: OpCapability Sampled1D
-; CHECK-SPIRV-DAG: OpCapability SampledBuffer
+; RUN: split-file %s %t
+;; OpenCL: 1D and Buffer sampled images require Sampled1D and SampledBuffer.
+; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %t/opencl.ll -o - | FileCheck %s --check-prefix=CHECK-OPENCL
+
+;; Vulkan: 2D multisampled storage images require StorageImageMultisample;
+;; 2D multisampled arrayed images additionally require ImageMSArray.
+;; 3D images require no extra capabilities.
+; RUN: llc -O0 -mtriple=spirv-vulkan-library %t/vulkan.ll -o - | FileCheck %s --check-prefix=CHECK-VULKAN
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-vulkan-library %t/vulkan.ll -o - -filetype=obj | spirv-val %}
+
+; CHECK-OPENCL-DAG: OpCapability Sampled1D
+; CHECK-OPENCL-DAG: OpCapability SampledBuffer
+
+; CHECK-VULKAN-DAG: OpCapability StorageImageMultisample
+; CHECK-VULKAN-DAG: OpCapability ImageMSArray
+; CHECK-VULKAN-NOT: OpCapability ImageCubeArray
+
+;--- opencl.ll
define spir_kernel void @test_image_dim(target("spirv.Image", void, 0, 0, 0, 0, 0, 0, 0) %image1d, target("spirv.Image", void, 5, 0, 0, 0, 0, 0, 0) %image1d_buffer) {
ret void
}
+
+;--- vulkan.ll
+define void @test_2d_ms_storage(
+ target("spirv.Image", float, 1, 0, 0, 1, 2, 3) %image2d_ms_storage
+) #0 {
+ ret void
+}
+
+define void @test_2d_ms_arrayed_storage(
+ target("spirv.Image", float, 1, 0, 1, 1, 2, 3) %image2d_ms_arrayed_storage
+) #0 {
+ ret void
+}
+
+define void @test_3d(
+ target("spirv.Image", float, 2, 0, 0, 0, 2, 3) %image3d_storage
+) #0 {
+ ret void
+}
+
+attributes #0 = { convergent noinline norecurse "frame-pointer"="all" }
``````````
</details>
https://github.com/llvm/llvm-project/pull/192626
More information about the llvm-commits
mailing list