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 |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 |
OLD | NEW |