// Check special assumptions about packing non-square mats
TEST(VariablePacking, NonSquareMats) {

    for (size_t mt = 0; mt < ArraySize(nonSqMatTypes); ++mt) {

        GLenum type = nonSqMatTypes[mt];

        int rows = gl::VariableRowCount(type);
        int cols = gl::VariableColumnCount(type);
        int squareSize = std::max(rows, cols);

        std::vector<sh::ShaderVariable> vars;
        vars.push_back(SimpleVar(type, 1));

        // Fill columns
        for (int row = 0; row < squareSize; row++) {
            for (int col = squareSize; col < 4; ++col) {
                vars.push_back(SimpleVar(GL_FLOAT, 1));
            }
        }

        VariablePacker packer;

        EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(squareSize, vars));

        // and one scalar and packing should fail
        vars.push_back(SimpleVar(GL_FLOAT, 1));
        EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(squareSize, vars));
    }
}
Esempio n. 2
0
bool ShCheckVariablesWithinPackingLimits(
    int maxVectors, ShVariableInfo *varInfoArray, size_t varInfoArraySize)
{
    if (varInfoArraySize == 0)
        return true;
    ASSERT(varInfoArray);
    std::vector<sh::ShaderVariable> variables;
    for (size_t ii = 0; ii < varInfoArraySize; ++ii)
    {
        sh::ShaderVariable var(varInfoArray[ii].type, varInfoArray[ii].size);
        variables.push_back(var);
    }
    VariablePacker packer;
    return packer.CheckVariablesWithinPackingLimits(maxVectors, variables);
}
Esempio n. 3
0
int ShCheckVariablesWithinPackingLimits(
    int maxVectors, ShVariableInfo* varInfoArray, size_t varInfoArraySize)
{
    if (varInfoArraySize == 0)
        return 1;
    ASSERT(varInfoArray);
    TVariableInfoList variables;
    for (size_t ii = 0; ii < varInfoArraySize; ++ii)
    {
        TVariableInfo var(varInfoArray[ii].type, varInfoArray[ii].size);
        variables.push_back(var);
    }
    VariablePacker packer;
    return packer.CheckVariablesWithinPackingLimits(maxVectors, variables) ? 1 : 0;
}
TEST(VariablePacking, Pack) {
    VariablePacker packer;
    std::vector<sh::ShaderVariable> vars;
    const int kMaxRows = 16;
    // test no vars.
    EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

    for (size_t tt = 0; tt < ArraySize(types); ++tt) {
        sh::GLenum type = types[tt];
        int num_rows = VariablePacker::GetNumRows(type);
        int num_components_per_row = VariablePacker::GetNumComponentsPerRow(type);
        // Check 1 of the type.
        vars.clear();
        vars.push_back(SimpleVar(type, 1));
        EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

        // Check exactly the right amount of 1 type as an array.
        int num_vars = kMaxRows / num_rows;
        vars.clear();
        vars.push_back(SimpleVar(type, num_vars));
        EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

        // test too many
        vars.clear();
        vars.push_back(SimpleVar(type, num_vars + 1));
        EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

        // Check exactly the right amount of 1 type as individual vars.
        num_vars = kMaxRows / num_rows *
                   ((num_components_per_row > 2) ? 1 : (4 / num_components_per_row));
        vars.clear();
        for (int ii = 0; ii < num_vars; ++ii) {
            vars.push_back(SimpleVar(type, 1));
        }
        EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

        // Check 1 too many.
        vars.push_back(SimpleVar(type, 1));
        EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
    }

    // Test example from GLSL ES 3.0 spec chapter 11.
    vars.clear();
    vars.push_back(SimpleVar(GL_FLOAT_VEC4, 1));
    vars.push_back(SimpleVar(GL_FLOAT_MAT3, 1));
    vars.push_back(SimpleVar(GL_FLOAT_MAT3, 1));
    vars.push_back(SimpleVar(GL_FLOAT_VEC2, 6));
    vars.push_back(SimpleVar(GL_FLOAT_VEC2, 4));
    vars.push_back(SimpleVar(GL_FLOAT_VEC2, 1));
    vars.push_back(SimpleVar(GL_FLOAT, 3));
    vars.push_back(SimpleVar(GL_FLOAT, 2));
    vars.push_back(SimpleVar(GL_FLOAT, 1));
    EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
}
Esempio n. 5
0
bool TCompiler::enforcePackingRestrictions()
{
    VariablePacker packer;
    return packer.CheckVariablesWithinPackingLimits(maxUniformVectors, uniforms);
}
TEST(VariablePacking, Pack) {
  VariablePacker packer;
  TVariableInfoList vars;
  const int kMaxRows = 16;
  // test no vars.
  EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

  ShDataType types[] = {
    SH_FLOAT_MAT4,            // 0
    SH_FLOAT_MAT2,            // 1
    SH_FLOAT_VEC4,            // 2
    SH_INT_VEC4,              // 3
    SH_BOOL_VEC4,             // 4
    SH_FLOAT_MAT3,            // 5
    SH_FLOAT_VEC3,            // 6
    SH_INT_VEC3,              // 7
    SH_BOOL_VEC3,             // 8
    SH_FLOAT_VEC2,            // 9
    SH_INT_VEC2,              // 10
    SH_BOOL_VEC2,             // 11
    SH_FLOAT,                 // 12
    SH_INT,                   // 13
    SH_BOOL,                  // 14
    SH_SAMPLER_2D,            // 15
    SH_SAMPLER_CUBE,          // 16
    SH_SAMPLER_EXTERNAL_OES,  // 17
    SH_SAMPLER_2D_RECT_ARB,   // 18
  };

  for (size_t tt = 0; tt < sizeof(types) / sizeof(types[0]); ++tt) {
    ShDataType type = types[tt];
    int num_rows = VariablePacker::GetNumRows(type);
    int num_components_per_row = VariablePacker::GetNumComponentsPerRow(type);
    // Check 1 of the type.
    vars.clear();
    vars.push_back(TVariableInfo(type, 1));
    EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

    // Check exactly the right amount of 1 type as an array.
    int num_vars = kMaxRows / num_rows;
    vars.clear();
    vars.push_back(TVariableInfo(type, num_vars));
    EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

    // test too many
    vars.clear();
    vars.push_back(TVariableInfo(type, num_vars + 1));
    EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

    // Check exactly the right amount of 1 type as individual vars.
    num_vars = kMaxRows / num_rows *
        ((num_components_per_row > 2) ? 1 : (4 / num_components_per_row));
    vars.clear();
    for (int ii = 0; ii < num_vars; ++ii) {
      vars.push_back(TVariableInfo(type, 1));
    }
    EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));

    // Check 1 too many.
    vars.push_back(TVariableInfo( type, 1));
    EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
  }

  // Test example from GLSL ES 3.0 spec chapter 11.
  vars.clear();
  vars.push_back(TVariableInfo(SH_FLOAT_VEC4, 1));
  vars.push_back(TVariableInfo(SH_FLOAT_MAT3, 1));
  vars.push_back(TVariableInfo(SH_FLOAT_MAT3, 1));
  vars.push_back(TVariableInfo(SH_FLOAT_VEC2, 6));
  vars.push_back(TVariableInfo(SH_FLOAT_VEC2, 4));
  vars.push_back(TVariableInfo(SH_FLOAT_VEC2, 1));
  vars.push_back(TVariableInfo(SH_FLOAT, 3));
  vars.push_back(TVariableInfo(SH_FLOAT, 2));
  vars.push_back(TVariableInfo(SH_FLOAT, 1));
  EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
}