1 // Copyright 2013 The Flutter 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 // 2021.4.30 platform view adapt ohos.
5 // Copyright (c) 2021 Huawei Device Co., Ltd. All rights reserved.
6
7 #define FML_USED_ON_EMBEDDER
8
9 #include "flutter/shell/platform/ohos/ohos_shell_holder.h"
10
11 #include <pthread.h>
12 #include <sys/resource.h>
13 #include <sys/time.h>
14
15 #include <sstream>
16 #include <string>
17 #include <utility>
18
19 #include "flutter/fml/make_copyable.h"
20 #include "flutter/fml/message_loop.h"
21 #include "flutter/shell/common/rasterizer.h"
22 #include "flutter/shell/platform/ohos/platform_task_runner_adapter.h"
23 #include "flutter/shell/platform/ohos/platform_view_ohos.h"
24
25 namespace flutter {
26
OhosShellHolder(flutter::Settings settings,bool is_background_view)27 OhosShellHolder::OhosShellHolder(
28 flutter::Settings settings,
29 bool is_background_view)
30 : settings_(std::move(settings))
31 {
32 // settings_.
33 static size_t shell_count = 1;
34 auto thread_label = std::to_string(shell_count++);
35
36 uint64_t type_mask = 0;
37 if (is_background_view) {
38 type_mask |= ThreadHost::Type::UI;
39 } else {
40 if (!settings_.platform_as_ui_thread) {
41 type_mask |= ThreadHost::Type::UI;
42 }
43 if (!settings_.use_system_render_thread) {
44 type_mask |= ThreadHost::Type::GPU;
45 }
46 if (settings_.use_io_thread) {
47 type_mask |= ThreadHost::Type::IO;
48 }
49 thread_host_ = {thread_label, type_mask};
50 }
51
52 fml::WeakPtr<PlatformViewOhos> weak_platform_view;
53 Shell::CreateCallback<PlatformView> on_create_platform_view =
54 [&weak_platform_view](Shell& shell) {
55 std::unique_ptr<PlatformViewOhos> platform_view_ohos;
56 if (shell.GetSettings().enable_software_rendering) {
57 platform_view_ohos = std::make_unique<PlatformViewOhos>(shell, shell.GetTaskRunners(), true);
58 }
59 weak_platform_view = platform_view_ohos->GetWeakPtr();
60 return platform_view_ohos;
61 };
62
63 Shell::CreateCallback<Rasterizer> on_create_rasterizer = [](Shell& shell) {
64 return std::make_unique<Rasterizer>(shell, shell.GetTaskRunners());
65 };
66
67 // The current thread will be used as the platform thread. Ensure that the
68 // message loop is initialized.
69 fml::MessageLoop::EnsureInitializedForCurrentThread();
70 fml::RefPtr<fml::TaskRunner> gpu_runner;
71 fml::RefPtr<fml::TaskRunner> ui_runner;
72 fml::RefPtr<fml::TaskRunner> io_runner;
73 fml::RefPtr<fml::TaskRunner> platform_runner =
74 PlatformTaskRunnerAdapter::CurrentTaskRunner(settings_.use_current_event_runner);
75 if (is_background_view) {
76 auto single_task_runner = thread_host_.ui_thread->GetTaskRunner();
77 gpu_runner = single_task_runner;
78 ui_runner = single_task_runner;
79 io_runner = single_task_runner;
80 } else {
81 if (settings_.platform_as_ui_thread) {
82 ui_runner = platform_runner;
83 } else {
84 ui_runner = thread_host_.ui_thread->GetTaskRunner();
85 }
86 if (!settings_.use_system_render_thread) {
87 gpu_runner = thread_host_.gpu_thread->GetTaskRunner();
88 } else {
89 gpu_runner = ui_runner;
90 }
91 if (settings_.use_io_thread) {
92 io_runner = thread_host_.io_thread->GetTaskRunner();
93 } else {
94 io_runner = ui_runner;
95 }
96 }
97 flutter::TaskRunners task_runners(thread_label, // label
98 platform_runner, // platform
99 gpu_runner, // gpu
100 ui_runner, // ui
101 io_runner // io
102 );
103
104 shell_ =
105 Shell::Create(task_runners, // task runners
106 settings_, // settings
107 on_create_platform_view, // platform view create callback
108 on_create_rasterizer // rasterizer create callback
109 );
110
111 platform_view_ = weak_platform_view;
112 FML_DCHECK(platform_view_);
113
114 is_valid_ = shell_ != nullptr;
115
116 if (is_valid_) {
117 task_runners.GetGPUTaskRunner()->PostTask([]() {
118 if (::setpriority(PRIO_PROCESS, gettid(), -5) != 0) {
119 if (::setpriority(PRIO_PROCESS, gettid(), -2) != 0) {
120 FML_LOG(ERROR) << "Failed to set GPU task runner priority";
121 }
122 }
123 });
124 task_runners.GetUITaskRunner()->PostTask([]() {
125 if (::setpriority(PRIO_PROCESS, gettid(), -1) != 0) {
126 FML_LOG(ERROR) << "Failed to set UI task runner priority";
127 }
128 });
129 }
130 }
131
~OhosShellHolder()132 OhosShellHolder::~OhosShellHolder()
133 {
134 shell_.reset();
135 thread_host_.Reset();
136 }
137
IsValid() const138 bool OhosShellHolder::IsValid() const
139 {
140 return is_valid_;
141 }
142
GetSettings() const143 const flutter::Settings& OhosShellHolder::GetSettings() const
144 {
145 return settings_;
146 }
147
Launch(RunConfiguration config)148 void OhosShellHolder::Launch(RunConfiguration config)
149 {
150 if (!IsValid()) {
151 return;
152 }
153
154 shell_->RunEngine(std::move(config));
155 }
156
Screenshot(Rasterizer::ScreenshotType type,bool base64_encode)157 Rasterizer::Screenshot OhosShellHolder::Screenshot(
158 Rasterizer::ScreenshotType type,
159 bool base64_encode)
160 {
161 if (!IsValid()) {
162 return {nullptr, SkISize::MakeEmpty()};
163 }
164 return shell_->Screenshot(type, base64_encode);
165 }
166
GetPlatformView()167 fml::WeakPtr<PlatformViewOhos> OhosShellHolder::GetPlatformView()
168 {
169 FML_DCHECK(platform_view_);
170 return platform_view_;
171 }
172
173 } // namespace flutter
174