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 3// found in the LICENSE file. 4 5#include "ui/ozone/platform/dri/gpu_platform_support_gbm.h" 6 7#include "ipc/ipc_message_macros.h" 8#include "ui/ozone/common/gpu/ozone_gpu_messages.h" 9#include "ui/ozone/platform/dri/dri_surface_factory.h" 10#include "ui/ozone/platform/dri/dri_window_delegate_impl.h" 11#include "ui/ozone/platform/dri/dri_window_delegate_manager.h" 12 13namespace ui { 14 15GpuPlatformSupportGbm::GpuPlatformSupportGbm( 16 DriSurfaceFactory* dri, 17 DriWindowDelegateManager* window_manager, 18 ScreenManager* screen_manager) 19 : sender_(NULL), 20 dri_(dri), 21 window_manager_(window_manager), 22 screen_manager_(screen_manager) { 23} 24 25GpuPlatformSupportGbm::~GpuPlatformSupportGbm() {} 26 27void GpuPlatformSupportGbm::AddHandler(scoped_ptr<GpuPlatformSupport> handler) { 28 handlers_.push_back(handler.release()); 29} 30 31void GpuPlatformSupportGbm::OnChannelEstablished(IPC::Sender* sender) { 32 sender_ = sender; 33 34 for (size_t i = 0; i < handlers_.size(); ++i) 35 handlers_[i]->OnChannelEstablished(sender); 36} 37 38bool GpuPlatformSupportGbm::OnMessageReceived(const IPC::Message& message) { 39 bool handled = true; 40 41 IPC_BEGIN_MESSAGE_MAP(GpuPlatformSupportGbm, message) 42 IPC_MESSAGE_HANDLER(OzoneGpuMsg_CreateWindowDelegate, OnCreateWindowDelegate) 43 IPC_MESSAGE_HANDLER(OzoneGpuMsg_DestroyWindowDelegate, 44 OnDestroyWindowDelegate) 45 IPC_MESSAGE_HANDLER(OzoneGpuMsg_WindowBoundsChanged, OnWindowBoundsChanged) 46 47 IPC_MESSAGE_HANDLER(OzoneGpuMsg_CursorSet, OnCursorSet) 48 IPC_MESSAGE_HANDLER(OzoneGpuMsg_CursorMove, OnCursorMove) 49 IPC_MESSAGE_UNHANDLED(handled = false); 50 IPC_END_MESSAGE_MAP() 51 52 if (!handled) 53 for (size_t i = 0; i < handlers_.size(); ++i) 54 if (handlers_[i]->OnMessageReceived(message)) 55 return true; 56 57 return false; 58} 59 60void GpuPlatformSupportGbm::OnCreateWindowDelegate( 61 gfx::AcceleratedWidget widget) { 62 // Due to how the GPU process starts up this IPC call may happen after the IPC 63 // to create a surface. Since a surface wants to know the window associated 64 // with it, we create it ahead of time. So when this call happens we do not 65 // create a delegate if it already exists. 66 if (!window_manager_->HasWindowDelegate(widget)) { 67 scoped_ptr<DriWindowDelegate> delegate( 68 new DriWindowDelegateImpl(widget, screen_manager_)); 69 delegate->Initialize(); 70 window_manager_->AddWindowDelegate(widget, delegate.Pass()); 71 } 72} 73 74void GpuPlatformSupportGbm::OnDestroyWindowDelegate( 75 gfx::AcceleratedWidget widget) { 76 scoped_ptr<DriWindowDelegate> delegate = 77 window_manager_->RemoveWindowDelegate(widget); 78 delegate->Shutdown(); 79} 80 81void GpuPlatformSupportGbm::OnWindowBoundsChanged(gfx::AcceleratedWidget widget, 82 const gfx::Rect& bounds) { 83 window_manager_->GetWindowDelegate(widget)->OnBoundsChanged(bounds); 84} 85 86void GpuPlatformSupportGbm::OnCursorSet(gfx::AcceleratedWidget widget, 87 const std::vector<SkBitmap>& bitmaps, 88 const gfx::Point& location, 89 int frame_delay_ms) { 90 dri_->SetHardwareCursor(widget, bitmaps, location, frame_delay_ms); 91} 92 93void GpuPlatformSupportGbm::OnCursorMove(gfx::AcceleratedWidget widget, 94 const gfx::Point& location) { 95 dri_->MoveHardwareCursor(widget, location); 96} 97 98} // namespace ui 99