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) 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) 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static const GLfloat kFloatRed[4]; 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static const GLfloat kFloatGreen[4]; 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static const uint8 kExpectedRed[4]; 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static const uint8 kExpectedGreen[4]; 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager::Options options; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(kSize0, kSize0); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_real_.Initialize(options); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_real_shared_.Initialize(options); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.virtual_manager = &gl_real_shared_; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(kSize1, kSize1); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl1_.Initialize(options); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(kSize2, kSize2); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl2_.Initialize(options); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl1_.Destroy(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl2_.Destroy(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_real_shared_.Destroy(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_real_.Destroy(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLuint SetupColoredVertexProgram() { 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static const char* v_shader_str = SHADER( 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch attribute vec4 a_position; 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch attribute vec4 a_color; 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch varying vec4 v_color; 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void main() 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl_Position = a_position; 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v_color = a_color; 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ); 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static const char* f_shader_str = SHADER( 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch precision mediump float; 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch varying vec4 v_color; 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void main() 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl_FragColor = v_color; 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ); 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glUseProgram(program); 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return program; 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void SetUpColoredUnitQuad(const GLfloat* color) { 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLuint program1 = SetupColoredVertexProgram(); 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLuint position_loc1 = glGetAttribLocation(program1, "a_position"); 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLuint color_loc1 = glGetAttribLocation(program1, "a_color"); 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::SetupUnitQuad(position_loc1); 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::SetupColorsForUnitQuad(color_loc1, color, GL_STATIC_DRAW); 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl_real_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl_real_shared_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl1_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl2_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst GLfloat GLVirtualContextsTest::kFloatRed[4] = { 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1.0f, 0.0f, 0.0f, 1.0f, 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst GLfloat GLVirtualContextsTest::kFloatGreen[4] = { 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 0.0f, 1.0f, 0.0f, 1.0f, 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst uint8 GLVirtualContextsTest::kExpectedRed[4] = { 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 255, 0, 0, 255, 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst uint8 GLVirtualContextsTest::kExpectedGreen[4] = { 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 0, 255, 0, 255, 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupSimpleShader(const uint8* color) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* v_shader_str = SHADER( 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attribute vec4 a_Position; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void main() 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_Position = a_Position; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* f_shader_str = SHADER( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) precision mediump float; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uniform vec4 u_color; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void main() 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_FragColor = u_color; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glUseProgram(program); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint position_loc = glGetAttribLocation(program, "a_Position"); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::SetupUnitQuad(position_loc); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint color_loc = glGetUniformLocation(program, "u_color"); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glUniform4f( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_loc, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color[0] / 255.0f, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color[1] / 255.0f, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color[2] / 255.0f, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color[3] / 255.0f); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestDraw(int size) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 expected_clear[] = { 127, 0, 255, 0, }; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClearColor(0.5f, 0.0f, 1.0f, 0.0f); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, size, size, 1, expected_clear)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http://crbug.com/281565 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLVirtualContextsTest, Basic) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestInfo { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 color[4]; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* manager; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumTests = 3; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInfo tests[] = { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kSize0, { 255, 0, 0, 0, }, &gl_real_, }, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kSize1, { 0, 255, 0, 0, }, &gl1_, }, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kSize2, { 0, 0, 255, 0, }, &gl2_, }, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ii = 0; ii < kNumTests; ++ii) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestInfo& test = tests[ii]; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* gl_manager = test.manager; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_manager->MakeCurrent(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupSimpleShader(test.color); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ii = 0; ii < kNumTests; ++ii) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestInfo& test = tests[ii]; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* gl_manager = test.manager; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_manager->MakeCurrent(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDraw(test.size); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ii = 0; ii < kNumTests; ++ii) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestInfo& test = tests[ii]; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* gl_manager = test.manager; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_manager->MakeCurrent(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels( 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, test.size, test.size, 0, test.color)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int ii = 0; ii < kNumTests; ++ii) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestInfo& test = tests[ii]; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager* gl_manager = test.manager; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_manager->MakeCurrent(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::CheckGLError("no errors", __LINE__); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// http://crbug.com/363407 1920529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(GLVirtualContextsTest, VertexArrayObjectRestore) { 1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLuint vao1 = 0, vao2 = 0; 1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl1_.MakeCurrent(); 1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set up red quad in vao1. 1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glGenVertexArraysOES(1, &vao1); 1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(vao1); 1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SetUpColoredUnitQuad(kFloatRed); 2000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl2_.MakeCurrent(); 2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set up green quad in vao2. 2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glGenVertexArraysOES(1, &vao2); 2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(vao2); 2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SetUpColoredUnitQuad(kFloatGreen); 2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl1_.MakeCurrent(); 2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Test to ensure that vao1 is still the active VAO for this context. 2110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glDrawArrays(GL_TRIANGLES, 0, 6); 2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize1, kSize1, 0, kExpectedRed)); 2130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::CheckGLError("no errors", __LINE__); 2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl2_.MakeCurrent(); 2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Test to ensure that vao2 is still the active VAO for this context. 2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glDrawArrays(GL_TRIANGLES, 0, 6); 2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE( 2200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::CheckPixels(0, 0, kSize2, kSize2, 0, kExpectedGreen)); 2210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::CheckGLError("no errors", __LINE__); 2230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// http://crbug.com/363407 2260529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(GLVirtualContextsTest, VertexArrayObjectRestoreRebind) { 2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLuint vao1 = 0, vao2 = 0; 2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl1_.MakeCurrent(); 2300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set up red quad in vao1. 2310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glGenVertexArraysOES(1, &vao1); 2320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(vao1); 2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SetUpColoredUnitQuad(kFloatRed); 2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl2_.MakeCurrent(); 2370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set up green quad in new vao2. 2380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glGenVertexArraysOES(1, &vao2); 2390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(vao2); 2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SetUpColoredUnitQuad(kFloatGreen); 2410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl1_.MakeCurrent(); 2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Test to ensure that vao1 hasn't been corrupted after rebinding. 2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Bind 0 is required so that bind vao1 is not optimized away in the service. 2460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(0); 2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(vao1); 2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glDrawArrays(GL_TRIANGLES, 0, 6); 2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize1, kSize1, 0, kExpectedRed)); 2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::CheckGLError("no errors", __LINE__); 2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl2_.MakeCurrent(); 2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Test to ensure that vao1 hasn't been corrupted after rebinding. 2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Bind 0 is required so that bind vao2 is not optimized away in the service. 2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(0); 2570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(vao2); 2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glDrawArrays(GL_TRIANGLES, 0, 6); 2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE( 2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::CheckPixels(0, 0, kSize2, kSize2, 0, kExpectedGreen)); 2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::CheckGLError("no errors", __LINE__); 2640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// http://crbug.com/363407 2670529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(GLVirtualContextsTest, VertexArrayObjectRestoreDefault) { 2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl1_.MakeCurrent(); 2690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set up red quad in default VAO. 2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SetUpColoredUnitQuad(kFloatRed); 2710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl2_.MakeCurrent(); 2740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set up green quad in default VAO. 2750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SetUpColoredUnitQuad(kFloatGreen); 2760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Gen & bind a non-default VAO. 2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLuint vao; 2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glGenVertexArraysOES(1, &vao); 2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(vao); 2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl1_.MakeCurrent(); 2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Test to ensure that default VAO on gl1_ is still valid. 2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glDrawArrays(GL_TRIANGLES, 0, 6); 2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kSize1, kSize1, 0, kExpectedRed)); 2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gl2_.MakeCurrent(); 2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Test to ensure that default VAO on gl2_ is still valid. 2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // This tests that a default VAO is restored even when it's not currently 2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // bound during the context switch. 2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glBindVertexArrayOES(0); 2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glDrawArrays(GL_TRIANGLES, 0, 6); 2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE( 2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::CheckPixels(0, 0, kSize2, kSize2, 0, kExpectedGreen)); 2980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glFinish(); 2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLTestHelper::CheckGLError("no errors", __LINE__); 3010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305