15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2ext.h>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2extchromium.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_manager.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_test_utils.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SHADER(Src) #Src
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BindUniformLocationTest : public testing::Test {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLsizei kResolution = 4;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLManager::Options options;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options.size = gfx::Size(kResolution, kResolution);
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gl_.Initialize(options);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.Destroy();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLManager gl_;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindUniformLocationTest, Basic) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLTestHelper::HasExtension("GL_CHROMIUM_bind_uniform_location"));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* v_shader_str = SHADER(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attribute vec4 a_position;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void main()
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         gl_Position = a_position;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* f_shader_str = SHADER(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      precision mediump float;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform vec4 u_colorC;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform vec4 u_colorB[2];
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform vec4 u_colorA;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void main()
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_FragColor = u_colorA + u_colorB[0] + u_colorB[1] + u_colorC;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint color_a_location = 3;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint color_b_location = 10;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint color_c_location = 5;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint vertex_shader = GLTestHelper::LoadShader(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_VERTEX_SHADER, v_shader_str);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint fragment_shader = GLTestHelper::LoadShader(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_FRAGMENT_SHADER, f_shader_str);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = glCreateProgram();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindUniformLocationCHROMIUM(program, color_a_location, "u_colorA");
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindUniformLocationCHROMIUM(program, color_b_location, "u_colorB[0]");
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindUniformLocationCHROMIUM(program, color_c_location, "u_colorC");
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glAttachShader(program, vertex_shader);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glAttachShader(program, fragment_shader);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Link the program
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glLinkProgram(program);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the link status
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint linked = 0;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGetProgramiv(program, GL_LINK_STATUS, &linked);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, linked);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint position_loc = glGetAttribLocation(program, "a_position");
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLTestHelper::SetupUnitQuad(position_loc);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUseProgram(program);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float color_b[] = {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.0f, 0.50f, 0.0f, 0.0f,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.0f, 0.0f, 0.75f, 0.0f,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform4f(color_a_location, 0.25f, 0.0f, 0.0f, 0.0f);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform4fv(color_b_location, 2, color_b);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform4f(color_c_location, 0.0f, 0.0f, 0.0f, 1.0f);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glDrawArrays(GL_TRIANGLES, 0, 6);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint8 expected[] = { 64, 128, 192, 255 };
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLTestHelper::CheckPixels(0, 0, kResolution, kResolution, 1, expected));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLTestHelper::CheckGLError("no errors", __LINE__);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BindUniformLocationTest, Compositor) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLTestHelper::HasExtension("GL_CHROMIUM_bind_uniform_location"));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* v_shader_str = SHADER(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attribute vec4 a_position;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      attribute vec2 a_texCoord;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform mat4 matrix;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform vec2 color_a[4];
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform vec4 color_b;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      varying vec4 v_color;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void main()
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          v_color.xy = color_a[0] + color_a[1];
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          v_color.zw = color_a[2] + color_a[3];
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          v_color += color_b;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gl_Position = matrix * a_position;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* f_shader_str =  SHADER(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      precision mediump float;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      varying vec4 v_color;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform float alpha;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform vec4 multiplier;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uniform vec3 color_c[8];
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      void main()
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          vec4 color_c_sum = vec4(0.0);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum.xyz += color_c[0];
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum.xyz += color_c[1];
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum.xyz += color_c[2];
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum.xyz += color_c[3];
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum.xyz += color_c[4];
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum.xyz += color_c[5];
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum.xyz += color_c[6];
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum.xyz += color_c[7];
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum.w = alpha;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          color_c_sum *= multiplier;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gl_FragColor = v_color + color_c_sum;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int counter = 0;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int matrix_location = counter++;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int color_a_location = counter++;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int color_b_location = counter++;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int alpha_location = counter++;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int multiplier_location = counter++;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int color_c_location = counter++;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint vertex_shader = GLTestHelper::LoadShader(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_VERTEX_SHADER, v_shader_str);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint fragment_shader = GLTestHelper::LoadShader(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_FRAGMENT_SHADER, f_shader_str);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = glCreateProgram();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindUniformLocationCHROMIUM(program, matrix_location, "matrix");
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindUniformLocationCHROMIUM(program, color_a_location, "color_a");
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindUniformLocationCHROMIUM(program, color_b_location, "color_b");
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindUniformLocationCHROMIUM(program, alpha_location, "alpha");
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindUniformLocationCHROMIUM(program, multiplier_location, "multiplier");
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindUniformLocationCHROMIUM(program, color_c_location, "color_c");
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glAttachShader(program, vertex_shader);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glAttachShader(program, fragment_shader);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Link the program
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glLinkProgram(program);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the link status
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint linked = 0;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGetProgramiv(program, GL_LINK_STATUS, &linked);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, linked);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint position_loc = glGetAttribLocation(program, "a_position");
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLTestHelper::SetupUnitQuad(position_loc);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUseProgram(program);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float color_a[] = {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f, 0.1f,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f, 0.1f,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float color_c[] = {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0.1f, 0.1f, 0.1f,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float identity[] = {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniformMatrix4fv(matrix_location, 1, false, identity);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform2fv(color_a_location, 4, color_a);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform4f(color_b_location, 0.2f, 0.2f, 0.2f, 0.2f);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform1f(alpha_location, 0.8f);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform4f(multiplier_location, 0.5f, 0.5f, 0.5f, 0.5f);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUniform3fv(color_c_location, 8, color_c);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glDrawArrays(GL_TRIANGLES, 0, 6);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint8 expected[] = { 204, 204, 204, 204 };
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLTestHelper::CheckPixels(0, 0, kResolution, kResolution, 1, expected));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLTestHelper::CheckGLError("no errors", __LINE__);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225