blob: 311c9035b085485f5b422d3384b99d0b63031539 [file] [log] [blame]
Austin Engcc2516a2023-10-17 20:57:54 +00001// Copyright 2021 The Dawn & Tint Authors
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002//
Austin Engcc2516a2023-10-17 20:57:54 +00003// Redistribution and use in source and binary forms, with or without
4// modification, are permitted provided that the following conditions are met:
Ryan Harrisondbc13af2022-02-21 15:19:07 +00005//
Austin Engcc2516a2023-10-17 20:57:54 +00006// 1. Redistributions of source code must retain the above copyright notice, this
7// list of conditions and the following disclaimer.
Ryan Harrisondbc13af2022-02-21 15:19:07 +00008//
Austin Engcc2516a2023-10-17 20:57:54 +00009// 2. Redistributions in binary form must reproduce the above copyright notice,
10// this list of conditions and the following disclaimer in the documentation
11// and/or other materials provided with the distribution.
12//
13// 3. Neither the name of the copyright holder nor the names of its
14// contributors may be used to endorse or promote products derived from
15// this software without specific prior written permission.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
21// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Ryan Harrisondbc13af2022-02-21 15:19:07 +000027
dan sinclaird3b13692023-07-20 01:14:15 +000028#include "src/tint/lang/wgsl/sem/function.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000029
dan sinclair352f8c82023-07-21 00:40:07 +000030#include "src/tint/lang/core/type/depth_texture.h"
31#include "src/tint/lang/core/type/external_texture.h"
32#include "src/tint/lang/core/type/multisampled_texture.h"
33#include "src/tint/lang/core/type/sampled_texture.h"
34#include "src/tint/lang/core/type/storage_texture.h"
dan sinclair99181d82023-07-20 01:14:15 +000035#include "src/tint/lang/wgsl/ast/function.h"
36#include "src/tint/lang/wgsl/ast/identifier.h"
37#include "src/tint/lang/wgsl/ast/must_use_attribute.h"
dan sinclaird3b13692023-07-20 01:14:15 +000038#include "src/tint/lang/wgsl/sem/variable.h"
dan sinclair22b4dd22023-07-21 00:40:07 +000039#include "src/tint/utils/containers/transform.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000040
41TINT_INSTANTIATE_TYPEINFO(tint::sem::Function);
42
dan sinclairc990b3c2022-04-07 16:04:35 +000043namespace tint::sem {
Ben Clayton958a4642022-07-26 07:55:24 +000044
Ben Clayton63d0fab2023-03-06 15:43:16 +000045Function::Function(const ast::Function* declaration)
Ben Clayton36c61552023-08-08 07:58:19 +000046 : Base(core::EvaluationStage::kRuntime,
Ben Claytonb549b302023-02-22 16:18:22 +000047 ast::HasAttribute<ast::MustUseAttribute>(declaration->attributes)),
Ryan Harrisondbc13af2022-02-21 15:19:07 +000048 declaration_(declaration),
Ben Clayton63d0fab2023-03-06 15:43:16 +000049 workgroup_size_{1, 1, 1} {}
Ryan Harrisondbc13af2022-02-21 15:19:07 +000050
51Function::~Function() = default;
52
53std::vector<std::pair<const Variable*, const ast::LocationAttribute*>>
54Function::TransitivelyReferencedLocationVariables() const {
dan sinclair41e4d9a2022-05-01 14:40:55 +000055 std::vector<std::pair<const Variable*, const ast::LocationAttribute*>> ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000056
Ben Claytondcdf66e2022-06-17 12:48:51 +000057 for (auto* global : TransitivelyReferencedGlobals()) {
58 for (auto* attr : global->Declaration()->attributes) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000059 if (auto* location = attr->As<ast::LocationAttribute>()) {
Ben Claytondcdf66e2022-06-17 12:48:51 +000060 ret.push_back({global, location});
dan sinclair41e4d9a2022-05-01 14:40:55 +000061 break;
62 }
63 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000064 }
dan sinclair41e4d9a2022-05-01 14:40:55 +000065 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000066}
67
Ben Clayton535535b2023-10-09 15:14:34 +000068void Function::AddTransitivelyReferencedGlobal(const sem::GlobalVariable* global) {
69 if (transitively_referenced_globals_.Add(global)) {
70 for (auto* ref : global->TransitivelyReferencedOverrides()) {
71 AddTransitivelyReferencedGlobal(ref);
72 }
73 }
74}
75
dan sinclair41e4d9a2022-05-01 14:40:55 +000076Function::VariableBindings Function::TransitivelyReferencedUniformVariables() const {
77 VariableBindings ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000078
Ben Claytondcdf66e2022-06-17 12:48:51 +000079 for (auto* global : TransitivelyReferencedGlobals()) {
Ben Claytoncd52f382023-08-07 13:11:08 +000080 if (global->AddressSpace() != core::AddressSpace::kUniform) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000081 continue;
82 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000083
Ben Clayton65e38242023-11-09 19:37:44 +000084 if (auto bp = global->Attributes().binding_point) {
Ben Clayton5f4847c2023-04-19 13:24:27 +000085 ret.push_back({global, *bp});
dan sinclair41e4d9a2022-05-01 14:40:55 +000086 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000087 }
dan sinclair41e4d9a2022-05-01 14:40:55 +000088 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000089}
90
dan sinclair41e4d9a2022-05-01 14:40:55 +000091Function::VariableBindings Function::TransitivelyReferencedStorageBufferVariables() const {
92 VariableBindings ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000093
Ben Claytondcdf66e2022-06-17 12:48:51 +000094 for (auto* global : TransitivelyReferencedGlobals()) {
Ben Claytoncd52f382023-08-07 13:11:08 +000095 if (global->AddressSpace() != core::AddressSpace::kStorage) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000096 continue;
97 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +000098
Ben Clayton65e38242023-11-09 19:37:44 +000099 if (auto bp = global->Attributes().binding_point) {
Ben Clayton5f4847c2023-04-19 13:24:27 +0000100 ret.push_back({global, *bp});
dan sinclair41e4d9a2022-05-01 14:40:55 +0000101 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000102 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000103 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000104}
105
106std::vector<std::pair<const Variable*, const ast::BuiltinAttribute*>>
107Function::TransitivelyReferencedBuiltinVariables() const {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000108 std::vector<std::pair<const Variable*, const ast::BuiltinAttribute*>> ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000109
Ben Claytondcdf66e2022-06-17 12:48:51 +0000110 for (auto* global : TransitivelyReferencedGlobals()) {
111 for (auto* attr : global->Declaration()->attributes) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000112 if (auto* builtin = attr->As<ast::BuiltinAttribute>()) {
Ben Claytondcdf66e2022-06-17 12:48:51 +0000113 ret.push_back({global, builtin});
dan sinclair41e4d9a2022-05-01 14:40:55 +0000114 break;
115 }
116 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000117 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000118 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000119}
120
dan sinclair41e4d9a2022-05-01 14:40:55 +0000121Function::VariableBindings Function::TransitivelyReferencedSamplerVariables() const {
dan sinclaircedcdf32023-08-10 02:39:48 +0000122 return TransitivelyReferencedSamplerVariablesImpl(core::type::SamplerKind::kSampler);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000123}
124
dan sinclair41e4d9a2022-05-01 14:40:55 +0000125Function::VariableBindings Function::TransitivelyReferencedComparisonSamplerVariables() const {
dan sinclaircedcdf32023-08-10 02:39:48 +0000126 return TransitivelyReferencedSamplerVariablesImpl(core::type::SamplerKind::kComparisonSampler);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000127}
128
dan sinclair41e4d9a2022-05-01 14:40:55 +0000129Function::VariableBindings Function::TransitivelyReferencedSampledTextureVariables() const {
130 return TransitivelyReferencedSampledTextureVariablesImpl(false);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000131}
132
dan sinclair41e4d9a2022-05-01 14:40:55 +0000133Function::VariableBindings Function::TransitivelyReferencedMultisampledTextureVariables() const {
134 return TransitivelyReferencedSampledTextureVariablesImpl(true);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000135}
136
137Function::VariableBindings Function::TransitivelyReferencedVariablesOfType(
dan sinclairbae54e72023-07-28 15:01:54 +0000138 const tint::TypeInfo* type) const {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000139 VariableBindings ret;
Ben Claytondcdf66e2022-06-17 12:48:51 +0000140 for (auto* global : TransitivelyReferencedGlobals()) {
141 auto* unwrapped_type = global->Type()->UnwrapRef();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000142 if (unwrapped_type->TypeInfo().Is(type)) {
Ben Clayton65e38242023-11-09 19:37:44 +0000143 if (auto bp = global->Attributes().binding_point) {
Ben Clayton5f4847c2023-04-19 13:24:27 +0000144 ret.push_back({global, *bp});
dan sinclair41e4d9a2022-05-01 14:40:55 +0000145 }
146 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000147 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000148 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000149}
150
151bool Function::HasAncestorEntryPoint(Symbol symbol) const {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000152 for (const auto* point : ancestor_entry_points_) {
Ben Claytonce31d182023-02-09 10:34:14 +0000153 if (point->Declaration()->name->symbol == symbol) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000154 return true;
155 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000156 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000157 return false;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000158}
159
160Function::VariableBindings Function::TransitivelyReferencedSamplerVariablesImpl(
dan sinclaircedcdf32023-08-10 02:39:48 +0000161 core::type::SamplerKind kind) const {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000162 VariableBindings ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000163
Ben Claytondcdf66e2022-06-17 12:48:51 +0000164 for (auto* global : TransitivelyReferencedGlobals()) {
165 auto* unwrapped_type = global->Type()->UnwrapRef();
dan sinclaircedcdf32023-08-10 02:39:48 +0000166 auto* sampler = unwrapped_type->As<core::type::Sampler>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000167 if (sampler == nullptr || sampler->kind() != kind) {
168 continue;
169 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000170
Ben Clayton65e38242023-11-09 19:37:44 +0000171 if (auto bp = global->Attributes().binding_point) {
Ben Clayton5f4847c2023-04-19 13:24:27 +0000172 ret.push_back({global, *bp});
dan sinclair41e4d9a2022-05-01 14:40:55 +0000173 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000174 }
dan sinclair41e4d9a2022-05-01 14:40:55 +0000175 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000176}
177
dan sinclair41e4d9a2022-05-01 14:40:55 +0000178Function::VariableBindings Function::TransitivelyReferencedSampledTextureVariablesImpl(
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000179 bool multisampled) const {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000180 VariableBindings ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000181
Ben Claytondcdf66e2022-06-17 12:48:51 +0000182 for (auto* global : TransitivelyReferencedGlobals()) {
183 auto* unwrapped_type = global->Type()->UnwrapRef();
dan sinclaircedcdf32023-08-10 02:39:48 +0000184 auto* texture = unwrapped_type->As<core::type::Texture>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000185 if (texture == nullptr) {
186 continue;
187 }
188
dan sinclaircedcdf32023-08-10 02:39:48 +0000189 auto is_multisampled = texture->Is<core::type::MultisampledTexture>();
190 auto is_sampled = texture->Is<core::type::SampledTexture>();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000191
192 if ((multisampled && !is_multisampled) || (!multisampled && !is_sampled)) {
193 continue;
194 }
195
Ben Clayton65e38242023-11-09 19:37:44 +0000196 if (auto bp = global->Attributes().binding_point) {
Ben Clayton5f4847c2023-04-19 13:24:27 +0000197 ret.push_back({global, *bp});
dan sinclair41e4d9a2022-05-01 14:40:55 +0000198 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000199 }
200
dan sinclair41e4d9a2022-05-01 14:40:55 +0000201 return ret;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000202}
203
Ben Clayton8be957f2024-01-29 16:00:36 +0000204void Function::SetDiagnosticSeverity(wgsl::DiagnosticRule rule, wgsl::DiagnosticSeverity severity) {
205 diagnostic_severities_.Add(rule, severity);
206}
207
dan sinclairc990b3c2022-04-07 16:04:35 +0000208} // namespace tint::sem