xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/metal/blocklayoutMetal.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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