Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(938)

Side by Side Diff: src/sksl/ir/SkSLType.h

Issue 2509673002: Revert of added support for push_constant layout (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/sksl/ir/SkSLModifiers.h ('k') | tests/SkSLErrorTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SKIASL_TYPE 8 #ifndef SKIASL_TYPE
9 #define SKIASL_TYPE 9 #define SKIASL_TYPE
10 10
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 bool isMultisampled() const { 231 bool isMultisampled() const {
232 ASSERT(fTypeKind == kSampler_Kind); 232 ASSERT(fTypeKind == kSampler_Kind);
233 return fIsMultisampled; 233 return fIsMultisampled;
234 } 234 }
235 235
236 bool isSampled() const { 236 bool isSampled() const {
237 ASSERT(fTypeKind == kSampler_Kind); 237 ASSERT(fTypeKind == kSampler_Kind);
238 return fIsSampled; 238 return fIsSampled;
239 } 239 }
240 240
241 static size_t vector_alignment(size_t componentSize, int columns) {
242 return componentSize * (columns + columns % 2);
243 }
244
241 /** 245 /**
246 * Returns the type's required alignment (when putting this type into a stru ct, the offset must
247 * be a multiple of the alignment).
248 */
249 size_t alignment() const {
250 // See OpenGL Spec 7.6.2.2 Standard Uniform Block Layout
251 switch (fTypeKind) {
252 case kScalar_Kind:
253 return this->size();
254 case kVector_Kind:
255 return vector_alignment(fComponentType->size(), fColumns);
256 case kMatrix_Kind:
257 return (vector_alignment(fComponentType->size(), fRows) + 15) & ~15;
258 case kArray_Kind:
259 // round up to next multiple of 16
260 return (fComponentType->alignment() + 15) & ~15;
261 case kStruct_Kind: {
262 size_t result = 16;
263 for (size_t i = 0; i < fFields.size(); i++) {
264 size_t alignment = fFields[i].fType->alignment();
265 if (alignment > result) {
266 result = alignment;
267 }
268 }
269 }
270 default:
271 ABORT(("cannot determine size of type " + fName).c_str());
272 }
273 }
274
275 /**
276 * For matrices and arrays, returns the number of bytes from the start of on e entry (row, in
277 * the case of matrices) to the start of the next.
278 */
279 size_t stride() const {
280 switch (fTypeKind) {
281 case kMatrix_Kind: // fall through
282 case kArray_Kind:
283 return this->alignment();
284 default:
285 ABORT("type does not have a stride");
286 }
287 }
288
289 /**
290 * Returns the size of this type in bytes.
291 */
292 size_t size() const {
293 switch (fTypeKind) {
294 case kScalar_Kind:
295 // FIXME need to take precision into account, once we figure out how we want to
296 // handle it...
297 return 4;
298 case kVector_Kind:
299 return fColumns * fComponentType->size();
300 case kMatrix_Kind:
301 return vector_alignment(fComponentType->size(), fRows) * fColumn s;
302 case kArray_Kind:
303 return fColumns * this->stride();
304 case kStruct_Kind: {
305 size_t total = 0;
306 for (size_t i = 0; i < fFields.size(); i++) {
307 size_t alignment = fFields[i].fType->alignment();
308 if (total % alignment != 0) {
309 total += alignment - total % alignment;
310 }
311 ASSERT(false);
312 ASSERT(total % alignment == 0);
313 total += fFields[i].fType->size();
314 }
315 return total;
316 }
317 default:
318 ABORT(("cannot determine size of type " + fName).c_str());
319 }
320 }
321
322 /**
242 * Returns the corresponding vector or matrix type with the specified number of columns and 323 * Returns the corresponding vector or matrix type with the specified number of columns and
243 * rows. 324 * rows.
244 */ 325 */
245 const Type& toCompound(const Context& context, int columns, int rows) const; 326 const Type& toCompound(const Context& context, int columns, int rows) const;
246 327
247 private: 328 private:
248 typedef Symbol INHERITED; 329 typedef Symbol INHERITED;
249 330
250 const Kind fTypeKind; 331 const Kind fTypeKind;
251 const bool fIsNumber = false; 332 const bool fIsNumber = false;
252 const Type* fComponentType = nullptr; 333 const Type* fComponentType = nullptr;
253 const std::vector<const Type*> fCoercibleTypes; 334 const std::vector<const Type*> fCoercibleTypes;
254 const int fColumns = -1; 335 const int fColumns = -1;
255 const int fRows = -1; 336 const int fRows = -1;
256 const std::vector<Field> fFields; 337 const std::vector<Field> fFields;
257 const SpvDim_ fDimensions = SpvDim1D; 338 const SpvDim_ fDimensions = SpvDim1D;
258 const bool fIsDepth = false; 339 const bool fIsDepth = false;
259 const bool fIsArrayed = false; 340 const bool fIsArrayed = false;
260 const bool fIsMultisampled = false; 341 const bool fIsMultisampled = false;
261 const bool fIsSampled = false; 342 const bool fIsSampled = false;
262 }; 343 };
263 344
264 } // namespace 345 } // namespace
265 346
266 #endif 347 #endif
OLDNEW
« no previous file with comments | « src/sksl/ir/SkSLModifiers.h ('k') | tests/SkSLErrorTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698