Home | History | Annotate | Download | only in service
      1 // Copyright 2014 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 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/strings/string_number_conversions.h"
      9 #include "gpu/command_buffer/common/gles2_cmd_format.h"
     10 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
     11 #include "gpu/command_buffer/common/id_allocator.h"
     12 #include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h"
     13 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h"
     14 #include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h"
     15 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
     16 #include "gpu/command_buffer/service/context_group.h"
     17 #include "gpu/command_buffer/service/context_state.h"
     18 #include "gpu/command_buffer/service/gl_surface_mock.h"
     19 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h"
     20 
     21 #include "gpu/command_buffer/service/gpu_switches.h"
     22 #include "gpu/command_buffer/service/image_manager.h"
     23 #include "gpu/command_buffer/service/mailbox_manager.h"
     24 #include "gpu/command_buffer/service/mocks.h"
     25 #include "gpu/command_buffer/service/program_manager.h"
     26 #include "gpu/command_buffer/service/test_helper.h"
     27 #include "testing/gtest/include/gtest/gtest.h"
     28 #include "ui/gl/gl_implementation.h"
     29 #include "ui/gl/gl_mock.h"
     30 #include "ui/gl/gl_surface_stub.h"
     31 
     32 #if !defined(GL_DEPTH24_STENCIL8)
     33 #define GL_DEPTH24_STENCIL8 0x88F0
     34 #endif
     35 
     36 using ::gfx::MockGLInterface;
     37 using ::testing::_;
     38 using ::testing::DoAll;
     39 using ::testing::InSequence;
     40 using ::testing::Invoke;
     41 using ::testing::MatcherCast;
     42 using ::testing::Mock;
     43 using ::testing::Pointee;
     44 using ::testing::Return;
     45 using ::testing::SaveArg;
     46 using ::testing::SetArrayArgument;
     47 using ::testing::SetArgumentPointee;
     48 using ::testing::SetArgPointee;
     49 using ::testing::StrEq;
     50 using ::testing::StrictMock;
     51 
     52 namespace gpu {
     53 namespace gles2 {
     54 
     55 using namespace cmds;
     56 
     57 class GLES2DecoderGeometryInstancingTest : public GLES2DecoderWithShaderTest {
     58  public:
     59   GLES2DecoderGeometryInstancingTest() : GLES2DecoderWithShaderTest() {}
     60 
     61   virtual void SetUp() {
     62     InitState init;
     63     init.extensions = "GL_ANGLE_instanced_arrays";
     64     init.gl_version = "opengl es 2.0";
     65     init.has_alpha = true;
     66     init.has_depth = true;
     67     init.request_alpha = true;
     68     init.request_depth = true;
     69     init.bind_generates_resource = true;
     70     InitDecoder(init);
     71     SetupDefaultProgram();
     72   }
     73 };
     74 
     75 INSTANTIATE_TEST_CASE_P(Service,
     76                         GLES2DecoderGeometryInstancingTest,
     77                         ::testing::Bool());
     78 
     79 void GLES2DecoderManualInitTest::DirtyStateMaskTest(GLuint color_bits,
     80                                                     bool depth_mask,
     81                                                     GLuint front_stencil_mask,
     82                                                     GLuint back_stencil_mask) {
     83   ColorMask color_mask_cmd;
     84   color_mask_cmd.Init((color_bits & 0x1000) != 0,
     85                       (color_bits & 0x0100) != 0,
     86                       (color_bits & 0x0010) != 0,
     87                       (color_bits & 0x0001) != 0);
     88   EXPECT_EQ(error::kNoError, ExecuteCmd(color_mask_cmd));
     89   EXPECT_EQ(GL_NO_ERROR, GetGLError());
     90 
     91   DepthMask depth_mask_cmd;
     92   depth_mask_cmd.Init(depth_mask);
     93   EXPECT_EQ(error::kNoError, ExecuteCmd(depth_mask_cmd));
     94   EXPECT_EQ(GL_NO_ERROR, GetGLError());
     95 
     96   StencilMaskSeparate front_stencil_mask_cmd;
     97   front_stencil_mask_cmd.Init(GL_FRONT, front_stencil_mask);
     98   EXPECT_EQ(error::kNoError, ExecuteCmd(front_stencil_mask_cmd));
     99   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    100 
    101   StencilMaskSeparate back_stencil_mask_cmd;
    102   back_stencil_mask_cmd.Init(GL_BACK, back_stencil_mask);
    103   EXPECT_EQ(error::kNoError, ExecuteCmd(back_stencil_mask_cmd));
    104   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    105 
    106   SetupExpectationsForApplyingDirtyState(
    107       false,               // Framebuffer is RGB
    108       true,                // Framebuffer has depth
    109       true,                // Framebuffer has stencil
    110       color_bits,          // color bits
    111       depth_mask,          // depth mask
    112       false,               // depth enabled
    113       front_stencil_mask,  // front stencil mask
    114       back_stencil_mask,   // back stencil mask
    115       false);              // stencil enabled
    116 
    117   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    118       .Times(1)
    119       .RetiresOnSaturation();
    120   DrawArrays draw_cmd;
    121   draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    122   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    123   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    124 }
    125 
    126 // Test that with an RGB backbuffer if we set the color mask to 1,1,1,1 it is
    127 // set to 1,1,1,0 at Draw time but is 1,1,1,1 at query time.
    128 TEST_P(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMask) {
    129   ColorMask cmd;
    130   cmd.Init(true, true, true, true);
    131   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    132   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    133 
    134   SetupTexture();
    135   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    136   SetupExpectationsForApplyingDirtyState(true,    // Framebuffer is RGB
    137                                          false,   // Framebuffer has depth
    138                                          false,   // Framebuffer has stencil
    139                                          0x1110,  // color bits
    140                                          false,   // depth mask
    141                                          false,   // depth enabled
    142                                          0,       // front stencil mask
    143                                          0,       // back stencil mask
    144                                          false);  // stencil enabled
    145 
    146   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    147       .Times(1)
    148       .RetiresOnSaturation();
    149   DrawArrays draw_cmd;
    150   draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    151   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    152   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    153 
    154   EXPECT_CALL(*gl_, GetError())
    155       .WillOnce(Return(GL_NO_ERROR))
    156       .WillOnce(Return(GL_NO_ERROR))
    157       .RetiresOnSaturation();
    158   typedef GetIntegerv::Result Result;
    159   Result* result = static_cast<Result*>(shared_memory_address_);
    160   EXPECT_CALL(*gl_, GetIntegerv(GL_COLOR_WRITEMASK, result->GetData()))
    161       .Times(0);
    162   result->size = 0;
    163   GetIntegerv cmd2;
    164   cmd2.Init(GL_COLOR_WRITEMASK, shared_memory_id_, shared_memory_offset_);
    165   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
    166   EXPECT_EQ(
    167       decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_COLOR_WRITEMASK),
    168       result->GetNumResults());
    169   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    170   EXPECT_EQ(1, result->GetData()[0]);
    171   EXPECT_EQ(1, result->GetData()[1]);
    172   EXPECT_EQ(1, result->GetData()[2]);
    173   EXPECT_EQ(1, result->GetData()[3]);
    174 }
    175 
    176 // Test that with no depth if we set DepthMask true that it's set to false at
    177 // draw time but querying it returns true.
    178 TEST_P(GLES2DecoderRGBBackbufferTest, RGBBackbufferDepthMask) {
    179   EXPECT_CALL(*gl_, DepthMask(true)).Times(0).RetiresOnSaturation();
    180   DepthMask cmd;
    181   cmd.Init(true);
    182   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    183   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    184 
    185   SetupTexture();
    186   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    187   SetupExpectationsForApplyingDirtyState(true,    // Framebuffer is RGB
    188                                          false,   // Framebuffer has depth
    189                                          false,   // Framebuffer has stencil
    190                                          0x1110,  // color bits
    191                                          false,   // depth mask
    192                                          false,   // depth enabled
    193                                          0,       // front stencil mask
    194                                          0,       // back stencil mask
    195                                          false);  // stencil enabled
    196 
    197   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    198       .Times(1)
    199       .RetiresOnSaturation();
    200   DrawArrays draw_cmd;
    201   draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    202   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    203   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    204 
    205   EXPECT_CALL(*gl_, GetError())
    206       .WillOnce(Return(GL_NO_ERROR))
    207       .WillOnce(Return(GL_NO_ERROR))
    208       .RetiresOnSaturation();
    209   typedef GetIntegerv::Result Result;
    210   Result* result = static_cast<Result*>(shared_memory_address_);
    211   EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_WRITEMASK, result->GetData()))
    212       .Times(0);
    213   result->size = 0;
    214   GetIntegerv cmd2;
    215   cmd2.Init(GL_DEPTH_WRITEMASK, shared_memory_id_, shared_memory_offset_);
    216   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
    217   EXPECT_EQ(
    218       decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_WRITEMASK),
    219       result->GetNumResults());
    220   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    221   EXPECT_EQ(1, result->GetData()[0]);
    222 }
    223 
    224 // Test that with no stencil if we set the stencil mask it's still set to 0 at
    225 // draw time but gets our value if we query.
    226 TEST_P(GLES2DecoderRGBBackbufferTest, RGBBackbufferStencilMask) {
    227   const GLint kMask = 123;
    228   EXPECT_CALL(*gl_, StencilMask(kMask)).Times(0).RetiresOnSaturation();
    229   StencilMask cmd;
    230   cmd.Init(kMask);
    231   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    232   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    233 
    234   SetupTexture();
    235   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    236   SetupExpectationsForApplyingDirtyState(true,    // Framebuffer is RGB
    237                                          false,   // Framebuffer has depth
    238                                          false,   // Framebuffer has stencil
    239                                          0x1110,  // color bits
    240                                          false,   // depth mask
    241                                          false,   // depth enabled
    242                                          0,       // front stencil mask
    243                                          0,       // back stencil mask
    244                                          false);  // stencil enabled
    245 
    246   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    247       .Times(1)
    248       .RetiresOnSaturation();
    249   DrawArrays draw_cmd;
    250   draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    251   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    252   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    253 
    254   EXPECT_CALL(*gl_, GetError())
    255       .WillOnce(Return(GL_NO_ERROR))
    256       .WillOnce(Return(GL_NO_ERROR))
    257       .RetiresOnSaturation();
    258   typedef GetIntegerv::Result Result;
    259   Result* result = static_cast<Result*>(shared_memory_address_);
    260   EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_WRITEMASK, result->GetData()))
    261       .Times(0);
    262   result->size = 0;
    263   GetIntegerv cmd2;
    264   cmd2.Init(GL_STENCIL_WRITEMASK, shared_memory_id_, shared_memory_offset_);
    265   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
    266   EXPECT_EQ(
    267       decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_WRITEMASK),
    268       result->GetNumResults());
    269   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    270   EXPECT_EQ(kMask, result->GetData()[0]);
    271 }
    272 
    273 // Test that if an FBO is bound we get the correct masks.
    274 TEST_P(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) {
    275   ColorMask cmd;
    276   cmd.Init(true, true, true, true);
    277   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    278   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    279 
    280   SetupTexture();
    281   SetupVertexBuffer();
    282   DoEnableVertexAttribArray(0);
    283   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
    284   DoEnableVertexAttribArray(1);
    285   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
    286   DoEnableVertexAttribArray(2);
    287   DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0);
    288   SetupExpectationsForApplyingDirtyState(true,    // Framebuffer is RGB
    289                                          false,   // Framebuffer has depth
    290                                          false,   // Framebuffer has stencil
    291                                          0x1110,  // color bits
    292                                          false,   // depth mask
    293                                          false,   // depth enabled
    294                                          0,       // front stencil mask
    295                                          0,       // back stencil mask
    296                                          false);  // stencil enabled
    297 
    298   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    299       .Times(1)
    300       .RetiresOnSaturation();
    301   DrawArrays draw_cmd;
    302   draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    303   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    304   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    305 
    306   // Check that no extra calls are made on the next draw.
    307   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    308       .Times(1)
    309       .RetiresOnSaturation();
    310   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    311   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    312 
    313   // Setup Frame buffer.
    314   // needs to be 1x1 or else it's not renderable.
    315   const GLsizei kWidth = 1;
    316   const GLsizei kHeight = 1;
    317   const GLenum kFormat = GL_RGB;
    318   DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
    319   // Pass some data so the texture will be marked as cleared.
    320   DoTexImage2D(GL_TEXTURE_2D,
    321                0,
    322                kFormat,
    323                kWidth,
    324                kHeight,
    325                0,
    326                kFormat,
    327                GL_UNSIGNED_BYTE,
    328                kSharedMemoryId,
    329                kSharedMemoryOffset);
    330   DoBindFramebuffer(
    331       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
    332   DoFramebufferTexture2D(GL_FRAMEBUFFER,
    333                          GL_COLOR_ATTACHMENT0,
    334                          GL_TEXTURE_2D,
    335                          client_texture_id_,
    336                          kServiceTextureId,
    337                          0,
    338                          GL_NO_ERROR);
    339   EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
    340       .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
    341       .RetiresOnSaturation();
    342 
    343   // This time state needs to be set.
    344   SetupExpectationsForApplyingDirtyState(false,   // Framebuffer is RGB
    345                                          false,   // Framebuffer has depth
    346                                          false,   // Framebuffer has stencil
    347                                          0x1110,  // color bits
    348                                          false,   // depth mask
    349                                          false,   // depth enabled
    350                                          0,       // front stencil mask
    351                                          0,       // back stencil mask
    352                                          false);  // stencil enabled
    353 
    354   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    355       .Times(1)
    356       .RetiresOnSaturation();
    357   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    358   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    359 
    360   // Check that no extra calls are made on the next draw.
    361   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    362       .Times(1)
    363       .RetiresOnSaturation();
    364   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    365   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    366 
    367   // Unbind
    368   DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0);
    369 
    370   SetupExpectationsForApplyingDirtyState(true,    // Framebuffer is RGB
    371                                          false,   // Framebuffer has depth
    372                                          false,   // Framebuffer has stencil
    373                                          0x1110,  // color bits
    374                                          false,   // depth mask
    375                                          false,   // depth enabled
    376                                          0,       // front stencil mask
    377                                          0,       // back stencil mask
    378                                          false);  // stencil enabled
    379 
    380   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    381       .Times(1)
    382       .RetiresOnSaturation();
    383   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    384   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    385 }
    386 
    387 TEST_P(GLES2DecoderManualInitTest, DepthEnableWithDepth) {
    388   InitState init;
    389   init.gl_version = "3.0";
    390   init.has_depth = true;
    391   init.request_depth = true;
    392   init.bind_generates_resource = true;
    393   InitDecoder(init);
    394 
    395   Enable cmd;
    396   cmd.Init(GL_DEPTH_TEST);
    397   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    398   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    399 
    400   SetupDefaultProgram();
    401   SetupTexture();
    402   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    403   SetupExpectationsForApplyingDirtyState(true,    // Framebuffer is RGB
    404                                          true,    // Framebuffer has depth
    405                                          false,   // Framebuffer has stencil
    406                                          0x1110,  // color bits
    407                                          true,    // depth mask
    408                                          true,    // depth enabled
    409                                          0,       // front stencil mask
    410                                          0,       // back stencil mask
    411                                          false);  // stencil enabled
    412 
    413   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    414       .Times(1)
    415       .RetiresOnSaturation();
    416   DrawArrays draw_cmd;
    417   draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    418   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    419   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    420 
    421   EXPECT_CALL(*gl_, GetError())
    422       .WillOnce(Return(GL_NO_ERROR))
    423       .WillOnce(Return(GL_NO_ERROR))
    424       .RetiresOnSaturation();
    425   typedef GetIntegerv::Result Result;
    426   Result* result = static_cast<Result*>(shared_memory_address_);
    427   EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _))
    428       .Times(0)
    429       .RetiresOnSaturation();
    430   result->size = 0;
    431   GetIntegerv cmd2;
    432   cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_);
    433   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
    434   EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST),
    435             result->GetNumResults());
    436   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    437   EXPECT_EQ(1, result->GetData()[0]);
    438 }
    439 
    440 TEST_P(GLES2DecoderManualInitTest, DepthEnableWithoutRequestedDepth) {
    441   InitState init;
    442   init.gl_version = "3.0";
    443   init.has_depth = true;
    444   init.bind_generates_resource = true;
    445   InitDecoder(init);
    446 
    447   Enable cmd;
    448   cmd.Init(GL_DEPTH_TEST);
    449   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    450   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    451 
    452   SetupDefaultProgram();
    453   SetupTexture();
    454   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    455   SetupExpectationsForApplyingDirtyState(true,    // Framebuffer is RGB
    456                                          false,   // Framebuffer has depth
    457                                          false,   // Framebuffer has stencil
    458                                          0x1110,  // color bits
    459                                          false,   // depth mask
    460                                          false,   // depth enabled
    461                                          0,       // front stencil mask
    462                                          0,       // back stencil mask
    463                                          false);  // stencil enabled
    464 
    465   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    466       .Times(1)
    467       .RetiresOnSaturation();
    468   DrawArrays draw_cmd;
    469   draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    470   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    471   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    472 
    473   EXPECT_CALL(*gl_, GetError())
    474       .WillOnce(Return(GL_NO_ERROR))
    475       .WillOnce(Return(GL_NO_ERROR))
    476       .RetiresOnSaturation();
    477   typedef GetIntegerv::Result Result;
    478   Result* result = static_cast<Result*>(shared_memory_address_);
    479   EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _))
    480       .Times(0)
    481       .RetiresOnSaturation();
    482   result->size = 0;
    483   GetIntegerv cmd2;
    484   cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_);
    485   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
    486   EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST),
    487             result->GetNumResults());
    488   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    489   EXPECT_EQ(1, result->GetData()[0]);
    490 }
    491 
    492 TEST_P(GLES2DecoderManualInitTest, StencilEnableWithStencil) {
    493   InitState init;
    494   init.gl_version = "3.0";
    495   init.has_stencil = true;
    496   init.request_stencil = true;
    497   init.bind_generates_resource = true;
    498   InitDecoder(init);
    499 
    500   Enable cmd;
    501   cmd.Init(GL_STENCIL_TEST);
    502   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    503   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    504 
    505   SetupDefaultProgram();
    506   SetupTexture();
    507   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    508   SetupExpectationsForApplyingDirtyState(
    509       true,                               // Framebuffer is RGB
    510       false,                              // Framebuffer has depth
    511       true,                               // Framebuffer has stencil
    512       0x1110,                             // color bits
    513       false,                              // depth mask
    514       false,                              // depth enabled
    515       GLES2Decoder::kDefaultStencilMask,  // front stencil mask
    516       GLES2Decoder::kDefaultStencilMask,  // back stencil mask
    517       true);                              // stencil enabled
    518 
    519   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    520       .Times(1)
    521       .RetiresOnSaturation();
    522   DrawArrays draw_cmd;
    523   draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    524   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    525   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    526 
    527   EXPECT_CALL(*gl_, GetError())
    528       .WillOnce(Return(GL_NO_ERROR))
    529       .WillOnce(Return(GL_NO_ERROR))
    530       .RetiresOnSaturation();
    531   typedef GetIntegerv::Result Result;
    532   Result* result = static_cast<Result*>(shared_memory_address_);
    533   EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _))
    534       .Times(0)
    535       .RetiresOnSaturation();
    536   result->size = 0;
    537   GetIntegerv cmd2;
    538   cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_);
    539   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
    540   EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST),
    541             result->GetNumResults());
    542   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    543   EXPECT_EQ(1, result->GetData()[0]);
    544 }
    545 
    546 TEST_P(GLES2DecoderManualInitTest, StencilEnableWithoutRequestedStencil) {
    547   InitState init;
    548   init.gl_version = "3.0";
    549   init.has_stencil = true;
    550   init.bind_generates_resource = true;
    551   InitDecoder(init);
    552 
    553   Enable cmd;
    554   cmd.Init(GL_STENCIL_TEST);
    555   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    556   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    557 
    558   SetupDefaultProgram();
    559   SetupTexture();
    560   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    561   SetupExpectationsForApplyingDirtyState(true,    // Framebuffer is RGB
    562                                          false,   // Framebuffer has depth
    563                                          false,   // Framebuffer has stencil
    564                                          0x1110,  // color bits
    565                                          false,   // depth mask
    566                                          false,   // depth enabled
    567                                          0,       // front stencil mask
    568                                          0,       // back stencil mask
    569                                          false);  // stencil enabled
    570 
    571   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    572       .Times(1)
    573       .RetiresOnSaturation();
    574   DrawArrays draw_cmd;
    575   draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    576   EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
    577   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    578 
    579   EXPECT_CALL(*gl_, GetError())
    580       .WillOnce(Return(GL_NO_ERROR))
    581       .WillOnce(Return(GL_NO_ERROR))
    582       .RetiresOnSaturation();
    583   typedef GetIntegerv::Result Result;
    584   Result* result = static_cast<Result*>(shared_memory_address_);
    585   EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _))
    586       .Times(0)
    587       .RetiresOnSaturation();
    588   result->size = 0;
    589   GetIntegerv cmd2;
    590   cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_);
    591   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
    592   EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST),
    593             result->GetNumResults());
    594   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    595   EXPECT_EQ(1, result->GetData()[0]);
    596 }
    597 
    598 TEST_P(GLES2DecoderManualInitTest, CachedColorMask) {
    599   InitState init;
    600   init.gl_version = "3.0";
    601   init.has_alpha = true;
    602   init.has_depth = true;
    603   init.has_stencil = true;
    604   init.request_alpha = true;
    605   init.request_depth = true;
    606   init.request_stencil = true;
    607   init.bind_generates_resource = true;
    608   InitDecoder(init);
    609 
    610   SetupDefaultProgram();
    611   SetupAllNeededVertexBuffers();
    612   SetupTexture();
    613 
    614   // Test all color_bits combinations twice.
    615   for (int i = 0; i < 32; i++) {
    616     GLuint color_bits = (i & 1 ? 0x0001 : 0x0000) | (i & 2 ? 0x0010 : 0x0000) |
    617                         (i & 4 ? 0x0100 : 0x0000) | (i & 8 ? 0x1000 : 0x0000);
    618 
    619     // Toggle depth_test to force ApplyDirtyState each time.
    620     DirtyStateMaskTest(color_bits, false, 0xffffffff, 0xffffffff);
    621     DirtyStateMaskTest(color_bits, true, 0xffffffff, 0xffffffff);
    622     DirtyStateMaskTest(color_bits, false, 0xffffffff, 0xffffffff);
    623   }
    624 }
    625 
    626 TEST_P(GLES2DecoderManualInitTest, CachedDepthMask) {
    627   InitState init;
    628   init.gl_version = "3.0";
    629   init.has_alpha = true;
    630   init.has_depth = true;
    631   init.has_stencil = true;
    632   init.request_alpha = true;
    633   init.request_depth = true;
    634   init.request_stencil = true;
    635   init.bind_generates_resource = true;
    636   InitDecoder(init);
    637 
    638   SetupDefaultProgram();
    639   SetupAllNeededVertexBuffers();
    640   SetupTexture();
    641 
    642   // Test all depth_mask combinations twice.
    643   for (int i = 0; i < 4; i++) {
    644     bool depth_mask = (i & 1) == 1;
    645 
    646     // Toggle color masks to force ApplyDirtyState each time.
    647     DirtyStateMaskTest(0x1010, depth_mask, 0xffffffff, 0xffffffff);
    648     DirtyStateMaskTest(0x0101, depth_mask, 0xffffffff, 0xffffffff);
    649     DirtyStateMaskTest(0x1010, depth_mask, 0xffffffff, 0xffffffff);
    650   }
    651 }
    652 
    653 TEST_P(GLES2DecoderManualInitTest, CachedStencilMask) {
    654   InitState init;
    655   init.gl_version = "3.0";
    656   init.has_alpha = true;
    657   init.has_depth = true;
    658   init.has_stencil = true;
    659   init.request_alpha = true;
    660   init.request_depth = true;
    661   init.request_stencil = true;
    662   init.bind_generates_resource = true;
    663   InitDecoder(init);
    664 
    665   SetupDefaultProgram();
    666   SetupAllNeededVertexBuffers();
    667   SetupTexture();
    668 
    669   // Test all stencil_mask combinations twice.
    670   for (int i = 0; i < 4; i++) {
    671     GLuint stencil_mask = (i & 1) ? 0xf0f0f0f0 : 0x0f0f0f0f;
    672 
    673     // Toggle color masks to force ApplyDirtyState each time.
    674     DirtyStateMaskTest(0x1010, true, stencil_mask, 0xffffffff);
    675     DirtyStateMaskTest(0x0101, true, stencil_mask, 0xffffffff);
    676     DirtyStateMaskTest(0x1010, true, stencil_mask, 0xffffffff);
    677   }
    678 
    679   for (int i = 0; i < 4; i++) {
    680     GLuint stencil_mask = (i & 1) ? 0xf0f0f0f0 : 0x0f0f0f0f;
    681 
    682     // Toggle color masks to force ApplyDirtyState each time.
    683     DirtyStateMaskTest(0x1010, true, 0xffffffff, stencil_mask);
    684     DirtyStateMaskTest(0x0101, true, 0xffffffff, stencil_mask);
    685     DirtyStateMaskTest(0x1010, true, 0xffffffff, stencil_mask);
    686   }
    687 }
    688 
    689 TEST_P(GLES2DecoderWithShaderTest, DrawArraysNoAttributesSucceeds) {
    690   SetupTexture();
    691   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    692   SetupExpectationsForApplyingDefaultDirtyState();
    693 
    694   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    695       .Times(1)
    696       .RetiresOnSaturation();
    697   DrawArrays cmd;
    698   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    699   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    700   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    701 }
    702 
    703 // Tests when the math overflows (0x40000000 * sizeof GLfloat)
    704 TEST_P(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OverflowFails) {
    705   const GLsizei kLargeCount = 0x40000000;
    706   SetupTexture();
    707   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation();
    708   DrawArrays cmd;
    709   cmd.Init(GL_TRIANGLES, 0, kLargeCount);
    710   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    711   EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
    712   EXPECT_FALSE(GetDecoder()->WasContextLost());
    713 }
    714 
    715 // Tests when the math overflows (0x7FFFFFFF + 1 = 0x8000000 verts)
    716 TEST_P(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0PosToNegFails) {
    717   const GLsizei kLargeCount = 0x7FFFFFFF;
    718   SetupTexture();
    719   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation();
    720   DrawArrays cmd;
    721   cmd.Init(GL_TRIANGLES, 0, kLargeCount);
    722   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    723   EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
    724   EXPECT_FALSE(GetDecoder()->WasContextLost());
    725 }
    726 
    727 // Tests when the driver returns an error
    728 TEST_P(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OOMFails) {
    729   const GLsizei kFakeLargeCount = 0x1234;
    730   SetupTexture();
    731   AddExpectationsForSimulatedAttrib0WithError(
    732       kFakeLargeCount, 0, GL_OUT_OF_MEMORY);
    733   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation();
    734   DrawArrays cmd;
    735   cmd.Init(GL_TRIANGLES, 0, kFakeLargeCount);
    736   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    737   EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
    738   EXPECT_FALSE(GetDecoder()->WasContextLost());
    739 }
    740 
    741 // Test that we lose context.
    742 TEST_P(GLES2DecoderManualInitTest, LoseContextWhenOOM) {
    743   InitState init;
    744   init.gl_version = "3.0";
    745   init.has_alpha = true;
    746   init.has_depth = true;
    747   init.request_alpha = true;
    748   init.request_depth = true;
    749   init.bind_generates_resource = true;
    750   init.lose_context_when_out_of_memory = true;
    751   InitDecoder(init);
    752   SetupDefaultProgram();
    753 
    754   const GLsizei kFakeLargeCount = 0x1234;
    755   SetupTexture();
    756   AddExpectationsForSimulatedAttrib0WithError(
    757       kFakeLargeCount, 0, GL_OUT_OF_MEMORY);
    758   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation();
    759   // Other contexts in the group should be lost also.
    760   EXPECT_CALL(*mock_decoder_, LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB))
    761       .Times(1)
    762       .RetiresOnSaturation();
    763   DrawArrays cmd;
    764   cmd.Init(GL_TRIANGLES, 0, kFakeLargeCount);
    765   // This context should be lost.
    766   EXPECT_EQ(error::kLostContext, ExecuteCmd(cmd));
    767   EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
    768   EXPECT_TRUE(decoder_->WasContextLost());
    769 }
    770 
    771 TEST_P(GLES2DecoderWithShaderTest, DrawArraysBadTextureUsesBlack) {
    772   DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
    773   // This is an NPOT texture. As the default filtering requires mips
    774   // this should trigger replacing with black textures before rendering.
    775   DoTexImage2D(GL_TEXTURE_2D,
    776                0,
    777                GL_RGBA,
    778                3,
    779                1,
    780                0,
    781                GL_RGBA,
    782                GL_UNSIGNED_BYTE,
    783                kSharedMemoryId,
    784                kSharedMemoryOffset);
    785   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    786   {
    787     InSequence sequence;
    788     EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
    789         .Times(1)
    790         .RetiresOnSaturation();
    791     EXPECT_CALL(
    792         *gl_, BindTexture(GL_TEXTURE_2D, TestHelper::kServiceBlackTexture2dId))
    793         .Times(1)
    794         .RetiresOnSaturation();
    795     EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    796         .Times(1)
    797         .RetiresOnSaturation();
    798     EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
    799         .Times(1)
    800         .RetiresOnSaturation();
    801     EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
    802         .Times(1)
    803         .RetiresOnSaturation();
    804     EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
    805         .Times(1)
    806         .RetiresOnSaturation();
    807   }
    808   SetupExpectationsForApplyingDefaultDirtyState();
    809   DrawArrays cmd;
    810   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    811   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    812   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    813 }
    814 
    815 TEST_P(GLES2DecoderWithShaderTest, DrawArraysMissingAttributesFails) {
    816   DoEnableVertexAttribArray(1);
    817 
    818   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0);
    819   DrawArrays cmd;
    820   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    821   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    822   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
    823 }
    824 
    825 TEST_P(GLES2DecoderWithShaderTest,
    826        DrawArraysMissingAttributesZeroCountSucceeds) {
    827   DoEnableVertexAttribArray(1);
    828 
    829   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0);
    830   DrawArrays cmd;
    831   cmd.Init(GL_TRIANGLES, 0, 0);
    832   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    833   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    834 }
    835 
    836 TEST_P(GLES2DecoderWithShaderTest, DrawArraysValidAttributesSucceeds) {
    837   SetupTexture();
    838   SetupVertexBuffer();
    839   DoEnableVertexAttribArray(1);
    840   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
    841   AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
    842   SetupExpectationsForApplyingDefaultDirtyState();
    843 
    844   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    845       .Times(1)
    846       .RetiresOnSaturation();
    847   DrawArrays cmd;
    848   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    849   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    850   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    851 }
    852 
    853 // Same as DrawArraysValidAttributesSucceeds, but with workaround
    854 // |init_vertex_attributes|.
    855 TEST_P(GLES2DecoderManualInitTest, InitVertexAttributes) {
    856   CommandLine command_line(0, NULL);
    857   command_line.AppendSwitchASCII(
    858       switches::kGpuDriverBugWorkarounds,
    859       base::IntToString(gpu::INIT_VERTEX_ATTRIBUTES));
    860   InitState init;
    861   init.gl_version = "3.0";
    862   init.has_alpha = true;
    863   init.has_depth = true;
    864   init.request_alpha = true;
    865   init.request_depth = true;
    866   init.bind_generates_resource = true;
    867   InitDecoderWithCommandLine(init, &command_line);
    868   SetupDefaultProgram();
    869   SetupTexture();
    870   SetupVertexBuffer();
    871   DoEnableVertexAttribArray(1);
    872   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
    873   AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
    874   SetupExpectationsForApplyingDefaultDirtyState();
    875 
    876   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
    877       .Times(1)
    878       .RetiresOnSaturation();
    879   DrawArrays cmd;
    880   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    881   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    882   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    883 }
    884 
    885 TEST_P(GLES2DecoderWithShaderTest, DrawArraysDeletedBufferFails) {
    886   SetupVertexBuffer();
    887   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
    888   DeleteVertexBuffer();
    889 
    890   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0);
    891   DrawArrays cmd;
    892   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    893   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    894   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
    895 }
    896 
    897 TEST_P(GLES2DecoderWithShaderTest, DrawArraysDeletedProgramSucceeds) {
    898   SetupTexture();
    899   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
    900   SetupExpectationsForApplyingDefaultDirtyState();
    901   DoDeleteProgram(client_program_id_, kServiceProgramId);
    902 
    903   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(1).RetiresOnSaturation();
    904   EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)).Times(1);
    905   DrawArrays cmd;
    906   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    907   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    908   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    909 }
    910 
    911 TEST_P(GLES2DecoderWithShaderTest, DrawArraysWithInvalidModeFails) {
    912   SetupVertexBuffer();
    913   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
    914 
    915   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0);
    916   DrawArrays cmd;
    917   cmd.Init(GL_QUADS, 0, 1);
    918   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    919   EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
    920   cmd.Init(GL_POLYGON, 0, 1);
    921   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    922   EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
    923 }
    924 
    925 TEST_P(GLES2DecoderWithShaderTest, DrawArraysInvalidCountFails) {
    926   SetupVertexBuffer();
    927   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
    928 
    929   // Try start > 0
    930   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0);
    931   DrawArrays cmd;
    932   cmd.Init(GL_TRIANGLES, 1, kNumVertices);
    933   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    934   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
    935   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    936 
    937   // Try with count > size
    938   cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1);
    939   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    940   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
    941   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    942 
    943   // Try with attrib offset > 0
    944   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
    945   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 4);
    946   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    947   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
    948   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    949 
    950   // Try with size > 2 (ie, vec3 instead of vec2)
    951   DoVertexAttribPointer(1, 3, GL_FLOAT, 0, 0);
    952   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    953   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
    954   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    955 
    956   // Try with stride > 8 (vec2 + vec2 byte)
    957   DoVertexAttribPointer(1, 2, GL_FLOAT, sizeof(GLfloat) * 3, 0);
    958   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    959   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
    960   EXPECT_EQ(GL_NO_ERROR, GetGLError());
    961 }
    962 
    963 TEST_P(GLES2DecoderWithShaderTest, DrawArraysInstancedANGLEFails) {
    964   SetupTexture();
    965   SetupVertexBuffer();
    966   DoEnableVertexAttribArray(1);
    967   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
    968 
    969   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
    970       .Times(0)
    971       .RetiresOnSaturation();
    972   DrawArraysInstancedANGLE cmd;
    973   cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
    974   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    975   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
    976 }
    977 
    978 TEST_P(GLES2DecoderWithShaderTest, VertexAttribDivisorANGLEFails) {
    979   SetupTexture();
    980   SetupVertexBuffer();
    981   DoEnableVertexAttribArray(1);
    982   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
    983 
    984   EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(_, _))
    985       .Times(0)
    986       .RetiresOnSaturation();
    987 
    988   VertexAttribDivisorANGLE cmd;
    989   cmd.Init(0, 1);
    990   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
    991   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
    992 }
    993 
    994 TEST_P(GLES2DecoderGeometryInstancingTest,
    995        DrawArraysInstancedANGLENoAttributesFails) {
    996   SetupTexture();
    997 
    998   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
    999       .Times(0)
   1000       .RetiresOnSaturation();
   1001   DrawArraysInstancedANGLE cmd;
   1002   cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
   1003   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1004   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1005 }
   1006 
   1007 TEST_P(GLES2DecoderGeometryInstancingTest,
   1008        DrawArraysInstancedANGLESimulatedAttrib0) {
   1009   SetupTexture();
   1010   SetupVertexBuffer();
   1011   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1012 
   1013   AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
   1014   SetupExpectationsForApplyingDefaultDirtyState();
   1015 
   1016   DoVertexAttribDivisorANGLE(0, 1);
   1017   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 3))
   1018       .Times(1)
   1019       .RetiresOnSaturation();
   1020   EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0))
   1021       .Times(1)
   1022       .RetiresOnSaturation();
   1023   EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1))
   1024       .Times(1)
   1025       .RetiresOnSaturation();
   1026   DrawArraysInstancedANGLE cmd;
   1027   cmd.Init(GL_TRIANGLES, 0, kNumVertices, 3);
   1028   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1029   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1030 }
   1031 
   1032 TEST_P(GLES2DecoderGeometryInstancingTest,
   1033        DrawArraysInstancedANGLEMissingAttributesFails) {
   1034   DoEnableVertexAttribArray(1);
   1035 
   1036   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)).Times(0);
   1037   DrawArraysInstancedANGLE cmd;
   1038   cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
   1039   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1040   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1041 }
   1042 
   1043 TEST_P(GLES2DecoderGeometryInstancingTest,
   1044        DrawArraysInstancedANGLEMissingAttributesZeroCountSucceeds) {
   1045   DoEnableVertexAttribArray(1);
   1046 
   1047   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)).Times(0);
   1048   DrawArraysInstancedANGLE cmd;
   1049   cmd.Init(GL_TRIANGLES, 0, 0, 1);
   1050   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1051   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1052 }
   1053 
   1054 TEST_P(GLES2DecoderGeometryInstancingTest,
   1055        DrawArraysInstancedANGLEValidAttributesSucceeds) {
   1056   SetupTexture();
   1057   SetupVertexBuffer();
   1058   DoEnableVertexAttribArray(1);
   1059   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1060   AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
   1061   SetupExpectationsForApplyingDefaultDirtyState();
   1062 
   1063   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 1))
   1064       .Times(1)
   1065       .RetiresOnSaturation();
   1066   DrawArraysInstancedANGLE cmd;
   1067   cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
   1068   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1069   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1070 }
   1071 
   1072 TEST_P(GLES2DecoderGeometryInstancingTest,
   1073        DrawArraysInstancedANGLEWithInvalidModeFails) {
   1074   SetupVertexBuffer();
   1075   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1076 
   1077   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)).Times(0);
   1078   DrawArraysInstancedANGLE cmd;
   1079   cmd.Init(GL_QUADS, 0, 1, 1);
   1080   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1081   EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
   1082   cmd.Init(GL_POLYGON, 0, 1, 1);
   1083   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1084   EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
   1085 }
   1086 
   1087 TEST_P(GLES2DecoderGeometryInstancingTest,
   1088        DrawArraysInstancedANGLEInvalidPrimcountFails) {
   1089   SetupVertexBuffer();
   1090   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1091 
   1092   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)).Times(0);
   1093   DrawArraysInstancedANGLE cmd;
   1094   cmd.Init(GL_TRIANGLES, 0, 1, -1);
   1095   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1096   EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
   1097 }
   1098 
   1099 // Per-instance data is twice as large, but number of instances is half
   1100 TEST_P(GLES2DecoderGeometryInstancingTest,
   1101        DrawArraysInstancedANGLELargeInstanceSucceeds) {
   1102   SetupTexture();
   1103   SetupVertexBuffer();
   1104   SetupExpectationsForApplyingDefaultDirtyState();
   1105   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1106 
   1107   DoEnableVertexAttribArray(0);
   1108   DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0);
   1109   DoVertexAttribDivisorANGLE(0, 1);
   1110   EXPECT_CALL(
   1111       *gl_,
   1112       DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, kNumVertices / 2))
   1113       .Times(1)
   1114       .RetiresOnSaturation();
   1115   DrawArraysInstancedANGLE cmd;
   1116   cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices / 2);
   1117   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1118   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1119 }
   1120 
   1121 // Regular drawArrays takes the divisor into account
   1122 TEST_P(GLES2DecoderGeometryInstancingTest,
   1123        DrawArraysWithDivisorSucceeds) {
   1124   SetupTexture();
   1125   SetupVertexBuffer();
   1126   SetupExpectationsForApplyingDefaultDirtyState();
   1127   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1128 
   1129   DoEnableVertexAttribArray(0);
   1130   // Access the data right at the end of the buffer.
   1131   DoVertexAttribPointer(
   1132       0, 2, GL_FLOAT, 0, (kNumVertices - 1) * 2 * sizeof(GLfloat));
   1133   DoVertexAttribDivisorANGLE(0, 1);
   1134   EXPECT_CALL(
   1135       *gl_,
   1136       DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   1137       .Times(1)
   1138       .RetiresOnSaturation();
   1139   DrawArrays cmd;
   1140   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   1141   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1142   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1143 }
   1144 
   1145 // Per-instance data is twice as large, but divisor is twice
   1146 TEST_P(GLES2DecoderGeometryInstancingTest,
   1147        DrawArraysInstancedANGLELargeDivisorSucceeds) {
   1148   SetupTexture();
   1149   SetupVertexBuffer();
   1150   SetupExpectationsForApplyingDefaultDirtyState();
   1151   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1152 
   1153   DoEnableVertexAttribArray(0);
   1154   DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0);
   1155   DoVertexAttribDivisorANGLE(0, 2);
   1156   EXPECT_CALL(
   1157       *gl_,
   1158       DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, kNumVertices))
   1159       .Times(1)
   1160       .RetiresOnSaturation();
   1161   DrawArraysInstancedANGLE cmd;
   1162   cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices);
   1163   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1164   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1165 }
   1166 
   1167 TEST_P(GLES2DecoderGeometryInstancingTest, DrawArraysInstancedANGLELargeFails) {
   1168   SetupTexture();
   1169   SetupVertexBuffer();
   1170   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1171 
   1172   DoEnableVertexAttribArray(0);
   1173   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
   1174   DoVertexAttribDivisorANGLE(0, 1);
   1175   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
   1176       .Times(0)
   1177       .RetiresOnSaturation();
   1178   DrawArraysInstancedANGLE cmd;
   1179   cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices + 1);
   1180   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1181   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1182   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1183 
   1184   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
   1185       .Times(0)
   1186       .RetiresOnSaturation();
   1187   cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1, kNumVertices);
   1188   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1189   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1190   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1191 }
   1192 
   1193 // Per-index data is twice as large, but number of indices is half
   1194 TEST_P(GLES2DecoderGeometryInstancingTest,
   1195        DrawArraysInstancedANGLELargeIndexSucceeds) {
   1196   SetupTexture();
   1197   SetupVertexBuffer();
   1198   SetupExpectationsForApplyingDefaultDirtyState();
   1199   DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0);
   1200 
   1201   DoEnableVertexAttribArray(0);
   1202   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
   1203   DoVertexAttribDivisorANGLE(0, 1);
   1204   EXPECT_CALL(
   1205       *gl_,
   1206       DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices / 2, kNumVertices))
   1207       .Times(1)
   1208       .RetiresOnSaturation();
   1209   DrawArraysInstancedANGLE cmd;
   1210   cmd.Init(GL_TRIANGLES, 0, kNumVertices / 2, kNumVertices);
   1211   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1212   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1213 }
   1214 
   1215 TEST_P(GLES2DecoderGeometryInstancingTest,
   1216        DrawArraysInstancedANGLENoDivisor0Fails) {
   1217   SetupTexture();
   1218   SetupVertexBuffer();
   1219   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1220 
   1221   DoEnableVertexAttribArray(0);
   1222   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
   1223   DoVertexAttribDivisorANGLE(0, 1);
   1224   DoVertexAttribDivisorANGLE(1, 1);
   1225   EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _))
   1226       .Times(0)
   1227       .RetiresOnSaturation();
   1228   DrawArraysInstancedANGLE cmd;
   1229   cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1);
   1230   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1231   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1232   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1233 }
   1234 
   1235 TEST_P(GLES2DecoderGeometryInstancingTest,
   1236        DrawArraysNoDivisor0Fails) {
   1237   SetupTexture();
   1238   SetupVertexBuffer();
   1239   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1240 
   1241   DoEnableVertexAttribArray(0);
   1242   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
   1243   DoVertexAttribDivisorANGLE(0, 1);
   1244   DoVertexAttribDivisorANGLE(1, 1);
   1245   EXPECT_CALL(*gl_, DrawArrays(_, _, _))
   1246       .Times(0)
   1247       .RetiresOnSaturation();
   1248   DrawArrays cmd;
   1249   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   1250   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1251   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1252   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1253 }
   1254 
   1255 TEST_P(GLES2DecoderWithShaderTest, DrawElementsNoAttributesSucceeds) {
   1256   SetupTexture();
   1257   SetupIndexBuffer();
   1258   AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
   1259   SetupExpectationsForApplyingDefaultDirtyState();
   1260   EXPECT_CALL(*gl_,
   1261               DrawElements(GL_TRIANGLES,
   1262                            kValidIndexRangeCount,
   1263                            GL_UNSIGNED_SHORT,
   1264                            BufferOffset(kValidIndexRangeStart * 2)))
   1265       .Times(1)
   1266       .RetiresOnSaturation();
   1267   DrawElements cmd;
   1268   cmd.Init(GL_TRIANGLES,
   1269            kValidIndexRangeCount,
   1270            GL_UNSIGNED_SHORT,
   1271            kValidIndexRangeStart * 2);
   1272   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1273   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1274 }
   1275 
   1276 TEST_P(GLES2DecoderWithShaderTest, DrawElementsMissingAttributesFails) {
   1277   SetupIndexBuffer();
   1278   DoEnableVertexAttribArray(1);
   1279 
   1280   EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
   1281   DrawElements cmd;
   1282   cmd.Init(GL_TRIANGLES,
   1283            kValidIndexRangeCount,
   1284            GL_UNSIGNED_SHORT,
   1285            kValidIndexRangeStart * 2);
   1286   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1287   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1288 }
   1289 
   1290 TEST_P(GLES2DecoderWithShaderTest,
   1291        DrawElementsMissingAttributesZeroCountSucceeds) {
   1292   SetupIndexBuffer();
   1293   DoEnableVertexAttribArray(1);
   1294 
   1295   EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
   1296   DrawElements cmd;
   1297   cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, kValidIndexRangeStart * 2);
   1298   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1299   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1300 }
   1301 
   1302 TEST_P(GLES2DecoderWithShaderTest, DrawElementsExtraAttributesFails) {
   1303   SetupIndexBuffer();
   1304   DoEnableVertexAttribArray(6);
   1305 
   1306   EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
   1307   DrawElements cmd;
   1308   cmd.Init(GL_TRIANGLES,
   1309            kValidIndexRangeCount,
   1310            GL_UNSIGNED_SHORT,
   1311            kValidIndexRangeStart * 2);
   1312   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1313   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1314 }
   1315 
   1316 TEST_P(GLES2DecoderWithShaderTest, DrawElementsValidAttributesSucceeds) {
   1317   SetupTexture();
   1318   SetupVertexBuffer();
   1319   SetupIndexBuffer();
   1320   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1321   AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId);
   1322   SetupExpectationsForApplyingDefaultDirtyState();
   1323 
   1324   EXPECT_CALL(*gl_,
   1325               DrawElements(GL_TRIANGLES,
   1326                            kValidIndexRangeCount,
   1327                            GL_UNSIGNED_SHORT,
   1328                            BufferOffset(kValidIndexRangeStart * 2)))
   1329       .Times(1)
   1330       .RetiresOnSaturation();
   1331   DrawElements cmd;
   1332   cmd.Init(GL_TRIANGLES,
   1333            kValidIndexRangeCount,
   1334            GL_UNSIGNED_SHORT,
   1335            kValidIndexRangeStart * 2);
   1336   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1337   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1338 }
   1339 
   1340 TEST_P(GLES2DecoderWithShaderTest, DrawElementsDeletedBufferFails) {
   1341   SetupVertexBuffer();
   1342   SetupIndexBuffer();
   1343   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1344   DeleteIndexBuffer();
   1345 
   1346   EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
   1347   DrawElements cmd;
   1348   cmd.Init(GL_TRIANGLES,
   1349            kValidIndexRangeCount,
   1350            GL_UNSIGNED_SHORT,
   1351            kValidIndexRangeStart * 2);
   1352   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1353   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1354 }
   1355 
   1356 TEST_P(GLES2DecoderWithShaderTest, DrawElementsDeletedProgramSucceeds) {
   1357   SetupTexture();
   1358   SetupIndexBuffer();
   1359   AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
   1360   SetupExpectationsForApplyingDefaultDirtyState();
   1361   DoDeleteProgram(client_program_id_, kServiceProgramId);
   1362 
   1363   EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(1);
   1364   EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)).Times(1);
   1365   DrawElements cmd;
   1366   cmd.Init(GL_TRIANGLES,
   1367            kValidIndexRangeCount,
   1368            GL_UNSIGNED_SHORT,
   1369            kValidIndexRangeStart * 2);
   1370   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1371   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1372 }
   1373 
   1374 TEST_P(GLES2DecoderWithShaderTest, DrawElementsWithInvalidModeFails) {
   1375   SetupVertexBuffer();
   1376   SetupIndexBuffer();
   1377   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1378 
   1379   EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
   1380   DrawElements cmd;
   1381   cmd.Init(GL_QUADS,
   1382            kValidIndexRangeCount,
   1383            GL_UNSIGNED_SHORT,
   1384            kValidIndexRangeStart * 2);
   1385   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1386   EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
   1387   cmd.Init(GL_POLYGON,
   1388            kValidIndexRangeCount,
   1389            GL_UNSIGNED_SHORT,
   1390            kValidIndexRangeStart);
   1391   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1392   EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
   1393 }
   1394 
   1395 TEST_P(GLES2DecoderWithShaderTest, DrawElementsInvalidCountFails) {
   1396   SetupVertexBuffer();
   1397   SetupIndexBuffer();
   1398   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1399 
   1400   // Try start > 0
   1401   EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
   1402   DrawElements cmd;
   1403   cmd.Init(GL_TRIANGLES, kNumIndices, GL_UNSIGNED_SHORT, 2);
   1404   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1405   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1406   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1407 
   1408   // Try with count > size
   1409   cmd.Init(GL_TRIANGLES, kNumIndices + 1, GL_UNSIGNED_SHORT, 0);
   1410   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1411   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1412   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1413 }
   1414 
   1415 TEST_P(GLES2DecoderWithShaderTest, DrawElementsOutOfRangeIndicesFails) {
   1416   SetupVertexBuffer();
   1417   SetupIndexBuffer();
   1418   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1419 
   1420   EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
   1421   DrawElements cmd;
   1422   cmd.Init(GL_TRIANGLES,
   1423            kInvalidIndexRangeCount,
   1424            GL_UNSIGNED_SHORT,
   1425            kInvalidIndexRangeStart * 2);
   1426   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1427   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1428   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1429 }
   1430 
   1431 TEST_P(GLES2DecoderWithShaderTest, DrawElementsOddOffsetForUint16Fails) {
   1432   SetupVertexBuffer();
   1433   SetupIndexBuffer();
   1434   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1435 
   1436   EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0);
   1437   DrawElements cmd;
   1438   cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT, 1);
   1439   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1440   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1441   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1442 }
   1443 
   1444 TEST_P(GLES2DecoderWithShaderTest, DrawElementsInstancedANGLEFails) {
   1445   SetupTexture();
   1446   SetupVertexBuffer();
   1447   SetupIndexBuffer();
   1448   DoEnableVertexAttribArray(1);
   1449   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1450 
   1451   EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
   1452       .Times(0)
   1453       .RetiresOnSaturation();
   1454   DrawElementsInstancedANGLE cmd;
   1455   cmd.Init(GL_TRIANGLES,
   1456            kValidIndexRangeCount,
   1457            GL_UNSIGNED_SHORT,
   1458            kValidIndexRangeStart * 2,
   1459            1);
   1460   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1461   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1462 }
   1463 
   1464 TEST_P(GLES2DecoderGeometryInstancingTest,
   1465        DrawElementsInstancedANGLENoAttributesFails) {
   1466   SetupTexture();
   1467   SetupIndexBuffer();
   1468 
   1469   EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
   1470       .Times(0)
   1471       .RetiresOnSaturation();
   1472   DrawElementsInstancedANGLE cmd;
   1473   cmd.Init(GL_TRIANGLES,
   1474            kValidIndexRangeCount,
   1475            GL_UNSIGNED_SHORT,
   1476            kValidIndexRangeStart * 2,
   1477            1);
   1478   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1479   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1480 }
   1481 
   1482 TEST_P(GLES2DecoderGeometryInstancingTest,
   1483        DrawElementsInstancedANGLESimulatedAttrib0) {
   1484   SetupTexture();
   1485   SetupVertexBuffer();
   1486   SetupIndexBuffer();
   1487   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1488 
   1489   AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId);
   1490   SetupExpectationsForApplyingDefaultDirtyState();
   1491 
   1492   DoVertexAttribDivisorANGLE(0, 1);
   1493   EXPECT_CALL(
   1494       *gl_,
   1495       DrawElementsInstancedANGLE(GL_TRIANGLES,
   1496                                  kValidIndexRangeCount,
   1497                                  GL_UNSIGNED_SHORT,
   1498                                  BufferOffset(kValidIndexRangeStart * 2),
   1499                                  3))
   1500       .Times(1)
   1501       .RetiresOnSaturation();
   1502   EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0))
   1503       .Times(1)
   1504       .RetiresOnSaturation();
   1505   EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1))
   1506       .Times(1)
   1507       .RetiresOnSaturation();
   1508   DrawElementsInstancedANGLE cmd;
   1509   cmd.Init(GL_TRIANGLES,
   1510            kValidIndexRangeCount,
   1511            GL_UNSIGNED_SHORT,
   1512            kValidIndexRangeStart * 2,
   1513            3);
   1514   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1515   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1516 }
   1517 
   1518 TEST_P(GLES2DecoderGeometryInstancingTest,
   1519        DrawElementsInstancedANGLEMissingAttributesFails) {
   1520   SetupIndexBuffer();
   1521   DoEnableVertexAttribArray(1);
   1522 
   1523   EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)).Times(0);
   1524   DrawElementsInstancedANGLE cmd;
   1525   cmd.Init(GL_TRIANGLES,
   1526            kValidIndexRangeCount,
   1527            GL_UNSIGNED_SHORT,
   1528            kValidIndexRangeStart * 2,
   1529            1);
   1530   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1531   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1532 }
   1533 
   1534 TEST_P(GLES2DecoderGeometryInstancingTest,
   1535        DrawElementsInstancedANGLEMissingAttributesZeroCountSucceeds) {
   1536   SetupIndexBuffer();
   1537   DoEnableVertexAttribArray(1);
   1538 
   1539   EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)).Times(0);
   1540   DrawElementsInstancedANGLE cmd;
   1541   cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, kValidIndexRangeStart * 2, 1);
   1542   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1543   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1544 }
   1545 
   1546 TEST_P(GLES2DecoderGeometryInstancingTest,
   1547        DrawElementsInstancedANGLEValidAttributesSucceeds) {
   1548   SetupIndexBuffer();
   1549   SetupTexture();
   1550   SetupVertexBuffer();
   1551   DoEnableVertexAttribArray(1);
   1552   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1553   AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId);
   1554   SetupExpectationsForApplyingDefaultDirtyState();
   1555 
   1556   EXPECT_CALL(
   1557       *gl_,
   1558       DrawElementsInstancedANGLE(GL_TRIANGLES,
   1559                                  kValidIndexRangeCount,
   1560                                  GL_UNSIGNED_SHORT,
   1561                                  BufferOffset(kValidIndexRangeStart * 2),
   1562                                  1))
   1563       .Times(1)
   1564       .RetiresOnSaturation();
   1565   DrawElementsInstancedANGLE cmd;
   1566   cmd.Init(GL_TRIANGLES,
   1567            kValidIndexRangeCount,
   1568            GL_UNSIGNED_SHORT,
   1569            kValidIndexRangeStart * 2,
   1570            1);
   1571   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1572   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1573 }
   1574 
   1575 TEST_P(GLES2DecoderGeometryInstancingTest,
   1576        DrawElementsInstancedANGLEWithInvalidModeFails) {
   1577   SetupIndexBuffer();
   1578   SetupVertexBuffer();
   1579   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1580 
   1581   EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)).Times(0);
   1582   DrawElementsInstancedANGLE cmd;
   1583   cmd.Init(GL_QUADS,
   1584            kValidIndexRangeCount,
   1585            GL_UNSIGNED_SHORT,
   1586            kValidIndexRangeStart * 2,
   1587            1);
   1588   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1589   EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
   1590   cmd.Init(GL_INVALID_ENUM,
   1591            kValidIndexRangeCount,
   1592            GL_UNSIGNED_SHORT,
   1593            kValidIndexRangeStart * 2,
   1594            1);
   1595   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1596   EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
   1597 }
   1598 
   1599 // Per-instance data is twice as large, but number of instances is half
   1600 TEST_P(GLES2DecoderGeometryInstancingTest,
   1601        DrawElementsInstancedANGLELargeInstanceSucceeds) {
   1602   SetupTexture();
   1603   SetupIndexBuffer();
   1604   SetupVertexBuffer();
   1605   SetupExpectationsForApplyingDefaultDirtyState();
   1606   // Add offset so we're sure we're accessing data near the end of the buffer.
   1607   DoVertexAttribPointer(
   1608       1,
   1609       2,
   1610       GL_FLOAT,
   1611       0,
   1612       (kNumVertices - kMaxValidIndex - 1) * 2 * sizeof(GLfloat));
   1613 
   1614   DoEnableVertexAttribArray(0);
   1615   DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0);
   1616   DoVertexAttribDivisorANGLE(0, 1);
   1617   EXPECT_CALL(
   1618       *gl_,
   1619       DrawElementsInstancedANGLE(GL_TRIANGLES,
   1620                                  kValidIndexRangeCount,
   1621                                  GL_UNSIGNED_SHORT,
   1622                                  BufferOffset(kValidIndexRangeStart * 2),
   1623                                  kNumVertices / 2))
   1624       .Times(1)
   1625       .RetiresOnSaturation();
   1626   DrawElementsInstancedANGLE cmd;
   1627   cmd.Init(GL_TRIANGLES,
   1628            kValidIndexRangeCount,
   1629            GL_UNSIGNED_SHORT,
   1630            kValidIndexRangeStart * 2,
   1631            kNumVertices / 2);
   1632   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1633   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1634 }
   1635 
   1636 // Regular drawElements takes the divisor into account
   1637 TEST_P(GLES2DecoderGeometryInstancingTest,
   1638        DrawElementsWithDivisorSucceeds) {
   1639   SetupTexture();
   1640   SetupIndexBuffer();
   1641   SetupVertexBuffer();
   1642   SetupExpectationsForApplyingDefaultDirtyState();
   1643   // Add offset so we're sure we're accessing data near the end of the buffer.
   1644   DoVertexAttribPointer(
   1645       1,
   1646       2,
   1647       GL_FLOAT,
   1648       0,
   1649       (kNumVertices - kMaxValidIndex - 1) * 2 * sizeof(GLfloat));
   1650 
   1651   DoEnableVertexAttribArray(0);
   1652   // Access the data right at the end of the buffer.
   1653   DoVertexAttribPointer(
   1654       0, 2, GL_FLOAT, 0, (kNumVertices - 1) * 2 * sizeof(GLfloat));
   1655   DoVertexAttribDivisorANGLE(0, 1);
   1656   EXPECT_CALL(
   1657       *gl_,
   1658       DrawElements(GL_TRIANGLES,
   1659                    kValidIndexRangeCount,
   1660                    GL_UNSIGNED_SHORT,
   1661                    BufferOffset(kValidIndexRangeStart * 2)))
   1662       .Times(1)
   1663       .RetiresOnSaturation();
   1664   DrawElements cmd;
   1665   cmd.Init(GL_TRIANGLES,
   1666            kValidIndexRangeCount,
   1667            GL_UNSIGNED_SHORT,
   1668            kValidIndexRangeStart * 2);
   1669   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1670   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1671 }
   1672 
   1673 // Per-instance data is twice as large, but divisor is twice
   1674 TEST_P(GLES2DecoderGeometryInstancingTest,
   1675        DrawElementsInstancedANGLELargeDivisorSucceeds) {
   1676   SetupTexture();
   1677   SetupIndexBuffer();
   1678   SetupVertexBuffer();
   1679   SetupExpectationsForApplyingDefaultDirtyState();
   1680   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1681 
   1682   DoEnableVertexAttribArray(0);
   1683   DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0);
   1684   DoVertexAttribDivisorANGLE(0, 2);
   1685   EXPECT_CALL(
   1686       *gl_,
   1687       DrawElementsInstancedANGLE(GL_TRIANGLES,
   1688                                  kValidIndexRangeCount,
   1689                                  GL_UNSIGNED_SHORT,
   1690                                  BufferOffset(kValidIndexRangeStart * 2),
   1691                                  kNumVertices))
   1692       .Times(1)
   1693       .RetiresOnSaturation();
   1694   DrawElementsInstancedANGLE cmd;
   1695   cmd.Init(GL_TRIANGLES,
   1696            kValidIndexRangeCount,
   1697            GL_UNSIGNED_SHORT,
   1698            kValidIndexRangeStart * 2,
   1699            kNumVertices);
   1700   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1701   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1702 }
   1703 
   1704 TEST_P(GLES2DecoderGeometryInstancingTest,
   1705        DrawElementsInstancedANGLELargeFails) {
   1706   SetupTexture();
   1707   SetupIndexBuffer();
   1708   SetupVertexBuffer();
   1709   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1710 
   1711   DoEnableVertexAttribArray(0);
   1712   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
   1713   DoVertexAttribDivisorANGLE(0, 1);
   1714   EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
   1715       .Times(0)
   1716       .RetiresOnSaturation();
   1717   DrawElementsInstancedANGLE cmd;
   1718   cmd.Init(GL_TRIANGLES,
   1719            kValidIndexRangeCount,
   1720            GL_UNSIGNED_SHORT,
   1721            kValidIndexRangeStart * 2,
   1722            kNumVertices + 1);
   1723   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1724   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1725   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1726 
   1727   EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
   1728       .Times(0)
   1729       .RetiresOnSaturation();
   1730   cmd.Init(GL_TRIANGLES,
   1731            kInvalidIndexRangeCount,
   1732            GL_UNSIGNED_SHORT,
   1733            kInvalidIndexRangeStart * 2,
   1734            kNumVertices);
   1735   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1736   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1737   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1738 }
   1739 
   1740 TEST_P(GLES2DecoderGeometryInstancingTest,
   1741        DrawElementsInstancedANGLEInvalidPrimcountFails) {
   1742   SetupTexture();
   1743   SetupIndexBuffer();
   1744   SetupVertexBuffer();
   1745   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1746 
   1747   DoEnableVertexAttribArray(0);
   1748   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
   1749   DoVertexAttribDivisorANGLE(0, 1);
   1750   EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
   1751       .Times(0)
   1752       .RetiresOnSaturation();
   1753   DrawElementsInstancedANGLE cmd;
   1754   cmd.Init(GL_TRIANGLES,
   1755            kValidIndexRangeCount,
   1756            GL_UNSIGNED_SHORT,
   1757            kValidIndexRangeStart * 2,
   1758            -1);
   1759   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1760   EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
   1761   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1762 }
   1763 
   1764 // Per-index data is twice as large, but values of indices are smaller
   1765 TEST_P(GLES2DecoderGeometryInstancingTest,
   1766        DrawElementsInstancedANGLELargeIndexSucceeds) {
   1767   SetupTexture();
   1768   SetupIndexBuffer();
   1769   SetupVertexBuffer();
   1770   SetupExpectationsForApplyingDefaultDirtyState();
   1771   DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0);
   1772 
   1773   DoEnableVertexAttribArray(0);
   1774   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
   1775   DoVertexAttribDivisorANGLE(0, 1);
   1776   EXPECT_CALL(
   1777       *gl_,
   1778       DrawElementsInstancedANGLE(GL_TRIANGLES,
   1779                                  kValidIndexRangeCount,
   1780                                  GL_UNSIGNED_SHORT,
   1781                                  BufferOffset(kValidIndexRangeStart * 2),
   1782                                  kNumVertices))
   1783       .Times(1)
   1784       .RetiresOnSaturation();
   1785   DrawElementsInstancedANGLE cmd;
   1786   cmd.Init(GL_TRIANGLES,
   1787            kValidIndexRangeCount,
   1788            GL_UNSIGNED_SHORT,
   1789            kValidIndexRangeStart * 2,
   1790            kNumVertices);
   1791   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1792   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1793 }
   1794 
   1795 TEST_P(GLES2DecoderGeometryInstancingTest,
   1796        DrawElementsInstancedANGLENoDivisor0Fails) {
   1797   SetupTexture();
   1798   SetupIndexBuffer();
   1799   SetupVertexBuffer();
   1800   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1801 
   1802   DoEnableVertexAttribArray(0);
   1803   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
   1804   DoVertexAttribDivisorANGLE(0, 1);
   1805   DoVertexAttribDivisorANGLE(1, 1);
   1806   EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _))
   1807       .Times(0)
   1808       .RetiresOnSaturation();
   1809   DrawElementsInstancedANGLE cmd;
   1810   cmd.Init(GL_TRIANGLES,
   1811            kValidIndexRangeCount,
   1812            GL_UNSIGNED_SHORT,
   1813            kValidIndexRangeStart * 2,
   1814            kNumVertices);
   1815   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1816   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1817   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1818 }
   1819 
   1820 TEST_P(GLES2DecoderGeometryInstancingTest,
   1821        DrawElementsNoDivisor0Fails) {
   1822   SetupTexture();
   1823   SetupIndexBuffer();
   1824   SetupVertexBuffer();
   1825   DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
   1826 
   1827   DoEnableVertexAttribArray(0);
   1828   DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
   1829   DoVertexAttribDivisorANGLE(0, 1);
   1830   DoVertexAttribDivisorANGLE(1, 1);
   1831   EXPECT_CALL(*gl_, DrawElements(_, _, _, _))
   1832       .Times(0)
   1833       .RetiresOnSaturation();
   1834   DrawElements cmd;
   1835   cmd.Init(GL_TRIANGLES,
   1836            kValidIndexRangeCount,
   1837            GL_UNSIGNED_SHORT,
   1838            kValidIndexRangeStart * 2);
   1839   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1840   EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
   1841   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1842 }
   1843 
   1844 TEST_P(GLES2DecoderWithShaderTest, DrawArraysClearsAfterTexImage2DNULL) {
   1845   SetupAllNeededVertexBuffers();
   1846   DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
   1847   // Create an uncleared texture with 2 levels.
   1848   DoTexImage2D(
   1849       GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
   1850   DoTexImage2D(
   1851       GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
   1852   // Expect 2 levels will be cleared.
   1853   SetupClearTextureExpectations(kServiceTextureId,
   1854                                 kServiceTextureId,
   1855                                 GL_TEXTURE_2D,
   1856                                 GL_TEXTURE_2D,
   1857                                 0,
   1858                                 GL_RGBA,
   1859                                 GL_RGBA,
   1860                                 GL_UNSIGNED_BYTE,
   1861                                 2,
   1862                                 2);
   1863   SetupClearTextureExpectations(kServiceTextureId,
   1864                                 kServiceTextureId,
   1865                                 GL_TEXTURE_2D,
   1866                                 GL_TEXTURE_2D,
   1867                                 1,
   1868                                 GL_RGBA,
   1869                                 GL_RGBA,
   1870                                 GL_UNSIGNED_BYTE,
   1871                                 1,
   1872                                 1);
   1873   SetupExpectationsForApplyingDefaultDirtyState();
   1874   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   1875       .Times(1)
   1876       .RetiresOnSaturation();
   1877   DrawArrays cmd;
   1878   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   1879   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1880   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1881 
   1882   // But not again
   1883   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   1884       .Times(1)
   1885       .RetiresOnSaturation();
   1886   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1887   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1888 }
   1889 
   1890 TEST_P(GLES2DecoderWithShaderTest, DrawElementsClearsAfterTexImage2DNULL) {
   1891   SetupAllNeededVertexBuffers();
   1892   SetupIndexBuffer();
   1893   DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
   1894   // Create an uncleared texture with 2 levels.
   1895   DoTexImage2D(
   1896       GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
   1897   DoTexImage2D(
   1898       GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
   1899   // Expect 2 levels will be cleared.
   1900   SetupClearTextureExpectations(kServiceTextureId,
   1901                                 kServiceTextureId,
   1902                                 GL_TEXTURE_2D,
   1903                                 GL_TEXTURE_2D,
   1904                                 0,
   1905                                 GL_RGBA,
   1906                                 GL_RGBA,
   1907                                 GL_UNSIGNED_BYTE,
   1908                                 2,
   1909                                 2);
   1910   SetupClearTextureExpectations(kServiceTextureId,
   1911                                 kServiceTextureId,
   1912                                 GL_TEXTURE_2D,
   1913                                 GL_TEXTURE_2D,
   1914                                 1,
   1915                                 GL_RGBA,
   1916                                 GL_RGBA,
   1917                                 GL_UNSIGNED_BYTE,
   1918                                 1,
   1919                                 1);
   1920   SetupExpectationsForApplyingDefaultDirtyState();
   1921 
   1922   EXPECT_CALL(*gl_,
   1923               DrawElements(GL_TRIANGLES,
   1924                            kValidIndexRangeCount,
   1925                            GL_UNSIGNED_SHORT,
   1926                            BufferOffset(kValidIndexRangeStart * 2)))
   1927       .Times(1)
   1928       .RetiresOnSaturation();
   1929   DrawElements cmd;
   1930   cmd.Init(GL_TRIANGLES,
   1931            kValidIndexRangeCount,
   1932            GL_UNSIGNED_SHORT,
   1933            kValidIndexRangeStart * 2);
   1934   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1935   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1936 
   1937   // But not again
   1938   EXPECT_CALL(*gl_,
   1939               DrawElements(GL_TRIANGLES,
   1940                            kValidIndexRangeCount,
   1941                            GL_UNSIGNED_SHORT,
   1942                            BufferOffset(kValidIndexRangeStart * 2)))
   1943       .Times(1)
   1944       .RetiresOnSaturation();
   1945   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   1946   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   1947 }
   1948 
   1949 TEST_P(GLES2DecoderWithShaderTest, DrawClearsAfterTexImage2DNULLInFBO) {
   1950   const GLuint kFBOClientTextureId = 4100;
   1951   const GLuint kFBOServiceTextureId = 4101;
   1952 
   1953   SetupAllNeededVertexBuffers();
   1954   // Register a texture id.
   1955   EXPECT_CALL(*gl_, GenTextures(_, _))
   1956       .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
   1957       .RetiresOnSaturation();
   1958   GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
   1959 
   1960   // Setup "render to" texture.
   1961   DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
   1962   DoTexImage2D(
   1963       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
   1964   DoBindFramebuffer(
   1965       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
   1966   DoFramebufferTexture2D(GL_FRAMEBUFFER,
   1967                          GL_COLOR_ATTACHMENT0,
   1968                          GL_TEXTURE_2D,
   1969                          kFBOClientTextureId,
   1970                          kFBOServiceTextureId,
   1971                          0,
   1972                          GL_NO_ERROR);
   1973 
   1974   // Setup "render from" texture.
   1975   SetupTexture();
   1976 
   1977   SetupExpectationsForFramebufferClearing(GL_FRAMEBUFFER,       // target
   1978                                           GL_COLOR_BUFFER_BIT,  // clear bits
   1979                                           0,
   1980                                           0,
   1981                                           0,
   1982                                           0,       // color
   1983                                           0,       // stencil
   1984                                           1.0f,    // depth
   1985                                           false);  // scissor test
   1986 
   1987   SetupExpectationsForApplyingDirtyState(false,   // Framebuffer is RGB
   1988                                          false,   // Framebuffer has depth
   1989                                          false,   // Framebuffer has stencil
   1990                                          0x1111,  // color bits
   1991                                          false,   // depth mask
   1992                                          false,   // depth enabled
   1993                                          0,       // front stencil mask
   1994                                          0,       // back stencil mask
   1995                                          false);  // stencil enabled
   1996 
   1997   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   1998       .Times(1)
   1999       .RetiresOnSaturation();
   2000   DrawArrays cmd;
   2001   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   2002   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   2003   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   2004 
   2005   // But not again.
   2006   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   2007       .Times(1)
   2008       .RetiresOnSaturation();
   2009   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   2010   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   2011 }
   2012 
   2013 TEST_P(GLES2DecoderWithShaderTest, DrawWitFBOThatCantClearDoesNotDraw) {
   2014   const GLuint kFBOClientTextureId = 4100;
   2015   const GLuint kFBOServiceTextureId = 4101;
   2016 
   2017   // Register a texture id.
   2018   EXPECT_CALL(*gl_, GenTextures(_, _))
   2019       .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
   2020       .RetiresOnSaturation();
   2021   GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
   2022 
   2023   // Setup "render to" texture.
   2024   DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
   2025   DoTexImage2D(
   2026       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
   2027   DoBindFramebuffer(
   2028       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
   2029   DoFramebufferTexture2D(GL_FRAMEBUFFER,
   2030                          GL_COLOR_ATTACHMENT0,
   2031                          GL_TEXTURE_2D,
   2032                          kFBOClientTextureId,
   2033                          kFBOServiceTextureId,
   2034                          0,
   2035                          GL_NO_ERROR);
   2036 
   2037   // Setup "render from" texture.
   2038   SetupTexture();
   2039 
   2040   EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
   2041       .WillOnce(Return(GL_FRAMEBUFFER_UNSUPPORTED))
   2042       .RetiresOnSaturation();
   2043   EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation();
   2044   DrawArrays cmd;
   2045   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   2046   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   2047   EXPECT_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, GetGLError());
   2048 }
   2049 
   2050 TEST_P(GLES2DecoderWithShaderTest, DrawClearsAfterRenderbufferStorageInFBO) {
   2051   SetupTexture();
   2052   DoBindRenderbuffer(
   2053       GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId);
   2054   DoBindFramebuffer(
   2055       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
   2056   DoRenderbufferStorage(
   2057       GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 100, 50, GL_NO_ERROR);
   2058   DoFramebufferRenderbuffer(GL_FRAMEBUFFER,
   2059                             GL_COLOR_ATTACHMENT0,
   2060                             GL_RENDERBUFFER,
   2061                             client_renderbuffer_id_,
   2062                             kServiceRenderbufferId,
   2063                             GL_NO_ERROR);
   2064 
   2065   SetupExpectationsForFramebufferClearing(GL_FRAMEBUFFER,       // target
   2066                                           GL_COLOR_BUFFER_BIT,  // clear bits
   2067                                           0,
   2068                                           0,
   2069                                           0,
   2070                                           0,       // color
   2071                                           0,       // stencil
   2072                                           1.0f,    // depth
   2073                                           false);  // scissor test
   2074 
   2075   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
   2076   SetupExpectationsForApplyingDirtyState(false,   // Framebuffer is RGB
   2077                                          false,   // Framebuffer has depth
   2078                                          false,   // Framebuffer has stencil
   2079                                          0x1111,  // color bits
   2080                                          false,   // depth mask
   2081                                          false,   // depth enabled
   2082                                          0,       // front stencil mask
   2083                                          0,       // back stencil mask
   2084                                          false);  // stencil enabled
   2085 
   2086   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   2087       .Times(1)
   2088       .RetiresOnSaturation();
   2089   DrawArrays cmd;
   2090   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   2091   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   2092   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   2093 }
   2094 
   2095 TEST_P(GLES2DecoderManualInitTest, DrawArraysClearsAfterTexImage2DNULLCubemap) {
   2096   InitState init;
   2097   init.gl_version = "opengl es 2.0";
   2098   init.has_alpha = true;
   2099   init.has_depth = true;
   2100   init.request_alpha = true;
   2101   init.request_depth = true;
   2102   InitDecoder(init);
   2103 
   2104   static const GLenum faces[] = {
   2105       GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
   2106       GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
   2107       GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
   2108   };
   2109   SetupCubemapProgram();
   2110   DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId);
   2111   // Fill out all the faces for 2 levels, leave 2 uncleared.
   2112   for (int ii = 0; ii < 6; ++ii) {
   2113     GLenum face = faces[ii];
   2114     int32 shm_id =
   2115         (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryId;
   2116     uint32 shm_offset =
   2117         (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryOffset;
   2118     DoTexImage2D(face,
   2119                  0,
   2120                  GL_RGBA,
   2121                  2,
   2122                  2,
   2123                  0,
   2124                  GL_RGBA,
   2125                  GL_UNSIGNED_BYTE,
   2126                  shm_id,
   2127                  shm_offset);
   2128     DoTexImage2D(face,
   2129                  1,
   2130                  GL_RGBA,
   2131                  1,
   2132                  1,
   2133                  0,
   2134                  GL_RGBA,
   2135                  GL_UNSIGNED_BYTE,
   2136                  shm_id,
   2137                  shm_offset);
   2138   }
   2139   // Expect 2 levels will be cleared.
   2140   SetupClearTextureExpectations(kServiceTextureId,
   2141                                 kServiceTextureId,
   2142                                 GL_TEXTURE_CUBE_MAP,
   2143                                 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
   2144                                 0,
   2145                                 GL_RGBA,
   2146                                 GL_RGBA,
   2147                                 GL_UNSIGNED_BYTE,
   2148                                 2,
   2149                                 2);
   2150   SetupClearTextureExpectations(kServiceTextureId,
   2151                                 kServiceTextureId,
   2152                                 GL_TEXTURE_CUBE_MAP,
   2153                                 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
   2154                                 1,
   2155                                 GL_RGBA,
   2156                                 GL_RGBA,
   2157                                 GL_UNSIGNED_BYTE,
   2158                                 1,
   2159                                 1);
   2160   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
   2161   SetupExpectationsForApplyingDefaultDirtyState();
   2162   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   2163       .Times(1)
   2164       .RetiresOnSaturation();
   2165   DrawArrays cmd;
   2166   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   2167   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   2168 }
   2169 
   2170 TEST_P(GLES2DecoderWithShaderTest,
   2171        DrawClearsAfterRenderbuffersWithMultipleAttachments) {
   2172   const GLuint kFBOClientTextureId = 4100;
   2173   const GLuint kFBOServiceTextureId = 4101;
   2174 
   2175   // Register a texture id.
   2176   EXPECT_CALL(*gl_, GenTextures(_, _))
   2177       .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
   2178       .RetiresOnSaturation();
   2179   GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
   2180 
   2181   // Setup "render to" texture.
   2182   DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
   2183   DoTexImage2D(
   2184       GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
   2185   DoBindFramebuffer(
   2186       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
   2187   DoFramebufferTexture2D(GL_FRAMEBUFFER,
   2188                          GL_COLOR_ATTACHMENT0,
   2189                          GL_TEXTURE_2D,
   2190                          kFBOClientTextureId,
   2191                          kFBOServiceTextureId,
   2192                          0,
   2193                          GL_NO_ERROR);
   2194 
   2195   DoBindRenderbuffer(
   2196       GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId);
   2197   DoBindFramebuffer(
   2198       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
   2199   DoRenderbufferStorage(GL_RENDERBUFFER,
   2200                         GL_DEPTH_COMPONENT16,
   2201                         GL_DEPTH_COMPONENT,
   2202                         1,
   2203                         1,
   2204                         GL_NO_ERROR);
   2205   DoFramebufferRenderbuffer(GL_FRAMEBUFFER,
   2206                             GL_DEPTH_ATTACHMENT,
   2207                             GL_RENDERBUFFER,
   2208                             client_renderbuffer_id_,
   2209                             kServiceRenderbufferId,
   2210                             GL_NO_ERROR);
   2211 
   2212   SetupTexture();
   2213   SetupExpectationsForFramebufferClearing(
   2214       GL_FRAMEBUFFER,                             // target
   2215       GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,  // clear bits
   2216       0,
   2217       0,
   2218       0,
   2219       0,       // color
   2220       0,       // stencil
   2221       1.0f,    // depth
   2222       false);  // scissor test
   2223 
   2224   AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
   2225   SetupExpectationsForApplyingDirtyState(false,   // Framebuffer is RGB
   2226                                          true,    // Framebuffer has depth
   2227                                          false,   // Framebuffer has stencil
   2228                                          0x1111,  // color bits
   2229                                          true,    // depth mask
   2230                                          false,   // depth enabled
   2231                                          0,       // front stencil mask
   2232                                          0,       // back stencil mask
   2233                                          false);  // stencil enabled
   2234 
   2235   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   2236       .Times(1)
   2237       .RetiresOnSaturation();
   2238   DrawArrays cmd;
   2239   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   2240   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   2241   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   2242 }
   2243 
   2244 TEST_P(GLES2DecoderWithShaderTest,
   2245        DrawingWithFBOTwiceChecksForFBOCompleteOnce) {
   2246   const GLuint kFBOClientTextureId = 4100;
   2247   const GLuint kFBOServiceTextureId = 4101;
   2248 
   2249   SetupAllNeededVertexBuffers();
   2250 
   2251   // Register a texture id.
   2252   EXPECT_CALL(*gl_, GenTextures(_, _))
   2253       .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId))
   2254       .RetiresOnSaturation();
   2255   GenHelper<GenTexturesImmediate>(kFBOClientTextureId);
   2256 
   2257   // Setup "render to" texture that is cleared.
   2258   DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId);
   2259   DoTexImage2D(GL_TEXTURE_2D,
   2260                0,
   2261                GL_RGBA,
   2262                1,
   2263                1,
   2264                0,
   2265                GL_RGBA,
   2266                GL_UNSIGNED_BYTE,
   2267                kSharedMemoryId,
   2268                kSharedMemoryOffset);
   2269   DoBindFramebuffer(
   2270       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
   2271   DoFramebufferTexture2D(GL_FRAMEBUFFER,
   2272                          GL_COLOR_ATTACHMENT0,
   2273                          GL_TEXTURE_2D,
   2274                          kFBOClientTextureId,
   2275                          kFBOServiceTextureId,
   2276                          0,
   2277                          GL_NO_ERROR);
   2278 
   2279   // Setup "render from" texture.
   2280   SetupTexture();
   2281 
   2282   // Make sure we check for framebuffer complete.
   2283   EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
   2284       .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
   2285       .RetiresOnSaturation();
   2286 
   2287   SetupExpectationsForApplyingDirtyState(false,   // Framebuffer is RGB
   2288                                          false,   // Framebuffer has depth
   2289                                          false,   // Framebuffer has stencil
   2290                                          0x1111,  // color bits
   2291                                          false,   // depth mask
   2292                                          false,   // depth enabled
   2293                                          0,       // front stencil mask
   2294                                          0,       // back stencil mask
   2295                                          false);  // stencil enabled
   2296 
   2297   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   2298       .Times(1)
   2299       .RetiresOnSaturation();
   2300   DrawArrays cmd;
   2301   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   2302   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   2303   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   2304 
   2305   // But not again.
   2306   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   2307       .Times(1)
   2308       .RetiresOnSaturation();
   2309   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   2310   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   2311 }
   2312 
   2313 TEST_P(GLES2DecoderManualInitTest, DrawClearsDepthTexture) {
   2314   InitState init;
   2315   init.extensions = "GL_ANGLE_depth_texture";
   2316   init.gl_version = "opengl es 2.0";
   2317   init.has_alpha = true;
   2318   init.has_depth = true;
   2319   init.request_alpha = true;
   2320   init.request_depth = true;
   2321   init.bind_generates_resource = true;
   2322   InitDecoder(init);
   2323 
   2324   SetupDefaultProgram();
   2325   SetupAllNeededVertexBuffers();
   2326   const GLenum attachment = GL_DEPTH_ATTACHMENT;
   2327   const GLenum target = GL_TEXTURE_2D;
   2328   const GLint level = 0;
   2329   DoBindTexture(target, client_texture_id_, kServiceTextureId);
   2330 
   2331   // Create a depth texture.
   2332   DoTexImage2D(target,
   2333                level,
   2334                GL_DEPTH_COMPONENT,
   2335                1,
   2336                1,
   2337                0,
   2338                GL_DEPTH_COMPONENT,
   2339                GL_UNSIGNED_INT,
   2340                0,
   2341                0);
   2342 
   2343   // Enable GL_SCISSOR_TEST to make sure we disable it in the clear,
   2344   // then re-enable it.
   2345   DoEnableDisable(GL_SCISSOR_TEST, true);
   2346 
   2347   EXPECT_CALL(*gl_, GenFramebuffersEXT(1, _)).Times(1).RetiresOnSaturation();
   2348   EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, _))
   2349       .Times(1)
   2350       .RetiresOnSaturation();
   2351 
   2352   EXPECT_CALL(*gl_,
   2353               FramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT,
   2354                                       attachment,
   2355                                       target,
   2356                                       kServiceTextureId,
   2357                                       level))
   2358       .Times(1)
   2359       .RetiresOnSaturation();
   2360   EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT))
   2361       .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
   2362       .RetiresOnSaturation();
   2363 
   2364   EXPECT_CALL(*gl_, ClearStencil(0)).Times(1).RetiresOnSaturation();
   2365   SetupExpectationsForStencilMask(GLES2Decoder::kDefaultStencilMask,
   2366                                   GLES2Decoder::kDefaultStencilMask);
   2367   EXPECT_CALL(*gl_, ClearDepth(1.0f)).Times(1).RetiresOnSaturation();
   2368   SetupExpectationsForDepthMask(true);
   2369   SetupExpectationsForEnableDisable(GL_SCISSOR_TEST, false);
   2370 
   2371   EXPECT_CALL(*gl_, Clear(GL_DEPTH_BUFFER_BIT)).Times(1).RetiresOnSaturation();
   2372 
   2373   SetupExpectationsForRestoreClearState(0.0f, 0.0f, 0.0f, 0.0f, 0, 1.0f, true);
   2374 
   2375   EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _)).Times(1).RetiresOnSaturation();
   2376   EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0))
   2377       .Times(1)
   2378       .RetiresOnSaturation();
   2379 
   2380   SetupExpectationsForApplyingDefaultDirtyState();
   2381   EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
   2382       .Times(1)
   2383       .RetiresOnSaturation();
   2384   DrawArrays cmd;
   2385   cmd.Init(GL_TRIANGLES, 0, kNumVertices);
   2386   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   2387   EXPECT_EQ(GL_NO_ERROR, GetGLError());
   2388 }
   2389 
   2390 }  // namespace gles2
   2391 }  // namespace gpu
   2392