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
3 // found in the LICENSE file.
4 
5 #include "ui/ozone/platform/cast/surface_factory_cast.h"
6 
7 #include <memory>
8 #include <utility>
9 
10 #include "base/macros.h"
11 #include "base/memory/ptr_util.h"
12 #include "chromecast/public/cast_egl_platform.h"
13 #include "third_party/skia/include/core/SkSurface.h"
14 #include "ui/gfx/geometry/rect.h"
15 #include "ui/gfx/native_pixmap.h"
16 #include "ui/gfx/vsync_provider.h"
17 #include "ui/ozone/public/surface_ozone_canvas.h"
18 
19 namespace ui {
20 
21 namespace {
22 
23 class DummySurface : public SurfaceOzoneCanvas {
24  public:
DummySurface()25   DummySurface() {}
~DummySurface()26   ~DummySurface() override {}
27 
28   // SurfaceOzoneCanvas implementation:
GetCanvas()29   SkCanvas* GetCanvas() override { return surface_->getCanvas(); }
30 
ResizeCanvas(const gfx::Size & viewport_size)31   void ResizeCanvas(const gfx::Size& viewport_size) override {
32     surface_ =
33         SkSurface::MakeNull(viewport_size.width(), viewport_size.height());
34   }
35 
PresentCanvas(const gfx::Rect & damage)36   void PresentCanvas(const gfx::Rect& damage) override {}
37 
CreateVSyncProvider()38   std::unique_ptr<gfx::VSyncProvider> CreateVSyncProvider() override {
39     return nullptr;
40   }
41 
42  private:
43   sk_sp<SkSurface> surface_;
44 
45   DISALLOW_COPY_AND_ASSIGN(DummySurface);
46 };
47 
48 class CastPixmap : public gfx::NativePixmap {
49  public:
CastPixmap()50   CastPixmap() {}
51 
AreDmaBufFdsValid() const52   bool AreDmaBufFdsValid() const override { return false; }
GetDmaBufFd(size_t plane) const53   int GetDmaBufFd(size_t plane) const override { return -1; }
GetDmaBufPitch(size_t plane) const54   uint32_t GetDmaBufPitch(size_t plane) const override { return 0; }
GetDmaBufOffset(size_t plane) const55   size_t GetDmaBufOffset(size_t plane) const override { return 0; }
GetDmaBufPlaneSize(size_t plane) const56   size_t GetDmaBufPlaneSize(size_t plane) const override { return 0; }
GetBufferFormatModifier() const57   uint64_t GetBufferFormatModifier() const override { return 0; }
GetBufferFormat() const58   gfx::BufferFormat GetBufferFormat() const override {
59     return gfx::BufferFormat::BGRA_8888;
60   }
GetNumberOfPlanes() const61   size_t GetNumberOfPlanes() const override { return 1; }
GetBufferSize() const62   gfx::Size GetBufferSize() const override { return gfx::Size(); }
GetUniqueId() const63   uint32_t GetUniqueId() const override { return 0; }
64 
ScheduleOverlayPlane(gfx::AcceleratedWidget widget,int plane_z_order,gfx::OverlayTransform plane_transform,const gfx::Rect & display_bounds,const gfx::RectF & crop_rect,bool enable_blend,std::vector<gfx::GpuFence> acquire_fences,std::vector<gfx::GpuFence> release_fences)65   bool ScheduleOverlayPlane(
66       gfx::AcceleratedWidget widget,
67       int plane_z_order,
68       gfx::OverlayTransform plane_transform,
69       const gfx::Rect& display_bounds,
70       const gfx::RectF& crop_rect,
71       bool enable_blend,
72       std::vector<gfx::GpuFence> acquire_fences,
73       std::vector<gfx::GpuFence> release_fences) override {
74     return false;
75   }
ExportHandle()76   gfx::NativePixmapHandle ExportHandle() override {
77     return gfx::NativePixmapHandle();
78   }
79 
80  private:
~CastPixmap()81   ~CastPixmap() override {}
82 
83   DISALLOW_COPY_AND_ASSIGN(CastPixmap);
84 };
85 
86 }  // namespace
87 
SurfaceFactoryCast()88 SurfaceFactoryCast::SurfaceFactoryCast() : SurfaceFactoryCast(nullptr) {}
89 
SurfaceFactoryCast(std::unique_ptr<chromecast::CastEglPlatform> egl_platform)90 SurfaceFactoryCast::SurfaceFactoryCast(
91     std::unique_ptr<chromecast::CastEglPlatform> egl_platform) {
92   if (egl_platform) {
93     egl_implementation_ =
94         std::make_unique<GLOzoneEglCast>(std::move(egl_platform));
95   }
96 }
97 
~SurfaceFactoryCast()98 SurfaceFactoryCast::~SurfaceFactoryCast() {}
99 
100 std::vector<gl::GLImplementation>
GetAllowedGLImplementations()101 SurfaceFactoryCast::GetAllowedGLImplementations() {
102   std::vector<gl::GLImplementation> impls;
103   if (egl_implementation_)
104     impls.push_back(gl::kGLImplementationEGLGLES2);
105   return impls;
106 }
107 
GetGLOzone(gl::GLImplementation implementation)108 GLOzone* SurfaceFactoryCast::GetGLOzone(gl::GLImplementation implementation) {
109   switch (implementation) {
110     case gl::kGLImplementationEGLGLES2:
111       return egl_implementation_.get();
112     default:
113       return nullptr;
114   }
115 }
116 
CreateCanvasForWidget(gfx::AcceleratedWidget widget)117 std::unique_ptr<SurfaceOzoneCanvas> SurfaceFactoryCast::CreateCanvasForWidget(
118     gfx::AcceleratedWidget widget) {
119   // Software canvas support only in headless mode
120   if (egl_implementation_)
121     return nullptr;
122   return base::WrapUnique<SurfaceOzoneCanvas>(new DummySurface());
123 }
124 
CreateNativePixmap(gfx::AcceleratedWidget widget,VkDevice vk_device,gfx::Size size,gfx::BufferFormat format,gfx::BufferUsage usage,base::Optional<gfx::Size> framebuffer_size)125 scoped_refptr<gfx::NativePixmap> SurfaceFactoryCast::CreateNativePixmap(
126     gfx::AcceleratedWidget widget,
127     VkDevice vk_device,
128     gfx::Size size,
129     gfx::BufferFormat format,
130     gfx::BufferUsage usage,
131     base::Optional<gfx::Size> framebuffer_size) {
132   DCHECK(!framebuffer_size || framebuffer_size == size);
133   return base::MakeRefCounted<CastPixmap>();
134 }
135 
136 }  // namespace ui
137