1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2023 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker // blocklayoutmetal.h: 7*8975f5c5SAndroid Build Coastguard Worker // Methods and classes related to uniform layout and packing in Metal 8*8975f5c5SAndroid Build Coastguard Worker // 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef COMMON_BLOCKLAYOUT_METAL__H_ 11*8975f5c5SAndroid Build Coastguard Worker #define COMMON_BLOCKLAYOUT_METAL__H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <cstddef> 14*8975f5c5SAndroid Build Coastguard Worker #include <map> 15*8975f5c5SAndroid Build Coastguard Worker #include <vector> 16*8975f5c5SAndroid Build Coastguard Worker 17*8975f5c5SAndroid Build Coastguard Worker #include <GLSLANG/ShaderLang.h> 18*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/blocklayout.h" 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard Worker namespace rx 22*8975f5c5SAndroid Build Coastguard Worker { 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard Worker namespace mtl 25*8975f5c5SAndroid Build Coastguard Worker { 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker size_t GetMetalSizeForGLType(GLenum type); 28*8975f5c5SAndroid Build Coastguard Worker size_t GetMetalAlignmentForGLType(GLenum type); 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard Worker size_t GetMTLBaseAlignment(GLenum variableType, bool isRowMajor); 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Worker class MetalAlignmentVisitor : public sh::ShaderVariableVisitor 33*8975f5c5SAndroid Build Coastguard Worker { 34*8975f5c5SAndroid Build Coastguard Worker public: 35*8975f5c5SAndroid Build Coastguard Worker MetalAlignmentVisitor() = default; 36*8975f5c5SAndroid Build Coastguard Worker void visitVariable(const sh::ShaderVariable &variable, bool isRowMajor) override; 37*8975f5c5SAndroid Build Coastguard Worker // This is in bytes rather than components. getBaseAlignment()38*8975f5c5SAndroid Build Coastguard Worker size_t getBaseAlignment() const { return mCurrentAlignment; } 39*8975f5c5SAndroid Build Coastguard Worker 40*8975f5c5SAndroid Build Coastguard Worker private: 41*8975f5c5SAndroid Build Coastguard Worker size_t mCurrentAlignment = 0; 42*8975f5c5SAndroid Build Coastguard Worker }; 43*8975f5c5SAndroid Build Coastguard Worker 44*8975f5c5SAndroid Build Coastguard Worker class BlockLayoutEncoderMTL : public sh::BlockLayoutEncoder 45*8975f5c5SAndroid Build Coastguard Worker { 46*8975f5c5SAndroid Build Coastguard Worker public: 47*8975f5c5SAndroid Build Coastguard Worker BlockLayoutEncoderMTL(); ~BlockLayoutEncoderMTL()48*8975f5c5SAndroid Build Coastguard Worker ~BlockLayoutEncoderMTL() override {} 49*8975f5c5SAndroid Build Coastguard Worker 50*8975f5c5SAndroid Build Coastguard Worker sh::BlockMemberInfo encodeType(GLenum type, 51*8975f5c5SAndroid Build Coastguard Worker const std::vector<unsigned int> &arraySizes, 52*8975f5c5SAndroid Build Coastguard Worker bool isRowMajorMatrix) override; 53*8975f5c5SAndroid Build Coastguard Worker // Advance the offset based on struct size and array dimensions. Size can be calculated with 54*8975f5c5SAndroid Build Coastguard Worker // getShaderVariableSize() or equivalent. |enterAggregateType|/|exitAggregateType| is necessary 55*8975f5c5SAndroid Build Coastguard Worker // around this call. 56*8975f5c5SAndroid Build Coastguard Worker sh::BlockMemberInfo encodeArrayOfPreEncodedStructs( 57*8975f5c5SAndroid Build Coastguard Worker size_t size, 58*8975f5c5SAndroid Build Coastguard Worker const std::vector<unsigned int> &arraySizes) override; 59*8975f5c5SAndroid Build Coastguard Worker 60*8975f5c5SAndroid Build Coastguard Worker size_t getCurrentOffset() const override; 61*8975f5c5SAndroid Build Coastguard Worker size_t getShaderVariableSize(const sh::ShaderVariable &structVar, bool isRowMajor) override; 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker // Called when entering/exiting a structure variable. 64*8975f5c5SAndroid Build Coastguard Worker void enterAggregateType(const sh::ShaderVariable &structVar) override; 65*8975f5c5SAndroid Build Coastguard Worker void exitAggregateType(const sh::ShaderVariable &structVar) override; 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker private: 68*8975f5c5SAndroid Build Coastguard Worker void getBlockLayoutInfo(GLenum type, 69*8975f5c5SAndroid Build Coastguard Worker const std::vector<unsigned int> &arraySizes, 70*8975f5c5SAndroid Build Coastguard Worker bool isRowMajorMatrix, 71*8975f5c5SAndroid Build Coastguard Worker int *arrayStrideOut, 72*8975f5c5SAndroid Build Coastguard Worker int *matrixStrideOut) override; 73*8975f5c5SAndroid Build Coastguard Worker void advanceOffset(GLenum type, 74*8975f5c5SAndroid Build Coastguard Worker const std::vector<unsigned int> &arraySizes, 75*8975f5c5SAndroid Build Coastguard Worker bool isRowMajorMatrix, 76*8975f5c5SAndroid Build Coastguard Worker int arrayStride, 77*8975f5c5SAndroid Build Coastguard Worker int matrixStride) override; 78*8975f5c5SAndroid Build Coastguard Worker 79*8975f5c5SAndroid Build Coastguard Worker size_t getBaseAlignment(const sh::ShaderVariable &variable) const; 80*8975f5c5SAndroid Build Coastguard Worker size_t getTypeBaseAlignment(GLenum type, bool isRowMajorMatrix) const; 81*8975f5c5SAndroid Build Coastguard Worker }; 82*8975f5c5SAndroid Build Coastguard Worker 83*8975f5c5SAndroid Build Coastguard Worker } // namespace mtl 84*8975f5c5SAndroid Build Coastguard Worker 85*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 86*8975f5c5SAndroid Build Coastguard Worker 87*8975f5c5SAndroid Build Coastguard Worker #endif // COMMON_BLOCKLAYOUT_METAL_H_ 88