• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 The Tint Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/sem/intrinsic.h"
16 
17 #include <vector>
18 
19 #include "src/utils/to_const_ptr_vec.h"
20 
21 TINT_INSTANTIATE_TYPEINFO(tint::sem::Intrinsic);
22 
23 namespace tint {
24 namespace sem {
25 
str() const26 const char* Intrinsic::str() const {
27   return sem::str(type_);
28 }
29 
IsCoarseDerivativeIntrinsic(IntrinsicType i)30 bool IsCoarseDerivativeIntrinsic(IntrinsicType i) {
31   return i == IntrinsicType::kDpdxCoarse || i == IntrinsicType::kDpdyCoarse ||
32          i == IntrinsicType::kFwidthCoarse;
33 }
34 
IsFineDerivativeIntrinsic(IntrinsicType i)35 bool IsFineDerivativeIntrinsic(IntrinsicType i) {
36   return i == IntrinsicType::kDpdxFine || i == IntrinsicType::kDpdyFine ||
37          i == IntrinsicType::kFwidthFine;
38 }
39 
IsDerivativeIntrinsic(IntrinsicType i)40 bool IsDerivativeIntrinsic(IntrinsicType i) {
41   return i == IntrinsicType::kDpdx || i == IntrinsicType::kDpdy ||
42          i == IntrinsicType::kFwidth || IsCoarseDerivativeIntrinsic(i) ||
43          IsFineDerivativeIntrinsic(i);
44 }
45 
IsFloatClassificationIntrinsic(IntrinsicType i)46 bool IsFloatClassificationIntrinsic(IntrinsicType i) {
47   return i == IntrinsicType::kIsFinite || i == IntrinsicType::kIsInf ||
48          i == IntrinsicType::kIsNan || i == IntrinsicType::kIsNormal;
49 }
50 
IsTextureIntrinsic(IntrinsicType i)51 bool IsTextureIntrinsic(IntrinsicType i) {
52   return IsImageQueryIntrinsic(i) || i == IntrinsicType::kTextureLoad ||
53          i == IntrinsicType::kTextureGather ||
54          i == IntrinsicType::kTextureGatherCompare ||
55          i == IntrinsicType::kTextureSample ||
56          i == IntrinsicType::kTextureSampleLevel ||
57          i == IntrinsicType::kTextureSampleBias ||
58          i == IntrinsicType::kTextureSampleCompare ||
59          i == IntrinsicType::kTextureSampleCompareLevel ||
60          i == IntrinsicType::kTextureSampleGrad ||
61          i == IntrinsicType::kTextureStore;
62 }
63 
IsImageQueryIntrinsic(IntrinsicType i)64 bool IsImageQueryIntrinsic(IntrinsicType i) {
65   return i == IntrinsicType::kTextureDimensions ||
66          i == IntrinsicType::kTextureNumLayers ||
67          i == IntrinsicType::kTextureNumLevels ||
68          i == IntrinsicType::kTextureNumSamples;
69 }
70 
IsDataPackingIntrinsic(IntrinsicType i)71 bool IsDataPackingIntrinsic(IntrinsicType i) {
72   return i == IntrinsicType::kPack4x8snorm ||
73          i == IntrinsicType::kPack4x8unorm ||
74          i == IntrinsicType::kPack2x16snorm ||
75          i == IntrinsicType::kPack2x16unorm ||
76          i == IntrinsicType::kPack2x16float;
77 }
78 
IsDataUnpackingIntrinsic(IntrinsicType i)79 bool IsDataUnpackingIntrinsic(IntrinsicType i) {
80   return i == IntrinsicType::kUnpack4x8snorm ||
81          i == IntrinsicType::kUnpack4x8unorm ||
82          i == IntrinsicType::kUnpack2x16snorm ||
83          i == IntrinsicType::kUnpack2x16unorm ||
84          i == IntrinsicType::kUnpack2x16float;
85 }
86 
IsBarrierIntrinsic(IntrinsicType i)87 bool IsBarrierIntrinsic(IntrinsicType i) {
88   return i == IntrinsicType::kWorkgroupBarrier ||
89          i == IntrinsicType::kStorageBarrier;
90 }
91 
IsAtomicIntrinsic(IntrinsicType i)92 bool IsAtomicIntrinsic(IntrinsicType i) {
93   return i == sem::IntrinsicType::kAtomicLoad ||
94          i == sem::IntrinsicType::kAtomicStore ||
95          i == sem::IntrinsicType::kAtomicAdd ||
96          i == sem::IntrinsicType::kAtomicSub ||
97          i == sem::IntrinsicType::kAtomicMax ||
98          i == sem::IntrinsicType::kAtomicMin ||
99          i == sem::IntrinsicType::kAtomicAnd ||
100          i == sem::IntrinsicType::kAtomicOr ||
101          i == sem::IntrinsicType::kAtomicXor ||
102          i == sem::IntrinsicType::kAtomicExchange ||
103          i == sem::IntrinsicType::kAtomicCompareExchangeWeak;
104 }
105 
Intrinsic(IntrinsicType type,const sem::Type * return_type,std::vector<Parameter * > parameters,PipelineStageSet supported_stages,bool is_deprecated)106 Intrinsic::Intrinsic(IntrinsicType type,
107                      const sem::Type* return_type,
108                      std::vector<Parameter*> parameters,
109                      PipelineStageSet supported_stages,
110                      bool is_deprecated)
111     : Base(return_type, utils::ToConstPtrVec(parameters)),
112       type_(type),
113       supported_stages_(supported_stages),
114       is_deprecated_(is_deprecated) {
115   for (auto* parameter : parameters) {
116     parameter->SetOwner(this);
117   }
118 }
119 
120 Intrinsic::~Intrinsic() = default;
121 
IsCoarseDerivative() const122 bool Intrinsic::IsCoarseDerivative() const {
123   return IsCoarseDerivativeIntrinsic(type_);
124 }
125 
IsFineDerivative() const126 bool Intrinsic::IsFineDerivative() const {
127   return IsFineDerivativeIntrinsic(type_);
128 }
129 
IsDerivative() const130 bool Intrinsic::IsDerivative() const {
131   return IsDerivativeIntrinsic(type_);
132 }
133 
IsFloatClassification() const134 bool Intrinsic::IsFloatClassification() const {
135   return IsFloatClassificationIntrinsic(type_);
136 }
137 
IsTexture() const138 bool Intrinsic::IsTexture() const {
139   return IsTextureIntrinsic(type_);
140 }
141 
IsImageQuery() const142 bool Intrinsic::IsImageQuery() const {
143   return IsImageQueryIntrinsic(type_);
144 }
145 
IsDataPacking() const146 bool Intrinsic::IsDataPacking() const {
147   return IsDataPackingIntrinsic(type_);
148 }
149 
IsDataUnpacking() const150 bool Intrinsic::IsDataUnpacking() const {
151   return IsDataUnpackingIntrinsic(type_);
152 }
153 
IsBarrier() const154 bool Intrinsic::IsBarrier() const {
155   return IsBarrierIntrinsic(type_);
156 }
157 
IsAtomic() const158 bool Intrinsic::IsAtomic() const {
159   return IsAtomicIntrinsic(type_);
160 }
161 
162 }  // namespace sem
163 }  // namespace tint
164