blob: c11357fe66f3a67c787355ac1f71433e63348e01 [file] [log] [blame]
Jamie Madill834e8b72014-04-11 13:33:58 -04001//
2// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// blocklayout.h:
7// Methods and classes related to uniform layout and packing in GLSL and HLSL.
8//
9
10#ifndef COMMON_BLOCKLAYOUT_H_
11#define COMMON_BLOCKLAYOUT_H_
12
Jamie Madill13cfd272014-07-17 14:16:28 -040013#include <cstddef>
Jamie Madill834e8b72014-04-11 13:33:58 -040014#include <vector>
Jamie Madill13cfd272014-07-17 14:16:28 -040015
Jamie Madillf51639a2014-06-25 16:04:57 -040016#include "angle_gl.h"
Vladimir Vukicevic24d8d672014-05-27 12:07:51 -040017#include <GLSLANG/ShaderLang.h>
Jamie Madill834e8b72014-04-11 13:33:58 -040018
Jamie Madillf2575982014-06-25 16:04:54 -040019namespace sh
Jamie Madill834e8b72014-04-11 13:33:58 -040020{
Jamie Madill834e8b72014-04-11 13:33:58 -040021struct ShaderVariable;
22struct InterfaceBlockField;
Jamie Madill834e8b72014-04-11 13:33:58 -040023struct Uniform;
24struct Varying;
Jamie Madillfc43d272014-07-11 17:02:02 -040025struct InterfaceBlock;
Jamie Madill834e8b72014-04-11 13:33:58 -040026
Jamie Madill9e0478f2015-01-13 11:13:54 -050027struct COMPILER_EXPORT BlockMemberInfo
Jamie Madille04a5b72014-07-18 10:33:12 -040028{
29 BlockMemberInfo(int offset, int arrayStride, int matrixStride, bool isRowMajorMatrix)
30 : offset(offset),
31 arrayStride(arrayStride),
32 matrixStride(matrixStride),
33 isRowMajorMatrix(isRowMajorMatrix)
34 {}
35
36 static BlockMemberInfo getDefaultBlockInfo()
37 {
38 return BlockMemberInfo(-1, -1, -1, false);
39 }
40
41 int offset;
42 int arrayStride;
43 int matrixStride;
44 bool isRowMajorMatrix;
45};
46
Jamie Madill9e0478f2015-01-13 11:13:54 -050047class COMPILER_EXPORT BlockLayoutEncoder
Jamie Madill834e8b72014-04-11 13:33:58 -040048{
49 public:
Jamie Madille04a5b72014-07-18 10:33:12 -040050 BlockLayoutEncoder();
Jamie Madill834e8b72014-04-11 13:33:58 -040051
Jamie Madilla6f267f2014-08-27 11:44:15 -040052 BlockMemberInfo encodeType(GLenum type, unsigned int arraySize, bool isRowMajorMatrix);
Jamie Madille04a5b72014-07-18 10:33:12 -040053
Jamie Madill834e8b72014-04-11 13:33:58 -040054 size_t getBlockSize() const { return mCurrentOffset * BytesPerComponent; }
Jamie Madillbf9cce22014-07-18 10:33:09 -040055 size_t getCurrentRegister() const { return mCurrentOffset / ComponentsPerRegister; }
56 size_t getCurrentElement() const { return mCurrentOffset % ComponentsPerRegister; }
Jamie Madill834e8b72014-04-11 13:33:58 -040057
Jamie Madille04a5b72014-07-18 10:33:12 -040058 virtual void enterAggregateType() = 0;
59 virtual void exitAggregateType() = 0;
60
Jamie Madill834e8b72014-04-11 13:33:58 -040061 static const size_t BytesPerComponent = 4u;
62 static const unsigned int ComponentsPerRegister = 4u;
63
Jamie Madill2857f482015-02-09 15:35:29 -050064 static size_t getBlockRegister(const BlockMemberInfo &info);
65 static size_t getBlockRegisterElement(const BlockMemberInfo &info);
66
Jamie Madill834e8b72014-04-11 13:33:58 -040067 protected:
68 size_t mCurrentOffset;
69
70 void nextRegister();
71
Jamie Madill834e8b72014-04-11 13:33:58 -040072 virtual void getBlockLayoutInfo(GLenum type, unsigned int arraySize, bool isRowMajorMatrix, int *arrayStrideOut, int *matrixStrideOut) = 0;
73 virtual void advanceOffset(GLenum type, unsigned int arraySize, bool isRowMajorMatrix, int arrayStride, int matrixStride) = 0;
Jamie Madill834e8b72014-04-11 13:33:58 -040074};
75
76// Block layout according to the std140 block layout
77// See "Standard Uniform Block Layout" in Section 2.11.6 of the OpenGL ES 3.0 specification
78
Jamie Madill9e0478f2015-01-13 11:13:54 -050079class COMPILER_EXPORT Std140BlockEncoder : public BlockLayoutEncoder
Jamie Madill834e8b72014-04-11 13:33:58 -040080{
81 public:
Jamie Madille04a5b72014-07-18 10:33:12 -040082 Std140BlockEncoder();
Jamie Madill834e8b72014-04-11 13:33:58 -040083
Jamie Madill834e8b72014-04-11 13:33:58 -040084 virtual void enterAggregateType();
85 virtual void exitAggregateType();
Jamie Madille04a5b72014-07-18 10:33:12 -040086
87 protected:
Jamie Madill834e8b72014-04-11 13:33:58 -040088 virtual void getBlockLayoutInfo(GLenum type, unsigned int arraySize, bool isRowMajorMatrix, int *arrayStrideOut, int *matrixStrideOut);
89 virtual void advanceOffset(GLenum type, unsigned int arraySize, bool isRowMajorMatrix, int arrayStride, int matrixStride);
90};
91
Jamie Madill834e8b72014-04-11 13:33:58 -040092}
93
94#endif // COMMON_BLOCKLAYOUT_H_