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/test_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_tokenizer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/types.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/buffer_manager.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/error_state_mock.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_utils.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/gpu_switches.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/program_manager.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/texture_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::MatcherCast;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Pointee;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArrayArgument;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgumentPointee;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrEq;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint TestHelper::kServiceBlackTexture2dId;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint TestHelper::kServiceDefaultTexture2dId;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint TestHelper::kServiceBlackTextureCubemapId;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint TestHelper::kServiceDefaultTextureCubemapId;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint TestHelper::kServiceBlackExternalTextureId;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint TestHelper::kServiceDefaultExternalTextureId;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint TestHelper::kServiceBlackRectangleTextureId;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint TestHelper::kServiceDefaultRectangleTextureId;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxSamples;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxRenderbufferSize;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxTextureSize;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxCubeMapTextureSize;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kNumVertexAttribs;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kNumTextureUnits;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxTextureImageUnits;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxVertexTextureImageUnits;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxFragmentUniformVectors;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxFragmentUniformComponents;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxVaryingVectors;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxVaryingFloats;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxVertexUniformVectors;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TestHelper::kMaxVertexUniformComponents;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHelper::SetupTextureInitializationExpectations(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::MockGLInterface* gl, GLenum target) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence sequence;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool needs_initialization = (target != GL_TEXTURE_EXTERNAL_OES);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool needs_faces = (target == GL_TEXTURE_CUBE_MAP);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint texture_2d_ids[] = {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceBlackTexture2dId,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceDefaultTexture2dId };
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint texture_cube_map_ids[] = {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceBlackTextureCubemapId,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceDefaultTextureCubemapId };
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint texture_external_oes_ids[] = {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceBlackExternalTextureId,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceDefaultExternalTextureId };
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLuint texture_rectangle_arb_ids[] = {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceBlackRectangleTextureId,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kServiceDefaultRectangleTextureId };
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint* texture_ids = NULL;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (target) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_2D:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      texture_ids = &texture_2d_ids[0];
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_CUBE_MAP:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      texture_ids = &texture_cube_map_ids[0];
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_EXTERNAL_OES:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      texture_ids = &texture_external_oes_ids[0];
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_RECTANGLE_ARB:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      texture_ids = &texture_rectangle_arb_ids[0];
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int array_size = 2;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GenTextures(array_size, _))
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArrayArgument<1>(texture_ids,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    texture_ids + array_size))
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int ii = 0; ii < array_size; ++ii) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl, BindTexture(target, texture_ids[ii]))
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (needs_initialization) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (needs_faces) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static GLenum faces[] = {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GL_TEXTURE_CUBE_MAP_POSITIVE_X,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        };
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (size_t ii = 0; ii < arraysize(faces); ++ii) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          EXPECT_CALL(*gl, TexImage2D(faces[ii], 0, GL_RGBA, 1, 1, 0, GL_RGBA,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      GL_UNSIGNED_BYTE, _))
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              .Times(1)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              .RetiresOnSaturation();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_CALL(*gl, TexImage2D(target, 0, GL_RGBA, 1, 1, 0, GL_RGBA,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    GL_UNSIGNED_BYTE, _))
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .Times(1)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .RetiresOnSaturation();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, BindTexture(target, 0))
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHelper::SetupTextureManagerInitExpectations(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::MockGLInterface* gl,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* extensions) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence sequence;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupTextureInitializationExpectations(gl, GL_TEXTURE_2D);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupTextureInitializationExpectations(gl, GL_TEXTURE_CUBE_MAP);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ext_image_external = false;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool arb_texture_rectangle = false;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::CStringTokenizer t(extensions, extensions + strlen(extensions), " ");
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (t.GetNext()) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (t.token() == "GL_OES_EGL_image_external") {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ext_image_external = true;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (t.token() == "GL_ARB_texture_rectangle") {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arb_texture_rectangle = true;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ext_image_external) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupTextureInitializationExpectations(gl, GL_TEXTURE_EXTERNAL_OES);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (arb_texture_rectangle) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupTextureInitializationExpectations(gl, GL_TEXTURE_RECTANGLE_ARB);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHelper::SetupTextureDestructionExpectations(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::MockGLInterface* gl, GLenum target) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint texture_id = 0;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (target) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_2D:
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      texture_id = kServiceDefaultTexture2dId;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_CUBE_MAP:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      texture_id = kServiceDefaultTextureCubemapId;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_EXTERNAL_OES:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      texture_id = kServiceDefaultExternalTextureId;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_TEXTURE_RECTANGLE_ARB:
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      texture_id = kServiceDefaultRectangleTextureId;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, DeleteTextures(1, Pointee(texture_id)))
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHelper::SetupTextureManagerDestructionExpectations(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::MockGLInterface* gl,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* extensions) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupTextureDestructionExpectations(gl, GL_TEXTURE_2D);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupTextureDestructionExpectations(gl, GL_TEXTURE_CUBE_MAP);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ext_image_external = false;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool arb_texture_rectangle = false;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::CStringTokenizer t(extensions, extensions + strlen(extensions), " ");
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (t.GetNext()) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (t.token() == "GL_OES_EGL_image_external") {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ext_image_external = true;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (t.token() == "GL_ARB_texture_rectangle") {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arb_texture_rectangle = true;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ext_image_external) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupTextureDestructionExpectations(gl, GL_TEXTURE_EXTERNAL_OES);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (arb_texture_rectangle) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupTextureDestructionExpectations(gl, GL_TEXTURE_RECTANGLE_ARB);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, DeleteTextures(4, _))
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHelper::SetupContextGroupInitExpectations(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::gfx::MockGLInterface* gl,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const DisallowedFeatures& disallowed_features,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* extensions) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence sequence;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupFeatureInfoInitExpectations(gl, extensions);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_RENDERBUFFER_SIZE, _))
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kMaxRenderbufferSize))
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (strstr(extensions, "GL_EXT_framebuffer_multisample") ||
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      strstr(extensions, "GL_EXT_multisampled_render_to_texture")) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl, GetIntegerv(GL_MAX_SAMPLES, _))
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(SetArgumentPointee<1>(kMaxSamples))
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else if (strstr(extensions, "GL_IMG_multisampled_render_to_texture")) {
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_CALL(*gl, GetIntegerv(GL_MAX_SAMPLES_IMG, _))
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        .WillOnce(SetArgumentPointee<1>(kMaxSamples))
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        .RetiresOnSaturation();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_VERTEX_ATTRIBS, _))
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kNumVertexAttribs))
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, _))
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kNumTextureUnits))
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_TEXTURE_SIZE, _))
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kMaxTextureSize))
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, _))
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kMaxCubeMapTextureSize))
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, _))
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kMaxTextureImageUnits))
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, _))
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kMaxVertexTextureImageUnits))
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, _))
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kMaxFragmentUniformComponents))
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_VARYING_FLOATS, _))
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kMaxVaryingFloats))
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, _))
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kMaxVertexUniformComponents))
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupTextureManagerInitExpectations(gl, extensions);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHelper::SetupFeatureInfoInitExpectations(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::gfx::MockGLInterface* gl, const char* extensions) {
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetupFeatureInfoInitExpectationsWithGLVersion(gl, extensions, "", "");
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     ::gfx::MockGLInterface* gl,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     const char* extensions,
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     const char* gl_renderer,
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     const char* gl_version) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence sequence;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl, GetString(GL_EXTENSIONS))
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(reinterpret_cast<const uint8*>(extensions)))
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(*gl, GetString(GL_RENDERER))
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(reinterpret_cast<const uint8*>(gl_renderer)))
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .RetiresOnSaturation();
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*gl, GetString(GL_VERSION))
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(reinterpret_cast<const uint8*>(gl_version)))
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .RetiresOnSaturation();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHelper::SetupExpectationsForClearingUniforms(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::MockGLInterface* gl, UniformInfo* uniforms, size_t num_uniforms) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < num_uniforms; ++ii) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UniformInfo& info = uniforms[ii];
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (info.type) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT:
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, Uniform1fv(info.real_location, info.size, _))
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_VEC2:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, Uniform2fv(info.real_location, info.size, _))
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_VEC3:
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, Uniform3fv(info.real_location, info.size, _))
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_VEC4:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, Uniform4fv(info.real_location, info.size, _))
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INT:
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BOOL:
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLER_2D:
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLER_CUBE:
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLER_EXTERNAL_OES:
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLER_3D_OES:
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLER_2D_RECT_ARB:
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, Uniform1iv(info.real_location, info.size, _))
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INT_VEC2:
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BOOL_VEC2:
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, Uniform2iv(info.real_location, info.size, _))
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INT_VEC3:
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BOOL_VEC3:
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, Uniform3iv(info.real_location, info.size, _))
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_INT_VEC4:
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BOOL_VEC4:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, Uniform4iv(info.real_location, info.size, _))
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_MAT2:
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, UniformMatrix2fv(
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          info.real_location, info.size, false, _))
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_MAT3:
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, UniformMatrix3fv(
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          info.real_location, info.size, false, _))
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_FLOAT_MAT4:
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, UniformMatrix4fv(
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          info.real_location, info.size, false, _))
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .Times(1)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHelper::SetupProgramSuccessExpectations(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::MockGLInterface* gl,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AttribInfo* attribs, size_t num_attribs,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UniformInfo* uniforms, size_t num_uniforms,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint service_id) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProgramiv(service_id, GL_LINK_STATUS, _))
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(1))
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProgramiv(service_id, GL_INFO_LOG_LENGTH, _))
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(0))
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProgramiv(service_id, GL_ACTIVE_ATTRIBUTES, _))
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(num_attribs))
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t max_attrib_len = 0;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < num_attribs; ++ii) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t len = strlen(attribs[ii].name) + 1;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_attrib_len = std::max(max_attrib_len, len);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProgramiv(service_id, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _))
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(max_attrib_len))
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < num_attribs; ++ii) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AttribInfo& info = attribs[ii];
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetActiveAttrib(service_id, ii,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        max_attrib_len, _, _, _, _))
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(DoAll(
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SetArgumentPointee<3>(strlen(info.name)),
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SetArgumentPointee<4>(info.size),
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SetArgumentPointee<5>(info.type),
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SetArrayArgument<6>(info.name,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                info.name + strlen(info.name) + 1)))
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ProgramManager::IsInvalidPrefix(info.name, strlen(info.name))) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*gl, GetAttribLocation(service_id, StrEq(info.name)))
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .WillOnce(Return(info.location))
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .RetiresOnSaturation();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProgramiv(service_id, GL_ACTIVE_UNIFORMS, _))
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(num_uniforms))
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t max_uniform_len = 0;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < num_uniforms; ++ii) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t len = strlen(uniforms[ii].name) + 1;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_uniform_len = std::max(max_uniform_len, len);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProgramiv(service_id, GL_ACTIVE_UNIFORM_MAX_LENGTH, _))
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<2>(max_uniform_len))
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t ii = 0; ii < num_uniforms; ++ii) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UniformInfo& info = uniforms[ii];
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetActiveUniform(service_id, ii,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         max_uniform_len, _, _, _, _))
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(DoAll(
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SetArgumentPointee<3>(strlen(info.name)),
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SetArgumentPointee<4>(info.size),
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SetArgumentPointee<5>(info.type),
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SetArrayArgument<6>(info.name,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                info.name + strlen(info.name) + 1)))
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .RetiresOnSaturation();
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int pass = 0; pass < 2; ++pass) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t ii = 0; ii < num_uniforms; ++ii) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const UniformInfo& info = uniforms[ii];
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ProgramManager::IsInvalidPrefix(info.name, strlen(info.name))) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (pass == 0) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_CALL(*gl, GetUniformLocation(service_id, StrEq(info.name)))
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .WillOnce(Return(info.real_location))
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .RetiresOnSaturation();
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((pass == 0 && info.desired_location >= 0) ||
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (pass == 1 && info.desired_location < 0)) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (info.size > 1) {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          std::string base_name = info.name;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          size_t array_pos = base_name.rfind("[0]");
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (base_name.size() > 3 && array_pos == base_name.size() - 3) {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_name = base_name.substr(0, base_name.size() - 3);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for (GLsizei jj = 1; jj < info.size; ++jj) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            std::string element_name(
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                std::string(base_name) + "[" + base::IntToString(jj) + "]");
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EXPECT_CALL(*gl, GetUniformLocation(
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                service_id, StrEq(element_name)))
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                .WillOnce(Return(info.real_location + jj * 2))
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                .RetiresOnSaturation();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHelper::SetupShader(
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::MockGLInterface* gl,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AttribInfo* attribs, size_t num_attribs,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UniformInfo* uniforms, size_t num_uniforms,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint service_id) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LinkProgram(service_id))
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupProgramSuccessExpectations(
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl, attribs, num_attribs, uniforms, num_uniforms, service_id);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestHelper::DoBufferData(
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ::gfx::MockGLInterface* gl, MockErrorState* error_state,
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BufferManager* manager, Buffer* buffer, GLsizeiptr size, GLenum usage,
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GLvoid* data, GLenum error) {
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*error_state, CopyRealGLErrorsToWrapper(_, _, _))
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(1)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .RetiresOnSaturation();
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (manager->IsUsageClientSideArray(usage)) {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*gl, BufferData(
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        buffer->target(), 0, _, usage))
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .Times(1)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .RetiresOnSaturation();
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*gl, BufferData(
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        buffer->target(), size, _, usage))
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .Times(1)
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .RetiresOnSaturation();
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(*error_state, PeekGLError(_, _, _))
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(Return(error))
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .RetiresOnSaturation();
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager->DoBufferData(error_state, buffer, size, usage, data);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestHelper::SetTexParameterWithExpectations(
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ::gfx::MockGLInterface* gl, MockErrorState* error_state,
52990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TextureManager* manager, TextureRef* texture_ref,
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum pname, GLint value, GLenum error) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (error == GL_NO_ERROR) {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (pname != GL_TEXTURE_POOL_CHROMIUM) {
53390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      EXPECT_CALL(*gl, TexParameteri(texture_ref->texture()->target(),
53490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     pname, value))
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .Times(1)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .RetiresOnSaturation();
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (error == GL_INVALID_ENUM) {
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*error_state, SetGLErrorInvalidEnum(_, _, _, value, _))
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .Times(1)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .RetiresOnSaturation();
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*error_state, SetGLErrorInvalidParam(_, _, error, _, _, _))
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .Times(1)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .RetiresOnSaturation();
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
54790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager->SetParameter("", error_state, texture_ref, pname, value);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScopedGLImplementationSetter::ScopedGLImplementationSetter(
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::GLImplementation implementation)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : old_implementation_(gfx::GetGLImplementation()) {
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::SetGLImplementation(implementation);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScopedGLImplementationSetter::~ScopedGLImplementationSetter() {
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::SetGLImplementation(old_implementation_);
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
563