gles2_cmd_decoder_unittest_base.cc revision 010d83a9304c5a91596085d917d248abff47903a
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"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/program_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/service/vertex_attrib_manager.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gl/gl_surface.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::gfx::MockGLInterface;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::MatcherCast;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Pointee;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArrayArgument;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgumentPointee;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrEq;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderTestBase::GLES2DecoderTestBase()
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : surface_(NULL),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_(NULL),
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      memory_tracker_(NULL),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_buffer_id_(100),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_framebuffer_id_(101),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_program_id_(102),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_renderbuffer_id_(103),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_shader_id_(104),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_texture_id_(106),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_element_buffer_id_(107),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_vertex_shader_id_(121),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_fragment_shader_id_(122),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_query_id_(123),
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      client_vertexarray_id_(124),
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ignore_cached_state_for_test_(GetParam()),
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_red_(true),
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_green_(true),
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_blue_(true),
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_alpha_(true),
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_depth_mask_(true),
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_stencil_front_mask_(0xFFFFFFFFU),
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_stencil_back_mask_(0xFFFFFFFFU) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(immediate_buffer_, 0xEE, sizeof(immediate_buffer_));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderTestBase::~GLES2DecoderTestBase() {}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetUp() {
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitState init;
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.gl_version = "3.0";
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.has_alpha = true;
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.has_depth = true;
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.request_alpha = true;
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.request_depth = true;
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  init.bind_generates_resource = true;
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoder(init);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForVertexAttribManager() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (GLint ii = 0; ii < kNumVertexAttribs; ++ii) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, VertexAttrib4f(ii, 0.0f, 0.0f, 0.0f, 1.0f))
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochGLES2DecoderTestBase::InitState::InitState()
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : has_alpha(false),
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      has_depth(false),
92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      has_stencil(false),
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      request_alpha(false),
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      request_depth(false),
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      request_stencil(false),
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      bind_generates_resource(false),
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      lose_context_when_out_of_memory(false) {
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid GLES2DecoderTestBase::InitDecoder(const InitState& init) {
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InitDecoderWithCommandLine(init, NULL);
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void GLES2DecoderTestBase::InitDecoderWithCommandLine(
105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const InitState& init,
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const base::CommandLine* command_line) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Framebuffer::ClearFramebufferCompleteComboMap();
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::SetGLGetProcAddressProc(gfx::MockGLInterface::GetGLProcAddress);
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::GLSurface::InitializeOneOffWithMockBindingsForTests();
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_.reset(new StrictMock<MockGLInterface>());
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ::gfx::MockGLInterface::SetGLInterface(gl_.get());
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Only create stream texture manager if extension is requested.
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string> list;
117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  base::SplitString(init.extensions, ' ', &list);
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info;
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (command_line)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    feature_info = new FeatureInfo(*command_line);
121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  group_ = scoped_refptr<ContextGroup>(
122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      new ContextGroup(NULL,
123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       NULL,
124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       memory_tracker_,
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       new ShaderTranslatorCache,
126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       feature_info.get(),
127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       init.bind_generates_resource));
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool use_default_textures = init.bind_generates_resource;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence sequence;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  surface_ = new gfx::GLSurfaceStub;
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  surface_->SetSize(gfx::Size(kBackBufferWidth, kBackBufferHeight));
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Context needs to be created before initializing ContextGroup, which will
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in turn initialize FeatureInfo, which needs a context to determine
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // extension support.
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context_ = new gfx::GLContextStubWithExtensions;
139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  context_->AddExtensionsString(init.extensions.c_str());
140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  context_->SetGLVersionString(init.gl_version.c_str());
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context_->MakeCurrent(surface_.get());
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::GLSurface::InitializeDynamicMockBindingsForTests(context_);
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupContextGroupInitExpectations(gl_.get(),
146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                                DisallowedFeatures(),
147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                                init.extensions.c_str(),
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                init.gl_version.c_str(),
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                init.bind_generates_resource);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We initialize the ContextGroup with a MockGLES2Decoder so that
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we can use the ContextGroup to figure out how the real GLES2Decoder
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will initialize itself.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mock_decoder_.reset(new MockGLES2Decoder());
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      group_->Initialize(mock_decoder_.get(), DisallowedFeatures()));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (group_->feature_info()->workarounds().init_vertex_attributes)
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AddExpectationsForVertexAttribManager();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddExpectationsForBindVertexArrayOES();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, EnableVertexAttribArray(0))
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint attrib_0_id[] = {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceAttrib0BufferId,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint fixed_attrib_buffer_id[] = {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceFixedAttribBufferId,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(arraysize(attrib_0_id), _))
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(attrib_0_id,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    attrib_0_id + arraysize(attrib_0_id)))
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, kServiceAttrib0BufferId))
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, VertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, NULL))
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, 0))
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(arraysize(fixed_attrib_buffer_id), _))
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fixed_attrib_buffer_id,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fixed_attrib_buffer_id + arraysize(fixed_attrib_buffer_id)))
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (GLint tt = 0; tt < TestHelper::kNumTextureUnits; ++tt) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0 + tt))
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (group_->feature_info()->feature_flags().oes_egl_image_external) {
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EXPECT_CALL(*gl_,
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                  BindTexture(GL_TEXTURE_EXTERNAL_OES,
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              use_default_textures
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  ? TestHelper::kServiceDefaultExternalTextureId
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  : 0))
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (group_->feature_info()->feature_flags().arb_texture_rectangle) {
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EXPECT_CALL(
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          *gl_,
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          BindTexture(GL_TEXTURE_RECTANGLE_ARB,
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                      use_default_textures
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          ? TestHelper::kServiceDefaultRectangleTextureId
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          : 0))
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_CALL(*gl_,
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                BindTexture(GL_TEXTURE_CUBE_MAP,
216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            use_default_textures
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                ? TestHelper::kServiceDefaultTextureCubemapId
218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                : 0))
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_CALL(
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        *gl_,
223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        BindTexture(
224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            GL_TEXTURE_2D,
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            use_default_textures ? TestHelper::kServiceDefaultTexture2dId : 0))
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER, 0))
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .Times(1)
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .RetiresOnSaturation();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _))
237e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      .WillOnce(SetArgumentPointee<1>(init.has_alpha ? 8 : 0))
238e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      .RetiresOnSaturation();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
240e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      .WillOnce(SetArgumentPointee<1>(init.has_depth ? 24 : 0))
241e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      .RetiresOnSaturation();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
243e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      .WillOnce(SetArgumentPointee<1>(init.has_stencil ? 8 : 0))
244e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      .RetiresOnSaturation();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Enable(GL_VERTEX_PROGRAM_POINT_SIZE))
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Enable(GL_POINT_SPRITE))
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLint max_viewport_dims[] = {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMaxViewportWidth,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMaxViewportHeight
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_MAX_VIEWPORT_DIMS, _))
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          max_viewport_dims, max_viewport_dims + arraysize(max_viewport_dims)))
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupInitCapabilitiesExpectations();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupInitStateExpectations();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, 0))
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0))
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER, 0))
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindRenderbufferEXT(GL_RENDERBUFFER, 0))
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // TODO(boliu): Remove OS_ANDROID once crbug.com/259023 is fixed and the
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // workaround has been reverted.
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if !defined(OS_ANDROID)
286b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_CALL(*gl_, Clear(
287b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))
288b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .Times(1)
289b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      .RetiresOnSaturation();
2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif
291b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  engine_.reset(new StrictMock<MockCommandBufferEngine>());
293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<gpu::Buffer> buffer =
294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      engine_->GetSharedMemoryBuffer(kSharedMemoryId);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_offset_ = kSharedMemoryOffset;
296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  shared_memory_address_ =
297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      reinterpret_cast<int8*>(buffer->memory()) + shared_memory_offset_;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_id_ = kSharedMemoryId;
299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  shared_memory_base_ = buffer->memory();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
301e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  static const int32 kLoseContextWhenOutOfMemory = 0x10003;
302e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
303e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  int32 attributes[] = {EGL_ALPHA_SIZE,
304e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        init.request_alpha ? 8 : 0,
305e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        EGL_DEPTH_SIZE,
306e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        init.request_depth ? 24 : 0,
307e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        EGL_STENCIL_SIZE,
308e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        init.request_stencil ? 8 : 0,
309e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        kLoseContextWhenOutOfMemory,
310e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        init.lose_context_when_out_of_memory ? 1 : 0, };
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32> attribs(attributes, attributes + arraysize(attributes));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_.reset(GLES2Decoder::Create(group_.get()));
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  decoder_->SetIgnoreCachedStateForTest(ignore_cached_state_for_test_);
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  decoder_->GetLogger()->set_log_synthesized_gl_errors(false);
31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  decoder_->Initialize(surface_,
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       context_,
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       false,
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       surface_->GetSize(),
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       DisallowedFeatures(),
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       attribs);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->MakeCurrent();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->set_engine(engine_.get());
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  decoder_->BeginDecoding();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(_, _))
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceBufferId))
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenBuffersImmediate>(client_buffer_id_);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenFramebuffersEXT(_, _))
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceFramebufferId))
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenFramebuffersImmediate>(client_framebuffer_id_);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenRenderbuffersEXT(_, _))
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceRenderbufferId))
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenRenderbuffersImmediate>(client_renderbuffer_id_);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenTextures(_, _))
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceTextureId))
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenTexturesImmediate>(client_texture_id_);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(_, _))
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceElementBufferId))
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenBuffersImmediate>(client_element_buffer_id_);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateProgram(client_program_id_, kServiceProgramId);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateShader(GL_VERTEX_SHADER, client_shader_id_, kServiceShaderId);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GLES2DecoderTestBase::ResetDecoder() {
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!decoder_.get())
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All Tests should have read all their GLErrors before getting here.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteBuffersARB(1, _))
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(2)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  decoder_->EndDecoding();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->Destroy(true);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_.reset();
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  group_->Destroy(mock_decoder_.get(), false);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  engine_.reset();
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ::gfx::MockGLInterface::SetGLInterface(NULL);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_.reset();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GLES2DecoderTestBase::TearDown() {
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ResetDecoder();
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::ExpectEnableDisable(GLenum cap, bool enable) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enable) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(cap))
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Disable(cap))
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLint GLES2DecoderTestBase::GetGLError() {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::GetError cmd;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(shared_memory_id_, shared_memory_offset_);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<GLint>(*GetSharedMemoryAs<GLenum*>());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoCreateShader(
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum shader_type, GLuint client_id, GLuint service_id) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CreateShader(shader_type))
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(service_id))
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::CreateShader cmd;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(shader_type, client_id);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsShader(GLuint client_id) {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsShader, cmds::IsShader::Result>(client_id);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteShader(
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteShader(service_id))
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteShader cmd;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_id);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoCreateProgram(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CreateProgram())
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(service_id))
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::CreateProgram cmd;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_id);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsProgram(GLuint client_id) {
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsProgram, cmds::IsProgram::Result>(client_id);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteProgram(
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint /* service_id */) {
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteProgram cmd;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_id);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetBucketAsCString(
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 bucket_id, const char* str) {
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 size = str ? (strlen(str) + 1) : 0;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketSize cmd1;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd1.Init(bucket_id, size);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (str) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(shared_memory_address_, str, size);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketData cmd2;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd2.Init(bucket_id, 0, size, kSharedMemoryId, kSharedMemoryOffset);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearSharedMemory();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GLES2DecoderTestBase::SetupClearTextureExpectations(
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint service_id,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint old_service_id,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum bind_target,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLenum internal_format,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum format,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum type,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei height) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(bind_target, service_id))
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, TexImage2D(
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      target, level, internal_format, width, height, 0, format, type, _))
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(bind_target, old_service_id))
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearing(
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint clear_bits,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_red,
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_green,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_blue,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_alpha,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint restore_stencil,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_depth,
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restore_scissor_test) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupExpectationsForFramebufferClearingMulti(
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clear_bits,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_red,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_green,
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_blue,
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_alpha,
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_stencil,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_depth,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_scissor_test);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForRestoreClearState(
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_red,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_green,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_blue,
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_alpha,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint restore_stencil,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_depth,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restore_scissor_test) {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ClearColor(
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_red, restore_green, restore_blue, restore_alpha))
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ClearStencil(restore_stencil))
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ClearDepth(restore_depth))
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (restore_scissor_test) {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST))
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearingMulti(
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint read_framebuffer_service_id,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint draw_framebuffer_service_id,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint clear_bits,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_red,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_green,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_blue,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_alpha,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint restore_stencil,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_depth,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restore_scissor_test) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gman): Figure out why InSequence stopped working.
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InSequence sequence;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(target))
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target == GL_READ_FRAMEBUFFER_EXT) {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0))
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_DRAW_FRAMEBUFFER_EXT, read_framebuffer_service_id))
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((clear_bits & GL_COLOR_BUFFER_BIT) != 0) {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ClearColor(0.0f, 0.0f, 0.0f, 0.0f))
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SetupExpectationsForColorMask(true, true, true, true);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((clear_bits & GL_STENCIL_BUFFER_BIT) != 0) {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ClearStencil(0))
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, StencilMask(static_cast<GLuint>(-1)))
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((clear_bits & GL_DEPTH_BUFFER_BIT) != 0) {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ClearDepth(1.0f))
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SetupExpectationsForDepthMask(true);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(GL_SCISSOR_TEST, false);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Clear(clear_bits))
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupExpectationsForRestoreClearState(
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_red, restore_green, restore_blue, restore_alpha,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_stencil, restore_depth, restore_scissor_test);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target == GL_READ_FRAMEBUFFER_EXT) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_READ_FRAMEBUFFER_EXT, read_framebuffer_service_id))
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_DRAW_FRAMEBUFFER_EXT, draw_framebuffer_service_id))
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GLES2DecoderTestBase::SetupShaderForUniform(GLenum uniform_type) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AttribInfo attribs[] = {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "foo", 1, GL_FLOAT, 1, },
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "goo", 1, GL_FLOAT, 2, },
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UniformInfo uniforms[] = {
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "bar", 1, uniform_type, 0, 2, -1, },
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "car", 4, uniform_type, 1, 1, -1, },
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientVertexShaderId = 5001;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceVertexShaderId = 6001;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientFragmentShaderId = 5002;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceFragmentShaderId = 6002;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              client_program_id_, kServiceProgramId,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kClientVertexShaderId, kServiceVertexShaderId,
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kClientFragmentShaderId, kServiceFragmentShaderId);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::UseProgram cmd;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_program_id_);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindBuffer(
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(target, service_id))
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindBuffer cmd;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsBuffer(GLuint client_id) {
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsBuffer, cmds::IsBuffer::Result>(client_id);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteBuffer(
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteBuffersARB(1, Pointee(service_id)))
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteBuffers cmd;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, shared_memory_id_, shared_memory_offset_);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, &client_id, sizeof(client_id));
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForColorMask(bool red,
650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                         bool green,
651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                         bool blue,
652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                         bool alpha) {
653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (ignore_cached_state_for_test_ || cached_color_mask_red_ != red ||
654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_green_ != green || cached_color_mask_blue_ != blue ||
655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_color_mask_alpha_ != alpha) {
656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_color_mask_red_ = red;
657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_color_mask_green_ = green;
658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_color_mask_blue_ = blue;
659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_color_mask_alpha_ = alpha;
660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, ColorMask(red, green, blue, alpha))
661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1)
662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForDepthMask(bool mask) {
667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (ignore_cached_state_for_test_ || cached_depth_mask_ != mask) {
668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_depth_mask_ = mask;
669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, DepthMask(mask)).Times(1).RetiresOnSaturation();
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForEnableDisable(GLenum cap,
674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                             bool enable) {
675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switch (cap) {
676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_BLEND:
677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_blend == enable &&
678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_blend = enable;
681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_CULL_FACE:
683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_cull_face == enable &&
684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_cull_face = enable;
687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_DEPTH_TEST:
689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_depth_test == enable &&
690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_depth_test = enable;
693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_DITHER:
695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_dither == enable &&
696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_dither = enable;
699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_POLYGON_OFFSET_FILL:
701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_polygon_offset_fill == enable &&
702010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
703010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_polygon_offset_fill = enable;
705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_SAMPLE_ALPHA_TO_COVERAGE:
707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_sample_alpha_to_coverage == enable &&
708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_sample_alpha_to_coverage = enable;
711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_SAMPLE_COVERAGE:
713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_sample_coverage == enable &&
714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_sample_coverage = enable;
717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_SCISSOR_TEST:
719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_scissor_test == enable &&
720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_scissor_test = enable;
723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case GL_STENCIL_TEST:
725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (enable_flags_.cached_stencil_test == enable &&
726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          !ignore_cached_state_for_test_)
727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      enable_flags_.cached_stencil_test = enable;
729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    default:
731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      NOTREACHED();
732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return;
733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
734010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (enable) {
735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, Enable(cap)).Times(1).RetiresOnSaturation();
736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, Disable(cap)).Times(1).RetiresOnSaturation();
738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState(
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool framebuffer_is_rgb,
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool framebuffer_has_depth,
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool framebuffer_has_stencil,
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint color_bits,
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool depth_mask,
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool depth_enabled,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint front_stencil_mask,
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint back_stencil_mask,
750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool stencil_enabled) {
751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool color_mask_red = (color_bits & 0x1000) != 0;
752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool color_mask_green = (color_bits & 0x0100) != 0;
753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool color_mask_blue = (color_bits & 0x0010) != 0;
754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool color_mask_alpha = (color_bits & 0x0001) && !framebuffer_is_rgb;
755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForColorMask(
757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      color_mask_red, color_mask_green, color_mask_blue, color_mask_alpha);
758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForDepthMask(depth_mask);
759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (ignore_cached_state_for_test_ ||
761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_stencil_front_mask_ != front_stencil_mask) {
762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_stencil_front_mask_ = front_stencil_mask;
763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, front_stencil_mask))
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (ignore_cached_state_for_test_ ||
769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_stencil_back_mask_ != back_stencil_mask) {
770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cached_stencil_back_mask_ = back_stencil_mask;
771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, back_stencil_mask))
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(GL_DEPTH_TEST,
777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    framebuffer_has_depth && depth_enabled);
778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(GL_STENCIL_TEST,
779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    framebuffer_has_stencil && stencil_enabled);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForApplyingDefaultDirtyState() {
783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForApplyingDirtyState(false,   // Framebuffer is RGB
784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         false,   // Framebuffer has depth
785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         false,   // Framebuffer has stencil
786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         0x1111,  // color bits
787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         true,    // depth mask
788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         false,   // depth enabled
789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         0,       // front stencil mask
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         0,       // back stencil mask
791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         false);  // stencil enabled
792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GLES2DecoderTestBase::EnableFlags::EnableFlags()
795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : cached_blend(false),
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_cull_face(false),
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_depth_test(false),
798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_dither(true),
799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_polygon_offset_fill(false),
800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_sample_alpha_to_coverage(false),
801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_sample_coverage(false),
802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_scissor_test(false),
803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cached_stencil_test(false) {
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindFramebuffer(
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindFramebufferEXT(target, service_id))
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindFramebuffer cmd;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsFramebuffer(GLuint client_id) {
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsFramebuffer, cmds::IsFramebuffer::Result>(
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client_id);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteFramebuffer(
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id,
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool reset_draw, GLenum draw_target, GLuint draw_id,
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool reset_read, GLenum read_target, GLuint read_id) {
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reset_draw) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(draw_target, draw_id))
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reset_read) {
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(read_target, read_id))
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, Pointee(service_id)))
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteFramebuffers cmd;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, shared_memory_id_, shared_memory_offset_);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, &client_id, sizeof(client_id));
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindRenderbuffer(
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindRenderbufferEXT(target, service_id))
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindRenderbuffer cmd;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsRenderbuffer(GLuint client_id) {
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsRenderbuffer, cmds::IsRenderbuffer::Result>(
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client_id);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteRenderbuffer(
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteRenderbuffersEXT(1, Pointee(service_id)))
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteRenderbuffers cmd;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, shared_memory_id_, shared_memory_offset_);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, &client_id, sizeof(client_id));
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindTexture(
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(target, service_id))
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindTexture cmd;
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsTexture(GLuint client_id) {
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsTexture, cmds::IsTexture::Result>(client_id);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteTexture(
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(service_id)))
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteTextures cmd;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, shared_memory_id_, shared_memory_offset_);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, &client_id, sizeof(client_id));
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoTexImage2D(
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint level, GLenum internal_format,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum format, GLenum type,
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 shared_memory_id, uint32 shared_memory_offset) {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, TexImage2D(target, level, internal_format,
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               width, height, border, format, type, _))
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::TexImage2D cmd;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, level, internal_format, width, height, border, format,
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type, shared_memory_id, shared_memory_offset);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GLES2DecoderTestBase::DoTexImage2DConvertInternalFormat(
9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum target, GLint level, GLenum requested_internal_format,
9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum format, GLenum type,
9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    uint32 shared_memory_id, uint32 shared_memory_offset,
9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum expected_internal_format) {
9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .RetiresOnSaturation();
9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*gl_, TexImage2D(target, level, expected_internal_format,
9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               width, height, border, format, type, _))
9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .Times(1)
9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .RetiresOnSaturation();
9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      .RetiresOnSaturation();
9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cmds::TexImage2D cmd;
9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cmd.Init(target, level, requested_internal_format, width, height, border,
9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           format, type, shared_memory_id, shared_memory_offset);
9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoCompressedTexImage2D(
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint level, GLenum format,
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei size, uint32 bucket_id) {
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CompressedTexImage2D(
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, level, format, width, height, border, size, _))
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket* bucket = decoder_->CreateBucket(bucket_id);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket->SetSize(size);
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::CompressedTexImage2DBucket cmd;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, level, format, width, height, border,
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bucket_id);
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoRenderbufferStorage(
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLenum internal_format, GLenum actual_format,
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height,  GLenum error) {
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, RenderbufferStorageEXT(
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, actual_format, width, height))
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::RenderbufferStorage cmd;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, internal_format, width, height);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoFramebufferTexture2D(
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLenum attachment, GLenum textarget,
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint texture_client_id, GLuint texture_service_id, GLint level,
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum error) {
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, FramebufferTexture2DEXT(
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, attachment, textarget, texture_service_id, level))
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::FramebufferTexture2D cmd;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, attachment, textarget, texture_client_id, level);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoFramebufferRenderbuffer(
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target,
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum attachment,
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum renderbuffer_target,
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint renderbuffer_client_id,
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint renderbuffer_service_id,
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum error) {
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_, FramebufferRenderbufferEXT(
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, attachment, renderbuffer_target, renderbuffer_service_id))
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::FramebufferRenderbuffer cmd;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, attachment, renderbuffer_target, renderbuffer_client_id);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoVertexAttribPointer(
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint index, GLint size, GLenum type, GLsizei stride, GLuint offset) {
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              VertexAttribPointer(index, size, type, GL_FALSE, stride,
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  BufferOffset(offset)))
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::VertexAttribPointer cmd;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(index, size, GL_FLOAT, GL_FALSE, stride, offset);
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoVertexAttribDivisorANGLE(
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint index, GLuint divisor) {
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              VertexAttribDivisorANGLE(index, divisor))
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::VertexAttribDivisorANGLE cmd;
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(index, divisor);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForGenVertexArraysOES(){
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, GenVertexArraysOES(1, _))
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .WillOnce(SetArgumentPointee<1>(kServiceVertexArrayId))
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForDeleteVertexArraysOES(){
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, DeleteVertexArraysOES(1, _))
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid GLES2DecoderTestBase::AddExpectationsForDeleteBoundVertexArraysOES() {
10600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Expectations are the same as a delete, followed by binding VAO 0.
10610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  AddExpectationsForDeleteVertexArraysOES();
10620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  AddExpectationsForBindVertexArrayOES();
10630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
10640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForBindVertexArrayOES() {
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindVertexArrayOES(_))
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (uint32 vv = 0; vv < group_->max_vertex_attribs(); ++vv) {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddExpectationsForRestoreAttribState(vv);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindBuffer(GL_ELEMENT_ARRAY_BUFFER, _))
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForRestoreAttribState(GLuint attrib) {
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, _))
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, VertexAttribPointer(attrib, _, _, _, _, _))
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(attrib, _))
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(testing::AtMost(1))
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, _))
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attrib != 0 ||
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) {
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(bajones): Not sure if I can tell which of these will be called
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, EnableVertexAttribArray(attrib))
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(testing::AtMost(1))
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, DisableVertexAttribArray(attrib))
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(testing::AtMost(1))
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kBackBufferWidth;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kBackBufferHeight;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxTextureSize;
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxCubeMapTextureSize;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kNumVertexAttribs;
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kNumTextureUnits;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxTextureImageUnits;
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxVertexTextureImageUnits;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxFragmentUniformVectors;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxVaryingVectors;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxVertexUniformVectors;
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxViewportWidth;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxViewportHeight;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportX;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportY;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportWidth;
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportHeight;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceAttrib0BufferId;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceFixedAttribBufferId;
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceBufferId;
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceFramebufferId;
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceRenderbufferId;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceTextureId;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceProgramId;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceShaderId;
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceElementBufferId;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceQueryId;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceVertexArrayId;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2DecoderTestBase::kSharedMemoryId;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t GLES2DecoderTestBase::kSharedBufferSize;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kSharedMemoryOffset;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2DecoderTestBase::kInvalidSharedMemoryId;
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kInvalidSharedMemoryOffset;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kInitialResult;
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 GLES2DecoderTestBase::kInitialMemoryValue;
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kNewClientId;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kNewServiceId;
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kInvalidClientId;
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceVertexShaderId;
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceFragmentShaderId;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumShaderId;
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumProgramId;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumTextureBufferId;
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumVertexBufferId;
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumFBOId;
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumPositionAttrib;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumTexAttrib;
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumSamplerLocation;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLsizei GLES2DecoderTestBase::kNumVertices;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLsizei GLES2DecoderTestBase::kNumIndices;
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kValidIndexRangeStart;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kValidIndexRangeCount;
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kInvalidIndexRangeStart;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kInvalidIndexRangeCount;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kOutOfRangeIndexRangeEnd;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kMaxValidIndex;
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxAttribLength;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib1Size;
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib2Size;
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib3Size;
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib1Location;
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib2Location;
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib3Location;
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kAttrib1Type;
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kAttrib2Type;
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kAttrib3Type;
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kInvalidAttribLocation;
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kBadAttribIndex;
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxUniformLength;
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1Size;
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2Size;
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3Size;
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1RealLocation;
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2RealLocation;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2ElementRealLocation;
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3RealLocation;
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1FakeLocation;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2FakeLocation;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2ElementFakeLocation;
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3FakeLocation;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1DesiredLocation;
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2DesiredLocation;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3DesiredLocation;
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniform1Type;
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniform2Type;
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniform3Type;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniformCubemapType;
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kInvalidUniformLocation;
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kBadUniformIndex;
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kAttrib1Name = "attrib1";
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kAttrib2Name = "attrib2";
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kAttrib3Name = "attrib3";
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kUniform1Name = "uniform1";
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kUniform2Name = "uniform2[0]";
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kUniform3Name = "uniform3[0]";
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupDefaultProgram() {
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static AttribInfo attribs[] = {
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static UniformInfo uniforms[] = {
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform1Name, kUniform1Size, kUniform1Type,
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1FakeLocation, kUniform1RealLocation,
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1DesiredLocation },
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform2Name, kUniform2Size, kUniform2Type,
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2FakeLocation, kUniform2RealLocation,
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2DesiredLocation },
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform3Name, kUniform3Size, kUniform3Type,
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3FakeLocation, kUniform3RealLocation,
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3DesiredLocation },
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_program_id_, kServiceProgramId,
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_vertex_shader_id_, kServiceVertexShaderId,
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_fragment_shader_id_, kServiceFragmentShaderId);
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::UseProgram cmd;
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd.Init(client_program_id_);
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupCubemapProgram() {
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static AttribInfo attribs[] = {
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static UniformInfo uniforms[] = {
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform1Name, kUniform1Size, kUniformCubemapType,
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1FakeLocation, kUniform1RealLocation,
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1DesiredLocation, },
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform2Name, kUniform2Size, kUniform2Type,
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2FakeLocation, kUniform2RealLocation,
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2DesiredLocation, },
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform3Name, kUniform3Size, kUniform3Type,
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3FakeLocation, kUniform3RealLocation,
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3DesiredLocation, },
1276558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    };
1277558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
1278558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                client_program_id_, kServiceProgramId,
1279558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                client_vertex_shader_id_, kServiceVertexShaderId,
1280558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                client_fragment_shader_id_, kServiceFragmentShaderId);
1281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
1282558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1283558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
1284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
1285558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        .Times(1)
1286558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        .RetiresOnSaturation();
1287558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    cmds::UseProgram cmd;
1288558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    cmd.Init(client_program_id_);
1289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1290558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
1291558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
1292558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1293558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid GLES2DecoderTestBase::SetupSamplerExternalProgram() {
1294558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  {
1295558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    static AttribInfo attribs[] = {
1296558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
1297558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
1298558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
1299558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    };
1300558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    static UniformInfo uniforms[] = {
1301558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kUniform1Name, kUniform1Size, kUniformSamplerExternalType,
1302558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform1FakeLocation, kUniform1RealLocation,
1303558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform1DesiredLocation, },
1304558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kUniform2Name, kUniform2Size, kUniform2Type,
1305558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform2FakeLocation, kUniform2RealLocation,
1306558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform2DesiredLocation, },
1307558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      { kUniform3Name, kUniform3Size, kUniform3Type,
1308558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform3FakeLocation, kUniform3RealLocation,
1309558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kUniform3DesiredLocation, },
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_program_id_, kServiceProgramId,
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_vertex_shader_id_, kServiceVertexShaderId,
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_fragment_shader_id_, kServiceFragmentShaderId);
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::UseProgram cmd;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd.Init(client_program_id_);
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderWithShaderTestBase::TearDown() {
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2DecoderTestBase::TearDown();
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupShader(
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLES2DecoderTestBase::AttribInfo* attribs, size_t num_attribs,
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLES2DecoderTestBase::UniformInfo* uniforms, size_t num_uniforms,
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint program_client_id, GLuint program_service_id,
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint vertex_shader_client_id, GLuint vertex_shader_service_id,
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint fragment_shader_client_id, GLuint fragment_shader_service_id) {
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InSequence s;
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AttachShader(program_service_id, vertex_shader_service_id))
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AttachShader(program_service_id, fragment_shader_service_id))
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestHelper::SetupShader(
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_.get(), attribs, num_attribs, uniforms, num_uniforms,
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        program_service_id);
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateShader(
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_VERTEX_SHADER, vertex_shader_client_id, vertex_shader_service_id);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateShader(
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_FRAGMENT_SHADER, fragment_shader_client_id,
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fragment_shader_service_id);
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShader(vertex_shader_client_id)->SetStatus(true, "", NULL);
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShader(fragment_shader_client_id)->SetStatus(true, "", NULL);
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::AttachShader attach_cmd;
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attach_cmd.Init(program_client_id, vertex_shader_client_id);
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attach_cmd.Init(program_client_id, fragment_shader_client_id);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::LinkProgram link_cmd;
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  link_cmd.Init(program_client_id);
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(link_cmd));
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderTestBase::DoEnableDisable(GLenum cap, bool enable) {
1376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(cap, enable);
1377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (enable) {
1378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmds::Enable cmd;
1379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd.Init(cap);
1380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
1382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmds::Disable cmd;
1383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd.Init(cap);
1384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoEnableVertexAttribArray(GLint index) {
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, EnableVertexAttribArray(index))
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::EnableVertexAttribArray cmd;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(index);
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBufferData(GLenum target, GLsizei size) {
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BufferData(target, size, _, GL_STREAM_DRAW))
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BufferData cmd;
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, size, 0, 0, GL_STREAM_DRAW);
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBufferSubData(
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint offset, GLsizei size, const void* data) {
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BufferSubData(target, offset, size,
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  shared_memory_address_))
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, data, size);
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BufferSubData cmd;
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, offset, size, shared_memory_id_, shared_memory_offset_);
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupVertexBuffer() {
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(1);
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat f = 0;
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferData(GL_ARRAY_BUFFER, kNumVertices * 2 * sizeof(f));
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupAllNeededVertexBuffers() {
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferData(GL_ARRAY_BUFFER, kNumVertices * 16 * sizeof(float));
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(0);
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(1);
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(2);
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0);
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupIndexBuffer() {
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               client_element_buffer_id_,
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               kServiceElementBufferId);
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLshort indices[] = {100, 1, 2, 3, 4, 5, 6, 7, 100, 9};
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(indices) == kNumIndices, Indices_is_not_10);
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices));
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 2, indices);
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 2, sizeof(indices) - 2, &indices[1]);
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupTexture() {
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               kSharedMemoryId, kSharedMemoryOffset);
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DeleteVertexBuffer() {
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDeleteBuffer(client_buffer_id_, kServiceBufferId);
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DeleteIndexBuffer() {
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDeleteBuffer(client_element_buffer_id_, kServiceElementBufferId);
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0WithError(
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei num_vertices, GLuint buffer_id, GLenum error) {
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) {
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, kServiceAttrib0BufferId))
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER,
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               num_vertices * sizeof(GLfloat) * 4,
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _, GL_DYNAMIC_DRAW))
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BufferSubData(
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_ARRAY_BUFFER, 0, num_vertices * sizeof(GLfloat) * 4, _))
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, VertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL))
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, 0))
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, VertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL))
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, buffer_id))
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0(
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei num_vertices, GLuint buffer_id) {
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddExpectationsForSimulatedAttrib0WithError(
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_vertices, buffer_id, GL_NO_ERROR);
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockCommandBufferEngine() {
1513effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1514effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<base::SharedMemory> shm(new base::SharedMemory());
1515effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  shm->CreateAndMapAnonymous(kSharedBufferSize);
1516e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  valid_buffer_ = MakeBufferFromSharedMemory(shm.Pass(), kSharedBufferSize);
1517effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ClearSharedMemory();
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)~MockCommandBufferEngine() {}
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1524effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_refptr<gpu::Buffer>
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetSharedMemoryBuffer(
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 shm_id) {
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_;
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::set_token(
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 token) {
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetBuffer(
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 /* transfer_buffer_id */) {
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetOffset(
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int32 offset) {
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetGetOffset() {
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderWithShaderTestBase::SetUp() {
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2DecoderTestBase::SetUp();
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupDefaultProgram();
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Include the auto-generated part of this file. We split this because it means
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we can easily edit the non-auto generated parts right here in this file
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instead of having to edit some template or the code generator.
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h"
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
1564