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