| Index: ui/ozone/platform/dri/gbm_surface_factory.cc
 | 
| diff --git a/ui/ozone/platform/dri/gbm_surface_factory.cc b/ui/ozone/platform/dri/gbm_surface_factory.cc
 | 
| index 75caa9b7957a9e9ecc4b6600aaabbe0d0ae0f190..fee7126ddc55d3ccce1c6d16250126d83dd30534 100644
 | 
| --- a/ui/ozone/platform/dri/gbm_surface_factory.cc
 | 
| +++ b/ui/ozone/platform/dri/gbm_surface_factory.cc
 | 
| @@ -9,6 +9,8 @@
 | 
|  #include "base/command_line.h"
 | 
|  #include "base/files/file_path.h"
 | 
|  #include "third_party/khronos/EGL/egl.h"
 | 
| +#include "ui/ozone/platform/dri/dri_window_delegate_impl.h"
 | 
| +#include "ui/ozone/platform/dri/dri_window_manager.h"
 | 
|  #include "ui/ozone/platform/dri/gbm_buffer.h"
 | 
|  #include "ui/ozone/platform/dri/gbm_surface.h"
 | 
|  #include "ui/ozone/platform/dri/gbm_surfaceless.h"
 | 
| @@ -64,18 +66,21 @@ class SingleOverlay : public OverlayCandidatesOzone {
 | 
|  }  // namespace
 | 
|  
 | 
|  GbmSurfaceFactory::GbmSurfaceFactory(bool allow_surfaceless)
 | 
| -    : DriSurfaceFactory(NULL, NULL),
 | 
| +    : DriSurfaceFactory(NULL, NULL, NULL),
 | 
|        device_(NULL),
 | 
|        allow_surfaceless_(allow_surfaceless) {
 | 
|  }
 | 
|  
 | 
|  GbmSurfaceFactory::~GbmSurfaceFactory() {}
 | 
|  
 | 
| -void GbmSurfaceFactory::InitializeGpu(
 | 
| -    DriWrapper* dri, gbm_device* device, ScreenManager* screen_manager) {
 | 
| +void GbmSurfaceFactory::InitializeGpu(DriWrapper* dri,
 | 
| +                                      gbm_device* device,
 | 
| +                                      ScreenManager* screen_manager,
 | 
| +                                      DriWindowManager* window_manager) {
 | 
|    drm_ = dri;
 | 
|    device_ = device;
 | 
|    screen_manager_ = screen_manager;
 | 
| +  window_manager_ = window_manager;
 | 
|  }
 | 
|  
 | 
|  intptr_t GbmSurfaceFactory::GetNativeDisplay() {
 | 
| @@ -141,10 +146,12 @@ bool GbmSurfaceFactory::LoadEGLGLES2Bindings(
 | 
|  scoped_ptr<SurfaceOzoneEGL> GbmSurfaceFactory::CreateEGLSurfaceForWidget(
 | 
|      gfx::AcceleratedWidget widget) {
 | 
|    DCHECK(state_ == INITIALIZED);
 | 
| +
 | 
| +  DriWindowDelegate* delegate = GetOrCreateWindowDelegate(widget);
 | 
| +
 | 
|    ResetCursor(widget);
 | 
|  
 | 
| -  scoped_ptr<GbmSurface> surface(new GbmSurface(
 | 
| -      screen_manager_->GetDisplayController(widget), device_, drm_));
 | 
| +  scoped_ptr<GbmSurface> surface(new GbmSurface(delegate, device_, drm_));
 | 
|    if (!surface->Initialize())
 | 
|      return scoped_ptr<SurfaceOzoneEGL>();
 | 
|  
 | 
| @@ -156,8 +163,9 @@ GbmSurfaceFactory::CreateSurfacelessEGLSurfaceForWidget(
 | 
|      gfx::AcceleratedWidget widget) {
 | 
|    if (!allow_surfaceless_)
 | 
|      return scoped_ptr<SurfaceOzoneEGL>();
 | 
| -  return scoped_ptr<SurfaceOzoneEGL>(
 | 
| -      new GbmSurfaceless(screen_manager_->GetDisplayController(widget)));
 | 
| +
 | 
| +  DriWindowDelegate* delegate = GetOrCreateWindowDelegate(widget);
 | 
| +  return scoped_ptr<SurfaceOzoneEGL>(new GbmSurfaceless(delegate));
 | 
|  }
 | 
|  
 | 
|  scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmap(
 | 
| @@ -191,10 +199,11 @@ bool GbmSurfaceFactory::ScheduleOverlayPlane(
 | 
|      LOG(ERROR) << "ScheduleOverlayPlane passed NULL buffer.";
 | 
|      return false;
 | 
|    }
 | 
| -  base::WeakPtr<HardwareDisplayController> hdc =
 | 
| -      screen_manager_->GetDisplayController(widget);
 | 
| +  HardwareDisplayController* hdc =
 | 
| +      window_manager_->GetWindowDelegate(widget)->GetController();
 | 
|    if (!hdc)
 | 
|      return true;
 | 
| +
 | 
|    hdc->QueueOverlayPlane(OverlayPlane(pixmap->buffer(),
 | 
|                                        plane_z_order,
 | 
|                                        plane_transform,
 | 
| @@ -207,4 +216,16 @@ bool GbmSurfaceFactory::CanShowPrimaryPlaneAsOverlay() {
 | 
|    return allow_surfaceless_;
 | 
|  }
 | 
|  
 | 
| +DriWindowDelegate* GbmSurfaceFactory::GetOrCreateWindowDelegate(
 | 
| +    gfx::AcceleratedWidget widget) {
 | 
| +  if (!window_manager_->HasWindowDelegate(widget)) {
 | 
| +    scoped_ptr<DriWindowDelegate> delegate(
 | 
| +        new DriWindowDelegateImpl(widget, screen_manager_));
 | 
| +    delegate->Initialize();
 | 
| +    window_manager_->AddWindowDelegate(widget, delegate.Pass());
 | 
| +  }
 | 
| +
 | 
| +  return window_manager_->GetWindowDelegate(widget);
 | 
| +}
 | 
| +
 | 
|  }  // namespace ui
 | 
| 
 |