• 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/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