| OLD | NEW | 
|    1 // Copyright 2015 The Chromium Authors. All rights reserved. |    1 // Copyright 2015 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/cast/surface_factory_cast.h" |    5 #include "ui/ozone/platform/cast/surface_factory_cast.h" | 
|    6  |    6  | 
|    7 #include <dlfcn.h> |    7 #include <dlfcn.h> | 
|    8 #include <EGL/egl.h> |    8 #include <EGL/egl.h> | 
|    9  |    9  | 
|   10 #include "base/callback_helpers.h" |   10 #include "base/callback_helpers.h" | 
|   11 #include "chromecast/public/cast_egl_platform.h" |   11 #include "chromecast/public/cast_egl_platform.h" | 
|   12 #include "chromecast/public/graphics_types.h" |   12 #include "chromecast/public/graphics_types.h" | 
 |   13 #include "third_party/skia/include/core/SkSurface.h" | 
|   13 #include "ui/gfx/geometry/quad_f.h" |   14 #include "ui/gfx/geometry/quad_f.h" | 
 |   15 #include "ui/gfx/vsync_provider.h" | 
|   14 #include "ui/ozone/platform/cast/surface_ozone_egl_cast.h" |   16 #include "ui/ozone/platform/cast/surface_ozone_egl_cast.h" | 
|   15 #include "ui/ozone/public/native_pixmap.h" |   17 #include "ui/ozone/public/native_pixmap.h" | 
 |   18 #include "ui/ozone/public/surface_ozone_canvas.h" | 
|   16  |   19  | 
|   17 using chromecast::CastEglPlatform; |   20 using chromecast::CastEglPlatform; | 
|   18  |   21  | 
|   19 namespace ui { |   22 namespace ui { | 
|   20  |   23  | 
|   21 namespace { |   24 namespace { | 
|   22  |   25  | 
|   23 typedef EGLDisplay (*EGLGetDisplayFn)(NativeDisplayType); |   26 typedef EGLDisplay (*EGLGetDisplayFn)(NativeDisplayType); | 
|   24 typedef EGLBoolean (*EGLTerminateFn)(EGLDisplay); |   27 typedef EGLBoolean (*EGLTerminateFn)(EGLDisplay); | 
|   25  |   28  | 
|   26 chromecast::Size FromGfxSize(const gfx::Size& size) { |   29 chromecast::Size FromGfxSize(const gfx::Size& size) { | 
|   27   return chromecast::Size(size.width(), size.height()); |   30   return chromecast::Size(size.width(), size.height()); | 
|   28 } |   31 } | 
|   29  |   32  | 
|   30 // Initial display size to create, needed before first window is created. |   33 // Initial display size to create, needed before first window is created. | 
|   31 gfx::Size GetInitialDisplaySize() { |   34 gfx::Size GetInitialDisplaySize() { | 
|   32   return gfx::Size(1280, 720); |   35   return gfx::Size(1280, 720); | 
|   33 } |   36 } | 
|   34  |   37  | 
|   35 // Hard lower bound on display resolution |   38 // Hard lower bound on display resolution | 
|   36 gfx::Size GetMinDisplaySize() { |   39 gfx::Size GetMinDisplaySize() { | 
|   37   return gfx::Size(1280, 720); |   40   return gfx::Size(1280, 720); | 
|   38 } |   41 } | 
|   39  |   42  | 
 |   43 class DummySurface : public SurfaceOzoneCanvas { | 
 |   44  public: | 
 |   45   DummySurface() {} | 
 |   46   ~DummySurface() override {} | 
 |   47  | 
 |   48   // SurfaceOzoneCanvas implementation: | 
 |   49   skia::RefPtr<SkSurface> GetSurface() override { return surface_; } | 
 |   50  | 
 |   51   void ResizeCanvas(const gfx::Size& viewport_size) override { | 
 |   52     surface_ = skia::AdoptRef(SkSurface::NewRaster(SkImageInfo::MakeN32Premul( | 
 |   53         viewport_size.width(), viewport_size.height()))); | 
 |   54   } | 
 |   55  | 
 |   56   void PresentCanvas(const gfx::Rect& damage) override {} | 
 |   57  | 
 |   58   scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() override { | 
 |   59     return nullptr; | 
 |   60   } | 
 |   61  | 
 |   62  private: | 
 |   63   skia::RefPtr<SkSurface> surface_; | 
 |   64  | 
 |   65   DISALLOW_COPY_AND_ASSIGN(DummySurface); | 
 |   66 }; | 
 |   67  | 
|   40 }  // namespace |   68 }  // namespace | 
|   41  |   69  | 
 |   70 SurfaceFactoryCast::SurfaceFactoryCast() : SurfaceFactoryCast(nullptr) {} | 
 |   71  | 
|   42 SurfaceFactoryCast::SurfaceFactoryCast(scoped_ptr<CastEglPlatform> egl_platform) |   72 SurfaceFactoryCast::SurfaceFactoryCast(scoped_ptr<CastEglPlatform> egl_platform) | 
|   43     : state_(kUninitialized), |   73     : state_(kUninitialized), | 
|   44       display_type_(0), |   74       display_type_(0), | 
|   45       have_display_type_(false), |   75       have_display_type_(false), | 
|   46       window_(0), |   76       window_(0), | 
|   47       display_size_(GetInitialDisplaySize()), |   77       display_size_(GetInitialDisplaySize()), | 
|   48       new_display_size_(GetInitialDisplaySize()), |   78       new_display_size_(GetInitialDisplaySize()), | 
|   49       egl_platform_(egl_platform.Pass()) { |   79       egl_platform_(egl_platform.Pass()) { | 
|   50 } |   80 } | 
|   51  |   81  | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   90   if (state_ != kInitialized) |  120   if (state_ != kInitialized) | 
|   91     return; |  121     return; | 
|   92  |  122  | 
|   93   DestroyDisplayTypeAndWindow(); |  123   DestroyDisplayTypeAndWindow(); | 
|   94  |  124  | 
|   95   egl_platform_->ShutdownHardware(); |  125   egl_platform_->ShutdownHardware(); | 
|   96  |  126  | 
|   97   state_ = kUninitialized; |  127   state_ = kUninitialized; | 
|   98 } |  128 } | 
|   99  |  129  | 
 |  130 scoped_ptr<SurfaceOzoneCanvas> SurfaceFactoryCast::CreateCanvasForWidget( | 
 |  131     gfx::AcceleratedWidget widget) { | 
 |  132   // Software canvas support only in headless mode | 
 |  133   if (egl_platform_) | 
 |  134     return nullptr; | 
 |  135   return make_scoped_ptr<SurfaceOzoneCanvas>(new DummySurface()); | 
 |  136 } | 
 |  137  | 
|  100 intptr_t SurfaceFactoryCast::GetNativeDisplay() { |  138 intptr_t SurfaceFactoryCast::GetNativeDisplay() { | 
|  101   CreateDisplayTypeAndWindowIfNeeded(); |  139   CreateDisplayTypeAndWindowIfNeeded(); | 
|  102   return reinterpret_cast<intptr_t>(display_type_); |  140   return reinterpret_cast<intptr_t>(display_type_); | 
|  103 } |  141 } | 
|  104  |  142  | 
|  105 void SurfaceFactoryCast::CreateDisplayTypeAndWindowIfNeeded() { |  143 void SurfaceFactoryCast::CreateDisplayTypeAndWindowIfNeeded() { | 
|  106   if (state_ == kUninitialized) { |  144   if (state_ == kUninitialized) { | 
|  107     InitializeHardware(); |  145     InitializeHardware(); | 
|  108   } |  146   } | 
|  109   if (new_display_size_ != display_size_) { |  147   if (new_display_size_ != display_size_) { | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  170   if (egl_platform_->MultipleSurfaceUnsupported()) |  208   if (egl_platform_->MultipleSurfaceUnsupported()) | 
|  171     DestroyWindow(); |  209     DestroyWindow(); | 
|  172 } |  210 } | 
|  173  |  211  | 
|  174 const int32* SurfaceFactoryCast::GetEGLSurfaceProperties( |  212 const int32* SurfaceFactoryCast::GetEGLSurfaceProperties( | 
|  175     const int32* desired_list) { |  213     const int32* desired_list) { | 
|  176   return egl_platform_->GetEGLSurfaceProperties(desired_list); |  214   return egl_platform_->GetEGLSurfaceProperties(desired_list); | 
|  177 } |  215 } | 
|  178  |  216  | 
|  179 scoped_refptr<NativePixmap> SurfaceFactoryCast::CreateNativePixmap( |  217 scoped_refptr<NativePixmap> SurfaceFactoryCast::CreateNativePixmap( | 
|  180     gfx::AcceleratedWidget w, |  218     gfx::AcceleratedWidget widget, | 
|  181     gfx::Size size, |  219     gfx::Size size, | 
|  182     gfx::BufferFormat format, |  220     gfx::BufferFormat format, | 
|  183     gfx::BufferUsage usage) { |  221     gfx::BufferUsage usage) { | 
|  184   class CastPixmap : public NativePixmap { |  222   class CastPixmap : public NativePixmap { | 
|  185    public: |  223    public: | 
|  186     CastPixmap() {} |  224     CastPixmap() {} | 
|  187  |  225  | 
|  188     void* GetEGLClientBuffer() const override { |  226     void* GetEGLClientBuffer() const override { | 
|  189       // TODO(halliwell): try to implement this through CastEglPlatform. |  227       // TODO(halliwell): try to implement this through CastEglPlatform. | 
|  190       return nullptr; |  228       return nullptr; | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  239     return false; |  277     return false; | 
|  240   } |  278   } | 
|  241  |  279  | 
|  242   set_gl_get_proc_address.Run(gl_proc); |  280   set_gl_get_proc_address.Run(gl_proc); | 
|  243   add_gl_library.Run(lib_egl); |  281   add_gl_library.Run(lib_egl); | 
|  244   add_gl_library.Run(lib_gles2); |  282   add_gl_library.Run(lib_gles2); | 
|  245   return true; |  283   return true; | 
|  246 } |  284 } | 
|  247  |  285  | 
|  248 }  // namespace ui |  286 }  // namespace ui | 
| OLD | NEW |