blob: 8c35f47dd8f246fe1e762788a4b9de423c416b0e [file] [log] [blame]
Jamie Madill440dc742013-06-20 11:55:55 -04001//
2// Copyright (c) 2013 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
7#include "compiler/HLSLLayoutEncoder.h"
8#include "compiler/Uniform.h"
9#include "common/mathutil.h"
10#include "common/utilities.h"
11
12namespace sh
13{
14
15HLSLBlockEncoder::HLSLBlockEncoder(std::vector<BlockMemberInfo> *blockInfoOut)
16 : BlockLayoutEncoder(blockInfoOut)
17{
18}
19
20void HLSLBlockEncoder::enterAggregateType()
21{
22 nextRegister();
23}
24
25void HLSLBlockEncoder::exitAggregateType()
26{
27}
28
Jamie Madill912cbfe2013-08-30 13:21:03 -040029void HLSLBlockEncoder::getBlockLayoutInfo(GLenum type, unsigned int arraySize, bool isRowMajorMatrix, int *arrayStrideOut, int *matrixStrideOut)
Jamie Madill440dc742013-06-20 11:55:55 -040030{
Jamie Madill440dc742013-06-20 11:55:55 -040031 // We assume we are only dealing with 4 byte components (no doubles or half-words currently)
Jamie Madill912cbfe2013-08-30 13:21:03 -040032 ASSERT(gl::UniformComponentSize(gl::UniformComponentType(type)) == ComponentSize);
Jamie Madill440dc742013-06-20 11:55:55 -040033
34 int matrixStride = 0;
35 int arrayStride = 0;
36
Jamie Madill912cbfe2013-08-30 13:21:03 -040037 if (gl::IsMatrixType(type))
Jamie Madill440dc742013-06-20 11:55:55 -040038 {
39 nextRegister();
40 matrixStride = RegisterSize;
41
Jamie Madill912cbfe2013-08-30 13:21:03 -040042 if (arraySize > 0)
Jamie Madill440dc742013-06-20 11:55:55 -040043 {
Jamie Madill912cbfe2013-08-30 13:21:03 -040044 const int numRegisters = gl::MatrixRegisterCount(type, isRowMajorMatrix);
Jamie Madill440dc742013-06-20 11:55:55 -040045 arrayStride = RegisterSize * numRegisters;
46 }
47 }
Jamie Madill912cbfe2013-08-30 13:21:03 -040048 else if (arraySize > 0)
Jamie Madill440dc742013-06-20 11:55:55 -040049 {
50 nextRegister();
51 arrayStride = RegisterSize;
52 }
53 else
54 {
Jamie Madill912cbfe2013-08-30 13:21:03 -040055 int numComponents = gl::UniformComponentCount(type);
Jamie Madill440dc742013-06-20 11:55:55 -040056 if ((numComponents + (mCurrentOffset % RegisterSize)) > RegisterSize)
57 {
58 nextRegister();
59 }
60 }
61
62 *matrixStrideOut = matrixStride;
63 *arrayStrideOut = arrayStride;
64}
65
Jamie Madill912cbfe2013-08-30 13:21:03 -040066void HLSLBlockEncoder::advanceOffset(GLenum type, unsigned int arraySize, bool isRowMajorMatrix, int arrayStride, int matrixStride)
Jamie Madill440dc742013-06-20 11:55:55 -040067{
Jamie Madill912cbfe2013-08-30 13:21:03 -040068 if (arraySize > 0)
Jamie Madill440dc742013-06-20 11:55:55 -040069 {
Jamie Madill912cbfe2013-08-30 13:21:03 -040070 mCurrentOffset += arrayStride * (arraySize - 1);
Jamie Madill440dc742013-06-20 11:55:55 -040071 }
72
Jamie Madill912cbfe2013-08-30 13:21:03 -040073 if (gl::IsMatrixType(type))
Jamie Madill440dc742013-06-20 11:55:55 -040074 {
75 ASSERT(matrixStride == RegisterSize);
Jamie Madill912cbfe2013-08-30 13:21:03 -040076 const int numRegisters = gl::MatrixRegisterCount(type, isRowMajorMatrix);
77 const int numComponents = gl::MatrixComponentCount(type, isRowMajorMatrix);
Jamie Madill440dc742013-06-20 11:55:55 -040078 mCurrentOffset += RegisterSize * (numRegisters - 1);
79 mCurrentOffset += numComponents;
80 }
81 else
82 {
Jamie Madill912cbfe2013-08-30 13:21:03 -040083 mCurrentOffset += gl::UniformComponentCount(type);
Jamie Madill440dc742013-06-20 11:55:55 -040084 }
85}
86
87}