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()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the extension respects the flip-y pixel storage setting. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, FlipY) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[2][2][4]; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][0] = x + y; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][1] = x + y; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][2] = x + y; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][3] = 255u; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[2][2][4] = {{{0}}}; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 10381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch for (int y = 0; y < 2; ++y) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][0], copied_pixels[y][x][0]); 10581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch EXPECT_EQ(pixels[1-y][x][1], copied_pixels[y][x][1]); 10681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch EXPECT_EQ(pixels[1-y][x][2], copied_pixels[y][x][2]); 10781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch EXPECT_EQ(pixels[1-y][x][3], copied_pixels[y][x][3]); 10881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the extension respects the GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// storage setting. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, PremultiplyAlpha) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 2, 2, 2, 128 }; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[1 * 4] = {0}; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, copied_pixels[0]); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, copied_pixels[1]); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, copied_pixels[2]); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(128u, copied_pixels[3]); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the extension respects the GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// storage setting. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, UnpremultiplyAlpha) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 16, 16, 16, 128 }; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[1 * 4] = {0}; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(32u, copied_pixels[0]); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(32u, copied_pixels[1]); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(32u, copied_pixels[2]); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(128u, copied_pixels[3]); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, FlipYAndPremultiplyAlpha) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[2][2][4]; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 color = 16 * x + 16 * y; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][0] = color; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][1] = color; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][2] = color; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][3] = 128u; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[2][2][4] = {{{0}}}; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][0] / 2, copied_pixels[y][x][0]); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][1] / 2, copied_pixels[y][x][1]); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][2] / 2, copied_pixels[y][x][2]); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][3], copied_pixels[y][x][3]); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, FlipYAndUnpremultiplyAlpha) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[2][2][4]; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 color = 16 * x + 16 * y; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][0] = color; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][1] = color; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][2] = color; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels[y][x][3] = 128u; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glPixelStorei(GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 copied_pixels[2][2][4] = {{{0}}}; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < 2; ++y) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][0] * 2, copied_pixels[y][x][0]); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][1] * 2, copied_pixels[y][x][1]); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][2] * 2, copied_pixels[y][x][2]); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(pixels[1-y][x][3], copied_pixels[y][x][3]); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void glEnableDisable(GLint param, GLboolean value) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnable(param); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDisable(param); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // unnamed namespace 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Validate that some basic GL state is not touched upon execution of 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the extension. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, BasicStatePreservation) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u }; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindFramebuffer(GL_FRAMEBUFFER, 0); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLboolean reference_settings[2] = { GL_TRUE, GL_FALSE }; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < 2; ++x) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLboolean setting = reference_settings[x]; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_DEPTH_TEST, setting); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_SCISSOR_TEST, setting); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_STENCIL_TEST, setting); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_CULL_FACE, setting); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEnableDisable(GL_BLEND, setting); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glColorMask(setting, setting, setting, setting); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDepthMask(setting); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glActiveTexture(GL_TEXTURE1 + x); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_DEPTH_TEST)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_SCISSOR_TEST)); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_STENCIL_TEST)); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_CULL_FACE)); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, glIsEnabled(GL_BLEND)); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLboolean bool_array[4] = { GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE }; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetBooleanv(GL_DEPTH_WRITEMASK, bool_array); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[0]); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool_array[0] = GL_FALSE; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetBooleanv(GL_COLOR_WRITEMASK, bool_array); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[0]); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[1]); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[2]); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(setting, bool_array[3]); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint active_texture = 0; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_TEXTURE1 + x, active_texture); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that invocation of the extension does not modify the bound 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// texture state. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, TextureStatePreserved) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup the texture used for the extension invocation. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u }; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint texture_ids[2]; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenTextures(2, texture_ids); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glActiveTexture(GL_TEXTURE0); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, texture_ids[0]); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glActiveTexture(GL_TEXTURE1); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, texture_ids[1]); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint active_texture = 0; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_TEXTURE1, active_texture); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint bound_texture = 0; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_texture); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(texture_ids[1], static_cast<GLuint>(bound_texture)); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, 0); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound_texture = 0; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glActiveTexture(GL_TEXTURE0); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_texture); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(texture_ids[0], static_cast<GLuint>(bound_texture)); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, 0); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteTextures(2, texture_ids); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that invocation of the extension does not perturb the currently 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bound FBO state. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, FBOStatePreserved) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup the texture used for the extension invocation. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u }; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint texture_id; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenTextures(1, &texture_id); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, texture_id); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint renderbuffer_id; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenRenderbuffers(1, &renderbuffer_id); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_id); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 1, 1); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint framebuffer_id; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenFramebuffers(1, &framebuffer_id); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) texture_id, 0); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_RENDERBUFFER, renderbuffer_id); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER)); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that we can write to the bound framebuffer 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 expected_color[4] = { 255u, 255u, 0, 255u }; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClearColor(1.0, 1.0, 0, 1.0); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(glIsFramebuffer(framebuffer_id)); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that reading from the framebuffer produces correct pixels. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 expected_color2[4] = { 255u, 0, 255u, 255u }; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClearColor(1.0, 0, 1.0, 1.0); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color2); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint bound_fbo = 0; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &bound_fbo); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(framebuffer_id, static_cast<GLuint>(bound_fbo)); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint fbo_params = 0; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &fbo_params); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_TEXTURE, fbo_params); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fbo_params = 0; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &fbo_params); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(texture_id, static_cast<GLuint>(fbo_params)); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fbo_params = 0; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &fbo_params); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_RENDERBUFFER, fbo_params); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fbo_params = 0; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &fbo_params); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(renderbuffer_id, static_cast<GLuint>(fbo_params)); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteRenderbuffers(1, &renderbuffer_id); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteTextures(1, &texture_id); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteFramebuffers(1, &framebuffer_id); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLCopyTextureCHROMIUMTest, ProgramStatePreservation) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unbind the one created in setup. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindFramebuffer(GL_FRAMEBUFFER, 0); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, 0); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLManager gl2; 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager::Options options; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(16, 16); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.share_group_manager = &gl_; 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl2.Initialize(options); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.MakeCurrent(); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* v_shader_str = 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "attribute vec4 g_Position;\n" 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "void main()\n" 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\n" 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " gl_Position = g_Position;\n" 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* f_shader_str = 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "precision mediump float;\n" 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "void main()\n" 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\n" 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " gl_FragColor = vec4(0,1,0,1);\n" 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glUseProgram(program); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint position_loc = glGetAttribLocation(program, "g_Position"); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glFlush(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete program from other context. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl2.MakeCurrent(); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteProgram(program); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glFlush(); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Program should still be usable on this context. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.MakeCurrent(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLTestHelper::SetupUnitQuad(position_loc); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test using program before 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 expected[] = { 0, 255, 0, 255, }; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 zero[] = { 0, 0, 0, 0, }; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, zero)); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected)); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call copyTextureCHROMIUM 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u }; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBindTexture(GL_TEXTURE_2D, textures_[0]); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pixels); 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GL_UNSIGNED_BYTE); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test using program after 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glClear(GL_COLOR_BUFFER_BIT); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, zero)); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDrawArrays(GL_TRIANGLES, 0, 6); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected)); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GL_NO_ERROR == glGetError()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl2.MakeCurrent(); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl2.Destroy(); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.MakeCurrent(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch// Test that glCopyTextureCHROMIUM doesn't leak uninitialized textures. 49681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben MurdochTEST_F(GLCopyTextureCHROMIUMTest, UninitializedSource) { 49781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch const GLsizei kWidth = 64, kHeight = 64; 49881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch glBindTexture(GL_TEXTURE_2D, textures_[0]); 49981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 50081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 50181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 50281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, 50381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch GL_UNSIGNED_BYTE); 50481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch EXPECT_TRUE(GL_NO_ERROR == glGetError()); 50581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 50681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch uint8 pixels[kHeight][kWidth][4] = {{{1}}}; 50781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 50881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch for (int x = 0; x < kWidth; ++x) { 50981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch for (int y = 0; y < kHeight; ++y) { 51081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch EXPECT_EQ(0, pixels[y][x][0]); 51181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch EXPECT_EQ(0, pixels[y][x][1]); 51281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch EXPECT_EQ(0, pixels[y][x][2]); 51381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch EXPECT_EQ(0, pixels[y][x][3]); 51481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch } 51581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch } 51681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 51781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch EXPECT_TRUE(GL_NO_ERROR == glGetError()); 51881d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch} 51981d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 521