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>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2extchromium.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_lib.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/common/mailbox.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/mailbox_manager.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_manager.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_share_group.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 ReadTexel(GLuint id, GLint x, GLint y) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint old_fbo = 0;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_fbo);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint fbo;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenFramebuffers(1, &fbo);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glFramebufferTexture2D(GL_FRAMEBUFFER,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         GL_COLOR_ATTACHMENT0,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         GL_TEXTURE_2D,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         id,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         0);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Some drivers (NVidia/SGX) require texture settings to be a certain way or
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // they won't report FRAMEBUFFER_COMPLETE.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            glCheckFramebufferStatus(GL_FRAMEBUFFER));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  uint32 texel = 0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &texel);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindFramebuffer(GL_FRAMEBUFFER, old_fbo);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glDeleteFramebuffers(1, &fbo);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return texel;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLTextureMailboxTest : public testing::Test {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gl1_.Initialize(GLManager::Options());
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLManager::Options options;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    options.share_mailbox_manager = &gl1_;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gl2_.Initialize(options);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl1_.Destroy();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl2_.Destroy();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLManager gl1_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLManager gl2_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLTextureMailboxTest, ProduceAndConsumeTexture) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl1_.MakeCurrent();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLbyte mailbox1[GL_MAILBOX_SIZE_CHROMIUM];
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenMailboxCHROMIUM(mailbox1);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLbyte mailbox2[GL_MAILBOX_SIZE_CHROMIUM];
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenMailboxCHROMIUM(mailbox2);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint tex1;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenTextures(1, &tex1);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex1);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 source_pixel = 0xFF0000FF;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexImage2D(GL_TEXTURE_2D,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               0,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GL_RGBA,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               1, 1,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               0,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GL_RGBA,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GL_UNSIGNED_BYTE,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &source_pixel);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox1);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glFlush();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl2_.MakeCurrent();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint tex2;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenTextures(1, &tex2);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex2);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox1);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(source_pixel, ReadTexel(tex2, 0, 0));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox2);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glFlush();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl1_.MakeCurrent();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex1);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox2);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(source_pixel, ReadTexel(tex1, 0, 0));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLTextureMailboxTest, ConsumeTextureValidatesKey) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint tex;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenTextures(1, &tex);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 source_pixel = 0xFF0000FF;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glTexImage2D(GL_TEXTURE_2D,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               0,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GL_RGBA,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               1, 1,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               0,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GL_RGBA,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GL_UNSIGNED_BYTE,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &source_pixel);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLbyte invalid_mailbox[GL_MAILBOX_SIZE_CHROMIUM];
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glGenMailboxCHROMIUM(invalid_mailbox);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++invalid_mailbox[GL_MAILBOX_SIZE_CHROMIUM - 1];
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glConsumeTextureCHROMIUM(GL_TEXTURE_2D, invalid_mailbox);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure level 0 is still intact after glConsumeTextureCHROMIUM fails.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(source_pixel, ReadTexel(tex, 0, 0));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(GLTextureMailboxTest, SharedTextures) {
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint tex1;
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenTextures(1, &tex1);
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex1);
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  uint32 source_pixel = 0xFF0000FF;
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glTexImage2D(GL_TEXTURE_2D,
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               0,
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_RGBA,
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               1, 1,
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               0,
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_RGBA,
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_UNSIGNED_BYTE,
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               &source_pixel);
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLbyte mailbox[GL_MAILBOX_SIZE_CHROMIUM];
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenMailboxCHROMIUM(mailbox);
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox);
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glFlush();
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.MakeCurrent();
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint tex2;
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenTextures(1, &tex2);
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex2);
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox);
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Change texture in context 2.
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source_pixel = 0xFF00FF00;
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glTexSubImage2D(GL_TEXTURE_2D,
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  0,
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  0, 0,
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  1, 1,
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  GL_RGBA,
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  GL_UNSIGNED_BYTE,
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  &source_pixel);
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glFlush();
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Check it in context 1.
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(source_pixel, ReadTexel(tex1, 0, 0));
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Change parameters (note: ReadTexel will reset those).
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  GL_LINEAR_MIPMAP_NEAREST);
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glFlush();
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Check in context 2.
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.MakeCurrent();
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLint parameter = 0;
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &parameter);
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GL_REPEAT, parameter);
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  parameter = 0;
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &parameter);
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GL_LINEAR, parameter);
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  parameter = 0;
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &parameter);
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(GL_LINEAR_MIPMAP_NEAREST, parameter);
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Delete texture in context 1.
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glDeleteTextures(1, &tex1);
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Check texture still exists in context 2.
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.MakeCurrent();
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(source_pixel, ReadTexel(tex2, 0, 0));
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The mailbox should still exist too.
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint tex3;
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenTextures(1, &tex3);
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex3);
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox);
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Delete both textures.
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glDeleteTextures(1, &tex2);
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glDeleteTextures(1, &tex3);
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Mailbox should be gone now.
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenTextures(1, &tex2);
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex2);
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox);
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glDeleteTextures(1, &tex2);
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(GLTextureMailboxTest, ProduceFrontBuffer) {
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Mailbox mailbox;
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenMailboxCHROMIUM(mailbox.name);
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.MakeCurrent();
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.decoder()->ProduceFrontBuffer(mailbox);
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint tex1;
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenTextures(1, &tex1);
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, tex1);
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.MakeCurrent();
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glResizeCHROMIUM(10, 10, 1);
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glClearColor(1, 0, 0, 1);
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glClear(GL_COLOR_BUFFER_BIT);
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ::gles2::GetGLContext()->SwapBuffers();
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0));
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 9, 9));
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.MakeCurrent();
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glClearColor(0, 1, 0, 1);
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glClear(GL_COLOR_BUFFER_BIT);
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glFlush();
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0));
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.MakeCurrent();
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ::gles2::GetGLContext()->SwapBuffers();
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0xFF00FF00u, ReadTexel(tex1, 0, 0));
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.MakeCurrent();
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl2_.Destroy();
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0xFF00FF00u, ReadTexel(tex1, 0, 0));
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glDeleteTextures(1, &tex1);
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
292424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// http://crbug.com/281565
293424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#if !defined(OS_ANDROID)
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(GLTextureMailboxTest, ProduceFrontBufferMultipleContexts) {
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Mailbox mailbox[2];
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenMailboxCHROMIUM(mailbox[0].name);
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenMailboxCHROMIUM(mailbox[1].name);
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint tex[2];
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glGenTextures(2, tex);
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLManager::Options options;
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  options.share_mailbox_manager = &gl1_;
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLManager other_gl[2];
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < 2; ++i) {
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    other_gl[i].Initialize(options);
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    other_gl[i].MakeCurrent();
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    other_gl[i].decoder()->ProduceFrontBuffer(mailbox[i]);
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Make sure both "other gl" are in the same share group.
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!options.share_group_manager)
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      options.share_group_manager = other_gl+i;
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < 2; ++i) {
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    glBindTexture(GL_TEXTURE_2D, tex[i]);
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox[i].name);
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < 2; ++i) {
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    other_gl[i].MakeCurrent();
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    glResizeCHROMIUM(10, 10, 1);
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    glClearColor(1-i%2, i%2, 0, 1);
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    glClear(GL_COLOR_BUFFER_BIT);
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ::gles2::GetGLContext()->SwapBuffers();
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0xFF0000FFu, ReadTexel(tex[0], 0, 0));
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0xFF00FF00u, ReadTexel(tex[1], 9, 9));
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < 2; ++i) {
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    other_gl[i].MakeCurrent();
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    other_gl[i].Destroy();
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gl1_.MakeCurrent();
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  glDeleteTextures(2, tex);
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
342424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
346