blob: 82808530d31eac88020915efdfb65f841672723e [file] [log] [blame]
gman@chromium.org8d804792012-10-17 21:33:48 +00001//
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//
Geoff Langdcefb752013-12-04 15:54:27 -05006#include "compiler/translator/VariablePacker.h"
gman@chromium.org8d804792012-10-17 21:33:48 +00007#include "gtest/gtest.h"
8
9TEST(VariablePacking, Pack) {
10 VariablePacker packer;
11 TVariableInfoList vars;
12 const int kMaxRows = 16;
13 // test no vars.
14 EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
15
16 ShDataType types[] = {
17 SH_FLOAT_MAT4, // 0
18 SH_FLOAT_MAT2, // 1
19 SH_FLOAT_VEC4, // 2
20 SH_INT_VEC4, // 3
21 SH_BOOL_VEC4, // 4
22 SH_FLOAT_MAT3, // 5
23 SH_FLOAT_VEC3, // 6
24 SH_INT_VEC3, // 7
25 SH_BOOL_VEC3, // 8
26 SH_FLOAT_VEC2, // 9
27 SH_INT_VEC2, // 10
28 SH_BOOL_VEC2, // 11
29 SH_FLOAT, // 12
30 SH_INT, // 13
31 SH_BOOL, // 14
32 SH_SAMPLER_2D, // 15
33 SH_SAMPLER_CUBE, // 16
34 SH_SAMPLER_EXTERNAL_OES, // 17
35 SH_SAMPLER_2D_RECT_ARB, // 18
36 };
37
38 for (size_t tt = 0; tt < sizeof(types) / sizeof(types[0]); ++tt) {
39 ShDataType type = types[tt];
40 int num_rows = VariablePacker::GetNumRows(type);
41 int num_components_per_row = VariablePacker::GetNumComponentsPerRow(type);
42 // Check 1 of the type.
43 vars.clear();
44 vars.push_back(TVariableInfo(type, 1));
45 EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
46
47 // Check exactly the right amount of 1 type as an array.
48 int num_vars = kMaxRows / num_rows;
49 vars.clear();
50 vars.push_back(TVariableInfo(type, num_vars));
51 EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
52
53 // test too many
54 vars.clear();
55 vars.push_back(TVariableInfo(type, num_vars + 1));
56 EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
57
58 // Check exactly the right amount of 1 type as individual vars.
59 num_vars = kMaxRows / num_rows *
60 ((num_components_per_row > 2) ? 1 : (4 / num_components_per_row));
61 vars.clear();
62 for (int ii = 0; ii < num_vars; ++ii) {
63 vars.push_back(TVariableInfo(type, 1));
64 }
65 EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
66
67 // Check 1 too many.
68 vars.push_back(TVariableInfo( type, 1));
69 EXPECT_FALSE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
70 }
71
72 // Test example from GLSL ES 3.0 spec chapter 11.
73 vars.clear();
74 vars.push_back(TVariableInfo(SH_FLOAT_VEC4, 1));
75 vars.push_back(TVariableInfo(SH_FLOAT_MAT3, 1));
76 vars.push_back(TVariableInfo(SH_FLOAT_MAT3, 1));
77 vars.push_back(TVariableInfo(SH_FLOAT_VEC2, 6));
78 vars.push_back(TVariableInfo(SH_FLOAT_VEC2, 4));
79 vars.push_back(TVariableInfo(SH_FLOAT_VEC2, 1));
80 vars.push_back(TVariableInfo(SH_FLOAT, 3));
81 vars.push_back(TVariableInfo(SH_FLOAT, 2));
82 vars.push_back(TVariableInfo(SH_FLOAT, 1));
83 EXPECT_TRUE(packer.CheckVariablesWithinPackingLimits(kMaxRows, vars));
84}
85