112 struct TVariableInfoComparer {
115 int lhsSortOrder = GetSortOrder(lhs.
type);
116 int rhsSortOrder = GetSortOrder(rhs.
type);
117 if (lhsSortOrder != rhsSortOrder) {
118 return lhsSortOrder < rhsSortOrder;
125 unsigned VariablePacker::makeColumnFlags(
int column,
int numComponentsPerRow)
127 return ((kColumnMask << (kNumColumns - numComponentsPerRow)) &
131 void VariablePacker::fillColumns(
int topRow,
int numRows,
int column,
int numComponentsPerRow)
133 unsigned columnFlags = makeColumnFlags(column, numComponentsPerRow);
134 for (
int r = 0;
r < numRows; ++
r) {
135 int row = topRow +
r;
136 ASSERT((rows_[row] & columnFlags) == 0);
137 rows_[
row] |= columnFlags;
141 bool VariablePacker::searchColumn(
int column,
int numRows,
int* destRow,
int* destSize)
145 for (; topNonFullRow_ < maxRows_ && rows_[topNonFullRow_] == kColumnMask;
149 for (; bottomNonFullRow_ >= 0 && rows_[bottomNonFullRow_] == kColumnMask;
150 --bottomNonFullRow_) {
153 if (bottomNonFullRow_ - topNonFullRow_ + 1 < numRows) {
157 unsigned columnFlags = makeColumnFlags(column, 1);
159 int smallestGoodTop = -1;
160 int smallestGoodSize = maxRows_ + 1;
161 int bottomRow = bottomNonFullRow_ + 1;
163 for (
int row = topNonFullRow_;
row <= bottomRow; ++
row) {
164 bool rowEmpty =
row < bottomRow ? ((rows_[
row] & columnFlags) == 0) :
false;
173 if (size >= numRows && size < smallestGoodSize) {
174 smallestGoodSize =
size;
175 smallestGoodTop = topGoodRow;
181 if (smallestGoodTop < 0) {
185 *destRow = smallestGoodTop;
187 *destSize = smallestGoodSize;
195 maxRows_ = maxVectors;
197 bottomNonFullRow_ = maxRows_ - 1;
202 std::sort(variables.begin(), variables.end(), TVariableInfoComparer());
204 rows_.resize(maxVectors, 0);
208 for (; ii < variables.size(); ++ii) {
216 if (topNonFullRow_ > maxRows_) {
221 int num3ColumnRows = 0;
222 for (; ii < variables.size(); ++ii) {
230 if (topNonFullRow_ + num3ColumnRows > maxRows_) {
234 fillColumns(topNonFullRow_, num3ColumnRows, 0, 3);
237 int top2ColumnRow = topNonFullRow_ + num3ColumnRows;
238 int twoColumnRowsAvailable = maxRows_ - top2ColumnRow;
239 int rowsAvailableInColumns01 = twoColumnRowsAvailable;
240 int rowsAvailableInColumns23 = twoColumnRowsAvailable;
241 for (; ii < variables.size(); ++ii) {
247 if (numRows <= rowsAvailableInColumns01) {
248 rowsAvailableInColumns01 -= numRows;
249 }
else if (numRows <= rowsAvailableInColumns23) {
250 rowsAvailableInColumns23 -= numRows;
256 int numRowsUsedInColumns01 =
257 twoColumnRowsAvailable - rowsAvailableInColumns01;
258 int numRowsUsedInColumns23 =
259 twoColumnRowsAvailable - rowsAvailableInColumns23;
260 fillColumns(top2ColumnRow, numRowsUsedInColumns01, 0, 2);
261 fillColumns(maxRows_ - numRowsUsedInColumns23, numRowsUsedInColumns23,
265 for (; ii < variables.size(); ++ii) {
269 int smallestColumn = -1;
270 int smallestSize = maxRows_ + 1;
272 for (
int column = 0; column < kNumColumns; ++
column) {
275 if (searchColumn(column, numRows, &row, &size)) {
276 if (size < smallestSize) {
284 if (smallestColumn < 0) {
288 fillColumns(topRow, numRows, smallestColumn, 1);
291 ASSERT(variables.size() == ii);
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum type
bool CheckVariablesWithinPackingLimits(int maxVectors, const TVariableInfoList &in_variables)
GLenum GLenum GLvoid * row
#define ASSERT(expression)
GLenum GLenum GLvoid GLvoid * column
static int GetNumRows(ShDataType type)
static int GetNumComponentsPerRow(ShDataType type)
GLdouble GLdouble GLdouble r
std::vector< TVariableInfo > TVariableInfoList