1//
2// Copyright (c) 2002-2012 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#ifndef _VARIABLEPACKER_INCLUDED_
8#define _VARIABLEPACKER_INCLUDED_
9
10#include <vector>
11#include "compiler/translator/VariableInfo.h"
12
13class VariablePacker {
14 public:
15    // Returns true if the passed in variables pack in maxVectors following
16    // the packing rules from the GLSL 1.017 spec, Appendix A, section 7.
17    template <typename VarT>
18    bool CheckVariablesWithinPackingLimits(unsigned int maxVectors,
19                                           const std::vector<VarT> &in_variables);
20
21    // Gets how many components in a row a data type takes.
22    static int GetNumComponentsPerRow(sh::GLenum type);
23
24    // Gets how many rows a data type takes.
25    static int GetNumRows(sh::GLenum type);
26
27  private:
28    static const int kNumColumns = 4;
29    static const unsigned kColumnMask = (1 << kNumColumns) - 1;
30
31    unsigned makeColumnFlags(int column, int numComponentsPerRow);
32    void fillColumns(int topRow, int numRows, int column, int numComponentsPerRow);
33    bool searchColumn(int column, int numRows, int* destRow, int* destSize);
34
35    int topNonFullRow_;
36    int bottomNonFullRow_;
37    int maxRows_;
38    std::vector<unsigned> rows_;
39};
40
41#endif // _VARIABLEPACKER_INCLUDED_
42