| OLD | NEW |
| 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 |
| 11 #include "SkSLModifiers.h" | 11 #include "SkSLModifiers.h" |
| 12 #include "SkSLSymbol.h" | 12 #include "SkSLSymbol.h" |
| 13 #include "../SkSLPosition.h" | 13 #include "../SkSLPosition.h" |
| 14 #include "../SkSLUtil.h" | 14 #include "../SkSLUtil.h" |
| 15 #include "../spirv.h" | 15 #include "../spirv.h" |
| 16 #include <vector> | 16 #include <vector> |
| 17 #include <memory> | 17 #include <memory> |
| 18 | 18 |
| 19 namespace SkSL { | 19 namespace SkSL { |
| 20 | 20 |
| 21 class Context; | 21 class Context; |
| 22 | 22 |
| 23 /** | 23 /** |
| 24 * Represents a type, such as int or vec4. | 24 * Represents a type, such as int or vec4. |
| 25 */ | 25 */ |
| 26 class Type : public Symbol { | 26 class Type : public Symbol { |
| 27 public: | 27 public: |
| 28 struct Field { | 28 struct Field { |
| 29 Field(Modifiers modifiers, std::string name, const Type& type) | 29 Field(Modifiers modifiers, std::string name, const Type* type) |
| 30 : fModifiers(modifiers) | 30 : fModifiers(modifiers) |
| 31 , fName(std::move(name)) | 31 , fName(std::move(name)) |
| 32 , fType(std::move(type)) {} | 32 , fType(std::move(type)) {} |
| 33 | 33 |
| 34 const std::string description() const { | 34 const std::string description() const { |
| 35 return fType.description() + " " + fName + ";"; | 35 return fType->description() + " " + fName + ";"; |
| 36 } | 36 } |
| 37 | 37 |
| 38 const Modifiers fModifiers; | 38 Modifiers fModifiers; |
| 39 const std::string fName; | 39 std::string fName; |
| 40 const Type& fType; | 40 const Type* fType; |
| 41 }; | 41 }; |
| 42 | 42 |
| 43 enum Kind { | 43 enum Kind { |
| 44 kScalar_Kind, | 44 kScalar_Kind, |
| 45 kVector_Kind, | 45 kVector_Kind, |
| 46 kMatrix_Kind, | 46 kMatrix_Kind, |
| 47 kArray_Kind, | 47 kArray_Kind, |
| 48 kStruct_Kind, | 48 kStruct_Kind, |
| 49 kGeneric_Kind, | 49 kGeneric_Kind, |
| 50 kSampler_Kind, | 50 kSampler_Kind, |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 case kVector_Kind: | 252 case kVector_Kind: |
| 253 return vector_alignment(fComponentType->size(), fColumns); | 253 return vector_alignment(fComponentType->size(), fColumns); |
| 254 case kMatrix_Kind: | 254 case kMatrix_Kind: |
| 255 return (vector_alignment(fComponentType->size(), fRows) + 15) &
~15; | 255 return (vector_alignment(fComponentType->size(), fRows) + 15) &
~15; |
| 256 case kArray_Kind: | 256 case kArray_Kind: |
| 257 // round up to next multiple of 16 | 257 // round up to next multiple of 16 |
| 258 return (fComponentType->alignment() + 15) & ~15; | 258 return (fComponentType->alignment() + 15) & ~15; |
| 259 case kStruct_Kind: { | 259 case kStruct_Kind: { |
| 260 size_t result = 16; | 260 size_t result = 16; |
| 261 for (size_t i = 0; i < fFields.size(); i++) { | 261 for (size_t i = 0; i < fFields.size(); i++) { |
| 262 size_t alignment = fFields[i].fType.alignment(); | 262 size_t alignment = fFields[i].fType->alignment(); |
| 263 if (alignment > result) { | 263 if (alignment > result) { |
| 264 result = alignment; | 264 result = alignment; |
| 265 } | 265 } |
| 266 } | 266 } |
| 267 } | 267 } |
| 268 default: | 268 default: |
| 269 ABORT(("cannot determine size of type " + fName).c_str()); | 269 ABORT(("cannot determine size of type " + fName).c_str()); |
| 270 } | 270 } |
| 271 } | 271 } |
| 272 | 272 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 295 return 4; | 295 return 4; |
| 296 case kVector_Kind: | 296 case kVector_Kind: |
| 297 return fColumns * fComponentType->size(); | 297 return fColumns * fComponentType->size(); |
| 298 case kMatrix_Kind: | 298 case kMatrix_Kind: |
| 299 return vector_alignment(fComponentType->size(), fRows) * fColumn
s; | 299 return vector_alignment(fComponentType->size(), fRows) * fColumn
s; |
| 300 case kArray_Kind: | 300 case kArray_Kind: |
| 301 return fColumns * this->stride(); | 301 return fColumns * this->stride(); |
| 302 case kStruct_Kind: { | 302 case kStruct_Kind: { |
| 303 size_t total = 0; | 303 size_t total = 0; |
| 304 for (size_t i = 0; i < fFields.size(); i++) { | 304 for (size_t i = 0; i < fFields.size(); i++) { |
| 305 size_t alignment = fFields[i].fType.alignment(); | 305 size_t alignment = fFields[i].fType->alignment(); |
| 306 if (total % alignment != 0) { | 306 if (total % alignment != 0) { |
| 307 total += alignment - total % alignment; | 307 total += alignment - total % alignment; |
| 308 } | 308 } |
| 309 ASSERT(false); | 309 ASSERT(false); |
| 310 ASSERT(total % alignment == 0); | 310 ASSERT(total % alignment == 0); |
| 311 total += fFields[i].fType.size(); | 311 total += fFields[i].fType->size(); |
| 312 } | 312 } |
| 313 return total; | 313 return total; |
| 314 } | 314 } |
| 315 default: | 315 default: |
| 316 ABORT(("cannot determine size of type " + fName).c_str()); | 316 ABORT(("cannot determine size of type " + fName).c_str()); |
| 317 } | 317 } |
| 318 } | 318 } |
| 319 | 319 |
| 320 /** | 320 /** |
| 321 * Returns the corresponding vector or matrix type with the specified number
of columns and | 321 * Returns the corresponding vector or matrix type with the specified number
of columns and |
| 322 * rows. | 322 * rows. |
| 323 */ | 323 */ |
| 324 const Type& toCompound(const Context& context, int columns, int rows) const; | 324 const Type& toCompound(const Context& context, int columns, int rows) const; |
| 325 | 325 |
| 326 private: | 326 private: |
| 327 typedef Symbol INHERITED; | 327 typedef Symbol INHERITED; |
| 328 | 328 |
| 329 const Kind fTypeKind; | 329 const Kind fTypeKind; |
| 330 const bool fIsNumber = false; | 330 const bool fIsNumber = false; |
| 331 const Type* fComponentType = nullptr; | 331 const Type* fComponentType = nullptr; |
| 332 const std::vector<const Type*> fCoercibleTypes = { }; | 332 const std::vector<const Type*> fCoercibleTypes; |
| 333 const int fColumns = -1; | 333 const int fColumns = -1; |
| 334 const int fRows = -1; | 334 const int fRows = -1; |
| 335 const std::vector<Field> fFields = { }; | 335 const std::vector<Field> fFields; |
| 336 const SpvDim_ fDimensions = SpvDim1D; | 336 const SpvDim_ fDimensions = SpvDim1D; |
| 337 const bool fIsDepth = false; | 337 const bool fIsDepth = false; |
| 338 const bool fIsArrayed = false; | 338 const bool fIsArrayed = false; |
| 339 const bool fIsMultisampled = false; | 339 const bool fIsMultisampled = false; |
| 340 const bool fIsSampled = false; | 340 const bool fIsSampled = false; |
| 341 }; | 341 }; |
| 342 | 342 |
| 343 } // namespace | 343 } // namespace |
| 344 | 344 |
| 345 #endif | 345 #endif |
| OLD | NEW |