blob: f987b962fabc5099ebdb870b989398bfd818b124 [file] [log] [blame]
//===-- SPIRVImageOps.td - MLIR SPIR-V Image Ops ------*- tablegen -*------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file contains image ops for the SPIR-V dialect. It corresponds
// to "3.37.10. Image Instructions" of the SPIR-V specification.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_DIALECT_SPIRV_IR_IMAGE_OPS
#define MLIR_DIALECT_SPIRV_IR_IMAGE_OPS
include "mlir/Dialect/SPIRV/IR/SPIRVBase.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
// -----
def SPV_ImageDrefGatherOp : SPV_Op<"ImageDrefGather", [NoSideEffect]> {
let summary = "Gathers the requested depth-comparison from four texels.";
let description = [{
Result Type must be a vector of four components of floating-point type
or integer type. Its components must be the same as Sampled Type of the
underlying OpTypeImage (unless that underlying Sampled Type is
OpTypeVoid). It has one component per gathered texel.
Sampled Image must be an object whose type is OpTypeSampledImage. Its
OpTypeImage must have a Dim of 2D, Cube, or Rect. The MS operand of the
underlying OpTypeImage must be 0.
Coordinate must be a scalar or vector of floating-point type. It
contains (u[, v] [, array layer]) as needed by the definition of
Sampled Image.
Dref is the depth-comparison reference value. It must be a 32-bit
floating-point type scalar.
Image Operands encodes what operands follow, as per Image Operands.
<!-- End of AutoGen section -->
```
image-operands ::= `"None"` | `"Bias"` | `"Lod"` | `"Grad"`
| `"ConstOffset"` | `"Offser"` | `"ConstOffsets"`
| `"Sample"` | `"MinLod"` | `"MakeTexelAvailable"`
| `"MakeTexelVisible"` | `"NonPrivateTexel"`
| `"VolatileTexel"` | `"SignExtend"` | `"ZeroExtend"`
#### Example:
```
```mlir
%0 = spv.ImageDrefGather %1 : !spv.sampled_image<!spv.image<i32, Dim2D, NoDepth, NonArrayed, SingleSampled, NoSampler, Unknown>>, %2 : vector<4xf32>, %3 : f32 -> vector<4xi32>
%0 = spv.ImageDrefGather %1 : !spv.sampled_image<!spv.image<i32, Dim2D, NoDepth, NonArrayed, SingleSampled, NoSampler, Unknown>>, %2 : vector<4xf32>, %3 : f32 ["NonPrivateTexel"] : f32, f32 -> vector<4xi32>
```
}];
let availability = [
MinVersion<SPV_V_1_0>,
MaxVersion<SPV_V_1_5>,
Extension<[]>,
Capability<[SPV_C_Shader]>
];
let arguments = (ins
SPV_AnySampledImage:$sampledimage,
SPV_ScalarOrVectorOf<SPV_Float>:$coordinate,
SPV_Float:$dref,
OptionalAttr<SPV_ImageOperandsAttr>:$imageoperands,
Variadic<SPV_Type>:$operand_arguments
);
let results = (outs
SPV_Vector:$result
);
let assemblyFormat = [{$sampledimage `:` type($sampledimage) `,`
$coordinate `:` type($coordinate) `,` $dref `:` type($dref)
custom<ImageOperands>($imageoperands)
( `(` $operand_arguments^ `:` type($operand_arguments) `)`)?
attr-dict
`->` type($result)}];
let verifier = [{ return ::verify(*this); }];
}
// -----
def SPV_ImageQuerySizeOp : SPV_Op<"ImageQuerySize", [NoSideEffect]> {
let summary = "Query the dimensions of Image, with no level of detail.";
let description = [{
Result Type must be an integer type scalar or vector. The number of
components must be:
1 for the 1D and Buffer dimensionalities,
2 for the 2D, Cube, and Rect dimensionalities,
3 for the 3D dimensionality,
plus 1 more if the image type is arrayed. This vector is filled in with
(width [, height] [, elements]) where elements is the number of layers
in an image array or the number of cubes in a cube-map array.
Image must be an object whose type is OpTypeImage. Its Dim operand must
be one of those listed under Result Type, above. Additionally, if its
Dim is 1D, 2D, 3D, or Cube, it must also have either an MS of 1 or a
Sampled of 0 or 2. There is no implicit level-of-detail consumed by this
instruction. See OpImageQuerySizeLod for querying images having level of
detail. This operation is allowed on an image decorated as NonReadable.
See the client API specification for additional image type restrictions.
<!-- End of AutoGen section -->
#### Example:
```mlir
%3 = spv.ImageQuerySize %0 : !spv.image<i32, Dim1D, NoDepth, NonArrayed, SingleSampled, NoSampler, Unknown> -> i32
%4 = spv.ImageQuerySize %1 : !spv.image<i32, Dim2D, NoDepth, NonArrayed, SingleSampled, NoSampler, Unknown> -> vector<2xi32>
%5 = spv.ImageQuerySize %2 : !spv.image<i32, Dim2D, NoDepth, Arrayed, SingleSampled, NoSampler, Unknown> -> vector<3xi32>
```
}];
let availability = [
MinVersion<SPV_V_1_0>,
MaxVersion<SPV_V_1_5>,
Extension<[]>,
Capability<[SPV_C_ImageQuery, SPV_C_Kernel]>
];
let arguments = (ins
SPV_AnyImage:$image
);
let results = (outs
SPV_ScalarOrVectorOf<SPV_Integer>:$result
);
let assemblyFormat = "attr-dict $image `:` type($image) `->` type($result)";
let verifier = [{return ::verify(*this);}];
}
// -----
def SPV_ImageOp : SPV_Op<"Image",
[NoSideEffect,
TypesMatchWith<"type of 'result' matches image type of 'sampledimage'",
"sampledimage", "result",
"$_self.cast<spirv::SampledImageType>().getImageType()">]> {
let summary = "Extract the image from a sampled image.";
let description = [{
Result Type must be OpTypeImage.
Sampled Image must have type OpTypeSampledImage whose Image Type is the
same as Result Type.
<!-- End of AutoGen section -->
#### Example:
```mlir
%0 = spv.Image %1 : !spv.sampled_image<!spv.image<f32, Cube, NoDepth, NonArrayed, SingleSampled, NoSampler, Unknown>>
```
}];
let arguments = (ins
SPV_AnySampledImage:$sampledimage
);
let results = (outs
SPV_AnyImage:$result
);
let assemblyFormat = "attr-dict $sampledimage `:` type($sampledimage)";
let verifier = ?;
}
#endif // MLIR_DIALECT_SPIRV_IR_GLSL_OPS