Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / ui / ozone / platform / dri / chromeos / native_display_delegate_dri.cc
index 66a5cf3..58b5fb2 100644 (file)
@@ -5,11 +5,13 @@
 #include "ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h"
 
 #include "base/bind.h"
+#include "third_party/skia/include/core/SkCanvas.h"
 #include "ui/display/types/chromeos/native_display_observer.h"
 #include "ui/events/ozone/device/device_event.h"
 #include "ui/events/ozone/device/device_manager.h"
 #include "ui/ozone/platform/dri/chromeos/display_mode_dri.h"
 #include "ui/ozone/platform/dri/chromeos/display_snapshot_dri.h"
+#include "ui/ozone/platform/dri/dri_console_buffer.h"
 #include "ui/ozone/platform/dri/dri_util.h"
 #include "ui/ozone/platform/dri/dri_wrapper.h"
 #include "ui/ozone/platform/dri/screen_manager.h"
@@ -30,11 +32,52 @@ NativeDisplayDelegateDri::NativeDisplayDelegateDri(
 }
 
 NativeDisplayDelegateDri::~NativeDisplayDelegateDri() {
-  device_manager_->RemoveObserver(this);
+  if (device_manager_)
+    device_manager_->RemoveObserver(this);
+}
+
+DisplaySnapshot* NativeDisplayDelegateDri::FindDisplaySnapshot(int64_t id) {
+  for (size_t i = 0; i < cached_displays_.size(); ++i)
+    if (cached_displays_[i]->display_id() == id)
+      return cached_displays_[i];
+
+  return NULL;
+}
+
+const DisplayMode* NativeDisplayDelegateDri::FindDisplayMode(
+    const gfx::Size& size,
+    bool is_interlaced,
+    float refresh_rate) {
+  for (size_t i = 0; i < cached_modes_.size(); ++i)
+    if (cached_modes_[i]->size() == size &&
+        cached_modes_[i]->is_interlaced() == is_interlaced &&
+        cached_modes_[i]->refresh_rate() == refresh_rate)
+      return cached_modes_[i];
+
+  return NULL;
 }
 
 void NativeDisplayDelegateDri::Initialize() {
-  device_manager_->AddObserver(this);
+  if (device_manager_)
+    device_manager_->AddObserver(this);
+
+  ScopedVector<HardwareDisplayControllerInfo> displays =
+      GetAvailableDisplayControllerInfos(dri_->get_fd());
+
+  // By default all displays show the same console buffer.
+  console_buffer_.reset(
+      new DriConsoleBuffer(dri_, displays[0]->crtc()->buffer_id));
+  if (!console_buffer_->Initialize()) {
+    VLOG(1) << "Failed to initialize console buffer";
+    console_buffer_.reset();
+  } else {
+    // Clear the console buffer such that restarting Chrome will show a
+    // predetermined background.
+    //
+    // Black was chosen since Chrome's first buffer paints start with a black
+    // background.
+    console_buffer_->canvas()->clear(SK_ColorBLACK);
+  }
 }
 
 void NativeDisplayDelegateDri::GrabServer() {}
@@ -44,7 +87,8 @@ void NativeDisplayDelegateDri::UngrabServer() {}
 void NativeDisplayDelegateDri::SyncWithServer() {}
 
 void NativeDisplayDelegateDri::SetBackgroundColor(uint32_t color_argb) {
-  NOTIMPLEMENTED();
+  if (console_buffer_)
+    console_buffer_->canvas()->clear(color_argb);
 }
 
 void NativeDisplayDelegateDri::ForceDPMSOn() {
@@ -61,24 +105,18 @@ std::vector<DisplaySnapshot*> NativeDisplayDelegateDri::GetDisplays() {
   ScopedVector<DisplaySnapshotDri> old_displays(cached_displays_.Pass());
   cached_modes_.clear();
 
-  drmModeRes* resources = drmModeGetResources(dri_->get_fd());
-  DCHECK(resources) << "Failed to get DRM resources";
   ScopedVector<HardwareDisplayControllerInfo> displays =
-      GetAvailableDisplayControllerInfos(dri_->get_fd(), resources);
+      GetAvailableDisplayControllerInfos(dri_->get_fd());
   for (size_t i = 0;
        i < displays.size() && cached_displays_.size() < kMaxDisplayCount; ++i) {
     DisplaySnapshotDri* display = new DisplaySnapshotDri(
         dri_, displays[i]->connector(), displays[i]->crtc(), i);
     cached_displays_.push_back(display);
-    // Modes can be shared between different displays, so we need to keep track
-    // of them independently for cleanup.
     cached_modes_.insert(cached_modes_.end(),
                          display->modes().begin(),
                          display->modes().end());
   }
 
-  drmModeFreeResources(resources);
-
   NotifyScreenManager(cached_displays_.get(), old_displays.get());
 
   std::vector<DisplaySnapshot*> generic_displays(cached_displays_.begin(),
@@ -104,14 +142,14 @@ bool NativeDisplayDelegateDri::Configure(const DisplaySnapshot& output,
     if (!screen_manager_->ConfigureDisplayController(
             dri_output.crtc(),
             dri_output.connector(),
+            origin,
             static_cast<const DisplayModeDri*>(mode)->mode_info())) {
       VLOG(1) << "Failed to configure: crtc=" << dri_output.crtc()
               << " connector=" << dri_output.connector();
       return false;
     }
   } else {
-    if (!screen_manager_->DisableDisplayController(dri_output.crtc(),
-                                                   dri_output.connector())) {
+    if (!screen_manager_->DisableDisplayController(dri_output.crtc())) {
       VLOG(1) << "Failed to disable crtc=" << dri_output.crtc();
       return false;
     }
@@ -181,8 +219,7 @@ void NativeDisplayDelegateDri::NotifyScreenManager(
     }
 
     if (!found)
-      screen_manager_->RemoveDisplayController(old_displays[i]->crtc(),
-                                               old_displays[i]->connector());
+      screen_manager_->RemoveDisplayController(old_displays[i]->crtc());
   }
 }