1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "native_display_soloist.h"
17 #include "hgm_log.h"
18 #include "rs_ui_display_soloist.h"
19 #include "transaction/rs_interfaces.h"
20 #include "vsync_receiver.h"
21
22 using namespace OHOS::Rosen;
23
24 struct OH_DisplaySoloist {
25 std::shared_ptr<SoloistId> soloistId_;
26 };
27
OH_DisplaySoloist_Create(bool useExclusiveThread)28 OH_DisplaySoloist* OH_DisplaySoloist_Create(bool useExclusiveThread)
29 {
30 std::shared_ptr<SoloistId> soloistId = SoloistId::Create();
31 RSDisplaySoloistManager& soloistManager = RSDisplaySoloistManager::GetInstance();
32 soloistManager.InsertUseExclusiveThreadFlag(soloistId->GetId(), useExclusiveThread);
33
34 OH_DisplaySoloist* displaySoloist = new OH_DisplaySoloist({ soloistId });
35 HGM_LOGI("[DisplaySoloist] Create DisplaySoloist SoloistId: %{public}d", soloistId->GetId());
36 return displaySoloist;
37 }
38
OH_DisplaySoloist_Destroy(OH_DisplaySoloist * displaySoloist)39 int32_t OH_DisplaySoloist_Destroy(OH_DisplaySoloist* displaySoloist)
40 {
41 if (displaySoloist == nullptr) {
42 HGM_LOGE("%{public}s displaySoloist is nullptr", __func__);
43 return SOLOIST_ERROR;
44 }
45
46 if (displaySoloist->soloistId_ == nullptr) {
47 HGM_LOGE("%{public}s soloistId_ is nullptr", __func__);
48 return SOLOIST_ERROR;
49 }
50
51 SoloistIdType soloistId = displaySoloist->soloistId_->GetId();
52 RSDisplaySoloistManager& soloistManager = RSDisplaySoloistManager::GetInstance();
53 soloistManager.RemoveSoloist(soloistId);
54 HGM_LOGI("[DisplaySoloist] Destroy DisplaySoloist SoloistId: %{public}d", soloistId);
55
56 delete displaySoloist;
57 displaySoloist = nullptr;
58 return EXEC_SUCCESS;
59 }
60
OH_DisplaySoloist_Start(OH_DisplaySoloist * displaySoloist,OH_DisplaySoloist_FrameCallback callback,void * data)61 int32_t OH_DisplaySoloist_Start(OH_DisplaySoloist* displaySoloist,
62 OH_DisplaySoloist_FrameCallback callback, void* data)
63 {
64 if (displaySoloist == nullptr) {
65 HGM_LOGE("%{public}s displaySoloist is nullptr", __func__);
66 return SOLOIST_ERROR;
67 }
68
69 if (displaySoloist->soloistId_ == nullptr) {
70 HGM_LOGE("%{public}s soloistId_ is nullptr", __func__);
71 return SOLOIST_ERROR;
72 }
73
74 SoloistIdType soloistId = displaySoloist->soloistId_->GetId();
75 RSDisplaySoloistManager& soloistManager = RSDisplaySoloistManager::GetInstance();
76 soloistManager.InsertOnVsyncCallback(soloistId, callback, data);
77 soloistManager.Start(soloistId);
78 HGM_LOGI("[DisplaySoloist] Start DisplaySoloist SoloistId: %{public}d", soloistId);
79 return EXEC_SUCCESS;
80 }
81
OH_DisplaySoloist_Stop(OH_DisplaySoloist * displaySoloist)82 int32_t OH_DisplaySoloist_Stop(OH_DisplaySoloist* displaySoloist)
83 {
84 if (displaySoloist == nullptr) {
85 HGM_LOGE("%{public}s displaySoloist is nullptr", __func__);
86 return SOLOIST_ERROR;
87 }
88
89 if (displaySoloist->soloistId_ == nullptr) {
90 HGM_LOGE("%{public}s soloistId_ is nullptr", __func__);
91 return SOLOIST_ERROR;
92 }
93
94 SoloistIdType soloistId = displaySoloist->soloistId_->GetId();
95 RSDisplaySoloistManager& soloistManager = RSDisplaySoloistManager::GetInstance();
96 soloistManager.Stop(soloistId);
97 HGM_LOGI("[DisplaySoloist] Stop DisplaySoloist SoloistId: %{public}d", soloistId);
98 return EXEC_SUCCESS;
99 }
100
OH_DisplaySoloist_SetExpectedFrameRateRange(OH_DisplaySoloist * displaySoloist,DisplaySoloist_ExpectedRateRange * range)101 int32_t OH_DisplaySoloist_SetExpectedFrameRateRange(OH_DisplaySoloist* displaySoloist,
102 DisplaySoloist_ExpectedRateRange* range)
103 {
104 if (displaySoloist == nullptr || range == nullptr) {
105 HGM_LOGE("%{public}s displaySoloist or range is nullptr", __func__);
106 return SOLOIST_ERROR;
107 }
108
109 if (displaySoloist->soloistId_ == nullptr) {
110 HGM_LOGE("%{public}s soloistId_ is nullptr", __func__);
111 return SOLOIST_ERROR;
112 }
113
114 FrameRateRange frameRateRange(range->min, range->max, range->expected);
115 if (!frameRateRange.IsValid()) {
116 HGM_LOGE("%{public}s ExpectedRateRange Error, please check.", __func__);
117 return SOLOIST_ERROR;
118 }
119
120 SoloistIdType soloistId = displaySoloist->soloistId_->GetId();
121 RSDisplaySoloistManager& soloistManager = RSDisplaySoloistManager::GetInstance();
122 soloistManager.InsertFrameRateRange(soloistId, frameRateRange);
123 HGM_LOGI("[DisplaySoloist] SoloistId: %{public}d SetExpectedFrameRateRange{%{public}d, %{public}d, %{public}d}",
124 soloistId, frameRateRange.min_, frameRateRange.max_, frameRateRange.preferred_);
125 return EXEC_SUCCESS;
126 }
127