• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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