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