Home | History | Annotate | Download | only in translator
      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 
     13 class 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