| 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 |