blob: 33090a9bf5acace4e8d5d4d91cadaf55439941ef [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.cpp:
7// Implementation for block layout classes and methods.
8//
9
Jamie Madill9e0478f2015-01-13 11:13:54 -050010#include "compiler/translator/blocklayout.h"
11
Jamie Madill834e8b72014-04-11 13:33:58 -040012#include "common/mathutil.h"
13#include "common/utilities.h"
14
Jamie Madillf2575982014-06-25 16:04:54 -040015namespace sh
Jamie Madill834e8b72014-04-11 13:33:58 -040016{
17
Jamie Madilld7b1ab52016-12-12 14:42:19 -050018BlockLayoutEncoder::BlockLayoutEncoder() : mCurrentOffset(0)
Jamie Madill834e8b72014-04-11 13:33:58 -040019{
20}
21
Jamie Madilld7b1ab52016-12-12 14:42:19 -050022BlockMemberInfo BlockLayoutEncoder::encodeType(GLenum type,
23 unsigned int arraySize,
24 bool isRowMajorMatrix)
Jamie Madill834e8b72014-04-11 13:33:58 -040025{
26 int arrayStride;
27 int matrixStride;
28
29 getBlockLayoutInfo(type, arraySize, isRowMajorMatrix, &arrayStride, &matrixStride);
30
Cooper Partin4d61f7e2015-08-12 10:56:50 -070031 const BlockMemberInfo memberInfo(static_cast<int>(mCurrentOffset * BytesPerComponent),
32 static_cast<int>(arrayStride * BytesPerComponent),
33 static_cast<int>(matrixStride * BytesPerComponent),
34 isRowMajorMatrix);
Jamie Madill834e8b72014-04-11 13:33:58 -040035
Jamie Madill834e8b72014-04-11 13:33:58 -040036 advanceOffset(type, arraySize, isRowMajorMatrix, arrayStride, matrixStride);
Jamie Madilla6f267f2014-08-27 11:44:15 -040037
38 return memberInfo;
Jamie Madill834e8b72014-04-11 13:33:58 -040039}
40
Jamie Madill2857f482015-02-09 15:35:29 -050041// static
42size_t BlockLayoutEncoder::getBlockRegister(const BlockMemberInfo &info)
43{
44 return (info.offset / BytesPerComponent) / ComponentsPerRegister;
45}
46
47// static
48size_t BlockLayoutEncoder::getBlockRegisterElement(const BlockMemberInfo &info)
49{
50 return (info.offset / BytesPerComponent) % ComponentsPerRegister;
51}
52
Jamie Madill834e8b72014-04-11 13:33:58 -040053void BlockLayoutEncoder::nextRegister()
54{
55 mCurrentOffset = rx::roundUp<size_t>(mCurrentOffset, ComponentsPerRegister);
56}
57
Jamie Madille04a5b72014-07-18 10:33:12 -040058Std140BlockEncoder::Std140BlockEncoder()
Jamie Madill834e8b72014-04-11 13:33:58 -040059{
60}
61
62void Std140BlockEncoder::enterAggregateType()
63{
64 nextRegister();
65}
66
67void Std140BlockEncoder::exitAggregateType()
68{
69 nextRegister();
70}
71
Jamie Madilld7b1ab52016-12-12 14:42:19 -050072void Std140BlockEncoder::getBlockLayoutInfo(GLenum type,
73 unsigned int arraySize,
74 bool isRowMajorMatrix,
75 int *arrayStrideOut,
76 int *matrixStrideOut)
Jamie Madill834e8b72014-04-11 13:33:58 -040077{
78 // We assume we are only dealing with 4 byte components (no doubles or half-words currently)
Jamie Madillf2575982014-06-25 16:04:54 -040079 ASSERT(gl::VariableComponentSize(gl::VariableComponentType(type)) == BytesPerComponent);
Jamie Madill834e8b72014-04-11 13:33:58 -040080
81 size_t baseAlignment = 0;
Jamie Madilld7b1ab52016-12-12 14:42:19 -050082 int matrixStride = 0;
83 int arrayStride = 0;
Jamie Madill834e8b72014-04-11 13:33:58 -040084
85 if (gl::IsMatrixType(type))
86 {
87 baseAlignment = ComponentsPerRegister;
Jamie Madilld7b1ab52016-12-12 14:42:19 -050088 matrixStride = ComponentsPerRegister;
Jamie Madill834e8b72014-04-11 13:33:58 -040089
90 if (arraySize > 0)
91 {
92 const int numRegisters = gl::MatrixRegisterCount(type, isRowMajorMatrix);
Jamie Madilld7b1ab52016-12-12 14:42:19 -050093 arrayStride = ComponentsPerRegister * numRegisters;
Jamie Madill834e8b72014-04-11 13:33:58 -040094 }
95 }
96 else if (arraySize > 0)
97 {
98 baseAlignment = ComponentsPerRegister;
Jamie Madilld7b1ab52016-12-12 14:42:19 -050099 arrayStride = ComponentsPerRegister;
Jamie Madill834e8b72014-04-11 13:33:58 -0400100 }
101 else
102 {
Jamie Madillf2575982014-06-25 16:04:54 -0400103 const int numComponents = gl::VariableComponentCount(type);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500104 baseAlignment = (numComponents == 3 ? 4u : static_cast<size_t>(numComponents));
Jamie Madill834e8b72014-04-11 13:33:58 -0400105 }
106
107 mCurrentOffset = rx::roundUp(mCurrentOffset, baseAlignment);
108
109 *matrixStrideOut = matrixStride;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500110 *arrayStrideOut = arrayStride;
Jamie Madill834e8b72014-04-11 13:33:58 -0400111}
112
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500113void Std140BlockEncoder::advanceOffset(GLenum type,
114 unsigned int arraySize,
115 bool isRowMajorMatrix,
116 int arrayStride,
117 int matrixStride)
Jamie Madill834e8b72014-04-11 13:33:58 -0400118{
119 if (arraySize > 0)
120 {
121 mCurrentOffset += arrayStride * arraySize;
122 }
123 else if (gl::IsMatrixType(type))
124 {
125 ASSERT(matrixStride == ComponentsPerRegister);
126 const int numRegisters = gl::MatrixRegisterCount(type, isRowMajorMatrix);
127 mCurrentOffset += ComponentsPerRegister * numRegisters;
128 }
129 else
130 {
Jamie Madillf2575982014-06-25 16:04:54 -0400131 mCurrentOffset += gl::VariableComponentCount(type);
Jamie Madill834e8b72014-04-11 13:33:58 -0400132 }
133}
Jamie Madill834e8b72014-04-11 13:33:58 -0400134}