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