Home | History | Annotate | Download | only in tests
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef GL_GLEXT_PROTOTYPES
      6 #define GL_GLEXT_PROTOTYPES
      7 #endif
      8 
      9 #include <GLES2/gl2.h>
     10 #include <GLES2/gl2ext.h>
     11 #include <GLES2/gl2extchromium.h>
     12 
     13 #include "gpu/command_buffer/tests/gl_manager.h"
     14 #include "gpu/command_buffer/tests/gl_test_utils.h"
     15 #include "testing/gmock/include/gmock/gmock.h"
     16 #include "testing/gtest/include/gtest/gtest.h"
     17 
     18 namespace gpu {
     19 
     20 // A collection of tests that exercise the GL_CHROMIUM_copy_texture extension.
     21 class GLCopyTextureCHROMIUMTest : public testing::Test {
     22  protected:
     23   virtual void SetUp() {
     24     gl_.Initialize(GLManager::Options());
     25 
     26     glGenTextures(2, textures_);
     27     glBindTexture(GL_TEXTURE_2D, textures_[1]);
     28 
     29     // Some drivers (NVidia/SGX) require texture settings to be a certain way or
     30     // they won't report FRAMEBUFFER_COMPLETE.
     31     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     32     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     33     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     34     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     35 
     36     glGenFramebuffers(1, &framebuffer_id_);
     37     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id_);
     38     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
     39                            textures_[1], 0);
     40   }
     41 
     42   virtual void TearDown() {
     43     glDeleteTextures(2, textures_);
     44     glDeleteFramebuffers(1, &framebuffer_id_);
     45     gl_.Destroy();
     46   }
     47 
     48   GLManager gl_;
     49   GLuint textures_[2];
     50   GLuint framebuffer_id_;
     51 };
     52 
     53 // Test to ensure that the basic functionality of the extension works.
     54 TEST_F(GLCopyTextureCHROMIUMTest, Basic) {
     55   uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
     56 
     57   glBindTexture(GL_TEXTURE_2D, textures_[0]);
     58   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
     59                pixels);
     60 
     61   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
     62                         GL_UNSIGNED_BYTE);
     63   EXPECT_TRUE(glGetError() == GL_NO_ERROR);
     64 
     65   // Check the FB is still bound.
     66   GLint value = 0;
     67   glGetIntegerv(GL_FRAMEBUFFER_BINDING, &value);
     68   GLuint fb_id = value;
     69   EXPECT_EQ(framebuffer_id_, fb_id);
     70 
     71   // Check that FB is complete.
     72   EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
     73             glCheckFramebufferStatus(GL_FRAMEBUFFER));
     74 
     75   GLTestHelper::CheckPixels(0, 0, 1, 1, 0, pixels);
     76   EXPECT_TRUE(GL_NO_ERROR == glGetError());
     77 }
     78 
     79 TEST_F(GLCopyTextureCHROMIUMTest, InternalFormat) {
     80   GLint src_formats[] = {GL_ALPHA,     GL_RGB,             GL_RGBA,
     81                          GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT};
     82   GLint dest_formats[] = {GL_RGB, GL_RGBA};
     83 
     84   for (size_t src_index = 0; src_index < arraysize(src_formats); src_index++) {
     85     for (size_t dest_index = 0; dest_index < arraysize(dest_formats);
     86          dest_index++) {
     87       glBindTexture(GL_TEXTURE_2D, textures_[0]);
     88       glTexImage2D(GL_TEXTURE_2D,
     89                    0,
     90                    src_formats[src_index],
     91                    1,
     92                    1,
     93                    0,
     94                    src_formats[src_index],
     95                    GL_UNSIGNED_BYTE,
     96                    NULL);
     97       EXPECT_TRUE(GL_NO_ERROR == glGetError());
     98 
     99       glCopyTextureCHROMIUM(GL_TEXTURE_2D,
    100                             textures_[0],
    101                             textures_[1],
    102                             0,
    103                             dest_formats[dest_index],
    104                             GL_UNSIGNED_BYTE);
    105       EXPECT_TRUE(GL_NO_ERROR == glGetError()) << "src_index:" << src_index
    106                                                << " dest_index:" << dest_index;
    107     }
    108   }
    109 }
    110 
    111 TEST_F(GLCopyTextureCHROMIUMTest, InternalFormatNotSupported) {
    112   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    113   glTexImage2D(
    114       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    115   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    116 
    117   // Check unsupported format reports error.
    118   GLint unsupported_dest_formats[] = {GL_ALPHA, GL_LUMINANCE,
    119                                       GL_LUMINANCE_ALPHA};
    120   for (size_t dest_index = 0; dest_index < arraysize(unsupported_dest_formats);
    121        dest_index++) {
    122     glCopyTextureCHROMIUM(GL_TEXTURE_2D,
    123                           textures_[0],
    124                           textures_[1],
    125                           0,
    126                           unsupported_dest_formats[dest_index],
    127                           GL_UNSIGNED_BYTE);
    128     EXPECT_TRUE(GL_INVALID_OPERATION == glGetError())
    129         << "dest_index:" << dest_index;
    130   }
    131 }
    132 
    133 // Test to ensure that the destination texture is redefined if the properties
    134 // are different.
    135 TEST_F(GLCopyTextureCHROMIUMTest, RedefineDestinationTexture) {
    136   uint8 pixels[4 * 4] = {255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u,
    137                          255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u};
    138 
    139   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    140   glTexImage2D(
    141       GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
    142 
    143   glBindTexture(GL_TEXTURE_2D, textures_[1]);
    144   glTexImage2D(GL_TEXTURE_2D,
    145                0,
    146                GL_BGRA_EXT,
    147                1,
    148                1,
    149                0,
    150                GL_BGRA_EXT,
    151                GL_UNSIGNED_BYTE,
    152                pixels);
    153   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    154 
    155   // GL_INVALID_OPERATION due to "intrinsic format" != "internal format".
    156   glTexSubImage2D(
    157       GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
    158   EXPECT_TRUE(GL_INVALID_OPERATION == glGetError());
    159   // GL_INVALID_VALUE due to bad dimensions.
    160   glTexSubImage2D(
    161       GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
    162   EXPECT_TRUE(GL_INVALID_VALUE == glGetError());
    163 
    164   // If the dest texture has different properties, glCopyTextureCHROMIUM()
    165   // redefines them.
    166   glCopyTextureCHROMIUM(
    167       GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, GL_UNSIGNED_BYTE);
    168   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    169 
    170   // glTexSubImage2D() succeeds because textures_[1] is redefined into 2x2
    171   // dimension and GL_RGBA format.
    172   glBindTexture(GL_TEXTURE_2D, textures_[1]);
    173   glTexSubImage2D(
    174       GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
    175   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    176 
    177   // Check the FB is still bound.
    178   GLint value = 0;
    179   glGetIntegerv(GL_FRAMEBUFFER_BINDING, &value);
    180   GLuint fb_id = value;
    181   EXPECT_EQ(framebuffer_id_, fb_id);
    182 
    183   // Check that FB is complete.
    184   EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
    185             glCheckFramebufferStatus(GL_FRAMEBUFFER));
    186 
    187   GLTestHelper::CheckPixels(1, 1, 1, 1, 0, &pixels[12]);
    188   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    189 }
    190 
    191 // Test that the extension respects the flip-y pixel storage setting.
    192 TEST_F(GLCopyTextureCHROMIUMTest, FlipY) {
    193   uint8 pixels[2][2][4];
    194   for (int x = 0; x < 2; ++x) {
    195     for (int y = 0; y < 2; ++y) {
    196       pixels[y][x][0] = x + y;
    197       pixels[y][x][1] = x + y;
    198       pixels[y][x][2] = x + y;
    199       pixels[y][x][3] = 255u;
    200     }
    201   }
    202 
    203   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    204   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    205                pixels);
    206 
    207   glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
    208   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
    209                         GL_UNSIGNED_BYTE);
    210   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    211 
    212   uint8 copied_pixels[2][2][4] = {{{0}}};
    213   glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels);
    214   for (int x = 0; x < 2; ++x) {
    215     for (int y = 0; y < 2; ++y) {
    216       EXPECT_EQ(pixels[1-y][x][0], copied_pixels[y][x][0]);
    217       EXPECT_EQ(pixels[1-y][x][1], copied_pixels[y][x][1]);
    218       EXPECT_EQ(pixels[1-y][x][2], copied_pixels[y][x][2]);
    219       EXPECT_EQ(pixels[1-y][x][3], copied_pixels[y][x][3]);
    220     }
    221   }
    222 
    223   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    224 }
    225 
    226 // Test that the extension respects the GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM
    227 // storage setting.
    228 TEST_F(GLCopyTextureCHROMIUMTest, PremultiplyAlpha) {
    229   uint8 pixels[1 * 4] = { 2, 2, 2, 128 };
    230 
    231   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    232   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    233                pixels);
    234 
    235   glPixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE);
    236   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
    237                        GL_UNSIGNED_BYTE);
    238   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    239 
    240   uint8 copied_pixels[1 * 4] = {0};
    241   glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels);
    242   EXPECT_EQ(1u, copied_pixels[0]);
    243   EXPECT_EQ(1u, copied_pixels[1]);
    244   EXPECT_EQ(1u, copied_pixels[2]);
    245   EXPECT_EQ(128u, copied_pixels[3]);
    246 
    247   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    248 }
    249 
    250 // Test that the extension respects the GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM
    251 // storage setting.
    252 TEST_F(GLCopyTextureCHROMIUMTest, UnpremultiplyAlpha) {
    253   uint8 pixels[1 * 4] = { 16, 16, 16, 128 };
    254 
    255   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    256   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    257                pixels);
    258 
    259   glPixelStorei(GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE);
    260   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
    261                         GL_UNSIGNED_BYTE);
    262   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    263 
    264   uint8 copied_pixels[1 * 4] = {0};
    265   glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels);
    266   EXPECT_EQ(32u, copied_pixels[0]);
    267   EXPECT_EQ(32u, copied_pixels[1]);
    268   EXPECT_EQ(32u, copied_pixels[2]);
    269   EXPECT_EQ(128u, copied_pixels[3]);
    270 
    271   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    272 }
    273 
    274 TEST_F(GLCopyTextureCHROMIUMTest, FlipYAndPremultiplyAlpha) {
    275   uint8 pixels[2][2][4];
    276   for (int x = 0; x < 2; ++x) {
    277     for (int y = 0; y < 2; ++y) {
    278       uint8 color = 16 * x + 16 * y;
    279       pixels[y][x][0] = color;
    280       pixels[y][x][1] = color;
    281       pixels[y][x][2] = color;
    282       pixels[y][x][3] = 128u;
    283     }
    284   }
    285 
    286   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    287   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    288                pixels);
    289 
    290   glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
    291   glPixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE);
    292   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
    293                         GL_UNSIGNED_BYTE);
    294   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    295 
    296   uint8 copied_pixels[2][2][4] = {{{0}}};
    297   glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels);
    298   for (int x = 0; x < 2; ++x) {
    299     for (int y = 0; y < 2; ++y) {
    300       EXPECT_EQ(pixels[1-y][x][0] / 2, copied_pixels[y][x][0]);
    301       EXPECT_EQ(pixels[1-y][x][1] / 2, copied_pixels[y][x][1]);
    302       EXPECT_EQ(pixels[1-y][x][2] / 2, copied_pixels[y][x][2]);
    303       EXPECT_EQ(pixels[1-y][x][3], copied_pixels[y][x][3]);
    304     }
    305   }
    306 
    307   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    308 }
    309 
    310 TEST_F(GLCopyTextureCHROMIUMTest, FlipYAndUnpremultiplyAlpha) {
    311   uint8 pixels[2][2][4];
    312   for (int x = 0; x < 2; ++x) {
    313     for (int y = 0; y < 2; ++y) {
    314       uint8 color = 16 * x + 16 * y;
    315       pixels[y][x][0] = color;
    316       pixels[y][x][1] = color;
    317       pixels[y][x][2] = color;
    318       pixels[y][x][3] = 128u;
    319     }
    320   }
    321 
    322   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    323   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    324                pixels);
    325 
    326   glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
    327   glPixelStorei(GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE);
    328   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
    329                         GL_UNSIGNED_BYTE);
    330   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    331 
    332   uint8 copied_pixels[2][2][4] = {{{0}}};
    333   glReadPixels(0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, copied_pixels);
    334   for (int x = 0; x < 2; ++x) {
    335     for (int y = 0; y < 2; ++y) {
    336       EXPECT_EQ(pixels[1-y][x][0] * 2, copied_pixels[y][x][0]);
    337       EXPECT_EQ(pixels[1-y][x][1] * 2, copied_pixels[y][x][1]);
    338       EXPECT_EQ(pixels[1-y][x][2] * 2, copied_pixels[y][x][2]);
    339       EXPECT_EQ(pixels[1-y][x][3], copied_pixels[y][x][3]);
    340     }
    341   }
    342 
    343   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    344 }
    345 
    346 namespace {
    347 
    348 void glEnableDisable(GLint param, GLboolean value) {
    349   if (value)
    350     glEnable(param);
    351   else
    352     glDisable(param);
    353 }
    354 
    355 }  // unnamed namespace
    356 
    357 // Validate that some basic GL state is not touched upon execution of
    358 // the extension.
    359 TEST_F(GLCopyTextureCHROMIUMTest, BasicStatePreservation) {
    360   uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
    361 
    362   glBindFramebuffer(GL_FRAMEBUFFER, 0);
    363 
    364   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    365   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    366                pixels);
    367 
    368   GLboolean reference_settings[2] = { GL_TRUE, GL_FALSE };
    369   for (int x = 0; x < 2; ++x) {
    370     GLboolean setting = reference_settings[x];
    371     glEnableDisable(GL_DEPTH_TEST, setting);
    372     glEnableDisable(GL_SCISSOR_TEST, setting);
    373     glEnableDisable(GL_STENCIL_TEST, setting);
    374     glEnableDisable(GL_CULL_FACE, setting);
    375     glEnableDisable(GL_BLEND, setting);
    376     glColorMask(setting, setting, setting, setting);
    377     glDepthMask(setting);
    378 
    379     glActiveTexture(GL_TEXTURE1 + x);
    380 
    381     glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0,
    382                           GL_RGBA, GL_UNSIGNED_BYTE);
    383     EXPECT_TRUE(GL_NO_ERROR == glGetError());
    384 
    385     EXPECT_EQ(setting, glIsEnabled(GL_DEPTH_TEST));
    386     EXPECT_EQ(setting, glIsEnabled(GL_SCISSOR_TEST));
    387     EXPECT_EQ(setting, glIsEnabled(GL_STENCIL_TEST));
    388     EXPECT_EQ(setting, glIsEnabled(GL_CULL_FACE));
    389     EXPECT_EQ(setting, glIsEnabled(GL_BLEND));
    390 
    391     GLboolean bool_array[4] = { GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE };
    392     glGetBooleanv(GL_DEPTH_WRITEMASK, bool_array);
    393     EXPECT_EQ(setting, bool_array[0]);
    394 
    395     bool_array[0] = GL_FALSE;
    396     glGetBooleanv(GL_COLOR_WRITEMASK, bool_array);
    397     EXPECT_EQ(setting, bool_array[0]);
    398     EXPECT_EQ(setting, bool_array[1]);
    399     EXPECT_EQ(setting, bool_array[2]);
    400     EXPECT_EQ(setting, bool_array[3]);
    401 
    402     GLint active_texture = 0;
    403     glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);
    404     EXPECT_EQ(GL_TEXTURE1 + x, active_texture);
    405   }
    406 
    407   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    408 };
    409 
    410 // Verify that invocation of the extension does not modify the bound
    411 // texture state.
    412 TEST_F(GLCopyTextureCHROMIUMTest, TextureStatePreserved) {
    413   // Setup the texture used for the extension invocation.
    414   uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
    415   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    416   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    417                pixels);
    418 
    419   GLuint texture_ids[2];
    420   glGenTextures(2, texture_ids);
    421 
    422   glActiveTexture(GL_TEXTURE0);
    423   glBindTexture(GL_TEXTURE_2D, texture_ids[0]);
    424 
    425   glActiveTexture(GL_TEXTURE1);
    426   glBindTexture(GL_TEXTURE_2D, texture_ids[1]);
    427 
    428   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0,
    429                         GL_RGBA, GL_UNSIGNED_BYTE);
    430   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    431 
    432   GLint active_texture = 0;
    433   glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);
    434   EXPECT_EQ(GL_TEXTURE1, active_texture);
    435 
    436   GLint bound_texture = 0;
    437   glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_texture);
    438   EXPECT_EQ(texture_ids[1], static_cast<GLuint>(bound_texture));
    439   glBindTexture(GL_TEXTURE_2D, 0);
    440 
    441   bound_texture = 0;
    442   glActiveTexture(GL_TEXTURE0);
    443   glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_texture);
    444   EXPECT_EQ(texture_ids[0], static_cast<GLuint>(bound_texture));
    445   glBindTexture(GL_TEXTURE_2D, 0);
    446 
    447   glDeleteTextures(2, texture_ids);
    448 
    449   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    450 }
    451 
    452 // Verify that invocation of the extension does not perturb the currently
    453 // bound FBO state.
    454 TEST_F(GLCopyTextureCHROMIUMTest, FBOStatePreserved) {
    455   // Setup the texture used for the extension invocation.
    456   uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
    457   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    458   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    459                pixels);
    460 
    461   GLuint texture_id;
    462   glGenTextures(1, &texture_id);
    463   glBindTexture(GL_TEXTURE_2D, texture_id);
    464   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    465                0);
    466 
    467   GLuint renderbuffer_id;
    468   glGenRenderbuffers(1, &renderbuffer_id);
    469   glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_id);
    470   glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 1, 1);
    471 
    472   GLuint framebuffer_id;
    473   glGenFramebuffers(1, &framebuffer_id);
    474   glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
    475   glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
    476                          texture_id, 0);
    477   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
    478                             GL_RENDERBUFFER, renderbuffer_id);
    479   EXPECT_TRUE(
    480       GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER));
    481 
    482   // Test that we can write to the bound framebuffer
    483   uint8 expected_color[4] = { 255u, 255u, 0, 255u };
    484   glClearColor(1.0, 1.0, 0, 1.0);
    485   glClear(GL_COLOR_BUFFER_BIT);
    486   GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color);
    487 
    488   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0,
    489                         GL_RGBA, GL_UNSIGNED_BYTE);
    490   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    491 
    492   EXPECT_TRUE(glIsFramebuffer(framebuffer_id));
    493 
    494   // Ensure that reading from the framebuffer produces correct pixels.
    495   GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color);
    496 
    497   uint8 expected_color2[4] = { 255u, 0, 255u, 255u };
    498   glClearColor(1.0, 0, 1.0, 1.0);
    499   glClear(GL_COLOR_BUFFER_BIT);
    500   GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color2);
    501 
    502   GLint bound_fbo = 0;
    503   glGetIntegerv(GL_FRAMEBUFFER_BINDING, &bound_fbo);
    504   EXPECT_EQ(framebuffer_id, static_cast<GLuint>(bound_fbo));
    505 
    506   GLint fbo_params = 0;
    507   glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
    508                                         GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,
    509                                         &fbo_params);
    510   EXPECT_EQ(GL_TEXTURE, fbo_params);
    511 
    512   fbo_params = 0;
    513   glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
    514                                         GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,
    515                                         &fbo_params);
    516   EXPECT_EQ(texture_id, static_cast<GLuint>(fbo_params));
    517 
    518   fbo_params = 0;
    519   glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
    520                                         GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,
    521                                         &fbo_params);
    522   EXPECT_EQ(GL_RENDERBUFFER, fbo_params);
    523 
    524   fbo_params = 0;
    525   glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
    526                                         GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,
    527                                         &fbo_params);
    528   EXPECT_EQ(renderbuffer_id, static_cast<GLuint>(fbo_params));
    529 
    530   glDeleteRenderbuffers(1, &renderbuffer_id);
    531   glDeleteTextures(1, &texture_id);
    532   glDeleteFramebuffers(1, &framebuffer_id);
    533 
    534   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    535 }
    536 
    537 TEST_F(GLCopyTextureCHROMIUMTest, ProgramStatePreservation) {
    538   // unbind the one created in setup.
    539   glBindFramebuffer(GL_FRAMEBUFFER, 0);
    540   glBindTexture(GL_TEXTURE_2D, 0);
    541 
    542   GLManager gl2;
    543   GLManager::Options options;
    544   options.size = gfx::Size(16, 16);
    545   options.share_group_manager = &gl_;
    546   gl2.Initialize(options);
    547   gl_.MakeCurrent();
    548 
    549   static const char* v_shader_str =
    550       "attribute vec4 g_Position;\n"
    551       "void main()\n"
    552       "{\n"
    553       "   gl_Position = g_Position;\n"
    554       "}\n";
    555   static const char* f_shader_str =
    556       "precision mediump float;\n"
    557       "void main()\n"
    558       "{\n"
    559       "  gl_FragColor = vec4(0,1,0,1);\n"
    560       "}\n";
    561 
    562   GLuint program = GLTestHelper::LoadProgram(v_shader_str, f_shader_str);
    563   glUseProgram(program);
    564   GLuint position_loc = glGetAttribLocation(program, "g_Position");
    565   glFlush();
    566 
    567   // Delete program from other context.
    568   gl2.MakeCurrent();
    569   glDeleteProgram(program);
    570   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    571   glFlush();
    572 
    573   // Program should still be usable on this context.
    574   gl_.MakeCurrent();
    575 
    576   GLTestHelper::SetupUnitQuad(position_loc);
    577 
    578   // test using program before
    579   uint8 expected[] = { 0, 255, 0, 255, };
    580   uint8 zero[] = { 0, 0, 0, 0, };
    581   glClear(GL_COLOR_BUFFER_BIT);
    582   EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, zero));
    583   glDrawArrays(GL_TRIANGLES, 0, 6);
    584   EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected));
    585 
    586   // Call copyTextureCHROMIUM
    587   uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
    588   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    589   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    590                pixels);
    591   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
    592                         GL_UNSIGNED_BYTE);
    593 
    594   // test using program after
    595   glClear(GL_COLOR_BUFFER_BIT);
    596   EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, zero));
    597   glDrawArrays(GL_TRIANGLES, 0, 6);
    598   EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected));
    599 
    600   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    601 
    602   gl2.MakeCurrent();
    603   gl2.Destroy();
    604   gl_.MakeCurrent();
    605 }
    606 
    607 // Test that glCopyTextureCHROMIUM doesn't leak uninitialized textures.
    608 TEST_F(GLCopyTextureCHROMIUMTest, UninitializedSource) {
    609   const GLsizei kWidth = 64, kHeight = 64;
    610   glBindTexture(GL_TEXTURE_2D, textures_[0]);
    611   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight,
    612                0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    613 
    614   glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
    615                         GL_UNSIGNED_BYTE);
    616   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    617 
    618   uint8 pixels[kHeight][kWidth][4] = {{{1}}};
    619   glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
    620   for (int x = 0; x < kWidth; ++x) {
    621     for (int y = 0; y < kHeight; ++y) {
    622       EXPECT_EQ(0, pixels[y][x][0]);
    623       EXPECT_EQ(0, pixels[y][x][1]);
    624       EXPECT_EQ(0, pixels[y][x][2]);
    625       EXPECT_EQ(0, pixels[y][x][3]);
    626     }
    627   }
    628 
    629   EXPECT_TRUE(GL_NO_ERROR == glGetError());
    630 }
    631 
    632 }  // namespace gpu
    633