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
3 // found in the LICENSE file.
5 #include "gpu/command_buffer/service/texture_manager.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "gpu/command_buffer/service/error_state_mock.h"
9 #include "gpu/command_buffer/service/feature_info.h"
10 #include "gpu/command_buffer/service/framebuffer_manager.h"
11 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
12 #include "gpu/command_buffer/service/mailbox_manager.h"
13 #include "gpu/command_buffer/service/memory_tracking.h"
14 #include "gpu/command_buffer/service/mocks.h"
15 #include "gpu/command_buffer/service/test_helper.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "ui/gl/gl_mock.h"
19 using ::testing::AtLeast;
20 using ::testing::Pointee;
21 using ::testing::Return;
22 using ::testing::SetArgumentPointee;
23 using ::testing::StrictMock;
29 class TextureTestHelper {
31 static bool IsNPOT(const Texture* texture) {
32 return texture->npot();
34 static bool IsTextureComplete(const Texture* texture) {
35 return texture->texture_complete();
37 static bool IsCubeComplete(const Texture* texture) {
38 return texture->cube_complete();
42 class TextureManagerTest : public testing::Test {
44 static const GLint kMaxTextureSize = 16;
45 static const GLint kMaxCubeMapTextureSize = 8;
46 static const GLint kMaxExternalTextureSize = 16;
47 static const GLint kMax2dLevels = 5;
48 static const GLint kMaxCubeMapLevels = 4;
49 static const GLint kMaxExternalLevels = 1;
52 : feature_info_(new FeatureInfo()) {
55 virtual ~TextureManagerTest() {
59 virtual void SetUp() {
60 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
61 ::gfx::GLInterface::SetGLInterface(gl_.get());
63 manager_.reset(new TextureManager(
64 NULL, feature_info_.get(),
65 kMaxTextureSize, kMaxCubeMapTextureSize));
66 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
67 manager_->Initialize();
68 error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
71 virtual void TearDown() {
72 manager_->Destroy(false);
74 ::gfx::GLInterface::SetGLInterface(NULL);
79 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
80 TestHelper::SetTexParameterWithExpectations(
81 gl_.get(), error_state_.get(), manager_.get(),
82 texture_ref, pname, value, error);
85 // Use StrictMock to make 100% sure we know how GL will be called.
86 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
87 scoped_refptr<FeatureInfo> feature_info_;
88 scoped_ptr<TextureManager> manager_;
89 scoped_ptr<MockErrorState> error_state_;
92 // GCC requires these declarations, but MSVC requires they not be present
94 const GLint TextureManagerTest::kMaxTextureSize;
95 const GLint TextureManagerTest::kMaxCubeMapTextureSize;
96 const GLint TextureManagerTest::kMaxExternalTextureSize;
97 const GLint TextureManagerTest::kMax2dLevels;
98 const GLint TextureManagerTest::kMaxCubeMapLevels;
99 const GLint TextureManagerTest::kMaxExternalLevels;
102 TEST_F(TextureManagerTest, Basic) {
103 const GLuint kClient1Id = 1;
104 const GLuint kService1Id = 11;
105 const GLuint kClient2Id = 2;
106 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
107 EXPECT_FALSE(manager_->HaveUnsafeTextures());
108 EXPECT_FALSE(manager_->HaveUnclearedMips());
109 // Check we can create texture.
110 manager_->CreateTexture(kClient1Id, kService1Id);
111 // Check texture got created.
112 scoped_refptr<TextureRef> texture = manager_->GetTexture(kClient1Id);
113 ASSERT_TRUE(texture.get() != NULL);
114 EXPECT_EQ(kService1Id, texture->service_id());
115 EXPECT_EQ(kClient1Id, texture->client_id());
116 EXPECT_EQ(texture->texture(), manager_->GetTextureForServiceId(
117 texture->service_id()));
118 // Check we get nothing for a non-existent texture.
119 EXPECT_TRUE(manager_->GetTexture(kClient2Id) == NULL);
120 // Check trying to a remove non-existent textures does not crash.
121 manager_->RemoveTexture(kClient2Id);
122 // Check that it gets deleted when the last reference is released.
123 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
125 .RetiresOnSaturation();
126 // Check we can't get the texture after we remove it.
127 manager_->RemoveTexture(kClient1Id);
128 EXPECT_TRUE(manager_->GetTexture(kClient1Id) == NULL);
129 EXPECT_EQ(0u, texture->client_id());
132 TEST_F(TextureManagerTest, SetParameter) {
133 const GLuint kClient1Id = 1;
134 const GLuint kService1Id = 11;
135 // Check we can create texture.
136 manager_->CreateTexture(kClient1Id, kService1Id);
137 // Check texture got created.
138 TextureRef* texture_ref = manager_->GetTexture(kClient1Id);
139 ASSERT_TRUE(texture_ref != NULL);
140 Texture* texture = texture_ref->texture();
141 manager_->SetTarget(texture_ref, GL_TEXTURE_2D);
142 SetParameter(texture_ref, GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
143 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
144 SetParameter(texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
145 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->mag_filter());
146 SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
147 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
148 SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
149 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
150 SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1, GL_NO_ERROR);
151 SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2, GL_NO_ERROR);
153 texture_ref, GL_TEXTURE_MIN_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
154 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
156 texture_ref, GL_TEXTURE_MAG_FILTER, GL_CLAMP_TO_EDGE, GL_INVALID_ENUM);
157 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST), texture->min_filter());
158 SetParameter(texture_ref, GL_TEXTURE_WRAP_S, GL_NEAREST, GL_INVALID_ENUM);
159 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_s());
160 SetParameter(texture_ref, GL_TEXTURE_WRAP_T, GL_NEAREST, GL_INVALID_ENUM);
161 EXPECT_EQ(static_cast<GLenum>(GL_CLAMP_TO_EDGE), texture->wrap_t());
162 SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE);
165 TEST_F(TextureManagerTest, TextureUsageExt) {
166 TestHelper::SetupTextureManagerInitExpectations(gl_.get(),
167 "GL_ANGLE_texture_usage");
168 TextureManager manager(
169 NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
170 manager.Initialize();
171 const GLuint kClient1Id = 1;
172 const GLuint kService1Id = 11;
173 // Check we can create texture.
174 manager.CreateTexture(kClient1Id, kService1Id);
175 // Check texture got created.
176 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
177 ASSERT_TRUE(texture_ref != NULL);
178 TestHelper::SetTexParameterWithExpectations(
179 gl_.get(), error_state_.get(), &manager, texture_ref,
180 GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE,GL_NO_ERROR);
181 EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE),
182 texture_ref->texture()->usage());
183 manager.Destroy(false);
186 TEST_F(TextureManagerTest, Destroy) {
187 const GLuint kClient1Id = 1;
188 const GLuint kService1Id = 11;
189 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
190 TextureManager manager(
191 NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
192 manager.Initialize();
193 // Check we can create texture.
194 manager.CreateTexture(kClient1Id, kService1Id);
195 // Check texture got created.
196 TextureRef* texture = manager.GetTexture(kClient1Id);
197 ASSERT_TRUE(texture != NULL);
198 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
200 .RetiresOnSaturation();
201 TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), "");
202 manager.Destroy(true);
203 // Check that resources got freed.
204 texture = manager.GetTexture(kClient1Id);
205 ASSERT_TRUE(texture == NULL);
208 TEST_F(TextureManagerTest, MaxValues) {
209 // Check we get the right values for the max sizes.
210 EXPECT_EQ(kMax2dLevels, manager_->MaxLevelsForTarget(GL_TEXTURE_2D));
211 EXPECT_EQ(kMaxCubeMapLevels,
212 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP));
213 EXPECT_EQ(kMaxCubeMapLevels,
214 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X));
215 EXPECT_EQ(kMaxCubeMapLevels,
216 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X));
217 EXPECT_EQ(kMaxCubeMapLevels,
218 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y));
219 EXPECT_EQ(kMaxCubeMapLevels,
220 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y));
221 EXPECT_EQ(kMaxCubeMapLevels,
222 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z));
223 EXPECT_EQ(kMaxCubeMapLevels,
224 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z));
225 EXPECT_EQ(kMaxExternalLevels,
226 manager_->MaxLevelsForTarget(GL_TEXTURE_EXTERNAL_OES));
227 EXPECT_EQ(kMaxTextureSize, manager_->MaxSizeForTarget(GL_TEXTURE_2D));
228 EXPECT_EQ(kMaxCubeMapTextureSize,
229 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP));
230 EXPECT_EQ(kMaxCubeMapTextureSize,
231 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X));
232 EXPECT_EQ(kMaxCubeMapTextureSize,
233 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X));
234 EXPECT_EQ(kMaxCubeMapTextureSize,
235 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y));
236 EXPECT_EQ(kMaxCubeMapTextureSize,
237 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y));
238 EXPECT_EQ(kMaxCubeMapTextureSize,
239 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z));
240 EXPECT_EQ(kMaxCubeMapTextureSize,
241 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z));
242 EXPECT_EQ(kMaxExternalTextureSize,
243 manager_->MaxSizeForTarget(GL_TEXTURE_EXTERNAL_OES));
246 TEST_F(TextureManagerTest, ValidForTarget) {
248 EXPECT_TRUE(manager_->ValidForTarget(
249 GL_TEXTURE_2D, 0, kMaxTextureSize, kMaxTextureSize, 1));
250 EXPECT_TRUE(manager_->ValidForTarget(
251 GL_TEXTURE_2D, kMax2dLevels - 1, 1, 1, 1));
252 EXPECT_FALSE(manager_->ValidForTarget(
253 GL_TEXTURE_2D, kMax2dLevels - 1, 1, 2, 1));
254 EXPECT_FALSE(manager_->ValidForTarget(
255 GL_TEXTURE_2D, kMax2dLevels - 1, 2, 1, 1));
256 // check level out of range.
257 EXPECT_FALSE(manager_->ValidForTarget(
258 GL_TEXTURE_2D, kMax2dLevels, kMaxTextureSize, 1, 1));
260 EXPECT_FALSE(manager_->ValidForTarget(
261 GL_TEXTURE_2D, kMax2dLevels, kMaxTextureSize, 1, 2));
262 // Check NPOT width on level 0
263 EXPECT_TRUE(manager_->ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1));
264 // Check NPOT height on level 0
265 EXPECT_TRUE(manager_->ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1));
266 // Check NPOT width on level 1
267 EXPECT_FALSE(manager_->ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1));
268 // Check NPOT height on level 1
269 EXPECT_FALSE(manager_->ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1));
272 EXPECT_TRUE(manager_->ValidForTarget(
273 GL_TEXTURE_CUBE_MAP, 0,
274 kMaxCubeMapTextureSize, kMaxCubeMapTextureSize, 1));
275 EXPECT_TRUE(manager_->ValidForTarget(
276 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels - 1, 1, 1, 1));
277 EXPECT_FALSE(manager_->ValidForTarget(
278 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels - 1, 2, 2, 1));
279 // check level out of range.
280 EXPECT_FALSE(manager_->ValidForTarget(
281 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
282 kMaxCubeMapTextureSize, 1, 1));
284 EXPECT_FALSE(manager_->ValidForTarget(
285 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
286 kMaxCubeMapTextureSize, 1, 1));
288 EXPECT_FALSE(manager_->ValidForTarget(
289 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
290 kMaxCubeMapTextureSize, 1, 2));
292 for (GLint level = 0; level < kMax2dLevels; ++level) {
293 EXPECT_TRUE(manager_->ValidForTarget(
294 GL_TEXTURE_2D, level, kMaxTextureSize >> level, 1, 1));
295 EXPECT_TRUE(manager_->ValidForTarget(
296 GL_TEXTURE_2D, level, 1, kMaxTextureSize >> level, 1));
297 EXPECT_FALSE(manager_->ValidForTarget(
298 GL_TEXTURE_2D, level, (kMaxTextureSize >> level) + 1, 1, 1));
299 EXPECT_FALSE(manager_->ValidForTarget(
300 GL_TEXTURE_2D, level, 1, (kMaxTextureSize >> level) + 1, 1));
303 for (GLint level = 0; level < kMaxCubeMapLevels; ++level) {
304 EXPECT_TRUE(manager_->ValidForTarget(
305 GL_TEXTURE_CUBE_MAP, level,
306 kMaxCubeMapTextureSize >> level,
307 kMaxCubeMapTextureSize >> level,
309 EXPECT_FALSE(manager_->ValidForTarget(
310 GL_TEXTURE_CUBE_MAP, level,
311 (kMaxCubeMapTextureSize >> level) * 2,
312 (kMaxCubeMapTextureSize >> level) * 2,
317 TEST_F(TextureManagerTest, ValidForTargetNPOT) {
318 TestHelper::SetupFeatureInfoInitExpectations(
319 gl_.get(), "GL_OES_texture_npot");
320 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
321 feature_info->Initialize();
322 TextureManager manager(
323 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
324 // Check NPOT width on level 0
325 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1));
326 // Check NPOT height on level 0
327 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1));
328 // Check NPOT width on level 1
329 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1));
330 // Check NPOT height on level 1
331 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1));
332 manager.Destroy(false);
335 class TextureTestBase : public testing::Test {
337 static const GLint kMaxTextureSize = 16;
338 static const GLint kMaxCubeMapTextureSize = 8;
339 static const GLint kMax2dLevels = 5;
340 static const GLint kMaxCubeMapLevels = 4;
341 static const GLuint kClient1Id = 1;
342 static const GLuint kService1Id = 11;
345 : feature_info_(new FeatureInfo()) {
347 virtual ~TextureTestBase() {
352 void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) {
353 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
354 ::gfx::GLInterface::SetGLInterface(gl_.get());
356 if (!extensions.empty()) {
357 TestHelper::SetupFeatureInfoInitExpectations(gl_.get(),
359 feature_info_->Initialize();
362 manager_.reset(new TextureManager(
363 memory_tracker, feature_info_.get(),
364 kMaxTextureSize, kMaxCubeMapTextureSize));
365 decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>());
366 error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
367 manager_->CreateTexture(kClient1Id, kService1Id);
368 texture_ref_ = manager_->GetTexture(kClient1Id);
369 ASSERT_TRUE(texture_ref_.get() != NULL);
372 virtual void TearDown() {
373 if (texture_ref_.get()) {
374 // If it's not in the manager then setting texture_ref_ to NULL will
375 // delete the texture.
376 if (!texture_ref_->client_id()) {
377 // Check that it gets deleted when the last reference is released.
379 DeleteTextures(1, ::testing::Pointee(texture_ref_->service_id())))
381 .RetiresOnSaturation();
385 manager_->Destroy(false);
387 ::gfx::GLInterface::SetGLInterface(NULL);
392 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
393 TestHelper::SetTexParameterWithExpectations(
394 gl_.get(), error_state_.get(), manager_.get(),
395 texture_ref, pname, value, error);
398 scoped_ptr<MockGLES2Decoder> decoder_;
399 scoped_ptr<MockErrorState> error_state_;
400 // Use StrictMock to make 100% sure we know how GL will be called.
401 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
402 scoped_refptr<FeatureInfo> feature_info_;
403 scoped_ptr<TextureManager> manager_;
404 scoped_refptr<TextureRef> texture_ref_;
407 class TextureTest : public TextureTestBase {
409 virtual void SetUp() {
410 SetUpBase(NULL, std::string());
414 class TextureMemoryTrackerTest : public TextureTestBase {
416 virtual void SetUp() {
417 mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
418 SetUpBase(mock_memory_tracker_.get(), std::string());
421 scoped_refptr<MockMemoryTracker> mock_memory_tracker_;
424 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \
425 EXPECT_CALL(*mock_memory_tracker_.get(), \
426 TrackMemoryAllocatedChange(old_size, new_size, pool)) \
427 .Times(1).RetiresOnSaturation()
429 TEST_F(TextureTest, Basic) {
430 Texture* texture = texture_ref_->texture();
431 EXPECT_EQ(0u, texture->target());
432 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
433 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
434 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
435 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
436 EXPECT_EQ(0, texture->num_uncleared_mips());
437 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
438 EXPECT_TRUE(texture->SafeToRenderFrom());
439 EXPECT_FALSE(texture->IsImmutable());
440 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR),
441 texture->min_filter());
442 EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture->mag_filter());
443 EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_s());
444 EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_t());
445 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
446 EXPECT_FALSE(manager_->HaveUnsafeTextures());
447 EXPECT_EQ(0u, texture->estimated_size());
450 TEST_F(TextureTest, SetTargetTexture2D) {
451 Texture* texture = texture_ref_->texture();
452 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
453 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
454 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
455 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
456 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
457 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
458 EXPECT_TRUE(texture->SafeToRenderFrom());
459 EXPECT_FALSE(texture->IsImmutable());
462 TEST_F(TextureTest, SetTargetTextureExternalOES) {
463 Texture* texture = texture_ref_->texture();
464 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES);
465 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
466 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
467 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
468 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
469 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
470 EXPECT_TRUE(texture->SafeToRenderFrom());
471 EXPECT_TRUE(texture->IsImmutable());
474 TEST_F(TextureTest, ZeroSizeCanNotRender) {
475 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
476 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
477 manager_->SetLevelInfo(texture_ref_.get(),
488 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
489 manager_->SetLevelInfo(texture_ref_.get(),
500 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
503 TEST_F(TextureTest, EstimatedSize) {
504 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
505 manager_->SetLevelInfo(texture_ref_.get(),
516 EXPECT_EQ(8u * 4u * 4u, texture_ref_->texture()->estimated_size());
517 manager_->SetLevelInfo(texture_ref_.get(),
528 EXPECT_EQ(8u * 4u * 4u * 2u, texture_ref_->texture()->estimated_size());
531 TEST_F(TextureMemoryTrackerTest, EstimatedSize) {
532 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
533 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
534 manager_->SetLevelInfo(texture_ref_.get(),
545 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
546 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged);
547 manager_->SetLevelInfo(texture_ref_.get(),
558 // Add expectation for texture deletion.
559 EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged);
560 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
563 TEST_F(TextureMemoryTrackerTest, SetParameterPool) {
564 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
565 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
566 manager_->SetLevelInfo(texture_ref_.get(),
577 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
578 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged);
579 SetParameter(texture_ref_.get(),
580 GL_TEXTURE_POOL_CHROMIUM,
581 GL_TEXTURE_POOL_MANAGED_CHROMIUM,
583 // Add expectation for texture deletion.
584 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged);
585 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
586 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged);
589 TEST_F(TextureTest, POT2D) {
590 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
591 Texture* texture = texture_ref_->texture();
592 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
593 // Check Setting level 0 to POT
594 manager_->SetLevelInfo(texture_ref_.get(),
605 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
606 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
607 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
608 EXPECT_EQ(0, texture->num_uncleared_mips());
609 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
610 // Set filters to something that will work with a single mip.
612 texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
613 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
614 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
616 SetParameter(texture_ref_.get(),
617 GL_TEXTURE_MIN_FILTER,
618 GL_LINEAR_MIPMAP_LINEAR,
620 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
622 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
624 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
625 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
626 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
627 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
629 manager_->SetLevelInfo(texture_ref_.get(),
640 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
641 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
642 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
643 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
644 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
645 // Set a level past the number of mips that would get generated.
646 manager_->SetLevelInfo(texture_ref_.get(),
657 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
659 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
660 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
661 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
662 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
665 TEST_F(TextureMemoryTrackerTest, MarkMipmapsGenerated) {
666 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
667 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged);
668 manager_->SetLevelInfo(texture_ref_.get(),
679 EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged);
680 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged);
681 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
682 EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged);
683 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
686 TEST_F(TextureTest, UnusedMips) {
687 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
688 Texture* texture = texture_ref_->texture();
689 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
690 // Set level zero to large size.
691 manager_->SetLevelInfo(texture_ref_.get(),
702 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
703 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
704 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
705 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
706 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
707 // Set level zero to large smaller (levels unused mips)
708 manager_->SetLevelInfo(texture_ref_.get(),
719 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
720 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
721 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
722 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
723 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
724 // Set an unused level to some size
725 manager_->SetLevelInfo(texture_ref_.get(),
736 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
737 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
738 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
739 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
742 TEST_F(TextureTest, NPOT2D) {
743 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
744 Texture* texture = texture_ref_->texture();
745 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
746 // Check Setting level 0 to NPOT
747 manager_->SetLevelInfo(texture_ref_.get(),
758 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
759 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
760 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
761 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
762 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
764 texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
765 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
766 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
768 texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
769 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
770 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
772 texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
773 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
774 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
776 manager_->SetLevelInfo(texture_ref_.get(),
787 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
788 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
789 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
790 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
793 TEST_F(TextureTest, NPOT2DNPOTOK) {
794 TestHelper::SetupFeatureInfoInitExpectations(
795 gl_.get(), "GL_OES_texture_npot");
796 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
797 feature_info->Initialize();
798 TextureManager manager(
799 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
800 manager.CreateTexture(kClient1Id, kService1Id);
801 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
802 ASSERT_TRUE(texture_ref != NULL);
803 Texture* texture = texture_ref->texture();
805 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
806 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
807 // Check Setting level 0 to NPOT
808 manager.SetLevelInfo(texture_ref,
809 GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
810 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
811 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
812 EXPECT_TRUE(manager.CanGenerateMipmaps(texture_ref));
813 EXPECT_FALSE(manager.CanRender(texture_ref));
814 EXPECT_TRUE(manager.HaveUnrenderableTextures());
815 EXPECT_TRUE(manager.MarkMipmapsGenerated(texture_ref));
816 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
817 EXPECT_TRUE(manager.CanRender(texture_ref));
818 EXPECT_FALSE(manager.HaveUnrenderableTextures());
819 manager.Destroy(false);
822 TEST_F(TextureTest, POTCubeMap) {
823 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP);
824 Texture* texture = texture_ref_->texture();
825 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
826 // Check Setting level 0 each face to POT
827 manager_->SetLevelInfo(texture_ref_.get(),
828 GL_TEXTURE_CUBE_MAP_POSITIVE_X,
838 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
839 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
840 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
841 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
842 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
843 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
844 manager_->SetLevelInfo(texture_ref_.get(),
845 GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
855 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
856 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
857 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
858 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
859 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
860 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
861 manager_->SetLevelInfo(texture_ref_.get(),
862 GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
872 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
873 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
874 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
875 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
876 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
877 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
878 manager_->SetLevelInfo(texture_ref_.get(),
879 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
889 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
890 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
891 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
892 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
893 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
894 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
895 manager_->SetLevelInfo(texture_ref_.get(),
896 GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
906 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
907 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
908 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
909 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
910 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
911 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
912 manager_->SetLevelInfo(texture_ref_.get(),
913 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
923 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
924 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
925 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
926 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
927 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
928 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
931 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
932 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
933 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
934 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
935 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
938 manager_->SetLevelInfo(texture_ref_.get(),
939 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
949 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
950 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
951 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
952 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
953 // Set a level past the number of mips that would get generated.
954 manager_->SetLevelInfo(texture_ref_.get(),
955 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
965 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
967 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
968 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
969 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
972 TEST_F(TextureTest, GetLevelSize) {
973 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
974 manager_->SetLevelInfo(texture_ref_.get(),
987 Texture* texture = texture_ref_->texture();
988 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height));
989 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height));
990 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
991 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
993 EXPECT_EQ(5, height);
994 manager_->RemoveTexture(kClient1Id);
995 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
997 EXPECT_EQ(5, height);
1000 TEST_F(TextureTest, GetLevelType) {
1001 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1002 manager_->SetLevelInfo(texture_ref_.get(),
1015 Texture* texture = texture_ref_->texture();
1016 EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, -1, &type, &format));
1017 EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format));
1018 EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &format));
1019 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
1020 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1021 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
1022 manager_->RemoveTexture(kClient1Id);
1023 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
1024 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1025 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
1028 TEST_F(TextureTest, ValidForTexture) {
1029 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1030 manager_->SetLevelInfo(texture_ref_.get(),
1042 Texture* texture = texture_ref_->texture();
1043 EXPECT_FALSE(texture->ValidForTexture(
1044 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1045 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
1047 EXPECT_FALSE(texture->ValidForTexture(
1048 GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
1049 // Check bad xoffset.
1050 EXPECT_FALSE(texture->ValidForTexture(
1051 GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
1052 // Check bad xoffset + width > width.
1053 EXPECT_FALSE(texture->ValidForTexture(
1054 GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
1055 // Check bad yoffset.
1056 EXPECT_FALSE(texture->ValidForTexture(
1057 GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
1058 // Check bad yoffset + height > height.
1059 EXPECT_FALSE(texture->ValidForTexture(
1060 GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
1062 EXPECT_FALSE(texture->ValidForTexture(
1063 GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_RGBA, GL_UNSIGNED_BYTE));
1064 // Check bad height.
1065 EXPECT_FALSE(texture->ValidForTexture(
1066 GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_RGBA, GL_UNSIGNED_BYTE));
1067 // Check bad format.
1068 EXPECT_FALSE(texture->ValidForTexture(
1069 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGB, GL_UNSIGNED_BYTE));
1071 EXPECT_FALSE(texture->ValidForTexture(
1072 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4));
1073 // Check valid full size
1074 EXPECT_TRUE(texture->ValidForTexture(
1075 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
1076 // Check valid particial size.
1077 EXPECT_TRUE(texture->ValidForTexture(
1078 GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_RGBA, GL_UNSIGNED_BYTE));
1079 manager_->RemoveTexture(kClient1Id);
1080 EXPECT_TRUE(texture->ValidForTexture(
1081 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
1084 TEST_F(TextureTest, FloatNotLinear) {
1085 TestHelper::SetupFeatureInfoInitExpectations(
1086 gl_.get(), "GL_OES_texture_float");
1087 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1088 feature_info->Initialize();
1089 TextureManager manager(
1090 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
1091 manager.CreateTexture(kClient1Id, kService1Id);
1092 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1093 ASSERT_TRUE(texture_ref != NULL);
1094 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1095 Texture* texture = texture_ref->texture();
1096 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1097 manager.SetLevelInfo(texture_ref,
1098 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
1099 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
1100 TestHelper::SetTexParameterWithExpectations(
1101 gl_.get(), error_state_.get(), &manager,
1102 texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1103 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
1104 TestHelper::SetTexParameterWithExpectations(
1105 gl_.get(), error_state_.get(), &manager, texture_ref,
1106 GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
1107 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1108 manager.Destroy(false);
1111 TEST_F(TextureTest, FloatLinear) {
1112 TestHelper::SetupFeatureInfoInitExpectations(
1113 gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear");
1114 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1115 feature_info->Initialize();
1116 TextureManager manager(
1117 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
1118 manager.CreateTexture(kClient1Id, kService1Id);
1119 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1120 ASSERT_TRUE(texture_ref != NULL);
1121 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1122 Texture* texture = texture_ref->texture();
1123 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1124 manager.SetLevelInfo(texture_ref,
1125 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
1126 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1127 manager.Destroy(false);
1130 TEST_F(TextureTest, HalfFloatNotLinear) {
1131 TestHelper::SetupFeatureInfoInitExpectations(
1132 gl_.get(), "GL_OES_texture_half_float");
1133 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1134 feature_info->Initialize();
1135 TextureManager manager(
1136 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
1137 manager.CreateTexture(kClient1Id, kService1Id);
1138 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1139 ASSERT_TRUE(texture_ref != NULL);
1140 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1141 Texture* texture = texture_ref->texture();
1142 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1143 manager.SetLevelInfo(texture_ref,
1144 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
1145 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
1146 TestHelper::SetTexParameterWithExpectations(
1147 gl_.get(), error_state_.get(), &manager,
1148 texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1149 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
1150 TestHelper::SetTexParameterWithExpectations(
1151 gl_.get(), error_state_.get(), &manager, texture_ref,
1152 GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
1153 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1154 manager.Destroy(false);
1157 TEST_F(TextureTest, HalfFloatLinear) {
1158 TestHelper::SetupFeatureInfoInitExpectations(
1159 gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear");
1160 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1161 feature_info->Initialize();
1162 TextureManager manager(
1163 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
1164 manager.CreateTexture(kClient1Id, kService1Id);
1165 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1166 ASSERT_TRUE(texture_ref != NULL);
1167 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1168 Texture* texture = texture_ref->texture();
1169 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1170 manager.SetLevelInfo(texture_ref,
1171 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
1172 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1173 manager.Destroy(false);
1176 TEST_F(TextureTest, EGLImageExternal) {
1177 TestHelper::SetupFeatureInfoInitExpectations(
1178 gl_.get(), "GL_OES_EGL_image_external");
1179 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1180 feature_info->Initialize();
1181 TextureManager manager(
1182 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
1183 manager.CreateTexture(kClient1Id, kService1Id);
1184 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1185 ASSERT_TRUE(texture_ref != NULL);
1186 manager.SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
1187 Texture* texture = texture_ref->texture();
1188 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
1189 EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
1190 manager.Destroy(false);
1193 TEST_F(TextureTest, DepthTexture) {
1194 TestHelper::SetupFeatureInfoInitExpectations(
1195 gl_.get(), "GL_ANGLE_depth_texture");
1196 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1197 feature_info->Initialize();
1198 TextureManager manager(
1199 NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
1200 manager.CreateTexture(kClient1Id, kService1Id);
1201 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1202 ASSERT_TRUE(texture_ref != NULL);
1203 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1204 manager.SetLevelInfo(
1205 texture_ref, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0,
1206 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false);
1207 EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
1208 manager.Destroy(false);
1211 TEST_F(TextureTest, SafeUnsafe) {
1212 static const GLuint kClient2Id = 2;
1213 static const GLuint kService2Id = 12;
1214 static const GLuint kClient3Id = 3;
1215 static const GLuint kService3Id = 13;
1216 EXPECT_FALSE(manager_->HaveUnclearedMips());
1217 Texture* texture = texture_ref_->texture();
1218 EXPECT_EQ(0, texture->num_uncleared_mips());
1219 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1220 manager_->SetLevelInfo(texture_ref_.get(),
1231 EXPECT_FALSE(texture->SafeToRenderFrom());
1232 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1233 EXPECT_TRUE(manager_->HaveUnclearedMips());
1234 EXPECT_EQ(1, texture->num_uncleared_mips());
1235 manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 0, true);
1236 EXPECT_TRUE(texture->SafeToRenderFrom());
1237 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1238 EXPECT_FALSE(manager_->HaveUnclearedMips());
1239 EXPECT_EQ(0, texture->num_uncleared_mips());
1240 manager_->SetLevelInfo(texture_ref_.get(),
1251 EXPECT_FALSE(texture->SafeToRenderFrom());
1252 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1253 EXPECT_TRUE(manager_->HaveUnclearedMips());
1254 EXPECT_EQ(1, texture->num_uncleared_mips());
1255 manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 1, true);
1256 EXPECT_TRUE(texture->SafeToRenderFrom());
1257 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1258 EXPECT_FALSE(manager_->HaveUnclearedMips());
1259 EXPECT_EQ(0, texture->num_uncleared_mips());
1260 manager_->SetLevelInfo(texture_ref_.get(),
1271 manager_->SetLevelInfo(texture_ref_.get(),
1282 EXPECT_FALSE(texture->SafeToRenderFrom());
1283 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1284 EXPECT_TRUE(manager_->HaveUnclearedMips());
1285 EXPECT_EQ(2, texture->num_uncleared_mips());
1286 manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 0, true);
1287 EXPECT_FALSE(texture->SafeToRenderFrom());
1288 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1289 EXPECT_TRUE(manager_->HaveUnclearedMips());
1290 EXPECT_EQ(1, texture->num_uncleared_mips());
1291 manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 1, true);
1292 EXPECT_TRUE(texture->SafeToRenderFrom());
1293 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1294 EXPECT_FALSE(manager_->HaveUnclearedMips());
1295 EXPECT_EQ(0, texture->num_uncleared_mips());
1296 manager_->SetLevelInfo(texture_ref_.get(),
1307 EXPECT_FALSE(texture->SafeToRenderFrom());
1308 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1309 EXPECT_TRUE(manager_->HaveUnclearedMips());
1310 EXPECT_EQ(1, texture->num_uncleared_mips());
1311 manager_->MarkMipmapsGenerated(texture_ref_.get());
1312 EXPECT_TRUE(texture->SafeToRenderFrom());
1313 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1314 EXPECT_FALSE(manager_->HaveUnclearedMips());
1315 EXPECT_EQ(0, texture->num_uncleared_mips());
1317 manager_->CreateTexture(kClient2Id, kService2Id);
1318 scoped_refptr<TextureRef> texture_ref2(
1319 manager_->GetTexture(kClient2Id));
1320 ASSERT_TRUE(texture_ref2.get() != NULL);
1321 manager_->SetTarget(texture_ref2.get(), GL_TEXTURE_2D);
1322 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1323 EXPECT_FALSE(manager_->HaveUnclearedMips());
1324 Texture* texture2 = texture_ref2->texture();
1325 EXPECT_EQ(0, texture2->num_uncleared_mips());
1326 manager_->SetLevelInfo(texture_ref2.get(),
1337 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1338 EXPECT_FALSE(manager_->HaveUnclearedMips());
1339 EXPECT_EQ(0, texture2->num_uncleared_mips());
1340 manager_->SetLevelInfo(texture_ref2.get(),
1351 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1352 EXPECT_TRUE(manager_->HaveUnclearedMips());
1353 EXPECT_EQ(1, texture2->num_uncleared_mips());
1355 manager_->CreateTexture(kClient3Id, kService3Id);
1356 scoped_refptr<TextureRef> texture_ref3(
1357 manager_->GetTexture(kClient3Id));
1358 ASSERT_TRUE(texture_ref3.get() != NULL);
1359 manager_->SetTarget(texture_ref3.get(), GL_TEXTURE_2D);
1360 manager_->SetLevelInfo(texture_ref3.get(),
1371 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1372 EXPECT_TRUE(manager_->HaveUnclearedMips());
1373 Texture* texture3 = texture_ref3->texture();
1374 EXPECT_EQ(1, texture3->num_uncleared_mips());
1375 manager_->SetLevelCleared(texture_ref2.get(), GL_TEXTURE_2D, 0, true);
1376 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1377 EXPECT_TRUE(manager_->HaveUnclearedMips());
1378 EXPECT_EQ(0, texture2->num_uncleared_mips());
1379 manager_->SetLevelCleared(texture_ref3.get(), GL_TEXTURE_2D, 0, true);
1380 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1381 EXPECT_FALSE(manager_->HaveUnclearedMips());
1382 EXPECT_EQ(0, texture3->num_uncleared_mips());
1384 manager_->SetLevelInfo(texture_ref2.get(),
1395 manager_->SetLevelInfo(texture_ref3.get(),
1406 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1407 EXPECT_TRUE(manager_->HaveUnclearedMips());
1408 EXPECT_EQ(1, texture2->num_uncleared_mips());
1409 EXPECT_EQ(1, texture3->num_uncleared_mips());
1410 manager_->RemoveTexture(kClient3Id);
1411 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1412 EXPECT_TRUE(manager_->HaveUnclearedMips());
1413 manager_->RemoveTexture(kClient2Id);
1414 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1415 EXPECT_TRUE(manager_->HaveUnclearedMips());
1416 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
1418 .RetiresOnSaturation();
1419 texture_ref2 = NULL;
1420 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1421 EXPECT_TRUE(manager_->HaveUnclearedMips());
1422 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService3Id)))
1424 .RetiresOnSaturation();
1425 texture_ref3 = NULL;
1426 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1427 EXPECT_FALSE(manager_->HaveUnclearedMips());
1430 TEST_F(TextureTest, ClearTexture) {
1431 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
1432 .WillRepeatedly(Return(true));
1433 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1434 manager_->SetLevelInfo(texture_ref_.get(),
1445 manager_->SetLevelInfo(texture_ref_.get(),
1456 Texture* texture = texture_ref_->texture();
1457 EXPECT_FALSE(texture->SafeToRenderFrom());
1458 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1459 EXPECT_TRUE(manager_->HaveUnclearedMips());
1460 EXPECT_EQ(2, texture->num_uncleared_mips());
1461 manager_->ClearRenderableLevels(decoder_.get(), texture_ref_.get());
1462 EXPECT_TRUE(texture->SafeToRenderFrom());
1463 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1464 EXPECT_FALSE(manager_->HaveUnclearedMips());
1465 EXPECT_EQ(0, texture->num_uncleared_mips());
1466 manager_->SetLevelInfo(texture_ref_.get(),
1477 manager_->SetLevelInfo(texture_ref_.get(),
1488 EXPECT_FALSE(texture->SafeToRenderFrom());
1489 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1490 EXPECT_TRUE(manager_->HaveUnclearedMips());
1491 EXPECT_EQ(2, texture->num_uncleared_mips());
1492 manager_->ClearTextureLevel(
1493 decoder_.get(), texture_ref_.get(), GL_TEXTURE_2D, 0);
1494 EXPECT_FALSE(texture->SafeToRenderFrom());
1495 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1496 EXPECT_TRUE(manager_->HaveUnclearedMips());
1497 EXPECT_EQ(1, texture->num_uncleared_mips());
1498 manager_->ClearTextureLevel(
1499 decoder_.get(), texture_ref_.get(), GL_TEXTURE_2D, 1);
1500 EXPECT_TRUE(texture->SafeToRenderFrom());
1501 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1502 EXPECT_FALSE(manager_->HaveUnclearedMips());
1503 EXPECT_EQ(0, texture->num_uncleared_mips());
1506 TEST_F(TextureTest, UseDeletedTexture) {
1507 static const GLuint kClient2Id = 2;
1508 static const GLuint kService2Id = 12;
1509 // Make the default texture renderable
1510 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1511 manager_->SetLevelInfo(texture_ref_.get(),
1522 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
1523 // Make a new texture
1524 manager_->CreateTexture(kClient2Id, kService2Id);
1525 scoped_refptr<TextureRef> texture_ref(
1526 manager_->GetTexture(kClient2Id));
1527 manager_->SetTarget(texture_ref.get(), GL_TEXTURE_2D);
1528 EXPECT_FALSE(manager_->CanRender(texture_ref.get()));
1529 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
1531 manager_->RemoveTexture(kClient2Id);
1532 EXPECT_FALSE(manager_->CanRender(texture_ref.get()));
1533 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
1534 // Check that we can still manipulate it and it effects the manager.
1535 manager_->SetLevelInfo(texture_ref.get(),
1546 EXPECT_TRUE(manager_->CanRender(texture_ref.get()));
1547 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
1548 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
1550 .RetiresOnSaturation();
1554 TEST_F(TextureTest, GetLevelImage) {
1555 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1556 manager_->SetLevelInfo(texture_ref_.get(),
1567 Texture* texture = texture_ref_->texture();
1568 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1570 manager_->SetLevelImage(texture_ref_.get(),
1573 gfx::GLImage::CreateGLImage(0).get());
1574 EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1576 manager_->SetLevelImage(texture_ref_.get(), GL_TEXTURE_2D, 1, NULL);
1577 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1578 manager_->SetLevelImage(texture_ref_.get(),
1581 gfx::GLImage::CreateGLImage(0).get());
1582 // Image should be reset when SetLevelInfo is called.
1583 manager_->SetLevelInfo(texture_ref_.get(),
1594 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1599 bool InSet(std::set<std::string>* string_set, const std::string& str) {
1600 std::pair<std::set<std::string>::iterator, bool> result =
1601 string_set->insert(str);
1602 return !result.second;
1605 } // anonymous namespace
1607 TEST_F(TextureTest, AddToSignature) {
1608 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1609 manager_->SetLevelInfo(texture_ref_.get(),
1620 std::string signature1;
1621 std::string signature2;
1622 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature1);
1624 std::set<std::string> string_set;
1625 EXPECT_FALSE(InSet(&string_set, signature1));
1627 // check changing 1 thing makes a different signature.
1628 manager_->SetLevelInfo(texture_ref_.get(),
1639 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1640 EXPECT_FALSE(InSet(&string_set, signature2));
1642 // check putting it back makes the same signature.
1643 manager_->SetLevelInfo(texture_ref_.get(),
1655 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1656 EXPECT_EQ(signature1, signature2);
1658 // Check setting cleared status does not change signature.
1659 manager_->SetLevelInfo(texture_ref_.get(),
1671 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1672 EXPECT_EQ(signature1, signature2);
1674 // Check changing other settings changes signature.
1675 manager_->SetLevelInfo(texture_ref_.get(),
1687 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1688 EXPECT_FALSE(InSet(&string_set, signature2));
1690 manager_->SetLevelInfo(texture_ref_.get(),
1702 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1703 EXPECT_FALSE(InSet(&string_set, signature2));
1705 manager_->SetLevelInfo(texture_ref_.get(),
1717 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1718 EXPECT_FALSE(InSet(&string_set, signature2));
1720 manager_->SetLevelInfo(texture_ref_.get(),
1732 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1733 EXPECT_FALSE(InSet(&string_set, signature2));
1735 manager_->SetLevelInfo(texture_ref_.get(),
1747 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1748 EXPECT_FALSE(InSet(&string_set, signature2));
1751 manager_->SetLevelInfo(texture_ref_.get(),
1763 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1764 EXPECT_EQ(signature1, signature2);
1766 // check changing parameters changes signature.
1768 texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
1770 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1771 EXPECT_FALSE(InSet(&string_set, signature2));
1773 SetParameter(texture_ref_.get(),
1774 GL_TEXTURE_MIN_FILTER,
1775 GL_NEAREST_MIPMAP_LINEAR,
1778 texture_ref_.get(), GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1780 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1781 EXPECT_FALSE(InSet(&string_set, signature2));
1784 texture_ref_.get(), GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR);
1786 texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
1788 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1789 EXPECT_FALSE(InSet(&string_set, signature2));
1791 SetParameter(texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR);
1793 texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
1795 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1796 EXPECT_FALSE(InSet(&string_set, signature2));
1798 // Check putting it back genenerates the same signature
1799 SetParameter(texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR);
1801 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1802 EXPECT_EQ(signature1, signature2);
1804 // Check the set was acutally getting different signatures.
1805 EXPECT_EQ(11u, string_set.size());
1808 class ProduceConsumeTextureTest : public TextureTest {
1810 virtual void SetUp() {
1811 TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external");
1812 manager_->CreateTexture(kClient2Id, kService2Id);
1813 texture2_ = manager_->GetTexture(kClient2Id);
1815 EXPECT_CALL(*decoder_.get(), GetErrorState())
1816 .WillRepeatedly(Return(error_state_.get()));
1819 virtual void TearDown() {
1820 if (texture2_.get()) {
1821 // If it's not in the manager then setting texture2_ to NULL will
1822 // delete the texture.
1823 if (!texture2_->client_id()) {
1824 // Check that it gets deleted when the last reference is released.
1827 DeleteTextures(1, ::testing::Pointee(texture2_->service_id())))
1828 .Times(1).RetiresOnSaturation();
1832 TextureTest::TearDown();
1837 LevelInfo(GLenum target,
1864 bool operator==(const LevelInfo& other) const {
1865 return target == other.target && format == other.format &&
1866 width == other.width && height == other.height &&
1867 depth == other.depth && border == other.border &&
1868 type == other.type && cleared == other.cleared;
1881 void SetLevelInfo(TextureRef* texture_ref,
1883 const LevelInfo& info) {
1884 manager_->SetLevelInfo(texture_ref,
1897 static LevelInfo GetLevelInfo(const TextureRef* texture_ref,
1900 const Texture* texture = texture_ref->texture();
1902 info.target = target;
1903 EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width,
1905 EXPECT_TRUE(texture->GetLevelType(target, level, &info.type,
1907 info.cleared = texture->IsLevelCleared(target, level);
1911 Texture* Produce(TextureRef* texture_ref) {
1912 Texture* texture = manager_->Produce(texture_ref);
1913 EXPECT_TRUE(texture != NULL);
1917 void Consume(GLuint client_id, Texture* texture) {
1918 EXPECT_TRUE(manager_->Consume(client_id, texture));
1921 scoped_refptr<TextureRef> texture2_;
1924 static const GLuint kClient2Id;
1925 static const GLuint kService2Id;
1928 const GLuint ProduceConsumeTextureTest::kClient2Id = 2;
1929 const GLuint ProduceConsumeTextureTest::kService2Id = 12;
1931 TEST_F(ProduceConsumeTextureTest, ProduceConsume2D) {
1932 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1933 Texture* texture = texture_ref_->texture();
1934 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1936 GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true);
1937 SetLevelInfo(texture_ref_.get(), 0, level0);
1938 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
1939 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1940 LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1);
1941 LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2);
1942 Texture* produced_texture = Produce(texture_ref_.get());
1943 EXPECT_EQ(produced_texture, texture);
1945 // Make this texture bigger with more levels, and make sure they get
1946 // clobbered correctly during Consume().
1947 manager_->SetTarget(texture2_.get(), GL_TEXTURE_2D);
1951 LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false));
1952 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_.get()));
1953 texture = texture2_->texture();
1954 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1955 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size());
1957 GLuint client_id = texture2_->client_id();
1958 manager_->RemoveTexture(client_id);
1959 Consume(client_id, produced_texture);
1960 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
1961 EXPECT_EQ(produced_texture, restored_texture->texture());
1962 EXPECT_EQ(level0, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 0));
1963 EXPECT_EQ(level1, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 1));
1964 EXPECT_EQ(level2, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 2));
1965 texture = restored_texture->texture();
1966 EXPECT_EQ(64U + 16U + 4U, texture->estimated_size());
1968 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h));
1970 // However the old texture ref still exists if it was referenced somewhere.
1971 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U,
1972 texture2_->texture()->estimated_size());
1975 TEST_F(ProduceConsumeTextureTest, ProduceConsumeClearRectangle) {
1976 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_RECTANGLE_ARB);
1977 Texture* texture = texture_ref_->texture();
1978 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target());
1980 GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
1981 SetLevelInfo(texture_ref_.get(), 0, level0);
1982 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1983 Texture* produced_texture = Produce(texture_ref_.get());
1984 EXPECT_EQ(produced_texture, texture);
1985 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB),
1986 produced_texture->target());
1988 GLuint client_id = texture2_->client_id();
1989 manager_->RemoveTexture(client_id);
1990 Consume(client_id, produced_texture);
1991 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
1992 EXPECT_EQ(produced_texture, restored_texture->texture());
1994 // See if we can clear the previously uncleared level now.
1996 GetLevelInfo(restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
1997 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
1998 .WillRepeatedly(Return(true));
1999 EXPECT_TRUE(manager_->ClearTextureLevel(
2000 decoder_.get(), restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
2003 TEST_F(ProduceConsumeTextureTest, ProduceConsumeExternal) {
2004 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES);
2005 Texture* texture = texture_ref_->texture();
2006 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
2008 GL_TEXTURE_EXTERNAL_OES, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
2009 SetLevelInfo(texture_ref_.get(), 0, level0);
2010 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
2011 Texture* produced_texture = Produce(texture_ref_.get());
2012 EXPECT_EQ(produced_texture, texture);
2014 GLuint client_id = texture2_->client_id();
2015 manager_->RemoveTexture(client_id);
2016 Consume(client_id, produced_texture);
2017 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2018 EXPECT_EQ(produced_texture, restored_texture->texture());
2020 GetLevelInfo(restored_texture.get(), GL_TEXTURE_EXTERNAL_OES, 0));
2023 TEST_F(ProduceConsumeTextureTest, ProduceConsumeStreamTexture) {
2024 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES);
2025 Texture* texture = texture_ref_->texture();
2026 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
2027 manager_->SetStreamTexture(texture_ref_.get(), true);
2028 GLuint service_id = texture->service_id();
2029 Texture* produced_texture = Produce(texture_ref_.get());
2030 EXPECT_TRUE(texture->IsStreamTexture());
2032 GLuint client_id = texture2_->client_id();
2033 manager_->RemoveTexture(client_id);
2034 Consume(client_id, produced_texture);
2035 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2036 EXPECT_EQ(produced_texture, restored_texture->texture());
2037 EXPECT_TRUE(restored_texture->texture()->IsStreamTexture());
2038 EXPECT_TRUE(restored_texture->texture()->IsImmutable());
2039 EXPECT_EQ(service_id, restored_texture->service_id());
2042 TEST_F(ProduceConsumeTextureTest, ProduceConsumeCube) {
2043 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP);
2044 Texture* texture = texture_ref_->texture();
2045 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
2046 LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
2054 LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
2062 SetLevelInfo(texture_ref_.get(), 0, face0);
2063 SetLevelInfo(texture_ref_.get(), 0, face5);
2064 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
2065 Texture* produced_texture = Produce(texture_ref_.get());
2066 EXPECT_EQ(produced_texture, texture);
2068 GLuint client_id = texture2_->client_id();
2069 manager_->RemoveTexture(client_id);
2070 Consume(client_id, produced_texture);
2071 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2072 EXPECT_EQ(produced_texture, restored_texture->texture());
2075 GetLevelInfo(restored_texture.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0));
2078 GetLevelInfo(restored_texture.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0));
2081 class CountingMemoryTracker : public MemoryTracker {
2083 CountingMemoryTracker() {
2084 current_size_[0] = 0;
2085 current_size_[1] = 0;
2088 virtual void TrackMemoryAllocatedChange(size_t old_size,
2090 Pool pool) OVERRIDE {
2091 DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
2092 current_size_[pool] += new_size - old_size;
2095 virtual bool EnsureGPUMemoryAvailable(size_t size_needed) OVERRIDE {
2099 size_t GetSize(Pool pool) {
2100 DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
2101 return current_size_[pool];
2105 virtual ~CountingMemoryTracker() {}
2107 size_t current_size_[2];
2108 DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker);
2111 class SharedTextureTest : public testing::Test {
2114 : feature_info_(new FeatureInfo()) {
2117 virtual ~SharedTextureTest() {
2120 virtual void SetUp() {
2121 gl_.reset(new ::gfx::MockGLInterface());
2122 ::gfx::GLInterface::SetGLInterface(gl_.get());
2124 memory_tracker1_ = new CountingMemoryTracker;
2125 texture_manager1_.reset(
2126 new TextureManager(memory_tracker1_.get(),
2127 feature_info_.get(),
2128 TextureManagerTest::kMaxTextureSize,
2129 TextureManagerTest::kMaxCubeMapTextureSize));
2130 memory_tracker2_ = new CountingMemoryTracker;
2131 texture_manager2_.reset(
2132 new TextureManager(memory_tracker2_.get(),
2133 feature_info_.get(),
2134 TextureManagerTest::kMaxTextureSize,
2135 TextureManagerTest::kMaxCubeMapTextureSize));
2136 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
2137 texture_manager1_->Initialize();
2138 TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
2139 texture_manager2_->Initialize();
2142 virtual void TearDown() {
2143 texture_manager2_->Destroy(false);
2144 texture_manager2_.reset();
2145 texture_manager1_->Destroy(false);
2146 texture_manager1_.reset();
2147 ::gfx::GLInterface::SetGLInterface(NULL);
2152 scoped_ptr< ::gfx::MockGLInterface > gl_;
2153 scoped_refptr<FeatureInfo> feature_info_;
2154 scoped_refptr<CountingMemoryTracker> memory_tracker1_;
2155 scoped_ptr<TextureManager> texture_manager1_;
2156 scoped_refptr<CountingMemoryTracker> memory_tracker2_;
2157 scoped_ptr<TextureManager> texture_manager2_;
2160 TEST_F(SharedTextureTest, DeleteTextures) {
2161 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2162 scoped_refptr<TextureRef> ref2 =
2163 texture_manager2_->Consume(20, ref1->texture());
2164 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2167 texture_manager1_->RemoveTexture(10);
2168 testing::Mock::VerifyAndClearExpectations(gl_.get());
2170 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2172 .RetiresOnSaturation();
2174 texture_manager2_->RemoveTexture(20);
2175 testing::Mock::VerifyAndClearExpectations(gl_.get());
2178 TEST_F(SharedTextureTest, TextureSafetyAccounting) {
2179 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
2180 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
2181 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
2182 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
2183 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
2184 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
2186 // Newly created texture is renderable.
2187 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2188 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
2189 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
2190 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
2192 // Associate new texture ref to other texture manager, should account for it
2194 scoped_refptr<TextureRef> ref2 =
2195 texture_manager2_->Consume(20, ref1->texture());
2196 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
2197 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
2198 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
2200 // Make texture renderable but uncleared on one texture manager, should affect
2202 texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2203 EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures());
2204 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
2205 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
2206 EXPECT_TRUE(texture_manager2_->HaveUnrenderableTextures());
2207 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
2208 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
2210 texture_manager1_->SetLevelInfo(ref1.get(),
2221 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
2222 EXPECT_TRUE(texture_manager1_->HaveUnsafeTextures());
2223 EXPECT_TRUE(texture_manager1_->HaveUnclearedMips());
2224 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
2225 EXPECT_TRUE(texture_manager2_->HaveUnsafeTextures());
2226 EXPECT_TRUE(texture_manager2_->HaveUnclearedMips());
2228 // Make texture cleared on one texture manager, should affect other one.
2229 texture_manager1_->SetLevelCleared(ref1.get(), GL_TEXTURE_2D, 0, true);
2230 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
2231 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
2232 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
2233 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
2235 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2237 .RetiresOnSaturation();
2238 texture_manager1_->RemoveTexture(10);
2239 texture_manager2_->RemoveTexture(20);
2242 TEST_F(SharedTextureTest, FBOCompletenessCheck) {
2243 const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE;
2244 FramebufferManager framebuffer_manager1(1, 1);
2245 texture_manager1_->set_framebuffer_manager(&framebuffer_manager1);
2246 FramebufferManager framebuffer_manager2(1, 1);
2247 texture_manager2_->set_framebuffer_manager(&framebuffer_manager2);
2249 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2250 framebuffer_manager1.CreateFramebuffer(10, 10);
2251 scoped_refptr<Framebuffer> framebuffer1 =
2252 framebuffer_manager1.GetFramebuffer(10);
2253 framebuffer1->AttachTexture(
2254 GL_COLOR_ATTACHMENT0, ref1.get(), GL_TEXTURE_2D, 0, 0);
2255 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1.get()));
2256 EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete());
2258 // Make FBO complete in manager 1.
2259 texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2260 texture_manager1_->SetLevelInfo(ref1.get(),
2271 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
2272 framebuffer_manager1.MarkAsComplete(framebuffer1.get());
2273 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1.get()));
2275 // Share texture with manager 2.
2276 scoped_refptr<TextureRef> ref2 =
2277 texture_manager2_->Consume(20, ref1->texture());
2278 framebuffer_manager2.CreateFramebuffer(20, 20);
2279 scoped_refptr<Framebuffer> framebuffer2 =
2280 framebuffer_manager2.GetFramebuffer(20);
2281 framebuffer2->AttachTexture(
2282 GL_COLOR_ATTACHMENT0, ref2.get(), GL_TEXTURE_2D, 0, 0);
2283 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2.get()));
2284 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
2285 framebuffer_manager2.MarkAsComplete(framebuffer2.get());
2286 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2.get()));
2288 // Change level for texture, both FBOs should be marked incomplete
2289 texture_manager1_->SetLevelInfo(ref1.get(),
2300 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1.get()));
2301 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
2302 framebuffer_manager1.MarkAsComplete(framebuffer1.get());
2303 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1.get()));
2304 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2.get()));
2305 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
2306 framebuffer_manager2.MarkAsComplete(framebuffer2.get());
2307 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2.get()));
2309 EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _))
2311 .RetiresOnSaturation();
2312 framebuffer_manager1.RemoveFramebuffer(10);
2313 framebuffer_manager2.RemoveFramebuffer(20);
2314 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2316 .RetiresOnSaturation();
2317 texture_manager1_->RemoveTexture(10);
2318 texture_manager2_->RemoveTexture(20);
2321 TEST_F(SharedTextureTest, Memory) {
2322 size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged);
2323 size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged);
2325 // Newly created texture is unrenderable.
2326 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2327 texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2328 texture_manager1_->SetLevelInfo(ref1.get(),
2340 EXPECT_LT(0u, ref1->texture()->estimated_size());
2341 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
2342 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
2344 // Associate new texture ref to other texture manager, it doesn't account for
2345 // the texture memory, the first memory tracker still has it.
2346 scoped_refptr<TextureRef> ref2 =
2347 texture_manager2_->Consume(20, ref1->texture());
2348 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
2349 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
2350 EXPECT_EQ(initial_memory2,
2351 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
2353 // Delete the texture, memory should go to the remaining tracker.
2354 texture_manager1_->RemoveTexture(10);
2356 EXPECT_EQ(initial_memory1,
2357 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
2358 EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(),
2359 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
2361 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2363 .RetiresOnSaturation();
2365 texture_manager2_->RemoveTexture(20);
2366 EXPECT_EQ(initial_memory2,
2367 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
2370 TEST_F(SharedTextureTest, Images) {
2371 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2372 scoped_refptr<TextureRef> ref2 =
2373 texture_manager2_->Consume(20, ref1->texture());
2375 texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2376 texture_manager1_->SetLevelInfo(ref1.get(),
2387 EXPECT_FALSE(ref1->texture()->HasImages());
2388 EXPECT_FALSE(ref2->texture()->HasImages());
2389 EXPECT_FALSE(texture_manager1_->HaveImages());
2390 EXPECT_FALSE(texture_manager2_->HaveImages());
2391 texture_manager1_->SetLevelImage(ref1.get(),
2394 gfx::GLImage::CreateGLImage(0).get());
2395 EXPECT_TRUE(ref1->texture()->HasImages());
2396 EXPECT_TRUE(ref2->texture()->HasImages());
2397 EXPECT_TRUE(texture_manager1_->HaveImages());
2398 EXPECT_TRUE(texture_manager2_->HaveImages());
2399 texture_manager1_->SetLevelImage(ref1.get(),
2402 gfx::GLImage::CreateGLImage(0).get());
2403 EXPECT_TRUE(ref1->texture()->HasImages());
2404 EXPECT_TRUE(ref2->texture()->HasImages());
2405 EXPECT_TRUE(texture_manager1_->HaveImages());
2406 EXPECT_TRUE(texture_manager2_->HaveImages());
2407 texture_manager1_->SetLevelInfo(ref1.get(),
2418 EXPECT_FALSE(ref1->texture()->HasImages());
2419 EXPECT_FALSE(ref2->texture()->HasImages());
2420 EXPECT_FALSE(texture_manager1_->HaveImages());
2421 EXPECT_FALSE(texture_manager1_->HaveImages());
2423 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2425 .RetiresOnSaturation();
2426 texture_manager1_->RemoveTexture(10);
2427 texture_manager2_->RemoveTexture(20);
2430 } // namespace gles2