@@ -42,6 +42,36 @@ static LogicalResult verifyImageOperands(Operation *imageOp,
42
42
// The order we process operands is important. In case of multiple argument
43
43
// taking operands, the arguments are ordered starting with operands having
44
44
// smaller-numbered bits first.
45
+ if (spirv::bitEnumContainsAny (attr.getValue (), spirv::ImageOperands::Bias)) {
46
+ if (!isa<spirv::ImplicitLodOpInterface>(imageOp))
47
+ return imageOp->emitError (
48
+ " Bias is only valid with implicit-lod instructions" );
49
+
50
+ if (index + 1 > operands.size ())
51
+ return imageOp->emitError (" Bias operand requires 1 argument" );
52
+
53
+ if (!isa<FloatType>(operands[index].getType ()))
54
+ return imageOp->emitError (" Bias must be a floating-point type scalar" );
55
+
56
+ auto samplingOp = cast<spirv::SamplingOpInterface>(imageOp);
57
+ auto sampledImageType =
58
+ cast<spirv::SampledImageType>(samplingOp.getSampledImage ().getType ());
59
+ auto imageType = cast<spirv::ImageType>(sampledImageType.getImageType ());
60
+
61
+ if (!llvm::is_contained ({spirv::Dim::Dim1D, spirv::Dim::Dim2D,
62
+ spirv::Dim::Dim3D, spirv::Dim::Cube},
63
+ imageType.getDim ()))
64
+ return imageOp->emitError (
65
+ " Bias must only be used with an image type that has "
66
+ " a dim operand of 1D, 2D, 3D, or Cube" );
67
+
68
+ if (imageType.getSamplingInfo () != spirv::ImageSamplingInfo::SingleSampled)
69
+ return imageOp->emitError (" Bias must only be used with an image type "
70
+ " that has a MS operand of 0" );
71
+
72
+ ++index;
73
+ }
74
+
45
75
if (spirv::bitEnumContainsAny (attr.getValue (), spirv::ImageOperands::Lod)) {
46
76
if (!isa<spirv::ExplicitLodOpInterface>(imageOp) &&
47
77
!isa<spirv::FetchOpInterface>(imageOp))
@@ -74,12 +104,13 @@ static LogicalResult verifyImageOperands(Operation *imageOp,
74
104
if (!llvm::is_contained ({spirv::Dim::Dim1D, spirv::Dim::Dim2D,
75
105
spirv::Dim::Dim3D, spirv::Dim::Cube},
76
106
imageType.getDim ()))
77
- return imageOp->emitError (" Lod only be used with an image type that has "
78
- " a dim operand of 1D, 2D, 3D, or Cube" );
107
+ return imageOp->emitError (
108
+ " Lod must only be used with an image type that has "
109
+ " a dim operand of 1D, 2D, 3D, or Cube" );
79
110
80
111
if (imageType.getSamplingInfo () != spirv::ImageSamplingInfo::SingleSampled)
81
- return imageOp->emitError (
82
- " Lod only be used with an image type that has a MS operand of 0" );
112
+ return imageOp->emitError (" Lod must only be used with an image type that "
113
+ " has a MS operand of 0" );
83
114
84
115
++index;
85
116
}
@@ -99,8 +130,8 @@ static LogicalResult verifyImageOperands(Operation *imageOp,
99
130
auto imageType = cast<spirv::ImageType>(sampledImageType.getImageType ());
100
131
101
132
if (imageType.getSamplingInfo () != spirv::ImageSamplingInfo::SingleSampled)
102
- return imageOp->emitError (
103
- " Grad only be used with an image type that has a MS operand of 0" );
133
+ return imageOp->emitError (" Grad must only be used with an image type "
134
+ " that has a MS operand of 0" );
104
135
105
136
int64_t numberOfComponents = 0 ;
106
137
@@ -147,10 +178,9 @@ static LogicalResult verifyImageOperands(Operation *imageOp,
147
178
148
179
// TODO: Add the validation rules for the following Image Operands.
149
180
spirv::ImageOperands noSupportOperands =
150
- spirv::ImageOperands::Bias | spirv::ImageOperands::ConstOffset |
151
- spirv::ImageOperands::Offset | spirv::ImageOperands::ConstOffsets |
152
- spirv::ImageOperands::Sample | spirv::ImageOperands::MinLod |
153
- spirv::ImageOperands::MakeTexelAvailable |
181
+ spirv::ImageOperands::ConstOffset | spirv::ImageOperands::Offset |
182
+ spirv::ImageOperands::ConstOffsets | spirv::ImageOperands::Sample |
183
+ spirv::ImageOperands::MinLod | spirv::ImageOperands::MakeTexelAvailable |
154
184
spirv::ImageOperands::MakeTexelVisible |
155
185
spirv::ImageOperands::SignExtend | spirv::ImageOperands::ZeroExtend;
156
186
0 commit comments