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/texture_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/error_state_mock.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/service/framebuffer_manager.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/service/mailbox_manager.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/memory_tracking.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/mocks.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AtLeast;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Pointee;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::SetArgumentPointee;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::StrictMock;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TextureTestHelper {
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool IsNPOT(const Texture* texture) {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return texture->npot();
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool IsTextureComplete(const Texture* texture) {
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return texture->texture_complete();
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool IsCubeComplete(const Texture* texture) {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return texture->cube_complete();
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TextureManagerTest : public testing::Test {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxTextureSize = 16;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxCubeMapTextureSize = 8;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxExternalTextureSize = 16;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMax2dLevels = 5;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxCubeMapLevels = 4;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxExternalLevels = 1;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManagerTest()
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : feature_info_(new FeatureInfo()) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TextureManagerTest() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::GLInterface::SetGLInterface(gl_.get());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_.reset(new TextureManager(
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NULL, feature_info_.get(),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kMaxTextureSize, kMaxCubeMapTextureSize));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->Initialize();
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->Destroy(false);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_.reset();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::GLInterface::SetGLInterface(NULL);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.reset();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetParameter(
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestHelper::SetTexParameterWithExpectations(
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gl_.get(), error_state_.get(), manager_.get(),
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        texture_ref, pname, value, error);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use StrictMock to make 100% sure we know how GL will be called.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info_;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TextureManager> manager_;
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockErrorState> error_state_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TextureManagerTest::kMaxTextureSize;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TextureManagerTest::kMaxCubeMapTextureSize;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TextureManagerTest::kMaxExternalTextureSize;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TextureManagerTest::kMax2dLevels;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TextureManagerTest::kMaxCubeMapLevels;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLint TextureManagerTest::kMaxExternalLevels;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TextureManagerTest, Basic) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient2Id = 2;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create texture.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateTexture(kClient1Id, kService1Id);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check texture got created.
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<TextureRef> texture = manager_->GetTexture(kClient1Id);
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(texture.get() != NULL);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kService1Id, texture->service_id());
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kClient1Id, texture->client_id());
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(texture->texture(), manager_->GetTextureForServiceId(
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture->service_id()));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent texture.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->GetTexture(kClient2Id) == NULL);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check trying to a remove non-existent textures does not crash.
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveTexture(kClient2Id);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it gets deleted when the last reference is released.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can't get the texture after we remove it.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveTexture(kClient1Id);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->GetTexture(kClient1Id) == NULL);
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u, texture->client_id());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TextureManagerTest, SetParameter) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create texture.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateTexture(kClient1Id, kService1Id);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check texture got created.
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture_ref = manager_->GetTexture(kClient1Id);
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref->texture();
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager_->SetTarget(texture_ref, GL_TEXTURE_2D);
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetParameter(texture_ref, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetParameter(texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->mag_filter());
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1, GL_NO_ERROR);
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2, GL_NO_ERROR);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetParameter(
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      texture_ref, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetParameter(
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      texture_ref, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_NEAREST, GL_INVALID_ENUM);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_NEAREST, GL_INVALID_ENUM);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TextureManagerTest, TextureUsageExt) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupTextureManagerInitExpectations(gl_.get(),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  "GL_ANGLE_texture_usage");
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Initialize();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create texture.
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager.CreateTexture(kClient1Id, kService1Id);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check texture got created.
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestHelper::SetTexParameterWithExpectations(
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gl_.get(), error_state_.get(), &manager, texture_ref,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE,GL_NO_ERROR);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE),
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            texture_ref->texture()->usage());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(false);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TextureManagerTest, Destroy) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Initialize();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create texture.
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager.CreateTexture(kClient1Id, kService1Id);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check texture got created.
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture = manager.GetTexture(kClient1Id);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(texture != NULL);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), "");
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(true);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that resources got freed.
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  texture = manager.GetTexture(kClient1Id);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(texture == NULL);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TextureManagerTest, MaxValues) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get the right values for the max sizes.
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kMax2dLevels, manager_->MaxLevelsForTarget(GL_TEXTURE_2D));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapLevels,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapLevels,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapLevels,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapLevels,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapLevels,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapLevels,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapLevels,
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxExternalLevels,
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxLevelsForTarget(GL_TEXTURE_EXTERNAL_OES));
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kMaxTextureSize, manager_->MaxSizeForTarget(GL_TEXTURE_2D));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapTextureSize,
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapTextureSize,
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapTextureSize,
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapTextureSize,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapTextureSize,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapTextureSize,
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxCubeMapTextureSize,
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kMaxExternalTextureSize,
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager_->MaxSizeForTarget(GL_TEXTURE_EXTERNAL_OES));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TextureManagerTest, ValidForTarget) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check 2d
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->ValidForTarget(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, kMaxTextureSize, kMaxTextureSize, 1));
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->ValidForTarget(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, kMax2dLevels - 1, 1, 1, 1));
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, kMax2dLevels - 1, 1, 2, 1));
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, kMax2dLevels - 1, 2, 1, 1));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check level out of range.
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, kMax2dLevels, kMaxTextureSize, 1, 1));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check has depth.
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, kMax2dLevels, kMaxTextureSize, 1, 2));
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check NPOT width on level 0
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check NPOT height on level 0
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check NPOT width on level 1
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check NPOT height on level 1
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check cube
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->ValidForTarget(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_CUBE_MAP, 0,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kMaxCubeMapTextureSize, kMaxCubeMapTextureSize, 1));
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->ValidForTarget(
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels - 1, 1, 1, 1));
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels - 1, 2, 2, 1));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check level out of range.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kMaxCubeMapTextureSize, 1, 1));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check not square.
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kMaxCubeMapTextureSize, 1, 1));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check has depth.
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->ValidForTarget(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kMaxCubeMapTextureSize, 1, 2));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (GLint level = 0; level < kMax2dLevels; ++level) {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(manager_->ValidForTarget(
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_2D, level, kMaxTextureSize >> level, 1, 1));
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(manager_->ValidForTarget(
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_2D, level, 1, kMaxTextureSize >> level, 1));
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(manager_->ValidForTarget(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_2D, level, (kMaxTextureSize >> level) + 1, 1, 1));
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(manager_->ValidForTarget(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_2D, level, 1, (kMaxTextureSize >> level) + 1, 1));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (GLint level = 0; level < kMaxCubeMapLevels; ++level) {
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(manager_->ValidForTarget(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_CUBE_MAP, level,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kMaxCubeMapTextureSize >> level,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kMaxCubeMapTextureSize >> level,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1));
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(manager_->ValidForTarget(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_TEXTURE_CUBE_MAP, level,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (kMaxCubeMapTextureSize >> level) * 2,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (kMaxCubeMapTextureSize >> level) * 2,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TextureManagerTest, ValidForTargetNPOT) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(), "GL_OES_texture_npot");
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_info->Initialize(NULL);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check NPOT width on level 0
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check NPOT height on level 0
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check NPOT width on level 1
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check NPOT height on level 1
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(false);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureTestBase : public testing::Test {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxTextureSize = 16;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxCubeMapTextureSize = 8;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMax2dLevels = 5;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLint kMaxCubeMapLevels = 4;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kClient1Id = 1;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kService1Id = 11;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TextureTestBase()
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : feature_info_(new FeatureInfo()) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TextureTestBase() {
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    texture_ref_ = NULL;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::GLInterface::SetGLInterface(gl_.get());
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!extensions.empty()) {
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TestHelper::SetupFeatureInfoInitExpectations(gl_.get(),
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                   extensions.c_str());
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      feature_info_->Initialize(NULL);
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_.reset(new TextureManager(
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        memory_tracker, feature_info_.get(),
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kMaxTextureSize, kMaxCubeMapTextureSize));
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>());
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->CreateTexture(kClient1Id, kService1Id);
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    texture_ref_ = manager_->GetTexture(kClient1Id);
36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(texture_ref_.get() != NULL);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
37390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (texture_ref_.get()) {
37490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // If it's not in the manager then setting texture_ref_ to NULL will
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // delete the texture.
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!texture_ref_->client_id()) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Check that it gets deleted when the last reference is released.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_CALL(*gl_,
37990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            DeleteTextures(1, ::testing::Pointee(texture_ref_->service_id())))
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .Times(1)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .RetiresOnSaturation();
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      texture_ref_ = NULL;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->Destroy(false);
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_.reset();
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::GLInterface::SetGLInterface(NULL);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.reset();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetParameter(
39290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestHelper::SetTexParameterWithExpectations(
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gl_.get(), error_state_.get(), manager_.get(),
39590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        texture_ref, pname, value, error);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockGLES2Decoder> decoder_;
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockErrorState> error_state_;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use StrictMock to make 100% sure we know how GL will be called.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info_;
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TextureManager> manager_;
40490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture_ref_;
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureTest : public TextureTestBase {
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetUpBase(NULL, std::string());
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureMemoryTrackerTest : public TextureTestBase {
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetUpBase(mock_memory_tracker_.get(), std::string());
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MockMemoryTracker> mock_memory_tracker_;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool)   \
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*mock_memory_tracker_.get(),                          \
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              TrackMemoryAllocatedChange(old_size, new_size, pool)) \
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .Times(1).RetiresOnSaturation()
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, Basic) {
43090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0u, texture->target());
43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
43590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
43690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0, texture->num_uncleared_mips());
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
43890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
43990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->IsImmutable());
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR),
44190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            texture->min_filter());
44290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture->mag_filter());
44390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_s());
44490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_t());
44590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
44790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0u, texture->estimated_size());
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TextureTest, SetTargetTexture2D) {
45190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
45390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
45490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
45990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->IsImmutable());
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TextureTest, SetTargetTextureExternalOES) {
46390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES);
46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
46690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->IsImmutable());
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetStreamTexture(texture_ref_.get(), true);
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
47490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
47590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
47690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(TextureTest, ZeroSizeCanNotRender) {
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
488868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, EstimatedSize) {
506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
51890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(8u * 4u * 4u, texture_ref_->texture()->estimated_size());
519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
53090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(8u * 4u * 4u * 2u, texture_ref_->texture()->estimated_size());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureMemoryTrackerTest, EstimatedSize) {
534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged);
549868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add expectation for texture deletion.
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged);
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureMemoryTrackerTest, SetParameterPool) {
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
569868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
572868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
573868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged);
581868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(texture_ref_.get(),
582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_TEXTURE_POOL_CHROMIUM,
583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_TEXTURE_POOL_MANAGED_CHROMIUM,
584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_NO_ERROR);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add expectation for texture deletion.
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged);
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, POT2D) {
592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
59390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
59490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check Setting level 0 to POT
596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
61090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0, texture->num_uncleared_mips());
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set filters to something that will work with a single mip.
613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(
614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set them back.
618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(texture_ref_.get(),
619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_TEXTURE_MIN_FILTER,
620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_LINEAR_MIPMAP_LINEAR,
621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_NO_ERROR);
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make mips.
626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change a mip.
631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
64290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
644868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a level past the number of mips that would get generated.
648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         3,
651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make mips.
661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
66390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureMemoryTrackerTest, MarkMipmapsGenerated) {
668868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged);
670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged);
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged);
683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged);
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, UnusedMips) {
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set level zero to large size.
693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set level zero to large smaller (levels unused mips)
710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
72390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set an unused level to some size
727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         16,
732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         16,
733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
73890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, NPOT2D) {
745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check Setting level 0 to NPOT
749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         5,
755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
759868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(
766868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(
770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
773868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(
774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change it to POT.
778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
79090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
791868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, NPOT2DNPOTOK) {
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(), "GL_OES_texture_npot");
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_info->Initialize(NULL);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager.CreateTexture(kClient1Id, kService1Id);
80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
80590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref->texture();
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check Setting level 0 to NPOT
81090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetLevelInfo(texture_ref,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(manager.CanGenerateMipmaps(texture_ref));
81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(manager.CanRender(texture_ref));
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager.HaveUnrenderableTextures());
81790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(manager.MarkMipmapsGenerated(texture_ref));
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
81990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(manager.CanRender(texture_ref));
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager.HaveUnrenderableTextures());
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(false);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, POTCubeMap) {
825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP);
82690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check Setting level 0 each face to POT
829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_CUBE_MAP_POSITIVE_X,
831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
836868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
837868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
838868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
84090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
84190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
84290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
846868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
847868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
848868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
852868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
854868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
855868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
85790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
85890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
85990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
861868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
863868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
865868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
87490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
87590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
87690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
881868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
883868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
885868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
887868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
888868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
889868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
890868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
89290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
89390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
894868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
897868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
898868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
899868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
900868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
901868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
90890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
911868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
912868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
921868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
922868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
92590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
92690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
92790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make mips.
933868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
93490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
936868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change a mip.
940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
943868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
947868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
950868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
95390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a level past the number of mips that would get generated.
956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         3,
959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make mips.
969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
97190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, GetLevelSize) {
975868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
976868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
977868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
978868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
979868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
980868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         5,
982868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
984868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
985868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = -1;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = -1;
98990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
99090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height));
99190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height));
99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, width);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, height);
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveTexture(kClient1Id);
99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, width);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, height);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, GetLevelType) {
1003868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1004868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1005868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1006868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1007868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1008868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1009868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         5,
1010868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1011868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1012868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1013868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1014868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum type = -1;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum format = -1;
101790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
101890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, -1, &type, &format));
101990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format));
102090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &format));
102190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveTexture(kClient1Id);
102590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, ValidForTexture) {
1031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1032868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1035868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         5,
1038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad face.
104490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
104590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad level.
104990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad xoffset.
105290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad xoffset + width > width.
105590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad yoffset.
105890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad yoffset + height > height.
106190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad width.
106490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_RGBA, GL_UNSIGNED_BYTE));
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad height.
106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_RGBA, GL_UNSIGNED_BYTE));
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad format.
107090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGB, GL_UNSIGNED_BYTE));
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check bad type.
107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->ValidForTexture(
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4));
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check valid full size
107690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->ValidForTexture(
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check valid particial size.
107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->ValidForTexture(
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_RGBA, GL_UNSIGNED_BYTE));
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveTexture(kClient1Id);
108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->ValidForTexture(
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, FloatNotLinear) {
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(), "GL_OES_texture_float");
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_info->Initialize(NULL);
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager.CreateTexture(kClient1Id, kService1Id);
109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref->texture();
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
109990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetLevelInfo(texture_ref,
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestHelper::SetTexParameterWithExpectations(
1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gl_.get(), error_state_.get(), &manager,
110490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestHelper::SetTexParameterWithExpectations(
110790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gl_.get(), error_state_.get(), &manager, texture_ref,
110890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(false);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, FloatLinear) {
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear");
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_info->Initialize(NULL);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager.CreateTexture(kClient1Id, kService1Id);
112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
112290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
112390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref->texture();
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
112690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetLevelInfo(texture_ref,
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(false);
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, HalfFloatNotLinear) {
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(), "GL_OES_texture_half_float");
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_info->Initialize(NULL);
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager.CreateTexture(kClient1Id, kService1Id);
114090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
114190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
114290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
114390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref->texture();
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
114590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetLevelInfo(texture_ref,
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestHelper::SetTexParameterWithExpectations(
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      gl_.get(), error_state_.get(), &manager,
115090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestHelper::SetTexParameterWithExpectations(
115390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gl_.get(), error_state_.get(), &manager, texture_ref,
115490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(false);
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, HalfFloatLinear) {
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear");
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_info->Initialize(NULL);
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager.CreateTexture(kClient1Id, kService1Id);
116790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
116890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
116990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
117090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref->texture();
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
117290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetLevelInfo(texture_ref,
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(false);
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, EGLImageExternal) {
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(), "GL_OES_EGL_image_external");
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_info->Initialize(NULL);
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager.CreateTexture(kClient1Id, kService1Id);
118690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
118790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
118890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
118990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref->texture();
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
119190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(false);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, DepthTexture) {
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestHelper::SetupFeatureInfoInitExpectations(
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_.get(), "GL_ANGLE_depth_texture");
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  feature_info->Initialize(NULL);
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager manager(
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager.CreateTexture(kClient1Id, kService1Id);
120390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* texture_ref = manager.GetTexture(kClient1Id);
120490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
120590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  manager.SetTarget(texture_ref, GL_TEXTURE_2D);
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetLevelInfo(
120790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      texture_ref, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0,
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false);
120990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.Destroy(false);
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, SafeUnsafe) {
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kClient2Id = 2;
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kService2Id = 12;
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kClient3Id = 3;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kService3Id = 13;
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
121990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
122090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0, texture->num_uncleared_mips());
1221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
123390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->SafeToRenderFrom());
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
123690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1, texture->num_uncleared_mips());
1237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 0, true);
123890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
124190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0, texture->num_uncleared_mips());
1242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
125390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->SafeToRenderFrom());
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
125690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1, texture->num_uncleared_mips());
1257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 1, true);
125890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
126190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0, texture->num_uncleared_mips());
1262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
1273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->SafeToRenderFrom());
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
128790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(2, texture->num_uncleared_mips());
1288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 0, true);
128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->SafeToRenderFrom());
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
129290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1, texture->num_uncleared_mips());
1293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 1, true);
129490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
129790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0, texture->num_uncleared_mips());
1298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
130990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->SafeToRenderFrom());
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
131290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1, texture->num_uncleared_mips());
1313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->MarkMipmapsGenerated(texture_ref_.get());
131490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
131790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0, texture->num_uncleared_mips());
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateTexture(kClient2Id, kService2Id);
132090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture_ref2(
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager_->GetTexture(kClient2Id));
132290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref2.get() != NULL);
1323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref2.get(), GL_TEXTURE_2D);
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
132690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture2 = texture_ref2->texture();
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, texture2->num_uncleared_mips());
1328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref2.get(),
1329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, texture2->num_uncleared_mips());
1342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref2.get(),
1343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, texture2->num_uncleared_mips());
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateTexture(kClient3Id, kService3Id);
135890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture_ref3(
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager_->GetTexture(kClient3Id));
136090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(texture_ref3.get() != NULL);
1361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref3.get(), GL_TEXTURE_2D);
1362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref3.get(),
1363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
137590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture3 = texture_ref3->texture();
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, texture3->num_uncleared_mips());
1377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelCleared(texture_ref2.get(), GL_TEXTURE_2D, 0, true);
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, texture2->num_uncleared_mips());
1381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelCleared(texture_ref3.get(), GL_TEXTURE_2D, 0, true);
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, texture3->num_uncleared_mips());
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref2.get(),
1387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
1397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref3.get(),
1398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         8,
1403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, texture2->num_uncleared_mips());
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, texture3->num_uncleared_mips());
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveTexture(kClient3Id);
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveTexture(kClient2Id);
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
142190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture_ref2 = NULL;
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService3Id)))
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
142790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture_ref3 = NULL;
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, ClearTexture) {
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(true));
1435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
1447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
145890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
145990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->SafeToRenderFrom());
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
146290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(2, texture->num_uncleared_mips());
1463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->ClearRenderableLevels(decoder_.get(), texture_ref_.get());
146490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
146790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0, texture->num_uncleared_mips());
1468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
1479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1488868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
149090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->SafeToRenderFrom());
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
149390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(2, texture->num_uncleared_mips());
1494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->ClearTextureLevel(
1495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      decoder_.get(), texture_ref_.get(), GL_TEXTURE_2D, 0);
149690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->SafeToRenderFrom());
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnsafeTextures());
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnclearedMips());
149990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1, texture->num_uncleared_mips());
1500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->ClearTextureLevel(
1501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      decoder_.get(), texture_ref_.get(), GL_TEXTURE_2D, 1);
150290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnsafeTextures());
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnclearedMips());
150590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0, texture->num_uncleared_mips());
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, UseDeletedTexture) {
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kClient2Id = 2;
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kService2Id = 12;
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the default texture renderable
1512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make a new texture
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateTexture(kClient2Id, kService2Id);
152790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture_ref(
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager_->GetTexture(kClient2Id));
1529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref.get(), GL_TEXTURE_2D);
1530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref.get()));
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove it.
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveTexture(kClient2Id);
1534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_->CanRender(texture_ref.get()));
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->HaveUnrenderableTextures());
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we can still manipulate it and it effects the manager.
1537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref.get(),
1538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
1548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->CanRender(texture_ref.get()));
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->HaveUnrenderableTextures());
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
155390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture_ref = NULL;
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, GetLevelImage) {
1557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
156990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
157090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set image.
15727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  manager_->SetLevelImage(texture_ref_.get(),
15737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          GL_TEXTURE_2D,
15747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          1,
15757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          gfx::GLImage::CreateGLImage(0).get());
157690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove it.
1578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelImage(texture_ref_.get(), GL_TEXTURE_2D, 1, NULL);
157990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
15807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  manager_->SetLevelImage(texture_ref_.get(),
15817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          GL_TEXTURE_2D,
15827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          1,
15837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          gfx::GLImage::CreateGLImage(0).get());
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Image should be reset when SetLevelInfo is called.
1585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1588868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
159690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InSet(std::set<std::string>* string_set, const std::string& str) {
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::pair<std::set<std::string>::iterator, bool> result =
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string_set->insert(str);
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !result.second;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureTest, AddToSignature) {
1610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string signature1;
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string signature2;
1624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature1);
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> string_set;
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature1));
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check changing 1 thing makes a different signature.
1630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
1641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check putting it back makes the same signature.
1645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         true);
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(signature1, signature2);
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check setting cleared status does not change signature.
1661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1668868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1669868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(signature1, signature2);
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check changing other settings changes signature.
1677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         4,
1683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGB,
1731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_FLOAT,
1747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // put it back
1753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetLevelInfo(texture_ref_.get(),
1754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_TEXTURE_2D,
1755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         2,
1759868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         1,
1760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         0,
1761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_RGBA,
1762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         GL_UNSIGNED_BYTE,
1763868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         false);
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(signature1, signature2);
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check changing parameters changes signature.
1769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(
1770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1772868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(texture_ref_.get(),
1776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_TEXTURE_MIN_FILTER,
1777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_NEAREST_MIPMAP_LINEAR,
1778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               GL_NO_ERROR);
1779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(
1780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_ref_.get(), GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(
1786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_ref_.get(), GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR);
1787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(
1788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR);
1794868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(
1795868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1797868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InSet(&string_set, signature2));
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check putting it back genenerates the same signature
1801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetParameter(texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR);
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signature2.clear();
1803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(signature1, signature2);
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the set was acutally getting different signatures.
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(11u, string_set.size());
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ProduceConsumeTextureTest : public TextureTest {
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external");
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->CreateTexture(kClient2Id, kService2Id);
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    texture2_ = manager_->GetTexture(kClient2Id);
1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*decoder_.get(), GetErrorState())
1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .WillRepeatedly(Return(error_state_.get()));
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (texture2_.get()) {
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // If it's not in the manager then setting texture2_ to NULL will
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // delete the texture.
1825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!texture2_->client_id()) {
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Check that it gets deleted when the last reference is released.
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_CALL(
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            *gl_,
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            DeleteTextures(1, ::testing::Pointee(texture2_->service_id())))
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            .Times(1).RetiresOnSaturation();
18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      texture2_ = NULL;
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TextureTest::TearDown();
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct LevelInfo {
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LevelInfo(GLenum target,
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GLenum format,
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GLsizei width,
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GLsizei height,
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GLsizei depth,
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GLint border,
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GLenum type,
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              bool cleared)
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : target(target),
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          format(format),
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          width(width),
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          height(height),
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          depth(depth),
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          border(border),
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          type(type),
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          cleared(cleared) {}
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LevelInfo()
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : target(0),
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          format(0),
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          width(-1),
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          height(-1),
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          depth(1),
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          border(0),
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          type(0),
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          cleared(false) {}
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool operator==(const LevelInfo& other) const {
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return target == other.target && format == other.format &&
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             width == other.width && height == other.height &&
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             depth == other.depth && border == other.border &&
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             type == other.type && cleared == other.cleared;
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum target;
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum format;
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLsizei width;
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLsizei height;
18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLsizei depth;
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLint border;
18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum type;
18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool cleared;
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
188390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetLevelInfo(TextureRef* texture_ref,
188490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    GLint level,
188590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    const LevelInfo& info) {
188690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    manager_->SetLevelInfo(texture_ref,
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           info.target,
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           level,
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           info.format,
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           info.width,
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           info.height,
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           info.depth,
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           info.border,
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           info.format,
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           info.type,
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           info.cleared);
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
189990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static LevelInfo GetLevelInfo(const TextureRef* texture_ref,
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                GLint target,
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                GLint level) {
190290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const Texture* texture = texture_ref->texture();
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LevelInfo info;
19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.target = target;
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width,
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      &info.height));
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(texture->GetLevelType(target, level, &info.type,
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      &info.format));
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info.cleared = texture->IsLevelCleared(target, level);
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return info;
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Texture* Produce(TextureRef* texture_ref) {
1914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Texture* texture = manager_->Produce(texture_ref);
1915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(texture != NULL);
1916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return texture;
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void Consume(GLuint client_id, Texture* texture) {
1920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(manager_->Consume(client_id, texture));
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture2_;
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const GLuint kClient2Id;
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const GLuint kService2Id;
19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1930868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const GLuint ProduceConsumeTextureTest::kClient2Id = 2;
1931868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const GLuint ProduceConsumeTextureTest::kService2Id = 12;
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1933868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ProduceConsumeTextureTest, ProduceConsume2D) {
1934868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
193590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
193690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LevelInfo level0(
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true);
1939868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetLevelInfo(texture_ref_.get(), 0, level0);
1940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
194190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
194290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1);
194390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2);
1944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Texture* produced_texture = Produce(texture_ref_.get());
1945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(produced_texture, texture);
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make this texture bigger with more levels, and make sure they get
1948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // clobbered correctly during Consume().
1949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture2_.get(), GL_TEXTURE_2D);
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetLevelInfo(
1951868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture2_.get(),
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0,
19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false));
1954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_.get()));
195590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture = texture2_->texture();
195690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
195790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size());
1958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id = texture2_->client_id();
1960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->RemoveTexture(client_id);
1961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Consume(client_id, produced_texture);
1962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
1963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(produced_texture, restored_texture->texture());
1964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(level0, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 0));
1965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(level1, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 1));
1966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(level2, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 2));
1967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture = restored_texture->texture();
196890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(64U + 16U + 4U, texture->estimated_size());
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLint w, h;
1970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h));
1971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1972868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // However the old texture ref still exists if it was referenced somewhere.
1973868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1024U + 256U + 64U + 16U + 4U,
1974868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            texture2_->texture()->estimated_size());
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1977868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ProduceConsumeTextureTest, ProduceConsumeClearRectangle) {
1978868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_RECTANGLE_ARB);
197990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
198090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target());
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LevelInfo level0(
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
1983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetLevelInfo(texture_ref_.get(), 0, level0);
198490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1985868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Texture* produced_texture = Produce(texture_ref_.get());
1986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(produced_texture, texture);
1987868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB),
1988868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            produced_texture->target());
1989868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1990868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id = texture2_->client_id();
1991868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->RemoveTexture(client_id);
1992868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Consume(client_id, produced_texture);
1993868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
1994868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(produced_texture, restored_texture->texture());
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // See if we can clear the previously uncleared level now.
1997868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(level0,
1998868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            GetLevelInfo(restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(true));
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->ClearTextureLevel(
2002868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      decoder_.get(), restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2005868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ProduceConsumeTextureTest, ProduceConsumeStreamTexture) {
2006868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES);
200790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
200890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
2009868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetStreamTexture(texture_ref_.get(), true);
201090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GLuint service_id = texture->service_id();
2011868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Texture* produced_texture = Produce(texture_ref_.get());
2012868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(texture->IsStreamTexture());
2013868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2014868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id = texture2_->client_id();
2015868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->RemoveTexture(client_id);
2016868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Consume(client_id, produced_texture);
2017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2018868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(produced_texture, restored_texture->texture());
2019868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(restored_texture->texture()->IsStreamTexture());
2020868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(restored_texture->texture()->IsImmutable());
2021868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(service_id, restored_texture->service_id());
2022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ProduceConsumeTextureTest, ProduceConsumeCube) {
2025868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP);
202690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture = texture_ref_->texture();
202790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  GL_RGBA,
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  1,
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  1,
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  1,
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  0,
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  GL_UNSIGNED_BYTE,
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  true);
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  GL_RGBA,
20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  3,
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  3,
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  1,
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  0,
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  GL_UNSIGNED_BYTE,
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  true);
2044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetLevelInfo(texture_ref_.get(), 0, face0);
2045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetLevelInfo(texture_ref_.get(), 0, face5);
204690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
2047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Texture* produced_texture = Produce(texture_ref_.get());
2048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(produced_texture, texture);
2049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id = texture2_->client_id();
2051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->RemoveTexture(client_id);
2052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Consume(client_id, produced_texture);
2053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(produced_texture, restored_texture->texture());
2055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(
2056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      face0,
2057868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetLevelInfo(restored_texture.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0));
2058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(
2059868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      face5,
2060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetLevelInfo(restored_texture.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0));
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
206390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class CountingMemoryTracker : public MemoryTracker {
206490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
206590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CountingMemoryTracker() {
206690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    current_size_[0] = 0;
206790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    current_size_[1] = 0;
206890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
206990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
207090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void TrackMemoryAllocatedChange(size_t old_size,
207190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                          size_t new_size,
207290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                          Pool pool)  OVERRIDE {
207390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
207490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    current_size_[pool] += new_size - old_size;
207590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
207690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
207790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool EnsureGPUMemoryAvailable(size_t size_needed) OVERRIDE {
207890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return true;
207990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
208090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
208190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  size_t GetSize(Pool pool) {
208290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
208390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return current_size_[pool];
208490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
208590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
208690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
208790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~CountingMemoryTracker() {}
208890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
208990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  size_t current_size_[2];
209090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker);
209190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
209290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
209390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class SharedTextureTest : public testing::Test {
209490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
209590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SharedTextureTest()
209690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : feature_info_(new FeatureInfo()) {
209790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~SharedTextureTest() {
210090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void SetUp() {
210390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gl_.reset(new ::gfx::MockGLInterface());
210490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ::gfx::GLInterface::SetGLInterface(gl_.get());
210590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
210690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    memory_tracker1_ = new CountingMemoryTracker;
2107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    texture_manager1_.reset(
2108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new TextureManager(memory_tracker1_.get(),
2109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           feature_info_.get(),
2110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           TextureManagerTest::kMaxTextureSize,
2111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           TextureManagerTest::kMaxCubeMapTextureSize));
211290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    memory_tracker2_ = new CountingMemoryTracker;
2113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    texture_manager2_.reset(
2114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new TextureManager(memory_tracker2_.get(),
2115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           feature_info_.get(),
2116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           TextureManagerTest::kMaxTextureSize,
2117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           TextureManagerTest::kMaxCubeMapTextureSize));
211890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
211990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    texture_manager1_->Initialize();
212090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
212190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    texture_manager2_->Initialize();
212290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
212390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
212490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void TearDown() {
212590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    texture_manager2_->Destroy(false);
212690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    texture_manager2_.reset();
212790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    texture_manager1_->Destroy(false);
212890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    texture_manager1_.reset();
212990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ::gfx::GLInterface::SetGLInterface(NULL);
213090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gl_.reset();
213190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
213290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
213390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
213490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr< ::gfx::MockGLInterface > gl_;
213590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info_;
213690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<CountingMemoryTracker> memory_tracker1_;
213790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<TextureManager> texture_manager1_;
213890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<CountingMemoryTracker> memory_tracker2_;
213990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<TextureManager> texture_manager2_;
214090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
214190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
214290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(SharedTextureTest, DeleteTextures) {
214390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<TextureRef> ref2 =
2145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_manager2_->Consume(20, ref1->texture());
214690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, _))
214790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(0);
214890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ref1 = NULL;
214990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture_manager1_->RemoveTexture(10);
215090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  testing::Mock::VerifyAndClearExpectations(gl_.get());
215190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
215290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, _))
215390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(1)
215490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .RetiresOnSaturation();
215590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ref2 = NULL;
2156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager2_->RemoveTexture(20);
215790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  testing::Mock::VerifyAndClearExpectations(gl_.get());
215890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
215990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
216090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(SharedTextureTest, TextureSafetyAccounting) {
216190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
216290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
216390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
216490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
216590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
216690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
216790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Newly created texture is renderable.
216990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
217090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
217190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
217290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
217390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
217490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Associate new texture ref to other texture manager, should account for it
217590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // too.
2176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<TextureRef> ref2 =
2177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_manager2_->Consume(20, ref1->texture());
217890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
217990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
218090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
218190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
218290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Make texture renderable but uncleared on one texture manager, should affect
218390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // other one.
2184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
218590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures());
218690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
218790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
218890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture_manager2_->HaveUnrenderableTextures());
218990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
219090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
219190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager1_->SetLevelInfo(ref1.get(),
2193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_TEXTURE_2D,
2194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  0,
2195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_RGBA,
2196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  0,
2200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_RGBA,
2201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_UNSIGNED_BYTE,
2202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  false);
220390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
220490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture_manager1_->HaveUnsafeTextures());
220590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture_manager1_->HaveUnclearedMips());
220690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
220790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture_manager2_->HaveUnsafeTextures());
220890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(texture_manager2_->HaveUnclearedMips());
220990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
221090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Make texture cleared on one texture manager, should affect other one.
2211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager1_->SetLevelCleared(ref1.get(), GL_TEXTURE_2D, 0, true);
221290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
221390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
221490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
221590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
221690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
221790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, _))
221890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(1)
221990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .RetiresOnSaturation();
222090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture_manager1_->RemoveTexture(10);
2221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager2_->RemoveTexture(20);
222290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
222390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
222490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(SharedTextureTest, FBOCompletenessCheck) {
222590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE;
222690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FramebufferManager framebuffer_manager1(1, 1);
222790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture_manager1_->set_framebuffer_manager(&framebuffer_manager1);
222890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FramebufferManager framebuffer_manager2(1, 1);
222990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture_manager2_->set_framebuffer_manager(&framebuffer_manager2);
223090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
223190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
223290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  framebuffer_manager1.CreateFramebuffer(10, 10);
223390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<Framebuffer> framebuffer1 =
223490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      framebuffer_manager1.GetFramebuffer(10);
2235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  framebuffer1->AttachTexture(
22367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GL_COLOR_ATTACHMENT0, ref1.get(), GL_TEXTURE_2D, 0, 0);
2237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1.get()));
223890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete());
223990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
224090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Make FBO complete in manager 1.
2241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager1_->SetLevelInfo(ref1.get(),
2243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_TEXTURE_2D,
2244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  0,
2245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_RGBA,
2246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  0,
2250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_RGBA,
2251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_UNSIGNED_BYTE,
2252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  true);
225390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
2254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  framebuffer_manager1.MarkAsComplete(framebuffer1.get());
2255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1.get()));
225690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
225790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Share texture with manager 2.
2258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<TextureRef> ref2 =
2259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_manager2_->Consume(20, ref1->texture());
226090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  framebuffer_manager2.CreateFramebuffer(20, 20);
226190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<Framebuffer> framebuffer2 =
226290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      framebuffer_manager2.GetFramebuffer(20);
2263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  framebuffer2->AttachTexture(
22647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GL_COLOR_ATTACHMENT0, ref2.get(), GL_TEXTURE_2D, 0, 0);
2265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2.get()));
226690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
2267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  framebuffer_manager2.MarkAsComplete(framebuffer2.get());
2268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2.get()));
226990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
227090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Change level for texture, both FBOs should be marked incomplete
2271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager1_->SetLevelInfo(ref1.get(),
2272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_TEXTURE_2D,
2273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  0,
2274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_RGBA,
2275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  0,
2279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_RGBA,
2280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_UNSIGNED_BYTE,
2281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  true);
2282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1.get()));
228390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
2284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  framebuffer_manager1.MarkAsComplete(framebuffer1.get());
2285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1.get()));
2286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2.get()));
228790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
2288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  framebuffer_manager2.MarkAsComplete(framebuffer2.get());
2289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2.get()));
229090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
229190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _))
229290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(2)
229390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .RetiresOnSaturation();
229490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  framebuffer_manager1.RemoveFramebuffer(10);
229590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  framebuffer_manager2.RemoveFramebuffer(20);
229690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, _))
229790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(1)
229890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .RetiresOnSaturation();
229990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture_manager1_->RemoveTexture(10);
2300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager2_->RemoveTexture(20);
230190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
230290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
230390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(SharedTextureTest, Memory) {
230490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged);
230590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged);
230690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
230790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Newly created texture is unrenderable.
230890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager1_->SetLevelInfo(ref1.get(),
2311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_TEXTURE_2D,
2312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  0,
2313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_RGBA,
2314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  10,
2315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  10,
2316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  1,
2317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  0,
2318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_RGBA,
2319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  GL_UNSIGNED_BYTE,
2320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  false);
232190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
232290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_LT(0u, ref1->texture()->estimated_size());
232390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
232490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
232590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
232690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Associate new texture ref to other texture manager, it doesn't account for
232790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // the texture memory, the first memory tracker still has it.
2328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<TextureRef> ref2 =
2329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      texture_manager2_->Consume(20, ref1->texture());
233090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
233190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
233290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(initial_memory2,
233390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
233490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
233590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Delete the texture, memory should go to the remaining tracker.
233690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  texture_manager1_->RemoveTexture(10);
233790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ref1 = NULL;
233890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(initial_memory1,
233990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
234090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(),
234190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
234290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
234390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, _))
234490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Times(1)
234590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .RetiresOnSaturation();
234690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ref2 = NULL;
2347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  texture_manager2_->RemoveTexture(20);
234890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(initial_memory2,
234990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
235090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
235190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
235290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace gles2
235390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace gpu
2354