1 //===- TargetAndABI.h - SPIR-V target and ABI utilities  --------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file declares utilities for SPIR-V target and shader interface ABI.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef MLIR_DIALECT_SPIRV_TARGETANDABI_H
14 #define MLIR_DIALECT_SPIRV_TARGETANDABI_H
15 
16 #include "mlir/Dialect/SPIRV/SPIRVAttributes.h"
17 #include "mlir/Support/LLVM.h"
18 #include "llvm/ADT/SmallSet.h"
19 
20 namespace mlir {
21 class Operation;
22 
23 namespace spirv {
24 enum class StorageClass : uint32_t;
25 
26 /// A wrapper class around a spirv::TargetEnvAttr to provide query methods for
27 /// allowed version/capabilities/extensions.
28 class TargetEnv {
29 public:
30   explicit TargetEnv(TargetEnvAttr targetAttr);
31 
32   Version getVersion() const;
33 
34   /// Returns true if the given capability is allowed.
35   bool allows(Capability) const;
36   /// Returns the first allowed one if any of the given capabilities is allowed.
37   /// Returns llvm::None otherwise.
38   Optional<Capability> allows(ArrayRef<Capability>) const;
39 
40   /// Returns true if the given extension is allowed.
41   bool allows(Extension) const;
42   /// Returns the first allowed one if any of the given extensions is allowed.
43   /// Returns llvm::None otherwise.
44   Optional<Extension> allows(ArrayRef<Extension>) const;
45 
46   /// Returns the vendor ID.
47   Vendor getVendorID() const;
48 
49   /// Returns the device type.
50   DeviceType getDeviceType() const;
51 
52   /// Returns the device ID.
53   uint32_t getDeviceID() const;
54 
55   /// Returns the MLIRContext.
56   MLIRContext *getContext() const;
57 
58   /// Returns the target resource limits.
59   ResourceLimitsAttr getResourceLimits() const;
60 
getAttr()61   TargetEnvAttr getAttr() const { return targetAttr; }
62 
63   /// Allows implicity converting to the underlying spirv::TargetEnvAttr.
TargetEnvAttr()64   operator TargetEnvAttr() const { return targetAttr; }
65 
66 private:
67   TargetEnvAttr targetAttr;
68   llvm::SmallSet<Extension, 4> givenExtensions;    /// Allowed extensions
69   llvm::SmallSet<Capability, 8> givenCapabilities; /// Allowed capabilities
70 };
71 
72 /// Returns the attribute name for specifying argument ABI information.
73 StringRef getInterfaceVarABIAttrName();
74 
75 /// Gets the InterfaceVarABIAttr given its fields.
76 InterfaceVarABIAttr getInterfaceVarABIAttr(unsigned descriptorSet,
77                                            unsigned binding,
78                                            Optional<StorageClass> storageClass,
79                                            MLIRContext *context);
80 
81 /// Returns whether the given SPIR-V target (described by TargetEnvAttr) needs
82 /// ABI attributes for interface variables (spv.interface_var_abi).
83 bool needsInterfaceVarABIAttrs(TargetEnvAttr targetAttr);
84 
85 /// Returns the attribute name for specifying entry point information.
86 StringRef getEntryPointABIAttrName();
87 
88 /// Gets the EntryPointABIAttr given its fields.
89 EntryPointABIAttr getEntryPointABIAttr(ArrayRef<int32_t> localSize,
90                                        MLIRContext *context);
91 
92 /// Queries the entry point ABI on the nearest function-like op containing the
93 /// given `op`. Returns null attribute if not found.
94 EntryPointABIAttr lookupEntryPointABI(Operation *op);
95 
96 /// Queries the local workgroup size from entry point ABI on the nearest
97 /// function-like op containing the given `op`. Returns null attribute if not
98 /// found.
99 DenseIntElementsAttr lookupLocalWorkGroupSize(Operation *op);
100 
101 /// Returns a default resource limits attribute that uses numbers from
102 /// "Table 46. Required Limits" of the Vulkan spec.
103 ResourceLimitsAttr getDefaultResourceLimits(MLIRContext *context);
104 
105 /// Returns the attribute name for specifying SPIR-V target environment.
106 StringRef getTargetEnvAttrName();
107 
108 /// Returns the default target environment: SPIR-V 1.0 with Shader capability
109 /// and no extra extensions.
110 TargetEnvAttr getDefaultTargetEnv(MLIRContext *context);
111 
112 /// Queries the target environment recursively from enclosing symbol table ops
113 /// containing the given `op`.
114 TargetEnvAttr lookupTargetEnv(Operation *op);
115 
116 /// Queries the target environment recursively from enclosing symbol table ops
117 /// containing the given `op` or returns the default target environment as
118 /// returned by getDefaultTargetEnv() if not provided.
119 TargetEnvAttr lookupTargetEnvOrDefault(Operation *op);
120 
121 /// Returns addressing model selected based on target environment.
122 AddressingModel getAddressingModel(TargetEnvAttr targetAttr);
123 
124 /// Returns execution model selected based on target environment.
125 /// Returns failure if it cannot be selected.
126 FailureOr<ExecutionModel> getExecutionModel(TargetEnvAttr targetAttr);
127 
128 /// Returns memory model selected based on target environment.
129 /// Returns failure if it cannot be selected.
130 FailureOr<MemoryModel> getMemoryModel(TargetEnvAttr targetAttr);
131 
132 } // namespace spirv
133 } // namespace mlir
134 
135 #endif // MLIR_DIALECT_SPIRV_TARGETANDABI_H
136