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, ¶meter); 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(GL_REPEAT, parameter); 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) parameter = 0; 206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, ¶meter); 207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(GL_LINEAR, parameter); 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) parameter = 0; 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, ¶meter); 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