15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_split.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/context_group.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/logger.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gpu/command_buffer/service/mailbox_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/program_manager.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/service/vertex_attrib_manager.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gl/gl_surface.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::gfx::MockGLInterface;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence;
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using ::testing::Invoke;
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using ::testing::InvokeWithoutArgs;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::MatcherCast;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Pointee;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArrayArgument;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgumentPointee;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrEq;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using ::testing::WithArg;
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NormalizeInitState(gpu::gles2::GLES2DecoderTestBase::InitState* init) {
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK(init);
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const char* kVAOExtensions[] = {
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "GL_OES_vertex_array_object",
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "GL_ARB_vertex_array_object",
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "GL_APPLE_vertex_array_object"
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool contains_vao_extension = false;
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t ii = 0; ii < arraysize(kVAOExtensions); ++ii) {
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (init->extensions.find(kVAOExtensions[ii]) != std::string::npos) {
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      contains_vao_extension = true;
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (init->use_native_vao) {
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (contains_vao_extension)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!init->extensions.empty())
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      init->extensions += " ";
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (StartsWithASCII(init->gl_version, "opengl es", false)) {
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      init->extensions += kVAOExtensions[0];
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    } else {
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_MACOSX)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      init->extensions += kVAOExtensions[1];
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      init->extensions += kVAOExtensions[2];
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // OS_MACOSX
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Make sure we don't set up an invalid InitState.
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CHECK(!contains_vao_extension);
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace Anonymous
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderTestBase::GLES2DecoderTestBase()
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : surface_(NULL),
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_(NULL),
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      memory_tracker_(NULL),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_buffer_id_(100),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_framebuffer_id_(101),
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_program_id_(102),
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_renderbuffer_id_(103),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_shader_id_(104),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_texture_id_(106),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_element_buffer_id_(107),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_vertex_shader_id_(121),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_fragment_shader_id_(122),
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_query_id_(123),
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      client_vertexarray_id_(124),
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_renderbuffer_id_(0),
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_renderbuffer_valid_(false),
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ignore_cached_state_for_test_(GetParam()),
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_red_(true),
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_green_(true),
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_blue_(true),
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_alpha_(true),
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_depth_mask_(true),
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cached_stencil_front_mask_(static_cast<GLuint>(-1)),
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cached_stencil_back_mask_(static_cast<GLuint>(-1)) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(immediate_buffer_, 0xEE, sizeof(immediate_buffer_));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderTestBase::~GLES2DecoderTestBase() {}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetUp() {
115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitState init;
116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.gl_version = "3.0";
117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.has_alpha = true;
118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.has_depth = true;
119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.request_alpha = true;
120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.request_depth = true;
121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.bind_generates_resource = true;
122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoder(init);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForVertexAttribManager() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (GLint ii = 0; ii < kNumVertexAttribs; ++ii) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, VertexAttrib4f(ii, 0.0f, 0.0f, 0.0f, 1.0f))
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochGLES2DecoderTestBase::InitState::InitState()
134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : has_alpha(false),
135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      has_depth(false),
136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      has_stencil(false),
137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      request_alpha(false),
138e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      request_depth(false),
139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      request_stencil(false),
140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      bind_generates_resource(false),
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      lose_context_when_out_of_memory(false),
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      use_native_vao(true) {
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
144e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid GLES2DecoderTestBase::InitDecoder(const InitState& init) {
146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoderWithCommandLine(init, NULL);
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void GLES2DecoderTestBase::InitDecoderWithCommandLine(
150e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const InitState& init,
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const base::CommandLine* command_line) {
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InitState normalized_init = init;
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NormalizeInitState(&normalized_init);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Framebuffer::ClearFramebufferCompleteComboMap();
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::SetGLGetProcAddressProc(gfx::MockGLInterface::GetGLProcAddress);
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::GLSurface::InitializeOneOffWithMockBindingsForTests();
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_.reset(new StrictMock<MockGLInterface>());
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ::gfx::MockGLInterface::SetGLInterface(gl_.get());
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetupMockGLBehaviors();
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Only create stream texture manager if extension is requested.
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string> list;
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::SplitString(normalized_init.extensions, ' ', &list);
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info;
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (command_line)
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    feature_info = new FeatureInfo(*command_line);
170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  group_ = scoped_refptr<ContextGroup>(
171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      new ContextGroup(NULL,
172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       memory_tracker_,
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       new ShaderTranslatorCache,
174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       feature_info.get(),
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       normalized_init.bind_generates_resource));
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool use_default_textures = normalized_init.bind_generates_resource;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence sequence;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  surface_ = new gfx::GLSurfaceStub;
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  surface_->SetSize(gfx::Size(kBackBufferWidth, kBackBufferHeight));
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Context needs to be created before initializing ContextGroup, which will
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in turn initialize FeatureInfo, which needs a context to determine
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // extension support.
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context_ = new gfx::GLContextStubWithExtensions;
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  context_->AddExtensionsString(normalized_init.extensions.c_str());
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  context_->SetGLVersionString(normalized_init.gl_version.c_str());
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context_->MakeCurrent(surface_.get());
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::GLSurface::InitializeDynamicMockBindingsForTests(context_.get());
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestHelper::SetupContextGroupInitExpectations(
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gl_.get(),
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DisallowedFeatures(),
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      normalized_init.extensions.c_str(),
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      normalized_init.gl_version.c_str(),
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      normalized_init.bind_generates_resource);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We initialize the ContextGroup with a MockGLES2Decoder so that
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we can use the ContextGroup to figure out how the real GLES2Decoder
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will initialize itself.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mock_decoder_.reset(new MockGLES2Decoder());
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Install FakeDoCommands handler so we can use individual DoCommand()
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // expectations.
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(*mock_decoder_, DoCommands(_, _, _, _)).WillRepeatedly(
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Invoke(mock_decoder_.get(), &MockGLES2Decoder::FakeDoCommands));
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      group_->Initialize(mock_decoder_.get(), DisallowedFeatures()));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2130de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_CALL(*gl_, GenVertexArraysOES(1, _))
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceVertexArrayId))
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        .RetiresOnSaturation();
2170de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    EXPECT_CALL(*gl_, BindVertexArrayOES(_)).Times(1).RetiresOnSaturation();
2180de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  }
2190de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (group_->feature_info()->workarounds().init_vertex_attributes)
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AddExpectationsForVertexAttribManager();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddExpectationsForBindVertexArrayOES();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, EnableVertexAttribArray(0))
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint attrib_0_id[] = {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceAttrib0BufferId,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint fixed_attrib_buffer_id[] = {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceFixedAttribBufferId,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(arraysize(attrib_0_id), _))
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(attrib_0_id,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    attrib_0_id + arraysize(attrib_0_id)))
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, kServiceAttrib0BufferId))
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, VertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, NULL))
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, 0))
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(arraysize(fixed_attrib_buffer_id), _))
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fixed_attrib_buffer_id,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fixed_attrib_buffer_id + arraysize(fixed_attrib_buffer_id)))
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (GLint tt = 0; tt < TestHelper::kNumTextureUnits; ++tt) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0 + tt))
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (group_->feature_info()->feature_flags().oes_egl_image_external) {
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EXPECT_CALL(*gl_,
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                  BindTexture(GL_TEXTURE_EXTERNAL_OES,
260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              use_default_textures
261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  ? TestHelper::kServiceDefaultExternalTextureId
262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  : 0))
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (group_->feature_info()->feature_flags().arb_texture_rectangle) {
267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EXPECT_CALL(
268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          *gl_,
269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          BindTexture(GL_TEXTURE_RECTANGLE_ARB,
270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                      use_default_textures
271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          ? TestHelper::kServiceDefaultRectangleTextureId
272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          : 0))
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_CALL(*gl_,
277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                BindTexture(GL_TEXTURE_CUBE_MAP,
278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            use_default_textures
279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                ? TestHelper::kServiceDefaultTextureCubemapId
280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                : 0))
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_CALL(
284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        *gl_,
285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        BindTexture(
286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            GL_TEXTURE_2D,
287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            use_default_textures ? TestHelper::kServiceDefaultTexture2dId : 0))
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER, 0))
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .Times(1)
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .RetiresOnSaturation();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _))
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(normalized_init.has_alpha ? 8 : 0))
300e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      .RetiresOnSaturation();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(normalized_init.has_depth ? 24 : 0))
303e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      .RetiresOnSaturation();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(normalized_init.has_stencil ? 8 : 0))
306e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      .RetiresOnSaturation();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Enable(GL_VERTEX_PROGRAM_POINT_SIZE))
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Enable(GL_POINT_SPRITE))
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLint max_viewport_dims[] = {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMaxViewportWidth,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMaxViewportHeight
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_MAX_VIEWPORT_DIMS, _))
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          max_viewport_dims, max_viewport_dims + arraysize(max_viewport_dims)))
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupInitCapabilitiesExpectations();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupInitStateExpectations();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, 0))
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0))
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER, 0))
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindRenderbufferEXT(GL_RENDERBUFFER, 0))
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // TODO(boliu): Remove OS_ANDROID once crbug.com/259023 is fixed and the
3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // workaround has been reverted.
3477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if !defined(OS_ANDROID)
348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_CALL(*gl_, Clear(
349b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))
350b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .Times(1)
351b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .RetiresOnSaturation();
3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
353b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  engine_.reset(new StrictMock<MockCommandBufferEngine>());
355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<gpu::Buffer> buffer =
356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      engine_->GetSharedMemoryBuffer(kSharedMemoryId);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_offset_ = kSharedMemoryOffset;
358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  shared_memory_address_ =
359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      reinterpret_cast<int8*>(buffer->memory()) + shared_memory_offset_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_id_ = kSharedMemoryId;
361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  shared_memory_base_ = buffer->memory();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  static const int32 kLoseContextWhenOutOfMemory = 0x10002;
364e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int32 attributes[] = {
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      EGL_ALPHA_SIZE,
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      normalized_init.request_alpha ? 8 : 0,
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      EGL_DEPTH_SIZE,
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      normalized_init.request_depth ? 24 : 0,
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      EGL_STENCIL_SIZE,
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      normalized_init.request_stencil ? 8 : 0,
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kLoseContextWhenOutOfMemory,
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      normalized_init.lose_context_when_out_of_memory ? 1 : 0, };
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32> attribs(attributes, attributes + arraysize(attributes));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_.reset(GLES2Decoder::Create(group_.get()));
377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  decoder_->SetIgnoreCachedStateForTest(ignore_cached_state_for_test_);
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  decoder_->GetLogger()->set_log_synthesized_gl_errors(false);
37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  decoder_->Initialize(surface_,
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       context_,
38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       false,
38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       surface_->GetSize(),
38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       DisallowedFeatures(),
38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       attribs);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->MakeCurrent();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->set_engine(engine_.get());
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  decoder_->BeginDecoding();
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(_, _))
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceBufferId))
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenBuffersImmediate>(client_buffer_id_);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenFramebuffersEXT(_, _))
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceFramebufferId))
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenFramebuffersImmediate>(client_framebuffer_id_);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenRenderbuffersEXT(_, _))
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceRenderbufferId))
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenRenderbuffersImmediate>(client_renderbuffer_id_);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenTextures(_, _))
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceTextureId))
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenTexturesImmediate>(client_texture_id_);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(_, _))
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceElementBufferId))
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenBuffersImmediate>(client_element_buffer_id_);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateProgram(client_program_id_, kServiceProgramId);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateShader(GL_VERTEX_SHADER, client_shader_id_, kServiceShaderId);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GLES2DecoderTestBase::ResetDecoder() {
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!decoder_.get())
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All Tests should have read all their GLErrors before getting here.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteBuffersARB(1, _))
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(2)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_CALL(*gl_, DeleteVertexArraysOES(1, Pointee(kServiceVertexArrayId)))
427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        .Times(1)
428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        .RetiresOnSaturation();
429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  decoder_->EndDecoding();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->Destroy(true);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_.reset();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  group_->Destroy(mock_decoder_.get(), false);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  engine_.reset();
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ::gfx::MockGLInterface::SetGLInterface(NULL);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_.reset();
438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::ClearGLBindings();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GLES2DecoderTestBase::TearDown() {
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ResetDecoder();
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::ExpectEnableDisable(GLenum cap, bool enable) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enable) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(cap))
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Disable(cap))
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLint GLES2DecoderTestBase::GetGLError() {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::GetError cmd;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(shared_memory_id_, shared_memory_offset_);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<GLint>(*GetSharedMemoryAs<GLenum*>());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoCreateShader(
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum shader_type, GLuint client_id, GLuint service_id) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CreateShader(shader_type))
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(service_id))
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::CreateShader cmd;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(shader_type, client_id);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsShader(GLuint client_id) {
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsShader, cmds::IsShader::Result>(client_id);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteShader(
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteShader(service_id))
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteShader cmd;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_id);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoCreateProgram(
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CreateProgram())
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(service_id))
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::CreateProgram cmd;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_id);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsProgram(GLuint client_id) {
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsProgram, cmds::IsProgram::Result>(client_id);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteProgram(
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint /* service_id */) {
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteProgram cmd;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_id);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetBucketAsCString(
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 bucket_id, const char* str) {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 size = str ? (strlen(str) + 1) : 0;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketSize cmd1;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd1.Init(bucket_id, size);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (str) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(shared_memory_address_, str, size);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketData cmd2;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd2.Init(bucket_id, 0, size, kSharedMemoryId, kSharedMemoryOffset);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearSharedMemory();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GLES2DecoderTestBase::SetupClearTextureExpectations(
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint service_id,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint old_service_id,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum bind_target,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLenum internal_format,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum format,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum type,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei height) {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(bind_target, service_id))
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, TexImage2D(
545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      target, level, internal_format, width, height, 0, format, type, _))
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(bind_target, old_service_id))
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearing(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint clear_bits,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_red,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_green,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_blue,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_alpha,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint restore_stencil,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_depth,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restore_scissor_test) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupExpectationsForFramebufferClearingMulti(
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clear_bits,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_red,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_green,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_blue,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_alpha,
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_stencil,
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_depth,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_scissor_test);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForRestoreClearState(
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_red,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_green,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_blue,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_alpha,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint restore_stencil,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_depth,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restore_scissor_test) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ClearColor(
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_red, restore_green, restore_blue, restore_alpha))
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ClearStencil(restore_stencil))
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ClearDepth(restore_depth))
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (restore_scissor_test) {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST))
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearingMulti(
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint read_framebuffer_service_id,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint draw_framebuffer_service_id,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint clear_bits,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_red,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_green,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_blue,
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_alpha,
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint restore_stencil,
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_depth,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restore_scissor_test) {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gman): Figure out why InSequence stopped working.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InSequence sequence;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(target))
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target == GL_READ_FRAMEBUFFER_EXT) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0))
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_DRAW_FRAMEBUFFER_EXT, read_framebuffer_service_id))
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((clear_bits & GL_COLOR_BUFFER_BIT) != 0) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ClearColor(0.0f, 0.0f, 0.0f, 0.0f))
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SetupExpectationsForColorMask(true, true, true, true);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((clear_bits & GL_STENCIL_BUFFER_BIT) != 0) {
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ClearStencil(0))
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, StencilMask(static_cast<GLuint>(-1)))
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((clear_bits & GL_DEPTH_BUFFER_BIT) != 0) {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ClearDepth(1.0f))
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SetupExpectationsForDepthMask(true);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(GL_SCISSOR_TEST, false);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Clear(clear_bits))
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupExpectationsForRestoreClearState(
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_red, restore_green, restore_blue, restore_alpha,
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_stencil, restore_depth, restore_scissor_test);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target == GL_READ_FRAMEBUFFER_EXT) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_READ_FRAMEBUFFER_EXT, read_framebuffer_service_id))
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_DRAW_FRAMEBUFFER_EXT, draw_framebuffer_service_id))
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GLES2DecoderTestBase::SetupShaderForUniform(GLenum uniform_type) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AttribInfo attribs[] = {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "foo", 1, GL_FLOAT, 1, },
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "goo", 1, GL_FLOAT, 2, },
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UniformInfo uniforms[] = {
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "bar", 1, uniform_type, 0, 2, -1, },
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "car", 4, uniform_type, 1, 1, -1, },
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientVertexShaderId = 5001;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceVertexShaderId = 6001;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientFragmentShaderId = 5002;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceFragmentShaderId = 6002;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              client_program_id_, kServiceProgramId,
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kClientVertexShaderId, kServiceVertexShaderId,
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kClientFragmentShaderId, kServiceFragmentShaderId);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::UseProgram cmd;
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_program_id_);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindBuffer(
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(target, service_id))
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindBuffer cmd;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsBuffer(GLuint client_id) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsBuffer, cmds::IsBuffer::Result>(client_id);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteBuffer(
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteBuffersARB(1, Pointee(service_id)))
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GenHelper<cmds::DeleteBuffersImmediate>(client_id);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForColorMask(bool red,
716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                         bool green,
717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                         bool blue,
718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                         bool alpha) {
719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (ignore_cached_state_for_test_ || cached_color_mask_red_ != red ||
720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_green_ != green || cached_color_mask_blue_ != blue ||
721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_alpha_ != alpha) {
722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_color_mask_red_ = red;
723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_color_mask_green_ = green;
724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_color_mask_blue_ = blue;
725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_color_mask_alpha_ = alpha;
726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, ColorMask(red, green, blue, alpha))
727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1)
728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForDepthMask(bool mask) {
733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (ignore_cached_state_for_test_ || cached_depth_mask_ != mask) {
734010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_depth_mask_ = mask;
735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, DepthMask(mask)).Times(1).RetiresOnSaturation();
736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
739116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GLES2DecoderTestBase::SetupExpectationsForStencilMask(GLuint front_mask,
740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                           GLuint back_mask) {
74146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (ignore_cached_state_for_test_ ||
74246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      cached_stencil_front_mask_ != front_mask) {
74346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    cached_stencil_front_mask_ = front_mask;
74446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, front_mask))
74546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        .Times(1)
74646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        .RetiresOnSaturation();
74746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
74846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
74946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (ignore_cached_state_for_test_ ||
75046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      cached_stencil_back_mask_ != back_mask) {
75146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    cached_stencil_back_mask_ = back_mask;
75246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, back_mask))
75346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        .Times(1)
75446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        .RetiresOnSaturation();
75546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
75646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
75746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForEnableDisable(GLenum cap,
759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             bool enable) {
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switch (cap) {
761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_BLEND:
762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_blend == enable &&
763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_blend = enable;
766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_CULL_FACE:
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_cull_face == enable &&
769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_cull_face = enable;
772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_DEPTH_TEST:
774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_depth_test == enable &&
775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_depth_test = enable;
778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_DITHER:
780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_dither == enable &&
781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_dither = enable;
784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_POLYGON_OFFSET_FILL:
786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_polygon_offset_fill == enable &&
787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_polygon_offset_fill = enable;
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_SAMPLE_ALPHA_TO_COVERAGE:
792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_sample_alpha_to_coverage == enable &&
793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_sample_alpha_to_coverage = enable;
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_SAMPLE_COVERAGE:
798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_sample_coverage == enable &&
799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_sample_coverage = enable;
802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_SCISSOR_TEST:
804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_scissor_test == enable &&
805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_scissor_test = enable;
808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_STENCIL_TEST:
810010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_stencil_test == enable &&
811010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_stencil_test = enable;
814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    default:
816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      NOTREACHED();
817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return;
818010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (enable) {
820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, Enable(cap)).Times(1).RetiresOnSaturation();
821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, Disable(cap)).Times(1).RetiresOnSaturation();
823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState(
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool framebuffer_is_rgb,
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool framebuffer_has_depth,
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool framebuffer_has_stencil,
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint color_bits,
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool depth_mask,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool depth_enabled,
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint front_stencil_mask,
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint back_stencil_mask,
835010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool stencil_enabled) {
836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool color_mask_red = (color_bits & 0x1000) != 0;
837010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool color_mask_green = (color_bits & 0x0100) != 0;
838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool color_mask_blue = (color_bits & 0x0010) != 0;
839010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool color_mask_alpha = (color_bits & 0x0001) && !framebuffer_is_rgb;
840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForColorMask(
842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      color_mask_red, color_mask_green, color_mask_blue, color_mask_alpha);
843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForDepthMask(depth_mask);
84446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetupExpectationsForStencilMask(front_stencil_mask, back_stencil_mask);
845010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(GL_DEPTH_TEST,
846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    framebuffer_has_depth && depth_enabled);
847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(GL_STENCIL_TEST,
848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    framebuffer_has_stencil && stencil_enabled);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForApplyingDefaultDirtyState() {
852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForApplyingDirtyState(false,   // Framebuffer is RGB
853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         false,   // Framebuffer has depth
854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         false,   // Framebuffer has stencil
855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         0x1111,  // color bits
856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         true,    // depth mask
857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         false,   // depth enabled
858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         0,       // front stencil mask
859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         0,       // back stencil mask
860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         false);  // stencil enabled
861010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GLES2DecoderTestBase::EnableFlags::EnableFlags()
864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : cached_blend(false),
865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_cull_face(false),
866010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_depth_test(false),
867010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_dither(true),
868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_polygon_offset_fill(false),
869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_sample_alpha_to_coverage(false),
870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_sample_coverage(false),
871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_scissor_test(false),
872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_stencil_test(false) {
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindFramebuffer(
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindFramebufferEXT(target, service_id))
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindFramebuffer cmd;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsFramebuffer(GLuint client_id) {
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsFramebuffer, cmds::IsFramebuffer::Result>(
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client_id);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteFramebuffer(
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id,
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool reset_draw, GLenum draw_target, GLuint draw_id,
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool reset_read, GLenum read_target, GLuint read_id) {
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reset_draw) {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(draw_target, draw_id))
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reset_read) {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(read_target, read_id))
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, Pointee(service_id)))
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GenHelper<cmds::DeleteFramebuffersImmediate>(client_id);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindRenderbuffer(
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
912116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_renderbuffer_id_ = service_id;
913116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_renderbuffer_valid_ = true;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindRenderbufferEXT(target, service_id))
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindRenderbuffer cmd;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
922116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GLES2DecoderTestBase::DoRenderbufferStorageMultisampleCHROMIUM(
923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    GLenum target,
924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    GLsizei samples,
925116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    GLenum internal_format,
926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    GLenum gl_format,
927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    GLsizei width,
928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    GLsizei height) {
929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*gl_, GetError())
930116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .WillOnce(Return(GL_NO_ERROR))
931116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .RetiresOnSaturation();
932116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*gl_,
933116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              RenderbufferStorageMultisampleEXT(
934116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  target, samples, gl_format, width, height))
935116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .Times(1)
936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .RetiresOnSaturation();
937116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(*gl_, GetError())
938116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .WillOnce(Return(GL_NO_ERROR))
939116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      .RetiresOnSaturation();
940116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cmds::RenderbufferStorageMultisampleCHROMIUM cmd;
941116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cmd.Init(target, samples, internal_format, width, height);
942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
943116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(GL_NO_ERROR, GetGLError());
944116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
945116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
946116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GLES2DecoderTestBase::RestoreRenderbufferBindings() {
947116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetDecoder()->RestoreRenderbufferBindings();
948116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_renderbuffer_valid_ = false;
949116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
950116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
951116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GLES2DecoderTestBase::EnsureRenderbufferBound(bool expect_bind) {
952116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_NE(expect_bind, service_renderbuffer_valid_);
953116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
954116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (expect_bind) {
955116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_renderbuffer_valid_ = true;
956116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(*gl_,
957116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                BindRenderbufferEXT(GL_RENDERBUFFER, service_renderbuffer_id_))
958116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .Times(1)
959116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .RetiresOnSaturation();
960116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
961116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(*gl_, BindRenderbufferEXT(_, _)).Times(0);
962116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
963116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsRenderbuffer(GLuint client_id) {
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsRenderbuffer, cmds::IsRenderbuffer::Result>(
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client_id);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteRenderbuffer(
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteRenderbuffersEXT(1, Pointee(service_id)))
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
975cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GenHelper<cmds::DeleteRenderbuffersImmediate>(client_id);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindTexture(
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(target, service_id))
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindTexture cmd;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsTexture(GLuint client_id) {
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsTexture, cmds::IsTexture::Result>(client_id);
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteTexture(
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(service_id)))
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
997cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GenHelper<cmds::DeleteTexturesImmediate>(client_id);
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoTexImage2D(
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint level, GLenum internal_format,
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum format, GLenum type,
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 shared_memory_id, uint32 shared_memory_offset) {
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, TexImage2D(target, level, internal_format,
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               width, height, border, format, type, _))
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::TexImage2D cmd;
1016cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(target, level, internal_format, width, height, format,
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type, shared_memory_id, shared_memory_offset);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GLES2DecoderTestBase::DoTexImage2DConvertInternalFormat(
10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target, GLint level, GLenum requested_internal_format,
10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum format, GLenum type,
10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    uint32 shared_memory_id, uint32 shared_memory_offset,
10265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum expected_internal_format) {
10275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
10295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .RetiresOnSaturation();
10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*gl_, TexImage2D(target, level, expected_internal_format,
10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               width, height, border, format, type, _))
10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .Times(1)
10335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .RetiresOnSaturation();
10345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
10365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .RetiresOnSaturation();
10375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cmds::TexImage2D cmd;
1038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(target, level, requested_internal_format, width, height,
10395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           format, type, shared_memory_id, shared_memory_offset);
10405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoCompressedTexImage2D(
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint level, GLenum format,
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei size, uint32 bucket_id) {
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CompressedTexImage2D(
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, level, format, width, height, border, size, _))
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket* bucket = decoder_->CreateBucket(bucket_id);
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket->SetSize(size);
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::CompressedTexImage2DBucket cmd;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(
1061cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      target, level, format, width, height,
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bucket_id);
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoRenderbufferStorage(
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLenum internal_format, GLenum actual_format,
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height,  GLenum error) {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, RenderbufferStorageEXT(
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, actual_format, width, height))
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::RenderbufferStorage cmd;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, internal_format, width, height);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoFramebufferTexture2D(
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLenum attachment, GLenum textarget,
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint texture_client_id, GLuint texture_service_id, GLint level,
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum error) {
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, FramebufferTexture2DEXT(
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, attachment, textarget, texture_service_id, level))
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::FramebufferTexture2D cmd;
1099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(target, attachment, textarget, texture_client_id);
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoFramebufferRenderbuffer(
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target,
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum attachment,
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum renderbuffer_target,
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint renderbuffer_client_id,
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint renderbuffer_service_id,
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum error) {
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, attachment, renderbuffer_target, renderbuffer_service_id))
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::FramebufferRenderbuffer cmd;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, attachment, renderbuffer_target, renderbuffer_client_id);
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoVertexAttribPointer(
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint index, GLint size, GLenum type, GLsizei stride, GLuint offset) {
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              VertexAttribPointer(index, size, type, GL_FALSE, stride,
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  BufferOffset(offset)))
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::VertexAttribPointer cmd;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(index, size, GL_FLOAT, GL_FALSE, stride, offset);
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoVertexAttribDivisorANGLE(
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint index, GLuint divisor) {
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              VertexAttribDivisorANGLE(index, divisor))
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::VertexAttribDivisorANGLE cmd;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(index, divisor);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForGenVertexArraysOES(){
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, GenVertexArraysOES(1, _))
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .WillOnce(SetArgumentPointee<1>(kServiceVertexArrayId))
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForDeleteVertexArraysOES(){
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, DeleteVertexArraysOES(1, _))
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid GLES2DecoderTestBase::AddExpectationsForDeleteBoundVertexArraysOES() {
11650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Expectations are the same as a delete, followed by binding VAO 0.
11660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  AddExpectationsForDeleteVertexArraysOES();
11670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  AddExpectationsForBindVertexArrayOES();
11680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
11690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForBindVertexArrayOES() {
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindVertexArrayOES(_))
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (uint32 vv = 0; vv < group_->max_vertex_attribs(); ++vv) {
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddExpectationsForRestoreAttribState(vv);
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindBuffer(GL_ELEMENT_ARRAY_BUFFER, _))
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForRestoreAttribState(GLuint attrib) {
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, _))
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, VertexAttribPointer(attrib, _, _, _, _, _))
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(attrib, _))
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(testing::AtMost(1))
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, _))
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attrib != 0 ||
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) {
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(bajones): Not sure if I can tell which of these will be called
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, EnableVertexAttribArray(attrib))
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(testing::AtMost(1))
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, DisableVertexAttribArray(attrib))
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(testing::AtMost(1))
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kBackBufferWidth;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kBackBufferHeight;
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxTextureSize;
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxCubeMapTextureSize;
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kNumVertexAttribs;
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kNumTextureUnits;
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxTextureImageUnits;
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxVertexTextureImageUnits;
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxFragmentUniformVectors;
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxVaryingVectors;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxVertexUniformVectors;
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxViewportWidth;
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxViewportHeight;
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportX;
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportY;
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportWidth;
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportHeight;
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceAttrib0BufferId;
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceFixedAttribBufferId;
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceBufferId;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceFramebufferId;
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceRenderbufferId;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceTextureId;
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceProgramId;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceShaderId;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceElementBufferId;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceQueryId;
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceVertexArrayId;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2DecoderTestBase::kSharedMemoryId;
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t GLES2DecoderTestBase::kSharedBufferSize;
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kSharedMemoryOffset;
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2DecoderTestBase::kInvalidSharedMemoryId;
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kInvalidSharedMemoryOffset;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kInitialResult;
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 GLES2DecoderTestBase::kInitialMemoryValue;
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kNewClientId;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kNewServiceId;
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kInvalidClientId;
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceVertexShaderId;
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceFragmentShaderId;
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumShaderId;
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumProgramId;
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumTextureBufferId;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumVertexBufferId;
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumFBOId;
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumPositionAttrib;
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumTexAttrib;
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumSamplerLocation;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLsizei GLES2DecoderTestBase::kNumVertices;
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLsizei GLES2DecoderTestBase::kNumIndices;
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kValidIndexRangeStart;
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kValidIndexRangeCount;
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kInvalidIndexRangeStart;
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kInvalidIndexRangeCount;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kOutOfRangeIndexRangeEnd;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kMaxValidIndex;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxAttribLength;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib1Size;
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib2Size;
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib3Size;
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib1Location;
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib2Location;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib3Location;
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kAttrib1Type;
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kAttrib2Type;
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kAttrib3Type;
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kInvalidAttribLocation;
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kBadAttribIndex;
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxUniformLength;
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1Size;
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2Size;
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3Size;
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1RealLocation;
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2RealLocation;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2ElementRealLocation;
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3RealLocation;
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1FakeLocation;
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2FakeLocation;
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2ElementFakeLocation;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3FakeLocation;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1DesiredLocation;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2DesiredLocation;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3DesiredLocation;
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniform1Type;
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniform2Type;
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniform3Type;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniformCubemapType;
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kInvalidUniformLocation;
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kBadUniformIndex;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kAttrib1Name = "attrib1";
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kAttrib2Name = "attrib2";
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kAttrib3Name = "attrib3";
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kUniform1Name = "uniform1";
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kUniform2Name = "uniform2[0]";
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kUniform3Name = "uniform3[0]";
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupDefaultProgram() {
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static AttribInfo attribs[] = {
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static UniformInfo uniforms[] = {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform1Name, kUniform1Size, kUniform1Type,
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1FakeLocation, kUniform1RealLocation,
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1DesiredLocation },
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform2Name, kUniform2Size, kUniform2Type,
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2FakeLocation, kUniform2RealLocation,
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2DesiredLocation },
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform3Name, kUniform3Size, kUniform3Type,
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3FakeLocation, kUniform3RealLocation,
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3DesiredLocation },
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_program_id_, kServiceProgramId,
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_vertex_shader_id_, kServiceVertexShaderId,
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_fragment_shader_id_, kServiceFragmentShaderId);
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::UseProgram cmd;
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd.Init(client_program_id_);
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupCubemapProgram() {
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static AttribInfo attribs[] = {
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static UniformInfo uniforms[] = {
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform1Name, kUniform1Size, kUniformCubemapType,
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1FakeLocation, kUniform1RealLocation,
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1DesiredLocation, },
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform2Name, kUniform2Size, kUniform2Type,
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2FakeLocation, kUniform2RealLocation,
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2DesiredLocation, },
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform3Name, kUniform3Size, kUniform3Type,
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3FakeLocation, kUniform3RealLocation,
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3DesiredLocation, },
1381558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    };
1382558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
1383558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                client_program_id_, kServiceProgramId,
1384558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                client_vertex_shader_id_, kServiceVertexShaderId,
1385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                client_fragment_shader_id_, kServiceFragmentShaderId);
1386558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
1387558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1388558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
1389558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
1390558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        .Times(1)
1391558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        .RetiresOnSaturation();
1392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    cmds::UseProgram cmd;
1393558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    cmd.Init(client_program_id_);
1394558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1395558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
1396558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
1397558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1398558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid GLES2DecoderTestBase::SetupSamplerExternalProgram() {
1399558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
1400558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    static AttribInfo attribs[] = {
1401558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
1402558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
1403558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
1404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    };
1405558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    static UniformInfo uniforms[] = {
1406558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kUniform1Name, kUniform1Size, kUniformSamplerExternalType,
1407558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform1FakeLocation, kUniform1RealLocation,
1408558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform1DesiredLocation, },
1409558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kUniform2Name, kUniform2Size, kUniform2Type,
1410558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform2FakeLocation, kUniform2RealLocation,
1411558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform2DesiredLocation, },
1412558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kUniform3Name, kUniform3Size, kUniform3Type,
1413558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform3FakeLocation, kUniform3RealLocation,
1414558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform3DesiredLocation, },
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_program_id_, kServiceProgramId,
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_vertex_shader_id_, kServiceVertexShaderId,
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_fragment_shader_id_, kServiceFragmentShaderId);
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::UseProgram cmd;
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd.Init(client_program_id_);
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderWithShaderTestBase::TearDown() {
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2DecoderTestBase::TearDown();
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupShader(
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLES2DecoderTestBase::AttribInfo* attribs, size_t num_attribs,
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLES2DecoderTestBase::UniformInfo* uniforms, size_t num_uniforms,
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint program_client_id, GLuint program_service_id,
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint vertex_shader_client_id, GLuint vertex_shader_service_id,
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint fragment_shader_client_id, GLuint fragment_shader_service_id) {
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InSequence s;
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AttachShader(program_service_id, vertex_shader_service_id))
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AttachShader(program_service_id, fragment_shader_service_id))
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestHelper::SetupShader(
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_.get(), attribs, num_attribs, uniforms, num_uniforms,
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        program_service_id);
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateShader(
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_VERTEX_SHADER, vertex_shader_client_id, vertex_shader_service_id);
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateShader(
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_FRAGMENT_SHADER, fragment_shader_client_id,
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fragment_shader_service_id);
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestHelper::SetShaderStates(
14651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gl_.get(), GetShader(vertex_shader_client_id), true);
14661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestHelper::SetShaderStates(
14671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gl_.get(), GetShader(fragment_shader_client_id), true);
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::AttachShader attach_cmd;
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attach_cmd.Init(program_client_id, vertex_shader_client_id);
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attach_cmd.Init(program_client_id, fragment_shader_client_id);
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::LinkProgram link_cmd;
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  link_cmd.Init(program_client_id);
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(link_cmd));
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderTestBase::DoEnableDisable(GLenum cap, bool enable) {
1483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(cap, enable);
1484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (enable) {
1485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmds::Enable cmd;
1486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd.Init(cap);
1487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
1489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmds::Disable cmd;
1490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd.Init(cap);
1491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoEnableVertexAttribArray(GLint index) {
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, EnableVertexAttribArray(index))
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::EnableVertexAttribArray cmd;
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(index);
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBufferData(GLenum target, GLsizei size) {
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BufferData(target, size, _, GL_STREAM_DRAW))
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BufferData cmd;
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, size, 0, 0, GL_STREAM_DRAW);
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBufferSubData(
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint offset, GLsizei size, const void* data) {
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BufferSubData(target, offset, size,
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  shared_memory_address_))
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, data, size);
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BufferSubData cmd;
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, offset, size, shared_memory_id_, shared_memory_offset_);
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupVertexBuffer() {
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(1);
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat f = 0;
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferData(GL_ARRAY_BUFFER, kNumVertices * 2 * sizeof(f));
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupAllNeededVertexBuffers() {
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferData(GL_ARRAY_BUFFER, kNumVertices * 16 * sizeof(float));
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(0);
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(1);
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(2);
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0);
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupIndexBuffer() {
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               client_element_buffer_id_,
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               kServiceElementBufferId);
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLshort indices[] = {100, 1, 2, 3, 4, 5, 6, 7, 100, 9};
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(indices) == kNumIndices, Indices_is_not_10);
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices));
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 2, indices);
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 2, sizeof(indices) - 2, &indices[1]);
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupTexture() {
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               kSharedMemoryId, kSharedMemoryOffset);
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DeleteVertexBuffer() {
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDeleteBuffer(client_buffer_id_, kServiceBufferId);
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DeleteIndexBuffer() {
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDeleteBuffer(client_element_buffer_id_, kServiceElementBufferId);
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0WithError(
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei num_vertices, GLuint buffer_id, GLenum error) {
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) {
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, kServiceAttrib0BufferId))
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER,
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               num_vertices * sizeof(GLfloat) * 4,
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _, GL_DYNAMIC_DRAW))
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BufferSubData(
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_ARRAY_BUFFER, 0, num_vertices * sizeof(GLfloat) * 4, _))
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, VertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL))
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, buffer_id))
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0(
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei num_vertices, GLuint buffer_id) {
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddExpectationsForSimulatedAttrib0WithError(
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_vertices, buffer_id, GL_NO_ERROR);
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void GLES2DecoderTestBase::SetupMockGLBehaviors() {
1613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ON_CALL(*gl_, BindVertexArrayOES(_))
1614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillByDefault(Invoke(
1615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          &gl_states_,
1616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          &GLES2DecoderTestBase::MockGLStates::OnBindVertexArrayOES));
1617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ON_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, _))
1618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillByDefault(WithArg<1>(Invoke(
1619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          &gl_states_,
1620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          &GLES2DecoderTestBase::MockGLStates::OnBindArrayBuffer)));
1621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ON_CALL(*gl_, VertexAttribPointer(_, _, _, _, _, NULL))
1622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillByDefault(InvokeWithoutArgs(
1623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          &gl_states_,
1624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          &GLES2DecoderTestBase::MockGLStates::OnVertexAttribNullPointer));
1625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockCommandBufferEngine() {
1629effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1630effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<base::SharedMemory> shm(new base::SharedMemory());
1631effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  shm->CreateAndMapAnonymous(kSharedBufferSize);
1632e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  valid_buffer_ = MakeBufferFromSharedMemory(shm.Pass(), kSharedBufferSize);
1633effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ClearSharedMemory();
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)~MockCommandBufferEngine() {}
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1640effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_refptr<gpu::Buffer>
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetSharedMemoryBuffer(
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 shm_id) {
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_;
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::set_token(
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 token) {
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetBuffer(
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 /* transfer_buffer_id */) {
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetOffset(
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int32 offset) {
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetGetOffset() {
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderWithShaderTestBase::SetUp() {
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2DecoderTestBase::SetUp();
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupDefaultProgram();
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Include the auto-generated part of this file. We split this because it means
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we can easily edit the non-auto generated parts right here in this file
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instead of having to edit some template or the code generator.
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h"
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
1680