Skip to content

Commit 8bb3095

Browse files
[mlir][spirv]: Add ImageSupport in ABI Lowering (#150996)
Add support for generating shader arguments as global variables in the SPIR-V module when the argument in question is a SPIR-V image. Add lit tests to execute the new logic and check global variables are being generated. --------- Signed-off-by: Jack Frankland <[email protected]>
1 parent f73b0d0 commit 8bb3095

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

mlir/lib/Dialect/SPIRV/Transforms/LowerABIAttributesPass.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,17 @@ createGlobalVarForEntryPointArgument(OpBuilder &builder, spirv::FuncOp funcOp,
5858
spirv::PointerType::get(spirv::StructType::get(varType), *storageClass);
5959
}
6060
auto varPtrType = cast<spirv::PointerType>(varType);
61-
auto varPointeeType = cast<spirv::StructType>(varPtrType.getPointeeType());
61+
Type pointeeType = varPtrType.getPointeeType();
62+
63+
// Images are an opaque type and so we can just return a pointer to an image.
64+
// Note that currently only sampled images are supported in the SPIR-V
65+
// lowering.
66+
if (isa<spirv::SampledImageType>(pointeeType))
67+
return spirv::GlobalVariableOp::create(builder, funcOp.getLoc(), varType,
68+
varName, abiInfo.getDescriptorSet(),
69+
abiInfo.getBinding());
70+
71+
auto varPointeeType = cast<spirv::StructType>(pointeeType);
6272

6373
// Set the offset information.
6474
varPointeeType =

mlir/test/Dialect/SPIRV/Transforms/abi-interface.mlir

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,27 @@ spirv.module Logical GLSL450 attributes {spirv.target_env = #spirv.target_env<#s
6666
// CHECK: spirv.EntryPoint "GLCompute" [[FN]], [[VAR0]], [[VAR1]]
6767
// CHECK: spirv.ExecutionMode [[FN]] "LocalSize", 32, 1, 1
6868
} // end spirv.module
69+
70+
// -----
71+
72+
module {
73+
spirv.module Logical GLSL450 attributes {spirv.target_env = #spirv.target_env<#spirv.vce<v1.6, [Shader, Sampled1D], []>, #spirv.resource_limits<>>} {
74+
// CHECK-DAG: spirv.GlobalVariable @[[IMAGE_GV:.*]] bind(0, 0) : !spirv.ptr<!spirv.sampled_image<!spirv.image<f32, Dim1D, DepthUnknown, NonArrayed, SingleSampled, NeedSampler, R32f>>, UniformConstant>
75+
// CHECK: spirv.func @read_image
76+
spirv.func @read_image(%arg0: !spirv.ptr<!spirv.sampled_image<!spirv.image<f32, Dim1D, DepthUnknown, NonArrayed, SingleSampled, NeedSampler, R32f>>, UniformConstant> {spirv.interface_var_abi = #spirv.interface_var_abi<(0, 0)>}, %arg1: !spirv.ptr<!spirv.struct<(!spirv.array<1 x f32, stride=4> [0])>, StorageBuffer> {spirv.interface_var_abi = #spirv.interface_var_abi<(0, 1)>}) "None" attributes {spirv.entry_point_abi = #spirv.entry_point_abi<workgroup_size = [1, 1, 1]>} {
77+
// CHECK: %[[IMAGE_ADDR:.*]] = spirv.mlir.addressof @[[IMAGE_GV]] : !spirv.ptr<!spirv.sampled_image<!spirv.image<f32, Dim1D, DepthUnknown, NonArrayed, SingleSampled, NeedSampler, R32f>>, UniformConstant>
78+
%cst0_i32 = spirv.Constant 0 : i32
79+
// CHECK: spirv.Load "UniformConstant" %[[IMAGE_ADDR]]
80+
%0 = spirv.Load "UniformConstant" %arg0 : !spirv.sampled_image<!spirv.image<f32, Dim1D, DepthUnknown, NonArrayed, SingleSampled, NeedSampler, R32f>>
81+
%1 = spirv.Image %0 : !spirv.sampled_image<!spirv.image<f32, Dim1D, DepthUnknown, NonArrayed, SingleSampled, NeedSampler, R32f>>
82+
%2 = spirv.ImageFetch %1, %cst0_i32 : !spirv.image<f32, Dim1D, DepthUnknown, NonArrayed, SingleSampled, NeedSampler, R32f>, i32 -> vector<4xf32>
83+
%3 = spirv.CompositeExtract %2[0 : i32] : vector<4xf32>
84+
%cst0_i32_0 = spirv.Constant 0 : i32
85+
%cst0_i32_1 = spirv.Constant 0 : i32
86+
%cst1_i32 = spirv.Constant 1 : i32
87+
%4 = spirv.AccessChain %arg1[%cst0_i32_0, %cst0_i32] : !spirv.ptr<!spirv.struct<(!spirv.array<1 x f32, stride=4> [0])>, StorageBuffer>, i32, i32 -> !spirv.ptr<f32, StorageBuffer>
88+
spirv.Store "StorageBuffer" %4, %3 : f32
89+
spirv.Return
90+
}
91+
}
92+
}

0 commit comments

Comments
 (0)