12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2.h> 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2ext.h> 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/tests/gl_manager.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/tests/gl_test_utils.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SHADER(Src) #Src 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gpu { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GLStreamDrawTest : public testing::Test { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const int kSize = 4; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager::Options options; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(kSize, kSize); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_.Initialize(options); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_.Destroy(); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager gl_; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GLuint SetupProgram() { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char* v_shader_str = SHADER( 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attribute vec4 a_position; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attribute vec4 a_color; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) varying vec4 v_color; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void main() 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_Position = a_position; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) v_color = a_color; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char* f_shader_str = SHADER( 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) precision mediump float; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) varying vec4 v_color; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void main() 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_FragColor = v_color; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glUseProgram(program); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return program; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // anonymous namespace. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLStreamDrawTest, Basic) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static GLfloat float_red[4] = { 1.0f, 0.0f, 0.0f, 1.0f, }; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static GLfloat float_green[4] = { 0.0f, 1.0f, 0.0f, 1.0f, }; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static uint8 expected_red[4] = {255, 0, 0, 255, }; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static uint8 expected_green[4] = {0, 255, 0, 255, }; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint program = SetupProgram(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint position_loc = glGetAttribLocation(program, "a_position"); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint color_loc = glGetAttribLocation(program, "a_color"); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::SetupUnitQuad(position_loc); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::SetupColorsForUnitQuad(color_loc, float_red, GL_STREAM_DRAW); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_red)); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::SetupColorsForUnitQuad(color_loc, float_green, GL_STATIC_DRAW); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_green)); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::CheckGLError("no errors", __LINE__); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http://crbug.com/281565 86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#if !defined(OS_ANDROID) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLStreamDrawTest, DrawElements) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static GLfloat float_red[4] = { 1.0f, 0.0f, 0.0f, 1.0f, }; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static GLfloat float_green[4] = { 0.0f, 1.0f, 0.0f, 1.0f, }; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static uint8 expected_red[4] = {255, 0, 0, 255, }; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static uint8 expected_green[4] = {0, 255, 0, 255, }; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint program = SetupProgram(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint position_loc = glGetAttribLocation(program, "a_position"); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint color_loc = glGetAttribLocation(program, "a_color"); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::SetupUnitQuad(position_loc); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::SetupColorsForUnitQuad(color_loc, float_red, GL_STREAM_DRAW); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint index_buffer = 0; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glGenBuffers(1, &index_buffer); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static GLubyte indices[] = { 0, 1, 2, 3, 4, 5, }; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBufferData( 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STREAM_DRAW); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, NULL); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_red)); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::SetupColorsForUnitQuad(color_loc, float_green, GL_STATIC_DRAW); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBufferData( 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, NULL); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_green)); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::CheckGLError("no errors", __LINE__); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLStreamDrawTest, VertexArrayObjects) { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GLTestHelper::HasExtension("GL_OES_vertex_array_object")) { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static GLfloat float_red[4] = { 1.0f, 0.0f, 0.0f, 1.0f, }; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static GLfloat float_green[4] = { 0.0f, 1.0f, 0.0f, 1.0f, }; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static uint8 expected_red[4] = {255, 0, 0, 255, }; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static uint8 expected_green[4] = {0, 255, 0, 255, }; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint program = SetupProgram(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint position_loc = glGetAttribLocation(program, "a_position"); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint color_loc = glGetAttribLocation(program, "a_color"); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint vaos[2]; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glGenVertexArraysOES(2, vaos); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBindVertexArrayOES(vaos[0]); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint position_buffer = GLTestHelper::SetupUnitQuad(position_loc); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::SetupColorsForUnitQuad(color_loc, float_red, GL_STREAM_DRAW); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBindVertexArrayOES(vaos[1]); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBindBuffer(GL_ARRAY_BUFFER, position_buffer); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glEnableVertexAttribArray(position_loc); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glVertexAttribPointer(position_loc, 2, GL_FLOAT, GL_FALSE, 0, 0); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::SetupColorsForUnitQuad(color_loc, float_green, GL_STATIC_DRAW); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int ii = 0; ii < 2; ++ii) { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBindVertexArrayOES(vaos[0]); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_red)); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBindVertexArrayOES(vaos[1]); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::CheckPixels(0, 0, kSize, kSize, 0, expected_green)); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::CheckGLError("no errors", __LINE__); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace gpu 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 161