blob: 85f8591e87c3735b4bea70d2593b48b37cf988f9 [file] [log] [blame]
//
// Copyright 2023 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.
//
// blocklayoutmetal.h:
// Methods and classes related to uniform layout and packing in Metal
//
#ifndef COMMON_BLOCKLAYOUT_METAL__H_
#define COMMON_BLOCKLAYOUT_METAL__H_
#include <cstddef>
#include <map>
#include <vector>
#include <GLSLANG/ShaderLang.h>
#include "angle_gl.h"
#include "compiler/translator/blocklayout.h"
namespace rx
{
namespace mtl
{
size_t GetMetalSizeForGLType(GLenum type);
size_t GetMetalAlignmentForGLType(GLenum type);
size_t GetMTLBaseAlignment(GLenum variableType, bool isRowMajor);
class MetalAlignmentVisitor : public sh::ShaderVariableVisitor
{
public:
MetalAlignmentVisitor() = default;
void visitVariable(const sh::ShaderVariable &variable, bool isRowMajor) override;
// This is in bytes rather than components.
size_t getBaseAlignment() const { return mCurrentAlignment; }
private:
size_t mCurrentAlignment = 0;
};
class BlockLayoutEncoderMTL : public sh::BlockLayoutEncoder
{
public:
BlockLayoutEncoderMTL();
~BlockLayoutEncoderMTL() override {}
sh::BlockMemberInfo encodeType(GLenum type,
const std::vector<unsigned int> &arraySizes,
bool isRowMajorMatrix) override;
// Advance the offset based on struct size and array dimensions. Size can be calculated with
// getShaderVariableSize() or equivalent. |enterAggregateType|/|exitAggregateType| is necessary
// around this call.
sh::BlockMemberInfo encodeArrayOfPreEncodedStructs(
size_t size,
const std::vector<unsigned int> &arraySizes) override;
size_t getCurrentOffset() const override;
size_t getShaderVariableSize(const sh::ShaderVariable &structVar, bool isRowMajor) override;
// Called when entering/exiting a structure variable.
void enterAggregateType(const sh::ShaderVariable &structVar) override;
void exitAggregateType(const sh::ShaderVariable &structVar) override;
private:
void getBlockLayoutInfo(GLenum type,
const std::vector<unsigned int> &arraySizes,
bool isRowMajorMatrix,
int *arrayStrideOut,
int *matrixStrideOut) override;
void advanceOffset(GLenum type,
const std::vector<unsigned int> &arraySizes,
bool isRowMajorMatrix,
int arrayStride,
int matrixStride) override;
size_t getBaseAlignment(const sh::ShaderVariable &variable) const;
size_t getTypeBaseAlignment(GLenum type, bool isRowMajorMatrix) const;
};
} // namespace mtl
} // namespace rx
#endif // COMMON_BLOCKLAYOUT_METAL_H_