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"
9 #include "base/memory/scoped_ptr.h"
10 #include "gpu/command_buffer/service/error_state_mock.h"
11 #include "gpu/command_buffer/service/feature_info.h"
12 #include "gpu/command_buffer/service/framebuffer_manager.h"
13 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
14 #include "gpu/command_buffer/service/gpu_service_test.h"
15 #include "gpu/command_buffer/service/mailbox_manager.h"
16 #include "gpu/command_buffer/service/memory_tracking.h"
17 #include "gpu/command_buffer/service/mocks.h"
18 #include "gpu/command_buffer/service/test_helper.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "ui/gl/gl_image_stub.h"
21 #include "ui/gl/gl_mock.h"
23 using ::testing::AtLeast;
24 using ::testing::Pointee;
25 using ::testing::Return;
26 using ::testing::SetArgumentPointee;
27 using ::testing::StrictMock;
33 class TextureTestHelper {
35 static bool IsNPOT(const Texture* texture) {
36 return texture->npot();
38 static bool IsTextureComplete(const Texture* texture) {
39 return texture->texture_complete();
41 static bool IsCubeComplete(const Texture* texture) {
42 return texture->cube_complete();
46 class TextureManagerTest : public GpuServiceTest {
48 static const GLint kMaxTextureSize = 16;
49 static const GLint kMaxCubeMapTextureSize = 8;
50 static const GLint kMaxExternalTextureSize = 16;
51 static const GLint kMax2dLevels = 5;
52 static const GLint kMaxCubeMapLevels = 4;
53 static const GLint kMaxExternalLevels = 1;
54 static const bool kUseDefaultTextures = false;
56 TextureManagerTest() : feature_info_(new FeatureInfo()) {}
58 ~TextureManagerTest() override {}
61 void SetUp() override {
62 GpuServiceTest::SetUp();
63 manager_.reset(new TextureManager(NULL,
66 kMaxCubeMapTextureSize,
67 kUseDefaultTextures));
68 TestHelper::SetupTextureManagerInitExpectations(
69 gl_.get(), "", kUseDefaultTextures);
70 manager_->Initialize();
71 error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
74 void TearDown() override {
75 manager_->Destroy(false);
77 GpuServiceTest::TearDown();
81 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
82 TestHelper::SetTexParameteriWithExpectations(
83 gl_.get(), error_state_.get(), manager_.get(),
84 texture_ref, pname, value, error);
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, UseDefaultTexturesTrue) {
166 bool use_default_textures = true;
167 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
169 TestHelper::SetupTextureManagerInitExpectations(
170 gl_.get(), "GL_ANGLE_texture_usage", use_default_textures);
171 TextureManager manager(NULL,
174 kMaxCubeMapTextureSize,
175 use_default_textures);
176 manager.Initialize();
178 EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_2D) != NULL);
179 EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP) != NULL);
181 // TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB.
183 manager.Destroy(false);
186 TEST_F(TextureManagerTest, UseDefaultTexturesFalse) {
187 bool use_default_textures = false;
188 TestHelper::SetupTextureManagerInitExpectations(
189 gl_.get(), "GL_ANGLE_texture_usage", use_default_textures);
190 TextureManager manager(NULL,
193 kMaxCubeMapTextureSize,
194 use_default_textures);
195 manager.Initialize();
197 EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_2D) == NULL);
198 EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP) == NULL);
200 // TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB.
202 manager.Destroy(false);
205 TEST_F(TextureManagerTest, TextureUsageExt) {
206 TestHelper::SetupTextureManagerInitExpectations(
207 gl_.get(), "GL_ANGLE_texture_usage", kUseDefaultTextures);
208 TextureManager manager(NULL,
211 kMaxCubeMapTextureSize,
212 kUseDefaultTextures);
213 manager.Initialize();
214 const GLuint kClient1Id = 1;
215 const GLuint kService1Id = 11;
216 // Check we can create texture.
217 manager.CreateTexture(kClient1Id, kService1Id);
218 // Check texture got created.
219 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
220 ASSERT_TRUE(texture_ref != NULL);
221 TestHelper::SetTexParameteriWithExpectations(
222 gl_.get(), error_state_.get(), &manager, texture_ref,
223 GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE, GL_NO_ERROR);
224 EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE),
225 texture_ref->texture()->usage());
226 manager.Destroy(false);
229 TEST_F(TextureManagerTest, Destroy) {
230 const GLuint kClient1Id = 1;
231 const GLuint kService1Id = 11;
232 TestHelper::SetupTextureManagerInitExpectations(
233 gl_.get(), "", kUseDefaultTextures);
234 TextureManager manager(NULL,
237 kMaxCubeMapTextureSize,
238 kUseDefaultTextures);
239 manager.Initialize();
240 // Check we can create texture.
241 manager.CreateTexture(kClient1Id, kService1Id);
242 // Check texture got created.
243 TextureRef* texture = manager.GetTexture(kClient1Id);
244 ASSERT_TRUE(texture != NULL);
245 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
247 .RetiresOnSaturation();
248 TestHelper::SetupTextureManagerDestructionExpectations(
249 gl_.get(), "", kUseDefaultTextures);
250 manager.Destroy(true);
251 // Check that resources got freed.
252 texture = manager.GetTexture(kClient1Id);
253 ASSERT_TRUE(texture == NULL);
256 TEST_F(TextureManagerTest, MaxValues) {
257 // Check we get the right values for the max sizes.
258 EXPECT_EQ(kMax2dLevels, manager_->MaxLevelsForTarget(GL_TEXTURE_2D));
259 EXPECT_EQ(kMaxCubeMapLevels,
260 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP));
261 EXPECT_EQ(kMaxCubeMapLevels,
262 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X));
263 EXPECT_EQ(kMaxCubeMapLevels,
264 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X));
265 EXPECT_EQ(kMaxCubeMapLevels,
266 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y));
267 EXPECT_EQ(kMaxCubeMapLevels,
268 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y));
269 EXPECT_EQ(kMaxCubeMapLevels,
270 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z));
271 EXPECT_EQ(kMaxCubeMapLevels,
272 manager_->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z));
273 EXPECT_EQ(kMaxExternalLevels,
274 manager_->MaxLevelsForTarget(GL_TEXTURE_EXTERNAL_OES));
275 EXPECT_EQ(kMaxTextureSize, manager_->MaxSizeForTarget(GL_TEXTURE_2D));
276 EXPECT_EQ(kMaxCubeMapTextureSize,
277 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP));
278 EXPECT_EQ(kMaxCubeMapTextureSize,
279 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X));
280 EXPECT_EQ(kMaxCubeMapTextureSize,
281 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X));
282 EXPECT_EQ(kMaxCubeMapTextureSize,
283 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y));
284 EXPECT_EQ(kMaxCubeMapTextureSize,
285 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y));
286 EXPECT_EQ(kMaxCubeMapTextureSize,
287 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z));
288 EXPECT_EQ(kMaxCubeMapTextureSize,
289 manager_->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z));
290 EXPECT_EQ(kMaxExternalTextureSize,
291 manager_->MaxSizeForTarget(GL_TEXTURE_EXTERNAL_OES));
294 TEST_F(TextureManagerTest, ValidForTarget) {
296 EXPECT_TRUE(manager_->ValidForTarget(
297 GL_TEXTURE_2D, 0, kMaxTextureSize, kMaxTextureSize, 1));
298 EXPECT_TRUE(manager_->ValidForTarget(
299 GL_TEXTURE_2D, kMax2dLevels - 1, 1, 1, 1));
300 EXPECT_FALSE(manager_->ValidForTarget(
301 GL_TEXTURE_2D, kMax2dLevels - 1, 1, 2, 1));
302 EXPECT_FALSE(manager_->ValidForTarget(
303 GL_TEXTURE_2D, kMax2dLevels - 1, 2, 1, 1));
304 // check level out of range.
305 EXPECT_FALSE(manager_->ValidForTarget(
306 GL_TEXTURE_2D, kMax2dLevels, kMaxTextureSize, 1, 1));
308 EXPECT_FALSE(manager_->ValidForTarget(
309 GL_TEXTURE_2D, kMax2dLevels, kMaxTextureSize, 1, 2));
310 // Check NPOT width on level 0
311 EXPECT_TRUE(manager_->ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1));
312 // Check NPOT height on level 0
313 EXPECT_TRUE(manager_->ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1));
314 // Check NPOT width on level 1
315 EXPECT_FALSE(manager_->ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1));
316 // Check NPOT height on level 1
317 EXPECT_FALSE(manager_->ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1));
320 EXPECT_TRUE(manager_->ValidForTarget(
321 GL_TEXTURE_CUBE_MAP, 0,
322 kMaxCubeMapTextureSize, kMaxCubeMapTextureSize, 1));
323 EXPECT_TRUE(manager_->ValidForTarget(
324 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels - 1, 1, 1, 1));
325 EXPECT_FALSE(manager_->ValidForTarget(
326 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels - 1, 2, 2, 1));
327 // check level out of range.
328 EXPECT_FALSE(manager_->ValidForTarget(
329 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
330 kMaxCubeMapTextureSize, 1, 1));
332 EXPECT_FALSE(manager_->ValidForTarget(
333 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
334 kMaxCubeMapTextureSize, 1, 1));
336 EXPECT_FALSE(manager_->ValidForTarget(
337 GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
338 kMaxCubeMapTextureSize, 1, 2));
340 for (GLint level = 0; level < kMax2dLevels; ++level) {
341 EXPECT_TRUE(manager_->ValidForTarget(
342 GL_TEXTURE_2D, level, kMaxTextureSize >> level, 1, 1));
343 EXPECT_TRUE(manager_->ValidForTarget(
344 GL_TEXTURE_2D, level, 1, kMaxTextureSize >> level, 1));
345 EXPECT_FALSE(manager_->ValidForTarget(
346 GL_TEXTURE_2D, level, (kMaxTextureSize >> level) + 1, 1, 1));
347 EXPECT_FALSE(manager_->ValidForTarget(
348 GL_TEXTURE_2D, level, 1, (kMaxTextureSize >> level) + 1, 1));
351 for (GLint level = 0; level < kMaxCubeMapLevels; ++level) {
352 EXPECT_TRUE(manager_->ValidForTarget(
353 GL_TEXTURE_CUBE_MAP, level,
354 kMaxCubeMapTextureSize >> level,
355 kMaxCubeMapTextureSize >> level,
357 EXPECT_FALSE(manager_->ValidForTarget(
358 GL_TEXTURE_CUBE_MAP, level,
359 (kMaxCubeMapTextureSize >> level) * 2,
360 (kMaxCubeMapTextureSize >> level) * 2,
365 TEST_F(TextureManagerTest, ValidForTargetNPOT) {
366 TestHelper::SetupFeatureInfoInitExpectations(
367 gl_.get(), "GL_OES_texture_npot");
368 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
369 feature_info->Initialize();
370 TextureManager manager(NULL,
373 kMaxCubeMapTextureSize,
374 kUseDefaultTextures);
375 // Check NPOT width on level 0
376 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1));
377 // Check NPOT height on level 0
378 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1));
379 // Check NPOT width on level 1
380 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1));
381 // Check NPOT height on level 1
382 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1));
383 manager.Destroy(false);
386 class TextureTestBase : public GpuServiceTest {
388 static const GLint kMaxTextureSize = 16;
389 static const GLint kMaxCubeMapTextureSize = 8;
390 static const GLint kMax2dLevels = 5;
391 static const GLint kMaxCubeMapLevels = 4;
392 static const GLuint kClient1Id = 1;
393 static const GLuint kService1Id = 11;
394 static const bool kUseDefaultTextures = false;
397 : feature_info_(new FeatureInfo()) {
399 ~TextureTestBase() override { texture_ref_ = NULL; }
402 void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) {
403 GpuServiceTest::SetUp();
404 if (!extensions.empty()) {
405 TestHelper::SetupFeatureInfoInitExpectations(gl_.get(),
407 feature_info_->Initialize();
410 manager_.reset(new TextureManager(memory_tracker,
413 kMaxCubeMapTextureSize,
414 kUseDefaultTextures));
415 decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>());
416 error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
417 manager_->CreateTexture(kClient1Id, kService1Id);
418 texture_ref_ = manager_->GetTexture(kClient1Id);
419 ASSERT_TRUE(texture_ref_.get() != NULL);
422 void TearDown() override {
423 if (texture_ref_.get()) {
424 // If it's not in the manager then setting texture_ref_ to NULL will
425 // delete the texture.
426 if (!texture_ref_->client_id()) {
427 // Check that it gets deleted when the last reference is released.
429 DeleteTextures(1, ::testing::Pointee(texture_ref_->service_id())))
431 .RetiresOnSaturation();
435 manager_->Destroy(false);
437 GpuServiceTest::TearDown();
441 TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) {
442 TestHelper::SetTexParameteriWithExpectations(
443 gl_.get(), error_state_.get(), manager_.get(),
444 texture_ref, pname, value, error);
447 scoped_ptr<MockGLES2Decoder> decoder_;
448 scoped_ptr<MockErrorState> error_state_;
449 scoped_refptr<FeatureInfo> feature_info_;
450 scoped_ptr<TextureManager> manager_;
451 scoped_refptr<TextureRef> texture_ref_;
454 class TextureTest : public TextureTestBase {
456 void SetUp() override { SetUpBase(NULL, std::string()); }
459 class TextureMemoryTrackerTest : public TextureTestBase {
461 void SetUp() override {
462 mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
463 SetUpBase(mock_memory_tracker_.get(), std::string());
466 scoped_refptr<MockMemoryTracker> mock_memory_tracker_;
469 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \
470 EXPECT_CALL(*mock_memory_tracker_.get(), \
471 TrackMemoryAllocatedChange(old_size, new_size, pool)) \
472 .Times(1).RetiresOnSaturation()
474 TEST_F(TextureTest, Basic) {
475 Texture* texture = texture_ref_->texture();
476 EXPECT_EQ(0u, texture->target());
477 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
478 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
479 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
480 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
481 EXPECT_EQ(0, texture->num_uncleared_mips());
482 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
483 EXPECT_TRUE(texture->SafeToRenderFrom());
484 EXPECT_FALSE(texture->IsImmutable());
485 EXPECT_EQ(static_cast<GLenum>(GL_NEAREST_MIPMAP_LINEAR),
486 texture->min_filter());
487 EXPECT_EQ(static_cast<GLenum>(GL_LINEAR), texture->mag_filter());
488 EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_s());
489 EXPECT_EQ(static_cast<GLenum>(GL_REPEAT), texture->wrap_t());
490 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
491 EXPECT_FALSE(manager_->HaveUnsafeTextures());
492 EXPECT_EQ(0u, texture->estimated_size());
495 TEST_F(TextureTest, SetTargetTexture2D) {
496 Texture* texture = texture_ref_->texture();
497 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
498 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
499 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
500 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
501 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
502 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
503 EXPECT_TRUE(texture->SafeToRenderFrom());
504 EXPECT_FALSE(texture->IsImmutable());
507 TEST_F(TextureTest, SetTargetTextureExternalOES) {
508 Texture* texture = texture_ref_->texture();
509 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES);
510 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
511 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
512 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
513 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
514 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
515 EXPECT_TRUE(texture->SafeToRenderFrom());
516 EXPECT_TRUE(texture->IsImmutable());
519 TEST_F(TextureTest, ZeroSizeCanNotRender) {
520 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
521 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
522 manager_->SetLevelInfo(texture_ref_.get(),
533 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
534 manager_->SetLevelInfo(texture_ref_.get(),
545 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
548 TEST_F(TextureTest, EstimatedSize) {
549 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
550 manager_->SetLevelInfo(texture_ref_.get(),
561 EXPECT_EQ(8u * 4u * 4u, texture_ref_->texture()->estimated_size());
562 manager_->SetLevelInfo(texture_ref_.get(),
573 EXPECT_EQ(8u * 4u * 4u * 2u, texture_ref_->texture()->estimated_size());
576 TEST_F(TextureMemoryTrackerTest, EstimatedSize) {
577 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
578 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
579 manager_->SetLevelInfo(texture_ref_.get(),
590 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
591 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged);
592 manager_->SetLevelInfo(texture_ref_.get(),
603 // Add expectation for texture deletion.
604 EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged);
605 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
608 TEST_F(TextureMemoryTrackerTest, SetParameterPool) {
609 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
610 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged);
611 manager_->SetLevelInfo(texture_ref_.get(),
622 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged);
623 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged);
624 SetParameter(texture_ref_.get(),
625 GL_TEXTURE_POOL_CHROMIUM,
626 GL_TEXTURE_POOL_MANAGED_CHROMIUM,
628 // Add expectation for texture deletion.
629 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged);
630 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
631 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged);
634 TEST_F(TextureTest, POT2D) {
635 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
636 Texture* texture = texture_ref_->texture();
637 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
638 // Check Setting level 0 to POT
639 manager_->SetLevelInfo(texture_ref_.get(),
650 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
651 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
652 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
653 EXPECT_EQ(0, texture->num_uncleared_mips());
654 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
655 // Set filters to something that will work with a single mip.
657 texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
658 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
659 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
661 SetParameter(texture_ref_.get(),
662 GL_TEXTURE_MIN_FILTER,
663 GL_LINEAR_MIPMAP_LINEAR,
665 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
667 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
669 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
670 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
671 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
672 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
674 manager_->SetLevelInfo(texture_ref_.get(),
685 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
686 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
687 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
688 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
689 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
690 // Set a level past the number of mips that would get generated.
691 manager_->SetLevelInfo(texture_ref_.get(),
702 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
704 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
705 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
706 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
707 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
710 TEST_F(TextureMemoryTrackerTest, MarkMipmapsGenerated) {
711 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
712 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged);
713 manager_->SetLevelInfo(texture_ref_.get(),
724 EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged);
725 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged);
726 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
727 EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged);
728 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged);
731 TEST_F(TextureTest, UnusedMips) {
732 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
733 Texture* texture = texture_ref_->texture();
734 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
735 // Set level zero to large size.
736 manager_->SetLevelInfo(texture_ref_.get(),
747 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
748 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
749 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
750 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
751 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
752 // Set level zero to large smaller (levels unused mips)
753 manager_->SetLevelInfo(texture_ref_.get(),
764 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
765 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
766 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
767 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
768 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
769 // Set an unused level to some size
770 manager_->SetLevelInfo(texture_ref_.get(),
781 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
782 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
783 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
784 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
787 TEST_F(TextureTest, NPOT2D) {
788 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
789 Texture* texture = texture_ref_->texture();
790 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
791 // Check Setting level 0 to NPOT
792 manager_->SetLevelInfo(texture_ref_.get(),
803 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
804 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
805 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
806 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
807 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
809 texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR, GL_NO_ERROR);
810 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
811 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
813 texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
814 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
815 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
817 texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
818 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
819 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
821 manager_->SetLevelInfo(texture_ref_.get(),
832 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
833 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
834 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
835 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
838 TEST_F(TextureTest, NPOT2DNPOTOK) {
839 TestHelper::SetupFeatureInfoInitExpectations(
840 gl_.get(), "GL_OES_texture_npot");
841 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
842 feature_info->Initialize();
843 TextureManager manager(NULL,
846 kMaxCubeMapTextureSize,
847 kUseDefaultTextures);
848 manager.CreateTexture(kClient1Id, kService1Id);
849 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
850 ASSERT_TRUE(texture_ref != NULL);
851 Texture* texture = texture_ref->texture();
853 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
854 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
855 // Check Setting level 0 to NPOT
856 manager.SetLevelInfo(texture_ref,
857 GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, true);
858 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture));
859 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
860 EXPECT_TRUE(manager.CanGenerateMipmaps(texture_ref));
861 EXPECT_FALSE(manager.CanRender(texture_ref));
862 EXPECT_TRUE(manager.HaveUnrenderableTextures());
863 EXPECT_TRUE(manager.MarkMipmapsGenerated(texture_ref));
864 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
865 EXPECT_TRUE(manager.CanRender(texture_ref));
866 EXPECT_FALSE(manager.HaveUnrenderableTextures());
867 manager.Destroy(false);
870 TEST_F(TextureTest, POTCubeMap) {
871 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP);
872 Texture* texture = texture_ref_->texture();
873 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
874 // Check Setting level 0 each face to POT
875 manager_->SetLevelInfo(texture_ref_.get(),
876 GL_TEXTURE_CUBE_MAP_POSITIVE_X,
886 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
887 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
888 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
889 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
890 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
891 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
892 manager_->SetLevelInfo(texture_ref_.get(),
893 GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
903 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
904 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
905 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
906 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
907 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
908 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
909 manager_->SetLevelInfo(texture_ref_.get(),
910 GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
920 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
921 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
922 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
923 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
924 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
925 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
926 manager_->SetLevelInfo(texture_ref_.get(),
927 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
937 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
938 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
939 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
940 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
941 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
942 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
943 manager_->SetLevelInfo(texture_ref_.get(),
944 GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
954 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
955 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
956 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture));
957 EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get()));
958 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
959 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
960 manager_->SetLevelInfo(texture_ref_.get(),
961 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
971 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
972 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
973 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
974 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
975 EXPECT_FALSE(manager_->CanRender(texture_ref_.get()));
976 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
979 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
980 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
981 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
982 EXPECT_TRUE(manager_->CanRender(texture_ref_.get()));
983 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
986 manager_->SetLevelInfo(texture_ref_.get(),
987 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
997 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture));
998 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
999 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
1000 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
1001 // Set a level past the number of mips that would get generated.
1002 manager_->SetLevelInfo(texture_ref_.get(),
1003 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1013 EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get()));
1015 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
1016 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1017 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture));
1020 TEST_F(TextureTest, GetLevelSize) {
1021 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1022 manager_->SetLevelInfo(texture_ref_.get(),
1034 GLsizei height = -1;
1035 Texture* texture = texture_ref_->texture();
1036 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height));
1037 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height));
1038 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
1039 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
1040 EXPECT_EQ(4, width);
1041 EXPECT_EQ(5, height);
1042 manager_->RemoveTexture(kClient1Id);
1043 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
1044 EXPECT_EQ(4, width);
1045 EXPECT_EQ(5, height);
1048 TEST_F(TextureTest, GetLevelType) {
1049 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1050 manager_->SetLevelInfo(texture_ref_.get(),
1063 Texture* texture = texture_ref_->texture();
1064 EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, -1, &type, &format));
1065 EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format));
1066 EXPECT_FALSE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &format));
1067 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
1068 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1069 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
1070 manager_->RemoveTexture(kClient1Id);
1071 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
1072 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1073 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
1076 TEST_F(TextureTest, ValidForTexture) {
1077 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1078 manager_->SetLevelInfo(texture_ref_.get(),
1090 Texture* texture = texture_ref_->texture();
1091 EXPECT_FALSE(texture->ValidForTexture(
1092 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1093 1, 0, 0, 4, 5, GL_UNSIGNED_BYTE));
1095 EXPECT_FALSE(texture->ValidForTexture(
1096 GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_UNSIGNED_BYTE));
1097 // Check bad xoffset.
1098 EXPECT_FALSE(texture->ValidForTexture(
1099 GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_UNSIGNED_BYTE));
1100 // Check bad xoffset + width > width.
1101 EXPECT_FALSE(texture->ValidForTexture(
1102 GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_UNSIGNED_BYTE));
1103 // Check bad yoffset.
1104 EXPECT_FALSE(texture->ValidForTexture(
1105 GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_UNSIGNED_BYTE));
1106 // Check bad yoffset + height > height.
1107 EXPECT_FALSE(texture->ValidForTexture(
1108 GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_UNSIGNED_BYTE));
1110 EXPECT_FALSE(texture->ValidForTexture(
1111 GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_UNSIGNED_BYTE));
1112 // Check bad height.
1113 EXPECT_FALSE(texture->ValidForTexture(
1114 GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_UNSIGNED_BYTE));
1116 EXPECT_FALSE(texture->ValidForTexture(
1117 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_UNSIGNED_SHORT_4_4_4_4));
1118 // Check valid full size
1119 EXPECT_TRUE(texture->ValidForTexture(
1120 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_UNSIGNED_BYTE));
1121 // Check valid particial size.
1122 EXPECT_TRUE(texture->ValidForTexture(
1123 GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_UNSIGNED_BYTE));
1124 manager_->RemoveTexture(kClient1Id);
1125 EXPECT_TRUE(texture->ValidForTexture(
1126 GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_UNSIGNED_BYTE));
1129 TEST_F(TextureTest, FloatNotLinear) {
1130 TestHelper::SetupFeatureInfoInitExpectations(
1131 gl_.get(), "GL_OES_texture_float");
1132 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1133 feature_info->Initialize();
1134 TextureManager manager(NULL,
1137 kMaxCubeMapTextureSize,
1138 kUseDefaultTextures);
1139 manager.CreateTexture(kClient1Id, kService1Id);
1140 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1141 ASSERT_TRUE(texture_ref != NULL);
1142 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1143 Texture* texture = texture_ref->texture();
1144 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1145 manager.SetLevelInfo(texture_ref,
1146 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
1147 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
1148 TestHelper::SetTexParameteriWithExpectations(
1149 gl_.get(), error_state_.get(), &manager,
1150 texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1151 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
1152 TestHelper::SetTexParameteriWithExpectations(
1153 gl_.get(), error_state_.get(), &manager, texture_ref,
1154 GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
1155 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1156 manager.Destroy(false);
1159 TEST_F(TextureTest, FloatLinear) {
1160 TestHelper::SetupFeatureInfoInitExpectations(
1161 gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear");
1162 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1163 feature_info->Initialize();
1164 TextureManager manager(NULL,
1167 kMaxCubeMapTextureSize,
1168 kUseDefaultTextures);
1169 manager.CreateTexture(kClient1Id, kService1Id);
1170 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1171 ASSERT_TRUE(texture_ref != NULL);
1172 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1173 Texture* texture = texture_ref->texture();
1174 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1175 manager.SetLevelInfo(texture_ref,
1176 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true);
1177 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1178 manager.Destroy(false);
1181 TEST_F(TextureTest, HalfFloatNotLinear) {
1182 TestHelper::SetupFeatureInfoInitExpectations(
1183 gl_.get(), "GL_OES_texture_half_float");
1184 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1185 feature_info->Initialize();
1186 TextureManager manager(NULL,
1189 kMaxCubeMapTextureSize,
1190 kUseDefaultTextures);
1191 manager.CreateTexture(kClient1Id, kService1Id);
1192 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1193 ASSERT_TRUE(texture_ref != NULL);
1194 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1195 Texture* texture = texture_ref->texture();
1196 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1197 manager.SetLevelInfo(texture_ref,
1198 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
1199 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
1200 TestHelper::SetTexParameteriWithExpectations(
1201 gl_.get(), error_state_.get(), &manager,
1202 texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1203 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture));
1204 TestHelper::SetTexParameteriWithExpectations(
1205 gl_.get(), error_state_.get(), &manager, texture_ref,
1206 GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR);
1207 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1208 manager.Destroy(false);
1211 TEST_F(TextureTest, HalfFloatLinear) {
1212 TestHelper::SetupFeatureInfoInitExpectations(
1213 gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear");
1214 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1215 feature_info->Initialize();
1216 TextureManager manager(NULL,
1219 kMaxCubeMapTextureSize,
1220 kUseDefaultTextures);
1221 manager.CreateTexture(kClient1Id, kService1Id);
1222 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1223 ASSERT_TRUE(texture_ref != NULL);
1224 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1225 Texture* texture = texture_ref->texture();
1226 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1227 manager.SetLevelInfo(texture_ref,
1228 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true);
1229 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1230 manager.Destroy(false);
1233 TEST_F(TextureTest, EGLImageExternal) {
1234 TestHelper::SetupFeatureInfoInitExpectations(
1235 gl_.get(), "GL_OES_EGL_image_external");
1236 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1237 feature_info->Initialize();
1238 TextureManager manager(NULL,
1241 kMaxCubeMapTextureSize,
1242 kUseDefaultTextures);
1243 manager.CreateTexture(kClient1Id, kService1Id);
1244 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1245 ASSERT_TRUE(texture_ref != NULL);
1246 manager.SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
1247 Texture* texture = texture_ref->texture();
1248 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
1249 EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
1250 manager.Destroy(false);
1253 TEST_F(TextureTest, DepthTexture) {
1254 TestHelper::SetupFeatureInfoInitExpectations(
1255 gl_.get(), "GL_ANGLE_depth_texture");
1256 scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
1257 feature_info->Initialize();
1258 TextureManager manager(NULL,
1261 kMaxCubeMapTextureSize,
1262 kUseDefaultTextures);
1263 manager.CreateTexture(kClient1Id, kService1Id);
1264 TextureRef* texture_ref = manager.GetTexture(kClient1Id);
1265 ASSERT_TRUE(texture_ref != NULL);
1266 manager.SetTarget(texture_ref, GL_TEXTURE_2D);
1267 manager.SetLevelInfo(
1268 texture_ref, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 4, 4, 1, 0,
1269 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, false);
1270 EXPECT_FALSE(manager.CanGenerateMipmaps(texture_ref));
1271 manager.Destroy(false);
1274 TEST_F(TextureTest, SafeUnsafe) {
1275 static const GLuint kClient2Id = 2;
1276 static const GLuint kService2Id = 12;
1277 static const GLuint kClient3Id = 3;
1278 static const GLuint kService3Id = 13;
1279 EXPECT_FALSE(manager_->HaveUnclearedMips());
1280 Texture* texture = texture_ref_->texture();
1281 EXPECT_EQ(0, texture->num_uncleared_mips());
1282 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1283 manager_->SetLevelInfo(texture_ref_.get(),
1294 EXPECT_FALSE(texture->SafeToRenderFrom());
1295 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1296 EXPECT_TRUE(manager_->HaveUnclearedMips());
1297 EXPECT_EQ(1, texture->num_uncleared_mips());
1298 manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 0, true);
1299 EXPECT_TRUE(texture->SafeToRenderFrom());
1300 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1301 EXPECT_FALSE(manager_->HaveUnclearedMips());
1302 EXPECT_EQ(0, texture->num_uncleared_mips());
1303 manager_->SetLevelInfo(texture_ref_.get(),
1314 EXPECT_FALSE(texture->SafeToRenderFrom());
1315 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1316 EXPECT_TRUE(manager_->HaveUnclearedMips());
1317 EXPECT_EQ(1, texture->num_uncleared_mips());
1318 manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 1, true);
1319 EXPECT_TRUE(texture->SafeToRenderFrom());
1320 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1321 EXPECT_FALSE(manager_->HaveUnclearedMips());
1322 EXPECT_EQ(0, texture->num_uncleared_mips());
1323 manager_->SetLevelInfo(texture_ref_.get(),
1334 manager_->SetLevelInfo(texture_ref_.get(),
1345 EXPECT_FALSE(texture->SafeToRenderFrom());
1346 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1347 EXPECT_TRUE(manager_->HaveUnclearedMips());
1348 EXPECT_EQ(2, texture->num_uncleared_mips());
1349 manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 0, true);
1350 EXPECT_FALSE(texture->SafeToRenderFrom());
1351 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1352 EXPECT_TRUE(manager_->HaveUnclearedMips());
1353 EXPECT_EQ(1, texture->num_uncleared_mips());
1354 manager_->SetLevelCleared(texture_ref_.get(), GL_TEXTURE_2D, 1, true);
1355 EXPECT_TRUE(texture->SafeToRenderFrom());
1356 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1357 EXPECT_FALSE(manager_->HaveUnclearedMips());
1358 EXPECT_EQ(0, texture->num_uncleared_mips());
1359 manager_->SetLevelInfo(texture_ref_.get(),
1370 EXPECT_FALSE(texture->SafeToRenderFrom());
1371 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1372 EXPECT_TRUE(manager_->HaveUnclearedMips());
1373 EXPECT_EQ(1, texture->num_uncleared_mips());
1374 manager_->MarkMipmapsGenerated(texture_ref_.get());
1375 EXPECT_TRUE(texture->SafeToRenderFrom());
1376 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1377 EXPECT_FALSE(manager_->HaveUnclearedMips());
1378 EXPECT_EQ(0, texture->num_uncleared_mips());
1380 manager_->CreateTexture(kClient2Id, kService2Id);
1381 scoped_refptr<TextureRef> texture_ref2(
1382 manager_->GetTexture(kClient2Id));
1383 ASSERT_TRUE(texture_ref2.get() != NULL);
1384 manager_->SetTarget(texture_ref2.get(), GL_TEXTURE_2D);
1385 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1386 EXPECT_FALSE(manager_->HaveUnclearedMips());
1387 Texture* texture2 = texture_ref2->texture();
1388 EXPECT_EQ(0, texture2->num_uncleared_mips());
1389 manager_->SetLevelInfo(texture_ref2.get(),
1400 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1401 EXPECT_FALSE(manager_->HaveUnclearedMips());
1402 EXPECT_EQ(0, texture2->num_uncleared_mips());
1403 manager_->SetLevelInfo(texture_ref2.get(),
1414 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1415 EXPECT_TRUE(manager_->HaveUnclearedMips());
1416 EXPECT_EQ(1, texture2->num_uncleared_mips());
1418 manager_->CreateTexture(kClient3Id, kService3Id);
1419 scoped_refptr<TextureRef> texture_ref3(
1420 manager_->GetTexture(kClient3Id));
1421 ASSERT_TRUE(texture_ref3.get() != NULL);
1422 manager_->SetTarget(texture_ref3.get(), GL_TEXTURE_2D);
1423 manager_->SetLevelInfo(texture_ref3.get(),
1434 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1435 EXPECT_TRUE(manager_->HaveUnclearedMips());
1436 Texture* texture3 = texture_ref3->texture();
1437 EXPECT_EQ(1, texture3->num_uncleared_mips());
1438 manager_->SetLevelCleared(texture_ref2.get(), GL_TEXTURE_2D, 0, true);
1439 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1440 EXPECT_TRUE(manager_->HaveUnclearedMips());
1441 EXPECT_EQ(0, texture2->num_uncleared_mips());
1442 manager_->SetLevelCleared(texture_ref3.get(), GL_TEXTURE_2D, 0, true);
1443 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1444 EXPECT_FALSE(manager_->HaveUnclearedMips());
1445 EXPECT_EQ(0, texture3->num_uncleared_mips());
1447 manager_->SetLevelInfo(texture_ref2.get(),
1458 manager_->SetLevelInfo(texture_ref3.get(),
1469 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1470 EXPECT_TRUE(manager_->HaveUnclearedMips());
1471 EXPECT_EQ(1, texture2->num_uncleared_mips());
1472 EXPECT_EQ(1, texture3->num_uncleared_mips());
1473 manager_->RemoveTexture(kClient3Id);
1474 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1475 EXPECT_TRUE(manager_->HaveUnclearedMips());
1476 manager_->RemoveTexture(kClient2Id);
1477 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1478 EXPECT_TRUE(manager_->HaveUnclearedMips());
1479 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
1481 .RetiresOnSaturation();
1482 texture_ref2 = NULL;
1483 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1484 EXPECT_TRUE(manager_->HaveUnclearedMips());
1485 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService3Id)))
1487 .RetiresOnSaturation();
1488 texture_ref3 = NULL;
1489 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1490 EXPECT_FALSE(manager_->HaveUnclearedMips());
1493 TEST_F(TextureTest, ClearTexture) {
1494 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _, _))
1495 .WillRepeatedly(Return(true));
1496 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1497 manager_->SetLevelInfo(texture_ref_.get(),
1508 manager_->SetLevelInfo(texture_ref_.get(),
1519 Texture* texture = texture_ref_->texture();
1520 EXPECT_FALSE(texture->SafeToRenderFrom());
1521 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1522 EXPECT_TRUE(manager_->HaveUnclearedMips());
1523 EXPECT_EQ(2, texture->num_uncleared_mips());
1524 manager_->ClearRenderableLevels(decoder_.get(), texture_ref_.get());
1525 EXPECT_TRUE(texture->SafeToRenderFrom());
1526 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1527 EXPECT_FALSE(manager_->HaveUnclearedMips());
1528 EXPECT_EQ(0, texture->num_uncleared_mips());
1529 manager_->SetLevelInfo(texture_ref_.get(),
1540 manager_->SetLevelInfo(texture_ref_.get(),
1551 EXPECT_FALSE(texture->SafeToRenderFrom());
1552 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1553 EXPECT_TRUE(manager_->HaveUnclearedMips());
1554 EXPECT_EQ(2, texture->num_uncleared_mips());
1555 manager_->ClearTextureLevel(
1556 decoder_.get(), texture_ref_.get(), GL_TEXTURE_2D, 0);
1557 EXPECT_FALSE(texture->SafeToRenderFrom());
1558 EXPECT_TRUE(manager_->HaveUnsafeTextures());
1559 EXPECT_TRUE(manager_->HaveUnclearedMips());
1560 EXPECT_EQ(1, texture->num_uncleared_mips());
1561 manager_->ClearTextureLevel(
1562 decoder_.get(), texture_ref_.get(), GL_TEXTURE_2D, 1);
1563 EXPECT_TRUE(texture->SafeToRenderFrom());
1564 EXPECT_FALSE(manager_->HaveUnsafeTextures());
1565 EXPECT_FALSE(manager_->HaveUnclearedMips());
1566 EXPECT_EQ(0, texture->num_uncleared_mips());
1569 TEST_F(TextureTest, UseDeletedTexture) {
1570 static const GLuint kClient2Id = 2;
1571 static const GLuint kService2Id = 12;
1572 // Make the default texture renderable
1573 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1574 manager_->SetLevelInfo(texture_ref_.get(),
1585 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
1586 // Make a new texture
1587 manager_->CreateTexture(kClient2Id, kService2Id);
1588 scoped_refptr<TextureRef> texture_ref(
1589 manager_->GetTexture(kClient2Id));
1590 manager_->SetTarget(texture_ref.get(), GL_TEXTURE_2D);
1591 EXPECT_FALSE(manager_->CanRender(texture_ref.get()));
1592 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
1594 manager_->RemoveTexture(kClient2Id);
1595 EXPECT_FALSE(manager_->CanRender(texture_ref.get()));
1596 EXPECT_TRUE(manager_->HaveUnrenderableTextures());
1597 // Check that we can still manipulate it and it effects the manager.
1598 manager_->SetLevelInfo(texture_ref.get(),
1609 EXPECT_TRUE(manager_->CanRender(texture_ref.get()));
1610 EXPECT_FALSE(manager_->HaveUnrenderableTextures());
1611 EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService2Id)))
1613 .RetiresOnSaturation();
1617 TEST_F(TextureTest, GetLevelImage) {
1618 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1619 manager_->SetLevelInfo(texture_ref_.get(),
1630 Texture* texture = texture_ref_->texture();
1631 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1633 scoped_refptr<gfx::GLImage> image(new gfx::GLImageStub);
1634 manager_->SetLevelImage(texture_ref_.get(), GL_TEXTURE_2D, 1, image.get());
1635 EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1637 manager_->SetLevelImage(texture_ref_.get(), GL_TEXTURE_2D, 1, NULL);
1638 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1639 manager_->SetLevelImage(texture_ref_.get(), GL_TEXTURE_2D, 1, image.get());
1640 // Image should be reset when SetLevelInfo is called.
1641 manager_->SetLevelInfo(texture_ref_.get(),
1652 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 1) == NULL);
1657 bool InSet(std::set<std::string>* string_set, const std::string& str) {
1658 std::pair<std::set<std::string>::iterator, bool> result =
1659 string_set->insert(str);
1660 return !result.second;
1663 } // anonymous namespace
1665 TEST_F(TextureTest, AddToSignature) {
1666 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1667 manager_->SetLevelInfo(texture_ref_.get(),
1678 std::string signature1;
1679 std::string signature2;
1680 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature1);
1682 std::set<std::string> string_set;
1683 EXPECT_FALSE(InSet(&string_set, signature1));
1685 // check changing 1 thing makes a different signature.
1686 manager_->SetLevelInfo(texture_ref_.get(),
1697 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1698 EXPECT_FALSE(InSet(&string_set, signature2));
1700 // check putting it back makes the same signature.
1701 manager_->SetLevelInfo(texture_ref_.get(),
1713 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1714 EXPECT_EQ(signature1, signature2);
1716 // Check setting cleared status does not change signature.
1717 manager_->SetLevelInfo(texture_ref_.get(),
1729 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1730 EXPECT_EQ(signature1, signature2);
1732 // Check changing other settings changes signature.
1733 manager_->SetLevelInfo(texture_ref_.get(),
1745 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1746 EXPECT_FALSE(InSet(&string_set, signature2));
1748 manager_->SetLevelInfo(texture_ref_.get(),
1760 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1761 EXPECT_FALSE(InSet(&string_set, signature2));
1763 manager_->SetLevelInfo(texture_ref_.get(),
1775 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1776 EXPECT_FALSE(InSet(&string_set, signature2));
1778 manager_->SetLevelInfo(texture_ref_.get(),
1790 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1791 EXPECT_FALSE(InSet(&string_set, signature2));
1793 manager_->SetLevelInfo(texture_ref_.get(),
1805 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1806 EXPECT_FALSE(InSet(&string_set, signature2));
1809 manager_->SetLevelInfo(texture_ref_.get(),
1821 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1822 EXPECT_EQ(signature1, signature2);
1824 // check changing parameters changes signature.
1826 texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR);
1828 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1829 EXPECT_FALSE(InSet(&string_set, signature2));
1831 SetParameter(texture_ref_.get(),
1832 GL_TEXTURE_MIN_FILTER,
1833 GL_NEAREST_MIPMAP_LINEAR,
1836 texture_ref_.get(), GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR);
1838 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1839 EXPECT_FALSE(InSet(&string_set, signature2));
1842 texture_ref_.get(), GL_TEXTURE_MAG_FILTER, GL_LINEAR, GL_NO_ERROR);
1844 texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
1846 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1847 EXPECT_FALSE(InSet(&string_set, signature2));
1849 SetParameter(texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_REPEAT, GL_NO_ERROR);
1851 texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR);
1853 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1854 EXPECT_FALSE(InSet(&string_set, signature2));
1856 // Check putting it back genenerates the same signature
1857 SetParameter(texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_REPEAT, GL_NO_ERROR);
1859 manager_->AddToSignature(texture_ref_.get(), GL_TEXTURE_2D, 1, &signature2);
1860 EXPECT_EQ(signature1, signature2);
1862 // Check the set was acutally getting different signatures.
1863 EXPECT_EQ(11u, string_set.size());
1866 class ProduceConsumeTextureTest : public TextureTest,
1867 public ::testing::WithParamInterface<GLenum> {
1869 void SetUp() override {
1870 TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external");
1871 manager_->CreateTexture(kClient2Id, kService2Id);
1872 texture2_ = manager_->GetTexture(kClient2Id);
1874 EXPECT_CALL(*decoder_.get(), GetErrorState())
1875 .WillRepeatedly(Return(error_state_.get()));
1878 void TearDown() override {
1879 if (texture2_.get()) {
1880 // If it's not in the manager then setting texture2_ to NULL will
1881 // delete the texture.
1882 if (!texture2_->client_id()) {
1883 // Check that it gets deleted when the last reference is released.
1886 DeleteTextures(1, ::testing::Pointee(texture2_->service_id())))
1887 .Times(1).RetiresOnSaturation();
1891 TextureTest::TearDown();
1896 LevelInfo(GLenum target,
1923 bool operator==(const LevelInfo& other) const {
1924 return target == other.target && format == other.format &&
1925 width == other.width && height == other.height &&
1926 depth == other.depth && border == other.border &&
1927 type == other.type && cleared == other.cleared;
1940 void SetLevelInfo(TextureRef* texture_ref,
1942 const LevelInfo& info) {
1943 manager_->SetLevelInfo(texture_ref,
1956 static LevelInfo GetLevelInfo(const TextureRef* texture_ref,
1959 const Texture* texture = texture_ref->texture();
1961 info.target = target;
1962 EXPECT_TRUE(texture->GetLevelSize(target, level, &info.width,
1964 EXPECT_TRUE(texture->GetLevelType(target, level, &info.type,
1966 info.cleared = texture->IsLevelCleared(target, level);
1970 Texture* Produce(TextureRef* texture_ref) {
1971 Texture* texture = manager_->Produce(texture_ref);
1972 EXPECT_TRUE(texture != NULL);
1976 void Consume(GLuint client_id, Texture* texture) {
1977 EXPECT_TRUE(manager_->Consume(client_id, texture));
1980 scoped_refptr<TextureRef> texture2_;
1983 static const GLuint kClient2Id;
1984 static const GLuint kService2Id;
1987 const GLuint ProduceConsumeTextureTest::kClient2Id = 2;
1988 const GLuint ProduceConsumeTextureTest::kService2Id = 12;
1990 TEST_F(ProduceConsumeTextureTest, ProduceConsume2D) {
1991 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
1992 Texture* texture = texture_ref_->texture();
1993 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), texture->target());
1995 GL_TEXTURE_2D, GL_RGBA, 4, 4, 1, 0, GL_UNSIGNED_BYTE, true);
1996 SetLevelInfo(texture_ref_.get(), 0, level0);
1997 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture_ref_.get()));
1998 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
1999 LevelInfo level1 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 1);
2000 LevelInfo level2 = GetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 2);
2001 Texture* produced_texture = Produce(texture_ref_.get());
2002 EXPECT_EQ(produced_texture, texture);
2004 // Make this texture bigger with more levels, and make sure they get
2005 // clobbered correctly during Consume().
2006 manager_->SetTarget(texture2_.get(), GL_TEXTURE_2D);
2010 LevelInfo(GL_TEXTURE_2D, GL_RGBA, 16, 16, 1, 0, GL_UNSIGNED_BYTE, false));
2011 EXPECT_TRUE(manager_->MarkMipmapsGenerated(texture2_.get()));
2012 texture = texture2_->texture();
2013 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
2014 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture->estimated_size());
2016 GLuint client_id = texture2_->client_id();
2017 manager_->RemoveTexture(client_id);
2018 Consume(client_id, produced_texture);
2019 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2020 EXPECT_EQ(produced_texture, restored_texture->texture());
2021 EXPECT_EQ(level0, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 0));
2022 EXPECT_EQ(level1, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 1));
2023 EXPECT_EQ(level2, GetLevelInfo(restored_texture.get(), GL_TEXTURE_2D, 2));
2024 texture = restored_texture->texture();
2025 EXPECT_EQ(64U + 16U + 4U, texture->estimated_size());
2027 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 3, &w, &h));
2029 // However the old texture ref still exists if it was referenced somewhere.
2030 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U,
2031 texture2_->texture()->estimated_size());
2034 TEST_F(ProduceConsumeTextureTest, ProduceConsumeClearRectangle) {
2035 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_RECTANGLE_ARB);
2036 Texture* texture = texture_ref_->texture();
2037 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB), texture->target());
2039 GL_TEXTURE_RECTANGLE_ARB, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
2040 SetLevelInfo(texture_ref_.get(), 0, level0);
2041 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
2042 Texture* produced_texture = Produce(texture_ref_.get());
2043 EXPECT_EQ(produced_texture, texture);
2044 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_RECTANGLE_ARB),
2045 produced_texture->target());
2047 GLuint client_id = texture2_->client_id();
2048 manager_->RemoveTexture(client_id);
2049 Consume(client_id, produced_texture);
2050 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2051 EXPECT_EQ(produced_texture, restored_texture->texture());
2053 // See if we can clear the previously uncleared level now.
2055 GetLevelInfo(restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
2056 EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _, _))
2057 .WillRepeatedly(Return(true));
2058 EXPECT_TRUE(manager_->ClearTextureLevel(
2059 decoder_.get(), restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
2062 TEST_F(ProduceConsumeTextureTest, ProduceConsumeExternal) {
2063 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES);
2064 Texture* texture = texture_ref_->texture();
2065 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target());
2067 GL_TEXTURE_EXTERNAL_OES, GL_RGBA, 1, 1, 1, 0, GL_UNSIGNED_BYTE, false);
2068 SetLevelInfo(texture_ref_.get(), 0, level0);
2069 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
2070 Texture* produced_texture = Produce(texture_ref_.get());
2071 EXPECT_EQ(produced_texture, texture);
2073 GLuint client_id = texture2_->client_id();
2074 manager_->RemoveTexture(client_id);
2075 Consume(client_id, produced_texture);
2076 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2077 EXPECT_EQ(produced_texture, restored_texture->texture());
2079 GetLevelInfo(restored_texture.get(), GL_TEXTURE_EXTERNAL_OES, 0));
2082 TEST_P(ProduceConsumeTextureTest, ProduceConsumeTextureWithImage) {
2083 GLenum target = GetParam();
2084 manager_->SetTarget(texture_ref_.get(), target);
2085 Texture* texture = texture_ref_->texture();
2086 EXPECT_EQ(static_cast<GLenum>(target), texture->target());
2087 scoped_refptr<gfx::GLImage> image(new gfx::GLImageStub);
2088 manager_->SetLevelInfo(texture_ref_.get(),
2099 manager_->SetLevelImage(texture_ref_.get(), target, 0, image.get());
2100 GLuint service_id = texture->service_id();
2101 Texture* produced_texture = Produce(texture_ref_.get());
2103 GLuint client_id = texture2_->client_id();
2104 manager_->RemoveTexture(client_id);
2105 Consume(client_id, produced_texture);
2106 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2107 EXPECT_EQ(produced_texture, restored_texture->texture());
2108 EXPECT_EQ(service_id, restored_texture->service_id());
2109 EXPECT_EQ(image.get(), restored_texture->texture()->GetLevelImage(target, 0));
2112 static const GLenum kTextureTargets[] = {GL_TEXTURE_2D, GL_TEXTURE_EXTERNAL_OES,
2113 GL_TEXTURE_RECTANGLE_ARB, };
2115 INSTANTIATE_TEST_CASE_P(Target,
2116 ProduceConsumeTextureTest,
2117 ::testing::ValuesIn(kTextureTargets));
2119 TEST_F(ProduceConsumeTextureTest, ProduceConsumeCube) {
2120 manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP);
2121 Texture* texture = texture_ref_->texture();
2122 EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target());
2123 LevelInfo face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
2131 LevelInfo face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
2139 SetLevelInfo(texture_ref_.get(), 0, face0);
2140 SetLevelInfo(texture_ref_.get(), 0, face5);
2141 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture));
2142 Texture* produced_texture = Produce(texture_ref_.get());
2143 EXPECT_EQ(produced_texture, texture);
2145 GLuint client_id = texture2_->client_id();
2146 manager_->RemoveTexture(client_id);
2147 Consume(client_id, produced_texture);
2148 scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id);
2149 EXPECT_EQ(produced_texture, restored_texture->texture());
2152 GetLevelInfo(restored_texture.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0));
2155 GetLevelInfo(restored_texture.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0));
2158 class CountingMemoryTracker : public MemoryTracker {
2160 CountingMemoryTracker() {
2161 current_size_[0] = 0;
2162 current_size_[1] = 0;
2165 void TrackMemoryAllocatedChange(size_t old_size,
2167 Pool pool) override {
2168 DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
2169 current_size_[pool] += new_size - old_size;
2172 bool EnsureGPUMemoryAvailable(size_t size_needed) override { return true; }
2174 size_t GetSize(Pool pool) {
2175 DCHECK_LT(static_cast<size_t>(pool), arraysize(current_size_));
2176 return current_size_[pool];
2180 ~CountingMemoryTracker() override {}
2182 size_t current_size_[2];
2183 DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker);
2186 class SharedTextureTest : public GpuServiceTest {
2188 static const bool kUseDefaultTextures = false;
2190 SharedTextureTest() : feature_info_(new FeatureInfo()) {}
2192 ~SharedTextureTest() override {}
2194 void SetUp() override {
2195 GpuServiceTest::SetUp();
2196 memory_tracker1_ = new CountingMemoryTracker;
2197 texture_manager1_.reset(
2198 new TextureManager(memory_tracker1_.get(),
2199 feature_info_.get(),
2200 TextureManagerTest::kMaxTextureSize,
2201 TextureManagerTest::kMaxCubeMapTextureSize,
2202 kUseDefaultTextures));
2203 memory_tracker2_ = new CountingMemoryTracker;
2204 texture_manager2_.reset(
2205 new TextureManager(memory_tracker2_.get(),
2206 feature_info_.get(),
2207 TextureManagerTest::kMaxTextureSize,
2208 TextureManagerTest::kMaxCubeMapTextureSize,
2209 kUseDefaultTextures));
2210 TestHelper::SetupTextureManagerInitExpectations(
2211 gl_.get(), "", kUseDefaultTextures);
2212 texture_manager1_->Initialize();
2213 TestHelper::SetupTextureManagerInitExpectations(
2214 gl_.get(), "", kUseDefaultTextures);
2215 texture_manager2_->Initialize();
2218 void TearDown() override {
2219 texture_manager2_->Destroy(false);
2220 texture_manager2_.reset();
2221 texture_manager1_->Destroy(false);
2222 texture_manager1_.reset();
2223 GpuServiceTest::TearDown();
2227 scoped_refptr<FeatureInfo> feature_info_;
2228 scoped_refptr<CountingMemoryTracker> memory_tracker1_;
2229 scoped_ptr<TextureManager> texture_manager1_;
2230 scoped_refptr<CountingMemoryTracker> memory_tracker2_;
2231 scoped_ptr<TextureManager> texture_manager2_;
2234 TEST_F(SharedTextureTest, DeleteTextures) {
2235 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2236 scoped_refptr<TextureRef> ref2 =
2237 texture_manager2_->Consume(20, ref1->texture());
2238 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2241 texture_manager1_->RemoveTexture(10);
2242 testing::Mock::VerifyAndClearExpectations(gl_.get());
2244 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2246 .RetiresOnSaturation();
2248 texture_manager2_->RemoveTexture(20);
2249 testing::Mock::VerifyAndClearExpectations(gl_.get());
2252 TEST_F(SharedTextureTest, TextureSafetyAccounting) {
2253 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
2254 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
2255 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
2256 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
2257 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
2258 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
2260 // Newly created texture is renderable.
2261 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2262 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
2263 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
2264 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
2266 // Associate new texture ref to other texture manager, should account for it
2268 scoped_refptr<TextureRef> ref2 =
2269 texture_manager2_->Consume(20, ref1->texture());
2270 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
2271 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
2272 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
2274 // Make texture renderable but uncleared on one texture manager, should affect
2276 texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2277 EXPECT_TRUE(texture_manager1_->HaveUnrenderableTextures());
2278 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
2279 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
2280 EXPECT_TRUE(texture_manager2_->HaveUnrenderableTextures());
2281 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
2282 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
2284 texture_manager1_->SetLevelInfo(ref1.get(),
2295 EXPECT_FALSE(texture_manager1_->HaveUnrenderableTextures());
2296 EXPECT_TRUE(texture_manager1_->HaveUnsafeTextures());
2297 EXPECT_TRUE(texture_manager1_->HaveUnclearedMips());
2298 EXPECT_FALSE(texture_manager2_->HaveUnrenderableTextures());
2299 EXPECT_TRUE(texture_manager2_->HaveUnsafeTextures());
2300 EXPECT_TRUE(texture_manager2_->HaveUnclearedMips());
2302 // Make texture cleared on one texture manager, should affect other one.
2303 texture_manager1_->SetLevelCleared(ref1.get(), GL_TEXTURE_2D, 0, true);
2304 EXPECT_FALSE(texture_manager1_->HaveUnsafeTextures());
2305 EXPECT_FALSE(texture_manager1_->HaveUnclearedMips());
2306 EXPECT_FALSE(texture_manager2_->HaveUnsafeTextures());
2307 EXPECT_FALSE(texture_manager2_->HaveUnclearedMips());
2309 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2311 .RetiresOnSaturation();
2312 texture_manager1_->RemoveTexture(10);
2313 texture_manager2_->RemoveTexture(20);
2316 TEST_F(SharedTextureTest, FBOCompletenessCheck) {
2317 const GLenum kCompleteValue = GL_FRAMEBUFFER_COMPLETE;
2318 FramebufferManager framebuffer_manager1(1, 1);
2319 texture_manager1_->set_framebuffer_manager(&framebuffer_manager1);
2320 FramebufferManager framebuffer_manager2(1, 1);
2321 texture_manager2_->set_framebuffer_manager(&framebuffer_manager2);
2323 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2324 framebuffer_manager1.CreateFramebuffer(10, 10);
2325 scoped_refptr<Framebuffer> framebuffer1 =
2326 framebuffer_manager1.GetFramebuffer(10);
2327 framebuffer1->AttachTexture(
2328 GL_COLOR_ATTACHMENT0, ref1.get(), GL_TEXTURE_2D, 0, 0);
2329 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1.get()));
2330 EXPECT_NE(kCompleteValue, framebuffer1->IsPossiblyComplete());
2332 // Make FBO complete in manager 1.
2333 texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2334 texture_manager1_->SetLevelInfo(ref1.get(),
2345 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
2346 framebuffer_manager1.MarkAsComplete(framebuffer1.get());
2347 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1.get()));
2349 // Share texture with manager 2.
2350 scoped_refptr<TextureRef> ref2 =
2351 texture_manager2_->Consume(20, ref1->texture());
2352 framebuffer_manager2.CreateFramebuffer(20, 20);
2353 scoped_refptr<Framebuffer> framebuffer2 =
2354 framebuffer_manager2.GetFramebuffer(20);
2355 framebuffer2->AttachTexture(
2356 GL_COLOR_ATTACHMENT0, ref2.get(), GL_TEXTURE_2D, 0, 0);
2357 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2.get()));
2358 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
2359 framebuffer_manager2.MarkAsComplete(framebuffer2.get());
2360 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2.get()));
2362 // Change level for texture, both FBOs should be marked incomplete
2363 texture_manager1_->SetLevelInfo(ref1.get(),
2374 EXPECT_FALSE(framebuffer_manager1.IsComplete(framebuffer1.get()));
2375 EXPECT_EQ(kCompleteValue, framebuffer1->IsPossiblyComplete());
2376 framebuffer_manager1.MarkAsComplete(framebuffer1.get());
2377 EXPECT_TRUE(framebuffer_manager1.IsComplete(framebuffer1.get()));
2378 EXPECT_FALSE(framebuffer_manager2.IsComplete(framebuffer2.get()));
2379 EXPECT_EQ(kCompleteValue, framebuffer2->IsPossiblyComplete());
2380 framebuffer_manager2.MarkAsComplete(framebuffer2.get());
2381 EXPECT_TRUE(framebuffer_manager2.IsComplete(framebuffer2.get()));
2383 EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _))
2385 .RetiresOnSaturation();
2386 framebuffer_manager1.RemoveFramebuffer(10);
2387 framebuffer_manager2.RemoveFramebuffer(20);
2388 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2390 .RetiresOnSaturation();
2391 texture_manager1_->RemoveTexture(10);
2392 texture_manager2_->RemoveTexture(20);
2395 TEST_F(SharedTextureTest, Memory) {
2396 size_t initial_memory1 = memory_tracker1_->GetSize(MemoryTracker::kUnmanaged);
2397 size_t initial_memory2 = memory_tracker2_->GetSize(MemoryTracker::kUnmanaged);
2399 // Newly created texture is unrenderable.
2400 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2401 texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2402 texture_manager1_->SetLevelInfo(ref1.get(),
2414 EXPECT_LT(0u, ref1->texture()->estimated_size());
2415 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
2416 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
2418 // Associate new texture ref to other texture manager, it doesn't account for
2419 // the texture memory, the first memory tracker still has it.
2420 scoped_refptr<TextureRef> ref2 =
2421 texture_manager2_->Consume(20, ref1->texture());
2422 EXPECT_EQ(initial_memory1 + ref1->texture()->estimated_size(),
2423 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
2424 EXPECT_EQ(initial_memory2,
2425 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
2427 // Delete the texture, memory should go to the remaining tracker.
2428 texture_manager1_->RemoveTexture(10);
2430 EXPECT_EQ(initial_memory1,
2431 memory_tracker1_->GetSize(MemoryTracker::kUnmanaged));
2432 EXPECT_EQ(initial_memory2 + ref2->texture()->estimated_size(),
2433 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
2435 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2437 .RetiresOnSaturation();
2439 texture_manager2_->RemoveTexture(20);
2440 EXPECT_EQ(initial_memory2,
2441 memory_tracker2_->GetSize(MemoryTracker::kUnmanaged));
2444 TEST_F(SharedTextureTest, Images) {
2445 scoped_refptr<TextureRef> ref1 = texture_manager1_->CreateTexture(10, 10);
2446 scoped_refptr<TextureRef> ref2 =
2447 texture_manager2_->Consume(20, ref1->texture());
2449 texture_manager1_->SetTarget(ref1.get(), GL_TEXTURE_2D);
2450 texture_manager1_->SetLevelInfo(ref1.get(),
2461 EXPECT_FALSE(ref1->texture()->HasImages());
2462 EXPECT_FALSE(ref2->texture()->HasImages());
2463 EXPECT_FALSE(texture_manager1_->HaveImages());
2464 EXPECT_FALSE(texture_manager2_->HaveImages());
2465 scoped_refptr<gfx::GLImage> image1(new gfx::GLImageStub);
2466 texture_manager1_->SetLevelImage(ref1.get(), GL_TEXTURE_2D, 1, image1.get());
2467 EXPECT_TRUE(ref1->texture()->HasImages());
2468 EXPECT_TRUE(ref2->texture()->HasImages());
2469 EXPECT_TRUE(texture_manager1_->HaveImages());
2470 EXPECT_TRUE(texture_manager2_->HaveImages());
2471 scoped_refptr<gfx::GLImage> image2(new gfx::GLImageStub);
2472 texture_manager1_->SetLevelImage(ref1.get(), GL_TEXTURE_2D, 1, image2.get());
2473 EXPECT_TRUE(ref1->texture()->HasImages());
2474 EXPECT_TRUE(ref2->texture()->HasImages());
2475 EXPECT_TRUE(texture_manager1_->HaveImages());
2476 EXPECT_TRUE(texture_manager2_->HaveImages());
2477 texture_manager1_->SetLevelInfo(ref1.get(),
2488 EXPECT_FALSE(ref1->texture()->HasImages());
2489 EXPECT_FALSE(ref2->texture()->HasImages());
2490 EXPECT_FALSE(texture_manager1_->HaveImages());
2491 EXPECT_FALSE(texture_manager1_->HaveImages());
2493 EXPECT_CALL(*gl_, DeleteTextures(1, _))
2495 .RetiresOnSaturation();
2496 texture_manager1_->RemoveTexture(10);
2497 texture_manager2_->RemoveTexture(20);
2500 } // namespace gles2