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> 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) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SHADER(Src) #Src 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLVirtualContextsTest : public testing::Test { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kSize0 = 4; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kSize1 = 8; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kSize2 = 16; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager::Options options; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(kSize0, kSize0); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_real_.Initialize(options); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_real_shared_.Initialize(options); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.virtual_manager = &gl_real_shared_; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(kSize1, kSize1); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl1_.Initialize(options); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(kSize2, kSize2); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl2_.Initialize(options); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl1_.Destroy(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl2_.Destroy(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_real_shared_.Destroy(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_real_.Destroy(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl_real_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl_real_shared_; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl1_; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl2_; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_ANDROID) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupSimpleShader(const uint8* color) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* v_shader_str = SHADER( 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attribute vec4 a_Position; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void main() 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_Position = a_Position; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* f_shader_str = SHADER( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) precision mediump float; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uniform vec4 u_color; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void main() 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_FragColor = u_color; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glUseProgram(program); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint position_loc = glGetAttribLocation(program, "a_Position"); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::SetupUnitQuad(position_loc); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint color_loc = glGetUniformLocation(program, "u_color"); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glUniform4f( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_loc, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color[0] / 255.0f, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color[1] / 255.0f, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color[2] / 255.0f, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color[3] / 255.0f); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestDraw(int size) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 expected_clear[] = { 127, 0, 255, 0, }; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClearColor(0.5f, 0.0f, 1.0f, 0.0f); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, size, size, 1, expected_clear)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // !defined(OS_ANDROID) 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http://crbug.com/281565 99424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#if !defined(OS_ANDROID) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLVirtualContextsTest, Basic) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestInfo { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 color[4]; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* manager; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumTests = 3; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInfo tests[] = { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kSize0, { 255, 0, 0, 0, }, &gl_real_, }, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kSize1, { 0, 255, 0, 0, }, &gl1_, }, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kSize2, { 0, 0, 255, 0, }, &gl2_, }, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ii = 0; ii < kNumTests; ++ii) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestInfo& test = tests[ii]; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* gl_manager = test.manager; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_manager->MakeCurrent(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupSimpleShader(test.color); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ii = 0; ii < kNumTests; ++ii) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestInfo& test = tests[ii]; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* gl_manager = test.manager; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_manager->MakeCurrent(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDraw(test.size); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ii = 0; ii < kNumTests; ++ii) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestInfo& test = tests[ii]; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* gl_manager = test.manager; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_manager->MakeCurrent(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, test.size, test.size, 0, test.color)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ii = 0; ii < kNumTests; ++ii) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestInfo& test = tests[ii]; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* gl_manager = test.manager; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_manager->MakeCurrent(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::CheckGLError("no errors", __LINE__); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146