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