| OLD | NEW |
| 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/ozone/platform/drm/gpu/gbm_surface_factory.h" | 5 #include "ui/ozone/platform/drm/gpu/gbm_surface_factory.h" |
| 6 | 6 |
| 7 #include <gbm.h> | 7 #include <gbm.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "ui/ozone/platform/drm/gpu/screen_manager.h" | 26 #include "ui/ozone/platform/drm/gpu/screen_manager.h" |
| 27 #include "ui/ozone/public/native_pixmap.h" | 27 #include "ui/ozone/public/native_pixmap.h" |
| 28 #include "ui/ozone/public/surface_ozone_canvas.h" | 28 #include "ui/ozone/public/surface_ozone_canvas.h" |
| 29 | 29 |
| 30 namespace ui { | 30 namespace ui { |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| 33 | 33 |
| 34 class GLOzoneEGLGbm : public GLOzoneEGL { | 34 class GLOzoneEGLGbm : public GLOzoneEGL { |
| 35 public: | 35 public: |
| 36 GLOzoneEGLGbm(GbmSurfaceFactory* surface_factory, DrmThreadProxy* drm_thread) | 36 GLOzoneEGLGbm(GbmSurfaceFactory* surface_factory, |
| 37 : surface_factory_(surface_factory), drm_thread_(drm_thread) {} | 37 DrmThreadProxy* drm_thread_proxy) |
| 38 : surface_factory_(surface_factory), |
| 39 drm_thread_proxy_(drm_thread_proxy) {} |
| 38 ~GLOzoneEGLGbm() override {} | 40 ~GLOzoneEGLGbm() override {} |
| 39 | 41 |
| 40 scoped_refptr<gl::GLSurface> CreateViewGLSurface( | 42 scoped_refptr<gl::GLSurface> CreateViewGLSurface( |
| 41 gfx::AcceleratedWidget window) override { | 43 gfx::AcceleratedWidget window) override { |
| 42 return gl::InitializeGLSurface(new GbmSurface( | 44 return gl::InitializeGLSurface(new GbmSurface( |
| 43 surface_factory_, drm_thread_->CreateDrmWindowProxy(window), window)); | 45 surface_factory_, drm_thread_proxy_->CreateDrmWindowProxy(window), |
| 46 window)); |
| 44 } | 47 } |
| 45 | 48 |
| 46 scoped_refptr<gl::GLSurface> CreateSurfacelessViewGLSurface( | 49 scoped_refptr<gl::GLSurface> CreateSurfacelessViewGLSurface( |
| 47 gfx::AcceleratedWidget window) override { | 50 gfx::AcceleratedWidget window) override { |
| 48 return gl::InitializeGLSurface(new GbmSurfaceless( | 51 return gl::InitializeGLSurface(new GbmSurfaceless( |
| 49 surface_factory_, drm_thread_->CreateDrmWindowProxy(window), window)); | 52 surface_factory_, drm_thread_proxy_->CreateDrmWindowProxy(window), |
| 53 window)); |
| 50 } | 54 } |
| 51 | 55 |
| 52 scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface( | 56 scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface( |
| 53 const gfx::Size& size) override { | 57 const gfx::Size& size) override { |
| 54 DCHECK_EQ(size.width(), 0); | 58 DCHECK_EQ(size.width(), 0); |
| 55 DCHECK_EQ(size.height(), 0); | 59 DCHECK_EQ(size.height(), 0); |
| 56 return gl::InitializeGLSurface(new gl::SurfacelessEGL(size)); | 60 return gl::InitializeGLSurface(new gl::SurfacelessEGL(size)); |
| 57 } | 61 } |
| 58 | 62 |
| 59 protected: | 63 protected: |
| 60 intptr_t GetNativeDisplay() override { return EGL_DEFAULT_DISPLAY; } | 64 intptr_t GetNativeDisplay() override { return EGL_DEFAULT_DISPLAY; } |
| 61 | 65 |
| 62 bool LoadGLES2Bindings() override { return LoadDefaultEGLGLES2Bindings(); } | 66 bool LoadGLES2Bindings() override { return LoadDefaultEGLGLES2Bindings(); } |
| 63 | 67 |
| 64 private: | 68 private: |
| 65 GbmSurfaceFactory* surface_factory_; | 69 GbmSurfaceFactory* surface_factory_; |
| 66 DrmThreadProxy* drm_thread_; | 70 DrmThreadProxy* drm_thread_proxy_; |
| 67 | 71 |
| 68 DISALLOW_COPY_AND_ASSIGN(GLOzoneEGLGbm); | 72 DISALLOW_COPY_AND_ASSIGN(GLOzoneEGLGbm); |
| 69 }; | 73 }; |
| 70 | 74 |
| 71 } // namespace | 75 } // namespace |
| 72 | 76 |
| 73 GbmSurfaceFactory::GbmSurfaceFactory(DrmThreadProxy* drm_thread) | 77 GbmSurfaceFactory::GbmSurfaceFactory(DrmThreadProxy* drm_thread_proxy) |
| 74 : egl_implementation_(new GLOzoneEGLGbm(this, drm_thread)), | 78 : egl_implementation_(new GLOzoneEGLGbm(this, drm_thread_proxy)), |
| 75 drm_thread_(drm_thread) {} | 79 drm_thread_proxy_(drm_thread_proxy) {} |
| 76 | 80 |
| 77 GbmSurfaceFactory::~GbmSurfaceFactory() { | 81 GbmSurfaceFactory::~GbmSurfaceFactory() { |
| 78 DCHECK(thread_checker_.CalledOnValidThread()); | 82 DCHECK(thread_checker_.CalledOnValidThread()); |
| 79 } | 83 } |
| 80 | 84 |
| 81 void GbmSurfaceFactory::RegisterSurface(gfx::AcceleratedWidget widget, | 85 void GbmSurfaceFactory::RegisterSurface(gfx::AcceleratedWidget widget, |
| 82 GbmSurfaceless* surface) { | 86 GbmSurfaceless* surface) { |
| 83 DCHECK(thread_checker_.CalledOnValidThread()); | 87 DCHECK(thread_checker_.CalledOnValidThread()); |
| 84 widget_to_surface_map_.insert(std::make_pair(widget, surface)); | 88 widget_to_surface_map_.insert(std::make_pair(widget, surface)); |
| 85 } | 89 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 std::unique_ptr<SurfaceOzoneCanvas> GbmSurfaceFactory::CreateCanvasForWidget( | 123 std::unique_ptr<SurfaceOzoneCanvas> GbmSurfaceFactory::CreateCanvasForWidget( |
| 120 gfx::AcceleratedWidget widget) { | 124 gfx::AcceleratedWidget widget) { |
| 121 DCHECK(thread_checker_.CalledOnValidThread()); | 125 DCHECK(thread_checker_.CalledOnValidThread()); |
| 122 LOG(ERROR) << "Software rendering mode is not supported with GBM platform"; | 126 LOG(ERROR) << "Software rendering mode is not supported with GBM platform"; |
| 123 return nullptr; | 127 return nullptr; |
| 124 } | 128 } |
| 125 | 129 |
| 126 std::vector<gfx::BufferFormat> GbmSurfaceFactory::GetScanoutFormats( | 130 std::vector<gfx::BufferFormat> GbmSurfaceFactory::GetScanoutFormats( |
| 127 gfx::AcceleratedWidget widget) { | 131 gfx::AcceleratedWidget widget) { |
| 128 std::vector<gfx::BufferFormat> scanout_formats; | 132 std::vector<gfx::BufferFormat> scanout_formats; |
| 129 drm_thread_->GetScanoutFormats(widget, &scanout_formats); | 133 drm_thread_proxy_->GetScanoutFormats(widget, &scanout_formats); |
| 130 return scanout_formats; | 134 return scanout_formats; |
| 131 } | 135 } |
| 132 | 136 |
| 133 scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmap( | 137 scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmap( |
| 134 gfx::AcceleratedWidget widget, | 138 gfx::AcceleratedWidget widget, |
| 135 gfx::Size size, | 139 gfx::Size size, |
| 136 gfx::BufferFormat format, | 140 gfx::BufferFormat format, |
| 137 gfx::BufferUsage usage) { | 141 gfx::BufferUsage usage) { |
| 138 #if !defined(OS_CHROMEOS) | 142 #if !defined(OS_CHROMEOS) |
| 139 // Support for memory mapping accelerated buffers requires some | 143 // Support for memory mapping accelerated buffers requires some |
| 140 // CrOS-specific patches (using dma-buf mmap API). | 144 // CrOS-specific patches (using dma-buf mmap API). |
| 141 DCHECK(gfx::BufferUsage::SCANOUT == usage); | 145 DCHECK(gfx::BufferUsage::SCANOUT == usage); |
| 142 #endif | 146 #endif |
| 143 | 147 |
| 144 scoped_refptr<GbmBuffer> buffer = | 148 scoped_refptr<GbmBuffer> buffer = |
| 145 drm_thread_->CreateBuffer(widget, size, format, usage); | 149 drm_thread_proxy_->CreateBuffer(widget, size, format, usage); |
| 146 if (!buffer.get()) | 150 if (!buffer.get()) |
| 147 return nullptr; | 151 return nullptr; |
| 148 | 152 |
| 149 return make_scoped_refptr(new GbmPixmap(this, buffer)); | 153 return make_scoped_refptr(new GbmPixmap(this, buffer)); |
| 150 } | 154 } |
| 151 | 155 |
| 152 scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmapFromHandle( | 156 scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmapFromHandle( |
| 153 gfx::AcceleratedWidget widget, | 157 gfx::AcceleratedWidget widget, |
| 154 gfx::Size size, | 158 gfx::Size size, |
| 155 gfx::BufferFormat format, | 159 gfx::BufferFormat format, |
| 156 const gfx::NativePixmapHandle& handle) { | 160 const gfx::NativePixmapHandle& handle) { |
| 157 size_t num_planes = gfx::NumberOfPlanesForBufferFormat(format); | 161 size_t num_planes = gfx::NumberOfPlanesForBufferFormat(format); |
| 158 if (handle.planes.size() != num_planes || | 162 if (handle.planes.size() != num_planes || |
| 159 (handle.fds.size() != 1 && handle.fds.size() != num_planes)) { | 163 (handle.fds.size() != 1 && handle.fds.size() != num_planes)) { |
| 160 return nullptr; | 164 return nullptr; |
| 161 } | 165 } |
| 162 std::vector<base::ScopedFD> scoped_fds; | 166 std::vector<base::ScopedFD> scoped_fds; |
| 163 for (auto& fd : handle.fds) { | 167 for (auto& fd : handle.fds) { |
| 164 scoped_fds.emplace_back(fd.fd); | 168 scoped_fds.emplace_back(fd.fd); |
| 165 } | 169 } |
| 166 | 170 |
| 167 std::vector<gfx::NativePixmapPlane> planes; | 171 std::vector<gfx::NativePixmapPlane> planes; |
| 168 | 172 |
| 169 for (const auto& plane : handle.planes) { | 173 for (const auto& plane : handle.planes) { |
| 170 planes.push_back(plane); | 174 planes.push_back(plane); |
| 171 } | 175 } |
| 172 | 176 |
| 173 scoped_refptr<GbmBuffer> buffer = drm_thread_->CreateBufferFromFds( | 177 scoped_refptr<GbmBuffer> buffer = drm_thread_proxy_->CreateBufferFromFds( |
| 174 widget, size, format, std::move(scoped_fds), planes); | 178 widget, size, format, std::move(scoped_fds), planes); |
| 175 if (!buffer) | 179 if (!buffer) |
| 176 return nullptr; | 180 return nullptr; |
| 177 return make_scoped_refptr(new GbmPixmap(this, buffer)); | 181 return make_scoped_refptr(new GbmPixmap(this, buffer)); |
| 178 } | 182 } |
| 179 | 183 |
| 180 } // namespace ui | 184 } // namespace ui |
| OLD | NEW |