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

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

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

Powered by Google App Engine
This is Rietveld 408576698