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

Side by Side Diff: ui/ozone/platform/drm/gpu/screen_manager_unittest.cc

Issue 1100973002: [2/4]Allow hotplugging of primary DRM device (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@fix-hotplug
Patch Set: unittests Created 5 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
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « ui/ozone/platform/drm/gpu/gbm_device.cc ('k') | ui/ozone/platform/drm/host/drm_native_display_delegate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698