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