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.
6 #include <GLES2/gl2ext.h>
7 #include <GLES2/gl2extchromium.h>
9 #include "gpu/command_buffer/tests/gl_manager.h"
10 #include "gpu/command_buffer/tests/gl_test_utils.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
14 #define SHADER(Src) #Src
18 class BindUniformLocationTest
: public testing::Test
{
20 static const GLsizei kResolution
= 4;
21 void SetUp() override
{
22 GLManager::Options options
;
23 options
.size
= gfx::Size(kResolution
, kResolution
);
24 gl_
.Initialize(options
);
27 void TearDown() override
{ gl_
.Destroy(); }
32 TEST_F(BindUniformLocationTest
, Basic
) {
34 GLTestHelper::HasExtension("GL_CHROMIUM_bind_uniform_location"));
36 static const char* v_shader_str
= SHADER(
37 attribute vec4 a_position
;
40 gl_Position
= a_position
;
43 static const char* f_shader_str
= SHADER(
44 precision mediump
float;
45 uniform vec4 u_colorC
;
46 uniform vec4 u_colorB
[2];
47 uniform vec4 u_colorA
;
50 gl_FragColor
= u_colorA
+ u_colorB
[0] + u_colorB
[1] + u_colorC
;
54 GLint color_a_location
= 3;
55 GLint color_b_location
= 10;
56 GLint color_c_location
= 5;
58 GLuint vertex_shader
= GLTestHelper::LoadShader(
59 GL_VERTEX_SHADER
, v_shader_str
);
60 GLuint fragment_shader
= GLTestHelper::LoadShader(
61 GL_FRAGMENT_SHADER
, f_shader_str
);
63 GLuint program
= glCreateProgram();
65 glBindUniformLocationCHROMIUM(program
, color_a_location
, "u_colorA");
66 glBindUniformLocationCHROMIUM(program
, color_b_location
, "u_colorB[0]");
67 glBindUniformLocationCHROMIUM(program
, color_c_location
, "u_colorC");
69 glAttachShader(program
, vertex_shader
);
70 glAttachShader(program
, fragment_shader
);
72 glLinkProgram(program
);
73 // Check the link status
75 glGetProgramiv(program
, GL_LINK_STATUS
, &linked
);
78 GLint position_loc
= glGetAttribLocation(program
, "a_position");
80 GLTestHelper::SetupUnitQuad(position_loc
);
82 glUseProgram(program
);
84 static const float color_b
[] = {
85 0.0f
, 0.50f
, 0.0f
, 0.0f
,
86 0.0f
, 0.0f
, 0.75f
, 0.0f
,
89 glUniform4f(color_a_location
, 0.25f
, 0.0f
, 0.0f
, 0.0f
);
90 glUniform4fv(color_b_location
, 2, color_b
);
91 glUniform4f(color_c_location
, 0.0f
, 0.0f
, 0.0f
, 1.0f
);
93 glDrawArrays(GL_TRIANGLES
, 0, 6);
95 static const uint8 expected
[] = { 64, 128, 192, 255 };
97 GLTestHelper::CheckPixels(0, 0, kResolution
, kResolution
, 1, expected
));
99 GLTestHelper::CheckGLError("no errors", __LINE__
);
102 TEST_F(BindUniformLocationTest
, Compositor
) {
104 GLTestHelper::HasExtension("GL_CHROMIUM_bind_uniform_location"));
106 static const char* v_shader_str
= SHADER(
107 attribute vec4 a_position
;
108 attribute vec2 a_texCoord
;
110 uniform vec2 color_a
[4];
111 uniform vec4 color_b
;
112 varying vec4 v_color
;
115 v_color
.xy
= color_a
[0] + color_a
[1];
116 v_color
.zw
= color_a
[2] + color_a
[3];
118 gl_Position
= matrix
* a_position
;
122 static const char* f_shader_str
= SHADER(
123 precision mediump
float;
124 varying vec4 v_color
;
126 uniform vec4 multiplier
;
127 uniform vec3 color_c
[8];
130 vec4 color_c_sum
= vec4(0.0);
131 color_c_sum
.xyz
+= color_c
[0];
132 color_c_sum
.xyz
+= color_c
[1];
133 color_c_sum
.xyz
+= color_c
[2];
134 color_c_sum
.xyz
+= color_c
[3];
135 color_c_sum
.xyz
+= color_c
[4];
136 color_c_sum
.xyz
+= color_c
[5];
137 color_c_sum
.xyz
+= color_c
[6];
138 color_c_sum
.xyz
+= color_c
[7];
139 color_c_sum
.w
= alpha
;
140 color_c_sum
*= multiplier
;
141 gl_FragColor
= v_color
+ color_c_sum
;
146 int matrix_location
= counter
++;
147 int color_a_location
= counter
++;
148 int color_b_location
= counter
++;
149 int alpha_location
= counter
++;
150 int multiplier_location
= counter
++;
151 int color_c_location
= counter
++;
153 GLuint vertex_shader
= GLTestHelper::LoadShader(
154 GL_VERTEX_SHADER
, v_shader_str
);
155 GLuint fragment_shader
= GLTestHelper::LoadShader(
156 GL_FRAGMENT_SHADER
, f_shader_str
);
158 GLuint program
= glCreateProgram();
160 glBindUniformLocationCHROMIUM(program
, matrix_location
, "matrix");
161 glBindUniformLocationCHROMIUM(program
, color_a_location
, "color_a");
162 glBindUniformLocationCHROMIUM(program
, color_b_location
, "color_b");
163 glBindUniformLocationCHROMIUM(program
, alpha_location
, "alpha");
164 glBindUniformLocationCHROMIUM(program
, multiplier_location
, "multiplier");
165 glBindUniformLocationCHROMIUM(program
, color_c_location
, "color_c");
167 glAttachShader(program
, vertex_shader
);
168 glAttachShader(program
, fragment_shader
);
170 glLinkProgram(program
);
171 // Check the link status
173 glGetProgramiv(program
, GL_LINK_STATUS
, &linked
);
174 EXPECT_EQ(1, linked
);
176 GLint position_loc
= glGetAttribLocation(program
, "a_position");
178 GLTestHelper::SetupUnitQuad(position_loc
);
180 glUseProgram(program
);
182 static const float color_a
[] = {
183 0.1f
, 0.1f
, 0.1f
, 0.1f
,
184 0.1f
, 0.1f
, 0.1f
, 0.1f
,
187 static const float color_c
[] = {
198 static const float identity
[] = {
199 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
202 glUniformMatrix4fv(matrix_location
, 1, false, identity
);
203 glUniform2fv(color_a_location
, 4, color_a
);
204 glUniform4f(color_b_location
, 0.2f
, 0.2f
, 0.2f
, 0.2f
);
205 glUniform1f(alpha_location
, 0.8f
);
206 glUniform4f(multiplier_location
, 0.5f
, 0.5f
, 0.5f
, 0.5f
);
207 glUniform3fv(color_c_location
, 8, color_c
);
209 glDrawArrays(GL_TRIANGLES
, 0, 6);
211 static const uint8 expected
[] = { 204, 204, 204, 204 };
213 GLTestHelper::CheckPixels(0, 0, kResolution
, kResolution
, 1, expected
));
215 GLTestHelper::CheckGLError("no errors", __LINE__
);