OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/mailbox_manager.h" | 5 #include "gpu/command_buffer/service/mailbox_manager.h" |
6 | 6 |
7 #include "gpu/command_buffer/service/feature_info.h" | 7 #include "gpu/command_buffer/service/feature_info.h" |
8 #include "gpu/command_buffer/service/mailbox_synchronizer.h" | 8 #include "gpu/command_buffer/service/mailbox_synchronizer.h" |
9 #include "gpu/command_buffer/service/texture_manager.h" | 9 #include "gpu/command_buffer/service/texture_manager.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "ui/gl/gl_context_stub.h" |
11 #include "ui/gl/gl_mock.h" | 12 #include "ui/gl/gl_mock.h" |
| 13 #include "ui/gl/gl_surface_stub.h" |
12 | 14 |
13 namespace gpu { | 15 namespace gpu { |
14 namespace gles2 { | 16 namespace gles2 { |
15 | 17 |
16 using namespace ::testing; | 18 using namespace ::testing; |
17 | 19 |
18 class MailboxManagerTest : public testing::Test { | 20 class MailboxManagerTest : public testing::Test { |
19 public: | 21 public: |
20 MailboxManagerTest() {} | 22 MailboxManagerTest() {} |
21 virtual ~MailboxManagerTest() {} | 23 virtual ~MailboxManagerTest() {} |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 MailboxManagerSyncTest() {} | 183 MailboxManagerSyncTest() {} |
182 virtual ~MailboxManagerSyncTest() {} | 184 virtual ~MailboxManagerSyncTest() {} |
183 | 185 |
184 protected: | 186 protected: |
185 virtual void SetUp() { | 187 virtual void SetUp() { |
186 MailboxSynchronizer::Initialize(); | 188 MailboxSynchronizer::Initialize(); |
187 MailboxManagerTest::SetUp(); | 189 MailboxManagerTest::SetUp(); |
188 manager2_ = new MailboxManager; | 190 manager2_ = new MailboxManager; |
189 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); | 191 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); |
190 ::gfx::MockGLInterface::SetGLInterface(gl_.get()); | 192 ::gfx::MockGLInterface::SetGLInterface(gl_.get()); |
| 193 context_ = new gfx::GLContextStub(); |
| 194 surface_ = new gfx::GLSurfaceStub(); |
| 195 context_->MakeCurrent(surface_); |
191 } | 196 } |
192 | 197 |
193 Texture* DefineTexture() { | 198 Texture* DefineTexture() { |
194 Texture* texture = CreateTexture(); | 199 Texture* texture = CreateTexture(); |
195 const GLsizei levels_needed = TextureManager::ComputeMipMapCount( | 200 const GLsizei levels_needed = TextureManager::ComputeMipMapCount( |
196 GL_TEXTURE_2D, kMaxTextureWidth, kMaxTextureHeight, kMaxTextureDepth); | 201 GL_TEXTURE_2D, kMaxTextureWidth, kMaxTextureHeight, kMaxTextureDepth); |
197 SetTarget(texture, GL_TEXTURE_2D, levels_needed); | 202 SetTarget(texture, GL_TEXTURE_2D, levels_needed); |
198 SetLevelInfo(texture, | 203 SetLevelInfo(texture, |
199 GL_TEXTURE_2D, | 204 GL_TEXTURE_2D, |
200 0, | 205 0, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 .Times(1) | 247 .Times(1) |
243 .RetiresOnSaturation(); | 248 .RetiresOnSaturation(); |
244 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kCurrentTexture)) | 249 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kCurrentTexture)) |
245 .Times(1) | 250 .Times(1) |
246 .RetiresOnSaturation(); | 251 .RetiresOnSaturation(); |
247 } | 252 } |
248 | 253 |
249 virtual void TearDown() { | 254 virtual void TearDown() { |
250 MailboxManagerTest::TearDown(); | 255 MailboxManagerTest::TearDown(); |
251 MailboxSynchronizer::Terminate(); | 256 MailboxSynchronizer::Terminate(); |
| 257 context_->ReleaseCurrent(NULL); |
252 ::gfx::MockGLInterface::SetGLInterface(NULL); | 258 ::gfx::MockGLInterface::SetGLInterface(NULL); |
253 gl_.reset(); | 259 gl_.reset(); |
254 } | 260 } |
255 | 261 |
256 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | 262 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; |
257 scoped_refptr<MailboxManager> manager2_; | 263 scoped_refptr<MailboxManager> manager2_; |
| 264 scoped_refptr<gfx::GLContext> context_; |
| 265 scoped_refptr<gfx::GLSurface> surface_; |
258 | 266 |
259 private: | 267 private: |
260 DISALLOW_COPY_AND_ASSIGN(MailboxManagerSyncTest); | 268 DISALLOW_COPY_AND_ASSIGN(MailboxManagerSyncTest); |
261 }; | 269 }; |
262 | 270 |
263 TEST_F(MailboxManagerSyncTest, ProduceDestroy) { | 271 TEST_F(MailboxManagerSyncTest, ProduceDestroy) { |
264 Texture* texture = DefineTexture(); | 272 Texture* texture = DefineTexture(); |
265 Mailbox name = Mailbox::Generate(); | 273 Mailbox name = Mailbox::Generate(); |
266 | 274 |
267 InSequence sequence; | 275 InSequence sequence; |
268 manager_->ProduceTexture(GL_TEXTURE_2D, name, texture); | 276 manager_->ProduceTexture(GL_TEXTURE_2D, name, texture); |
269 EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); | 277 EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); |
270 | 278 |
271 DestroyTexture(texture); | 279 DestroyTexture(texture); |
272 EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); | 280 EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); |
273 EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name)); | 281 EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name)); |
274 } | 282 } |
275 | 283 |
276 TEST_F(MailboxManagerSyncTest, ProduceSyncDestroy) { | 284 TEST_F(MailboxManagerSyncTest, ProduceSyncDestroy) { |
277 InSequence sequence; | 285 InSequence sequence; |
278 | 286 |
279 Texture* texture = DefineTexture(); | 287 Texture* texture = DefineTexture(); |
280 Mailbox name = Mailbox::Generate(); | 288 Mailbox name = Mailbox::Generate(); |
281 | 289 |
282 manager_->ProduceTexture(GL_TEXTURE_2D, name, texture); | 290 manager_->ProduceTexture(GL_TEXTURE_2D, name, texture); |
283 EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); | 291 EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); |
284 | 292 |
285 // Synchronize | 293 // Synchronize |
286 EXPECT_CALL(*gl_, Flush()).Times(1); | |
287 manager_->PushTextureUpdates(); | 294 manager_->PushTextureUpdates(); |
288 manager2_->PullTextureUpdates(); | 295 manager2_->PullTextureUpdates(); |
289 | 296 |
290 DestroyTexture(texture); | 297 DestroyTexture(texture); |
291 EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); | 298 EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); |
292 EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name)); | 299 EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name)); |
293 } | 300 } |
294 | 301 |
295 // Duplicates a texture into a second manager instance, and then | 302 // Duplicates a texture into a second manager instance, and then |
296 // makes sure a redefinition becomes visible there too. | 303 // makes sure a redefinition becomes visible there too. |
297 TEST_F(MailboxManagerSyncTest, ProduceConsumeResize) { | 304 TEST_F(MailboxManagerSyncTest, ProduceConsumeResize) { |
298 const GLuint kNewTextureId = 1234; | 305 const GLuint kNewTextureId = 1234; |
299 InSequence sequence; | 306 InSequence sequence; |
300 | 307 |
301 Texture* texture = DefineTexture(); | 308 Texture* texture = DefineTexture(); |
302 Mailbox name = Mailbox::Generate(); | 309 Mailbox name = Mailbox::Generate(); |
303 | 310 |
304 manager_->ProduceTexture(GL_TEXTURE_2D, name, texture); | 311 manager_->ProduceTexture(GL_TEXTURE_2D, name, texture); |
305 EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); | 312 EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); |
306 | 313 |
307 // Synchronize | 314 // Synchronize |
308 EXPECT_CALL(*gl_, Flush()).Times(1); | |
309 manager_->PushTextureUpdates(); | 315 manager_->PushTextureUpdates(); |
310 manager2_->PullTextureUpdates(); | 316 manager2_->PullTextureUpdates(); |
311 | 317 |
312 EXPECT_CALL(*gl_, GenTextures(1, _)) | 318 EXPECT_CALL(*gl_, GenTextures(1, _)) |
313 .WillOnce(SetArgPointee<1>(kNewTextureId)); | 319 .WillOnce(SetArgPointee<1>(kNewTextureId)); |
314 SetupUpdateTexParamExpectations( | 320 SetupUpdateTexParamExpectations( |
315 kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT); | 321 kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT); |
316 Texture* new_texture = manager2_->ConsumeTexture(GL_TEXTURE_2D, name); | 322 Texture* new_texture = manager2_->ConsumeTexture(GL_TEXTURE_2D, name); |
317 EXPECT_FALSE(new_texture == NULL); | 323 EXPECT_FALSE(new_texture == NULL); |
318 EXPECT_NE(texture, new_texture); | 324 EXPECT_NE(texture, new_texture); |
319 EXPECT_EQ(kNewTextureId, new_texture->service_id()); | 325 EXPECT_EQ(kNewTextureId, new_texture->service_id()); |
320 | 326 |
321 // Resize original texture | 327 // Resize original texture |
322 SetLevelInfo(texture, | 328 SetLevelInfo(texture, |
323 GL_TEXTURE_2D, | 329 GL_TEXTURE_2D, |
324 0, | 330 0, |
325 GL_RGBA, | 331 GL_RGBA, |
326 16, | 332 16, |
327 32, | 333 32, |
328 1, | 334 1, |
329 0, | 335 0, |
330 GL_RGBA, | 336 GL_RGBA, |
331 GL_UNSIGNED_BYTE, | 337 GL_UNSIGNED_BYTE, |
332 true); | 338 true); |
333 // Should have been orphaned | 339 // Should have been orphaned |
334 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); | 340 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); |
335 | 341 |
336 // Synchronize again | 342 // Synchronize again |
337 EXPECT_CALL(*gl_, Flush()).Times(1); | |
338 manager_->PushTextureUpdates(); | 343 manager_->PushTextureUpdates(); |
339 SetupUpdateTexParamExpectations( | 344 SetupUpdateTexParamExpectations( |
340 kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT); | 345 kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT); |
341 manager2_->PullTextureUpdates(); | 346 manager2_->PullTextureUpdates(); |
342 GLsizei width, height; | 347 GLsizei width, height; |
343 new_texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height); | 348 new_texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height); |
344 EXPECT_EQ(16, width); | 349 EXPECT_EQ(16, width); |
345 EXPECT_EQ(32, height); | 350 EXPECT_EQ(32, height); |
346 | 351 |
347 // Should have gotten a new attachment | 352 // Should have gotten a new attachment |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 Mailbox name1 = Mailbox::Generate(); | 394 Mailbox name1 = Mailbox::Generate(); |
390 Texture* texture2 = DefineTexture(); | 395 Texture* texture2 = DefineTexture(); |
391 Mailbox name2 = Mailbox::Generate(); | 396 Mailbox name2 = Mailbox::Generate(); |
392 Texture* new_texture1 = NULL; | 397 Texture* new_texture1 = NULL; |
393 Texture* new_texture2 = NULL; | 398 Texture* new_texture2 = NULL; |
394 | 399 |
395 manager_->ProduceTexture(GL_TEXTURE_2D, name1, texture1); | 400 manager_->ProduceTexture(GL_TEXTURE_2D, name1, texture1); |
396 manager2_->ProduceTexture(GL_TEXTURE_2D, name2, texture2); | 401 manager2_->ProduceTexture(GL_TEXTURE_2D, name2, texture2); |
397 | 402 |
398 // Make visible. | 403 // Make visible. |
399 EXPECT_CALL(*gl_, Flush()).Times(2); | |
400 manager_->PushTextureUpdates(); | 404 manager_->PushTextureUpdates(); |
401 manager2_->PushTextureUpdates(); | 405 manager2_->PushTextureUpdates(); |
402 | 406 |
403 // Create textures in the other manager instances for texture1 and texture2, | 407 // Create textures in the other manager instances for texture1 and texture2, |
404 // respectively to create a real sharing scenario. Otherwise, there would | 408 // respectively to create a real sharing scenario. Otherwise, there would |
405 // never be conflicting updates/pushes. | 409 // never be conflicting updates/pushes. |
406 { | 410 { |
407 InSequence sequence; | 411 InSequence sequence; |
408 EXPECT_CALL(*gl_, GenTextures(1, _)) | 412 EXPECT_CALL(*gl_, GenTextures(1, _)) |
409 .WillOnce(SetArgPointee<1>(kNewTextureId1)); | 413 .WillOnce(SetArgPointee<1>(kNewTextureId1)); |
(...skipping 18 matching lines...) Expand all Loading... |
428 manager_->PullTextureUpdates(); | 432 manager_->PullTextureUpdates(); |
429 | 433 |
430 // Make a change to texture2 | 434 // Make a change to texture2 |
431 DCHECK_EQ(static_cast<GLuint>(GL_LINEAR), texture2->mag_filter()); | 435 DCHECK_EQ(static_cast<GLuint>(GL_LINEAR), texture2->mag_filter()); |
432 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), | 436 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), |
433 SetParameter(texture2, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); | 437 SetParameter(texture2, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); |
434 | 438 |
435 Mock::VerifyAndClearExpectations(gl_.get()); | 439 Mock::VerifyAndClearExpectations(gl_.get()); |
436 | 440 |
437 // Synchronize in both directions | 441 // Synchronize in both directions |
438 EXPECT_CALL(*gl_, Flush()).Times(2); | |
439 manager_->PushTextureUpdates(); | 442 manager_->PushTextureUpdates(); |
440 manager2_->PushTextureUpdates(); | 443 manager2_->PushTextureUpdates(); |
441 // manager1 should see the change to texture2 mag_filter being applied. | 444 // manager1 should see the change to texture2 mag_filter being applied. |
442 SetupUpdateTexParamExpectations( | 445 SetupUpdateTexParamExpectations( |
443 new_texture2->service_id(), GL_LINEAR, GL_NEAREST, GL_REPEAT, GL_REPEAT); | 446 new_texture2->service_id(), GL_LINEAR, GL_NEAREST, GL_REPEAT, GL_REPEAT); |
444 manager_->PullTextureUpdates(); | 447 manager_->PullTextureUpdates(); |
445 // manager2 should see the change to texture1 min_filter being applied. | 448 // manager2 should see the change to texture1 min_filter being applied. |
446 SetupUpdateTexParamExpectations( | 449 SetupUpdateTexParamExpectations( |
447 new_texture1->service_id(), GL_NEAREST, GL_LINEAR, GL_REPEAT, GL_REPEAT); | 450 new_texture1->service_id(), GL_NEAREST, GL_LINEAR, GL_REPEAT, GL_REPEAT); |
448 manager2_->PullTextureUpdates(); | 451 manager2_->PullTextureUpdates(); |
449 | 452 |
450 DestroyTexture(texture1); | 453 DestroyTexture(texture1); |
451 DestroyTexture(texture2); | 454 DestroyTexture(texture2); |
452 DestroyTexture(new_texture1); | 455 DestroyTexture(new_texture1); |
453 DestroyTexture(new_texture2); | 456 DestroyTexture(new_texture2); |
454 } | 457 } |
455 | 458 |
456 // TODO: different texture into same mailbox | 459 // TODO: different texture into same mailbox |
457 | 460 |
458 // TODO: same texture, multiple mailboxes | 461 // TODO: same texture, multiple mailboxes |
459 | 462 |
460 // TODO: Produce incomplete texture | 463 // TODO: Produce incomplete texture |
461 | 464 |
462 // TODO: Texture::level_infos_[][].size() | 465 // TODO: Texture::level_infos_[][].size() |
463 | 466 |
464 // TODO: unsupported targets and formats | 467 // TODO: unsupported targets and formats |
465 | 468 |
466 } // namespace gles2 | 469 } // namespace gles2 |
467 } // namespace gpu | 470 } // namespace gpu |
OLD | NEW |