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__);