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