OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <GLES2/gl2.h> | |
6 #include <GLES2/gl2ext.h> | |
7 | |
8 #include "gpu/command_buffer/tests/gl_manager.h" | |
9 #include "gpu/command_buffer/tests/gl_test_utils.h" | |
10 #include "testing/gmock/include/gmock/gmock.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 | |
13 #define SHADER(Src) #Src | |
14 | |
15 namespace gpu { | |
16 | |
17 class GLProgramTest : public testing::Test { | |
18 protected: | |
19 virtual void SetUp() { | |
20 gl_.Initialize(GLManager::Options()); | |
21 } | |
22 | |
23 virtual void TearDown() { | |
24 gl_.Destroy(); | |
25 } | |
26 | |
27 GLManager gl_; | |
28 }; | |
29 | |
30 TEST_F(GLProgramTest, GetSetUniform) { | |
31 static const char* v_shader_str = SHADER( | |
32 attribute vec4 a_vertex; | |
33 attribute vec3 a_normal; | |
34 | |
35 uniform mat4 u_modelViewProjMatrix; | |
36 | |
37 struct MyStruct | |
38 { | |
39 int x; | |
40 int y; | |
41 }; | |
42 | |
43 uniform MyStruct u_struct; | |
44 uniform float u_array[4]; | |
45 | |
46 varying vec3 v_normal; | |
47 | |
48 void main() | |
49 { | |
50 v_normal = a_normal; | |
51 gl_Position = u_modelViewProjMatrix * a_vertex + | |
52 vec4(u_struct.x, u_struct.y, 0, 1) + | |
53 vec4(u_array[0], u_array[1], u_array[2], u_array[3]); | |
54 } | |
55 ); | |
56 static const char* f_shader_str = SHADER( | |
57 varying mediump vec3 v_normal; | |
58 | |
59 void main() | |
60 { | |
61 gl_FragColor = vec4(v_normal/2.0+vec3(0.5), 1); | |
62 } | |
63 ); | |
64 | |
65 // Load the program. | |
66 GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); | |
67 glUseProgram(program); | |
68 // Relink program. | |
69 glLinkProgram(program); | |
70 | |
71 // These tests will fail on NVidia if not worked around by | |
72 // command buffer. | |
73 GLint location_sx = glGetUniformLocation(program, "u_struct.x"); | |
74 GLint location_array_0 = glGetUniformLocation(program, "u_array[0]"); | |
75 | |
76 glUniform1i(location_sx, 3); | |
77 glUniform1f(location_array_0, 123); | |
78 | |
79 GLint int_value = 0; | |
80 GLfloat float_value = 0; | |
81 | |
82 glGetUniformiv(program, location_sx, &int_value); | |
83 EXPECT_EQ(3, int_value); | |
84 glGetUniformfv(program, location_array_0, &float_value); | |
85 EXPECT_EQ(123.0f, float_value); | |
86 | |
87 GLTestHelper::CheckGLError("no errors", __LINE__); | |
88 } | |
89 | |
90 TEST_F(GLProgramTest, NewShaderInCurrentProgram) { | |
91 static const char* v_shader_str = SHADER( | |
92 attribute vec4 a_position; | |
93 void main() | |
94 { | |
95 gl_Position = a_position; | |
96 } | |
97 ); | |
98 static const char* f_red_shader_str = SHADER( | |
99 void main() | |
100 { | |
101 gl_FragColor = vec4(1, 0, 0, 1); | |
102 } | |
103 ); | |
104 static const char* f_blue_shader_str = SHADER( | |
105 void main() | |
106 { | |
107 gl_FragColor = vec4(0, 0, 1, 1); | |
108 } | |
109 ); | |
110 | |
111 // Load the program. | |
112 GLuint vs = GLTestHelper::LoadShader(GL_VERTEX_SHADER, v_shader_str); | |
113 GLuint fs = GLTestHelper::LoadShader(GL_FRAGMENT_SHADER, f_red_shader_str); | |
114 GLuint program = GLTestHelper::SetupProgram(vs, fs); | |
115 glUseProgram(program); | |
116 glShaderSource(fs, 1, &f_blue_shader_str, NULL); | |
117 glCompileShader(fs); | |
118 glLinkProgram(program); | |
119 // We specifically don't call UseProgram again. | |
120 GLuint position_loc = glGetAttribLocation(program, "a_position"); | |
121 GLTestHelper::SetupUnitQuad(position_loc); | |
122 glDrawArrays(GL_TRIANGLES, 0, 6); | |
123 uint8 expected_color[] = { 0, 0, 255, 255, }; | |
124 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color)); | |
125 GLTestHelper::CheckGLError("no errors", __LINE__); | |
126 } | |
127 | |
128 TEST_F(GLProgramTest, UniformsInCurrentProgram) { | |
129 static const char* v_shader_str = SHADER( | |
130 attribute vec4 a_position; | |
131 void main() | |
132 { | |
133 gl_Position = a_position; | |
134 } | |
135 ); | |
136 static const char* f_shader_str = SHADER( | |
137 precision mediump float; | |
138 uniform vec4 u_color; | |
139 void main() | |
140 { | |
141 gl_FragColor = u_color;; | |
142 } | |
143 ); | |
144 | |
145 // Load the program. | |
146 GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); | |
147 glUseProgram(program); | |
148 | |
149 // Relink. | |
150 glLinkProgram(program); | |
151 | |
152 // This test will fail on NVidia Linux if not worked around. | |
153 GLint color_location = glGetUniformLocation(program, "u_color"); | |
154 glUniform4f(color_location, 0.0f, 0.0f, 1.0f, 1.0f); | |
155 | |
156 // We specifically don't call UseProgram again. | |
157 GLuint position_loc = glGetAttribLocation(program, "a_position"); | |
158 GLTestHelper::SetupUnitQuad(position_loc); | |
159 glDrawArrays(GL_TRIANGLES, 0, 6); | |
160 uint8 expected_color[] = { 0, 0, 255, 255, }; | |
161 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color)); | |
162 GLTestHelper::CheckGLError("no errors", __LINE__); | |
163 } | |
164 | |
165 } // namespace gpu | |
166 | |
OLD | NEW |