OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "testing/gtest/include/gtest/gtest.h" | 5 #include "testing/gtest/include/gtest/gtest.h" |
6 #include "ui/ozone/platform/drm/gpu/crtc_controller.h" | 6 #include "ui/ozone/platform/drm/gpu/crtc_controller.h" |
7 #include "ui/ozone/platform/drm/gpu/drm_buffer.h" | 7 #include "ui/ozone/platform/drm/gpu/drm_buffer.h" |
| 8 #include "ui/ozone/platform/drm/gpu/drm_device_generator.h" |
8 #include "ui/ozone/platform/drm/gpu/drm_device_manager.h" | 9 #include "ui/ozone/platform/drm/gpu/drm_device_manager.h" |
9 #include "ui/ozone/platform/drm/gpu/drm_window.h" | 10 #include "ui/ozone/platform/drm/gpu/drm_window.h" |
10 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h" | 11 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h" |
11 #include "ui/ozone/platform/drm/gpu/screen_manager.h" | 12 #include "ui/ozone/platform/drm/gpu/screen_manager.h" |
12 #include "ui/ozone/platform/drm/test/mock_drm_device.h" | 13 #include "ui/ozone/platform/drm/test/mock_drm_device.h" |
13 | 14 |
14 namespace { | 15 namespace { |
15 | 16 |
16 // Create a basic mode for a 6x4 screen. | 17 // Create a basic mode for a 6x4 screen. |
17 const drmModeModeInfo kDefaultMode = | 18 const drmModeModeInfo kDefaultMode = |
(...skipping 16 matching lines...) Expand all Loading... |
34 } | 35 } |
35 | 36 |
36 // Secondary is in extended mode, right-of primary. | 37 // Secondary is in extended mode, right-of primary. |
37 gfx::Rect GetSecondaryBounds() const { | 38 gfx::Rect GetSecondaryBounds() const { |
38 return gfx::Rect(kDefaultMode.hdisplay, 0, kDefaultMode.hdisplay, | 39 return gfx::Rect(kDefaultMode.hdisplay, 0, kDefaultMode.hdisplay, |
39 kDefaultMode.vdisplay); | 40 kDefaultMode.vdisplay); |
40 } | 41 } |
41 | 42 |
42 void SetUp() override { | 43 void SetUp() override { |
43 drm_ = new ui::MockDrmDevice(); | 44 drm_ = new ui::MockDrmDevice(); |
| 45 device_manager_.reset(new ui::DrmDeviceManager(nullptr)); |
44 buffer_generator_.reset(new ui::DrmBufferGenerator()); | 46 buffer_generator_.reset(new ui::DrmBufferGenerator()); |
45 screen_manager_.reset(new ui::ScreenManager(buffer_generator_.get())); | 47 screen_manager_.reset(new ui::ScreenManager(buffer_generator_.get())); |
46 } | 48 } |
47 void TearDown() override { | 49 void TearDown() override { |
48 screen_manager_.reset(); | 50 screen_manager_.reset(); |
49 drm_ = nullptr; | 51 drm_ = nullptr; |
50 } | 52 } |
51 | 53 |
52 protected: | 54 protected: |
53 scoped_refptr<ui::MockDrmDevice> drm_; | 55 scoped_refptr<ui::MockDrmDevice> drm_; |
| 56 scoped_ptr<ui::DrmDeviceManager> device_manager_; |
54 scoped_ptr<ui::DrmBufferGenerator> buffer_generator_; | 57 scoped_ptr<ui::DrmBufferGenerator> buffer_generator_; |
55 scoped_ptr<ui::ScreenManager> screen_manager_; | 58 scoped_ptr<ui::ScreenManager> screen_manager_; |
56 | 59 |
57 private: | 60 private: |
58 DISALLOW_COPY_AND_ASSIGN(ScreenManagerTest); | 61 DISALLOW_COPY_AND_ASSIGN(ScreenManagerTest); |
59 }; | 62 }; |
60 | 63 |
61 TEST_F(ScreenManagerTest, CheckWithNoControllers) { | 64 TEST_F(ScreenManagerTest, CheckWithNoControllers) { |
62 EXPECT_FALSE(screen_manager_->GetDisplayController(GetPrimaryBounds())); | 65 EXPECT_FALSE(screen_manager_->GetDisplayController(GetPrimaryBounds())); |
63 } | 66 } |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 screen_manager_->GetDisplayController(GetPrimaryBounds()); | 304 screen_manager_->GetDisplayController(GetPrimaryBounds()); |
302 ui::HardwareDisplayController* controller2 = | 305 ui::HardwareDisplayController* controller2 = |
303 screen_manager_->GetDisplayController(GetSecondaryBounds()); | 306 screen_manager_->GetDisplayController(GetSecondaryBounds()); |
304 | 307 |
305 EXPECT_NE(controller1, controller2); | 308 EXPECT_NE(controller1, controller2); |
306 EXPECT_EQ(drm_, controller1->crtc_controllers()[0]->drm()); | 309 EXPECT_EQ(drm_, controller1->crtc_controllers()[0]->drm()); |
307 EXPECT_EQ(drm2, controller2->crtc_controllers()[0]->drm()); | 310 EXPECT_EQ(drm2, controller2->crtc_controllers()[0]->drm()); |
308 } | 311 } |
309 | 312 |
310 TEST_F(ScreenManagerTest, CheckControllerToWindowMappingWithSameBounds) { | 313 TEST_F(ScreenManagerTest, CheckControllerToWindowMappingWithSameBounds) { |
311 ui::DrmDeviceManager device_manager(drm_); | |
312 scoped_ptr<ui::DrmWindow> window( | 314 scoped_ptr<ui::DrmWindow> window( |
313 new ui::DrmWindow(1, &device_manager, screen_manager_.get())); | 315 new ui::DrmWindow(1, device_manager_.get(), screen_manager_.get())); |
314 window->Initialize(); | 316 window->Initialize(); |
315 window->OnBoundsChanged(GetPrimaryBounds()); | 317 window->OnBoundsChanged(GetPrimaryBounds()); |
316 screen_manager_->AddWindow(1, window.Pass()); | 318 screen_manager_->AddWindow(1, window.Pass()); |
317 | 319 |
318 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); | 320 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); |
319 screen_manager_->ConfigureDisplayController( | 321 screen_manager_->ConfigureDisplayController( |
320 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), | 322 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), |
321 kDefaultMode); | 323 kDefaultMode); |
322 | 324 |
323 EXPECT_TRUE(screen_manager_->GetWindow(1)->GetController()); | 325 EXPECT_TRUE(screen_manager_->GetWindow(1)->GetController()); |
324 | 326 |
325 window = screen_manager_->RemoveWindow(1); | 327 window = screen_manager_->RemoveWindow(1); |
326 window->Shutdown(); | 328 window->Shutdown(); |
327 } | 329 } |
328 | 330 |
329 TEST_F(ScreenManagerTest, CheckControllerToWindowMappingWithDifferentBounds) { | 331 TEST_F(ScreenManagerTest, CheckControllerToWindowMappingWithDifferentBounds) { |
330 ui::DrmDeviceManager device_manager(drm_); | |
331 scoped_ptr<ui::DrmWindow> window( | 332 scoped_ptr<ui::DrmWindow> window( |
332 new ui::DrmWindow(1, &device_manager, screen_manager_.get())); | 333 new ui::DrmWindow(1, device_manager_.get(), screen_manager_.get())); |
333 window->Initialize(); | 334 window->Initialize(); |
334 gfx::Rect new_bounds = GetPrimaryBounds(); | 335 gfx::Rect new_bounds = GetPrimaryBounds(); |
335 new_bounds.Inset(0, 0, 1, 1); | 336 new_bounds.Inset(0, 0, 1, 1); |
336 window->OnBoundsChanged(new_bounds); | 337 window->OnBoundsChanged(new_bounds); |
337 screen_manager_->AddWindow(1, window.Pass()); | 338 screen_manager_->AddWindow(1, window.Pass()); |
338 | 339 |
339 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); | 340 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); |
340 screen_manager_->ConfigureDisplayController( | 341 screen_manager_->ConfigureDisplayController( |
341 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), | 342 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), |
342 kDefaultMode); | 343 kDefaultMode); |
343 | 344 |
344 EXPECT_FALSE(screen_manager_->GetWindow(1)->GetController()); | 345 EXPECT_FALSE(screen_manager_->GetWindow(1)->GetController()); |
345 | 346 |
346 window = screen_manager_->RemoveWindow(1); | 347 window = screen_manager_->RemoveWindow(1); |
347 window->Shutdown(); | 348 window->Shutdown(); |
348 } | 349 } |
349 | 350 |
350 TEST_F(ScreenManagerTest, | 351 TEST_F(ScreenManagerTest, |
351 CheckControllerToWindowMappingWithOverlappingWindows) { | 352 CheckControllerToWindowMappingWithOverlappingWindows) { |
352 ui::DrmDeviceManager device_manager(drm_); | |
353 const size_t kWindowCount = 2; | 353 const size_t kWindowCount = 2; |
354 for (size_t i = 1; i < kWindowCount + 1; ++i) { | 354 for (size_t i = 1; i < kWindowCount + 1; ++i) { |
355 scoped_ptr<ui::DrmWindow> window( | 355 scoped_ptr<ui::DrmWindow> window( |
356 new ui::DrmWindow(1, &device_manager, screen_manager_.get())); | 356 new ui::DrmWindow(i, device_manager_.get(), screen_manager_.get())); |
357 window->Initialize(); | 357 window->Initialize(); |
358 window->OnBoundsChanged(GetPrimaryBounds()); | 358 window->OnBoundsChanged(GetPrimaryBounds()); |
359 screen_manager_->AddWindow(i, window.Pass()); | 359 screen_manager_->AddWindow(i, window.Pass()); |
360 } | 360 } |
361 | 361 |
362 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); | 362 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); |
363 screen_manager_->ConfigureDisplayController( | 363 screen_manager_->ConfigureDisplayController( |
364 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), | 364 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), |
365 kDefaultMode); | 365 kDefaultMode); |
366 | 366 |
367 bool window1_has_controller = screen_manager_->GetWindow(1)->GetController(); | 367 bool window1_has_controller = screen_manager_->GetWindow(1)->GetController(); |
368 bool window2_has_controller = screen_manager_->GetWindow(2)->GetController(); | 368 bool window2_has_controller = screen_manager_->GetWindow(2)->GetController(); |
369 // Only one of the windows can have a controller. | 369 // Only one of the windows can have a controller. |
370 EXPECT_TRUE(window1_has_controller ^ window2_has_controller); | 370 EXPECT_TRUE(window1_has_controller ^ window2_has_controller); |
371 | 371 |
372 for (size_t i = 1; i < kWindowCount + 1; ++i) { | 372 for (size_t i = 1; i < kWindowCount + 1; ++i) { |
373 scoped_ptr<ui::DrmWindow> window = screen_manager_->RemoveWindow(i); | 373 scoped_ptr<ui::DrmWindow> window = screen_manager_->RemoveWindow(i); |
374 window->Shutdown(); | 374 window->Shutdown(); |
375 } | 375 } |
376 } | 376 } |
377 | 377 |
378 TEST_F(ScreenManagerTest, ShouldDissociateWindowOnControllerRemoval) { | 378 TEST_F(ScreenManagerTest, ShouldDissociateWindowOnControllerRemoval) { |
379 gfx::AcceleratedWidget window_id = 1; | 379 gfx::AcceleratedWidget window_id = 1; |
380 ui::DrmDeviceManager device_manager(drm_); | 380 scoped_ptr<ui::DrmWindow> window(new ui::DrmWindow( |
381 scoped_ptr<ui::DrmWindow> window( | 381 window_id, device_manager_.get(), screen_manager_.get())); |
382 new ui::DrmWindow(window_id, &device_manager, screen_manager_.get())); | |
383 window->Initialize(); | 382 window->Initialize(); |
384 window->OnBoundsChanged(GetPrimaryBounds()); | 383 window->OnBoundsChanged(GetPrimaryBounds()); |
385 screen_manager_->AddWindow(window_id, window.Pass()); | 384 screen_manager_->AddWindow(window_id, window.Pass()); |
386 | 385 |
387 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); | 386 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); |
388 screen_manager_->ConfigureDisplayController( | 387 screen_manager_->ConfigureDisplayController( |
389 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), | 388 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), |
390 kDefaultMode); | 389 kDefaultMode); |
391 | 390 |
392 EXPECT_TRUE(screen_manager_->GetWindow(window_id)->GetController()); | 391 EXPECT_TRUE(screen_manager_->GetWindow(window_id)->GetController()); |
393 | 392 |
394 screen_manager_->RemoveDisplayController(drm_, kPrimaryCrtc); | 393 screen_manager_->RemoveDisplayController(drm_, kPrimaryCrtc); |
395 | 394 |
396 EXPECT_FALSE(screen_manager_->GetWindow(window_id)->GetController()); | 395 EXPECT_FALSE(screen_manager_->GetWindow(window_id)->GetController()); |
397 | 396 |
398 window = screen_manager_->RemoveWindow(1); | 397 window = screen_manager_->RemoveWindow(1); |
399 window->Shutdown(); | 398 window->Shutdown(); |
400 } | 399 } |
401 | 400 |
402 TEST_F(ScreenManagerTest, EnableControllerWhenWindowHasNoBuffer) { | 401 TEST_F(ScreenManagerTest, EnableControllerWhenWindowHasNoBuffer) { |
403 ui::DrmDeviceManager device_manager(drm_); | |
404 scoped_ptr<ui::DrmWindow> window( | 402 scoped_ptr<ui::DrmWindow> window( |
405 new ui::DrmWindow(1, &device_manager, screen_manager_.get())); | 403 new ui::DrmWindow(1, device_manager_.get(), screen_manager_.get())); |
406 window->Initialize(); | 404 window->Initialize(); |
407 window->OnBoundsChanged(GetPrimaryBounds()); | 405 window->OnBoundsChanged(GetPrimaryBounds()); |
408 screen_manager_->AddWindow(1, window.Pass()); | 406 screen_manager_->AddWindow(1, window.Pass()); |
409 | 407 |
410 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); | 408 screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); |
411 screen_manager_->ConfigureDisplayController( | 409 screen_manager_->ConfigureDisplayController( |
412 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), | 410 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), |
413 kDefaultMode); | 411 kDefaultMode); |
414 | 412 |
415 EXPECT_TRUE(screen_manager_->GetWindow(1)->GetController()); | 413 EXPECT_TRUE(screen_manager_->GetWindow(1)->GetController()); |
416 // There is a buffer after initial config. | 414 // There is a buffer after initial config. |
417 uint32_t framebuffer = drm_->current_framebuffer(); | 415 uint32_t framebuffer = drm_->current_framebuffer(); |
418 EXPECT_NE(0U, framebuffer); | 416 EXPECT_NE(0U, framebuffer); |
419 | 417 |
420 screen_manager_->ConfigureDisplayController( | 418 screen_manager_->ConfigureDisplayController( |
421 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), | 419 drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), |
422 kDefaultMode); | 420 kDefaultMode); |
423 | 421 |
424 // There is a new buffer after we configured with the same mode but no | 422 // There is a new buffer after we configured with the same mode but no |
425 // pending frames on the window. | 423 // pending frames on the window. |
426 EXPECT_NE(framebuffer, drm_->current_framebuffer()); | 424 EXPECT_NE(framebuffer, drm_->current_framebuffer()); |
427 | 425 |
428 window = screen_manager_->RemoveWindow(1); | 426 window = screen_manager_->RemoveWindow(1); |
429 window->Shutdown(); | 427 window->Shutdown(); |
430 } | 428 } |
OLD | NEW |