summaryrefslogtreecommitdiff
path: root/Source/ThirdParty/ANGLE/src/compiler/VariablePacker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/ThirdParty/ANGLE/src/compiler/VariablePacker.cpp')
-rw-r--r--Source/ThirdParty/ANGLE/src/compiler/VariablePacker.cpp297
1 files changed, 0 insertions, 297 deletions
diff --git a/Source/ThirdParty/ANGLE/src/compiler/VariablePacker.cpp b/Source/ThirdParty/ANGLE/src/compiler/VariablePacker.cpp
deleted file mode 100644
index 895728776..000000000
--- a/Source/ThirdParty/ANGLE/src/compiler/VariablePacker.cpp
+++ /dev/null
@@ -1,297 +0,0 @@
-//
-// 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.
-//
-#include "compiler/VariablePacker.h"
-
-#include <algorithm>
-#include "compiler/ShHandle.h"
-
-namespace {
-int GetSortOrder(ShDataType type)
-{
- switch (type) {
- case SH_FLOAT_MAT4:
- return 0;
- case SH_FLOAT_MAT2:
- return 1;
- case SH_FLOAT_VEC4:
- case SH_INT_VEC4:
- case SH_BOOL_VEC4:
- return 2;
- case SH_FLOAT_MAT3:
- return 3;
- case SH_FLOAT_VEC3:
- case SH_INT_VEC3:
- case SH_BOOL_VEC3:
- return 4;
- case SH_FLOAT_VEC2:
- case SH_INT_VEC2:
- case SH_BOOL_VEC2:
- return 5;
- case SH_FLOAT:
- case SH_INT:
- case SH_BOOL:
- case SH_SAMPLER_2D:
- case SH_SAMPLER_CUBE:
- case SH_SAMPLER_EXTERNAL_OES:
- case SH_SAMPLER_2D_RECT_ARB:
- return 6;
- default:
- ASSERT(false);
- return 7;
- }
-}
-} // namespace
-
-int VariablePacker::GetNumComponentsPerRow(ShDataType type)
-{
- switch (type) {
- case SH_FLOAT_MAT4:
- case SH_FLOAT_MAT2:
- case SH_FLOAT_VEC4:
- case SH_INT_VEC4:
- case SH_BOOL_VEC4:
- return 4;
- case SH_FLOAT_MAT3:
- case SH_FLOAT_VEC3:
- case SH_INT_VEC3:
- case SH_BOOL_VEC3:
- return 3;
- case SH_FLOAT_VEC2:
- case SH_INT_VEC2:
- case SH_BOOL_VEC2:
- return 2;
- case SH_FLOAT:
- case SH_INT:
- case SH_BOOL:
- case SH_SAMPLER_2D:
- case SH_SAMPLER_CUBE:
- case SH_SAMPLER_EXTERNAL_OES:
- case SH_SAMPLER_2D_RECT_ARB:
- return 1;
- default:
- ASSERT(false);
- return 5;
- }
-}
-
-int VariablePacker::GetNumRows(ShDataType type)
-{
- switch (type) {
- case SH_FLOAT_MAT4:
- return 4;
- case SH_FLOAT_MAT3:
- return 3;
- case SH_FLOAT_MAT2:
- return 2;
- case SH_FLOAT_VEC4:
- case SH_INT_VEC4:
- case SH_BOOL_VEC4:
- case SH_FLOAT_VEC3:
- case SH_INT_VEC3:
- case SH_BOOL_VEC3:
- case SH_FLOAT_VEC2:
- case SH_INT_VEC2:
- case SH_BOOL_VEC2:
- case SH_FLOAT:
- case SH_INT:
- case SH_BOOL:
- case SH_SAMPLER_2D:
- case SH_SAMPLER_CUBE:
- case SH_SAMPLER_EXTERNAL_OES:
- case SH_SAMPLER_2D_RECT_ARB:
- return 1;
- default:
- ASSERT(false);
- return 100000;
- }
-}
-
-struct TVariableInfoComparer {
- bool operator()(const TVariableInfo& lhs, const TVariableInfo& rhs) const
- {
- int lhsSortOrder = GetSortOrder(lhs.type);
- int rhsSortOrder = GetSortOrder(rhs.type);
- if (lhsSortOrder != rhsSortOrder) {
- return lhsSortOrder < rhsSortOrder;
- }
- // Sort by largest first.
- return lhs.size > rhs.size;
- }
-};
-
-unsigned VariablePacker::makeColumnFlags(int column, int numComponentsPerRow)
-{
- return ((kColumnMask << (kNumColumns - numComponentsPerRow)) &
- kColumnMask) >> column;
-}
-
-void VariablePacker::fillColumns(int topRow, int numRows, int column, int numComponentsPerRow)
-{
- unsigned columnFlags = makeColumnFlags(column, numComponentsPerRow);
- for (int r = 0; r < numRows; ++r) {
- int row = topRow + r;
- ASSERT((rows_[row] & columnFlags) == 0);
- rows_[row] |= columnFlags;
- }
-}
-
-bool VariablePacker::searchColumn(int column, int numRows, int* destRow, int* destSize)
-{
- ASSERT(destRow);
-
- for (; topNonFullRow_ < maxRows_ && rows_[topNonFullRow_] == kColumnMask;
- ++topNonFullRow_) {
- }
-
- for (; bottomNonFullRow_ >= 0 && rows_[bottomNonFullRow_] == kColumnMask;
- --bottomNonFullRow_) {
- }
-
- if (bottomNonFullRow_ - topNonFullRow_ + 1 < numRows) {
- return false;
- }
-
- unsigned columnFlags = makeColumnFlags(column, 1);
- int topGoodRow = 0;
- int smallestGoodTop = -1;
- int smallestGoodSize = maxRows_ + 1;
- int bottomRow = bottomNonFullRow_ + 1;
- bool found = false;
- for (int row = topNonFullRow_; row <= bottomRow; ++row) {
- bool rowEmpty = row < bottomRow ? ((rows_[row] & columnFlags) == 0) : false;
- if (rowEmpty) {
- if (!found) {
- topGoodRow = row;
- found = true;
- }
- } else {
- if (found) {
- int size = row - topGoodRow;
- if (size >= numRows && size < smallestGoodSize) {
- smallestGoodSize = size;
- smallestGoodTop = topGoodRow;
- }
- }
- found = false;
- }
- }
- if (smallestGoodTop < 0) {
- return false;
- }
-
- *destRow = smallestGoodTop;
- if (destSize) {
- *destSize = smallestGoodSize;
- }
- return true;
-}
-
-bool VariablePacker::CheckVariablesWithinPackingLimits(int maxVectors, const TVariableInfoList& in_variables)
-{
- ASSERT(maxVectors > 0);
- maxRows_ = maxVectors;
- topNonFullRow_ = 0;
- bottomNonFullRow_ = maxRows_ - 1;
- TVariableInfoList variables(in_variables);
-
- // As per GLSL 1.017 Appendix A, Section 7 variables are packed in specific
- // order by type, then by size of array, largest first.
- std::sort(variables.begin(), variables.end(), TVariableInfoComparer());
- rows_.clear();
- rows_.resize(maxVectors, 0);
-
- // Packs the 4 column variables.
- size_t ii = 0;
- for (; ii < variables.size(); ++ii) {
- const TVariableInfo& variable = variables[ii];
- if (GetNumComponentsPerRow(variable.type) != 4) {
- break;
- }
- topNonFullRow_ += GetNumRows(variable.type) * variable.size;
- }
-
- if (topNonFullRow_ > maxRows_) {
- return false;
- }
-
- // Packs the 3 column variables.
- int num3ColumnRows = 0;
- for (; ii < variables.size(); ++ii) {
- const TVariableInfo& variable = variables[ii];
- if (GetNumComponentsPerRow(variable.type) != 3) {
- break;
- }
- num3ColumnRows += GetNumRows(variable.type) * variable.size;
- }
-
- if (topNonFullRow_ + num3ColumnRows > maxRows_) {
- return false;
- }
-
- fillColumns(topNonFullRow_, num3ColumnRows, 0, 3);
-
- // Packs the 2 column variables.
- int top2ColumnRow = topNonFullRow_ + num3ColumnRows;
- int twoColumnRowsAvailable = maxRows_ - top2ColumnRow;
- int rowsAvailableInColumns01 = twoColumnRowsAvailable;
- int rowsAvailableInColumns23 = twoColumnRowsAvailable;
- for (; ii < variables.size(); ++ii) {
- const TVariableInfo& variable = variables[ii];
- if (GetNumComponentsPerRow(variable.type) != 2) {
- break;
- }
- int numRows = GetNumRows(variable.type) * variable.size;
- if (numRows <= rowsAvailableInColumns01) {
- rowsAvailableInColumns01 -= numRows;
- } else if (numRows <= rowsAvailableInColumns23) {
- rowsAvailableInColumns23 -= numRows;
- } else {
- return false;
- }
- }
-
- int numRowsUsedInColumns01 =
- twoColumnRowsAvailable - rowsAvailableInColumns01;
- int numRowsUsedInColumns23 =
- twoColumnRowsAvailable - rowsAvailableInColumns23;
- fillColumns(top2ColumnRow, numRowsUsedInColumns01, 0, 2);
- fillColumns(maxRows_ - numRowsUsedInColumns23, numRowsUsedInColumns23,
- 2, 2);
-
- // Packs the 1 column variables.
- for (; ii < variables.size(); ++ii) {
- const TVariableInfo& variable = variables[ii];
- ASSERT(1 == GetNumComponentsPerRow(variable.type));
- int numRows = GetNumRows(variable.type) * variable.size;
- int smallestColumn = -1;
- int smallestSize = maxRows_ + 1;
- int topRow = -1;
- for (int column = 0; column < kNumColumns; ++column) {
- int row = 0;
- int size = 0;
- if (searchColumn(column, numRows, &row, &size)) {
- if (size < smallestSize) {
- smallestSize = size;
- smallestColumn = column;
- topRow = row;
- }
- }
- }
-
- if (smallestColumn < 0) {
- return false;
- }
-
- fillColumns(topRow, numRows, smallestColumn, 1);
- }
-
- ASSERT(variables.size() == ii);
-
- return true;
-}
-
-
-