| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/ozone/platform/wayland/wayland_surface_factory.h" | 5 #include "ui/ozone/platform/wayland/wayland_surface_factory.h" |
| 6 | 6 |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <sys/mman.h> | 8 #include <sys/mman.h> |
| 9 #include <wayland-client.h> | 9 #include <wayland-client.h> |
| 10 | 10 |
| 11 #include "base/memory/ptr_util.h" |
| 11 #include "base/memory/shared_memory.h" | 12 #include "base/memory/shared_memory.h" |
| 12 #include "third_party/skia/include/core/SkSurface.h" | 13 #include "third_party/skia/include/core/SkSurface.h" |
| 13 #include "ui/gfx/vsync_provider.h" | 14 #include "ui/gfx/vsync_provider.h" |
| 14 #include "ui/ozone/common/egl_util.h" | 15 #include "ui/ozone/common/egl_util.h" |
| 15 #include "ui/ozone/platform/wayland/wayland_display.h" | 16 #include "ui/ozone/platform/wayland/wayland_display.h" |
| 16 #include "ui/ozone/platform/wayland/wayland_object.h" | 17 #include "ui/ozone/platform/wayland/wayland_object.h" |
| 17 #include "ui/ozone/platform/wayland/wayland_window.h" | 18 #include "ui/ozone/platform/wayland/wayland_window.h" |
| 18 #include "ui/ozone/public/surface_ozone_canvas.h" | 19 #include "ui/ozone/public/surface_ozone_canvas.h" |
| 19 #include "ui/ozone/public/surface_ozone_egl.h" | 20 #include "ui/ozone/public/surface_ozone_egl.h" |
| 20 | 21 |
| 21 #if defined(USE_WAYLAND_EGL) | 22 #if defined(USE_WAYLAND_EGL) |
| 22 #include "ui/ozone/platform/wayland/wayland_egl_surface.h" | 23 #include "ui/ozone/platform/wayland/wayland_egl_surface.h" |
| 23 #endif | 24 #endif |
| 24 | 25 |
| 25 namespace ui { | 26 namespace ui { |
| 26 | 27 |
| 27 static void DeleteSharedMemory(void* pixels, void* context) { | 28 static void DeleteSharedMemory(void* pixels, void* context) { |
| 28 delete static_cast<base::SharedMemory*>(context); | 29 delete static_cast<base::SharedMemory*>(context); |
| 29 } | 30 } |
| 30 | 31 |
| 31 class WaylandCanvasSurface : public SurfaceOzoneCanvas { | 32 class WaylandCanvasSurface : public SurfaceOzoneCanvas { |
| 32 public: | 33 public: |
| 33 WaylandCanvasSurface(WaylandDisplay* display, WaylandWindow* window_); | 34 WaylandCanvasSurface(WaylandDisplay* display, WaylandWindow* window_); |
| 34 ~WaylandCanvasSurface() override; | 35 ~WaylandCanvasSurface() override; |
| 35 | 36 |
| 36 // SurfaceOzoneCanvas | 37 // SurfaceOzoneCanvas |
| 37 skia::RefPtr<SkSurface> GetSurface() override; | 38 skia::RefPtr<SkSurface> GetSurface() override; |
| 38 void ResizeCanvas(const gfx::Size& viewport_size) override; | 39 void ResizeCanvas(const gfx::Size& viewport_size) override; |
| 39 void PresentCanvas(const gfx::Rect& damage) override; | 40 void PresentCanvas(const gfx::Rect& damage) override; |
| 40 scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() override; | 41 std::unique_ptr<gfx::VSyncProvider> CreateVSyncProvider() override; |
| 41 | 42 |
| 42 private: | 43 private: |
| 43 WaylandDisplay* display_; | 44 WaylandDisplay* display_; |
| 44 WaylandWindow* window_; | 45 WaylandWindow* window_; |
| 45 | 46 |
| 46 gfx::Size size_; | 47 gfx::Size size_; |
| 47 skia::RefPtr<SkSurface> sk_surface_; | 48 skia::RefPtr<SkSurface> sk_surface_; |
| 48 wl::Object<wl_shm_pool> pool_; | 49 wl::Object<wl_shm_pool> pool_; |
| 49 wl::Object<wl_buffer> buffer_; | 50 wl::Object<wl_buffer> buffer_; |
| 50 | 51 |
| 51 DISALLOW_COPY_AND_ASSIGN(WaylandCanvasSurface); | 52 DISALLOW_COPY_AND_ASSIGN(WaylandCanvasSurface); |
| 52 }; | 53 }; |
| 53 | 54 |
| 54 WaylandCanvasSurface::WaylandCanvasSurface(WaylandDisplay* display, | 55 WaylandCanvasSurface::WaylandCanvasSurface(WaylandDisplay* display, |
| 55 WaylandWindow* window) | 56 WaylandWindow* window) |
| 56 : display_(display), window_(window), size_(window->GetBounds().size()) {} | 57 : display_(display), window_(window), size_(window->GetBounds().size()) {} |
| 57 | 58 |
| 58 WaylandCanvasSurface::~WaylandCanvasSurface() {} | 59 WaylandCanvasSurface::~WaylandCanvasSurface() {} |
| 59 | 60 |
| 60 skia::RefPtr<SkSurface> WaylandCanvasSurface::GetSurface() { | 61 skia::RefPtr<SkSurface> WaylandCanvasSurface::GetSurface() { |
| 61 if (sk_surface_) | 62 if (sk_surface_) |
| 62 return sk_surface_; | 63 return sk_surface_; |
| 63 | 64 |
| 64 size_t length = size_.width() * size_.height() * 4; | 65 size_t length = size_.width() * size_.height() * 4; |
| 65 auto shared_memory = make_scoped_ptr(new base::SharedMemory); | 66 auto shared_memory = base::WrapUnique(new base::SharedMemory); |
| 66 if (!shared_memory->CreateAndMapAnonymous(length)) | 67 if (!shared_memory->CreateAndMapAnonymous(length)) |
| 67 return nullptr; | 68 return nullptr; |
| 68 | 69 |
| 69 wl::Object<wl_shm_pool> pool( | 70 wl::Object<wl_shm_pool> pool( |
| 70 wl_shm_create_pool(display_->shm(), shared_memory->handle().fd, length)); | 71 wl_shm_create_pool(display_->shm(), shared_memory->handle().fd, length)); |
| 71 if (!pool) | 72 if (!pool) |
| 72 return nullptr; | 73 return nullptr; |
| 73 wl::Object<wl_buffer> buffer( | 74 wl::Object<wl_buffer> buffer( |
| 74 wl_shm_pool_create_buffer(pool.get(), 0, size_.width(), size_.height(), | 75 wl_shm_pool_create_buffer(pool.get(), 0, size_.width(), size_.height(), |
| 75 size_.width() * 4, WL_SHM_FORMAT_ARGB8888)); | 76 size_.width() * 4, WL_SHM_FORMAT_ARGB8888)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 // compositor. Instead, we should track buffer releases and frame callbacks | 110 // compositor. Instead, we should track buffer releases and frame callbacks |
| 110 // from Wayland to ensure perfect frames (while minimizing copies). | 111 // from Wayland to ensure perfect frames (while minimizing copies). |
| 111 wl_surface* surface = window_->surface(); | 112 wl_surface* surface = window_->surface(); |
| 112 wl_surface_damage(surface, damage.x(), damage.y(), damage.width(), | 113 wl_surface_damage(surface, damage.x(), damage.y(), damage.width(), |
| 113 damage.height()); | 114 damage.height()); |
| 114 wl_surface_attach(surface, buffer_.get(), 0, 0); | 115 wl_surface_attach(surface, buffer_.get(), 0, 0); |
| 115 wl_surface_commit(surface); | 116 wl_surface_commit(surface); |
| 116 display_->ScheduleFlush(); | 117 display_->ScheduleFlush(); |
| 117 } | 118 } |
| 118 | 119 |
| 119 scoped_ptr<gfx::VSyncProvider> WaylandCanvasSurface::CreateVSyncProvider() { | 120 std::unique_ptr<gfx::VSyncProvider> |
| 121 WaylandCanvasSurface::CreateVSyncProvider() { |
| 120 // TODO(forney): This can be implemented with information from frame | 122 // TODO(forney): This can be implemented with information from frame |
| 121 // callbacks, and possibly output refresh rate. | 123 // callbacks, and possibly output refresh rate. |
| 122 NOTIMPLEMENTED(); | 124 NOTIMPLEMENTED(); |
| 123 return nullptr; | 125 return nullptr; |
| 124 } | 126 } |
| 125 | 127 |
| 126 WaylandSurfaceFactory::WaylandSurfaceFactory(WaylandDisplay* display) | 128 WaylandSurfaceFactory::WaylandSurfaceFactory(WaylandDisplay* display) |
| 127 : display_(display) {} | 129 : display_(display) {} |
| 128 | 130 |
| 129 WaylandSurfaceFactory::~WaylandSurfaceFactory() {} | 131 WaylandSurfaceFactory::~WaylandSurfaceFactory() {} |
| 130 | 132 |
| 131 intptr_t WaylandSurfaceFactory::GetNativeDisplay() { | 133 intptr_t WaylandSurfaceFactory::GetNativeDisplay() { |
| 132 return reinterpret_cast<intptr_t>(display_->display()); | 134 return reinterpret_cast<intptr_t>(display_->display()); |
| 133 } | 135 } |
| 134 | 136 |
| 135 bool WaylandSurfaceFactory::LoadEGLGLES2Bindings( | 137 bool WaylandSurfaceFactory::LoadEGLGLES2Bindings( |
| 136 AddGLLibraryCallback add_gl_library, | 138 AddGLLibraryCallback add_gl_library, |
| 137 SetGLGetProcAddressProcCallback set_gl_get_proc_address) { | 139 SetGLGetProcAddressProcCallback set_gl_get_proc_address) { |
| 138 #if defined(USE_WAYLAND_EGL) | 140 #if defined(USE_WAYLAND_EGL) |
| 139 if (!display_) | 141 if (!display_) |
| 140 return false; | 142 return false; |
| 141 setenv("EGL_PLATFORM", "wayland", 0); | 143 setenv("EGL_PLATFORM", "wayland", 0); |
| 142 return LoadDefaultEGLGLES2Bindings(add_gl_library, set_gl_get_proc_address); | 144 return LoadDefaultEGLGLES2Bindings(add_gl_library, set_gl_get_proc_address); |
| 143 #else | 145 #else |
| 144 return false; | 146 return false; |
| 145 #endif | 147 #endif |
| 146 } | 148 } |
| 147 | 149 |
| 148 scoped_ptr<SurfaceOzoneCanvas> WaylandSurfaceFactory::CreateCanvasForWidget( | 150 std::unique_ptr<SurfaceOzoneCanvas> |
| 149 gfx::AcceleratedWidget widget) { | 151 WaylandSurfaceFactory::CreateCanvasForWidget(gfx::AcceleratedWidget widget) { |
| 150 WaylandWindow* window = display_->GetWindow(widget); | 152 WaylandWindow* window = display_->GetWindow(widget); |
| 151 DCHECK(window); | 153 DCHECK(window); |
| 152 return make_scoped_ptr(new WaylandCanvasSurface(display_, window)); | 154 return base::WrapUnique(new WaylandCanvasSurface(display_, window)); |
| 153 } | 155 } |
| 154 | 156 |
| 155 scoped_ptr<SurfaceOzoneEGL> WaylandSurfaceFactory::CreateEGLSurfaceForWidget( | 157 std::unique_ptr<SurfaceOzoneEGL> |
| 158 WaylandSurfaceFactory::CreateEGLSurfaceForWidget( |
| 156 gfx::AcceleratedWidget widget) { | 159 gfx::AcceleratedWidget widget) { |
| 157 #if defined(USE_WAYLAND_EGL) | 160 #if defined(USE_WAYLAND_EGL) |
| 158 WaylandWindow* window = display_->GetWindow(widget); | 161 WaylandWindow* window = display_->GetWindow(widget); |
| 159 DCHECK(window); | 162 DCHECK(window); |
| 160 auto surface = make_scoped_ptr( | 163 auto surface = base::WrapUnique( |
| 161 new WaylandEGLSurface(window, window->GetBounds().size())); | 164 new WaylandEGLSurface(window, window->GetBounds().size())); |
| 162 if (!surface->Initialize()) | 165 if (!surface->Initialize()) |
| 163 return nullptr; | 166 return nullptr; |
| 164 return std::move(surface); | 167 return std::move(surface); |
| 165 #else | 168 #else |
| 166 return nullptr; | 169 return nullptr; |
| 167 #endif | 170 #endif |
| 168 } | 171 } |
| 169 | 172 |
| 170 scoped_refptr<NativePixmap> WaylandSurfaceFactory::CreateNativePixmap( | 173 scoped_refptr<NativePixmap> WaylandSurfaceFactory::CreateNativePixmap( |
| 171 gfx::AcceleratedWidget widget, | 174 gfx::AcceleratedWidget widget, |
| 172 gfx::Size size, | 175 gfx::Size size, |
| 173 gfx::BufferFormat format, | 176 gfx::BufferFormat format, |
| 174 gfx::BufferUsage usage) { | 177 gfx::BufferUsage usage) { |
| 175 NOTIMPLEMENTED(); | 178 NOTIMPLEMENTED(); |
| 176 return nullptr; | 179 return nullptr; |
| 177 } | 180 } |
| 178 | 181 |
| 179 scoped_refptr<NativePixmap> WaylandSurfaceFactory::CreateNativePixmapFromHandle( | 182 scoped_refptr<NativePixmap> WaylandSurfaceFactory::CreateNativePixmapFromHandle( |
| 180 gfx::Size size, | 183 gfx::Size size, |
| 181 gfx::BufferFormat format, | 184 gfx::BufferFormat format, |
| 182 const gfx::NativePixmapHandle& handle) { | 185 const gfx::NativePixmapHandle& handle) { |
| 183 NOTIMPLEMENTED(); | 186 NOTIMPLEMENTED(); |
| 184 return nullptr; | 187 return nullptr; |
| 185 } | 188 } |
| 186 | 189 |
| 187 } // namespace ui | 190 } // namespace ui |
| OLD | NEW |