// // Copyright 2020 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #ifndef COMPILER_TRANSLATOR_MSL_LAYOUT_H_ #define COMPILER_TRANSLATOR_MSL_LAYOUT_H_ #include "common/angleutils.h" #include "compiler/translator/Types.h" namespace sh { constexpr const auto kDefaultLayoutBlockStorage = TLayoutBlockStorage::EbsShared; constexpr const auto kDefaultLayoutMatrixPacking = TLayoutMatrixPacking::EmpColumnMajor; constexpr const auto kDefaultStructAlignmentSize = 16; // Returns `oldStorage` if `type` has unspecified block storage. // Otherwise returns block storage of `type`. TLayoutBlockStorage Overlay(TLayoutBlockStorage oldStorage, const TType &type); // Returns `oldPacking` if `type` has unspecified matrix packing. // Otherwise returns matrix packing of `type`. TLayoutMatrixPacking Overlay(TLayoutMatrixPacking oldPacking, const TType &type); // Returns whether or not it is permissable for the block storage to use a packed representation. bool CanBePacked(TLayoutBlockStorage storage); // Returns whether or not it is permissable for the layout qualifier to use a packed representation. bool CanBePacked(TLayoutQualifier layoutQualifier); // Returns whether or not it is permissable for the type to use a packed representation. bool CanBePacked(const TType &type); // Sets the block storage for a type. void SetBlockStorage(TType &type, TLayoutBlockStorage storage); // Contains `sizeof` and `alignof` information. struct Layout { size_t sizeOf; size_t alignOf; static Layout Identity() { return {0, 1}; } static Layout Invalid() { return {0, 0}; } static Layout Both(size_t n) { return {n, n}; } void requireAlignment(size_t align, bool pad); bool operator==(const Layout &other) const; void operator+=(const Layout &other); void operator*=(size_t scale); Layout operator+(const Layout &other) const; Layout operator*(size_t scale) const; }; struct MetalLayoutOfConfig { bool disablePacking = false; bool maskArray = false; bool treatSamplersAsTextureEnv = false; bool assumeStructsAreTailPadded = false; // Pad to multiple of 16 }; // Returns the layout of a type if it were to be represented in a Metal program. // This deliberately ignores the TLayoutBlockStorage and TLayoutMatrixPacking of any type. [[nodiscard]] Layout MetalLayoutOf(const TType &type, MetalLayoutOfConfig config = {}); // Returns the layout of a type if it were to be represented in a GLSL program. [[nodiscard]] Layout GlslLayoutOf( const TType &type, TLayoutBlockStorage storage = TLayoutBlockStorage::EbsUnspecified, TLayoutMatrixPacking matrixPacking = TLayoutMatrixPacking::EmpUnspecified, bool maskArray = false); // Returns the layout of a structure if it were to be represented in a GLSL program. [[nodiscard]] Layout GlslStructLayoutOf(TField const *const *begin, TField const *const *end, TLayoutBlockStorage storage, TLayoutMatrixPacking matrixPacking, bool maskArray = false); } // namespace sh #endif // COMPILER_TRANSLATOR_MSL_LAYOUT_H_