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