blob: 790933b94a6c302516d1e3dd5b88cc72bcc41f52 [file] [log] [blame]
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001// Copyright 2021 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/tint/sem/function.h"
16
17#include "src/tint/ast/function.h"
Ben Clayton01004b72022-04-28 18:49:04 +000018#include "src/tint/sem/depth_texture.h"
19#include "src/tint/sem/external_texture.h"
20#include "src/tint/sem/multisampled_texture.h"
21#include "src/tint/sem/sampled_texture.h"
22#include "src/tint/sem/storage_texture.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000023#include "src/tint/sem/variable.h"
24#include "src/tint/utils/to_const_ptr_vec.h"
25
26TINT_INSTANTIATE_TYPEINFO(tint::sem::Function);
27
dan sinclairc990b3c2022-04-07 16:04:35 +000028namespace tint::sem {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000029
30Function::Function(const ast::Function* declaration,
31 Type* return_type,
32 std::vector<Parameter*> parameters)
33 : Base(return_type, utils::ToConstPtrVec(parameters)),
34 declaration_(declaration),
dan sinclair41e4d9a2022-05-01 14:40:55 +000035 workgroup_size_{WorkgroupDimension{1}, WorkgroupDimension{1}, WorkgroupDimension{1}} {
36 for (auto* parameter : parameters) {
37 parameter->SetOwner(this);
38 }
dan sinclairc990b3c2022-04-07 16:04:35 +000039}
Ryan Harrisondbc13af2022-02-21 15:19:07 +000040
41Function::~Function() = default;
42
43std::vector<std::pair<const Variable*, const ast::LocationAttribute*>>
44Function::TransitivelyReferencedLocationVariables() const {
dan sinclair41e4d9a2022-05-01 14:40:55 +000045 std::vector<std::pair<const Variable*, const ast::LocationAttribute*>> ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000046
dan sinclair41e4d9a2022-05-01 14:40:55 +000047 for (auto* var : TransitivelyReferencedGlobals()) {
48 for (auto* attr : var->Declaration()->attributes) {
49 if (auto* location = attr->As<ast::LocationAttribute>()) {
50 ret.push_back({var, location});
51 break;
52 }
53 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000054 }
dan sinclair41e4d9a2022-05-01 14:40:55 +000055 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000056}
57
dan sinclair41e4d9a2022-05-01 14:40:55 +000058Function::VariableBindings Function::TransitivelyReferencedUniformVariables() const {
59 VariableBindings ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000060
dan sinclair41e4d9a2022-05-01 14:40:55 +000061 for (auto* var : TransitivelyReferencedGlobals()) {
62 if (var->StorageClass() != ast::StorageClass::kUniform) {
63 continue;
64 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000065
dan sinclair41e4d9a2022-05-01 14:40:55 +000066 if (auto binding_point = var->Declaration()->BindingPoint()) {
67 ret.push_back({var, binding_point});
68 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000069 }
dan sinclair41e4d9a2022-05-01 14:40:55 +000070 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000071}
72
dan sinclair41e4d9a2022-05-01 14:40:55 +000073Function::VariableBindings Function::TransitivelyReferencedStorageBufferVariables() const {
74 VariableBindings ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000075
dan sinclair41e4d9a2022-05-01 14:40:55 +000076 for (auto* var : TransitivelyReferencedGlobals()) {
77 if (var->StorageClass() != ast::StorageClass::kStorage) {
78 continue;
79 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000080
dan sinclair41e4d9a2022-05-01 14:40:55 +000081 if (auto binding_point = var->Declaration()->BindingPoint()) {
82 ret.push_back({var, binding_point});
83 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000084 }
dan sinclair41e4d9a2022-05-01 14:40:55 +000085 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000086}
87
88std::vector<std::pair<const Variable*, const ast::BuiltinAttribute*>>
89Function::TransitivelyReferencedBuiltinVariables() const {
dan sinclair41e4d9a2022-05-01 14:40:55 +000090 std::vector<std::pair<const Variable*, const ast::BuiltinAttribute*>> ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000091
dan sinclair41e4d9a2022-05-01 14:40:55 +000092 for (auto* var : TransitivelyReferencedGlobals()) {
93 for (auto* attr : var->Declaration()->attributes) {
94 if (auto* builtin = attr->As<ast::BuiltinAttribute>()) {
95 ret.push_back({var, builtin});
96 break;
97 }
98 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000099 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000100 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000101}
102
dan sinclair41e4d9a2022-05-01 14:40:55 +0000103Function::VariableBindings Function::TransitivelyReferencedSamplerVariables() const {
104 return TransitivelyReferencedSamplerVariablesImpl(ast::SamplerKind::kSampler);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000105}
106
dan sinclair41e4d9a2022-05-01 14:40:55 +0000107Function::VariableBindings Function::TransitivelyReferencedComparisonSamplerVariables() const {
108 return TransitivelyReferencedSamplerVariablesImpl(ast::SamplerKind::kComparisonSampler);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000109}
110
dan sinclair41e4d9a2022-05-01 14:40:55 +0000111Function::VariableBindings Function::TransitivelyReferencedSampledTextureVariables() const {
112 return TransitivelyReferencedSampledTextureVariablesImpl(false);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000113}
114
dan sinclair41e4d9a2022-05-01 14:40:55 +0000115Function::VariableBindings Function::TransitivelyReferencedMultisampledTextureVariables() const {
116 return TransitivelyReferencedSampledTextureVariablesImpl(true);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000117}
118
119Function::VariableBindings Function::TransitivelyReferencedVariablesOfType(
120 const tint::TypeInfo* type) const {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000121 VariableBindings ret;
122 for (auto* var : TransitivelyReferencedGlobals()) {
123 auto* unwrapped_type = var->Type()->UnwrapRef();
124 if (unwrapped_type->TypeInfo().Is(type)) {
125 if (auto binding_point = var->Declaration()->BindingPoint()) {
126 ret.push_back({var, binding_point});
127 }
128 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000129 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000130 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000131}
132
133bool Function::HasAncestorEntryPoint(Symbol symbol) const {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000134 for (const auto* point : ancestor_entry_points_) {
135 if (point->Declaration()->symbol == symbol) {
136 return true;
137 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000138 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000139 return false;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000140}
141
142Function::VariableBindings Function::TransitivelyReferencedSamplerVariablesImpl(
143 ast::SamplerKind kind) const {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000144 VariableBindings ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000145
dan sinclair41e4d9a2022-05-01 14:40:55 +0000146 for (auto* var : TransitivelyReferencedGlobals()) {
147 auto* unwrapped_type = var->Type()->UnwrapRef();
148 auto* sampler = unwrapped_type->As<sem::Sampler>();
149 if (sampler == nullptr || sampler->kind() != kind) {
150 continue;
151 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000152
dan sinclair41e4d9a2022-05-01 14:40:55 +0000153 if (auto binding_point = var->Declaration()->BindingPoint()) {
154 ret.push_back({var, binding_point});
155 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000156 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000157 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000158}
159
dan sinclair41e4d9a2022-05-01 14:40:55 +0000160Function::VariableBindings Function::TransitivelyReferencedSampledTextureVariablesImpl(
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000161 bool multisampled) const {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000162 VariableBindings ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000163
dan sinclair41e4d9a2022-05-01 14:40:55 +0000164 for (auto* var : TransitivelyReferencedGlobals()) {
165 auto* unwrapped_type = var->Type()->UnwrapRef();
166 auto* texture = unwrapped_type->As<sem::Texture>();
167 if (texture == nullptr) {
168 continue;
169 }
170
171 auto is_multisampled = texture->Is<sem::MultisampledTexture>();
172 auto is_sampled = texture->Is<sem::SampledTexture>();
173
174 if ((multisampled && !is_multisampled) || (!multisampled && !is_sampled)) {
175 continue;
176 }
177
178 if (auto binding_point = var->Declaration()->BindingPoint()) {
179 ret.push_back({var, binding_point});
180 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000181 }
182
dan sinclair41e4d9a2022-05-01 14:40:55 +0000183 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000184}
185
dan sinclairc990b3c2022-04-07 16:04:35 +0000186} // namespace tint::sem