Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1090)

Side by Side Diff: gpu/command_buffer/service/texture_manager_unittest.cc

Issue 14844004: gpu: Refactor to support cross-channel shared textures (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix accidentally reverted behavior Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gpu/command_buffer/service/texture_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/texture_manager.h" 5 #include "gpu/command_buffer/service/texture_manager.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "gpu/command_buffer/service/error_state_mock.h" 8 #include "gpu/command_buffer/service/error_state_mock.h"
9 #include "gpu/command_buffer/service/feature_info.h" 9 #include "gpu/command_buffer/service/feature_info.h"
10 #include "gpu/command_buffer/service/framebuffer_manager.h"
10 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" 11 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
11 #include "gpu/command_buffer/service/memory_tracking.h" 12 #include "gpu/command_buffer/service/memory_tracking.h"
12 #include "gpu/command_buffer/service/mocks.h" 13 #include "gpu/command_buffer/service/mocks.h"
13 #include "gpu/command_buffer/service/test_helper.h" 14 #include "gpu/command_buffer/service/test_helper.h"
14 #include "gpu/command_buffer/service/texture_definition.h" 15 #include "gpu/command_buffer/service/texture_definition.h"
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 #include "ui/gl/gl_mock.h" 17 #include "ui/gl/gl_mock.h"
17 18
18 using ::testing::AtLeast; 19 using ::testing::AtLeast;
19 using ::testing::Pointee; 20 using ::testing::Pointee;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 } 69 }
69 70
70 virtual void TearDown() { 71 virtual void TearDown() {
71 manager_->Destroy(false); 72 manager_->Destroy(false);
72 manager_.reset(); 73 manager_.reset();
73 ::gfx::GLInterface::SetGLInterface(NULL); 74 ::gfx::GLInterface::SetGLInterface(NULL);
74 gl_.reset(); 75 gl_.reset();
75 } 76 }
76 77
77 void SetParameter( 78 void SetParameter(
78 Texture* texture, GLenum pname, GLint value, GLenum error) { 79 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
79 TestHelper::SetTexParameterWithExpectations( 80 TestHelper::SetTexParameterWithExpectations(
80 gl_.get(), error_state_.get(), manager_.get(), 81 gl_.get(), error_state_.get(), manager_.get(),
81 texture, pname, value, error); 82 texture_ref, pname, value, error);
82 } 83 }
83 84
84 // Use StrictMock to make 100% sure we know how GL will be called. 85 // Use StrictMock to make 100% sure we know how GL will be called.
85 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; 86 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
86 scoped_refptr<FeatureInfo> feature_info_; 87 scoped_refptr<FeatureInfo> feature_info_;
87 scoped_ptr<TextureManager> manager_; 88 scoped_ptr<TextureManager> manager_;
88 scoped_ptr<MockErrorState> error_state_; 89 scoped_ptr<MockErrorState> error_state_;
89 }; 90 };
90 91
91 // GCC requires these declarations, but MSVC requires they not be present 92 // GCC requires these declarations, but MSVC requires they not be present
92 #ifndef COMPILER_MSVC 93 #ifndef COMPILER_MSVC
93 const GLint TextureManagerTest::kMaxTextureSize; 94 const GLint TextureManagerTest::kMaxTextureSize;
94 const GLint TextureManagerTest::kMaxCubeMapTextureSize; 95 const GLint TextureManagerTest::kMaxCubeMapTextureSize;
95 const GLint TextureManagerTest::kMaxExternalTextureSize; 96 const GLint TextureManagerTest::kMaxExternalTextureSize;
96 const GLint TextureManagerTest::kMax2dLevels; 97 const GLint TextureManagerTest::kMax2dLevels;
97 const GLint TextureManagerTest::kMaxCubeMapLevels; 98 const GLint TextureManagerTest::kMaxCubeMapLevels;
98 const GLint TextureManagerTest::kMaxExternalLevels; 99 const GLint TextureManagerTest::kMaxExternalLevels;
99 #endif 100 #endif
100 101
101 TEST_F(TextureManagerTest, Basic) { 102 TEST_F(TextureManagerTest, Basic) {
102 const GLuint kClient1Id = 1; 103 const GLuint kClient1Id = 1;
103 const GLuint kService1Id = 11; 104 const GLuint kService1Id = 11;
104 const GLuint kClient2Id = 2; 105 const GLuint kClient2Id = 2;
105 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 106 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
106 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 107 EXPECT_FALSE(manager_->HaveUnsafeTextures());
107 EXPECT_FALSE(manager_->HaveUnclearedMips()); 108 EXPECT_FALSE(manager_->HaveUnclearedMips());
108 // Check we can create texture. 109 // Check we can create texture.
109 manager_->CreateTexture(kClient1Id, kService1Id); 110 manager_->CreateTexture(kClient1Id, kService1Id);
110 // Check texture got created. 111 // Check texture got created.
111 Texture* texture = manager_->GetTexture(kClient1Id); 112 TextureRef* texture = manager_->GetTexture(kClient1Id);
112 ASSERT_TRUE(texture != NULL); 113 ASSERT_TRUE(texture != NULL);
113 EXPECT_EQ(kService1Id, texture->service_id()); 114 EXPECT_EQ(kService1Id, texture->service_id());
114 GLuint client_id = 0; 115 GLuint client_id = 0;
115 EXPECT_TRUE(manager_->GetClientId(texture->service_id(), &client_id)); 116 EXPECT_TRUE(manager_->GetClientId(texture->service_id(), &client_id));
116 EXPECT_EQ(kClient1Id, client_id); 117 EXPECT_EQ(kClient1Id, client_id);
117 // Check we get nothing for a non-existent texture. 118 // Check we get nothing for a non-existent texture.
118 EXPECT_TRUE(manager_->GetTexture(kClient2Id) == NULL); 119 EXPECT_TRUE(manager_->GetTexture(kClient2Id) == NULL);
119 // Check trying to a remove non-existent textures does not crash. 120 // Check trying to a remove non-existent textures does not crash.
120 manager_->RemoveTexture(kClient2Id); 121 manager_->RemoveTexture(kClient2Id);
121 // Check that it gets deleted when the last reference is released. 122 // Check that it gets deleted when the last reference is released.
122 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id))) 123 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
123 .Times(1) 124 .Times(1)
124 .RetiresOnSaturation(); 125 .RetiresOnSaturation();
125 // Check we can't get the texture after we remove it. 126 // Check we can't get the texture after we remove it.
126 manager_->RemoveTexture(kClient1Id); 127 manager_->RemoveTexture(kClient1Id);
127 EXPECT_TRUE(manager_->GetTexture(kClient1Id) == NULL); 128 EXPECT_TRUE(manager_->GetTexture(kClient1Id) == NULL);
128 } 129 }
129 130
130 TEST_F(TextureManagerTest, SetParameter) { 131 TEST_F(TextureManagerTest, SetParameter) {
131 const GLuint kClient1Id = 1; 132 const GLuint kClient1Id = 1;
132 const GLuint kService1Id = 11; 133 const GLuint kService1Id = 11;
133 // Check we can create texture. 134 // Check we can create texture.
134 manager_->CreateTexture(kClient1Id, kService1Id); 135 manager_->CreateTexture(kClient1Id, kService1Id);
135 // Check texture got created. 136 // Check texture got created.
136 Texture* texture = manager_->GetTexture(kClient1Id); 137 TextureRef* texture_ref = manager_->GetTexture(kClient1Id);
137 manager_->SetTarget(texture, GL_TEXTURE_2D); 138 ASSERT_TRUE(texture_ref != NULL);
138 ASSERT_TRUE(texture != NULL); 139 Texture* texture = texture_ref->texture();
139 SetParameter(texture, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR); 140 manager_->SetTarget(texture_ref, GL_TEXTURE_2D);
141 SetParameter(texture_ref, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
140 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter()); 142 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
141 SetParameter(texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); 143 SetParameter(texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
142 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->mag_filter()); 144 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->mag_filter());
143 SetParameter(texture, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); 145 SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
144 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s()); 146 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
145 SetParameter(texture, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); 147 SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
146 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t()); 148 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
147 SetParameter(texture, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1, GL_NO_ERROR); 149 SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1, GL_NO_ERROR);
148 SetParameter(texture, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2, GL_NO_ERROR); 150 SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2, GL_NO_ERROR);
149 SetParameter( 151 SetParameter(
150 texture, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM); 152 texture_ref, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
151 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter()); 153 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
152 SetParameter( 154 SetParameter(
153 texture, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM); 155 texture_ref, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
154 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter()); 156 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
155 SetParameter(texture, GL_TEXTURE_WRAP_S, GL_NEAREST, GL_INVALID_ENUM); 157 SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_NEAREST, GL_INVALID_ENUM);
156 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s()); 158 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
157 SetParameter(texture, GL_TEXTURE_WRAP_T, GL_NEAREST, GL_INVALID_ENUM); 159 SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_NEAREST, GL_INVALID_ENUM);
158 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t()); 160 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
159 SetParameter(texture, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE); 161 SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE);
160 } 162 }
161 163
162 TEST_F(TextureManagerTest, TextureUsageExt) { 164 TEST_F(TextureManagerTest, TextureUsageExt) {
163 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), 165 TestHelper::SetupTextureManagerInitExpectations(gl_.get(),
164 "GL_ANGLE_texture_usage"); 166 "GL_ANGLE_texture_usage");
165 TextureManager manager( 167 TextureManager manager(
166 NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 168 NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
167 manager.Initialize(); 169 manager.Initialize();
168 const GLuint kClient1Id = 1; 170 const GLuint kClient1Id = 1;
169 const GLuint kService1Id = 11; 171 const GLuint kService1Id = 11;
170 // Check we can create texture. 172 // Check we can create texture.
171 manager.CreateTexture(kClient1Id, kService1Id); 173 manager.CreateTexture(kClient1Id, kService1Id);
172 // Check texture got created. 174 // Check texture got created.
173 Texture* texture = manager.GetTexture(kClient1Id); 175 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
174 ASSERT_TRUE(texture != NULL); 176 ASSERT_TRUE(texture_ref != NULL);
175 TestHelper::SetTexParameterWithExpectations( 177 TestHelper::SetTexParameterWithExpectations(
176 gl_.get(), error_state_.get(), &manager, texture, 178 gl_.get(), error_state_.get(), &manager, texture_ref,
177 GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE,GL_NO_ERROR); 179 GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE,GL_NO_ERROR);
178 EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE), 180 EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE),
179 texture->usage()); 181 texture_ref->texture()->usage());
180 manager.Destroy(false); 182 manager.Destroy(false);
181 } 183 }
182 184
183 TEST_F(TextureManagerTest, Destroy) { 185 TEST_F(TextureManagerTest, Destroy) {
184 const GLuint kClient1Id = 1; 186 const GLuint kClient1Id = 1;
185 const GLuint kService1Id = 11; 187 const GLuint kService1Id = 11;
186 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); 188 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
187 TextureManager manager( 189 TextureManager manager(
188 NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 190 NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
189 manager.Initialize(); 191 manager.Initialize();
190 // Check we can create texture. 192 // Check we can create texture.
191 manager.CreateTexture(kClient1Id, kService1Id); 193 manager.CreateTexture(kClient1Id, kService1Id);
192 // Check texture got created. 194 // Check texture got created.
193 Texture* texture = manager.GetTexture(kClient1Id); 195 TextureRef* texture = manager.GetTexture(kClient1Id);
194 ASSERT_TRUE(texture != NULL); 196 ASSERT_TRUE(texture != NULL);
195 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id))) 197 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
196 .Times(1) 198 .Times(1)
197 .RetiresOnSaturation(); 199 .RetiresOnSaturation();
198 TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), ""); 200 TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), "");
199 manager.Destroy(true); 201 manager.Destroy(true);
200 // Check that resources got freed. 202 // Check that resources got freed.
201 texture = manager.GetTexture(kClient1Id); 203 texture = manager.GetTexture(kClient1Id);
202 ASSERT_TRUE(texture == NULL); 204 ASSERT_TRUE(texture == NULL);
203 } 205 }
204 206
205 TEST_F(TextureManagerTest, DestroyUnowned) { 207 TEST_F(TextureManagerTest, DestroyUnowned) {
206 const GLuint kClient1Id = 1; 208 const GLuint kClient1Id = 1;
207 const GLuint kService1Id = 11; 209 const GLuint kService1Id = 11;
208 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); 210 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
209 TextureManager manager( 211 TextureManager manager(
210 NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 212 NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
211 manager.Initialize(); 213 manager.Initialize();
212 // Check we can create texture. 214 // Check we can create texture.
213 Texture* created_texture = 215 TextureRef* created_texture =
214 manager.CreateTexture(kClient1Id, kService1Id); 216 manager.CreateTexture(kClient1Id, kService1Id);
215 created_texture->SetNotOwned(); 217 created_texture->texture()->SetNotOwned();
216 218
217 // Check texture got created. 219 // Check texture got created.
218 Texture* texture = manager.GetTexture(kClient1Id); 220 TextureRef* texture = manager.GetTexture(kClient1Id);
219 ASSERT_TRUE(texture != NULL); 221 ASSERT_TRUE(texture != NULL);
220 222
221 // Check that it is not freed if it is not owned. 223 // Check that it is not freed if it is not owned.
222 TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), ""); 224 TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), "");
223 manager.Destroy(true); 225 manager.Destroy(true);
224 texture = manager.GetTexture(kClient1Id); 226 texture = manager.GetTexture(kClient1Id);
225 ASSERT_TRUE(texture == NULL); 227 ASSERT_TRUE(texture == NULL);
226 } 228 }
227 229
228 TEST_F(TextureManagerTest, MaxValues) { 230 TEST_F(TextureManagerTest, MaxValues) {
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 static const GLint kMaxCubeMapTextureSize = 8; 360 static const GLint kMaxCubeMapTextureSize = 8;
359 static const GLint kMax2dLevels = 5; 361 static const GLint kMax2dLevels = 5;
360 static const GLint kMaxCubeMapLevels = 4; 362 static const GLint kMaxCubeMapLevels = 4;
361 static const GLuint kClient1Id = 1; 363 static const GLuint kClient1Id = 1;
362 static const GLuint kService1Id = 11; 364 static const GLuint kService1Id = 11;
363 365
364 TextureTestBase() 366 TextureTestBase()
365 : feature_info_(new FeatureInfo()) { 367 : feature_info_(new FeatureInfo()) {
366 } 368 }
367 virtual ~TextureTestBase() { 369 virtual ~TextureTestBase() {
368 texture_ = NULL; 370 texture_ref_ = NULL;
369 } 371 }
370 372
371 protected: 373 protected:
372 void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) { 374 void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) {
373 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); 375 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
374 ::gfx::GLInterface::SetGLInterface(gl_.get()); 376 ::gfx::GLInterface::SetGLInterface(gl_.get());
375 377
376 if (!extensions.empty()) { 378 if (!extensions.empty()) {
377 TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), 379 TestHelper::SetupFeatureInfoInitExpectations(gl_.get(),
378 extensions.c_str()); 380 extensions.c_str());
379 feature_info_->Initialize(NULL); 381 feature_info_->Initialize(NULL);
380 } 382 }
381 383
382 manager_.reset(new TextureManager( 384 manager_.reset(new TextureManager(
383 memory_tracker, feature_info_.get(), 385 memory_tracker, feature_info_.get(),
384 kMaxTextureSize, kMaxCubeMapTextureSize)); 386 kMaxTextureSize, kMaxCubeMapTextureSize));
385 decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>()); 387 decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>());
386 error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); 388 error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
387 manager_->CreateTexture(kClient1Id, kService1Id); 389 manager_->CreateTexture(kClient1Id, kService1Id);
388 texture_ = manager_->GetTexture(kClient1Id); 390 texture_ref_ = manager_->GetTexture(kClient1Id);
389 ASSERT_TRUE(texture_.get() != NULL); 391 ASSERT_TRUE(texture_ref_.get() != NULL);
390 } 392 }
391 393
392 virtual void TearDown() { 394 virtual void TearDown() {
393 if (texture_.get()) { 395 if (texture_ref_.get()) {
394 GLuint client_id = 0; 396 GLuint client_id = 0;
395 // If it's not in the manager then setting texture_ to NULL will 397 // If it's not in the manager then setting texture_ref_ to NULL will
396 // delete the texture. 398 // delete the texture.
397 if (!manager_->GetClientId(texture_->service_id(), &client_id)) { 399 if (!manager_->GetClientId(texture_ref_->service_id(), &client_id)) {
398 // Check that it gets deleted when the last reference is released. 400 // Check that it gets deleted when the last reference is released.
399 EXPECT_CALL(*gl_, 401 EXPECT_CALL(*gl_,
400 DeleteTextures(1, ::testing::Pointee(texture_->service_id()))) 402 DeleteTextures(1, ::testing::Pointee(texture_ref_->service_id())))
401 .Times(1) 403 .Times(1)
402 .RetiresOnSaturation(); 404 .RetiresOnSaturation();
403 } 405 }
404 texture_ = NULL; 406 texture_ref_ = NULL;
405 } 407 }
406 manager_->Destroy(false); 408 manager_->Destroy(false);
407 manager_.reset(); 409 manager_.reset();
408 ::gfx::GLInterface::SetGLInterface(NULL); 410 ::gfx::GLInterface::SetGLInterface(NULL);
409 gl_.reset(); 411 gl_.reset();
410 } 412 }
411 413
412 void SetParameter( 414 void SetParameter(
413 Texture* texture, GLenum pname, GLint value, GLenum error) { 415 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
414 TestHelper::SetTexParameterWithExpectations( 416 TestHelper::SetTexParameterWithExpectations(
415 gl_.get(), error_state_.get(), manager_.get(), 417 gl_.get(), error_state_.get(), manager_.get(),
416 texture, pname, value, error); 418 texture_ref, pname, value, error);
417 } 419 }
418 420
419 scoped_ptr<MockGLES2Decoder> decoder_; 421 scoped_ptr<MockGLES2Decoder> decoder_;
420 scoped_ptr<MockErrorState> error_state_; 422 scoped_ptr<MockErrorState> error_state_;
421 // Use StrictMock to make 100% sure we know how GL will be called. 423 // Use StrictMock to make 100% sure we know how GL will be called.
422 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; 424 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
423 scoped_refptr<FeatureInfo> feature_info_; 425 scoped_refptr<FeatureInfo> feature_info_;
424 scoped_ptr<TextureManager> manager_; 426 scoped_ptr<TextureManager> manager_;
425 scoped_refptr<Texture> texture_; 427 scoped_refptr<TextureRef> texture_ref_;
426 }; 428 };
427 429
428 class TextureTest : public TextureTestBase { 430 class TextureTest : public TextureTestBase {
429 protected: 431 protected:
430 virtual void SetUp() { 432 virtual void SetUp() {
431 SetUpBase(NULL, std::string()); 433 SetUpBase(NULL, std::string());
432 } 434 }
433 }; 435 };
434 436
435 class TextureMemoryTrackerTest : public TextureTestBase { 437 class TextureMemoryTrackerTest : public TextureTestBase {
436 protected: 438 protected:
437 virtual void SetUp() { 439 virtual void SetUp() {
438 mock_memory_tracker_ = new StrictMock<MockMemoryTracker>(); 440 mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
439 SetUpBase(mock_memory_tracker_.get(), std::string()); 441 SetUpBase(mock_memory_tracker_.get(), std::string());
440 } 442 }
441 443
442 scoped_refptr<MockMemoryTracker> mock_memory_tracker_; 444 scoped_refptr<MockMemoryTracker> mock_memory_tracker_;
443 }; 445 };
444 446
445 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \ 447 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \
446 EXPECT_CALL(*mock_memory_tracker_, \ 448 EXPECT_CALL(*mock_memory_tracker_, \
447 TrackMemoryAllocatedChange(old_size, new_size, pool)) \ 449 TrackMemoryAllocatedChange(old_size, new_size, pool)) \
448 .Times(1) \ 450 .Times(1) \
449 .RetiresOnSaturation() \ 451 .RetiresOnSaturation() \
450 452
451 TEST_F(TextureTest, Basic) { 453 TEST_F(TextureTest, Basic) {
452 EXPECT_EQ(0u, texture_->target()); 454 Texture* texture = texture_ref_->texture();
453 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 455 EXPECT_EQ(0u, texture->target());
454 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); 456 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
455 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); 457 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
456 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 458 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
457 EXPECT_EQ(0, texture_->num_uncleared_mips()); 459 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
458 EXPECT_FALSE(manager_->CanRender(texture_)); 460 EXPECT_EQ(0, texture->num_uncleared_mips());
459 EXPECT_TRUE(texture_->SafeToRenderFrom()); 461 EXPECT_FALSE(manager_->CanRender(texture_ref_));
460 EXPECT_FALSE(texture_->IsImmutable()); 462 EXPECT_TRUE(texture->SafeToRenderFrom());
463 EXPECT_FALSE(texture->IsImmutable());
461 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR), 464 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR),
462 texture_->min_filter()); 465 texture->min_filter());
463 EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture_->mag_filter()); 466 EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture->mag_filter());
464 EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture_->wrap_s()); 467 EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_s());
465 EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture_->wrap_t()); 468 EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_t());
466 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 469 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
467 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 470 EXPECT_FALSE(manager_->HaveUnsafeTextures());
468 EXPECT_EQ(0u, texture_->estimated_size()); 471 EXPECT_EQ(0u, texture->estimated_size());
469 } 472 }
470 473
471 TEST_F(TextureTest, SetTargetTexture2D) { 474 TEST_F(TextureTest, SetTargetTexture2D) {
472 manager_->SetTarget(texture_, GL_TEXTURE_2D); 475 Texture* texture = texture_ref_->texture();
473 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 476 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
474 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); 477 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
475 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); 478 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
476 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 479 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
477 EXPECT_FALSE(manager_->CanRender(texture_)); 480 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
478 EXPECT_TRUE(texture_->SafeToRenderFrom()); 481 EXPECT_FALSE(manager_->CanRender(texture_ref_));
479 EXPECT_FALSE(texture_->IsImmutable()); 482 EXPECT_TRUE(texture->SafeToRenderFrom());
483 EXPECT_FALSE(texture->IsImmutable());
480 } 484 }
481 485
482 TEST_F(TextureTest, SetTargetTextureExternalOES) { 486 TEST_F(TextureTest, SetTargetTextureExternalOES) {
483 manager_->SetTarget(texture_, GL_TEXTURE_EXTERNAL_OES); 487 Texture* texture = texture_ref_->texture();
484 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 488 manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES);
485 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); 489 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
486 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); 490 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
487 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture_)); 491 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
488 EXPECT_FALSE(manager_->CanRender(texture_)); 492 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
489 EXPECT_TRUE(texture_->SafeToRenderFrom()); 493 EXPECT_FALSE(manager_->CanRender(texture_ref_));
490 EXPECT_TRUE(texture_->IsImmutable()); 494 EXPECT_TRUE(texture->SafeToRenderFrom());
491 manager_->SetStreamTexture(texture_, true); 495 EXPECT_TRUE(texture->IsImmutable());
492 EXPECT_TRUE(manager_->CanRender(texture_)); 496 manager_->SetStreamTexture(texture_ref_, true);
497 EXPECT_TRUE(manager_->CanRender(texture_ref_));
493 } 498 }
494 499
495 TEST_F(TextureTest, ZeroSizeCanNotRender) { 500 TEST_F(TextureTest, ZeroSizeCanNotRender) {
496 manager_->SetTarget(texture_, GL_TEXTURE_2D); 501 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
497 EXPECT_FALSE(manager_->CanRender(texture_)); 502 EXPECT_FALSE(manager_->CanRender(texture_ref_));
498 manager_->SetLevelInfo(texture_, 503 manager_->SetLevelInfo(texture_ref_,
499 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 504 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
500 EXPECT_TRUE(manager_->CanRender(texture_)); 505 EXPECT_TRUE(manager_->CanRender(texture_ref_));
501 manager_->SetLevelInfo(texture_, 506 manager_->SetLevelInfo(texture_ref_,
502 GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 507 GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
503 EXPECT_FALSE(manager_->CanRender(texture_)); 508 EXPECT_FALSE(manager_->CanRender(texture_ref_));
504 } 509 }
505 510
506 TEST_F(TextureTest, EstimatedSize) { 511 TEST_F(TextureTest, EstimatedSize) {
507 manager_->SetTarget(texture_, GL_TEXTURE_2D); 512 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
508 manager_->SetLevelInfo(texture_, 513 manager_->SetLevelInfo(texture_ref_,
509 GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 514 GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
510 EXPECT_EQ(8u * 4u * 4u, texture_->estimated_size()); 515 EXPECT_EQ(8u * 4u * 4u, texture_ref_->texture()->estimated_size());
511 manager_->SetLevelInfo(texture_, 516 manager_->SetLevelInfo(texture_ref_,
512 GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 517 GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
513 EXPECT_EQ(8u * 4u * 4u * 2u, texture_->estimated_size()); 518 EXPECT_EQ(8u * 4u * 4u * 2u, texture_ref_->texture()->estimated_size());
514 } 519 }
515 520
516 TEST_F(TextureMemoryTrackerTest, EstimatedSize) { 521 TEST_F(TextureMemoryTrackerTest, EstimatedSize) {
517 manager_->SetTarget(texture_, GL_TEXTURE_2D); 522 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
518 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged); 523 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
519 manager_->SetLevelInfo(texture_, 524 manager_->SetLevelInfo(texture_ref_,
520 GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 525 GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
521 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged); 526 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
522 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged); 527 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged);
523 manager_->SetLevelInfo(texture_, 528 manager_->SetLevelInfo(texture_ref_,
524 GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 529 GL_TEXTURE_2D, 2, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
525 // Add expectation for texture deletion. 530 // Add expectation for texture deletion.
526 EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged); 531 EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged);
527 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged); 532 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
528 } 533 }
529 534
530 TEST_F(TextureMemoryTrackerTest, SetParameterPool) { 535 TEST_F(TextureMemoryTrackerTest, SetParameterPool) {
531 manager_->SetTarget(texture_, GL_TEXTURE_2D); 536 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
532 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged); 537 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
533 manager_->SetLevelInfo(texture_, 538 manager_->SetLevelInfo(texture_ref_,
534 GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 539 GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
535 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged); 540 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
536 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged); 541 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged);
537 SetParameter( 542 SetParameter(
538 texture_, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_MANAGED_CHROMIUM, 543 texture_ref_, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_MANAGED_CHROMIUM,
539 GL_NO_ERROR); 544 GL_NO_ERROR);
540 // Add expectation for texture deletion. 545 // Add expectation for texture deletion.
541 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged); 546 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged);
542 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged); 547 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
543 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged); 548 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged);
544 } 549 }
545 550
546 TEST_F(TextureTest, POT2D) { 551 TEST_F(TextureTest, POT2D) {
547 manager_->SetTarget(texture_, GL_TEXTURE_2D); 552 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
548 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target()); 553 Texture* texture = texture_ref_->texture();
554 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
549 // Check Setting level 0 to POT 555 // Check Setting level 0 to POT
550 manager_->SetLevelInfo(texture_, 556 manager_->SetLevelInfo(texture_ref_,
551 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 557 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
552 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 558 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
553 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 559 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
554 EXPECT_FALSE(manager_->CanRender(texture_)); 560 EXPECT_FALSE(manager_->CanRender(texture_ref_));
555 EXPECT_EQ(0, texture_->num_uncleared_mips()); 561 EXPECT_EQ(0, texture->num_uncleared_mips());
556 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 562 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
557 // Set filters to something that will work with a single mip. 563 // Set filters to something that will work with a single mip.
558 SetParameter(texture_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR); 564 SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
559 EXPECT_TRUE(manager_->CanRender(texture_)); 565 EXPECT_TRUE(manager_->CanRender(texture_ref_));
560 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 566 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
561 // Set them back. 567 // Set them back.
562 SetParameter( 568 SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER,
563 texture_, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR, GL_NO_ERROR); 569 GL_LINEAR_MIPMAP_LINEAR, GL_NO_ERROR);
564 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 570 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
565 571
566 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); 572 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
567 // Make mips. 573 // Make mips.
568 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); 574 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
569 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 575 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
570 EXPECT_TRUE(manager_->CanRender(texture_)); 576 EXPECT_TRUE(manager_->CanRender(texture_ref_));
571 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 577 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
572 // Change a mip. 578 // Change a mip.
573 manager_->SetLevelInfo(texture_, 579 manager_->SetLevelInfo(texture_ref_,
574 GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 580 GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
575 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 581 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
576 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 582 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
577 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); 583 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
578 EXPECT_FALSE(manager_->CanRender(texture_)); 584 EXPECT_FALSE(manager_->CanRender(texture_ref_));
579 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 585 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
580 // Set a level past the number of mips that would get generated. 586 // Set a level past the number of mips that would get generated.
581 manager_->SetLevelInfo(texture_, 587 manager_->SetLevelInfo(texture_ref_,
582 GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 588 GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
583 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); 589 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
584 // Make mips. 590 // Make mips.
585 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); 591 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
586 EXPECT_TRUE(manager_->CanRender(texture_)); 592 EXPECT_TRUE(manager_->CanRender(texture_ref_));
587 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 593 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
588 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 594 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
589 } 595 }
590 596
591 TEST_F(TextureMemoryTrackerTest, MarkMipmapsGenerated) { 597 TEST_F(TextureMemoryTrackerTest, MarkMipmapsGenerated) {
592 manager_->SetTarget(texture_, GL_TEXTURE_2D); 598 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
593 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged); 599 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged);
594 manager_->SetLevelInfo(texture_, 600 manager_->SetLevelInfo(texture_ref_,
595 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 601 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
596 EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged); 602 EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged);
597 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged); 603 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged);
598 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); 604 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
599 EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged); 605 EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged);
600 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged); 606 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
601 } 607 }
602 608
603 TEST_F(TextureTest, UnusedMips) { 609 TEST_F(TextureTest, UnusedMips) {
604 manager_->SetTarget(texture_, GL_TEXTURE_2D); 610 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
605 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target()); 611 Texture* texture = texture_ref_->texture();
612 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
606 // Set level zero to large size. 613 // Set level zero to large size.
607 manager_->SetLevelInfo(texture_, 614 manager_->SetLevelInfo(texture_ref_,
608 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 615 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
609 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); 616 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
610 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 617 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
611 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 618 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
612 EXPECT_TRUE(manager_->CanRender(texture_)); 619 EXPECT_TRUE(manager_->CanRender(texture_ref_));
613 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 620 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
614 // Set level zero to large smaller (levels unused mips) 621 // Set level zero to large smaller (levels unused mips)
615 manager_->SetLevelInfo(texture_, 622 manager_->SetLevelInfo(texture_ref_,
616 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 623 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
617 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); 624 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
618 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 625 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
619 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 626 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
620 EXPECT_TRUE(manager_->CanRender(texture_)); 627 EXPECT_TRUE(manager_->CanRender(texture_ref_));
621 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 628 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
622 // Set an unused level to some size 629 // Set an unused level to some size
623 manager_->SetLevelInfo(texture_, 630 manager_->SetLevelInfo(texture_ref_,
624 GL_TEXTURE_2D, 4, GL_RGBA, 16, 16, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 631 GL_TEXTURE_2D, 4, GL_RGBA, 16, 16, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
625 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 632 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
626 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 633 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
627 EXPECT_TRUE(manager_->CanRender(texture_)); 634 EXPECT_TRUE(manager_->CanRender(texture_ref_));
628 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 635 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
629 } 636 }
630 637
631 TEST_F(TextureTest, NPOT2D) { 638 TEST_F(TextureTest, NPOT2D) {
632 manager_->SetTarget(texture_, GL_TEXTURE_2D); 639 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
633 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target()); 640 Texture* texture = texture_ref_->texture();
641 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
634 // Check Setting level 0 to NPOT 642 // Check Setting level 0 to NPOT
635 manager_->SetLevelInfo(texture_, 643 manager_->SetLevelInfo(texture_ref_,
636 GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 644 GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
637 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture_)); 645 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
638 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 646 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
639 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); 647 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
640 EXPECT_FALSE(manager_->CanRender(texture_)); 648 EXPECT_FALSE(manager_->CanRender(texture_ref_));
641 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 649 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
642 SetParameter(texture_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR); 650 SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
643 EXPECT_FALSE(manager_->CanRender(texture_)); 651 EXPECT_FALSE(manager_->CanRender(texture_ref_));
644 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 652 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
645 SetParameter(texture_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); 653 SetParameter(texture_ref_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
646 EXPECT_FALSE(manager_->CanRender(texture_)); 654 EXPECT_FALSE(manager_->CanRender(texture_ref_));
647 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 655 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
648 SetParameter(texture_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); 656 SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
649 EXPECT_TRUE(manager_->CanRender(texture_)); 657 EXPECT_TRUE(manager_->CanRender(texture_ref_));
650 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 658 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
651 // Change it to POT. 659 // Change it to POT.
652 manager_->SetLevelInfo(texture_, 660 manager_->SetLevelInfo(texture_ref_,
653 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 661 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
654 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 662 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
655 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 663 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
656 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); 664 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
657 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 665 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
658 } 666 }
659 667
660 TEST_F(TextureTest, NPOT2DNPOTOK) { 668 TEST_F(TextureTest, NPOT2DNPOTOK) {
661 TestHelper::SetupFeatureInfoInitExpectations( 669 TestHelper::SetupFeatureInfoInitExpectations(
662 gl_.get(), "GL_OES_texture_npot"); 670 gl_.get(), "GL_OES_texture_npot");
663 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 671 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
664 feature_info->Initialize(NULL); 672 feature_info->Initialize(NULL);
665 TextureManager manager( 673 TextureManager manager(
666 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 674 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
667 manager.CreateTexture(kClient1Id, kService1Id); 675 manager.CreateTexture(kClient1Id, kService1Id);
668 Texture* texture = manager.GetTexture(kClient1Id); 676 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
669 ASSERT_TRUE(texture != NULL); 677 ASSERT_TRUE(texture_ref != NULL);
678 Texture* texture = texture_ref->texture();
670 679
671 manager.SetTarget(texture, GL_TEXTURE_2D); 680 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
672 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); 681 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
673 // Check Setting level 0 to NPOT 682 // Check Setting level 0 to NPOT
674 manager.SetLevelInfo(texture, 683 manager.SetLevelInfo(texture_ref,
675 GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 684 GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
676 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture)); 685 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
677 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); 686 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
678 EXPECT_TRUE(manager.CanGenerateMipmaps(texture)); 687 EXPECT_TRUE(manager.CanGenerateMipmaps(texture_ref));
679 EXPECT_FALSE(manager.CanRender(texture)); 688 EXPECT_FALSE(manager.CanRender(texture_ref));
680 EXPECT_TRUE(manager.HaveUnrenderableTextures()); 689 EXPECT_TRUE(manager.HaveUnrenderableTextures());
681 EXPECT_TRUE(manager.MarkMipmapsGenerated(texture)); 690 EXPECT_TRUE(manager.MarkMipmapsGenerated(texture_ref));
682 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); 691 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
683 EXPECT_TRUE(manager.CanRender(texture)); 692 EXPECT_TRUE(manager.CanRender(texture_ref));
684 EXPECT_FALSE(manager.HaveUnrenderableTextures()); 693 EXPECT_FALSE(manager.HaveUnrenderableTextures());
685 manager.Destroy(false); 694 manager.Destroy(false);
686 } 695 }
687 696
688 TEST_F(TextureTest, POTCubeMap) { 697 TEST_F(TextureTest, POTCubeMap) {
689 manager_->SetTarget(texture_, GL_TEXTURE_CUBE_MAP); 698 manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP);
690 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture_->target()); 699 Texture* texture = texture_ref_->texture();
700 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
691 // Check Setting level 0 each face to POT 701 // Check Setting level 0 each face to POT
692 manager_->SetLevelInfo(texture_, 702 manager_->SetLevelInfo(texture_ref_,
693 GL_TEXTURE_CUBE_MAP_POSITIVE_X, 703 GL_TEXTURE_CUBE_MAP_POSITIVE_X,
694 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 704 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
695 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 705 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
696 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 706 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
697 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); 707 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
698 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); 708 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
699 EXPECT_FALSE(manager_->CanRender(texture_)); 709 EXPECT_FALSE(manager_->CanRender(texture_ref_));
700 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 710 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
701 manager_->SetLevelInfo(texture_, 711 manager_->SetLevelInfo(texture_ref_,
702 GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 712 GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
703 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 713 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
704 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 714 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
705 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 715 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
706 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); 716 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
707 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); 717 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
708 EXPECT_FALSE(manager_->CanRender(texture_)); 718 EXPECT_FALSE(manager_->CanRender(texture_ref_));
709 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 719 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
710 manager_->SetLevelInfo(texture_, 720 manager_->SetLevelInfo(texture_ref_,
711 GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 721 GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
712 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 722 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
713 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 723 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
714 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 724 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
715 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); 725 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
716 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); 726 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
717 EXPECT_FALSE(manager_->CanRender(texture_)); 727 EXPECT_FALSE(manager_->CanRender(texture_ref_));
718 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 728 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
719 manager_->SetLevelInfo(texture_, 729 manager_->SetLevelInfo(texture_ref_,
720 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 730 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
721 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 731 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
722 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 732 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
723 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 733 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
724 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); 734 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
725 EXPECT_FALSE(manager_->CanRender(texture_)); 735 EXPECT_FALSE(manager_->CanRender(texture_ref_));
726 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); 736 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
727 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 737 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
728 manager_->SetLevelInfo(texture_, 738 manager_->SetLevelInfo(texture_ref_,
729 GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 739 GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
730 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 740 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
731 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 741 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
732 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 742 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
733 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture_)); 743 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
734 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_)); 744 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_));
735 EXPECT_FALSE(manager_->CanRender(texture_)); 745 EXPECT_FALSE(manager_->CanRender(texture_ref_));
736 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 746 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
737 manager_->SetLevelInfo(texture_, 747 manager_->SetLevelInfo(texture_ref_,
738 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 748 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
739 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 749 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
740 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 750 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
741 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 751 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
742 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_)); 752 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
743 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); 753 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
744 EXPECT_FALSE(manager_->CanRender(texture_)); 754 EXPECT_FALSE(manager_->CanRender(texture_ref_));
745 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 755 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
746 756
747 // Make mips. 757 // Make mips.
748 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); 758 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
749 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 759 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
750 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_)); 760 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
751 EXPECT_TRUE(manager_->CanRender(texture_)); 761 EXPECT_TRUE(manager_->CanRender(texture_ref_));
752 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 762 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
753 763
754 // Change a mip. 764 // Change a mip.
755 manager_->SetLevelInfo(texture_, 765 manager_->SetLevelInfo(texture_ref_,
756 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 766 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
757 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 767 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
758 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture_)); 768 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
759 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture_)); 769 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
760 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_)); 770 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
761 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); 771 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
762 // Set a level past the number of mips that would get generated. 772 // Set a level past the number of mips that would get generated.
763 manager_->SetLevelInfo(texture_, 773 manager_->SetLevelInfo(texture_ref_,
764 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 774 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
765 3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 775 3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
766 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_)); 776 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_));
767 // Make mips. 777 // Make mips.
768 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); 778 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
769 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 779 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
770 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture_)); 780 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
771 } 781 }
772 782
773 TEST_F(TextureTest, GetLevelSize) { 783 TEST_F(TextureTest, GetLevelSize) {
774 manager_->SetTarget(texture_, GL_TEXTURE_2D); 784 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
775 manager_->SetLevelInfo(texture_, 785 manager_->SetLevelInfo(texture_ref_,
776 GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 786 GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
777 GLsizei width = -1; 787 GLsizei width = -1;
778 GLsizei height = -1; 788 GLsizei height = -1;
779 EXPECT_FALSE(texture_->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height)); 789 Texture* texture = texture_ref_->texture();
780 EXPECT_FALSE(texture_->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height)); 790 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height));
781 EXPECT_FALSE(texture_->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); 791 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height));
782 EXPECT_TRUE(texture_->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); 792 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
793 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
783 EXPECT_EQ(4, width); 794 EXPECT_EQ(4, width);
784 EXPECT_EQ(5, height); 795 EXPECT_EQ(5, height);
785 manager_->RemoveTexture(kClient1Id); 796 manager_->RemoveTexture(kClient1Id);
786 EXPECT_TRUE(texture_->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); 797 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
787 EXPECT_EQ(4, width); 798 EXPECT_EQ(4, width);
788 EXPECT_EQ(5, height); 799 EXPECT_EQ(5, height);
789 } 800 }
790 801
791 TEST_F(TextureTest, GetLevelType) { 802 TEST_F(TextureTest, GetLevelType) {
792 manager_->SetTarget(texture_, GL_TEXTURE_2D); 803 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
793 manager_->SetLevelInfo(texture_, 804 manager_->SetLevelInfo(texture_ref_,
794 GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 805 GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
795 GLenum type = -1; 806 GLenum type = -1;
796 GLenum format = -1; 807 GLenum format = -1;
797 EXPECT_FALSE(texture_->GetLevelType(GL_TEXTURE_2D, -1, &type, &format)); 808 Texture* texture = texture_ref_->texture();
798 EXPECT_FALSE(texture_->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format)); 809 EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, -1, &type, &format));
799 EXPECT_FALSE(texture_->GetLevelType(GL_TEXTURE_2D, 0, &type, &format)); 810 EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format));
800 EXPECT_TRUE(texture_->GetLevelType(GL_TEXTURE_2D, 1, &type, &format)); 811 EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &format));
812 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
801 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); 813 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
802 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format); 814 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
803 manager_->RemoveTexture(kClient1Id); 815 manager_->RemoveTexture(kClient1Id);
804 EXPECT_TRUE(texture_->GetLevelType(GL_TEXTURE_2D, 1, &type, &format)); 816 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
805 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); 817 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
806 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format); 818 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
807 } 819 }
808 820
809 TEST_F(TextureTest, ValidForTexture) { 821 TEST_F(TextureTest, ValidForTexture) {
810 manager_->SetTarget(texture_, GL_TEXTURE_2D); 822 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
811 manager_->SetLevelInfo(texture_, 823 manager_->SetLevelInfo(texture_ref_,
812 GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 824 GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
813 // Check bad face. 825 // Check bad face.
814 EXPECT_FALSE(texture_->ValidForTexture( 826 Texture* texture = texture_ref_->texture();
827 EXPECT_FALSE(texture->ValidForTexture(
815 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 828 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
816 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); 829 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
817 // Check bad level. 830 // Check bad level.
818 EXPECT_FALSE(texture_->ValidForTexture( 831 EXPECT_FALSE(texture->ValidForTexture(
819 GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); 832 GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
820 // Check bad xoffset. 833 // Check bad xoffset.
821 EXPECT_FALSE(texture_->ValidForTexture( 834 EXPECT_FALSE(texture->ValidForTexture(
822 GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); 835 GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
823 // Check bad xoffset + width > width. 836 // Check bad xoffset + width > width.
824 EXPECT_FALSE(texture_->ValidForTexture( 837 EXPECT_FALSE(texture->ValidForTexture(
825 GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); 838 GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
826 // Check bad yoffset. 839 // Check bad yoffset.
827 EXPECT_FALSE(texture_->ValidForTexture( 840 EXPECT_FALSE(texture->ValidForTexture(
828 GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); 841 GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
829 // Check bad yoffset + height > height. 842 // Check bad yoffset + height > height.
830 EXPECT_FALSE(texture_->ValidForTexture( 843 EXPECT_FALSE(texture->ValidForTexture(
831 GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); 844 GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
832 // Check bad width. 845 // Check bad width.
833 EXPECT_FALSE(texture_->ValidForTexture( 846 EXPECT_FALSE(texture->ValidForTexture(
834 GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_RGBA, GL_UNSIGNED_BYTE)); 847 GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_RGBA, GL_UNSIGNED_BYTE));
835 // Check bad height. 848 // Check bad height.
836 EXPECT_FALSE(texture_->ValidForTexture( 849 EXPECT_FALSE(texture->ValidForTexture(
837 GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_RGBA, GL_UNSIGNED_BYTE)); 850 GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_RGBA, GL_UNSIGNED_BYTE));
838 // Check bad format. 851 // Check bad format.
839 EXPECT_FALSE(texture_->ValidForTexture( 852 EXPECT_FALSE(texture->ValidForTexture(
840 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGB, GL_UNSIGNED_BYTE)); 853 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGB, GL_UNSIGNED_BYTE));
841 // Check bad type. 854 // Check bad type.
842 EXPECT_FALSE(texture_->ValidForTexture( 855 EXPECT_FALSE(texture->ValidForTexture(
843 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4)); 856 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4));
844 // Check valid full size 857 // Check valid full size
845 EXPECT_TRUE(texture_->ValidForTexture( 858 EXPECT_TRUE(texture->ValidForTexture(
846 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); 859 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
847 // Check valid particial size. 860 // Check valid particial size.
848 EXPECT_TRUE(texture_->ValidForTexture( 861 EXPECT_TRUE(texture->ValidForTexture(
849 GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_RGBA, GL_UNSIGNED_BYTE)); 862 GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_RGBA, GL_UNSIGNED_BYTE));
850 manager_->RemoveTexture(kClient1Id); 863 manager_->RemoveTexture(kClient1Id);
851 EXPECT_TRUE(texture_->ValidForTexture( 864 EXPECT_TRUE(texture->ValidForTexture(
852 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); 865 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
853 } 866 }
854 867
855 TEST_F(TextureTest, FloatNotLinear) { 868 TEST_F(TextureTest, FloatNotLinear) {
856 TestHelper::SetupFeatureInfoInitExpectations( 869 TestHelper::SetupFeatureInfoInitExpectations(
857 gl_.get(), "GL_OES_texture_float"); 870 gl_.get(), "GL_OES_texture_float");
858 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 871 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
859 feature_info->Initialize(NULL); 872 feature_info->Initialize(NULL);
860 TextureManager manager( 873 TextureManager manager(
861 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 874 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
862 manager.CreateTexture(kClient1Id, kService1Id); 875 manager.CreateTexture(kClient1Id, kService1Id);
863 Texture* texture = manager.GetTexture(kClient1Id); 876 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
864 ASSERT_TRUE(texture != NULL); 877 ASSERT_TRUE(texture_ref != NULL);
865 manager.SetTarget(texture, GL_TEXTURE_2D); 878 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
879 Texture* texture = texture_ref->texture();
866 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); 880 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
867 manager.SetLevelInfo(texture, 881 manager.SetLevelInfo(texture_ref,
868 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true); 882 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
869 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); 883 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
870 TestHelper::SetTexParameterWithExpectations( 884 TestHelper::SetTexParameterWithExpectations(
871 gl_.get(), error_state_.get(), &manager, 885 gl_.get(), error_state_.get(), &manager,
872 texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); 886 texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
873 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); 887 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
874 TestHelper::SetTexParameterWithExpectations( 888 TestHelper::SetTexParameterWithExpectations(
875 gl_.get(), error_state_.get(), &manager, 889 gl_.get(), error_state_.get(), &manager, texture_ref,
876 texture, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR); 890 GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
877 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); 891 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
878 manager.Destroy(false); 892 manager.Destroy(false);
879 } 893 }
880 894
881 TEST_F(TextureTest, FloatLinear) { 895 TEST_F(TextureTest, FloatLinear) {
882 TestHelper::SetupFeatureInfoInitExpectations( 896 TestHelper::SetupFeatureInfoInitExpectations(
883 gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear"); 897 gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear");
884 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 898 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
885 feature_info->Initialize(NULL); 899 feature_info->Initialize(NULL);
886 TextureManager manager( 900 TextureManager manager(
887 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 901 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
888 manager.CreateTexture(kClient1Id, kService1Id); 902 manager.CreateTexture(kClient1Id, kService1Id);
889 Texture* texture = manager.GetTexture(kClient1Id); 903 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
890 ASSERT_TRUE(texture != NULL); 904 ASSERT_TRUE(texture_ref != NULL);
891 manager.SetTarget(texture, GL_TEXTURE_2D); 905 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
906 Texture* texture = texture_ref->texture();
892 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); 907 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
893 manager.SetLevelInfo(texture, 908 manager.SetLevelInfo(texture_ref,
894 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true); 909 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
895 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); 910 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
896 manager.Destroy(false); 911 manager.Destroy(false);
897 } 912 }
898 913
899 TEST_F(TextureTest, HalfFloatNotLinear) { 914 TEST_F(TextureTest, HalfFloatNotLinear) {
900 TestHelper::SetupFeatureInfoInitExpectations( 915 TestHelper::SetupFeatureInfoInitExpectations(
901 gl_.get(), "GL_OES_texture_half_float"); 916 gl_.get(), "GL_OES_texture_half_float");
902 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 917 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
903 feature_info->Initialize(NULL); 918 feature_info->Initialize(NULL);
904 TextureManager manager( 919 TextureManager manager(
905 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 920 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
906 manager.CreateTexture(kClient1Id, kService1Id); 921 manager.CreateTexture(kClient1Id, kService1Id);
907 Texture* texture = manager.GetTexture(kClient1Id); 922 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
908 ASSERT_TRUE(texture != NULL); 923 ASSERT_TRUE(texture_ref != NULL);
909 manager.SetTarget(texture, GL_TEXTURE_2D); 924 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
925 Texture* texture = texture_ref->texture();
910 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); 926 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
911 manager.SetLevelInfo(texture, 927 manager.SetLevelInfo(texture_ref,
912 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true); 928 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
913 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); 929 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
914 TestHelper::SetTexParameterWithExpectations( 930 TestHelper::SetTexParameterWithExpectations(
915 gl_.get(), error_state_.get(), &manager, 931 gl_.get(), error_state_.get(), &manager,
916 texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); 932 texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
917 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); 933 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
918 TestHelper::SetTexParameterWithExpectations( 934 TestHelper::SetTexParameterWithExpectations(
919 gl_.get(), error_state_.get(), &manager, 935 gl_.get(), error_state_.get(), &manager, texture_ref,
920 texture, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR); 936 GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
921 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); 937 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
922 manager.Destroy(false); 938 manager.Destroy(false);
923 } 939 }
924 940
925 TEST_F(TextureTest, HalfFloatLinear) { 941 TEST_F(TextureTest, HalfFloatLinear) {
926 TestHelper::SetupFeatureInfoInitExpectations( 942 TestHelper::SetupFeatureInfoInitExpectations(
927 gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear"); 943 gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear");
928 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 944 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
929 feature_info->Initialize(NULL); 945 feature_info->Initialize(NULL);
930 TextureManager manager( 946 TextureManager manager(
931 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 947 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
932 manager.CreateTexture(kClient1Id, kService1Id); 948 manager.CreateTexture(kClient1Id, kService1Id);
933 Texture* texture = manager.GetTexture(kClient1Id); 949 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
934 ASSERT_TRUE(texture != NULL); 950 ASSERT_TRUE(texture_ref != NULL);
935 manager.SetTarget(texture, GL_TEXTURE_2D); 951 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
952 Texture* texture = texture_ref->texture();
936 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target()); 953 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
937 manager.SetLevelInfo(texture, 954 manager.SetLevelInfo(texture_ref,
938 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true); 955 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
939 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); 956 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
940 manager.Destroy(false); 957 manager.Destroy(false);
941 } 958 }
942 959
943 TEST_F(TextureTest, EGLImageExternal) { 960 TEST_F(TextureTest, EGLImageExternal) {
944 TestHelper::SetupFeatureInfoInitExpectations( 961 TestHelper::SetupFeatureInfoInitExpectations(
945 gl_.get(), "GL_OES_EGL_image_external"); 962 gl_.get(), "GL_OES_EGL_image_external");
946 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 963 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
947 feature_info->Initialize(NULL); 964 feature_info->Initialize(NULL);
948 TextureManager manager( 965 TextureManager manager(
949 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 966 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
950 manager.CreateTexture(kClient1Id, kService1Id); 967 manager.CreateTexture(kClient1Id, kService1Id);
951 Texture* texture = manager.GetTexture(kClient1Id); 968 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
952 ASSERT_TRUE(texture != NULL); 969 ASSERT_TRUE(texture_ref != NULL);
953 manager.SetTarget(texture, GL_TEXTURE_EXTERNAL_OES); 970 manager.SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
971 Texture* texture = texture_ref->texture();
954 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target()); 972 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
955 EXPECT_FALSE(manager.CanGenerateMipmaps(texture)); 973 EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
956 manager.Destroy(false); 974 manager.Destroy(false);
957 } 975 }
958 976
959 TEST_F(TextureTest, DepthTexture) { 977 TEST_F(TextureTest, DepthTexture) {
960 TestHelper::SetupFeatureInfoInitExpectations( 978 TestHelper::SetupFeatureInfoInitExpectations(
961 gl_.get(), "GL_ANGLE_depth_texture"); 979 gl_.get(), "GL_ANGLE_depth_texture");
962 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 980 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
963 feature_info->Initialize(NULL); 981 feature_info->Initialize(NULL);
964 TextureManager manager( 982 TextureManager manager(
965 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); 983 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
966 manager.CreateTexture(kClient1Id, kService1Id); 984 manager.CreateTexture(kClient1Id, kService1Id);
967 Texture* texture = manager.GetTexture(kClient1Id); 985 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
968 ASSERT_TRUE(texture != NULL); 986 ASSERT_TRUE(texture_ref != NULL);
969 manager.SetTarget(texture, GL_TEXTURE_2D); 987 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
970 manager.SetLevelInfo( 988 manager.SetLevelInfo(
971 texture, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0, 989 texture_ref, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0,
972 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false); 990 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false);
973 EXPECT_FALSE(manager.CanGenerateMipmaps(texture)); 991 EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
974 manager.Destroy(false); 992 manager.Destroy(false);
975 } 993 }
976 994
977 TEST_F(TextureTest, SafeUnsafe) { 995 TEST_F(TextureTest, SafeUnsafe) {
978 static const GLuint kClient2Id = 2; 996 static const GLuint kClient2Id = 2;
979 static const GLuint kService2Id = 12; 997 static const GLuint kService2Id = 12;
980 static const GLuint kClient3Id = 3; 998 static const GLuint kClient3Id = 3;
981 static const GLuint kService3Id = 13; 999 static const GLuint kService3Id = 13;
982 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1000 EXPECT_FALSE(manager_->HaveUnclearedMips());
983 EXPECT_EQ(0, texture_->num_uncleared_mips()); 1001 Texture* texture = texture_ref_->texture();
984 manager_->SetTarget(texture_, GL_TEXTURE_2D); 1002 EXPECT_EQ(0, texture->num_uncleared_mips());
985 manager_->SetLevelInfo(texture_, 1003 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
1004 manager_->SetLevelInfo(texture_ref_,
986 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1005 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
987 EXPECT_FALSE(texture_->SafeToRenderFrom()); 1006 EXPECT_FALSE(texture->SafeToRenderFrom());
988 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1007 EXPECT_TRUE(manager_->HaveUnsafeTextures());
989 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1008 EXPECT_TRUE(manager_->HaveUnclearedMips());
990 EXPECT_EQ(1, texture_->num_uncleared_mips()); 1009 EXPECT_EQ(1, texture->num_uncleared_mips());
991 manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 0, true); 1010 manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 0, true);
992 EXPECT_TRUE(texture_->SafeToRenderFrom()); 1011 EXPECT_TRUE(texture->SafeToRenderFrom());
993 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1012 EXPECT_FALSE(manager_->HaveUnsafeTextures());
994 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1013 EXPECT_FALSE(manager_->HaveUnclearedMips());
995 EXPECT_EQ(0, texture_->num_uncleared_mips()); 1014 EXPECT_EQ(0, texture->num_uncleared_mips());
996 manager_->SetLevelInfo(texture_, 1015 manager_->SetLevelInfo(texture_ref_,
997 GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1016 GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
998 EXPECT_FALSE(texture_->SafeToRenderFrom()); 1017 EXPECT_FALSE(texture->SafeToRenderFrom());
999 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1018 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1000 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1019 EXPECT_TRUE(manager_->HaveUnclearedMips());
1001 EXPECT_EQ(1, texture_->num_uncleared_mips()); 1020 EXPECT_EQ(1, texture->num_uncleared_mips());
1002 manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 1, true); 1021 manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 1, true);
1003 EXPECT_TRUE(texture_->SafeToRenderFrom()); 1022 EXPECT_TRUE(texture->SafeToRenderFrom());
1004 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1023 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1005 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1024 EXPECT_FALSE(manager_->HaveUnclearedMips());
1006 EXPECT_EQ(0, texture_->num_uncleared_mips()); 1025 EXPECT_EQ(0, texture->num_uncleared_mips());
1007 manager_->SetLevelInfo(texture_, 1026 manager_->SetLevelInfo(texture_ref_,
1008 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1027 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1009 manager_->SetLevelInfo(texture_, 1028 manager_->SetLevelInfo(texture_ref_,
1010 GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1029 GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1011 EXPECT_FALSE(texture_->SafeToRenderFrom()); 1030 EXPECT_FALSE(texture->SafeToRenderFrom());
1012 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1031 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1013 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1032 EXPECT_TRUE(manager_->HaveUnclearedMips());
1014 EXPECT_EQ(2, texture_->num_uncleared_mips()); 1033 EXPECT_EQ(2, texture->num_uncleared_mips());
1015 manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 0, true); 1034 manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 0, true);
1016 EXPECT_FALSE(texture_->SafeToRenderFrom()); 1035 EXPECT_FALSE(texture->SafeToRenderFrom());
1017 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1036 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1018 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1037 EXPECT_TRUE(manager_->HaveUnclearedMips());
1019 EXPECT_EQ(1, texture_->num_uncleared_mips()); 1038 EXPECT_EQ(1, texture->num_uncleared_mips());
1020 manager_->SetLevelCleared(texture_, GL_TEXTURE_2D, 1, true); 1039 manager_->SetLevelCleared(texture_ref_, GL_TEXTURE_2D, 1, true);
1021 EXPECT_TRUE(texture_->SafeToRenderFrom()); 1040 EXPECT_TRUE(texture->SafeToRenderFrom());
1022 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1041 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1023 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1042 EXPECT_FALSE(manager_->HaveUnclearedMips());
1024 EXPECT_EQ(0, texture_->num_uncleared_mips()); 1043 EXPECT_EQ(0, texture->num_uncleared_mips());
1025 manager_->SetLevelInfo(texture_, 1044 manager_->SetLevelInfo(texture_ref_,
1026 GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1045 GL_TEXTURE_2D, 1, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1027 EXPECT_FALSE(texture_->SafeToRenderFrom()); 1046 EXPECT_FALSE(texture->SafeToRenderFrom());
1028 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1047 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1029 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1048 EXPECT_TRUE(manager_->HaveUnclearedMips());
1030 EXPECT_EQ(1, texture_->num_uncleared_mips()); 1049 EXPECT_EQ(1, texture->num_uncleared_mips());
1031 manager_->MarkMipmapsGenerated(texture_); 1050 manager_->MarkMipmapsGenerated(texture_ref_);
1032 EXPECT_TRUE(texture_->SafeToRenderFrom()); 1051 EXPECT_TRUE(texture->SafeToRenderFrom());
1033 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1052 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1034 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1053 EXPECT_FALSE(manager_->HaveUnclearedMips());
1035 EXPECT_EQ(0, texture_->num_uncleared_mips()); 1054 EXPECT_EQ(0, texture->num_uncleared_mips());
1036 1055
1037 manager_->CreateTexture(kClient2Id, kService2Id); 1056 manager_->CreateTexture(kClient2Id, kService2Id);
1038 scoped_refptr<Texture> texture2( 1057 scoped_refptr<TextureRef> texture_ref2(
1039 manager_->GetTexture(kClient2Id)); 1058 manager_->GetTexture(kClient2Id));
1040 ASSERT_TRUE(texture2.get() != NULL); 1059 ASSERT_TRUE(texture_ref2.get() != NULL);
1041 manager_->SetTarget(texture2, GL_TEXTURE_2D); 1060 manager_->SetTarget(texture_ref2, GL_TEXTURE_2D);
1042 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1061 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1043 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1062 EXPECT_FALSE(manager_->HaveUnclearedMips());
1063 Texture* texture2 = texture_ref2->texture();
1044 EXPECT_EQ(0, texture2->num_uncleared_mips()); 1064 EXPECT_EQ(0, texture2->num_uncleared_mips());
1045 manager_->SetLevelInfo(texture2, 1065 manager_->SetLevelInfo(texture_ref2,
1046 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 1066 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
1047 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1067 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1048 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1068 EXPECT_FALSE(manager_->HaveUnclearedMips());
1049 EXPECT_EQ(0, texture2->num_uncleared_mips()); 1069 EXPECT_EQ(0, texture2->num_uncleared_mips());
1050 manager_->SetLevelInfo(texture2, 1070 manager_->SetLevelInfo(texture_ref2,
1051 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1071 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1052 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1072 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1053 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1073 EXPECT_TRUE(manager_->HaveUnclearedMips());
1054 EXPECT_EQ(1, texture2->num_uncleared_mips()); 1074 EXPECT_EQ(1, texture2->num_uncleared_mips());
1055 1075
1056 manager_->CreateTexture(kClient3Id, kService3Id); 1076 manager_->CreateTexture(kClient3Id, kService3Id);
1057 scoped_refptr<Texture> texture3( 1077 scoped_refptr<TextureRef> texture_ref3(
1058 manager_->GetTexture(kClient3Id)); 1078 manager_->GetTexture(kClient3Id));
1059 ASSERT_TRUE(texture3.get() != NULL); 1079 ASSERT_TRUE(texture_ref3.get() != NULL);
1060 manager_->SetTarget(texture3, GL_TEXTURE_2D); 1080 manager_->SetTarget(texture_ref3, GL_TEXTURE_2D);
1061 manager_->SetLevelInfo(texture3, 1081 manager_->SetLevelInfo(texture_ref3,
1062 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1082 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1063 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1083 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1064 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1084 EXPECT_TRUE(manager_->HaveUnclearedMips());
1085 Texture* texture3 = texture_ref3->texture();
1065 EXPECT_EQ(1, texture3->num_uncleared_mips()); 1086 EXPECT_EQ(1, texture3->num_uncleared_mips());
1066 manager_->SetLevelCleared(texture2, GL_TEXTURE_2D, 0, true); 1087 manager_->SetLevelCleared(texture_ref2, GL_TEXTURE_2D, 0, true);
1067 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1088 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1068 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1089 EXPECT_TRUE(manager_->HaveUnclearedMips());
1069 EXPECT_EQ(0, texture2->num_uncleared_mips()); 1090 EXPECT_EQ(0, texture2->num_uncleared_mips());
1070 manager_->SetLevelCleared(texture3, GL_TEXTURE_2D, 0, true); 1091 manager_->SetLevelCleared(texture_ref3, GL_TEXTURE_2D, 0, true);
1071 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1092 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1072 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1093 EXPECT_FALSE(manager_->HaveUnclearedMips());
1073 EXPECT_EQ(0, texture3->num_uncleared_mips()); 1094 EXPECT_EQ(0, texture3->num_uncleared_mips());
1074 1095
1075 manager_->SetLevelInfo(texture2, 1096 manager_->SetLevelInfo(texture_ref2,
1076 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1097 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1077 manager_->SetLevelInfo(texture3, 1098 manager_->SetLevelInfo(texture_ref3,
1078 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1099 GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1079 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1100 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1080 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1101 EXPECT_TRUE(manager_->HaveUnclearedMips());
1081 EXPECT_EQ(1, texture2->num_uncleared_mips()); 1102 EXPECT_EQ(1, texture2->num_uncleared_mips());
1082 EXPECT_EQ(1, texture3->num_uncleared_mips()); 1103 EXPECT_EQ(1, texture3->num_uncleared_mips());
1083 manager_->RemoveTexture(kClient3Id); 1104 manager_->RemoveTexture(kClient3Id);
1084 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1105 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1085 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1106 EXPECT_TRUE(manager_->HaveUnclearedMips());
1086 manager_->RemoveTexture(kClient2Id); 1107 manager_->RemoveTexture(kClient2Id);
1087 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1108 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1088 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1109 EXPECT_TRUE(manager_->HaveUnclearedMips());
1089 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id))) 1110 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
1090 .Times(1) 1111 .Times(1)
1091 .RetiresOnSaturation(); 1112 .RetiresOnSaturation();
1092 texture2 = NULL; 1113 texture_ref2 = NULL;
1093 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1114 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1094 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1115 EXPECT_TRUE(manager_->HaveUnclearedMips());
1095 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService3Id))) 1116 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService3Id)))
1096 .Times(1) 1117 .Times(1)
1097 .RetiresOnSaturation(); 1118 .RetiresOnSaturation();
1098 texture3 = NULL; 1119 texture_ref3 = NULL;
1099 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1120 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1100 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1121 EXPECT_FALSE(manager_->HaveUnclearedMips());
1101 } 1122 }
1102 1123
1103 TEST_F(TextureTest, ClearTexture) { 1124 TEST_F(TextureTest, ClearTexture) {
1104 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) 1125 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
1105 .WillRepeatedly(Return(true)); 1126 .WillRepeatedly(Return(true));
1106 manager_->SetTarget(texture_, GL_TEXTURE_2D); 1127 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
1107 manager_->SetLevelInfo(texture_, 1128 manager_->SetLevelInfo(texture_ref_,
1108 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1129 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1109 manager_->SetLevelInfo(texture_, 1130 manager_->SetLevelInfo(texture_ref_,
1110 GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1131 GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1111 EXPECT_FALSE(texture_->SafeToRenderFrom()); 1132 Texture* texture = texture_ref_->texture();
1133 EXPECT_FALSE(texture->SafeToRenderFrom());
1112 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1134 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1113 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1135 EXPECT_TRUE(manager_->HaveUnclearedMips());
1114 EXPECT_EQ(2, texture_->num_uncleared_mips()); 1136 EXPECT_EQ(2, texture->num_uncleared_mips());
1115 manager_->ClearRenderableLevels(decoder_.get(), texture_); 1137 manager_->ClearRenderableLevels(decoder_.get(), texture_ref_);
1116 EXPECT_TRUE(texture_->SafeToRenderFrom()); 1138 EXPECT_TRUE(texture->SafeToRenderFrom());
1117 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1139 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1118 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1140 EXPECT_FALSE(manager_->HaveUnclearedMips());
1119 EXPECT_EQ(0, texture_->num_uncleared_mips()); 1141 EXPECT_EQ(0, texture->num_uncleared_mips());
1120 manager_->SetLevelInfo(texture_, 1142 manager_->SetLevelInfo(texture_ref_,
1121 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1143 GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1122 manager_->SetLevelInfo(texture_, 1144 manager_->SetLevelInfo(texture_ref_,
1123 GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1145 GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1124 EXPECT_FALSE(texture_->SafeToRenderFrom()); 1146 EXPECT_FALSE(texture->SafeToRenderFrom());
1125 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1147 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1126 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1148 EXPECT_TRUE(manager_->HaveUnclearedMips());
1127 EXPECT_EQ(2, texture_->num_uncleared_mips()); 1149 EXPECT_EQ(2, texture->num_uncleared_mips());
1128 manager_->ClearTextureLevel(decoder_.get(), texture_, GL_TEXTURE_2D, 0); 1150 manager_->ClearTextureLevel(decoder_.get(), texture_ref_, GL_TEXTURE_2D, 0);
1129 EXPECT_FALSE(texture_->SafeToRenderFrom()); 1151 EXPECT_FALSE(texture->SafeToRenderFrom());
1130 EXPECT_TRUE(manager_->HaveUnsafeTextures()); 1152 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1131 EXPECT_TRUE(manager_->HaveUnclearedMips()); 1153 EXPECT_TRUE(manager_->HaveUnclearedMips());
1132 EXPECT_EQ(1, texture_->num_uncleared_mips()); 1154 EXPECT_EQ(1, texture->num_uncleared_mips());
1133 manager_->ClearTextureLevel(decoder_.get(), texture_, GL_TEXTURE_2D, 1); 1155 manager_->ClearTextureLevel(decoder_.get(), texture_ref_, GL_TEXTURE_2D, 1);
1134 EXPECT_TRUE(texture_->SafeToRenderFrom()); 1156 EXPECT_TRUE(texture->SafeToRenderFrom());
1135 EXPECT_FALSE(manager_->HaveUnsafeTextures()); 1157 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1136 EXPECT_FALSE(manager_->HaveUnclearedMips()); 1158 EXPECT_FALSE(manager_->HaveUnclearedMips());
1137 EXPECT_EQ(0, texture_->num_uncleared_mips()); 1159 EXPECT_EQ(0, texture->num_uncleared_mips());
1138 } 1160 }
1139 1161
1140 TEST_F(TextureTest, UseDeletedTexture) { 1162 TEST_F(TextureTest, UseDeletedTexture) {
1141 static const GLuint kClient2Id = 2; 1163 static const GLuint kClient2Id = 2;
1142 static const GLuint kService2Id = 12; 1164 static const GLuint kService2Id = 12;
1143 // Make the default texture renderable 1165 // Make the default texture renderable
1144 manager_->SetTarget(texture_, GL_TEXTURE_2D); 1166 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
1145 manager_->SetLevelInfo(texture_, 1167 manager_->SetLevelInfo(texture_ref_,
1146 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1168 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1147 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 1169 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
1148 // Make a new texture 1170 // Make a new texture
1149 manager_->CreateTexture(kClient2Id, kService2Id); 1171 manager_->CreateTexture(kClient2Id, kService2Id);
1150 scoped_refptr<Texture> texture( 1172 scoped_refptr<TextureRef> texture_ref(
1151 manager_->GetTexture(kClient2Id)); 1173 manager_->GetTexture(kClient2Id));
1152 manager_->SetTarget(texture, GL_TEXTURE_2D); 1174 manager_->SetTarget(texture_ref, GL_TEXTURE_2D);
1153 EXPECT_FALSE(manager_->CanRender(texture)); 1175 EXPECT_FALSE(manager_->CanRender(texture_ref));
1154 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 1176 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
1155 // Remove it. 1177 // Remove it.
1156 manager_->RemoveTexture(kClient2Id); 1178 manager_->RemoveTexture(kClient2Id);
1157 EXPECT_FALSE(manager_->CanRender(texture)); 1179 EXPECT_FALSE(manager_->CanRender(texture_ref));
1158 EXPECT_TRUE(manager_->HaveUnrenderableTextures()); 1180 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
1159 // Check that we can still manipulate it and it effects the manager. 1181 // Check that we can still manipulate it and it effects the manager.
1160 manager_->SetLevelInfo(texture, 1182 manager_->SetLevelInfo(texture_ref,
1161 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1183 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1162 EXPECT_TRUE(manager_->CanRender(texture)); 1184 EXPECT_TRUE(manager_->CanRender(texture_ref));
1163 EXPECT_FALSE(manager_->HaveUnrenderableTextures()); 1185 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
1164 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id))) 1186 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
1165 .Times(1) 1187 .Times(1)
1166 .RetiresOnSaturation(); 1188 .RetiresOnSaturation();
1167 texture = NULL; 1189 texture_ref = NULL;
1168 } 1190 }
1169 1191
1170 TEST_F(TextureTest, GetLevelImage) { 1192 TEST_F(TextureTest, GetLevelImage) {
1171 manager_->SetTarget(texture_, GL_TEXTURE_2D); 1193 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
1172 manager_->SetLevelInfo(texture_, 1194 manager_->SetLevelInfo(texture_ref_,
1173 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 1195 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
1174 EXPECT_TRUE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); 1196 Texture* texture = texture_ref_->texture();
1197 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1175 // Set image. 1198 // Set image.
1176 manager_->SetLevelImage(texture_, 1199 manager_->SetLevelImage(texture_ref_,
1177 GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0)); 1200 GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0));
1178 EXPECT_FALSE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); 1201 EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1179 // Remove it. 1202 // Remove it.
1180 manager_->SetLevelImage(texture_, GL_TEXTURE_2D, 1, NULL); 1203 manager_->SetLevelImage(texture_ref_, GL_TEXTURE_2D, 1, NULL);
1181 EXPECT_TRUE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); 1204 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1182 manager_->SetLevelImage(texture_, 1205 manager_->SetLevelImage(texture_ref_,
1183 GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0)); 1206 GL_TEXTURE_2D, 1, gfx::GLImage::CreateGLImage(0));
1184 // Image should be reset when SetLevelInfo is called. 1207 // Image should be reset when SetLevelInfo is called.
1185 manager_->SetLevelInfo(texture_, 1208 manager_->SetLevelInfo(texture_ref_,
1186 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 1209 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
1187 EXPECT_TRUE(texture_->GetLevelImage(GL_TEXTURE_2D, 1) == NULL); 1210 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1188 } 1211 }
1189 1212
1190 namespace { 1213 namespace {
1191 1214
1192 bool InSet(std::set<std::string>* string_set, const std::string& str) { 1215 bool InSet(std::set<std::string>* string_set, const std::string& str) {
1193 std::pair<std::set<std::string>::iterator, bool> result = 1216 std::pair<std::set<std::string>::iterator, bool> result =
1194 string_set->insert(str); 1217 string_set->insert(str);
1195 return !result.second; 1218 return !result.second;
1196 } 1219 }
1197 1220
1198 } // anonymous namespace 1221 } // anonymous namespace
1199 1222
1200 TEST_F(TextureTest, AddToSignature) { 1223 TEST_F(TextureTest, AddToSignature) {
1201 manager_->SetTarget(texture_, GL_TEXTURE_2D); 1224 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
1202 manager_->SetLevelInfo(texture_, 1225 manager_->SetLevelInfo(texture_ref_,
1203 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 1226 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
1204 std::string signature1; 1227 std::string signature1;
1205 std::string signature2; 1228 std::string signature2;
1206 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature1); 1229 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature1);
1207 1230
1208 std::set<std::string> string_set; 1231 std::set<std::string> string_set;
1209 EXPECT_FALSE(InSet(&string_set, signature1)); 1232 EXPECT_FALSE(InSet(&string_set, signature1));
1210 1233
1211 // check changing 1 thing makes a different signature. 1234 // check changing 1 thing makes a different signature.
1212 manager_->SetLevelInfo(texture_, 1235 manager_->SetLevelInfo(texture_ref_,
1213 GL_TEXTURE_2D, 1, GL_RGBA, 4, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 1236 GL_TEXTURE_2D, 1, GL_RGBA, 4, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
1214 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1237 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1215 EXPECT_FALSE(InSet(&string_set, signature2)); 1238 EXPECT_FALSE(InSet(&string_set, signature2));
1216 1239
1217 // check putting it back makes the same signature. 1240 // check putting it back makes the same signature.
1218 manager_->SetLevelInfo(texture_, 1241 manager_->SetLevelInfo(texture_ref_,
1219 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true); 1242 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
1220 signature2.clear(); 1243 signature2.clear();
1221 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1244 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1222 EXPECT_EQ(signature1, signature2); 1245 EXPECT_EQ(signature1, signature2);
1223 1246
1224 // Check setting cleared status does not change signature. 1247 // Check setting cleared status does not change signature.
1225 manager_->SetLevelInfo(texture_, 1248 manager_->SetLevelInfo(texture_ref_,
1226 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1249 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1227 signature2.clear(); 1250 signature2.clear();
1228 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1251 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1229 EXPECT_EQ(signature1, signature2); 1252 EXPECT_EQ(signature1, signature2);
1230 1253
1231 // Check changing other settings changes signature. 1254 // Check changing other settings changes signature.
1232 manager_->SetLevelInfo(texture_, 1255 manager_->SetLevelInfo(texture_ref_,
1233 GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1256 GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1234 signature2.clear(); 1257 signature2.clear();
1235 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1258 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1236 EXPECT_FALSE(InSet(&string_set, signature2)); 1259 EXPECT_FALSE(InSet(&string_set, signature2));
1237 1260
1238 manager_->SetLevelInfo(texture_, 1261 manager_->SetLevelInfo(texture_ref_,
1239 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); 1262 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
1240 signature2.clear(); 1263 signature2.clear();
1241 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1264 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1242 EXPECT_FALSE(InSet(&string_set, signature2)); 1265 EXPECT_FALSE(InSet(&string_set, signature2));
1243 1266
1244 manager_->SetLevelInfo(texture_, 1267 manager_->SetLevelInfo(texture_ref_,
1245 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, false); 1268 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, false);
1246 signature2.clear(); 1269 signature2.clear();
1247 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1270 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1248 EXPECT_FALSE(InSet(&string_set, signature2)); 1271 EXPECT_FALSE(InSet(&string_set, signature2));
1249 1272
1250 manager_->SetLevelInfo(texture_, 1273 manager_->SetLevelInfo(texture_ref_,
1251 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, false); 1274 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, false);
1252 signature2.clear(); 1275 signature2.clear();
1253 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1276 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1254 EXPECT_FALSE(InSet(&string_set, signature2)); 1277 EXPECT_FALSE(InSet(&string_set, signature2));
1255 1278
1256 manager_->SetLevelInfo(texture_, 1279 manager_->SetLevelInfo(texture_ref_,
1257 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_FLOAT, 1280 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_FLOAT,
1258 false); 1281 false);
1259 signature2.clear(); 1282 signature2.clear();
1260 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1283 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1261 EXPECT_FALSE(InSet(&string_set, signature2)); 1284 EXPECT_FALSE(InSet(&string_set, signature2));
1262 1285
1263 // put it back 1286 // put it back
1264 manager_->SetLevelInfo(texture_, 1287 manager_->SetLevelInfo(texture_ref_,
1265 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 1288 GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1266 false); 1289 false);
1267 signature2.clear(); 1290 signature2.clear();
1268 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1291 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1269 EXPECT_EQ(signature1, signature2); 1292 EXPECT_EQ(signature1, signature2);
1270 1293
1271 // check changing parameters changes signature. 1294 // check changing parameters changes signature.
1272 SetParameter(texture_, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR); 1295 SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
1273 signature2.clear(); 1296 signature2.clear();
1274 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1297 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1275 EXPECT_FALSE(InSet(&string_set, signature2)); 1298 EXPECT_FALSE(InSet(&string_set, signature2));
1276 1299
1277 SetParameter( 1300 SetParameter(texture_ref_, GL_TEXTURE_MIN_FILTER,
1278 texture_, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR, GL_NO_ERROR); 1301 GL_NEAREST_MIPMAP_LINEAR, GL_NO_ERROR);
1279 SetParameter(texture_, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); 1302 SetParameter(texture_ref_, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1280 signature2.clear(); 1303 signature2.clear();
1281 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1304 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1282 EXPECT_FALSE(InSet(&string_set, signature2)); 1305 EXPECT_FALSE(InSet(&string_set, signature2));
1283 1306
1284 SetParameter(texture_, GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR); 1307 SetParameter(texture_ref_, GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR);
1285 SetParameter(texture_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); 1308 SetParameter(texture_ref_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
1286 signature2.clear(); 1309 signature2.clear();
1287 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1310 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1288 EXPECT_FALSE(InSet(&string_set, signature2)); 1311 EXPECT_FALSE(InSet(&string_set, signature2));
1289 1312
1290 SetParameter(texture_, GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR); 1313 SetParameter(texture_ref_, GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR);
1291 SetParameter(texture_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); 1314 SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
1292 signature2.clear(); 1315 signature2.clear();
1293 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1316 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1294 EXPECT_FALSE(InSet(&string_set, signature2)); 1317 EXPECT_FALSE(InSet(&string_set, signature2));
1295 1318
1296 // Check putting it back genenerates the same signature 1319 // Check putting it back genenerates the same signature
1297 SetParameter(texture_, GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR); 1320 SetParameter(texture_ref_, GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR);
1298 signature2.clear(); 1321 signature2.clear();
1299 manager_->AddToSignature(texture_, GL_TEXTURE_2D, 1, &signature2); 1322 manager_->AddToSignature(texture_ref_, GL_TEXTURE_2D, 1, &signature2);
1300 EXPECT_EQ(signature1, signature2); 1323 EXPECT_EQ(signature1, signature2);
1301 1324
1302 // Check the set was acutally getting different signatures. 1325 // Check the set was acutally getting different signatures.
1303 EXPECT_EQ(11u, string_set.size()); 1326 EXPECT_EQ(11u, string_set.size());
1304 } 1327 }
1305 1328
1306 class SaveRestoreTextureTest : public TextureTest { 1329 class SaveRestoreTextureTest : public TextureTest {
1307 public: 1330 public:
1308 virtual void SetUp() { 1331 virtual void SetUp() {
1309 TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external"); 1332 TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external");
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1370 GLenum target; 1393 GLenum target;
1371 GLenum format; 1394 GLenum format;
1372 GLsizei width; 1395 GLsizei width;
1373 GLsizei height; 1396 GLsizei height;
1374 GLsizei depth; 1397 GLsizei depth;
1375 GLint border; 1398 GLint border;
1376 GLenum type; 1399 GLenum type;
1377 bool cleared; 1400 bool cleared;
1378 }; 1401 };
1379 1402
1380 void SetLevelInfo(Texture* texture, GLint level, const LevelInfo& info) { 1403 void SetLevelInfo(TextureRef* texture_ref,
1381 manager_->SetLevelInfo(texture, 1404 GLint level,
1405 const LevelInfo& info) {
1406 manager_->SetLevelInfo(texture_ref,
1382 info.target, 1407 info.target,
1383 level, 1408 level,
1384 info.format, 1409 info.format,
1385 info.width, 1410 info.width,
1386 info.height, 1411 info.height,
1387 info.depth, 1412 info.depth,
1388 info.border, 1413 info.border,
1389 info.format, 1414 info.format,
1390 info.type, 1415 info.type,
1391 info.cleared); 1416 info.cleared);
1392 } 1417 }
1393 1418
1394 static LevelInfo GetLevelInfo(const Texture* texture, 1419 static LevelInfo GetLevelInfo(const TextureRef* texture_ref,
1395 GLint target, 1420 GLint target,
1396 GLint level) { 1421 GLint level) {
1422 const Texture* texture = texture_ref->texture();
1397 LevelInfo info; 1423 LevelInfo info;
1398 info.target = target; 1424 info.target = target;
1399 EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width, 1425 EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width,
1400 &info.height)); 1426 &info.height));
1401 EXPECT_TRUE(texture->GetLevelType(target, level, &info.type, 1427 EXPECT_TRUE(texture->GetLevelType(target, level, &info.type,
1402 &info.format)); 1428 &info.format));
1403 info.cleared = texture->IsLevelCleared(target, level); 1429 info.cleared = texture->IsLevelCleared(target, level);
1404 return info; 1430 return info;
1405 } 1431 }
1406 1432
1407 TextureDefinition* Save(Texture* texture) { 1433 TextureDefinition* Save(TextureRef* texture_ref) {
1408 EXPECT_CALL(*gl_, GenTextures(_, _)) 1434 EXPECT_CALL(*gl_, GenTextures(_, _))
1409 .WillOnce(SetArgumentPointee<1>(kEmptyTextureServiceId)); 1435 .WillOnce(SetArgumentPointee<1>(kEmptyTextureServiceId));
1410 TextureDefinition* definition = manager_->Save(texture); 1436 TextureDefinition* definition = manager_->Save(texture_ref);
1411 EXPECT_TRUE(definition != NULL); 1437 EXPECT_TRUE(definition != NULL);
1412 return definition; 1438 return definition;
1413 } 1439 }
1414 1440
1415 void Restore(Texture* texture, TextureDefinition* definition) { 1441 void Restore(TextureRef* texture_ref, TextureDefinition* definition) {
1416 EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(texture->service_id()))) 1442 EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(texture_ref->service_id())))
1417 .Times(1).RetiresOnSaturation(); 1443 .Times(1).RetiresOnSaturation();
1418 EXPECT_CALL(*gl_, 1444 EXPECT_CALL(*gl_,
1419 BindTexture(definition->target(), definition->service_id())) 1445 BindTexture(definition->target(), definition->service_id()))
1420 .Times(1).RetiresOnSaturation(); 1446 .Times(1).RetiresOnSaturation();
1421 EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(AtLeast(1)); 1447 EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(AtLeast(1));
1422 1448
1423 EXPECT_TRUE( 1449 EXPECT_TRUE(manager_->Restore("TextureTest", decoder_.get(),
1424 manager_->Restore("TextureTest", decoder_.get(), texture, definition)); 1450 texture_ref, definition));
1425 } 1451 }
1426 1452
1427 scoped_refptr<Texture> texture2_; 1453 scoped_refptr<TextureRef> texture2_;
1428 1454
1429 private: 1455 private:
1430 static const GLuint kEmptyTextureServiceId; 1456 static const GLuint kEmptyTextureServiceId;
1431 static const GLuint kClient2Id; 1457 static const GLuint kClient2Id;
1432 static const GLuint kService2Id; 1458 static const GLuint kService2Id;
1433 }; 1459 };
1434 1460
1435 const GLuint SaveRestoreTextureTest::kClient2Id = 2; 1461 const GLuint SaveRestoreTextureTest::kClient2Id = 2;
1436 const GLuint SaveRestoreTextureTest::kService2Id = 12; 1462 const GLuint SaveRestoreTextureTest::kService2Id = 12;
1437 const GLuint SaveRestoreTextureTest::kEmptyTextureServiceId = 13; 1463 const GLuint SaveRestoreTextureTest::kEmptyTextureServiceId = 13;
1438 1464
1439 TEST_F(SaveRestoreTextureTest, SaveRestore2D) { 1465 TEST_F(SaveRestoreTextureTest, SaveRestore2D) {
1440 manager_->SetTarget(texture_, GL_TEXTURE_2D); 1466 manager_->SetTarget(texture_ref_, GL_TEXTURE_2D);
1441 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture_->target()); 1467 Texture* texture = texture_ref_->texture();
1468 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1442 LevelInfo level0( 1469 LevelInfo level0(
1443 GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true); 1470 GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true);
1444 SetLevelInfo(texture_, 0, level0); 1471 SetLevelInfo(texture_ref_, 0, level0);
1445 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_)); 1472 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_));
1446 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 1473 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1447 LevelInfo level1 = GetLevelInfo(texture_.get(), GL_TEXTURE_2D, 1); 1474 LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1);
1448 LevelInfo level2 = GetLevelInfo(texture_.get(), GL_TEXTURE_2D, 2); 1475 LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2);
1449 scoped_ptr<TextureDefinition> definition(Save(texture_)); 1476 scoped_ptr<TextureDefinition> definition(Save(texture_ref_));
1450 const TextureDefinition::LevelInfos& infos = definition->level_infos(); 1477 const TextureDefinition::LevelInfos& infos = definition->level_infos();
1451 EXPECT_EQ(1U, infos.size()); 1478 EXPECT_EQ(1U, infos.size());
1452 EXPECT_EQ(3U, infos[0].size()); 1479 EXPECT_EQ(3U, infos[0].size());
1453 1480
1454 // Make this texture bigger with more levels, and make sure they get 1481 // Make this texture bigger with more levels, and make sure they get
1455 // clobbered correctly during Restore(). 1482 // clobbered correctly during Restore().
1456 manager_->SetTarget(texture2_, GL_TEXTURE_2D); 1483 manager_->SetTarget(texture2_, GL_TEXTURE_2D);
1457 SetLevelInfo( 1484 SetLevelInfo(
1458 texture2_, 1485 texture2_,
1459 0, 1486 0,
1460 LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false)); 1487 LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false));
1461 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_)); 1488 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_));
1462 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture2_)); 1489 texture = texture2_->texture();
1463 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture2_->estimated_size()); 1490 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1491 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size());
1464 Restore(texture2_, definition.release()); 1492 Restore(texture2_, definition.release());
1465 EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 0)); 1493 EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 0));
1466 EXPECT_EQ(level1, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 1)); 1494 EXPECT_EQ(level1, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 1));
1467 EXPECT_EQ(level2, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 2)); 1495 EXPECT_EQ(level2, GetLevelInfo(texture2_.get(), GL_TEXTURE_2D, 2));
1468 EXPECT_EQ(64U + 16U + 4U, texture2_->estimated_size()); 1496 EXPECT_EQ(64U + 16U + 4U, texture->estimated_size());
1469 GLint w, h; 1497 GLint w, h;
1470 EXPECT_TRUE(texture2_->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h)); 1498 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h));
1471 EXPECT_EQ(0, w); 1499 EXPECT_EQ(0, w);
1472 EXPECT_EQ(0, h); 1500 EXPECT_EQ(0, h);
1473 } 1501 }
1474 1502
1475 TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) { 1503 TEST_F(SaveRestoreTextureTest, SaveRestoreClearRectangle) {
1476 manager_->SetTarget(texture_, GL_TEXTURE_RECTANGLE_ARB); 1504 manager_->SetTarget(texture_ref_, GL_TEXTURE_RECTANGLE_ARB);
1477 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture_->target()); 1505 Texture* texture = texture_ref_->texture();
1506 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target());
1478 LevelInfo level0( 1507 LevelInfo level0(
1479 GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false); 1508 GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
1480 SetLevelInfo(texture_, 0, level0); 1509 SetLevelInfo(texture_ref_, 0, level0);
1481 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 1510 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1482 scoped_ptr<TextureDefinition> definition(Save(texture_)); 1511 scoped_ptr<TextureDefinition> definition(Save(texture_ref_));
1483 const TextureDefinition::LevelInfos& infos = definition->level_infos(); 1512 const TextureDefinition::LevelInfos& infos = definition->level_infos();
1484 EXPECT_EQ(1U, infos.size()); 1513 EXPECT_EQ(1U, infos.size());
1485 EXPECT_EQ(1U, infos[0].size()); 1514 EXPECT_EQ(1U, infos[0].size());
1486 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), infos[0][0].target); 1515 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), infos[0][0].target);
1487 manager_->SetTarget(texture2_, GL_TEXTURE_RECTANGLE_ARB); 1516 manager_->SetTarget(texture2_, GL_TEXTURE_RECTANGLE_ARB);
1488 Restore(texture2_, definition.release()); 1517 Restore(texture2_, definition.release());
1489 1518
1490 // See if we can clear the previously uncleared level now. 1519 // See if we can clear the previously uncleared level now.
1491 EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); 1520 EXPECT_EQ(level0, GetLevelInfo(texture2_.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
1492 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) 1521 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
1493 .WillRepeatedly(Return(true)); 1522 .WillRepeatedly(Return(true));
1494 EXPECT_TRUE(manager_->ClearTextureLevel( 1523 EXPECT_TRUE(manager_->ClearTextureLevel(
1495 decoder_.get(), texture2_, GL_TEXTURE_RECTANGLE_ARB, 0)); 1524 decoder_.get(), texture2_, GL_TEXTURE_RECTANGLE_ARB, 0));
1496 } 1525 }
1497 1526
1498 TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) { 1527 TEST_F(SaveRestoreTextureTest, SaveRestoreStreamTexture) {
1499 manager_->SetTarget(texture_, GL_TEXTURE_EXTERNAL_OES); 1528 manager_->SetTarget(texture_ref_, GL_TEXTURE_EXTERNAL_OES);
1500 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture_->target()); 1529 Texture* texture = texture_ref_->texture();
1501 manager_->SetStreamTexture(texture_, true); 1530 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
1502 GLuint service_id = texture_->service_id(); 1531 manager_->SetStreamTexture(texture_ref_, true);
1503 scoped_ptr<TextureDefinition> definition(Save(texture_)); 1532 GLuint service_id = texture->service_id();
1504 EXPECT_FALSE(texture_->IsStreamTexture()); 1533 scoped_ptr<TextureDefinition> definition(Save(texture_ref_));
1534 EXPECT_FALSE(texture->IsStreamTexture());
1505 manager_->SetTarget(texture2_, GL_TEXTURE_EXTERNAL_OES); 1535 manager_->SetTarget(texture2_, GL_TEXTURE_EXTERNAL_OES);
1506 Restore(texture2_, definition.release()); 1536 Restore(texture2_, definition.release());
1507 EXPECT_TRUE(texture2_->IsStreamTexture()); 1537 EXPECT_TRUE(texture2_->texture()->IsStreamTexture());
1508 EXPECT_TRUE(texture2_->IsImmutable()); 1538 EXPECT_TRUE(texture2_->texture()->IsImmutable());
1509 EXPECT_EQ(service_id, texture2_->service_id()); 1539 EXPECT_EQ(service_id, texture2_->service_id());
1510 } 1540 }
1511 1541
1512 TEST_F(SaveRestoreTextureTest, SaveRestoreCube) { 1542 TEST_F(SaveRestoreTextureTest, SaveRestoreCube) {
1513 manager_->SetTarget(texture_, GL_TEXTURE_CUBE_MAP); 1543 manager_->SetTarget(texture_ref_, GL_TEXTURE_CUBE_MAP);
1514 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture_->target()); 1544 Texture* texture = texture_ref_->texture();
1545 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
1515 LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 1546 LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
1516 GL_RGBA, 1547 GL_RGBA,
1517 1, 1548 1,
1518 1, 1549 1,
1519 1, 1550 1,
1520 0, 1551 0,
1521 GL_UNSIGNED_BYTE, 1552 GL_UNSIGNED_BYTE,
1522 true); 1553 true);
1523 LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 1554 LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1524 GL_RGBA, 1555 GL_RGBA,
1525 3, 1556 3,
1526 3, 1557 3,
1527 1, 1558 1,
1528 0, 1559 0,
1529 GL_UNSIGNED_BYTE, 1560 GL_UNSIGNED_BYTE,
1530 true); 1561 true);
1531 SetLevelInfo(texture_, 0, face0); 1562 SetLevelInfo(texture_ref_, 0, face0);
1532 SetLevelInfo(texture_, 0, face5); 1563 SetLevelInfo(texture_ref_, 0, face5);
1533 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture_)); 1564 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1534 scoped_ptr<TextureDefinition> definition(Save(texture_)); 1565 scoped_ptr<TextureDefinition> definition(Save(texture_ref_));
1535 const TextureDefinition::LevelInfos& infos = definition->level_infos(); 1566 const TextureDefinition::LevelInfos& infos = definition->level_infos();
1536 EXPECT_EQ(6U, infos.size()); 1567 EXPECT_EQ(6U, infos.size());
1537 EXPECT_EQ(1U, infos[0].size()); 1568 EXPECT_EQ(1U, infos[0].size());
1538 manager_->SetTarget(texture2_, GL_TEXTURE_CUBE_MAP); 1569 manager_->SetTarget(texture2_, GL_TEXTURE_CUBE_MAP);
1539 Restore(texture2_, definition.release()); 1570 Restore(texture2_, definition.release());
1540 EXPECT_EQ(face0, 1571 EXPECT_EQ(face0,
1541 GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0)); 1572 GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0));
1542 EXPECT_EQ(face5, 1573 EXPECT_EQ(face5,
1543 GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0)); 1574 GetLevelInfo(texture2_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0));
1544 } 1575 }
1545 1576
1577 class CountingMemoryTracker : public MemoryTracker {
1578 public:
1579 CountingMemoryTracker() {
1580 current_size_[0] = 0;
1581 current_size_[1] = 0;
1582 }
1583
1584 virtual void TrackMemoryAllocatedChange(size_t old_size,
1585 size_t new_size,
1586 Pool pool) OVERRIDE {
1587 DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
1588 current_size_[pool] += new_size - old_size;
1589 }
1590
1591 virtual bool EnsureGPUMemoryAvailable(size_t size_needed) OVERRIDE {
1592 return true;
1593 }
1594
1595 size_t GetSize(Pool pool) {
1596 DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
1597 return current_size_[pool];
1598 }
1599
1600 private:
1601 virtual ~CountingMemoryTracker() {}
1602
1603 size_t current_size_[2];
1604 DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker);
1605 };
1606
1607 class SharedTextureTest : public testing::Test {
1608 public:
1609 SharedTextureTest()
1610 : feature_info_(new FeatureInfo()) {
1611 }
1612
1613 virtual ~SharedTextureTest() {
1614 }
1615
1616 virtual void SetUp() {
1617 gl_.reset(new ::gfx::MockGLInterface());
1618 ::gfx::GLInterface::SetGLInterface(gl_.get());
1619
1620 memory_tracker1_ = new CountingMemoryTracker;
1621 texture_manager1_.reset(new TextureManager(
1622 memory_tracker1_, feature_info_.get(),
1623 TextureManagerTest::kMaxTextureSize,
1624 TextureManagerTest::kMaxCubeMapTextureSize));
1625 memory_tracker2_ = new CountingMemoryTracker;
1626 texture_manager2_.reset(new TextureManager(
1627 memory_tracker2_, feature_info_.get(),
1628 TextureManagerTest::kMaxTextureSize,
1629 TextureManagerTest::kMaxCubeMapTextureSize));
1630 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
1631 texture_manager1_->Initialize();
1632 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
1633 texture_manager2_->Initialize();
1634 }
1635
1636 virtual void TearDown() {
1637 texture_manager2_->Destroy(false);
1638 texture_manager2_.reset();
1639 texture_manager1_->Destroy(false);
1640 texture_manager1_.reset();
1641 ::gfx::GLInterface::SetGLInterface(NULL);
1642 gl_.reset();
1643 }
1644
1645 protected:
1646 scoped_ptr< ::gfx::MockGLInterface > gl_;
1647 scoped_refptr<FeatureInfo> feature_info_;
1648 scoped_refptr<CountingMemoryTracker> memory_tracker1_;
1649 scoped_ptr<TextureManager> texture_manager1_;
1650 scoped_refptr<CountingMemoryTracker> memory_tracker2_;
1651 scoped_ptr<TextureManager> texture_manager2_;
1652 };
1653
1654 TEST_F(SharedTextureTest, DeleteTextures) {
1655 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
1656 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(),
1657 ref1->texture());
1658 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1659 .Times(0);
1660 ref1 = NULL;
1661 texture_manager1_->RemoveTexture(10);
1662 testing::Mock::VerifyAndClearExpectations(gl_.get());
1663
1664 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1665 .Times(1)
1666 .RetiresOnSaturation();
1667 ref2 = NULL;
1668 testing::Mock::VerifyAndClearExpectations(gl_.get());
1669 }
1670
1671 TEST_F(SharedTextureTest, TextureSafetyAccounting) {
1672 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
1673 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
1674 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
1675 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
1676 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
1677 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
1678
1679 // Newly created texture is unrenderable.
1680 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
1681 EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures());
1682 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
1683 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
1684
1685 // Associate new texture ref to other texture manager, should account for it
1686 // too.
1687 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(),
1688 ref1->texture());
1689 EXPECT_TRUE(texture_manager2_->HaveUnrenderableTextures());
1690 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
1691 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
1692
1693 // Make texture renderable but uncleared on one texture manager, should affect
1694 // other one.
1695 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D);
1696 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0,
1697 GL_RGBA, GL_UNSIGNED_BYTE, false);
1698 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
1699 EXPECT_TRUE(texture_manager1_->HaveUnsafeTextures());
1700 EXPECT_TRUE(texture_manager1_->HaveUnclearedMips());
1701 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
1702 EXPECT_TRUE(texture_manager2_->HaveUnsafeTextures());
1703 EXPECT_TRUE(texture_manager2_->HaveUnclearedMips());
1704
1705 // Make texture cleared on one texture manager, should affect other one.
1706 texture_manager1_->SetLevelCleared(ref1, GL_TEXTURE_2D, 0, true);
1707 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
1708 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
1709 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
1710 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
1711
1712 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1713 .Times(1)
1714 .RetiresOnSaturation();
1715 texture_manager1_->RemoveTexture(10);
1716 }
1717
1718 TEST_F(SharedTextureTest, FBOCompletenessCheck) {
1719 const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE;
1720 FramebufferManager framebuffer_manager1(1, 1);
1721 texture_manager1_->set_framebuffer_manager(&framebuffer_manager1);
1722 FramebufferManager framebuffer_manager2(1, 1);
1723 texture_manager2_->set_framebuffer_manager(&framebuffer_manager2);
1724
1725 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
1726 framebuffer_manager1.CreateFramebuffer(10, 10);
1727 scoped_refptr<Framebuffer> framebuffer1 =
1728 framebuffer_manager1.GetFramebuffer(10);
1729 framebuffer1->AttachTexture(GL_COLOR_ATTACHMENT0, ref1, GL_TEXTURE_2D, 0);
1730 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1));
1731 EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete());
1732
1733 // Make FBO complete in manager 1.
1734 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D);
1735 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0,
1736 GL_RGBA, GL_UNSIGNED_BYTE, true);
1737 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
1738 framebuffer_manager1.MarkAsComplete(framebuffer1);
1739 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1));
1740
1741 // Share texture with manager 2.
1742 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(),
1743 ref1->texture());
1744 framebuffer_manager2.CreateFramebuffer(20, 20);
1745 scoped_refptr<Framebuffer> framebuffer2 =
1746 framebuffer_manager2.GetFramebuffer(20);
1747 framebuffer2->AttachTexture(GL_COLOR_ATTACHMENT0, ref2, GL_TEXTURE_2D, 0);
1748 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2));
1749 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
1750 framebuffer_manager2.MarkAsComplete(framebuffer2);
1751 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2));
1752
1753 // Change level for texture, both FBOs should be marked incomplete
1754 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0,
1755 GL_RGBA, GL_UNSIGNED_BYTE, true);
1756 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1));
1757 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
1758 framebuffer_manager1.MarkAsComplete(framebuffer1);
1759 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1));
1760 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2));
1761 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
1762 framebuffer_manager2.MarkAsComplete(framebuffer2);
1763 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2));
1764
1765 EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _))
1766 .Times(2)
1767 .RetiresOnSaturation();
1768 framebuffer_manager1.RemoveFramebuffer(10);
1769 framebuffer_manager2.RemoveFramebuffer(20);
1770 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1771 .Times(1)
1772 .RetiresOnSaturation();
1773 texture_manager1_->RemoveTexture(10);
1774 }
1775
1776 TEST_F(SharedTextureTest, Memory) {
1777 size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged);
1778 size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged);
1779
1780 // Newly created texture is unrenderable.
1781 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
1782 texture_manager1_->SetTarget(ref1, GL_TEXTURE_2D);
1783 texture_manager1_->SetLevelInfo(ref1, GL_TEXTURE_2D, 0, GL_RGBA, 10, 10, 1, 0,
1784 GL_RGBA, GL_UNSIGNED_BYTE, false);
1785
1786 EXPECT_LT(0u, ref1->texture()->estimated_size());
1787 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
1788 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
1789
1790 // Associate new texture ref to other texture manager, it doesn't account for
1791 // the texture memory, the first memory tracker still has it.
1792 scoped_refptr<TextureRef> ref2 = new TextureRef(texture_manager2_.get(),
1793 ref1->texture());
1794 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
1795 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
1796 EXPECT_EQ(initial_memory2,
1797 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
1798
1799 // Delete the texture, memory should go to the remaining tracker.
1800 texture_manager1_->RemoveTexture(10);
1801 ref1 = NULL;
1802 EXPECT_EQ(initial_memory1,
1803 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
1804 EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(),
1805 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
1806
1807 EXPECT_CALL(*gl_, DeleteTextures(1, _))
1808 .Times(1)
1809 .RetiresOnSaturation();
1810 ref2 = NULL;
1811 EXPECT_EQ(initial_memory2,
1812 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
1813 }
1814
1546 } // namespace gles2 1815 } // namespace gles2
1547 } // namespace gpu 1816 } // namespace gpu
1548
1549
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/texture_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698