15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 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>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_manager.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_test_utils.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLTest : public testing::Test {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gl_.Initialize(GLManager::Options());
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.Destroy();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLManager gl_;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that GL is at least minimally working.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLTest, Basic) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClear(GL_COLOR_BUFFER_BIT);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 expected[] = { 0, 255, 0, 255, };
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected));
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GLTestHelper::CheckGLError("no errors", __LINE__);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLTest, BasicFBO) {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GLuint tex = 0;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glGenTextures(1, &tex);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GLuint fbo = 0;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glGenFramebuffers(1, &fbo);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex);
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<uint8[]> pixels(new uint8 [16*16*4]);
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  memset(pixels.get(), 0, 16*16*4);
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               pixels.get());
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glGenerateMipmap(GL_TEXTURE_2D);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         tex, 0);
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            glCheckFramebufferStatus(GL_FRAMEBUFFER));
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glClear(GL_COLOR_BUFFER_BIT);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint8 expected[] = { 0, 255, 0, 255, };
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 16, 16, 0, expected));
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glDeleteFramebuffers(1, &fbo);
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  glDeleteTextures(1, &tex);
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GLTestHelper::CheckGLError("no errors", __LINE__);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLTest, SimpleShader) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* v_shader_str =
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "attribute vec4 a_Position;\n"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "void main()\n"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{\n"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "   gl_Position = a_Position;\n"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n";
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* f_shader_str =
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "precision mediump float;\n"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "void main()\n"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{\n"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n";
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glUseProgram(program);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint position_loc = glGetAttribLocation(program, "a_Position");
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLTestHelper::SetupUnitQuad(position_loc);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 expected_clear[] = { 127, 0, 255, 0, };
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClearColor(0.5f, 0.0f, 1.0f, 0.0f);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClear(GL_COLOR_BUFFER_BIT);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 1, expected_clear));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 expected_draw[] = { 0, 255, 0, 255, };
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glDrawArrays(GL_TRIANGLES, 0, 6);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_draw));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLTest, GetString) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "OpenGL ES 2.0 Chromium",
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const char*>(glGetString(GL_VERSION)));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "OpenGL ES GLSL ES 1.0 Chromium",
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION)));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Chromium",
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const char*>(glGetString(GL_RENDERER)));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Chromium",
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<const char*>(glGetString(GL_VENDOR)));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112