summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/compiler/translator/VariablePacker.h
blob: 5f38a0a98de782a5835a0f4da171616a35184126 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//
// Copyright (c) 2002-2012 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.
//

#ifndef COMPILER_TRANSLATOR_VARIABLEPACKER_H_
#define COMPILER_TRANSLATOR_VARIABLEPACKER_H_

#include <vector>
#include "compiler/translator/VariableInfo.h"

class VariablePacker {
 public:
   // Returns true if the passed in variables pack in maxVectors following
   // the packing rules from the GLSL 1.017 spec, Appendix A, section 7.
   bool CheckVariablesWithinPackingLimits(unsigned int maxVectors,
                                          const std::vector<sh::ShaderVariable> &in_variables);

   // Gets how many components in a row a data type takes.
   static int GetNumComponentsPerRow(sh::GLenum type);

   // Gets how many rows a data type takes.
   static int GetNumRows(sh::GLenum type);

 private:
   static const int kNumColumns      = 4;
   static const unsigned kColumnMask = (1 << kNumColumns) - 1;

   unsigned makeColumnFlags(int column, int numComponentsPerRow);
   void fillColumns(int topRow, int numRows, int column, int numComponentsPerRow);
   bool searchColumn(int column, int numRows, int *destRow, int *destSize);

   int topNonFullRow_;
   int bottomNonFullRow_;
   int maxRows_;
   std::vector<unsigned> rows_;
};

#endif // COMPILER_TRANSLATOR_VARIABLEPACKER_H_