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)#ifndef GL_GLEXT_PROTOTYPES 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GL_GLEXT_PROTOTYPES 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2ext.h> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2extchromium.h> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_manager.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/tests/gl_test_utils.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A collection of tests that exercise the GL_CHROMIUM_copy_texture extension. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLCopyTextureCHROMIUMTest : public testing::Test { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_.Initialize(GLManager::Options()); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenTextures(2, textures_); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[1]); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Some drivers (NVidia/SGX) require texture settings to be a certain way or 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // they won't report FRAMEBUFFER_COMPLETE. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenFramebuffers(1, &framebuffer_id_); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id_); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textures_[1], 0); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteTextures(2, textures_); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteFramebuffers(1, &framebuffer_id_); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.Destroy(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl_; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint textures_[2]; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint framebuffer_id_; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to ensure that the basic functionality of the extension works. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, Basic) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u }; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(glGetError() == GL_NO_ERROR); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the FB is still bound. 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint value = 0; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &value); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint fb_id = value; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(framebuffer_id_, fb_id); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check that FB is complete. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glCheckFramebufferStatus(GL_FRAMEBUFFER)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTestHelper::CheckPixels(0, 0, 1, 1, 0, pixels); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, InternalFormat) { 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GLint src_formats[] = {GL_ALPHA, GL_RGB, GL_RGBA, 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT}; 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GLint dest_formats[] = {GL_RGB, GL_RGBA}; 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (size_t src_index = 0; src_index < arraysize(src_formats); src_index++) { 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (size_t dest_index = 0; dest_index < arraysize(dest_formats); 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dest_index++) { 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0, 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) src_formats[src_index], 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1, 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1, 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0, 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) src_formats[src_index], 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_UNSIGNED_BYTE, 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NULL); 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) textures_[0], 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) textures_[1], 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0, 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dest_formats[dest_index], 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_UNSIGNED_BYTE); 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()) << "src_index:" << src_index 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) << " dest_index:" << dest_index; 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, InternalFormatNotSupported) { 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glTexImage2D( 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Check unsupported format reports error. 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GLint unsupported_dest_formats[] = {GL_ALPHA, GL_LUMINANCE, 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GL_LUMINANCE_ALPHA}; 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (size_t dest_index = 0; dest_index < arraysize(unsupported_dest_formats); 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dest_index++) { 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, 12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) textures_[0], 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) textures_[1], 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0, 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) unsupported_dest_formats[dest_index], 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_UNSIGNED_BYTE); 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_INVALID_OPERATION == glGetError()) 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) << "dest_index:" << dest_index; 13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Test to ensure that the destination texture is redefined if the properties 13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// are different. 13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, RedefineDestinationTexture) { 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint8 pixels[4 * 4] = {255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u, 13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u}; 13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glTexImage2D( 14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[1]); 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0, 14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_BGRA_EXT, 14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1, 14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1, 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 0, 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_BGRA_EXT, 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_UNSIGNED_BYTE, 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pixels); 15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // GL_INVALID_OPERATION due to "intrinsic format" != "internal format". 15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glTexSubImage2D( 15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_INVALID_OPERATION == glGetError()); 15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // GL_INVALID_VALUE due to bad dimensions. 16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glTexSubImage2D( 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels); 16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_INVALID_VALUE == glGetError()); 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // If the dest texture has different properties, glCopyTextureCHROMIUM() 16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // redefines them. 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glCopyTextureCHROMIUM( 16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, GL_UNSIGNED_BYTE); 16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // glTexSubImage2D() succeeds because textures_[1] is redefined into 2x2 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // dimension and GL_RGBA format. 17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[1]); 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glTexSubImage2D( 17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Check the FB is still bound. 17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GLint value = 0; 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &value); 18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GLuint fb_id = value; 18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(framebuffer_id_, fb_id); 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Check that FB is complete. 18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) glCheckFramebufferStatus(GL_FRAMEBUFFER)); 18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GLTestHelper::CheckPixels(1, 1, 1, 1, 0, &pixels[12]); 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the extension respects the flip-y pixel storage setting. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, FlipY) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[2][2][4]; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][0] = x + y; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][1] = x + y; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][2] = x + y; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][3] = 255u; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[2][2][4] = {{{0}}}; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][0], copied_pixels[y][x][0]); 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][1], copied_pixels[y][x][1]); 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][2], copied_pixels[y][x][2]); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][3], copied_pixels[y][x][3]); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the extension respects the GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// storage setting. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, PremultiplyAlpha) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 2, 2, 2, 128 }; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE); 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[1 * 4] = {0}; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, copied_pixels[0]); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, copied_pixels[1]); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, copied_pixels[2]); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(128u, copied_pixels[3]); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the extension respects the GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// storage setting. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, UnpremultiplyAlpha) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 16, 16, 16, 128 }; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE); 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[1 * 4] = {0}; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(32u, copied_pixels[0]); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(32u, copied_pixels[1]); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(32u, copied_pixels[2]); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(128u, copied_pixels[3]); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, FlipYAndPremultiplyAlpha) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[2][2][4]; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 color = 16 * x + 16 * y; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][0] = color; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][1] = color; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][2] = color; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][3] = 128u; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE); 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[2][2][4] = {{{0}}}; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][0] / 2, copied_pixels[y][x][0]); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][1] / 2, copied_pixels[y][x][1]); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][2] / 2, copied_pixels[y][x][2]); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][3], copied_pixels[y][x][3]); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, FlipYAndUnpremultiplyAlpha) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[2][2][4]; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 color = 16 * x + 16 * y; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][0] = color; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][1] = color; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][2] = color; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][3] = 128u; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE); 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[2][2][4] = {{{0}}}; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][0] * 2, copied_pixels[y][x][0]); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][1] * 2, copied_pixels[y][x][1]); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][2] * 2, copied_pixels[y][x][2]); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][3], copied_pixels[y][x][3]); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void glEnableDisable(GLint param, GLboolean value) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnable(param); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDisable(param); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // unnamed namespace 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validate that some basic GL state is not touched upon execution of 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the extension. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, BasicStatePreservation) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u }; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindFramebuffer(GL_FRAMEBUFFER, 0); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLboolean reference_settings[2] = { GL_TRUE, GL_FALSE }; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLboolean setting = reference_settings[x]; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_DEPTH_TEST, setting); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_SCISSOR_TEST, setting); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_STENCIL_TEST, setting); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_CULL_FACE, setting); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_BLEND, setting); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glColorMask(setting, setting, setting, setting); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDepthMask(setting); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glActiveTexture(GL_TEXTURE1 + x); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_DEPTH_TEST)); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_SCISSOR_TEST)); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_STENCIL_TEST)); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_CULL_FACE)); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_BLEND)); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLboolean bool_array[4] = { GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE }; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetBooleanv(GL_DEPTH_WRITEMASK, bool_array); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[0]); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool_array[0] = GL_FALSE; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetBooleanv(GL_COLOR_WRITEMASK, bool_array); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[0]); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[1]); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[2]); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[3]); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint active_texture = 0; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_TEXTURE1 + x, active_texture); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that invocation of the extension does not modify the bound 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// texture state. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, TextureStatePreserved) { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup the texture used for the extension invocation. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u }; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint texture_ids[2]; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenTextures(2, texture_ids); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glActiveTexture(GL_TEXTURE0); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, texture_ids[0]); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glActiveTexture(GL_TEXTURE1); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, texture_ids[1]); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint active_texture = 0; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_TEXTURE1, active_texture); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint bound_texture = 0; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_texture); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(texture_ids[1], static_cast<GLuint>(bound_texture)); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, 0); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound_texture = 0; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glActiveTexture(GL_TEXTURE0); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_texture); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(texture_ids[0], static_cast<GLuint>(bound_texture)); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, 0); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteTextures(2, texture_ids); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that invocation of the extension does not perturb the currently 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bound FBO state. 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, FBOStatePreserved) { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup the texture used for the extension invocation. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u }; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint texture_id; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenTextures(1, &texture_id); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, texture_id); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint renderbuffer_id; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenRenderbuffers(1, &renderbuffer_id); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_id); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 1, 1); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint framebuffer_id; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenFramebuffers(1, &framebuffer_id); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) texture_id, 0); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_RENDERBUFFER, renderbuffer_id); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that we can write to the bound framebuffer 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 expected_color[4] = { 255u, 255u, 0, 255u }; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClearColor(1.0, 1.0, 0, 1.0); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(glIsFramebuffer(framebuffer_id)); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that reading from the framebuffer produces correct pixels. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 expected_color2[4] = { 255u, 0, 255u, 255u }; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClearColor(1.0, 0, 1.0, 1.0); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color2); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint bound_fbo = 0; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &bound_fbo); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(framebuffer_id, static_cast<GLuint>(bound_fbo)); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint fbo_params = 0; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &fbo_params); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_TEXTURE, fbo_params); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fbo_params = 0; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &fbo_params); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(texture_id, static_cast<GLuint>(fbo_params)); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fbo_params = 0; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &fbo_params); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_RENDERBUFFER, fbo_params); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fbo_params = 0; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &fbo_params); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(renderbuffer_id, static_cast<GLuint>(fbo_params)); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteRenderbuffers(1, &renderbuffer_id); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteTextures(1, &texture_id); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteFramebuffers(1, &framebuffer_id); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, ProgramStatePreservation) { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unbind the one created in setup. 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindFramebuffer(GL_FRAMEBUFFER, 0); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, 0); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl2; 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager::Options options; 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(16, 16); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.share_group_manager = &gl_; 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl2.Initialize(options); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.MakeCurrent(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* v_shader_str = 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "attribute vec4 g_Position;\n" 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "void main()\n" 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\n" 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " gl_Position = g_Position;\n" 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* f_shader_str = 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "precision mediump float;\n" 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "void main()\n" 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\n" 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " gl_FragColor = vec4(0,1,0,1);\n" 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glUseProgram(program); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint position_loc = glGetAttribLocation(program, "g_Position"); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glFlush(); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete program from other context. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl2.MakeCurrent(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteProgram(program); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glFlush(); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Program should still be usable on this context. 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.MakeCurrent(); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::SetupUnitQuad(position_loc); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test using program before 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 expected[] = { 0, 255, 0, 255, }; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 zero[] = { 0, 0, 0, 0, }; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, zero)); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected)); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call copyTextureCHROMIUM 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u }; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test using program after 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, zero)); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected)); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl2.MakeCurrent(); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl2.Destroy(); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.MakeCurrent(); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that glCopyTextureCHROMIUM doesn't leak uninitialized textures. 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, UninitializedSource) { 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GLsizei kWidth = 64, kHeight = 64; 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GL_UNSIGNED_BYTE); 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8 pixels[kHeight][kWidth][4] = {{{1}}}; 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int x = 0; x < kWidth; ++x) { 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int y = 0; y < kHeight; ++y) { 6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, pixels[y][x][0]); 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, pixels[y][x][1]); 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, pixels[y][x][2]); 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, pixels[y][x][3]); 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 633