gles2_cmd_decoder_unittest_base.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_number_conversions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/context_group.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/program_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/vertex_attrib_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::gfx::MockGLInterface;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::MatcherCast;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Pointee;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArrayArgument;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgumentPointee;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrEq;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderTestBase::GLES2DecoderTestBase()
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : surface_(NULL),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_(NULL),
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      memory_tracker_(NULL),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_buffer_id_(100),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_framebuffer_id_(101),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_program_id_(102),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_renderbuffer_id_(103),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_shader_id_(104),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_texture_id_(106),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_element_buffer_id_(107),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_vertex_shader_id_(121),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_fragment_shader_id_(122),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_query_id_(123),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_vertexarray_id_(124) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(immediate_buffer_, 0xEE, sizeof(immediate_buffer_));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderTestBase::~GLES2DecoderTestBase() {}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetUp() {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitDecoder(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",      // extensions
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,    // has alpha
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,    // has depth
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,   // has stencil
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,    // request alpha
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,    // request depth
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,   // request stencil
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true);   // bind generates resource
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForVertexAttribManager() {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (GLint ii = 0; ii < kNumVertexAttribs; ++ii) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, VertexAttrib4f(ii, 0.0f, 0.0f, 0.0f, 1.0f))
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::InitDecoder(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* extensions,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_alpha,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_depth,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_stencil,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool request_alpha,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool request_depth,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool request_stencil,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool bind_generates_resource) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Framebuffer::ClearFramebufferCompleteComboMap();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_.reset(new StrictMock<MockGLInterface>());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::gfx::GLInterface::SetGLInterface(gl_.get());
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  group_ = scoped_refptr<ContextGroup>(new ContextGroup(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      memory_tracker_,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bind_generates_resource));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence sequence;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupContextGroupInitExpectations(gl_.get(),
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DisallowedFeatures(), extensions);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We initialize the ContextGroup with a MockGLES2Decoder so that
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we can use the ContextGroup to figure out how the real GLES2Decoder
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will initialize itself.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mock_decoder_.reset(new MockGLES2Decoder());
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      group_->Initialize(mock_decoder_.get(), DisallowedFeatures(), NULL));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddExpectationsForVertexAttribManager();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddExpectationsForBindVertexArrayOES();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, EnableVertexAttribArray(0))
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint attrib_0_id[] = {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceAttrib0BufferId,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint fixed_attrib_buffer_id[] = {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceFixedAttribBufferId,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(arraysize(attrib_0_id), _))
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(attrib_0_id,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    attrib_0_id + arraysize(attrib_0_id)))
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, kServiceAttrib0BufferId))
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, VertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, NULL))
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, 0))
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(arraysize(fixed_attrib_buffer_id), _))
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fixed_attrib_buffer_id,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fixed_attrib_buffer_id + arraysize(fixed_attrib_buffer_id)))
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (GLint tt = 0; tt < TestHelper::kNumTextureUnits; ++tt) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0 + tt))
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (group_->feature_info()->feature_flags().oes_egl_image_external) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, BindTexture(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_TEXTURE_EXTERNAL_OES,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              TestHelper::kServiceDefaultExternalTextureId))
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (group_->feature_info()->feature_flags().arb_texture_rectangle) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, BindTexture(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GL_TEXTURE_RECTANGLE_ARB,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              TestHelper::kServiceDefaultRectangleTextureId))
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_CUBE_MAP, TestHelper::kServiceDefaultTextureCubemapId))
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_2D, TestHelper::kServiceDefaultTexture2dId))
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _))
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       .WillOnce(SetArgumentPointee<1>(has_alpha ? 8 : 0))
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       .RetiresOnSaturation();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       .WillOnce(SetArgumentPointee<1>(has_depth ? 24 : 0))
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       .RetiresOnSaturation();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       .WillOnce(SetArgumentPointee<1>(has_stencil ? 8 : 0))
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       .RetiresOnSaturation();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Clear(
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Enable(GL_VERTEX_PROGRAM_POINT_SIZE))
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Enable(GL_POINT_SPRITE))
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLint max_viewport_dims[] = {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMaxViewportWidth,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kMaxViewportHeight
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(GL_MAX_VIEWPORT_DIMS, _))
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          max_viewport_dims, max_viewport_dims + arraysize(max_viewport_dims)))
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupInitCapabilitiesExpectations();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupInitStateExpectations();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0))
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Hint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE))
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, PixelStorei(GL_PACK_ALIGNMENT, 4))
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, PixelStorei(GL_UNPACK_ALIGNMENT, 4))
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, 0))
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0))
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER, 0))
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindRenderbufferEXT(GL_RENDERBUFFER, 0))
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  engine_.reset(new StrictMock<MockCommandBufferEngine>());
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu::Buffer buffer = engine_->GetSharedMemoryBuffer(kSharedMemoryId);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_offset_ = kSharedMemoryOffset;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_address_ = reinterpret_cast<int8*>(buffer.ptr) +
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shared_memory_offset_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_id_ = kSharedMemoryId;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shared_memory_base_ = buffer.ptr;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  surface_ = new gfx::GLSurfaceStub;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  surface_->SetSize(gfx::Size(kBackBufferWidth, kBackBufferHeight));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_ = new gfx::GLContextStub;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_->MakeCurrent(surface_);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 attributes[] = {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EGL_ALPHA_SIZE, request_alpha ? 8 : 0,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EGL_DEPTH_SIZE, request_depth ? 24 : 0,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EGL_STENCIL_SIZE, request_stencil ? 8 : 0,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32> attribs(attributes, attributes + arraysize(attributes));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_.reset(GLES2Decoder::Create(group_.get()));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->set_log_synthesized_gl_errors(false);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->Initialize(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      surface_, context_, false, surface_->GetSize(), DisallowedFeatures(),
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, attribs);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->MakeCurrent();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->set_engine(engine_.get());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(_, _))
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceBufferId))
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenBuffersImmediate>(client_buffer_id_);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenFramebuffersEXT(_, _))
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceFramebufferId))
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenFramebuffersImmediate>(client_framebuffer_id_);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenRenderbuffersEXT(_, _))
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceRenderbufferId))
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenRenderbuffersImmediate>(client_renderbuffer_id_);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenTextures(_, _))
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceTextureId))
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenTexturesImmediate>(client_texture_id_);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GenBuffersARB(_, _))
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kServiceElementBufferId))
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GenHelper<cmds::GenBuffersImmediate>(client_element_buffer_id_);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateProgram(client_program_id_, kServiceProgramId);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateShader(GL_VERTEX_SHADER, client_shader_id_, kServiceShaderId);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::TearDown() {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All Tests should have read all their GLErrors before getting here.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteBuffersARB(1, _))
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(2)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_->Destroy(true);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_.reset();
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  group_->Destroy(mock_decoder_.get(), false);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  engine_.reset();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::gfx::GLInterface::SetGLInterface(NULL);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_.reset();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::ExpectEnableDisable(GLenum cap, bool enable) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enable) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(cap))
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Disable(cap))
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLint GLES2DecoderTestBase::GetGLError() {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::GetError cmd;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(shared_memory_id_, shared_memory_offset_);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<GLint>(*GetSharedMemoryAs<GLenum*>());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoCreateShader(
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum shader_type, GLuint client_id, GLuint service_id) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CreateShader(shader_type))
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(service_id))
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::CreateShader cmd;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(shader_type, client_id);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsShader(GLuint client_id) {
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsShader, cmds::IsShader::Result>(client_id);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteShader(
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteShader(service_id))
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteShader cmd;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_id);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoCreateProgram(
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CreateProgram())
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(service_id))
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::CreateProgram cmd;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_id);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsProgram(GLuint client_id) {
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsProgram, cmds::IsProgram::Result>(client_id);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteProgram(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint /* service_id */) {
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteProgram cmd;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_id);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetBucketAsCString(
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 bucket_id, const char* str) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 size = str ? (strlen(str) + 1) : 0;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd::SetBucketSize cmd1;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd1.Init(bucket_id, size);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (str) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(shared_memory_address_, str, size);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd::SetBucketData cmd2;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd2.Init(bucket_id, 0, size, kSharedMemoryId, kSharedMemoryOffset);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearSharedMemory();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupClearTextureExpections(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint service_id,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint old_service_id,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum bind_target,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum format,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum type,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei height) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(bind_target, service_id))
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, TexImage2D(
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, level, format, width, height, 0, format, type, _))
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(bind_target, old_service_id))
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearing(
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint clear_bits,
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_red,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_green,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_blue,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_alpha,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint restore_stencil,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_depth,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restore_scissor_test) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupExpectationsForFramebufferClearingMulti(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clear_bits,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_red,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_green,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_blue,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_alpha,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_stencil,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_depth,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_scissor_test);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForRestoreClearState(
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_red,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_green,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_blue,
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_alpha,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint restore_stencil,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_depth,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restore_scissor_test) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ClearColor(
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_red, restore_green, restore_blue, restore_alpha))
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ClearStencil(restore_stencil))
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ClearDepth(restore_depth))
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (restore_scissor_test) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST))
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearingMulti(
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint read_framebuffer_service_id,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint draw_framebuffer_service_id,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint clear_bits,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_red,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_green,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_blue,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_alpha,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint restore_stencil,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLclampf restore_depth,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool restore_scissor_test) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gman): Figure out why InSequence stopped working.
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InSequence sequence;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(target))
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target == GL_READ_FRAMEBUFFER_EXT) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0))
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_DRAW_FRAMEBUFFER_EXT, read_framebuffer_service_id))
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((clear_bits & GL_COLOR_BUFFER_BIT) != 0) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ClearColor(0.0f, 0.0f, 0.0f, 0.0f))
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ColorMask(true, true, true, true))
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((clear_bits & GL_STENCIL_BUFFER_BIT) != 0) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ClearStencil(0))
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, StencilMask(static_cast<GLuint>(-1)))
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((clear_bits & GL_DEPTH_BUFFER_BIT) != 0) {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, ClearDepth(1.0f))
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, DepthMask(1))
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST))
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, Clear(clear_bits))
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupExpectationsForRestoreClearState(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_red, restore_green, restore_blue, restore_alpha,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restore_stencil, restore_depth, restore_scissor_test);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target == GL_READ_FRAMEBUFFER_EXT) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_READ_FRAMEBUFFER_EXT, read_framebuffer_service_id))
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_DRAW_FRAMEBUFFER_EXT, draw_framebuffer_service_id))
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GLES2DecoderTestBase::SetupShaderForUniform(GLenum uniform_type) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AttribInfo attribs[] = {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "foo", 1, GL_FLOAT, 1, },
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "goo", 1, GL_FLOAT, 2, },
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UniformInfo uniforms[] = {
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "bar", 1, uniform_type, 0, 2, -1, },
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "car", 4, uniform_type, 1, 1, -1, },
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientVertexShaderId = 5001;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceVertexShaderId = 6001;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientFragmentShaderId = 5002;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceFragmentShaderId = 6002;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              client_program_id_, kServiceProgramId,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kClientVertexShaderId, kServiceVertexShaderId,
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              kClientFragmentShaderId, kServiceFragmentShaderId);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::UseProgram cmd;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(client_program_id_);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindBuffer(
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(target, service_id))
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindBuffer cmd;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsBuffer(GLuint client_id) {
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsBuffer, cmds::IsBuffer::Result>(client_id);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteBuffer(
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteBuffersARB(1, Pointee(service_id)))
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteBuffers cmd;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, shared_memory_id_, shared_memory_offset_);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, &client_id, sizeof(client_id));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState(
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool framebuffer_is_rgb,
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool framebuffer_has_depth,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool framebuffer_has_stencil,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint color_bits,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool depth_mask,
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool depth_enabled,
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint front_stencil_mask,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint back_stencil_mask,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool stencil_enabled,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool cull_face_enabled,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool scissor_test_enabled,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool blend_enabled) {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, ColorMask(
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (color_bits & 0x1000) != 0,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (color_bits & 0x0100) != 0,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (color_bits & 0x0010) != 0,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (color_bits & 0x0001) && !framebuffer_is_rgb))
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DepthMask(depth_mask))
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (framebuffer_has_depth && depth_enabled) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(GL_DEPTH_TEST))
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Disable(GL_DEPTH_TEST))
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, front_stencil_mask))
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, back_stencil_mask))
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (framebuffer_has_stencil && stencil_enabled) {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(GL_STENCIL_TEST))
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Disable(GL_STENCIL_TEST))
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cull_face_enabled) {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(GL_CULL_FACE))
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Disable(GL_CULL_FACE))
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (scissor_test_enabled) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST))
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST))
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (blend_enabled) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Enable(GL_BLEND))
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, Disable(GL_BLEND))
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupExpectationsForApplyingDefaultDirtyState() {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupExpectationsForApplyingDirtyState(
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,   // Framebuffer is RGB
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,   // Framebuffer has depth
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,   // Framebuffer has stencil
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x1111,  // color bits
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,    // depth mask
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,   // depth enabled
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,       // front stencil mask
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,       // back stencil mask
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,   // stencil enabled
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,   // cull_face_enabled
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,   // scissor_test_enabled
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false);  // blend_enabled
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindFramebuffer(
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindFramebufferEXT(target, service_id))
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindFramebuffer cmd;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsFramebuffer(GLuint client_id) {
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsFramebuffer, cmds::IsFramebuffer::Result>(
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client_id);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteFramebuffer(
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id,
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool reset_draw, GLenum draw_target, GLuint draw_id,
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool reset_read, GLenum read_target, GLuint read_id) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reset_draw) {
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(draw_target, draw_id))
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reset_read) {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindFramebufferEXT(read_target, read_id))
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, Pointee(service_id)))
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteFramebuffers cmd;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, shared_memory_id_, shared_memory_offset_);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, &client_id, sizeof(client_id));
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindRenderbuffer(
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindRenderbufferEXT(target, service_id))
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindRenderbuffer cmd;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsRenderbuffer(GLuint client_id) {
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsRenderbuffer, cmds::IsRenderbuffer::Result>(
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client_id);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteRenderbuffer(
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteRenderbuffersEXT(1, Pointee(service_id)))
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteRenderbuffers cmd;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, shared_memory_id_, shared_memory_offset_);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, &client_id, sizeof(client_id));
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBindTexture(
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLuint client_id, GLuint service_id) {
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(target, service_id))
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BindTexture cmd;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, client_id);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderTestBase::DoIsTexture(GLuint client_id) {
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsObjectHelper<cmds::IsTexture, cmds::IsTexture::Result>(client_id);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoDeleteTexture(
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint client_id, GLuint service_id) {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(service_id)))
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::DeleteTextures cmd;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, shared_memory_id_, shared_memory_offset_);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, &client_id, sizeof(client_id));
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoTexImage2D(
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint level, GLenum internal_format,
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum format, GLenum type,
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 shared_memory_id, uint32 shared_memory_offset) {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, TexImage2D(target, level, internal_format,
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               width, height, border, format, type, _))
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::TexImage2D cmd;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, level, internal_format, width, height, border, format,
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type, shared_memory_id, shared_memory_offset);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoCompressedTexImage2D(
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint level, GLenum format,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei size, uint32 bucket_id) {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CompressedTexImage2D(
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, level, format, width, height, border, size, _))
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket* bucket = decoder_->CreateBucket(bucket_id);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bucket->SetSize(size);
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::CompressedTexImage2DBucket cmd;
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, level, format, width, height, border,
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bucket_id);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoTexImage2DSameSize(
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint level, GLenum internal_format,
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height, GLint border,
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum format, GLenum type,
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 shared_memory_id, uint32 shared_memory_offset) {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GLES2Decoder::IsAngle()) {
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, TexSubImage2D(
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target, level, 0, 0, width, height, format, type, _))
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, GetError())
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(GL_NO_ERROR))
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, TexImage2D(target, level, internal_format,
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 width, height, border, format, type, _))
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, GetError())
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(GL_NO_ERROR))
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::TexImage2D cmd;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, level, internal_format, width, height, border, format,
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type, shared_memory_id, shared_memory_offset);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoRenderbufferStorage(
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLenum internal_format, GLenum actual_format,
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height,  GLenum error) {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, RenderbufferStorageEXT(
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, actual_format, width, height))
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::RenderbufferStorage cmd;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, internal_format, width, height);
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoFramebufferTexture2D(
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLenum attachment, GLenum textarget,
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint texture_client_id, GLuint texture_service_id, GLint level,
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum error) {
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, FramebufferTexture2DEXT(
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, attachment, textarget, texture_service_id, level))
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::FramebufferTexture2D cmd;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, attachment, textarget, texture_client_id, level);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoFramebufferRenderbuffer(
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target,
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum attachment,
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum renderbuffer_target,
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint renderbuffer_client_id,
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint renderbuffer_service_id,
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum error) {
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, attachment, renderbuffer_target, renderbuffer_service_id))
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::FramebufferRenderbuffer cmd;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, attachment, renderbuffer_target, renderbuffer_client_id);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoVertexAttribPointer(
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint index, GLint size, GLenum type, GLsizei stride, GLuint offset) {
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              VertexAttribPointer(index, size, type, GL_FALSE, stride,
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  BufferOffset(offset)))
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::VertexAttribPointer cmd;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(index, size, GL_FLOAT, GL_FALSE, stride, offset);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoVertexAttribDivisorANGLE(
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint index, GLuint divisor) {
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_,
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              VertexAttribDivisorANGLE(index, divisor))
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::VertexAttribDivisorANGLE cmd;
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(index, divisor);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForGenVertexArraysOES(){
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, GenVertexArraysOES(1, _))
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .WillOnce(SetArgumentPointee<1>(kServiceVertexArrayId))
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForDeleteVertexArraysOES(){
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, DeleteVertexArraysOES(1, _))
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForBindVertexArrayOES() {
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (group_->feature_info()->feature_flags().native_vertex_array_object) {
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindVertexArrayOES(_))
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (uint32 vv = 0; vv < group_->max_vertex_attribs(); ++vv) {
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddExpectationsForRestoreAttribState(vv);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindBuffer(GL_ELEMENT_ARRAY_BUFFER, _))
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForRestoreAttribState(GLuint attrib) {
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, _))
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, VertexAttribPointer(attrib, _, _, _, _, _))
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(attrib, _))
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(testing::AtMost(1))
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, _))
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attrib != 0 ||
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) {
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(bajones): Not sure if I can tell which of these will be called
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, EnableVertexAttribArray(attrib))
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(testing::AtMost(1))
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl_, DisableVertexAttribArray(attrib))
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(testing::AtMost(1))
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kBackBufferWidth;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kBackBufferHeight;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxTextureSize;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxCubeMapTextureSize;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kNumVertexAttribs;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kNumTextureUnits;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxTextureImageUnits;
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxVertexTextureImageUnits;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxFragmentUniformVectors;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxVaryingVectors;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxVertexUniformVectors;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxViewportWidth;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxViewportHeight;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportX;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportY;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportWidth;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kViewportHeight;
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceAttrib0BufferId;
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceFixedAttribBufferId;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceBufferId;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceFramebufferId;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceRenderbufferId;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceTextureId;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceProgramId;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceShaderId;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceElementBufferId;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceQueryId;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceVertexArrayId;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2DecoderTestBase::kSharedMemoryId;
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t GLES2DecoderTestBase::kSharedBufferSize;
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kSharedMemoryOffset;
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 GLES2DecoderTestBase::kInvalidSharedMemoryId;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kInvalidSharedMemoryOffset;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kInitialResult;
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 GLES2DecoderTestBase::kInitialMemoryValue;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kNewClientId;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kNewServiceId;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 GLES2DecoderTestBase::kInvalidClientId;
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceVertexShaderId;
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceFragmentShaderId;
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumShaderId;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumProgramId;
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumTextureBufferId;
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumVertexBufferId;
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumFBOId;
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumPositionAttrib;
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumTexAttrib;
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kServiceCopyTextureChromiumSamplerLocation;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLsizei GLES2DecoderTestBase::kNumVertices;
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLsizei GLES2DecoderTestBase::kNumIndices;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kValidIndexRangeStart;
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kValidIndexRangeCount;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kInvalidIndexRangeStart;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kInvalidIndexRangeCount;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int GLES2DecoderTestBase::kOutOfRangeIndexRangeEnd;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint GLES2DecoderTestBase::kMaxValidIndex;
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxAttribLength;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib1Size;
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib2Size;
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib3Size;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib1Location;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib2Location;
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kAttrib3Location;
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kAttrib1Type;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kAttrib2Type;
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kAttrib3Type;
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kInvalidAttribLocation;
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kBadAttribIndex;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kMaxUniformLength;
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1Size;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2Size;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3Size;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1RealLocation;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2RealLocation;
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2ElementRealLocation;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3RealLocation;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1FakeLocation;
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2FakeLocation;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2ElementFakeLocation;
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3FakeLocation;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform1DesiredLocation;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform2DesiredLocation;
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kUniform3DesiredLocation;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniform1Type;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniform2Type;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniform3Type;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLenum GLES2DecoderTestBase::kUniformCubemapType;
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kInvalidUniformLocation;
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint GLES2DecoderTestBase::kBadUniformIndex;
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kAttrib1Name = "attrib1";
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kAttrib2Name = "attrib2";
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kAttrib3Name = "attrib3";
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kUniform1Name = "uniform1";
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kUniform2Name = "uniform2[0]";
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GLES2DecoderTestBase::kUniform3Name = "uniform3[0]";
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupDefaultProgram() {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static AttribInfo attribs[] = {
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static UniformInfo uniforms[] = {
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform1Name, kUniform1Size, kUniform1Type,
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1FakeLocation, kUniform1RealLocation,
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1DesiredLocation },
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform2Name, kUniform2Size, kUniform2Type,
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2FakeLocation, kUniform2RealLocation,
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2DesiredLocation },
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform3Name, kUniform3Size, kUniform3Type,
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3FakeLocation, kUniform3RealLocation,
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3DesiredLocation },
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_program_id_, kServiceProgramId,
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_vertex_shader_id_, kServiceVertexShaderId,
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_fragment_shader_id_, kServiceFragmentShaderId);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::UseProgram cmd;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd.Init(client_program_id_);
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupCubemapProgram() {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static AttribInfo attribs[] = {
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, },
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static UniformInfo uniforms[] = {
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform1Name, kUniform1Size, kUniformCubemapType,
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1FakeLocation, kUniform1RealLocation,
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform1DesiredLocation, },
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform2Name, kUniform2Size, kUniform2Type,
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2FakeLocation, kUniform2RealLocation,
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform2DesiredLocation, },
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { kUniform3Name, kUniform3Size, kUniform3Type,
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3FakeLocation, kUniform3RealLocation,
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kUniform3DesiredLocation, },
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms),
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_program_id_, kServiceProgramId,
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_vertex_shader_id_, kServiceVertexShaderId,
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                client_fragment_shader_id_, kServiceFragmentShaderId);
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, UseProgram(kServiceProgramId))
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::UseProgram cmd;
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd.Init(client_program_id_);
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderWithShaderTestBase::TearDown() {
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2DecoderTestBase::TearDown();
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupShader(
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLES2DecoderTestBase::AttribInfo* attribs, size_t num_attribs,
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLES2DecoderTestBase::UniformInfo* uniforms, size_t num_uniforms,
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint program_client_id, GLuint program_service_id,
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint vertex_shader_client_id, GLuint vertex_shader_service_id,
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint fragment_shader_client_id, GLuint fragment_shader_service_id) {
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InSequence s;
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AttachShader(program_service_id, vertex_shader_service_id))
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_,
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                AttachShader(program_service_id, fragment_shader_service_id))
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestHelper::SetupShader(
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_.get(), attribs, num_attribs, uniforms, num_uniforms,
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        program_service_id);
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateShader(
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_VERTEX_SHADER, vertex_shader_client_id, vertex_shader_service_id);
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCreateShader(
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_FRAGMENT_SHADER, fragment_shader_client_id,
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fragment_shader_service_id);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShader(vertex_shader_client_id)->SetStatus(true, "", NULL);
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetShader(fragment_shader_client_id)->SetStatus(true, "", NULL);
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::AttachShader attach_cmd;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attach_cmd.Init(program_client_id, vertex_shader_client_id);
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attach_cmd.Init(program_client_id, fragment_shader_client_id);
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(attach_cmd));
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::LinkProgram link_cmd;
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  link_cmd.Init(program_client_id);
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(link_cmd));
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Assume the next command will be UseProgram.
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupExpectationsForClearingUniforms(uniforms, num_uniforms);
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoEnableVertexAttribArray(GLint index) {
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, EnableVertexAttribArray(index))
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::EnableVertexAttribArray cmd;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(index);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBufferData(GLenum target, GLsizei size) {
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BufferData(target, size, _, GL_STREAM_DRAW))
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BufferData cmd;
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, size, 0, 0, GL_STREAM_DRAW);
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DoBufferSubData(
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target, GLint offset, GLsizei size, const void* data) {
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BufferSubData(target, offset, size,
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  shared_memory_address_))
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(shared_memory_address_, data, size);
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::BufferSubData cmd;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(target, offset, size, shared_memory_id_, shared_memory_offset_);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupVertexBuffer() {
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(1);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat f = 0;
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferData(GL_ARRAY_BUFFER, kNumVertices * 2 * sizeof(f));
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupAllNeededVertexBuffers() {
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId);
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferData(GL_ARRAY_BUFFER, kNumVertices * 16 * sizeof(float));
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(0);
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(1);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(2);
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0);
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupIndexBuffer() {
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               client_element_buffer_id_,
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               kServiceElementBufferId);
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLshort indices[] = {100, 1, 2, 3, 4, 5, 6, 7, 100, 9};
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPILE_ASSERT(arraysize(indices) == kNumIndices, Indices_is_not_10);
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices));
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, 2, indices);
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 2, sizeof(indices) - 2, &indices[1]);
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupTexture() {
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               kSharedMemoryId, kSharedMemoryOffset);
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DeleteVertexBuffer() {
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDeleteBuffer(client_buffer_id_, kServiceBufferId);
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::DeleteIndexBuffer() {
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDeleteBuffer(client_element_buffer_id_, kServiceElementBufferId);
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0WithError(
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei num_vertices, GLuint buffer_id, GLenum error) {
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) {
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(error))
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, kServiceAttrib0BufferId))
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER,
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               num_vertices * sizeof(GLfloat) * 4,
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               _, GL_DYNAMIC_DRAW))
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BufferSubData(
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_ARRAY_BUFFER, 0, num_vertices * sizeof(GLfloat) * 4, _))
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, VertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL))
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, 0))
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, VertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL))
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, buffer_id))
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0(
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei num_vertices, GLuint buffer_id) {
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddExpectationsForSimulatedAttrib0WithError(
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_vertices, buffer_id, GL_NO_ERROR);
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockCommandBufferEngine() {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data_.reset(new int8[kSharedBufferSize]);
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearSharedMemory();
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  valid_buffer_.ptr = data_.get();
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  valid_buffer_.size = kSharedBufferSize;
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)~MockCommandBufferEngine() {}
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gpu::Buffer
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetSharedMemoryBuffer(
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 shm_id) {
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_;
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::set_token(
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 token) {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetBuffer(
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 /* transfer_buffer_id */) {
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetOffset(
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int32 offset) {
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetGetOffset() {
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(false);
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderWithShaderTestBase::SetUp() {
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2DecoderTestBase::SetUp();
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupDefaultProgram();
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Include the auto-generated part of this file. We split this because it means
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we can easily edit the non-auto generated parts right here in this file
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instead of having to edit some template or the code generator.
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h"
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
1389