1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "display_gralloc_client.h"
17094332d3Sopenharmony_ci#include "hdf_log.h"
18094332d3Sopenharmony_ci
19094332d3Sopenharmony_ci#define HDF_LOG_TAG HDI_DISP_CLIENT
20094332d3Sopenharmony_ci
21094332d3Sopenharmony_cinamespace OHOS {
22094332d3Sopenharmony_cinamespace HDI {
23094332d3Sopenharmony_cinamespace Display {
24094332d3Sopenharmony_cinamespace V1_0 {
25094332d3Sopenharmony_ciclass GrallocDeathRecipient : public IRemoteObject::DeathRecipient {
26094332d3Sopenharmony_cipublic:
27094332d3Sopenharmony_ci    GrallocDeathRecipient(AllocatorDeathCallback func, void *data) : deathCbFun_(func), data_(data) {};
28094332d3Sopenharmony_ci    void OnRemoteDied(const wptr<IRemoteObject> &object) override
29094332d3Sopenharmony_ci    {
30094332d3Sopenharmony_ci        HDF_LOGI("%{public}s: allocator service is dead", __func__);
31094332d3Sopenharmony_ci        if (deathCbFun_ != nullptr) {
32094332d3Sopenharmony_ci            HDF_LOGI("%{public}s: notify the death event of allocator to RS", __func__);
33094332d3Sopenharmony_ci            deathCbFun_(data_);
34094332d3Sopenharmony_ci        }
35094332d3Sopenharmony_ci    }
36094332d3Sopenharmony_ciprivate:
37094332d3Sopenharmony_ci    AllocatorDeathCallback deathCbFun_;
38094332d3Sopenharmony_ci    void *data_;
39094332d3Sopenharmony_ci};
40094332d3Sopenharmony_ci
41094332d3Sopenharmony_ciIDisplayGralloc *IDisplayGralloc::Get()
42094332d3Sopenharmony_ci{
43094332d3Sopenharmony_ci    IDisplayGralloc *instance = nullptr;
44094332d3Sopenharmony_ci    instance = new DisplayGrallocClient();
45094332d3Sopenharmony_ci    if (instance == nullptr) {
46094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: Can't new a DisplayGrallocClient instance", __func__);
47094332d3Sopenharmony_ci        return nullptr;
48094332d3Sopenharmony_ci    }
49094332d3Sopenharmony_ci    HDF_LOGI("%{public}s: Get display gralloc client handle succ", __func__);
50094332d3Sopenharmony_ci    return instance;
51094332d3Sopenharmony_ci}
52094332d3Sopenharmony_ci
53094332d3Sopenharmony_ciDisplayGrallocClient::DisplayGrallocClient() : mapperAdapter_(std::make_shared<MapperAdapter>())
54094332d3Sopenharmony_ci{
55094332d3Sopenharmony_ci    allocatorProxy_ = IDisplayAllocator::Get("hdi_display_gralloc_service");
56094332d3Sopenharmony_ci    if (allocatorProxy_ == nullptr) {
57094332d3Sopenharmony_ci        return;
58094332d3Sopenharmony_ci    }
59094332d3Sopenharmony_ci}
60094332d3Sopenharmony_ci
61094332d3Sopenharmony_ciint32_t DisplayGrallocClient::RegAllocatorDeathCallback(AllocatorDeathCallback func, void *data)
62094332d3Sopenharmony_ci{
63094332d3Sopenharmony_ci    const sptr<IRemoteObject::DeathRecipient> recipient = new GrallocDeathRecipient(func, data);
64094332d3Sopenharmony_ci    if (allocatorProxy_ == nullptr) {
65094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: allocatorProxy_ is null", __func__);
66094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
67094332d3Sopenharmony_ci    }
68094332d3Sopenharmony_ci    bool ret = allocatorProxy_->AsObject()->AddDeathRecipient(recipient);
69094332d3Sopenharmony_ci    if (ret) {
70094332d3Sopenharmony_ci        HDF_LOGI("%{public}s: add alocator death notify success", __func__);
71094332d3Sopenharmony_ci        return DISPLAY_SUCCESS;
72094332d3Sopenharmony_ci    } else {
73094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: add alocator death notify failed", __func__);
74094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
75094332d3Sopenharmony_ci    }
76094332d3Sopenharmony_ci}
77094332d3Sopenharmony_ci
78094332d3Sopenharmony_ciint32_t DisplayGrallocClient::AllocMem(const AllocInfo &info, BufferHandle *&handle) const
79094332d3Sopenharmony_ci{
80094332d3Sopenharmony_ci    if (allocatorProxy_ == nullptr) {
81094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: allocatorProxy_ is null", __func__);
82094332d3Sopenharmony_ci        return DISPLAY_FAILURE;
83094332d3Sopenharmony_ci    }
84094332d3Sopenharmony_ci    auto ret = allocatorProxy_->AllocMem(info, handle);
85094332d3Sopenharmony_ci    return ret;
86094332d3Sopenharmony_ci}
87094332d3Sopenharmony_ci
88094332d3Sopenharmony_civoid DisplayGrallocClient::FreeMem(const BufferHandle &handle) const
89094332d3Sopenharmony_ci{
90094332d3Sopenharmony_ci    mapperAdapter_->FreeBuffer(handle);
91094332d3Sopenharmony_ci}
92094332d3Sopenharmony_ci
93094332d3Sopenharmony_civoid* DisplayGrallocClient::Mmap(const BufferHandle &handle) const
94094332d3Sopenharmony_ci{
95094332d3Sopenharmony_ci    void* data = nullptr;
96094332d3Sopenharmony_ci    int32_t ret = mapperAdapter_->MapBuffer(handle, data);
97094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
98094332d3Sopenharmony_ci        FreeMem(handle);
99094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: DisplayGrallocClient::Mmap, mapBuffer failed", __func__);
100094332d3Sopenharmony_ci        return nullptr;
101094332d3Sopenharmony_ci    }
102094332d3Sopenharmony_ci    return data;
103094332d3Sopenharmony_ci}
104094332d3Sopenharmony_ci
105094332d3Sopenharmony_ciint32_t DisplayGrallocClient::Unmap(const BufferHandle &handle) const
106094332d3Sopenharmony_ci{
107094332d3Sopenharmony_ci    auto ret = mapperAdapter_->UnmapBuffer(handle);
108094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
109094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: failed, ret %{public}d", __func__, ret);
110094332d3Sopenharmony_ci    }
111094332d3Sopenharmony_ci    return ret;
112094332d3Sopenharmony_ci}
113094332d3Sopenharmony_ci
114094332d3Sopenharmony_ciint32_t DisplayGrallocClient::FlushCache(const BufferHandle &handle) const
115094332d3Sopenharmony_ci{
116094332d3Sopenharmony_ci    auto ret = mapperAdapter_->FlushCache(handle);
117094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
118094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: failed, ret %{public}d", __func__, ret);
119094332d3Sopenharmony_ci    }
120094332d3Sopenharmony_ci    return ret;
121094332d3Sopenharmony_ci}
122094332d3Sopenharmony_ci
123094332d3Sopenharmony_ciint32_t DisplayGrallocClient::InvalidateCache(const BufferHandle &handle) const
124094332d3Sopenharmony_ci{
125094332d3Sopenharmony_ci    auto ret = mapperAdapter_->InvalidateCache(handle);
126094332d3Sopenharmony_ci    if (ret != DISPLAY_SUCCESS) {
127094332d3Sopenharmony_ci        HDF_LOGI("%{public}s: failed, ret %{public}d", __func__, ret);
128094332d3Sopenharmony_ci    }
129094332d3Sopenharmony_ci    return ret;
130094332d3Sopenharmony_ci}
131094332d3Sopenharmony_ci
132094332d3Sopenharmony_civoid* DisplayGrallocClient::MmapCache(const BufferHandle &handle) const
133094332d3Sopenharmony_ci{
134094332d3Sopenharmony_ci    (void)handle;
135094332d3Sopenharmony_ci    return nullptr;
136094332d3Sopenharmony_ci}
137094332d3Sopenharmony_ci
138094332d3Sopenharmony_ciint32_t DisplayGrallocClient::FlushMCache(const BufferHandle &handle) const
139094332d3Sopenharmony_ci{
140094332d3Sopenharmony_ci    (void)handle;
141094332d3Sopenharmony_ci    return DISPLAY_NOT_SUPPORT;
142094332d3Sopenharmony_ci}
143094332d3Sopenharmony_ci
144094332d3Sopenharmony_ciint32_t DisplayGrallocClient::IsSupportedAlloc(const std::vector<VerifyAllocInfo> &infos,
145094332d3Sopenharmony_ci                                               std::vector<bool> &supporteds) const
146094332d3Sopenharmony_ci{
147094332d3Sopenharmony_ci    (void)infos;
148094332d3Sopenharmony_ci    (void)supporteds;
149094332d3Sopenharmony_ci    return DISPLAY_NOT_SUPPORT;
150094332d3Sopenharmony_ci}
151094332d3Sopenharmony_ci} // namespace V1_0
152094332d3Sopenharmony_ci} // namespace Display
153094332d3Sopenharmony_ci} // namespace HDI
154094332d3Sopenharmony_ci} // namespace OHOS
155