132a6e48fSopenharmony_ci/* 232a6e48fSopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 332a6e48fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 432a6e48fSopenharmony_ci * you may not use this file except in compliance with the License. 532a6e48fSopenharmony_ci * You may obtain a copy of the License at 632a6e48fSopenharmony_ci * 732a6e48fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 832a6e48fSopenharmony_ci * 932a6e48fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1032a6e48fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1132a6e48fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1232a6e48fSopenharmony_ci * See the License for the specific language governing permissions and 1332a6e48fSopenharmony_ci * limitations under the License. 1432a6e48fSopenharmony_ci */ 1532a6e48fSopenharmony_ci 1632a6e48fSopenharmony_ci#include "surface_buffer_impl.h" 1732a6e48fSopenharmony_ci 1832a6e48fSopenharmony_ci#include <mutex> 1932a6e48fSopenharmony_ci 2032a6e48fSopenharmony_ci#include <message_parcel.h> 2132a6e48fSopenharmony_ci#include <parameters.h> 2232a6e48fSopenharmony_ci#include <securec.h> 2332a6e48fSopenharmony_ci#include <sys/mman.h> 2432a6e48fSopenharmony_ci#include "buffer_log.h" 2532a6e48fSopenharmony_ci#include "buffer_extra_data_impl.h" 2632a6e48fSopenharmony_ci#include "v1_1/buffer_handle_meta_key_type.h" 2732a6e48fSopenharmony_ci#include "v1_2/display_buffer_type.h" 2832a6e48fSopenharmony_ci#include "v1_2/include/idisplay_buffer.h" 2932a6e48fSopenharmony_ci 3032a6e48fSopenharmony_cinamespace OHOS { 3132a6e48fSopenharmony_cinamespace { 3232a6e48fSopenharmony_ciusing IDisplayBufferSptr = std::shared_ptr<OHOS::HDI::Display::Buffer::V1_2::IDisplayBuffer>; 3332a6e48fSopenharmony_cistatic IDisplayBufferSptr g_displayBuffer; 3432a6e48fSopenharmony_cistatic std::mutex g_displayBufferMutex; 3532a6e48fSopenharmony_ciclass DisplayBufferDiedRecipient : public OHOS::IRemoteObject::DeathRecipient { 3632a6e48fSopenharmony_cipublic: 3732a6e48fSopenharmony_ci DisplayBufferDiedRecipient() = default; 3832a6e48fSopenharmony_ci virtual ~DisplayBufferDiedRecipient() = default; 3932a6e48fSopenharmony_ci void OnRemoteDied(const OHOS::wptr<OHOS::IRemoteObject>& remote) override 4032a6e48fSopenharmony_ci { 4132a6e48fSopenharmony_ci std::lock_guard<std::mutex> bufferLock(g_displayBufferMutex); 4232a6e48fSopenharmony_ci g_displayBuffer = nullptr; 4332a6e48fSopenharmony_ci BLOGD("IDisplayBuffer died and g_displayBuffer is nullptr"); 4432a6e48fSopenharmony_ci }; 4532a6e48fSopenharmony_ci}; 4632a6e48fSopenharmony_ci 4732a6e48fSopenharmony_ciIDisplayBufferSptr GetDisplayBuffer() 4832a6e48fSopenharmony_ci{ 4932a6e48fSopenharmony_ci std::lock_guard<std::mutex> bufferLock(g_displayBufferMutex); 5032a6e48fSopenharmony_ci if (g_displayBuffer != nullptr) { 5132a6e48fSopenharmony_ci return g_displayBuffer; 5232a6e48fSopenharmony_ci } 5332a6e48fSopenharmony_ci return nullptr; 5432a6e48fSopenharmony_ci} 5532a6e48fSopenharmony_ci 5632a6e48fSopenharmony_ciIDisplayBufferSptr GetOrResetDisplayBuffer() 5732a6e48fSopenharmony_ci{ 5832a6e48fSopenharmony_ci std::lock_guard<std::mutex> bufferLock(g_displayBufferMutex); 5932a6e48fSopenharmony_ci if (g_displayBuffer != nullptr) { 6032a6e48fSopenharmony_ci return g_displayBuffer; 6132a6e48fSopenharmony_ci } 6232a6e48fSopenharmony_ci 6332a6e48fSopenharmony_ci g_displayBuffer.reset(OHOS::HDI::Display::Buffer::V1_2::IDisplayBuffer::Get()); 6432a6e48fSopenharmony_ci if (g_displayBuffer == nullptr) { 6532a6e48fSopenharmony_ci BLOGE("IDisplayBuffer::Get return nullptr."); 6632a6e48fSopenharmony_ci return nullptr; 6732a6e48fSopenharmony_ci } 6832a6e48fSopenharmony_ci sptr<IRemoteObject::DeathRecipient> recipient = new DisplayBufferDiedRecipient(); 6932a6e48fSopenharmony_ci g_displayBuffer->AddDeathRecipient(recipient); 7032a6e48fSopenharmony_ci return g_displayBuffer; 7132a6e48fSopenharmony_ci} 7232a6e48fSopenharmony_ci 7332a6e48fSopenharmony_ciconstexpr int32_t INVALID_ARGUMENT = -1; 7432a6e48fSopenharmony_ciconstexpr uint64_t INVALID_PHYADDR = 0; 7532a6e48fSopenharmony_ciconstexpr uint32_t INVALID_SIZE = 0; 7632a6e48fSopenharmony_ciconstexpr uint64_t INVALID_USAGE = std::numeric_limits<std::uint64_t>::max(); 7732a6e48fSopenharmony_ci} 7832a6e48fSopenharmony_ci 7932a6e48fSopenharmony_cisptr<SurfaceBuffer> SurfaceBuffer::Create() 8032a6e48fSopenharmony_ci{ 8132a6e48fSopenharmony_ci sptr<SurfaceBuffer> surfaceBufferImpl = new SurfaceBufferImpl(); 8232a6e48fSopenharmony_ci return surfaceBufferImpl; 8332a6e48fSopenharmony_ci} 8432a6e48fSopenharmony_ci 8532a6e48fSopenharmony_ciSurfaceBufferImpl::SurfaceBufferImpl() 8632a6e48fSopenharmony_ci{ 8732a6e48fSopenharmony_ci { 8832a6e48fSopenharmony_ci static std::mutex mutex; 8932a6e48fSopenharmony_ci mutex.lock(); 9032a6e48fSopenharmony_ci 9132a6e48fSopenharmony_ci static uint32_t sequence_number_ = 0; 9232a6e48fSopenharmony_ci // 0xFFFF is pid mask. 16 is pid offset. 9332a6e48fSopenharmony_ci sequenceNumber_ = (static_cast<uint32_t>(getpid()) & 0xFFFF) << 16; 9432a6e48fSopenharmony_ci // 0xFFFF is seqnum mask. 9532a6e48fSopenharmony_ci sequenceNumber_ |= (sequence_number_++ & 0xFFFF); 9632a6e48fSopenharmony_ci 9732a6e48fSopenharmony_ci mutex.unlock(); 9832a6e48fSopenharmony_ci } 9932a6e48fSopenharmony_ci metaDataCache_.clear(); 10032a6e48fSopenharmony_ci bedata_ = new BufferExtraDataImpl; 10132a6e48fSopenharmony_ci BLOGD("SurfaceBufferImpl ctor, seq: %{public}u", sequenceNumber_); 10232a6e48fSopenharmony_ci} 10332a6e48fSopenharmony_ci 10432a6e48fSopenharmony_ciSurfaceBufferImpl::SurfaceBufferImpl(uint32_t seqNum) 10532a6e48fSopenharmony_ci{ 10632a6e48fSopenharmony_ci metaDataCache_.clear(); 10732a6e48fSopenharmony_ci sequenceNumber_ = seqNum; 10832a6e48fSopenharmony_ci bedata_ = new BufferExtraDataImpl; 10932a6e48fSopenharmony_ci BLOGD("SurfaceBufferImpl ctor, seq: %{public}u", sequenceNumber_); 11032a6e48fSopenharmony_ci} 11132a6e48fSopenharmony_ci 11232a6e48fSopenharmony_ciSurfaceBufferImpl::~SurfaceBufferImpl() 11332a6e48fSopenharmony_ci{ 11432a6e48fSopenharmony_ci BLOGD("~SurfaceBufferImpl dtor, seq: %{public}u", sequenceNumber_); 11532a6e48fSopenharmony_ci FreeBufferHandleLocked(); 11632a6e48fSopenharmony_ci} 11732a6e48fSopenharmony_ci 11832a6e48fSopenharmony_cibool SurfaceBufferImpl::MetaDataCachedLocked(const uint32_t key, const std::vector<uint8_t>& value) 11932a6e48fSopenharmony_ci{ 12032a6e48fSopenharmony_ci auto iter = metaDataCache_.find(key); 12132a6e48fSopenharmony_ci if (iter != metaDataCache_.end() && (*iter).second == value) { 12232a6e48fSopenharmony_ci return true; 12332a6e48fSopenharmony_ci } 12432a6e48fSopenharmony_ci return false; 12532a6e48fSopenharmony_ci} 12632a6e48fSopenharmony_ci 12732a6e48fSopenharmony_ciGSError SurfaceBufferImpl::Alloc(const BufferRequestConfig& config) 12832a6e48fSopenharmony_ci{ 12932a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 13032a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 13132a6e48fSopenharmony_ci return GSERROR_INTERNAL; 13232a6e48fSopenharmony_ci } 13332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 13432a6e48fSopenharmony_ci FreeBufferHandleLocked(); 13532a6e48fSopenharmony_ci 13632a6e48fSopenharmony_ci GSError ret = CheckBufferConfig(config.width, config.height, config.format, config.usage); 13732a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 13832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 13932a6e48fSopenharmony_ci } 14032a6e48fSopenharmony_ci 14132a6e48fSopenharmony_ci OHOS::HDI::Display::Buffer::V1_0::AllocInfo info = {config.width, config.height, config.usage, config.format}; 14232a6e48fSopenharmony_ci static bool debugHebcDisabled = 14332a6e48fSopenharmony_ci std::atoi((system::GetParameter("persist.graphic.debug_hebc.disabled", "0")).c_str()) != 0; 14432a6e48fSopenharmony_ci if (debugHebcDisabled) { 14532a6e48fSopenharmony_ci info.usage |= (BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA); 14632a6e48fSopenharmony_ci } 14732a6e48fSopenharmony_ci auto dRet = displayBuffer->AllocMem(info, handle_); 14832a6e48fSopenharmony_ci if (dRet == GRAPHIC_DISPLAY_SUCCESS && handle_ != nullptr) { 14932a6e48fSopenharmony_ci dRet = displayBuffer->RegisterBuffer(*handle_); 15032a6e48fSopenharmony_ci if (dRet != GRAPHIC_DISPLAY_SUCCESS && dRet != GRAPHIC_DISPLAY_NOT_SUPPORT) { 15132a6e48fSopenharmony_ci BLOGE("AllocMem RegisterBuffer Failed with %{public}d", dRet); 15232a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 15332a6e48fSopenharmony_ci } 15432a6e48fSopenharmony_ci surfaceBufferColorGamut_ = static_cast<GraphicColorGamut>(config.colorGamut); 15532a6e48fSopenharmony_ci transform_ = static_cast<GraphicTransformType>(config.transform); 15632a6e48fSopenharmony_ci surfaceBufferWidth_ = config.width; 15732a6e48fSopenharmony_ci surfaceBufferHeight_ = config.height; 15832a6e48fSopenharmony_ci bufferRequestConfig_ = config; 15932a6e48fSopenharmony_ci BLOGD("handle w: %{public}d h: %{public}d t: %{public}d, seq: %{public}u", 16032a6e48fSopenharmony_ci handle_->width, handle_->height, config.transform, sequenceNumber_); 16132a6e48fSopenharmony_ci return GSERROR_OK; 16232a6e48fSopenharmony_ci } 16332a6e48fSopenharmony_ci BLOGW("Alloc Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_); 16432a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 16532a6e48fSopenharmony_ci} 16632a6e48fSopenharmony_ci 16732a6e48fSopenharmony_ciGSError SurfaceBufferImpl::Map() 16832a6e48fSopenharmony_ci{ 16932a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 17032a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 17132a6e48fSopenharmony_ci return GSERROR_INTERNAL; 17232a6e48fSopenharmony_ci } 17332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 17432a6e48fSopenharmony_ci if (handle_ == nullptr) { 17532a6e48fSopenharmony_ci return GSERROR_INVALID_OPERATING; 17632a6e48fSopenharmony_ci } else if (handle_->virAddr != nullptr) { 17732a6e48fSopenharmony_ci BLOGD("handle_->virAddr has been maped, seq: %{public}u", sequenceNumber_); 17832a6e48fSopenharmony_ci return GSERROR_OK; 17932a6e48fSopenharmony_ci } 18032a6e48fSopenharmony_ci if (handle_->usage & BUFFER_USAGE_PROTECTED) { 18132a6e48fSopenharmony_ci BLOGD("usage is BUFFER_USAGE_PROTECTED, do not Map, seq: %{public}u", sequenceNumber_); 18232a6e48fSopenharmony_ci return GSERROR_OK; 18332a6e48fSopenharmony_ci } 18432a6e48fSopenharmony_ci 18532a6e48fSopenharmony_ci void* virAddr = displayBuffer->Mmap(*handle_); 18632a6e48fSopenharmony_ci if (virAddr == nullptr || virAddr == MAP_FAILED) { 18732a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 18832a6e48fSopenharmony_ci } 18932a6e48fSopenharmony_ci return GSERROR_OK; 19032a6e48fSopenharmony_ci} 19132a6e48fSopenharmony_ci 19232a6e48fSopenharmony_ciGSError SurfaceBufferImpl::Unmap() 19332a6e48fSopenharmony_ci{ 19432a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 19532a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 19632a6e48fSopenharmony_ci return GSERROR_INTERNAL; 19732a6e48fSopenharmony_ci } 19832a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 19932a6e48fSopenharmony_ci if (handle_ == nullptr) { 20032a6e48fSopenharmony_ci return GSERROR_INVALID_OPERATING; 20132a6e48fSopenharmony_ci } else if (handle_->virAddr == nullptr) { 20232a6e48fSopenharmony_ci BLOGW("handle has been unmaped, seq: %{public}u", sequenceNumber_); 20332a6e48fSopenharmony_ci return GSERROR_OK; 20432a6e48fSopenharmony_ci } 20532a6e48fSopenharmony_ci auto dRet = displayBuffer->Unmap(*handle_); 20632a6e48fSopenharmony_ci if (dRet == GRAPHIC_DISPLAY_SUCCESS) { 20732a6e48fSopenharmony_ci handle_->virAddr = nullptr; 20832a6e48fSopenharmony_ci return GSERROR_OK; 20932a6e48fSopenharmony_ci } 21032a6e48fSopenharmony_ci BLOGW("Unmap Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_); 21132a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 21232a6e48fSopenharmony_ci} 21332a6e48fSopenharmony_ci 21432a6e48fSopenharmony_ciGSError SurfaceBufferImpl::FlushCache() 21532a6e48fSopenharmony_ci{ 21632a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 21732a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 21832a6e48fSopenharmony_ci return GSERROR_INTERNAL; 21932a6e48fSopenharmony_ci } 22032a6e48fSopenharmony_ci 22132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 22232a6e48fSopenharmony_ci if (handle_ == nullptr) { 22332a6e48fSopenharmony_ci return GSERROR_INVALID_OPERATING; 22432a6e48fSopenharmony_ci } 22532a6e48fSopenharmony_ci auto dRet = displayBuffer->FlushCache(*handle_); 22632a6e48fSopenharmony_ci if (dRet == GRAPHIC_DISPLAY_SUCCESS) { 22732a6e48fSopenharmony_ci return GSERROR_OK; 22832a6e48fSopenharmony_ci } 22932a6e48fSopenharmony_ci BLOGW("FlushCache Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_); 23032a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 23132a6e48fSopenharmony_ci} 23232a6e48fSopenharmony_ci 23332a6e48fSopenharmony_ciGSError SurfaceBufferImpl::GetImageLayout(void* layout) 23432a6e48fSopenharmony_ci{ 23532a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 23632a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 23732a6e48fSopenharmony_ci return GSERROR_INTERNAL; 23832a6e48fSopenharmony_ci } 23932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 24032a6e48fSopenharmony_ci if (handle_ == nullptr) { 24132a6e48fSopenharmony_ci return GSERROR_INVALID_OPERATING; 24232a6e48fSopenharmony_ci } else if (planesInfo_.planeCount != 0) { 24332a6e48fSopenharmony_ci return GSERROR_OK; 24432a6e48fSopenharmony_ci } 24532a6e48fSopenharmony_ci 24632a6e48fSopenharmony_ci auto dRet = displayBuffer->GetImageLayout(*handle_, 24732a6e48fSopenharmony_ci *(static_cast<OHOS::HDI::Display::Buffer::V1_2::ImageLayout*>(layout))); 24832a6e48fSopenharmony_ci if (dRet == GRAPHIC_DISPLAY_SUCCESS) { 24932a6e48fSopenharmony_ci return GSERROR_OK; 25032a6e48fSopenharmony_ci } 25132a6e48fSopenharmony_ci BLOGW("GetImageLayout Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_); 25232a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 25332a6e48fSopenharmony_ci} 25432a6e48fSopenharmony_ci 25532a6e48fSopenharmony_ciGSError SurfaceBufferImpl::InvalidateCache() 25632a6e48fSopenharmony_ci{ 25732a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 25832a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 25932a6e48fSopenharmony_ci return GSERROR_INTERNAL; 26032a6e48fSopenharmony_ci } 26132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 26232a6e48fSopenharmony_ci if (handle_ == nullptr) { 26332a6e48fSopenharmony_ci return GSERROR_INVALID_OPERATING; 26432a6e48fSopenharmony_ci } 26532a6e48fSopenharmony_ci 26632a6e48fSopenharmony_ci auto dRet = displayBuffer->InvalidateCache(*handle_); 26732a6e48fSopenharmony_ci if (dRet == GRAPHIC_DISPLAY_SUCCESS) { 26832a6e48fSopenharmony_ci return GSERROR_OK; 26932a6e48fSopenharmony_ci } 27032a6e48fSopenharmony_ci BLOGW("InvalidateCache Failed with %{public}d, seq: %{public}u", dRet, sequenceNumber_); 27132a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 27232a6e48fSopenharmony_ci} 27332a6e48fSopenharmony_ci 27432a6e48fSopenharmony_civoid SurfaceBufferImpl::FreeBufferHandleLocked() 27532a6e48fSopenharmony_ci{ 27632a6e48fSopenharmony_ci metaDataCache_.clear(); 27732a6e48fSopenharmony_ci if (handle_) { 27832a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetDisplayBuffer(); 27932a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 28032a6e48fSopenharmony_ci FreeBufferHandle(handle_); 28132a6e48fSopenharmony_ci handle_ = nullptr; 28232a6e48fSopenharmony_ci return; 28332a6e48fSopenharmony_ci } 28432a6e48fSopenharmony_ci if (handle_->virAddr != nullptr) { 28532a6e48fSopenharmony_ci displayBuffer->Unmap(*handle_); 28632a6e48fSopenharmony_ci handle_->virAddr = nullptr; 28732a6e48fSopenharmony_ci } 28832a6e48fSopenharmony_ci displayBuffer->FreeMem(*handle_); 28932a6e48fSopenharmony_ci handle_ = nullptr; 29032a6e48fSopenharmony_ci } 29132a6e48fSopenharmony_ci} 29232a6e48fSopenharmony_ci 29332a6e48fSopenharmony_ci// return BufferHandle* is dangerous, need to refactor 29432a6e48fSopenharmony_ciBufferHandle* SurfaceBufferImpl::GetBufferHandle() const 29532a6e48fSopenharmony_ci{ 29632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 29732a6e48fSopenharmony_ci return handle_; 29832a6e48fSopenharmony_ci} 29932a6e48fSopenharmony_ci 30032a6e48fSopenharmony_civoid SurfaceBufferImpl::SetSurfaceBufferColorGamut(const GraphicColorGamut& colorGamut) 30132a6e48fSopenharmony_ci{ 30232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 30332a6e48fSopenharmony_ci if (surfaceBufferColorGamut_ != colorGamut) { 30432a6e48fSopenharmony_ci surfaceBufferColorGamut_ = colorGamut; 30532a6e48fSopenharmony_ci } 30632a6e48fSopenharmony_ci} 30732a6e48fSopenharmony_ci 30832a6e48fSopenharmony_ciGraphicColorGamut SurfaceBufferImpl::GetSurfaceBufferColorGamut() const 30932a6e48fSopenharmony_ci{ 31032a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 31132a6e48fSopenharmony_ci return surfaceBufferColorGamut_; 31232a6e48fSopenharmony_ci} 31332a6e48fSopenharmony_ci 31432a6e48fSopenharmony_civoid SurfaceBufferImpl::SetSurfaceBufferTransform(const GraphicTransformType& transform) 31532a6e48fSopenharmony_ci{ 31632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 31732a6e48fSopenharmony_ci if (transform_ != transform) { 31832a6e48fSopenharmony_ci transform_ = transform; 31932a6e48fSopenharmony_ci } 32032a6e48fSopenharmony_ci} 32132a6e48fSopenharmony_ci 32232a6e48fSopenharmony_ciGraphicTransformType SurfaceBufferImpl::GetSurfaceBufferTransform() const 32332a6e48fSopenharmony_ci{ 32432a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 32532a6e48fSopenharmony_ci return transform_; 32632a6e48fSopenharmony_ci} 32732a6e48fSopenharmony_ci 32832a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetSurfaceBufferWidth() const 32932a6e48fSopenharmony_ci{ 33032a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 33132a6e48fSopenharmony_ci return surfaceBufferWidth_; 33232a6e48fSopenharmony_ci} 33332a6e48fSopenharmony_ci 33432a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetSurfaceBufferHeight() const 33532a6e48fSopenharmony_ci{ 33632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 33732a6e48fSopenharmony_ci return surfaceBufferHeight_; 33832a6e48fSopenharmony_ci} 33932a6e48fSopenharmony_ci 34032a6e48fSopenharmony_civoid SurfaceBufferImpl::SetSurfaceBufferWidth(int32_t width) 34132a6e48fSopenharmony_ci{ 34232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 34332a6e48fSopenharmony_ci surfaceBufferWidth_ = width; 34432a6e48fSopenharmony_ci} 34532a6e48fSopenharmony_ci 34632a6e48fSopenharmony_civoid SurfaceBufferImpl::SetSurfaceBufferHeight(int32_t height) 34732a6e48fSopenharmony_ci{ 34832a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 34932a6e48fSopenharmony_ci surfaceBufferHeight_ = height; 35032a6e48fSopenharmony_ci} 35132a6e48fSopenharmony_ci 35232a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetWidth() const 35332a6e48fSopenharmony_ci{ 35432a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 35532a6e48fSopenharmony_ci if (handle_ == nullptr) { 35632a6e48fSopenharmony_ci return INVALID_ARGUMENT; 35732a6e48fSopenharmony_ci } 35832a6e48fSopenharmony_ci return handle_->width; 35932a6e48fSopenharmony_ci} 36032a6e48fSopenharmony_ci 36132a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetHeight() const 36232a6e48fSopenharmony_ci{ 36332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 36432a6e48fSopenharmony_ci if (handle_ == nullptr) { 36532a6e48fSopenharmony_ci return INVALID_ARGUMENT; 36632a6e48fSopenharmony_ci } 36732a6e48fSopenharmony_ci return handle_->height; 36832a6e48fSopenharmony_ci} 36932a6e48fSopenharmony_ci 37032a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetStride() const 37132a6e48fSopenharmony_ci{ 37232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 37332a6e48fSopenharmony_ci if (handle_ == nullptr) { 37432a6e48fSopenharmony_ci return INVALID_ARGUMENT; 37532a6e48fSopenharmony_ci } 37632a6e48fSopenharmony_ci return handle_->stride; 37732a6e48fSopenharmony_ci} 37832a6e48fSopenharmony_ci 37932a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetFormat() const 38032a6e48fSopenharmony_ci{ 38132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 38232a6e48fSopenharmony_ci if (handle_ == nullptr) { 38332a6e48fSopenharmony_ci return INVALID_ARGUMENT; 38432a6e48fSopenharmony_ci } 38532a6e48fSopenharmony_ci return handle_->format; 38632a6e48fSopenharmony_ci} 38732a6e48fSopenharmony_ci 38832a6e48fSopenharmony_ciuint64_t SurfaceBufferImpl::GetUsage() const 38932a6e48fSopenharmony_ci{ 39032a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 39132a6e48fSopenharmony_ci if (handle_ == nullptr) { 39232a6e48fSopenharmony_ci return INVALID_USAGE; 39332a6e48fSopenharmony_ci } 39432a6e48fSopenharmony_ci return handle_->usage; 39532a6e48fSopenharmony_ci} 39632a6e48fSopenharmony_ci 39732a6e48fSopenharmony_ciuint64_t SurfaceBufferImpl::GetPhyAddr() const 39832a6e48fSopenharmony_ci{ 39932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 40032a6e48fSopenharmony_ci if (handle_ == nullptr) { 40132a6e48fSopenharmony_ci return INVALID_PHYADDR; 40232a6e48fSopenharmony_ci } 40332a6e48fSopenharmony_ci return handle_->phyAddr; 40432a6e48fSopenharmony_ci} 40532a6e48fSopenharmony_ci 40632a6e48fSopenharmony_civoid* SurfaceBufferImpl::GetVirAddr() 40732a6e48fSopenharmony_ci{ 40832a6e48fSopenharmony_ci GSError ret = this->Map(); 40932a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 41032a6e48fSopenharmony_ci return nullptr; 41132a6e48fSopenharmony_ci } 41232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 41332a6e48fSopenharmony_ci if (handle_ == nullptr) { 41432a6e48fSopenharmony_ci return nullptr; 41532a6e48fSopenharmony_ci } 41632a6e48fSopenharmony_ci return handle_->virAddr; 41732a6e48fSopenharmony_ci} 41832a6e48fSopenharmony_ci 41932a6e48fSopenharmony_ciint32_t SurfaceBufferImpl::GetFileDescriptor() const 42032a6e48fSopenharmony_ci{ 42132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 42232a6e48fSopenharmony_ci if (handle_ == nullptr) { 42332a6e48fSopenharmony_ci return INVALID_ARGUMENT; 42432a6e48fSopenharmony_ci } 42532a6e48fSopenharmony_ci return handle_->fd; 42632a6e48fSopenharmony_ci} 42732a6e48fSopenharmony_ci 42832a6e48fSopenharmony_ciuint32_t SurfaceBufferImpl::GetSize() const 42932a6e48fSopenharmony_ci{ 43032a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 43132a6e48fSopenharmony_ci if (handle_ == nullptr) { 43232a6e48fSopenharmony_ci return INVALID_SIZE; 43332a6e48fSopenharmony_ci } 43432a6e48fSopenharmony_ci return handle_->size; 43532a6e48fSopenharmony_ci} 43632a6e48fSopenharmony_ci 43732a6e48fSopenharmony_ciGSError SurfaceBufferImpl::GetPlanesInfo(void** planesInfo) 43832a6e48fSopenharmony_ci{ 43932a6e48fSopenharmony_ci if (planesInfo == nullptr) { 44032a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 44132a6e48fSopenharmony_ci } 44232a6e48fSopenharmony_ci OHOS::HDI::Display::Buffer::V1_2::ImageLayout layout; 44332a6e48fSopenharmony_ci GSError ret = GetImageLayout(&layout); 44432a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 44532a6e48fSopenharmony_ci BLOGW("GetImageLayout failed, ret:%d, seq: %{public}u", ret, sequenceNumber_); 44632a6e48fSopenharmony_ci return ret; 44732a6e48fSopenharmony_ci } 44832a6e48fSopenharmony_ci 44932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 45032a6e48fSopenharmony_ci if (planesInfo_.planeCount != 0) { 45132a6e48fSopenharmony_ci *planesInfo = static_cast<void*>(&planesInfo_); 45232a6e48fSopenharmony_ci return GSERROR_OK; 45332a6e48fSopenharmony_ci } 45432a6e48fSopenharmony_ci planesInfo_.planeCount = layout.planes.size(); 45532a6e48fSopenharmony_ci for (uint32_t i = 0; i < planesInfo_.planeCount && i < 4; i++) { // 4: max plane count 45632a6e48fSopenharmony_ci planesInfo_.planes[i].offset = layout.planes[i].offset; 45732a6e48fSopenharmony_ci planesInfo_.planes[i].rowStride = layout.planes[i].hStride; 45832a6e48fSopenharmony_ci planesInfo_.planes[i].columnStride = layout.planes[i].vStride; 45932a6e48fSopenharmony_ci } 46032a6e48fSopenharmony_ci 46132a6e48fSopenharmony_ci *planesInfo = static_cast<void*>(&planesInfo_); 46232a6e48fSopenharmony_ci return GSERROR_OK; 46332a6e48fSopenharmony_ci} 46432a6e48fSopenharmony_ci 46532a6e48fSopenharmony_civoid SurfaceBufferImpl::SetExtraData(sptr<BufferExtraData> bedata) 46632a6e48fSopenharmony_ci{ 46732a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 46832a6e48fSopenharmony_ci bedata_ = bedata; 46932a6e48fSopenharmony_ci} 47032a6e48fSopenharmony_ci 47132a6e48fSopenharmony_cisptr<BufferExtraData> SurfaceBufferImpl::GetExtraData() const 47232a6e48fSopenharmony_ci{ 47332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 47432a6e48fSopenharmony_ci return bedata_; 47532a6e48fSopenharmony_ci} 47632a6e48fSopenharmony_ci 47732a6e48fSopenharmony_civoid SurfaceBufferImpl::SetBufferHandle(BufferHandle* handle) 47832a6e48fSopenharmony_ci{ 47932a6e48fSopenharmony_ci if (handle == nullptr) { 48032a6e48fSopenharmony_ci return; 48132a6e48fSopenharmony_ci } 48232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 48332a6e48fSopenharmony_ci if (handle_ == handle) { 48432a6e48fSopenharmony_ci return; 48532a6e48fSopenharmony_ci } 48632a6e48fSopenharmony_ci FreeBufferHandleLocked(); 48732a6e48fSopenharmony_ci 48832a6e48fSopenharmony_ci handle_ = handle; 48932a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetDisplayBuffer(); 49032a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 49132a6e48fSopenharmony_ci return; 49232a6e48fSopenharmony_ci } 49332a6e48fSopenharmony_ci auto dRet = displayBuffer->RegisterBuffer(*handle_); 49432a6e48fSopenharmony_ci if (dRet != GRAPHIC_DISPLAY_SUCCESS && dRet != GRAPHIC_DISPLAY_NOT_SUPPORT) { 49532a6e48fSopenharmony_ci BLOGE("SetBufferHandle RegisterBuffer Failed with %{public}d", dRet); 49632a6e48fSopenharmony_ci return; 49732a6e48fSopenharmony_ci } 49832a6e48fSopenharmony_ci} 49932a6e48fSopenharmony_ci 50032a6e48fSopenharmony_ciGSError SurfaceBufferImpl::WriteBufferRequestConfig(MessageParcel& parcel) 50132a6e48fSopenharmony_ci{ 50232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 50332a6e48fSopenharmony_ci if (!parcel.WriteInt32(bufferRequestConfig_.width) || !parcel.WriteInt32(bufferRequestConfig_.height) || 50432a6e48fSopenharmony_ci !parcel.WriteInt32(bufferRequestConfig_.strideAlignment) || !parcel.WriteInt32(bufferRequestConfig_.format) || 50532a6e48fSopenharmony_ci !parcel.WriteUint64(bufferRequestConfig_.usage) || !parcel.WriteInt32(bufferRequestConfig_.timeout) || 50632a6e48fSopenharmony_ci !parcel.WriteUint32(static_cast<uint32_t>(bufferRequestConfig_.colorGamut)) || 50732a6e48fSopenharmony_ci !parcel.WriteUint32(static_cast<uint32_t>(bufferRequestConfig_.transform))) { 50832a6e48fSopenharmony_ci BLOGE("parcel write fail, seq: %{public}u.", sequenceNumber_); 50932a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 51032a6e48fSopenharmony_ci } 51132a6e48fSopenharmony_ci return GSERROR_OK; 51232a6e48fSopenharmony_ci} 51332a6e48fSopenharmony_ci 51432a6e48fSopenharmony_ciGSError SurfaceBufferImpl::WriteToMessageParcel(MessageParcel& parcel) 51532a6e48fSopenharmony_ci{ 51632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 51732a6e48fSopenharmony_ci if (handle_ == nullptr) { 51832a6e48fSopenharmony_ci return GSERROR_NOT_INIT; 51932a6e48fSopenharmony_ci } 52032a6e48fSopenharmony_ci bool ret = WriteBufferHandle(parcel, *handle_); 52132a6e48fSopenharmony_ci if (ret == false) { 52232a6e48fSopenharmony_ci return GSERROR_API_FAILED; 52332a6e48fSopenharmony_ci } 52432a6e48fSopenharmony_ci 52532a6e48fSopenharmony_ci return GSERROR_OK; 52632a6e48fSopenharmony_ci} 52732a6e48fSopenharmony_ci 52832a6e48fSopenharmony_ciGSError SurfaceBufferImpl::ReadBufferRequestConfig(MessageParcel& parcel) 52932a6e48fSopenharmony_ci{ 53032a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 53132a6e48fSopenharmony_ci uint32_t colorGamut = 0; 53232a6e48fSopenharmony_ci uint32_t transform = 0; 53332a6e48fSopenharmony_ci if (!parcel.ReadInt32(bufferRequestConfig_.width) || !parcel.ReadInt32(bufferRequestConfig_.height) || 53432a6e48fSopenharmony_ci !parcel.ReadInt32(bufferRequestConfig_.strideAlignment) || !parcel.ReadInt32(bufferRequestConfig_.format) || 53532a6e48fSopenharmony_ci !parcel.ReadUint64(bufferRequestConfig_.usage) || !parcel.ReadInt32(bufferRequestConfig_.timeout) || 53632a6e48fSopenharmony_ci !parcel.ReadUint32(colorGamut) || !parcel.ReadUint32(transform)) { 53732a6e48fSopenharmony_ci BLOGE("parcel read fail, seq: %{public}u.", sequenceNumber_); 53832a6e48fSopenharmony_ci return GSERROR_API_FAILED; 53932a6e48fSopenharmony_ci } 54032a6e48fSopenharmony_ci bufferRequestConfig_.colorGamut = static_cast<GraphicColorGamut>(colorGamut); 54132a6e48fSopenharmony_ci bufferRequestConfig_.transform = static_cast<GraphicTransformType>(transform); 54232a6e48fSopenharmony_ci return GSERROR_OK; 54332a6e48fSopenharmony_ci} 54432a6e48fSopenharmony_ci 54532a6e48fSopenharmony_ciGSError SurfaceBufferImpl::ReadFromMessageParcel(MessageParcel& parcel) 54632a6e48fSopenharmony_ci{ 54732a6e48fSopenharmony_ci auto handle = ReadBufferHandle(parcel); 54832a6e48fSopenharmony_ci SetBufferHandle(handle); 54932a6e48fSopenharmony_ci return handle ? GSERROR_OK : GSERROR_API_FAILED; 55032a6e48fSopenharmony_ci} 55132a6e48fSopenharmony_ci 55232a6e48fSopenharmony_ci// return OH_NativeBuffer* is dangerous, need to refactor 55332a6e48fSopenharmony_ciOH_NativeBuffer* SurfaceBufferImpl::SurfaceBufferToNativeBuffer() 55432a6e48fSopenharmony_ci{ 55532a6e48fSopenharmony_ci return reinterpret_cast<OH_NativeBuffer *>(this); 55632a6e48fSopenharmony_ci} 55732a6e48fSopenharmony_ci 55832a6e48fSopenharmony_ciuint32_t SurfaceBufferImpl::GetSeqNum() const 55932a6e48fSopenharmony_ci{ 56032a6e48fSopenharmony_ci return sequenceNumber_; 56132a6e48fSopenharmony_ci} 56232a6e48fSopenharmony_ci 56332a6e48fSopenharmony_ciGSError SurfaceBufferImpl::CheckBufferConfig(int32_t width, int32_t height, 56432a6e48fSopenharmony_ci int32_t format, uint64_t usage) 56532a6e48fSopenharmony_ci{ 56632a6e48fSopenharmony_ci if (width <= 0 || height <= 0) { 56732a6e48fSopenharmony_ci BLOGE("width %{public}d height %{public}d", width, height); 56832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 56932a6e48fSopenharmony_ci } 57032a6e48fSopenharmony_ci 57132a6e48fSopenharmony_ci if (format < 0 || format > GRAPHIC_PIXEL_FMT_BUTT) { 57232a6e48fSopenharmony_ci BLOGE("format is %{public}d", format); 57332a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 57432a6e48fSopenharmony_ci } 57532a6e48fSopenharmony_ci 57632a6e48fSopenharmony_ci return GSERROR_OK; 57732a6e48fSopenharmony_ci} 57832a6e48fSopenharmony_ci 57932a6e48fSopenharmony_ciBufferWrapper SurfaceBufferImpl::GetBufferWrapper() 58032a6e48fSopenharmony_ci{ 58132a6e48fSopenharmony_ci return {}; 58232a6e48fSopenharmony_ci} 58332a6e48fSopenharmony_ci 58432a6e48fSopenharmony_civoid SurfaceBufferImpl::SetBufferWrapper(BufferWrapper wrapper) {} 58532a6e48fSopenharmony_ci 58632a6e48fSopenharmony_ciGSError SurfaceBufferImpl::SetMetadata(uint32_t key, const std::vector<uint8_t>& value) 58732a6e48fSopenharmony_ci{ 58832a6e48fSopenharmony_ci if (key == 0 || key >= HDI::Display::Graphic::Common::V1_1::ATTRKEY_END) { 58932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 59032a6e48fSopenharmony_ci } 59132a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 59232a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 59332a6e48fSopenharmony_ci return GSERROR_INTERNAL; 59432a6e48fSopenharmony_ci } 59532a6e48fSopenharmony_ci 59632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 59732a6e48fSopenharmony_ci if (handle_ == nullptr) { 59832a6e48fSopenharmony_ci return GSERROR_NOT_INIT; 59932a6e48fSopenharmony_ci } 60032a6e48fSopenharmony_ci 60132a6e48fSopenharmony_ci if (MetaDataCachedLocked(key, value)) { 60232a6e48fSopenharmony_ci return GSERROR_OK; 60332a6e48fSopenharmony_ci } 60432a6e48fSopenharmony_ci 60532a6e48fSopenharmony_ci auto dRet = displayBuffer->SetMetadata(*handle_, key, value); 60632a6e48fSopenharmony_ci if (dRet == GRAPHIC_DISPLAY_SUCCESS) { 60732a6e48fSopenharmony_ci // cache metaData 60832a6e48fSopenharmony_ci metaDataCache_[key] = value; 60932a6e48fSopenharmony_ci return GSERROR_OK; 61032a6e48fSopenharmony_ci } 61132a6e48fSopenharmony_ci BLOGE("SetMetadata Failed with %{public}d", dRet); 61232a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 61332a6e48fSopenharmony_ci} 61432a6e48fSopenharmony_ci 61532a6e48fSopenharmony_ciGSError SurfaceBufferImpl::GetMetadata(uint32_t key, std::vector<uint8_t>& value) 61632a6e48fSopenharmony_ci{ 61732a6e48fSopenharmony_ci if (key == 0 || key >= HDI::Display::Graphic::Common::V1_1::ATTRKEY_END) { 61832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 61932a6e48fSopenharmony_ci } 62032a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 62132a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 62232a6e48fSopenharmony_ci return GSERROR_INTERNAL; 62332a6e48fSopenharmony_ci } 62432a6e48fSopenharmony_ci 62532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 62632a6e48fSopenharmony_ci if (handle_ == nullptr) { 62732a6e48fSopenharmony_ci return GSERROR_NOT_INIT; 62832a6e48fSopenharmony_ci } 62932a6e48fSopenharmony_ci auto dRet = displayBuffer->GetMetadata(*handle_, key, value); 63032a6e48fSopenharmony_ci if (dRet == GRAPHIC_DISPLAY_SUCCESS) { 63132a6e48fSopenharmony_ci return GSERROR_OK; 63232a6e48fSopenharmony_ci } 63332a6e48fSopenharmony_ci BLOGD("GetMetadata Failed with %{public}d", dRet); 63432a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 63532a6e48fSopenharmony_ci} 63632a6e48fSopenharmony_ci 63732a6e48fSopenharmony_ciGSError SurfaceBufferImpl::ListMetadataKeys(std::vector<uint32_t>& keys) 63832a6e48fSopenharmony_ci{ 63932a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 64032a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 64132a6e48fSopenharmony_ci return GSERROR_INTERNAL; 64232a6e48fSopenharmony_ci } 64332a6e48fSopenharmony_ci keys.clear(); 64432a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 64532a6e48fSopenharmony_ci if (handle_ == nullptr) { 64632a6e48fSopenharmony_ci return GSERROR_NOT_INIT; 64732a6e48fSopenharmony_ci } 64832a6e48fSopenharmony_ci auto dRet = displayBuffer->ListMetadataKeys(*handle_, keys); 64932a6e48fSopenharmony_ci if (dRet == GRAPHIC_DISPLAY_SUCCESS) { 65032a6e48fSopenharmony_ci return GSERROR_OK; 65132a6e48fSopenharmony_ci } 65232a6e48fSopenharmony_ci BLOGE("ListMetadataKeys Failed with %{public}d", dRet); 65332a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 65432a6e48fSopenharmony_ci} 65532a6e48fSopenharmony_ci 65632a6e48fSopenharmony_ciGSError SurfaceBufferImpl::EraseMetadataKey(uint32_t key) 65732a6e48fSopenharmony_ci{ 65832a6e48fSopenharmony_ci if (key == 0 || key >= HDI::Display::Graphic::Common::V1_1::ATTRKEY_END) { 65932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 66032a6e48fSopenharmony_ci } 66132a6e48fSopenharmony_ci IDisplayBufferSptr displayBuffer = GetOrResetDisplayBuffer(); 66232a6e48fSopenharmony_ci if (displayBuffer == nullptr) { 66332a6e48fSopenharmony_ci return GSERROR_INTERNAL; 66432a6e48fSopenharmony_ci } 66532a6e48fSopenharmony_ci 66632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 66732a6e48fSopenharmony_ci if (handle_ == nullptr) { 66832a6e48fSopenharmony_ci return GSERROR_NOT_INIT; 66932a6e48fSopenharmony_ci } 67032a6e48fSopenharmony_ci auto dRet = displayBuffer->EraseMetadataKey(*handle_, key); 67132a6e48fSopenharmony_ci if (dRet == GRAPHIC_DISPLAY_SUCCESS) { 67232a6e48fSopenharmony_ci metaDataCache_.erase(key); 67332a6e48fSopenharmony_ci return GSERROR_OK; 67432a6e48fSopenharmony_ci } 67532a6e48fSopenharmony_ci BLOGE("EraseMetadataKey Failed with %{public}d", dRet); 67632a6e48fSopenharmony_ci return GSERROR_HDI_ERROR; 67732a6e48fSopenharmony_ci} 67832a6e48fSopenharmony_ci 67932a6e48fSopenharmony_ciBufferRequestConfig SurfaceBufferImpl::GetBufferRequestConfig() const 68032a6e48fSopenharmony_ci{ 68132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 68232a6e48fSopenharmony_ci return bufferRequestConfig_; 68332a6e48fSopenharmony_ci} 68432a6e48fSopenharmony_ci 68532a6e48fSopenharmony_civoid SurfaceBufferImpl::SetBufferRequestConfig(const BufferRequestConfig& config) 68632a6e48fSopenharmony_ci{ 68732a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 68832a6e48fSopenharmony_ci bufferRequestConfig_ = config; 68932a6e48fSopenharmony_ci} 69032a6e48fSopenharmony_ci 69132a6e48fSopenharmony_civoid SurfaceBufferImpl::SetConsumerAttachBufferFlag(bool value) 69232a6e48fSopenharmony_ci{ 69332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 69432a6e48fSopenharmony_ci isConsumerAttachBufferFlag_ = value; 69532a6e48fSopenharmony_ci} 69632a6e48fSopenharmony_ci 69732a6e48fSopenharmony_cibool SurfaceBufferImpl::GetConsumerAttachBufferFlag() 69832a6e48fSopenharmony_ci{ 69932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 70032a6e48fSopenharmony_ci return isConsumerAttachBufferFlag_; 70132a6e48fSopenharmony_ci} 70232a6e48fSopenharmony_ci} // namespace OHOS 703