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