Upstream version 11.40.271.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / tests / compiler_tests / ShaderVariable_test.cpp
1 //
2 // Copyright (c) 2014 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 // CollectVariables_test.cpp:
7 //   Some tests for shader inspection
8 //
9
10 #include "angle_gl.h"
11 #include "gtest/gtest.h"
12 #include "GLSLANG/ShaderLang.h"
13
14 namespace sh
15 {
16
17 TEST(ShaderVariableTest, FindInfoByMappedName)
18 {
19     // struct A {
20     //   float x[2];
21     //   vec3 y;
22     // };
23     // struct B {
24     //   A a[3];
25     // };
26     // B uni[2];
27     ShaderVariable uni;
28     uni.arraySize = 2;
29     uni.name = "uni";
30     uni.mappedName = "m_uni";
31     uni.structName = "B";
32     {
33         ShaderVariable a;
34         a.arraySize = 3;
35         a.name = "a";
36         a.mappedName = "m_a";
37         a.structName = "A";
38         {
39             ShaderVariable x(GL_FLOAT, 2);
40             x.name = "x";
41             x.mappedName = "m_x";
42             a.fields.push_back(x);
43
44             ShaderVariable y(GL_FLOAT_VEC3, 0);
45             y.name = "y";
46             y.mappedName = "m_y";
47             a.fields.push_back(y);
48         }
49         uni.fields.push_back(a);
50     }
51
52     const ShaderVariable *leafVar = NULL;
53     std::string originalFullName;
54
55     std::string mappedFullName = "wrongName";
56     EXPECT_FALSE(uni.findInfoByMappedName(
57         mappedFullName, &leafVar, &originalFullName));
58
59     mappedFullName = "m_uni";
60     EXPECT_TRUE(uni.findInfoByMappedName(
61         mappedFullName, &leafVar, &originalFullName));
62     EXPECT_EQ(&uni, leafVar);
63     EXPECT_STREQ("uni", originalFullName.c_str());
64
65     mappedFullName = "m_uni[0].m_a[1].wrongName";
66     EXPECT_FALSE(uni.findInfoByMappedName(
67         mappedFullName, &leafVar, &originalFullName));
68
69     mappedFullName = "m_uni[0].m_a[1].m_x";
70     EXPECT_TRUE(uni.findInfoByMappedName(
71         mappedFullName, &leafVar, &originalFullName));
72     EXPECT_EQ(&(uni.fields[0].fields[0]), leafVar);
73     EXPECT_STREQ("uni[0].a[1].x", originalFullName.c_str());
74
75     mappedFullName = "m_uni[0].m_a[1].m_x[0]";
76     EXPECT_TRUE(uni.findInfoByMappedName(
77         mappedFullName, &leafVar, &originalFullName));
78     EXPECT_EQ(&(uni.fields[0].fields[0]), leafVar);
79     EXPECT_STREQ("uni[0].a[1].x[0]", originalFullName.c_str());
80
81     mappedFullName = "m_uni[0].m_a[1].m_y";
82     EXPECT_TRUE(uni.findInfoByMappedName(
83         mappedFullName, &leafVar, &originalFullName));
84     EXPECT_EQ(&(uni.fields[0].fields[1]), leafVar);
85     EXPECT_STREQ("uni[0].a[1].y", originalFullName.c_str());
86 }
87
88 TEST(ShaderVariableTest, IsSameUniformWithDifferentFieldOrder)
89 {
90     // struct A {
91     //   float x;
92     //   float y;
93     // };
94     // uniform A uni;
95     Uniform vx_a;
96     vx_a.arraySize = 0;
97     vx_a.name = "uni";
98     vx_a.mappedName = "m_uni";
99     vx_a.structName = "A";
100     {
101         ShaderVariable x(GL_FLOAT, 0);
102         x.name = "x";
103         x.mappedName = "m_x";
104         vx_a.fields.push_back(x);
105
106         ShaderVariable y(GL_FLOAT, 0);
107         y.name = "y";
108         y.mappedName = "m_y";
109         vx_a.fields.push_back(y);
110     }
111
112     // struct A {
113     //   float y;
114     //   float x;
115     // };
116     // uniform A uni;
117     Uniform fx_a;
118     fx_a.arraySize = 0;
119     fx_a.name = "uni";
120     fx_a.mappedName = "m_uni";
121     fx_a.structName = "A";
122     {
123         ShaderVariable y(GL_FLOAT, 0);
124         y.name = "y";
125         y.mappedName = "m_y";
126         fx_a.fields.push_back(y);
127
128         ShaderVariable x(GL_FLOAT, 0);
129         x.name = "x";
130         x.mappedName = "m_x";
131         fx_a.fields.push_back(x);
132     }
133
134     EXPECT_FALSE(vx_a.isSameUniformAtLinkTime(fx_a));
135 }
136
137 TEST(ShaderVariableTest, IsSameUniformWithDifferentStructNames)
138 {
139     // struct A {
140     //   float x;
141     //   float y;
142     // };
143     // uniform A uni;
144     Uniform vx_a;
145     vx_a.arraySize = 0;
146     vx_a.name = "uni";
147     vx_a.mappedName = "m_uni";
148     vx_a.structName = "A";
149     {
150         ShaderVariable x(GL_FLOAT, 0);
151         x.name = "x";
152         x.mappedName = "m_x";
153         vx_a.fields.push_back(x);
154
155         ShaderVariable y(GL_FLOAT, 0);
156         y.name = "y";
157         y.mappedName = "m_y";
158         vx_a.fields.push_back(y);
159     }
160
161     // struct B {
162     //   float x;
163     //   float y;
164     // };
165     // uniform B uni;
166     Uniform fx_a;
167     fx_a.arraySize = 0;
168     fx_a.name = "uni";
169     fx_a.mappedName = "m_uni";
170     {
171         ShaderVariable x(GL_FLOAT, 0);
172         x.name = "x";
173         x.mappedName = "m_x";
174         fx_a.fields.push_back(x);
175
176         ShaderVariable y(GL_FLOAT, 0);
177         y.name = "y";
178         y.mappedName = "m_y";
179         fx_a.fields.push_back(y);
180     }
181
182     fx_a.structName = "B";
183     EXPECT_FALSE(vx_a.isSameUniformAtLinkTime(fx_a));
184
185     fx_a.structName = "A";
186     EXPECT_TRUE(vx_a.isSameUniformAtLinkTime(fx_a));
187
188     fx_a.structName = "";
189     EXPECT_FALSE(vx_a.isSameUniformAtLinkTime(fx_a));
190 }
191
192 TEST(ShaderVariableTest, IsSameVaryingWithDifferentInvariance)
193 {
194     // invariant varying float vary;
195     Varying vx;
196     vx.type = GL_FLOAT;
197     vx.arraySize = 0;
198     vx.precision = GL_MEDIUM_FLOAT;
199     vx.name = "vary";
200     vx.mappedName = "m_vary";
201     vx.staticUse = true;
202     vx.isInvariant = true;
203
204     // varying float vary;
205     Varying fx;
206     fx.type = GL_FLOAT;
207     fx.arraySize = 0;
208     fx.precision = GL_MEDIUM_FLOAT;
209     fx.name = "vary";
210     fx.mappedName = "m_vary";
211     fx.staticUse = true;
212     fx.isInvariant = false;
213
214     EXPECT_FALSE(vx.isSameVaryingAtLinkTime(fx));
215
216     // invariant varying float vary;
217     fx.isInvariant = true;
218     EXPECT_TRUE(vx.isSameVaryingAtLinkTime(fx));
219 }
220
221 }  // namespace sh