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

Side by Side Diff: ui/display/chromeos/x11/native_display_delegate_x11.cc

Issue 253513002: disable crtcs bigger than new screen size during mode switch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 8 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
« no previous file with comments | « ui/display/chromeos/x11/native_display_delegate_x11.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "ui/display/chromeos/x11/native_display_delegate_x11.h" 5 #include "ui/display/chromeos/x11/native_display_delegate_x11.h"
6 6
7 #include <X11/Xatom.h> 7 #include <X11/Xatom.h>
8 #include <X11/Xlib.h> 8 #include <X11/Xlib.h>
9 #include <X11/extensions/dpms.h> 9 #include <X11/extensions/dpms.h>
10 #include <X11/extensions/Xrandr.h> 10 #include <X11/extensions/Xrandr.h>
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 290
291 void NativeDisplayDelegateX11::CreateFrameBuffer(const gfx::Size& size) { 291 void NativeDisplayDelegateX11::CreateFrameBuffer(const gfx::Size& size) {
292 CHECK(screen_) << "Server not grabbed"; 292 CHECK(screen_) << "Server not grabbed";
293 int current_width = DisplayWidth(display_, DefaultScreen(display_)); 293 int current_width = DisplayWidth(display_, DefaultScreen(display_));
294 int current_height = DisplayHeight(display_, DefaultScreen(display_)); 294 int current_height = DisplayHeight(display_, DefaultScreen(display_));
295 VLOG(1) << "CreateFrameBuffer: new=" << size.width() << "x" << size.height() 295 VLOG(1) << "CreateFrameBuffer: new=" << size.width() << "x" << size.height()
296 << " current=" << current_width << "x" << current_height; 296 << " current=" << current_width << "x" << current_height;
297 if (size.width() == current_width && size.height() == current_height) 297 if (size.width() == current_width && size.height() == current_height)
298 return; 298 return;
299 299
300 DestroyUnusedCrtcs(); 300 DestroyUnusedCrtcs(size);
301 int mm_width = size.width() * kPixelsToMmScale; 301 int mm_width = size.width() * kPixelsToMmScale;
302 int mm_height = size.height() * kPixelsToMmScale; 302 int mm_height = size.height() * kPixelsToMmScale;
303 XRRSetScreenSize( 303 XRRSetScreenSize(
304 display_, window_, size.width(), size.height(), mm_width, mm_height); 304 display_, window_, size.width(), size.height(), mm_width, mm_height);
305 // We don't wait for root window resize, therefore this end up with drawing 305 // We don't wait for root window resize, therefore this end up with drawing
306 // in the old window size, which we care during the boot. 306 // in the old window size, which we care during the boot.
307 DrawBackground(); 307 DrawBackground();
308 308
309 // Don't redraw the background upon framebuffer change again. This should 309 // Don't redraw the background upon framebuffer change again. This should
310 // happen only once after boot. 310 // happen only once after boot.
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 XRRChangeOutputProperty( 511 XRRChangeOutputProperty(
512 display_, output_id, name, XA_ATOM, 32, PropModeReplace, data, 1); 512 display_, output_id, name, XA_ATOM, 32, PropModeReplace, data, 1);
513 if (err_tracker.FoundNewError()) { 513 if (err_tracker.FoundNewError()) {
514 LOG(ERROR) << "XRRChangeOutputProperty failed"; 514 LOG(ERROR) << "XRRChangeOutputProperty failed";
515 return false; 515 return false;
516 } else { 516 } else {
517 return true; 517 return true;
518 } 518 }
519 } 519 }
520 520
521 void NativeDisplayDelegateX11::DestroyUnusedCrtcs() { 521 void NativeDisplayDelegateX11::DestroyUnusedCrtcs(const gfx::Size& new_size) {
522 CHECK(screen_) << "Server not grabbed"; 522 CHECK(screen_) << "Server not grabbed";
523 // Setting the screen size will fail if any CRTC doesn't fit afterwards. 523 // Setting the screen size will fail if any CRTC doesn't fit afterwards.
524 // At the same time, turning CRTCs off and back on uses up a lot of time. 524 // At the same time, turning CRTCs off and back on uses up a lot of time.
525 // This function tries to be smart to avoid too many off/on cycles: 525 // This function tries to be smart to avoid too many off/on cycles:
526 // - We disable all the CRTCs we won't need after the FB resize. 526 // - We disable all the CRTCs we won't need after the FB resize.
527 // - We set the new modes on CRTCs, if they fit in both the old and new 527 // - We set the new modes on CRTCs, if they fit in both the old and new
528 // FBs, and park them at (0,0) 528 // FBs, and park them at (0,0)
529 // - We disable the CRTCs we will need but don't fit in the old FB. Those 529 // - We disable the CRTCs we will need but don't fit in the old FB. Those
530 // will be reenabled after the resize. 530 // will be reenabled after the resize.
531 // We don't worry about the cached state of the outputs here since we are 531 // We don't worry about the cached state of the outputs here since we are
(...skipping 12 matching lines...) Expand all
544 DisplaySnapshotX11* x11_output = static_cast<DisplaySnapshotX11*>(*it); 544 DisplaySnapshotX11* x11_output = static_cast<DisplaySnapshotX11*>(*it);
545 if (crtc == x11_output->crtc()) { 545 if (crtc == x11_output->crtc()) {
546 mode_info = x11_output->current_mode(); 546 mode_info = x11_output->current_mode();
547 output = x11_output->output(); 547 output = x11_output->output();
548 break; 548 break;
549 } 549 }
550 } 550 }
551 551
552 if (mode_info) { 552 if (mode_info) {
553 mode = static_cast<const DisplayModeX11*>(mode_info)->mode_id(); 553 mode = static_cast<const DisplayModeX11*>(mode_info)->mode_id();
554 // In case our CRTC doesn't fit in our current framebuffer, disable it. 554 // In case our CRTC doesn't fit in common area of our current and about
555 // to be resized framebuffer, disable it.
555 // It'll get reenabled after we resize the framebuffer. 556 // It'll get reenabled after we resize the framebuffer.
556 int current_width = DisplayWidth(display_, DefaultScreen(display_)); 557 int max_width = std::min(DisplayWidth(display_,
557 int current_height = DisplayHeight(display_, DefaultScreen(display_)); 558 DefaultScreen(display_)), new_size.width());
Daniel Kurtz 2014/04/25 04:35:29 I think this would have been easier to read: int
558 if (mode_info->size().width() > current_width || 559 int max_height = std::min(DisplayHeight(display_,
559 mode_info->size().height() > current_height) { 560 DefaultScreen(display_)), new_size.height());
561 if (mode_info->size().width() > max_width ||
562 mode_info->size().height() > max_height) {
560 mode = None; 563 mode = None;
561 output = None; 564 output = None;
562 mode_info = NULL; 565 mode_info = NULL;
563 } 566 }
564 } 567 }
565 568
566 ConfigureCrtc(crtc, mode, output, 0, 0); 569 ConfigureCrtc(crtc, mode, output, 0, 0);
567 } 570 }
568 } 571 }
569 572
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
671 XSetForeground(display_, gc, color.pixel); 674 XSetForeground(display_, gc, color.pixel);
672 XSetFillStyle(display_, gc, FillSolid); 675 XSetFillStyle(display_, gc, FillSolid);
673 int width = DisplayWidth(display_, DefaultScreen(display_)); 676 int width = DisplayWidth(display_, DefaultScreen(display_));
674 int height = DisplayHeight(display_, DefaultScreen(display_)); 677 int height = DisplayHeight(display_, DefaultScreen(display_));
675 XFillRectangle(display_, window_, gc, 0, 0, width, height); 678 XFillRectangle(display_, window_, gc, 0, 0, width, height);
676 XFreeGC(display_, gc); 679 XFreeGC(display_, gc);
677 XFreeColors(display_, colormap, &color.pixel, 1, 0); 680 XFreeColors(display_, colormap, &color.pixel, 1, 0);
678 } 681 }
679 682
680 } // namespace ui 683 } // namespace ui
OLDNEW
« no previous file with comments | « ui/display/chromeos/x11/native_display_delegate_x11.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698