15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/id_allocator.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_manager.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/context_group.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/service/context_state.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_surface_mock.h"
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gpu/command_buffer/service/gpu_switches.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/image_manager.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/mailbox_manager.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/mocks.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/program_manager.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface_stub.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(GL_DEPTH24_STENCIL8)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GL_DEPTH24_STENCIL8 0x88F0
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::gfx::MockGLInterface;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using ::testing::AtLeast;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::MatcherCast;
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::Mock;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Pointee;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::SaveArg;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArrayArgument;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgumentPointee;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::SetArgPointee;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrEq;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using namespace cmds;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderRGBBackbufferTest::SetUp() {
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test codepath with workaround clear_alpha_in_readpixels because
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ReadPixelsEmulator emulates the incorrect driver behavior.
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CommandLine command_line(0, NULL);
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  command_line.AppendSwitchASCII(
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      switches::kGpuDriverBugWorkarounds,
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::IntToString(gpu::CLEAR_ALPHA_IN_READPIXELS));
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoderWithCommandLine(init, &command_line);
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupDefaultProgram();
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Override default setup so nothing gets setup.
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderManualInitTest::SetUp() {
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderManualInitTest::EnableDisableTest(GLenum cap,
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                   bool enable,
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                   bool expect_set) {
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (expect_set) {
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SetupExpectationsForEnableDisable(cap, enable);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (enable) {
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Enable cmd;
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd.Init(cap);
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Disable cmd;
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd.Init(cap);
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GetIntegervCached) {
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  struct TestInfo {
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GLenum pname;
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GLint expected;
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TestInfo tests[] = {
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       GL_MAX_TEXTURE_SIZE, TestHelper::kMaxTextureSize,
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       GL_MAX_CUBE_MAP_TEXTURE_SIZE, TestHelper::kMaxCubeMapTextureSize,
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       GL_MAX_RENDERBUFFER_SIZE, TestHelper::kMaxRenderbufferSize,
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  typedef GetIntegerv::Result Result;
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t ii = 0; ii < sizeof(tests) / sizeof(tests[0]); ++ii) {
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const TestInfo& test = tests[ii];
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Result* result = static_cast<Result*>(shared_memory_address_);
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_CALL(*gl_, GetError())
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        .WillOnce(Return(GL_NO_ERROR))
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        .WillOnce(Return(GL_NO_ERROR))
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        .RetiresOnSaturation();
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, GetIntegerv(test.pname, _)).Times(0);
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    result->size = 0;
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GetIntegerv cmd2;
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(test.pname, shared_memory_id_, shared_memory_offset_);
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(test.pname),
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              result->GetNumResults());
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(GL_NO_ERROR, GetGLError());
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(test.expected, result->GetData()[0]);
1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderWithShaderTest, GetMaxValueInBufferCHROMIUM) {
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupIndexBuffer();
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetMaxValueInBufferCHROMIUM::Result* result =
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      static_cast<GetMaxValueInBufferCHROMIUM::Result*>(shared_memory_address_);
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  *result = 0;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetMaxValueInBufferCHROMIUM cmd;
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(client_element_buffer_id_,
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeCount,
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeStart * 2,
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(7u, *result);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(client_element_buffer_id_,
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeCount + 1,
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeStart * 2,
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(100u, *result);
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kInvalidClientId,
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeCount,
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeStart * 2,
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(client_element_buffer_id_,
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kOutOfRangeIndexRangeEnd,
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeStart * 2,
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(client_element_buffer_id_,
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeCount + 1,
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kOutOfRangeIndexRangeEnd * 2,
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(client_element_buffer_id_,
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeCount + 1,
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeStart * 2,
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(client_buffer_id_,
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeCount + 1,
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeStart * 2,
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(client_element_buffer_id_,
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeCount + 1,
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeStart * 2,
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kInvalidSharedMemoryId,
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(client_element_buffer_id_,
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeCount + 1,
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeStart * 2,
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kInvalidSharedMemoryOffset);
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, SharedIds) {
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenSharedIdsCHROMIUM gen_cmd;
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RegisterSharedIdsCHROMIUM reg_cmd;
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DeleteSharedIdsCHROMIUM del_cmd;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kNamespaceId = id_namespaces::kTextures;
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kExpectedId1 = 1;
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kExpectedId2 = 2;
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kExpectedId3 = 4;
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kRegisterId = 3;
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLuint* ids = GetSharedMemoryAs<GLuint*>();
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gen_cmd.Init(kNamespaceId, 0, 2, kSharedMemoryId, kSharedMemoryOffset);
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd));
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  IdAllocatorInterface* id_allocator = GetIdAllocator(kNamespaceId);
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(id_allocator != NULL);
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // This check is implementation dependant but it's kind of hard to check
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // otherwise.
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kExpectedId1, ids[0]);
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kExpectedId2, ids[1]);
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kExpectedId1));
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(id_allocator->InUse(kRegisterId));
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(id_allocator->InUse(kExpectedId3));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ClearSharedMemory();
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ids[0] = kRegisterId;
238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  reg_cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset);
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(reg_cmd));
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kExpectedId1));
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kRegisterId));
243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(id_allocator->InUse(kExpectedId3));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ClearSharedMemory();
246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gen_cmd.Init(kNamespaceId, 0, 1, kSharedMemoryId, kSharedMemoryOffset);
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd));
248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kExpectedId3, ids[0]);
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kExpectedId1));
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kRegisterId));
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kExpectedId3));
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ClearSharedMemory();
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ids[0] = kExpectedId1;
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ids[1] = kRegisterId;
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  del_cmd.Init(kNamespaceId, 2, kSharedMemoryId, kSharedMemoryOffset);
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(del_cmd));
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(id_allocator->InUse(kExpectedId1));
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kExpectedId2));
261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(id_allocator->InUse(kRegisterId));
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(id_allocator->InUse(kExpectedId3));
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ClearSharedMemory();
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ids[0] = kExpectedId3;
266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ids[1] = kExpectedId2;
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  del_cmd.Init(kNamespaceId, 2, kSharedMemoryId, kSharedMemoryOffset);
268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(del_cmd));
269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(id_allocator->InUse(kExpectedId1));
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(id_allocator->InUse(kExpectedId2));
271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(id_allocator->InUse(kRegisterId));
272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(id_allocator->InUse(kExpectedId3));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check passing in an id_offset.
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ClearSharedMemory();
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kOffset = 0xABCDEF;
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gen_cmd.Init(kNamespaceId, kOffset, 2, kSharedMemoryId, kSharedMemoryOffset);
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd));
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kOffset, ids[0]);
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kOffset + 1, ids[1]);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GenSharedIdsCHROMIUMBadArgs) {
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kNamespaceId = id_namespaces::kTextures;
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenSharedIdsCHROMIUM cmd;
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, 0, -1, kSharedMemoryId, kSharedMemoryOffset);
287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, 0, 1, kInvalidSharedMemoryId, kSharedMemoryOffset);
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, 0, 1, kSharedMemoryId, kInvalidSharedMemoryOffset);
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, RegisterSharedIdsCHROMIUMBadArgs) {
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kNamespaceId = id_namespaces::kTextures;
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RegisterSharedIdsCHROMIUM cmd;
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset);
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset);
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset);
302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, RegisterSharedIdsCHROMIUMDuplicateIds) {
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kNamespaceId = id_namespaces::kTextures;
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kRegisterId = 3;
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RegisterSharedIdsCHROMIUM cmd;
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLuint* ids = GetSharedMemoryAs<GLuint*>();
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ids[0] = kRegisterId;
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, DeleteSharedIdsCHROMIUMBadArgs) {
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLuint kNamespaceId = id_namespaces::kTextures;
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DeleteSharedIdsCHROMIUM cmd;
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset);
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset);
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset);
326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsBuffer) {
330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsBuffer(client_buffer_id_));
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(DoIsBuffer(client_buffer_id_));
333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoDeleteBuffer(client_buffer_id_, kServiceBufferId);
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsBuffer(client_buffer_id_));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsFramebuffer) {
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_));
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindFramebuffer(
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(DoIsFramebuffer(client_framebuffer_id_));
342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoDeleteFramebuffer(client_framebuffer_id_,
343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      kServiceFramebufferId,
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      true,
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      GL_FRAMEBUFFER,
346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      0,
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      true,
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      GL_FRAMEBUFFER,
349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      0);
350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_));
351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsProgram) {
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // IsProgram is true as soon as the program is created.
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(DoIsProgram(client_program_id_));
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId))
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoDeleteProgram(client_program_id_, kServiceProgramId);
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsProgram(client_program_id_));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsRenderbuffer) {
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_));
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindRenderbuffer(
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId);
367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(DoIsRenderbuffer(client_renderbuffer_id_));
368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId);
369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsShader) {
373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // IsShader is true as soon as the program is created.
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(DoIsShader(client_shader_id_));
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoDeleteShader(client_shader_id_, kServiceShaderId);
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsShader(client_shader_id_));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsTexture) {
380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsTexture(client_texture_id_));
381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(DoIsTexture(client_texture_id_));
383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoDeleteTexture(client_texture_id_, kServiceTextureId);
384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(DoIsTexture(client_texture_id_));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GetMultipleIntegervCHROMIUMValidArgs) {
388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLsizei kCount = 3;
389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum* pnames = GetSharedMemoryAs<GLenum*>();
390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pnames[0] = GL_DEPTH_WRITEMASK;
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pnames[1] = GL_COLOR_WRITEMASK;
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pnames[2] = GL_STENCIL_WRITEMASK;
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint* results =
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetSharedMemoryAsWithOffset<GLint*>(sizeof(*pnames) * kCount);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei num_results = 0;
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (GLsizei ii = 0; ii < kCount; ++ii) {
398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]);
399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLsizei result_size = num_results * sizeof(*results);
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  memset(results, 0, result_size);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLint kSentinel = 0x12345678;
404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  results[num_results] = kSentinel;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetMultipleIntegervCHROMIUM cmd;
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kSharedMemoryId,
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kCount,
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + sizeof(*pnames) * kCount,
412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           result_size);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, results[0]);                    // Depth writemask
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, results[1]);                    // color writemask red
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, results[2]);                    // color writemask green
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, results[3]);                    // color writemask blue
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, results[4]);                    // color writemask alpha
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(-1, results[5]);                   // stencil writemask alpha
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kSentinel, results[num_results]);  // End of results
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) {
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLsizei kCount = 3;
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Offset the pnames because GLGetError will use the first uint32.
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const uint32 kPnameOffset = sizeof(uint32);
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const uint32 kResultsOffset = kPnameOffset + sizeof(GLint) * kCount;
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum* pnames = GetSharedMemoryAsWithOffset<GLenum*>(kPnameOffset);
431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pnames[0] = GL_DEPTH_WRITEMASK;
432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pnames[1] = GL_COLOR_WRITEMASK;
433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pnames[2] = GL_STENCIL_WRITEMASK;
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint* results = GetSharedMemoryAsWithOffset<GLint*>(kResultsOffset);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei num_results = 0;
437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (GLsizei ii = 0; ii < kCount; ++ii) {
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]);
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLsizei result_size = num_results * sizeof(*results);
441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  memset(results, 0, result_size);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLint kSentinel = 0x12345678;
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  results[num_results] = kSentinel;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetMultipleIntegervCHROMIUM cmd;
447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check bad pnames pointer.
448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kInvalidSharedMemoryId,
449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kPnameOffset,
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kCount,
451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kResultsOffset,
453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           result_size);
454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check bad pnames pointer.
457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kSharedMemoryId,
458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kInvalidSharedMemoryOffset,
459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kCount,
460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kResultsOffset,
462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           result_size);
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check bad count.
466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kSharedMemoryId,
467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kPnameOffset,
468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           static_cast<GLuint>(-1),
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kResultsOffset,
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           result_size);
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check bad results pointer.
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kSharedMemoryId,
476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kPnameOffset,
477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kCount,
478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kInvalidSharedMemoryId,
479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kResultsOffset,
480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           result_size);
481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check bad results pointer.
484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kSharedMemoryId,
485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kPnameOffset,
486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kCount,
487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kInvalidSharedMemoryOffset,
489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           result_size);
490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check bad size.
493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kSharedMemoryId,
494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kPnameOffset,
495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kCount,
496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kResultsOffset,
498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           result_size + 1);
499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check bad size.
502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kSharedMemoryId,
503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kPnameOffset,
504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kCount,
505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kResultsOffset,
507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           result_size - 1);
508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check bad enum.
511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kSharedMemoryId,
512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kPnameOffset,
513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kCount,
514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset + kResultsOffset,
516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           result_size);
517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum temp = pnames[2];
518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pnames[2] = GL_TRUE;
519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pnames[2] = temp;
522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check results area has not been cleared by client.
523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  results[1] = 1;
524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd));
525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check buffer is what we expect
526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, results[0]);
527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, results[1]);
528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, results[2]);
529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, results[3]);
530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, results[4]);
531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, results[5]);
532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kSentinel, results[num_results]);  // End of results
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) {
536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexture cmd1;
541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd1.Init(GL_TEXTURE_2D, kInvalidClientId);
542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindBuffer cmd2;
546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd2.Init(GL_ARRAY_BUFFER, kInvalidClientId);
547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindFramebuffer cmd3;
551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd3.Init(GL_FRAMEBUFFER, kInvalidClientId);
552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd3));
553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindRenderbuffer cmd4;
556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd4.Init(GL_RENDERBUFFER, kInvalidClientId);
557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd4));
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) {
562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const uint32 kBadBucketId = 123;
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EnableFeatureCHROMIUM cmd;
564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kBadBucketId, shared_memory_id_, shared_memory_offset_);
565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) {
569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const uint32 kBadBucketId = 123;
570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RequestExtensionCHROMIUM cmd;
571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kBadBucketId);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, BeginQueryEXTDisabled) {
576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test something fails if off.
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXT) {
580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_EXT_occlusion_query_boolean";
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_alpha = true;
584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_alpha = true;
585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test end fails if no begin.
589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EndQueryEXT end_cmd;
590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1);
591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BeginQueryEXT begin_cmd;
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test id = 0 fails.
597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  begin_cmd.Init(
598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_ANY_SAMPLES_PASSED_EXT, 0, kSharedMemoryId, kSharedMemoryOffset);
599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenHelper<GenQueriesEXTImmediate>(kNewClientId);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test valid parameters work.
605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenQueriesARB(1, _))
606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kNewServiceId))
607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId))
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(1)
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .RetiresOnSaturation();
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Query object should not be created untill BeginQueriesEXT.
613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QueryManager* query_manager = decoder_->GetQueryManager();
614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(query_manager != NULL);
615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(query == NULL);
6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // BeginQueryEXT should fail  if id is not generated from GenQueriesEXT.
619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT,
620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kInvalidClientId,
621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryId,
622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryOffset);
623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT,
627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kNewClientId,
628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryId,
629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryOffset);
630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
6320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // After BeginQueriesEXT id name should have query object associated with it.
634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  query = query_manager->GetQuery(kNewClientId);
635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(query != NULL);
636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(query->pending());
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test trying begin again fails
639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
6410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test end fails with different target
643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  end_cmd.Init(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, 1);
644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
6460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test end succeeds
648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT))
6490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      .Times(1)
6500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      .RetiresOnSaturation();
651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1);
652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
6530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(query->pending());
6550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation();
6570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
6580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)struct QueryType {
660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum type;
661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool is_gl;
662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const QueryType kQueryTypes[] = {
665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {GL_COMMANDS_ISSUED_CHROMIUM, false},
666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {GL_LATENCY_QUERY_CHROMIUM, false},
667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, false},
668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, false},
669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {GL_GET_ERROR_QUERY_CHROMIUM, false},
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {GL_COMMANDS_COMPLETED_CHROMIUM, false},
671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {GL_ANY_SAMPLES_PASSED_EXT, true},
672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void CheckBeginEndQueryBadMemoryFails(GLES2DecoderTestBase* test,
675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                             GLuint client_id,
676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                             GLuint service_id,
677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                             const QueryType& query_type,
678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                             int32 shm_id,
679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                             uint32 shm_offset) {
680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // We need to reset the decoder on each iteration, because we lose the
681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // context every time.
682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLES2DecoderTestBase::InitState init;
683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync";
684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_alpha = true;
686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_alpha = true;
687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  test->InitDecoder(init);
689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ::testing::StrictMock< ::gfx::MockGLInterface>* gl = test->GetGLMock();
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BeginQueryEXT begin_cmd;
692c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  test->GenHelper<GenQueriesEXTImmediate>(client_id);
694c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (query_type.is_gl) {
696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, GenQueriesARB(1, _))
697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(SetArgumentPointee<1>(service_id))
698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, BeginQueryARB(query_type.type, service_id))
700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1)
701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
702c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
703c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test bad shared memory fails
705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  begin_cmd.Init(query_type.type, client_id, shm_id, shm_offset);
706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  error::Error error1 = test->ExecuteCmd(begin_cmd);
707c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (query_type.is_gl) {
709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, EndQueryARB(query_type.type))
710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1)
711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (query_type.type == GL_GET_ERROR_QUERY_CHROMIUM) {
714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, GetError())
715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(Return(GL_NO_ERROR))
716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef);
719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) {
720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, Flush()).RetiresOnSaturation();
721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0))
722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(Return(kGlSync))
723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON
725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(*gl, IsSync(kGlSync))
726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(Return(GL_TRUE))
727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .RetiresOnSaturation();
728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
730c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EndQueryEXT end_cmd;
732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  end_cmd.Init(query_type.type, 1);
733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  error::Error error2 = test->ExecuteCmd(end_cmd);
734c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (query_type.is_gl) {
736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(
737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        *gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _))
738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(SetArgumentPointee<2>(1))
739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _))
741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(SetArgumentPointee<2>(1))
742010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) {
745116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON
746116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(*gl, IsSync(kGlSync))
747116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(Return(GL_TRUE))
748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .RetiresOnSaturation();
749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _))
751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(Return(GL_ALREADY_SIGNALED))
752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
754c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QueryManager* query_manager = test->GetDecoder()->GetQueryManager();
756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(query_manager != NULL);
757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool process_success = query_manager->ProcessPendingQueries();
758c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(error1 != error::kNoError || error2 != error::kNoError ||
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              !process_success);
761c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (query_type.is_gl) {
763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation();
764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) {
766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON
767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(*gl, IsSync(kGlSync))
768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(Return(GL_TRUE))
769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .RetiresOnSaturation();
770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation();
772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  test->ResetDecoder();
774c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
775c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) {
777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kQueryTypes); ++i) {
778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CheckBeginEndQueryBadMemoryFails(this,
779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kNewClientId,
780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kNewServiceId,
781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kQueryTypes[i],
782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kInvalidSharedMemoryId,
783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kSharedMemoryOffset);
784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryOffsetFails) {
788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kQueryTypes); ++i) {
789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Out-of-bounds.
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CheckBeginEndQueryBadMemoryFails(this,
791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kNewClientId,
792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kNewServiceId,
793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kQueryTypes[i],
794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kSharedMemoryId,
795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kInvalidSharedMemoryOffset);
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Overflow.
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CheckBeginEndQueryBadMemoryFails(this,
798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kNewClientId,
799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kNewServiceId,
800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kQueryTypes[i],
801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     kSharedMemoryId,
802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     0xfffffffcu);
803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) {
807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BeginQueryEXT begin_cmd;
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenHelper<GenQueriesEXTImmediate>(kNewClientId);
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
811010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test valid parameters work.
812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  begin_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM,
813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kNewClientId,
814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryId,
815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryOffset);
816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QueryManager* query_manager = decoder_->GetQueryManager();
820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(query_manager != NULL);
821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(query != NULL);
823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(query->pending());
8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test end succeeds
826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EndQueryEXT end_cmd;
827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  end_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM, 1);
828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(query->pending());
8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) {
834010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BeginQueryEXT begin_cmd;
8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenHelper<GenQueriesEXTImmediate>(kNewClientId);
8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test valid parameters work.
839010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  begin_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM,
840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kNewClientId,
841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryId,
842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryOffset);
843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QueryManager* query_manager = decoder_->GetQueryManager();
847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(query_manager != NULL);
848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(query != NULL);
850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(query->pending());
8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test end succeeds
853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_);
8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_INVALID_VALUE))
857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EndQueryEXT end_cmd;
860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  end_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM, 1);
861010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(query->pending());
864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE),
865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            static_cast<GLenum>(sync->result));
8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) {
869e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitState init;
870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync";
871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_alpha = true;
873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_alpha = true;
874c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  init.bind_generates_resource = true;
875e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoder(init);
8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenHelper<GenQueriesEXTImmediate>(kNewClientId);
8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BeginQueryEXT begin_cmd;
880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  begin_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM,
881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kNewClientId,
882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryId,
883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 kSharedMemoryOffset);
884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
886c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QueryManager* query_manager = decoder_->GetQueryManager();
888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(query_manager != NULL);
889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QueryManager::Query* query = query_manager->GetQuery(kNewClientId);
890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(query != NULL);
891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(query->pending());
892c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef);
894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, Flush()).RetiresOnSaturation();
895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0))
896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(kGlSync))
897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
898116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON
899116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*gl_, IsSync(kGlSync))
900116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .WillOnce(Return(GL_TRUE))
901116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .RetiresOnSaturation();
902116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
903c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EndQueryEXT end_cmd;
905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  end_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, 1);
906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
907c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(GL_NO_ERROR, GetGLError());
908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(query->pending());
909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
910116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON
911116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*gl_, IsSync(kGlSync))
912116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .WillOnce(Return(GL_TRUE))
913116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .RetiresOnSaturation();
914116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_TIMEOUT_EXPIRED))
917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool process_success = query_manager->ProcessPendingQueries();
919c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(process_success);
921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(query->pending());
922c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON
924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*gl_, IsSync(kGlSync))
925116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .WillOnce(Return(GL_TRUE))
926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .RetiresOnSaturation();
927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _))
929010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_ALREADY_SIGNALED))
930010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  process_success = query_manager->ProcessPendingQueries();
932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(process_success);
934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(query->pending());
935010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_);
936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(0), static_cast<GLenum>(sync->result));
937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
938116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON
939116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*gl_, IsSync(kGlSync))
940116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .WillOnce(Return(GL_TRUE))
941116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .RetiresOnSaturation();
942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation();
944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ResetDecoder();
945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
946c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsEnabledReturnsCachedValue) {
948010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // NOTE: There are no expectations because no GL functions should be
949010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // called for DEPTH_TEST or STENCIL_TEST
950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static const GLenum kStates[] = {
951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_DEPTH_TEST, GL_STENCIL_TEST,
952010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t ii = 0; ii < arraysize(kStates); ++ii) {
954010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Enable enable_cmd;
955010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GLenum state = kStates[ii];
956010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    enable_cmd.Init(state);
957010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd));
958010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    IsEnabled::Result* result =
959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        static_cast<IsEnabled::Result*>(shared_memory_address_);
960010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    IsEnabled is_enabled_cmd;
961010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    is_enabled_cmd.Init(state, shared_memory_id_, shared_memory_offset_);
962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd));
963010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_NE(0u, *result);
964010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Disable disable_cmd;
965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    disable_cmd.Init(state);
966010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(disable_cmd));
967010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd));
968010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(0u, *result);
969010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
970c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
971c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
972010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) {
973c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  InitState init;
974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ARB_texture_rectangle";
975c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  init.gl_version = "3.0";
976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
977c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  InitDecoder(init);
978c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
979010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = GetTexture(client_texture_id_)->texture();
980010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture != NULL);
981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_UNMANAGED_CHROMIUM);
982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
984c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
985010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexParameteri cmd;
986010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
987010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_TEXTURE_POOL_CHROMIUM,
988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_TEXTURE_POOL_UNMANAGED_CHROMIUM);
989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
991c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_TEXTURE_POOL_CHROMIUM,
994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_TEXTURE_POOL_MANAGED_CHROMIUM);
995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
997c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_MANAGED_CHROMIUM);
9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, GL_NONE);
1001010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1002010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1005010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
10060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1007010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class SizeOnlyMemoryTracker : public MemoryTracker {
1008010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
1009010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SizeOnlyMemoryTracker() {
1010010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // These are the default textures. 1 for TEXTURE_2D and 6 faces for
1011010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // TEXTURE_CUBE_MAP.
1012010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const size_t kInitialUnmanagedPoolSize = 7 * 4;
1013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const size_t kInitialManagedPoolSize = 0;
1014010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    pool_infos_[MemoryTracker::kUnmanaged].initial_size =
1015010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        kInitialUnmanagedPoolSize;
1016010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    pool_infos_[MemoryTracker::kManaged].initial_size = kInitialManagedPoolSize;
1017010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
10180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1019010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Ensure a certain amount of GPU memory is free. Returns true on success.
1020010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD1(EnsureGPUMemoryAvailable, bool(size_t size_needed));
10210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void TrackMemoryAllocatedChange(size_t old_size,
1023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          size_t new_size,
1024010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          Pool pool) {
1025010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PoolInfo& info = pool_infos_[pool];
1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    info.size += new_size - old_size;
1027010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
10280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  size_t GetPoolSize(Pool pool) {
1030010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const PoolInfo& info = pool_infos_[pool];
1031010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return info.size - info.initial_size;
1032010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
10330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
1035010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~SizeOnlyMemoryTracker() {}
1036010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  struct PoolInfo {
1037010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PoolInfo() : initial_size(0), size(0) {}
1038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    size_t initial_size;
1039010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    size_t size;
1040010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
1041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::map<Pool, PoolInfo> pool_infos_;
1042010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
10430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1044010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // anonymous namespace.
10450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) {
1047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
1048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new SizeOnlyMemoryTracker();
1049010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  set_memory_tracker(memory_tracker.get());
1050e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitState init;
1051e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.gl_version = "3.0";
1052e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.bind_generates_resource = true;
1053e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoder(init);
1054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Expect that initial size - size is 0.
1055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
1056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) {
1060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
1061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new SizeOnlyMemoryTracker();
1062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  set_memory_tracker(memory_tracker.get());
1063e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitState init;
1064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1066e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoder(init);
10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(true))
1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               8,
1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               4,
1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
1077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
1079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
1080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
1081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64))
1083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(true))
1084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1085010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
1086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
1087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
1088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               4,
1089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               4,
1090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
1091010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
1092010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
1093010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
1094010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
1095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
1096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check we get out of memory and no call to glTexImage2D if Ensure fails.
1098010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64))
1099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(false))
1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexImage2D cmd;
1102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
1103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
1104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
1105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           4,
1106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           4,
1107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
1108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
1109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
1110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) {
1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
1118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new SizeOnlyMemoryTracker();
1119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  set_memory_tracker(memory_tracker.get());
1120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitState init;
1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoder(init);
1124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check we get out of memory and no call to glTexStorage2DEXT
1126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // if Ensure fails.
1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(false))
1129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .RetiresOnSaturation();
1130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexStorage2DEXT cmd;
1131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4);
1132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
1134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
1135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) {
1138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum target = GL_TEXTURE_2D;
1139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint level = 0;
1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum internal_format = GL_RGBA;
1141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei width = 4;
1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei height = 8;
1143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint border = 0;
1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new SizeOnlyMemoryTracker();
1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  set_memory_tracker(memory_tracker.get());
1147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitState init;
1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_alpha = true;
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_alpha = true;
1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1152e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoder(init);
1153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(true))
1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
1159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
1160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              CopyTexImage2D(
1163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  target, level, internal_format, 0, 0, width, height, border))
1164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .Times(1)
1165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .RetiresOnSaturation();
1166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CopyTexImage2D cmd;
1167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(target, level, internal_format, 0, 0, width, height);
1168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check we get out of memory and no call to glCopyTexImage2D if Ensure fails.
1172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
1173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(false))
1174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
1177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
1178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) {
1181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
1182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new SizeOnlyMemoryTracker();
1183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  set_memory_tracker(memory_tracker.get());
1184e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitState init;
1185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1186e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.bind_generates_resource = true;
1187e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoder(init);
1188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindRenderbuffer(
1189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId);
1190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EnsureRenderbufferBound(false);
1191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*gl_, GetError())
1192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .WillOnce(Return(GL_NO_ERROR))
1193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .WillOnce(Return(GL_NO_ERROR))
1194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .RetiresOnSaturation();
1195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
1196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(true))
1197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .RetiresOnSaturation();
1198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, RenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA, 8, 4))
1199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .Times(1)
1200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .RetiresOnSaturation();
1201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RenderbufferStorage cmd;
1202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 8, 4);
1203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
1206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check we get out of memory and no call to glRenderbufferStorage if Ensure
1207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // fails.
1208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
1209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(false))
1210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .RetiresOnSaturation();
1211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
1213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged));
1214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerBufferData) {
1217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<SizeOnlyMemoryTracker> memory_tracker =
1218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new SizeOnlyMemoryTracker();
1219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  set_memory_tracker(memory_tracker.get());
1220e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitState init;
1221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1222e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.bind_generates_resource = true;
1223e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoder(init);
1224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
1225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*gl_, GetError())
1226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .WillOnce(Return(GL_NO_ERROR))
1227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .WillOnce(Return(GL_NO_ERROR))
1228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .RetiresOnSaturation();
1229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
1230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(true))
1231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .RetiresOnSaturation();
1232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW))
1233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .RetiresOnSaturation();
1235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BufferData cmd;
1236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_ARRAY_BUFFER, 128, 0, 0, GL_STREAM_DRAW);
1237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
1240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check we get out of memory and no call to glBufferData if Ensure
1241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // fails.
1242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128))
1243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(false))
1244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      .RetiresOnSaturation();
1245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
1247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged));
1248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, ImmutableCopyTexImage2D) {
1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GLenum kTarget = GL_TEXTURE_2D;
1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GLint kLevel = 0;
1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GLenum kInternalFormat = GL_RGBA;
1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GLenum kSizedInternalFormat = GL_RGBA8;
1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GLsizei kWidth = 4;
1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GLsizei kHeight = 8;
1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GLint kBorder = 0;
1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InitState init;
1259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  init.extensions = "GL_EXT_texture_storage";
1260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  init.gl_version = "3.0";
1261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  init.has_alpha = true;
1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  init.request_alpha = true;
1263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  init.bind_generates_resource = true;
1264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InitDecoder(init);
1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // CopyTexImage2D will call arbitrary amount of GetErrors.
1268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
1269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .Times(AtLeast(1));
1270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*gl_,
1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              CopyTexImage2D(
1273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight,
1274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  kBorder))
1275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .Times(1);
1276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*gl_,
1278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              TexStorage2DEXT(
1279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  kTarget, kLevel, kSizedInternalFormat, kWidth, kHeight))
1280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .Times(1);
1281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CopyTexImage2D copy_cmd;
1282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  copy_cmd.Init(kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight);
1283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd));
1284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TexStorage2DEXT storage_cmd;
1287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  storage_cmd.Init(kTarget, kLevel, kSizedInternalFormat, kWidth, kHeight);
1288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(storage_cmd));
1289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This should not invoke CopyTexImage2D.
1292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  copy_cmd.Init(kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight);
1293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd));
1294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
1295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(GLES2DecoderTest, LoseContextCHROMIUMValidArgs) {
1298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*mock_decoder_, LoseContext(GL_GUILTY_CONTEXT_RESET_ARB))
1299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .Times(1);
1300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmds::LoseContextCHROMIUM cmd;
1301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_GUILTY_CONTEXT_RESET_ARB);
1302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(error::kLostContext, ExecuteCmd(cmd));
1303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(GLES2DecoderTest, LoseContextCHROMIUMInvalidArgs0_0) {
1307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*mock_decoder_, LoseContext(_))
1308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .Times(0);
1309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmds::LoseContextCHROMIUM cmd;
1310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(GL_NONE, GL_GUILTY_CONTEXT_RESET_ARB);
1311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(GLES2DecoderTest, LoseContextCHROMIUMInvalidArgs1_0) {
1316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*mock_decoder_, LoseContext(_))
1317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .Times(0);
1318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmds::LoseContextCHROMIUM cmd;
1319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_NONE);
1320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass GLES2DecoderDoCommandsTest : public GLES2DecoderTest {
13251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
13261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GLES2DecoderDoCommandsTest() {
13271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (int i = 0; i < 3; i++) {
13281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cmds_[i].Init(GL_BLEND);
13291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
13301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    entries_per_cmd_ = ComputeNumEntries(cmds_[0].ComputeSize());
13311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
13321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetExpectationsForNCommands(int num_commands) {
13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (int i = 0; i < num_commands; i++)
13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SetupExpectationsForEnableDisable(GL_BLEND, true);
13361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
13391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Enable cmds_[3];
13401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int entries_per_cmd_;
13411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that processing with 0 entries does nothing.
13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsOneOfZero) {
13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int num_processed = -1;
13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetExpectationsForNCommands(0);
13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      error::kNoError,
13491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      decoder_->DoCommands(1, &cmds_, entries_per_cmd_ * 0, &num_processed));
13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(GL_NO_ERROR, GetGLError());
13511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, num_processed);
13521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test processing at granularity of single commands.
13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsOneOfOne) {
13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int num_processed = -1;
13571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetExpectationsForNCommands(1);
13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      error::kNoError,
13601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      decoder_->DoCommands(1, &cmds_, entries_per_cmd_ * 1, &num_processed));
13611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(GL_NO_ERROR, GetGLError());
13621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(entries_per_cmd_, num_processed);
13631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test processing at granularity of multiple commands.
13661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsThreeOfThree) {
13671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int num_processed = -1;
13681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetExpectationsForNCommands(3);
13691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
13701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      error::kNoError,
13711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      decoder_->DoCommands(3, &cmds_, entries_per_cmd_ * 3, &num_processed));
13721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(GL_NO_ERROR, GetGLError());
13731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(entries_per_cmd_ * 3, num_processed);
13741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test processing a request smaller than available entries.
13771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsTwoOfThree) {
13781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int num_processed = -1;
13791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetExpectationsForNCommands(2);
13801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
13811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      error::kNoError,
13821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      decoder_->DoCommands(2, &cmds_, entries_per_cmd_ * 3, &num_processed));
13831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(GL_NO_ERROR, GetGLError());
13841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(entries_per_cmd_ * 2, num_processed);
13851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that processing stops on a command with size 0.
13881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsZeroCmdSize) {
13891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cmds_[1].header.size = 0;
13901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int num_processed = -1;
13911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetExpectationsForNCommands(1);
13921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
13931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      error::kInvalidSize,
13941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      decoder_->DoCommands(2, &cmds_, entries_per_cmd_ * 2, &num_processed));
13951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(GL_NO_ERROR, GetGLError());
13961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(entries_per_cmd_, num_processed);
13971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
13981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
13991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that processing stops on a command with size greater than available.
14001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsOutOfBounds) {
14011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int num_processed = -1;
14021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetExpectationsForNCommands(1);
14031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(error::kOutOfBounds,
14041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            decoder_->DoCommands(
14051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                2, &cmds_, entries_per_cmd_ * 2 - 1, &num_processed));
14061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(GL_NO_ERROR, GetGLError());
14071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(entries_per_cmd_, num_processed);
14081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that commands with bad argument size are skipped without processing.
14111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsBadArgSize) {
14121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cmds_[1].header.size += 1;
14131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int num_processed = -1;
14141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetExpectationsForNCommands(1);
14151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(error::kInvalidArguments,
14161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            decoder_->DoCommands(
14171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                2, &cmds_, entries_per_cmd_ * 2 + 1, &num_processed));
14181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(GL_NO_ERROR, GetGLError());
14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(entries_per_cmd_ + cmds_[1].header.size, num_processed);
14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest, ::testing::Bool());
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderWithShaderTest, ::testing::Bool());
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderManualInitTest, ::testing::Bool());
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service,
1429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        GLES2DecoderRGBBackbufferTest,
1430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        ::testing::Bool());
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciINSTANTIATE_TEST_CASE_P(Service, GLES2DecoderDoCommandsTest, ::testing::Bool());
14331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
1436