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/ast/storage_texture.h"
16
17 #include "src/ast/f32.h"
18 #include "src/ast/i32.h"
19 #include "src/ast/u32.h"
20 #include "src/program_builder.h"
21
22 TINT_INSTANTIATE_TYPEINFO(tint::ast::StorageTexture);
23
24 namespace tint {
25 namespace ast {
26
27 // Note, these names match the names in the WGSL spec. This behaviour is used
28 // in the WGSL writer to emit the texture format names.
operator <<(std::ostream & out,ImageFormat format)29 std::ostream& operator<<(std::ostream& out, ImageFormat format) {
30 switch (format) {
31 case ImageFormat::kNone:
32 out << "none";
33 break;
34 case ImageFormat::kR8Unorm:
35 out << "r8unorm";
36 break;
37 case ImageFormat::kR8Snorm:
38 out << "r8snorm";
39 break;
40 case ImageFormat::kR8Uint:
41 out << "r8uint";
42 break;
43 case ImageFormat::kR8Sint:
44 out << "r8sint";
45 break;
46 case ImageFormat::kR16Uint:
47 out << "r16uint";
48 break;
49 case ImageFormat::kR16Sint:
50 out << "r16sint";
51 break;
52 case ImageFormat::kR16Float:
53 out << "r16float";
54 break;
55 case ImageFormat::kRg8Unorm:
56 out << "rg8unorm";
57 break;
58 case ImageFormat::kRg8Snorm:
59 out << "rg8snorm";
60 break;
61 case ImageFormat::kRg8Uint:
62 out << "rg8uint";
63 break;
64 case ImageFormat::kRg8Sint:
65 out << "rg8sint";
66 break;
67 case ImageFormat::kR32Uint:
68 out << "r32uint";
69 break;
70 case ImageFormat::kR32Sint:
71 out << "r32sint";
72 break;
73 case ImageFormat::kR32Float:
74 out << "r32float";
75 break;
76 case ImageFormat::kRg16Uint:
77 out << "rg16uint";
78 break;
79 case ImageFormat::kRg16Sint:
80 out << "rg16sint";
81 break;
82 case ImageFormat::kRg16Float:
83 out << "rg16float";
84 break;
85 case ImageFormat::kRgba8Unorm:
86 out << "rgba8unorm";
87 break;
88 case ImageFormat::kRgba8UnormSrgb:
89 out << "rgba8unorm_srgb";
90 break;
91 case ImageFormat::kRgba8Snorm:
92 out << "rgba8snorm";
93 break;
94 case ImageFormat::kRgba8Uint:
95 out << "rgba8uint";
96 break;
97 case ImageFormat::kRgba8Sint:
98 out << "rgba8sint";
99 break;
100 case ImageFormat::kBgra8Unorm:
101 out << "bgra8unorm";
102 break;
103 case ImageFormat::kBgra8UnormSrgb:
104 out << "bgra8unorm_srgb";
105 break;
106 case ImageFormat::kRgb10A2Unorm:
107 out << "rgb10a2unorm";
108 break;
109 case ImageFormat::kRg11B10Float:
110 out << "rg11b10float";
111 break;
112 case ImageFormat::kRg32Uint:
113 out << "rg32uint";
114 break;
115 case ImageFormat::kRg32Sint:
116 out << "rg32sint";
117 break;
118 case ImageFormat::kRg32Float:
119 out << "rg32float";
120 break;
121 case ImageFormat::kRgba16Uint:
122 out << "rgba16uint";
123 break;
124 case ImageFormat::kRgba16Sint:
125 out << "rgba16sint";
126 break;
127 case ImageFormat::kRgba16Float:
128 out << "rgba16float";
129 break;
130 case ImageFormat::kRgba32Uint:
131 out << "rgba32uint";
132 break;
133 case ImageFormat::kRgba32Sint:
134 out << "rgba32sint";
135 break;
136 case ImageFormat::kRgba32Float:
137 out << "rgba32float";
138 break;
139 }
140 return out;
141 }
142
StorageTexture(ProgramID pid,const Source & src,TextureDimension d,ImageFormat fmt,const Type * subtype,Access ac)143 StorageTexture::StorageTexture(ProgramID pid,
144 const Source& src,
145 TextureDimension d,
146 ImageFormat fmt,
147 const Type* subtype,
148 Access ac)
149 : Base(pid, src, d), format(fmt), type(subtype), access(ac) {}
150
151 StorageTexture::StorageTexture(StorageTexture&&) = default;
152
153 StorageTexture::~StorageTexture() = default;
154
FriendlyName(const SymbolTable &) const155 std::string StorageTexture::FriendlyName(const SymbolTable&) const {
156 std::ostringstream out;
157 out << "texture_storage_" << dim << "<" << format << ", " << access << ">";
158 return out.str();
159 }
160
Clone(CloneContext * ctx) const161 const StorageTexture* StorageTexture::Clone(CloneContext* ctx) const {
162 // Clone arguments outside of create() call to have deterministic ordering
163 auto src = ctx->Clone(source);
164 auto* ty = ctx->Clone(type);
165 return ctx->dst->create<StorageTexture>(src, dim, format, ty, access);
166 }
167
SubtypeFor(ImageFormat format,ProgramBuilder & builder)168 Type* StorageTexture::SubtypeFor(ImageFormat format, ProgramBuilder& builder) {
169 switch (format) {
170 case ImageFormat::kR8Uint:
171 case ImageFormat::kR16Uint:
172 case ImageFormat::kRg8Uint:
173 case ImageFormat::kR32Uint:
174 case ImageFormat::kRg16Uint:
175 case ImageFormat::kRgba8Uint:
176 case ImageFormat::kRg32Uint:
177 case ImageFormat::kRgba16Uint:
178 case ImageFormat::kRgba32Uint: {
179 return builder.create<U32>();
180 }
181
182 case ImageFormat::kR8Sint:
183 case ImageFormat::kR16Sint:
184 case ImageFormat::kRg8Sint:
185 case ImageFormat::kR32Sint:
186 case ImageFormat::kRg16Sint:
187 case ImageFormat::kRgba8Sint:
188 case ImageFormat::kRg32Sint:
189 case ImageFormat::kRgba16Sint:
190 case ImageFormat::kRgba32Sint: {
191 return builder.create<I32>();
192 }
193
194 case ImageFormat::kR8Unorm:
195 case ImageFormat::kRg8Unorm:
196 case ImageFormat::kRgba8Unorm:
197 case ImageFormat::kRgba8UnormSrgb:
198 case ImageFormat::kBgra8Unorm:
199 case ImageFormat::kBgra8UnormSrgb:
200 case ImageFormat::kRgb10A2Unorm:
201 case ImageFormat::kR8Snorm:
202 case ImageFormat::kRg8Snorm:
203 case ImageFormat::kRgba8Snorm:
204 case ImageFormat::kR16Float:
205 case ImageFormat::kR32Float:
206 case ImageFormat::kRg16Float:
207 case ImageFormat::kRg11B10Float:
208 case ImageFormat::kRg32Float:
209 case ImageFormat::kRgba16Float:
210 case ImageFormat::kRgba32Float: {
211 return builder.create<F32>();
212 }
213
214 case ImageFormat::kNone:
215 break;
216 }
217
218 return nullptr;
219 }
220
221 } // namespace ast
222 } // namespace tint
223