132a6e48fSopenharmony_ci/* 232a6e48fSopenharmony_ci * Copyright (c) 2021 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 "producer_surface.h" 1732a6e48fSopenharmony_ci 1832a6e48fSopenharmony_ci#include <cinttypes> 1932a6e48fSopenharmony_ci 2032a6e48fSopenharmony_ci#include "buffer_log.h" 2132a6e48fSopenharmony_ci#include "buffer_extra_data_impl.h" 2232a6e48fSopenharmony_ci#include "buffer_producer_listener.h" 2332a6e48fSopenharmony_ci#include "sync_fence.h" 2432a6e48fSopenharmony_ci#include "native_window.h" 2532a6e48fSopenharmony_ci#include "surface_utils.h" 2632a6e48fSopenharmony_ci#include "metadata_helper.h" 2732a6e48fSopenharmony_ci 2832a6e48fSopenharmony_ciusing namespace OHOS::HDI::Display::Graphic::Common::V1_0; 2932a6e48fSopenharmony_cinamespace OHOS { 3032a6e48fSopenharmony_ciconstexpr int32_t FORCE_GLOBAL_ALPHA_MIN = -1; 3132a6e48fSopenharmony_ciconstexpr int32_t FORCE_GLOBAL_ALPHA_MAX = 255; 3232a6e48fSopenharmony_cisptr<Surface> Surface::CreateSurfaceAsProducer(sptr<IBufferProducer>& producer) 3332a6e48fSopenharmony_ci{ 3432a6e48fSopenharmony_ci if (producer == nullptr) { 3532a6e48fSopenharmony_ci return nullptr; 3632a6e48fSopenharmony_ci } 3732a6e48fSopenharmony_ci 3832a6e48fSopenharmony_ci sptr<ProducerSurface> surf = new ProducerSurface(producer); 3932a6e48fSopenharmony_ci GSError ret = surf->Init(); 4032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 4132a6e48fSopenharmony_ci BLOGE("producer surf init failed"); 4232a6e48fSopenharmony_ci return nullptr; 4332a6e48fSopenharmony_ci } 4432a6e48fSopenharmony_ci auto utils = SurfaceUtils::GetInstance(); 4532a6e48fSopenharmony_ci utils->Add(surf->GetUniqueId(), surf); 4632a6e48fSopenharmony_ci return surf; 4732a6e48fSopenharmony_ci} 4832a6e48fSopenharmony_ci 4932a6e48fSopenharmony_ciProducerSurface::ProducerSurface(sptr<IBufferProducer>& producer) 5032a6e48fSopenharmony_ci{ 5132a6e48fSopenharmony_ci producer_ = producer; 5232a6e48fSopenharmony_ci GetProducerInitInfo(initInfo_); 5332a6e48fSopenharmony_ci windowConfig_.width = initInfo_.width; 5432a6e48fSopenharmony_ci windowConfig_.height = initInfo_.height; 5532a6e48fSopenharmony_ci windowConfig_.usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_DMA; 5632a6e48fSopenharmony_ci windowConfig_.format = GRAPHIC_PIXEL_FMT_RGBA_8888; 5732a6e48fSopenharmony_ci windowConfig_.strideAlignment = 8; // default stride is 8 5832a6e48fSopenharmony_ci windowConfig_.timeout = 3000; // default timeout is 3000 ms 5932a6e48fSopenharmony_ci windowConfig_.colorGamut = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB; 6032a6e48fSopenharmony_ci windowConfig_.transform = GraphicTransformType::GRAPHIC_ROTATE_NONE; 6132a6e48fSopenharmony_ci BLOGD("ProducerSurface ctor"); 6232a6e48fSopenharmony_ci} 6332a6e48fSopenharmony_ci 6432a6e48fSopenharmony_ciProducerSurface::~ProducerSurface() 6532a6e48fSopenharmony_ci{ 6632a6e48fSopenharmony_ci BLOGD("~ProducerSurface dtor, name: %{public}s, uniqueId: %{public}" PRIu64 ".", name_.c_str(), queueId_); 6732a6e48fSopenharmony_ci Disconnect(); 6832a6e48fSopenharmony_ci auto utils = SurfaceUtils::GetInstance(); 6932a6e48fSopenharmony_ci utils->Remove(GetUniqueId()); 7032a6e48fSopenharmony_ci} 7132a6e48fSopenharmony_ci 7232a6e48fSopenharmony_ciGSError ProducerSurface::GetProducerInitInfo(ProducerInitInfo& info) 7332a6e48fSopenharmony_ci{ 7432a6e48fSopenharmony_ci if (producer_ == nullptr) { 7532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 7632a6e48fSopenharmony_ci } 7732a6e48fSopenharmony_ci return producer_->GetProducerInitInfo(info); 7832a6e48fSopenharmony_ci} 7932a6e48fSopenharmony_ci 8032a6e48fSopenharmony_ciGSError ProducerSurface::Init() 8132a6e48fSopenharmony_ci{ 8232a6e48fSopenharmony_ci if (inited_.load()) { 8332a6e48fSopenharmony_ci return GSERROR_OK; 8432a6e48fSopenharmony_ci } 8532a6e48fSopenharmony_ci name_ = initInfo_.name; 8632a6e48fSopenharmony_ci queueId_ = initInfo_.uniqueId; 8732a6e48fSopenharmony_ci inited_.store(true); 8832a6e48fSopenharmony_ci BLOGD("Init name: %{public}s, uniqueId: %{public}" PRIu64 ".", name_.c_str(), queueId_); 8932a6e48fSopenharmony_ci return GSERROR_OK; 9032a6e48fSopenharmony_ci} 9132a6e48fSopenharmony_ci 9232a6e48fSopenharmony_cibool ProducerSurface::IsConsumer() const 9332a6e48fSopenharmony_ci{ 9432a6e48fSopenharmony_ci return false; 9532a6e48fSopenharmony_ci} 9632a6e48fSopenharmony_ci 9732a6e48fSopenharmony_cisptr<IBufferProducer> ProducerSurface::GetProducer() const 9832a6e48fSopenharmony_ci{ 9932a6e48fSopenharmony_ci return producer_; 10032a6e48fSopenharmony_ci} 10132a6e48fSopenharmony_ci 10232a6e48fSopenharmony_ciGSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer, 10332a6e48fSopenharmony_ci sptr<SyncFence>& fence, BufferRequestConfig& config) 10432a6e48fSopenharmony_ci{ 10532a6e48fSopenharmony_ci if (producer_ == nullptr) { 10632a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 10732a6e48fSopenharmony_ci } 10832a6e48fSopenharmony_ci IBufferProducer::RequestBufferReturnValue retval; 10932a6e48fSopenharmony_ci sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl; 11032a6e48fSopenharmony_ci GSError ret; 11132a6e48fSopenharmony_ci { 11232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 11332a6e48fSopenharmony_ci ret = producer_->RequestBuffer(config, bedataimpl, retval); 11432a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 11532a6e48fSopenharmony_ci if (ret == GSERROR_NO_CONSUMER) { 11632a6e48fSopenharmony_ci CleanCacheLocked(false); 11732a6e48fSopenharmony_ci } 11832a6e48fSopenharmony_ci /** 11932a6e48fSopenharmony_ci * if server is connected, but result is failed. 12032a6e48fSopenharmony_ci * client needs to synchronize status. 12132a6e48fSopenharmony_ci */ 12232a6e48fSopenharmony_ci if (retval.isConnected) { 12332a6e48fSopenharmony_ci isDisconnected_ = false; 12432a6e48fSopenharmony_ci } 12532a6e48fSopenharmony_ci BLOGD("RequestBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_); 12632a6e48fSopenharmony_ci return ret; 12732a6e48fSopenharmony_ci } 12832a6e48fSopenharmony_ci isDisconnected_ = false; 12932a6e48fSopenharmony_ci AddCacheLocked(bedataimpl, retval, config); 13032a6e48fSopenharmony_ci } 13132a6e48fSopenharmony_ci buffer = retval.buffer; 13232a6e48fSopenharmony_ci fence = retval.fence; 13332a6e48fSopenharmony_ci 13432a6e48fSopenharmony_ci OutputRequestBufferLog(buffer); 13532a6e48fSopenharmony_ci 13632a6e48fSopenharmony_ci ret = SetMetadataValve(buffer); 13732a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 13832a6e48fSopenharmony_ci BLOGD("SetMetadataValve ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_); 13932a6e48fSopenharmony_ci } 14032a6e48fSopenharmony_ci return ret; 14132a6e48fSopenharmony_ci} 14232a6e48fSopenharmony_ci 14332a6e48fSopenharmony_ciGSError ProducerSurface::SetMetadataValve(sptr<SurfaceBuffer>& buffer) 14432a6e48fSopenharmony_ci{ 14532a6e48fSopenharmony_ci GSError ret = GSERROR_OK; 14632a6e48fSopenharmony_ci std::vector<uint8_t> metaData; 14732a6e48fSopenharmony_ci std::string value = GetUserData("ATTRKEY_COLORSPACE_INFO"); 14832a6e48fSopenharmony_ci if (!value.empty()) { 14932a6e48fSopenharmony_ci ret = MetadataHelper::SetColorSpaceType(buffer, static_cast<CM_ColorSpaceType>(atoi(value.c_str()))); 15032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 15132a6e48fSopenharmony_ci BLOGD("SetColorSpaceType ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_); 15232a6e48fSopenharmony_ci return ret; 15332a6e48fSopenharmony_ci } 15432a6e48fSopenharmony_ci } 15532a6e48fSopenharmony_ci value = GetUserData("OH_HDR_DYNAMIC_METADATA"); 15632a6e48fSopenharmony_ci if (!value.empty()) { 15732a6e48fSopenharmony_ci metaData.resize(value.size()); 15832a6e48fSopenharmony_ci metaData.assign(value.begin(), value.end()); 15932a6e48fSopenharmony_ci ret = MetadataHelper::SetHDRStaticMetadata(buffer, metaData); 16032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 16132a6e48fSopenharmony_ci BLOGD("SetHDRStaticMetadata ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_); 16232a6e48fSopenharmony_ci return ret; 16332a6e48fSopenharmony_ci } 16432a6e48fSopenharmony_ci } 16532a6e48fSopenharmony_ci value = GetUserData("OH_HDR_STATIC_METADATA"); 16632a6e48fSopenharmony_ci if (!value.empty()) { 16732a6e48fSopenharmony_ci metaData.resize(value.size()); 16832a6e48fSopenharmony_ci metaData.assign(value.begin(), value.end()); 16932a6e48fSopenharmony_ci ret = MetadataHelper::SetHDRStaticMetadata(buffer, metaData); 17032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 17132a6e48fSopenharmony_ci BLOGD("SetHDRStaticMetadata ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_); 17232a6e48fSopenharmony_ci return ret; 17332a6e48fSopenharmony_ci } 17432a6e48fSopenharmony_ci } 17532a6e48fSopenharmony_ci value = GetUserData("OH_HDR_METADATA_TYPE"); 17632a6e48fSopenharmony_ci if (!value.empty()) { 17732a6e48fSopenharmony_ci ret = MetadataHelper::SetHDRMetadataType(buffer, static_cast<CM_HDR_Metadata_Type>(atoi(value.c_str()))); 17832a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 17932a6e48fSopenharmony_ci BLOGD("SetHDRMetadataType ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_); 18032a6e48fSopenharmony_ci } 18132a6e48fSopenharmony_ci } 18232a6e48fSopenharmony_ci return ret; 18332a6e48fSopenharmony_ci} 18432a6e48fSopenharmony_ci 18532a6e48fSopenharmony_civoid ProducerSurface::OutputRequestBufferLog(sptr<SurfaceBuffer>& buffer) 18632a6e48fSopenharmony_ci{ 18732a6e48fSopenharmony_ci if (name_ != "RosenWeb") { 18832a6e48fSopenharmony_ci return; 18932a6e48fSopenharmony_ci } 19032a6e48fSopenharmony_ci 19132a6e48fSopenharmony_ci static uint64_t fdRec[1024] = { 0 }; 19232a6e48fSopenharmony_ci int32_t fd = buffer->GetBufferHandle()->fd; 19332a6e48fSopenharmony_ci int32_t fdTmp = fd < 1024 ? fd : fd % 1024; 19432a6e48fSopenharmony_ci 19532a6e48fSopenharmony_ci if (fdRec[fdTmp] != queueId_) { 19632a6e48fSopenharmony_ci BLOGD("RequestBuffer, surfaceId %{public}" PRIu64 ", bufferFd: %{public}d.", queueId_, fd); 19732a6e48fSopenharmony_ci fdRec[fdTmp] = queueId_; 19832a6e48fSopenharmony_ci } 19932a6e48fSopenharmony_ci} 20032a6e48fSopenharmony_ci 20132a6e48fSopenharmony_ciGSError ProducerSurface::AddCacheLocked(sptr<BufferExtraData>& bedataimpl, 20232a6e48fSopenharmony_ci IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config) 20332a6e48fSopenharmony_ci{ 20432a6e48fSopenharmony_ci // add cache 20532a6e48fSopenharmony_ci if (retval.buffer != nullptr) { 20632a6e48fSopenharmony_ci bufferProducerCache_[retval.sequence] = retval.buffer; 20732a6e48fSopenharmony_ci } else { 20832a6e48fSopenharmony_ci auto it = bufferProducerCache_.find(retval.sequence); 20932a6e48fSopenharmony_ci if (it == bufferProducerCache_.end()) { 21032a6e48fSopenharmony_ci BLOGE("cache not find buffer(%{public}u), uniqueId: %{public}" PRIu64 ".", retval.sequence, queueId_); 21132a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 21232a6e48fSopenharmony_ci } else { 21332a6e48fSopenharmony_ci retval.buffer = it->second; 21432a6e48fSopenharmony_ci } 21532a6e48fSopenharmony_ci } 21632a6e48fSopenharmony_ci if (retval.buffer != nullptr) { 21732a6e48fSopenharmony_ci retval.buffer->SetSurfaceBufferColorGamut(config.colorGamut); 21832a6e48fSopenharmony_ci retval.buffer->SetSurfaceBufferTransform(config.transform); 21932a6e48fSopenharmony_ci retval.buffer->SetExtraData(bedataimpl); 22032a6e48fSopenharmony_ci } 22132a6e48fSopenharmony_ci for (auto it = retval.deletingBuffers.begin(); it != retval.deletingBuffers.end(); it++) { 22232a6e48fSopenharmony_ci uint32_t seqNum = static_cast<uint32_t>(*it); 22332a6e48fSopenharmony_ci bufferProducerCache_.erase(seqNum); 22432a6e48fSopenharmony_ci auto spNativeWindow = wpNativeWindow_.promote(); 22532a6e48fSopenharmony_ci if (spNativeWindow != nullptr) { 22632a6e48fSopenharmony_ci auto& bufferCache = spNativeWindow->bufferCache_; 22732a6e48fSopenharmony_ci auto iter = bufferCache.find(seqNum); 22832a6e48fSopenharmony_ci if (iter != bufferCache.end()) { 22932a6e48fSopenharmony_ci NativeObjectUnreference(iter->second); 23032a6e48fSopenharmony_ci bufferCache.erase(iter); 23132a6e48fSopenharmony_ci } 23232a6e48fSopenharmony_ci } 23332a6e48fSopenharmony_ci } 23432a6e48fSopenharmony_ci return SURFACE_ERROR_OK; 23532a6e48fSopenharmony_ci} 23632a6e48fSopenharmony_ci 23732a6e48fSopenharmony_ciGSError ProducerSurface::RequestBuffers(std::vector<sptr<SurfaceBuffer>>& buffers, 23832a6e48fSopenharmony_ci std::vector<sptr<SyncFence>>& fences, BufferRequestConfig& config) 23932a6e48fSopenharmony_ci{ 24032a6e48fSopenharmony_ci if (producer_ == nullptr) { 24132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 24232a6e48fSopenharmony_ci } 24332a6e48fSopenharmony_ci std::vector<IBufferProducer::RequestBufferReturnValue> retvalues; 24432a6e48fSopenharmony_ci retvalues.resize(SURFACE_MAX_QUEUE_SIZE); 24532a6e48fSopenharmony_ci std::vector<sptr<BufferExtraData>> bedataimpls; 24632a6e48fSopenharmony_ci for (size_t i = 0; i < retvalues.size(); ++i) { 24732a6e48fSopenharmony_ci sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl; 24832a6e48fSopenharmony_ci bedataimpls.emplace_back(bedataimpl); 24932a6e48fSopenharmony_ci } 25032a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 25132a6e48fSopenharmony_ci GSError ret = producer_->RequestBuffers(config, bedataimpls, retvalues); 25232a6e48fSopenharmony_ci if (ret != GSERROR_NO_BUFFER && ret != GSERROR_OK) { 25332a6e48fSopenharmony_ci /** 25432a6e48fSopenharmony_ci * if server is connected, but result is failed. 25532a6e48fSopenharmony_ci * client needs to synchronize status. 25632a6e48fSopenharmony_ci */ 25732a6e48fSopenharmony_ci if (retvalues[0].isConnected) { 25832a6e48fSopenharmony_ci isDisconnected_ = false; 25932a6e48fSopenharmony_ci } 26032a6e48fSopenharmony_ci BLOGD("RequestBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_); 26132a6e48fSopenharmony_ci return ret; 26232a6e48fSopenharmony_ci } 26332a6e48fSopenharmony_ci isDisconnected_ = false; 26432a6e48fSopenharmony_ci for (size_t i = 0; i < retvalues.size(); ++i) { 26532a6e48fSopenharmony_ci AddCacheLocked(bedataimpls[i], retvalues[i], config); 26632a6e48fSopenharmony_ci buffers.emplace_back(retvalues[i].buffer); 26732a6e48fSopenharmony_ci fences.emplace_back(retvalues[i].fence); 26832a6e48fSopenharmony_ci } 26932a6e48fSopenharmony_ci return GSERROR_OK; 27032a6e48fSopenharmony_ci} 27132a6e48fSopenharmony_ci 27232a6e48fSopenharmony_ciGSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, 27332a6e48fSopenharmony_ci const sptr<SyncFence>& fence, BufferFlushConfig& config) 27432a6e48fSopenharmony_ci{ 27532a6e48fSopenharmony_ci BufferFlushConfigWithDamages configWithDamages; 27632a6e48fSopenharmony_ci configWithDamages.damages.push_back(config.damage); 27732a6e48fSopenharmony_ci configWithDamages.timestamp = config.timestamp; 27832a6e48fSopenharmony_ci configWithDamages.desiredPresentTimestamp = config.desiredPresentTimestamp; 27932a6e48fSopenharmony_ci return FlushBuffer(buffer, fence, configWithDamages); 28032a6e48fSopenharmony_ci} 28132a6e48fSopenharmony_ci 28232a6e48fSopenharmony_ciGSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence, 28332a6e48fSopenharmony_ci BufferFlushConfigWithDamages& config) 28432a6e48fSopenharmony_ci{ 28532a6e48fSopenharmony_ci if (buffer == nullptr || fence == nullptr || producer_ == nullptr) { 28632a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 28732a6e48fSopenharmony_ci } 28832a6e48fSopenharmony_ci 28932a6e48fSopenharmony_ci sptr<BufferExtraData> bedata = buffer->GetExtraData(); 29032a6e48fSopenharmony_ci if (bedata == nullptr) { 29132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 29232a6e48fSopenharmony_ci } 29332a6e48fSopenharmony_ci auto ret = producer_->FlushBuffer(buffer->GetSeqNum(), bedata, fence, config); 29432a6e48fSopenharmony_ci if (ret == GSERROR_NO_CONSUMER) { 29532a6e48fSopenharmony_ci CleanCache(); 29632a6e48fSopenharmony_ci BLOGD("FlushBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_); 29732a6e48fSopenharmony_ci } 29832a6e48fSopenharmony_ci return ret; 29932a6e48fSopenharmony_ci} 30032a6e48fSopenharmony_ci 30132a6e48fSopenharmony_ciGSError ProducerSurface::FlushBuffers(const std::vector<sptr<SurfaceBuffer>>& buffers, 30232a6e48fSopenharmony_ci const std::vector<sptr<SyncFence>>& fences, const std::vector<BufferFlushConfigWithDamages>& configs) 30332a6e48fSopenharmony_ci{ 30432a6e48fSopenharmony_ci if (buffers.size() == 0 || buffers.size() != fences.size() || producer_ == nullptr) { 30532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 30632a6e48fSopenharmony_ci } 30732a6e48fSopenharmony_ci for (size_t i = 0; i < buffers.size(); ++i) { 30832a6e48fSopenharmony_ci if (buffers[i] == nullptr || fences[i] == nullptr) { 30932a6e48fSopenharmony_ci BLOGE("buffer or fence is nullptr, i: %{public}zu, uniqueId: %{public}" PRIu64 ".", i, queueId_); 31032a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 31132a6e48fSopenharmony_ci } 31232a6e48fSopenharmony_ci } 31332a6e48fSopenharmony_ci std::vector<sptr<BufferExtraData>> bedata; 31432a6e48fSopenharmony_ci bedata.reserve(buffers.size()); 31532a6e48fSopenharmony_ci std::vector<uint32_t> sequences; 31632a6e48fSopenharmony_ci sequences.reserve(buffers.size()); 31732a6e48fSopenharmony_ci for (uint32_t i = 0; i < buffers.size(); ++i) { 31832a6e48fSopenharmony_ci bedata.emplace_back(buffers[i]->GetExtraData()); 31932a6e48fSopenharmony_ci sequences.emplace_back(buffers[i]->GetSeqNum()); 32032a6e48fSopenharmony_ci } 32132a6e48fSopenharmony_ci auto ret = producer_->FlushBuffers(sequences, bedata, fences, configs); 32232a6e48fSopenharmony_ci if (ret == GSERROR_NO_CONSUMER) { 32332a6e48fSopenharmony_ci CleanCache(); 32432a6e48fSopenharmony_ci BLOGD("FlushBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_); 32532a6e48fSopenharmony_ci } 32632a6e48fSopenharmony_ci return ret; 32732a6e48fSopenharmony_ci} 32832a6e48fSopenharmony_ci 32932a6e48fSopenharmony_ciGSError ProducerSurface::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, 33032a6e48fSopenharmony_ci sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix) 33132a6e48fSopenharmony_ci{ 33232a6e48fSopenharmony_ci if (producer_ == nullptr) { 33332a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 33432a6e48fSopenharmony_ci } 33532a6e48fSopenharmony_ci return producer_->GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix); 33632a6e48fSopenharmony_ci} 33732a6e48fSopenharmony_ci 33832a6e48fSopenharmony_ciGSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer, 33932a6e48fSopenharmony_ci int32_t& fence, BufferRequestConfig& config) 34032a6e48fSopenharmony_ci{ 34132a6e48fSopenharmony_ci sptr<SyncFence> syncFence = SyncFence::InvalidFence(); 34232a6e48fSopenharmony_ci auto ret = RequestBuffer(buffer, syncFence, config); 34332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 34432a6e48fSopenharmony_ci fence = -1; 34532a6e48fSopenharmony_ci return ret; 34632a6e48fSopenharmony_ci } 34732a6e48fSopenharmony_ci fence = syncFence->Dup(); 34832a6e48fSopenharmony_ci return GSERROR_OK; 34932a6e48fSopenharmony_ci} 35032a6e48fSopenharmony_ci 35132a6e48fSopenharmony_ciGSError ProducerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer) 35232a6e48fSopenharmony_ci{ 35332a6e48fSopenharmony_ci if (buffer == nullptr || producer_ == nullptr) { 35432a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 35532a6e48fSopenharmony_ci } 35632a6e48fSopenharmony_ci 35732a6e48fSopenharmony_ci sptr<BufferExtraData> bedata = buffer->GetExtraData(); 35832a6e48fSopenharmony_ci if (bedata == nullptr) { 35932a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 36032a6e48fSopenharmony_ci } 36132a6e48fSopenharmony_ci return producer_->CancelBuffer(buffer->GetSeqNum(), bedata); 36232a6e48fSopenharmony_ci} 36332a6e48fSopenharmony_ci 36432a6e48fSopenharmony_ciGSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, 36532a6e48fSopenharmony_ci int32_t fence, BufferFlushConfig& config) 36632a6e48fSopenharmony_ci{ 36732a6e48fSopenharmony_ci sptr<SyncFence> syncFence = new SyncFence(fence); 36832a6e48fSopenharmony_ci return FlushBuffer(buffer, syncFence, config); 36932a6e48fSopenharmony_ci} 37032a6e48fSopenharmony_ci 37132a6e48fSopenharmony_ciGSError ProducerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer) 37232a6e48fSopenharmony_ci{ 37332a6e48fSopenharmony_ci if (buffer == nullptr || producer_ == nullptr) { 37432a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 37532a6e48fSopenharmony_ci } 37632a6e48fSopenharmony_ci auto ret = producer_->AttachBufferToQueue(buffer); 37732a6e48fSopenharmony_ci if (ret == GSERROR_OK) { 37832a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 37932a6e48fSopenharmony_ci if (bufferProducerCache_.find(buffer->GetSeqNum()) != bufferProducerCache_.end()) { 38032a6e48fSopenharmony_ci BLOGE("Attach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_); 38132a6e48fSopenharmony_ci return SURFACE_ERROR_BUFFER_IS_INCACHE; 38232a6e48fSopenharmony_ci } 38332a6e48fSopenharmony_ci bufferProducerCache_[buffer->GetSeqNum()] = buffer; 38432a6e48fSopenharmony_ci } 38532a6e48fSopenharmony_ci return ret; 38632a6e48fSopenharmony_ci} 38732a6e48fSopenharmony_ci 38832a6e48fSopenharmony_ciGSError ProducerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer) 38932a6e48fSopenharmony_ci{ 39032a6e48fSopenharmony_ci if (buffer == nullptr || producer_ == nullptr) { 39132a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 39232a6e48fSopenharmony_ci } 39332a6e48fSopenharmony_ci auto ret = producer_->DetachBufferFromQueue(buffer); 39432a6e48fSopenharmony_ci if (ret == GSERROR_OK) { 39532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 39632a6e48fSopenharmony_ci auto it = bufferProducerCache_.find(buffer->GetSeqNum()); 39732a6e48fSopenharmony_ci if (it == bufferProducerCache_.end()) { 39832a6e48fSopenharmony_ci BLOGE("Detach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_); 39932a6e48fSopenharmony_ci return SURFACE_ERROR_BUFFER_NOT_INCACHE; 40032a6e48fSopenharmony_ci } 40132a6e48fSopenharmony_ci bufferProducerCache_.erase(it); 40232a6e48fSopenharmony_ci } 40332a6e48fSopenharmony_ci return ret; 40432a6e48fSopenharmony_ci} 40532a6e48fSopenharmony_ci 40632a6e48fSopenharmony_ciGSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer) 40732a6e48fSopenharmony_ci{ 40832a6e48fSopenharmony_ci if (buffer == nullptr || producer_ == nullptr) { 40932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 41032a6e48fSopenharmony_ci } 41132a6e48fSopenharmony_ci 41232a6e48fSopenharmony_ci return producer_->AttachBuffer(buffer); 41332a6e48fSopenharmony_ci} 41432a6e48fSopenharmony_ci 41532a6e48fSopenharmony_ciGSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut) 41632a6e48fSopenharmony_ci{ 41732a6e48fSopenharmony_ci if (buffer == nullptr || producer_ == nullptr) { 41832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 41932a6e48fSopenharmony_ci } 42032a6e48fSopenharmony_ci 42132a6e48fSopenharmony_ci return producer_->AttachBuffer(buffer, timeOut); 42232a6e48fSopenharmony_ci} 42332a6e48fSopenharmony_ci 42432a6e48fSopenharmony_ciGSError ProducerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer) 42532a6e48fSopenharmony_ci{ 42632a6e48fSopenharmony_ci if (buffer == nullptr || producer_ == nullptr) { 42732a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 42832a6e48fSopenharmony_ci } 42932a6e48fSopenharmony_ci return producer_->DetachBuffer(buffer); 43032a6e48fSopenharmony_ci} 43132a6e48fSopenharmony_ci 43232a6e48fSopenharmony_ciGSError ProducerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client) 43332a6e48fSopenharmony_ci{ 43432a6e48fSopenharmony_ci if (client == nullptr) { 43532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 43632a6e48fSopenharmony_ci } 43732a6e48fSopenharmony_ci sptr<ProducerSurfaceDelegator> surfaceDelegator = ProducerSurfaceDelegator::Create(); 43832a6e48fSopenharmony_ci if (surfaceDelegator == nullptr) { 43932a6e48fSopenharmony_ci BLOGE("surfaceDelegator is nullptr"); 44032a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 44132a6e48fSopenharmony_ci } 44232a6e48fSopenharmony_ci if (!surfaceDelegator->SetClient(client)) { 44332a6e48fSopenharmony_ci BLOGE("SetClient failed"); 44432a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 44532a6e48fSopenharmony_ci } 44632a6e48fSopenharmony_ci 44732a6e48fSopenharmony_ci surfaceDelegator->SetSurface(this); 44832a6e48fSopenharmony_ci { 44932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(delegatorMutex_); 45032a6e48fSopenharmony_ci wpPSurfaceDelegator_ = surfaceDelegator; 45132a6e48fSopenharmony_ci } 45232a6e48fSopenharmony_ci 45332a6e48fSopenharmony_ci auto releaseBufferCallBack = [weakThis = wptr(this)] (const sptr<SurfaceBuffer>& buffer, 45432a6e48fSopenharmony_ci const sptr<SyncFence>& fence) -> GSError { 45532a6e48fSopenharmony_ci auto pSurface = weakThis.promote(); 45632a6e48fSopenharmony_ci if (pSurface == nullptr) { 45732a6e48fSopenharmony_ci BLOGE("pSurface is nullptr"); 45832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 45932a6e48fSopenharmony_ci } 46032a6e48fSopenharmony_ci sptr<ProducerSurfaceDelegator> surfaceDelegator = nullptr; 46132a6e48fSopenharmony_ci { 46232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(pSurface->delegatorMutex_); 46332a6e48fSopenharmony_ci surfaceDelegator = pSurface->wpPSurfaceDelegator_.promote(); 46432a6e48fSopenharmony_ci } 46532a6e48fSopenharmony_ci if (surfaceDelegator == nullptr) { 46632a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 46732a6e48fSopenharmony_ci } 46832a6e48fSopenharmony_ci int error = surfaceDelegator->ReleaseBuffer(buffer, fence); 46932a6e48fSopenharmony_ci return static_cast<GSError>(error); 47032a6e48fSopenharmony_ci }; 47132a6e48fSopenharmony_ci RegisterReleaseListener(releaseBufferCallBack); 47232a6e48fSopenharmony_ci return GSERROR_OK; 47332a6e48fSopenharmony_ci} 47432a6e48fSopenharmony_ci 47532a6e48fSopenharmony_cibool ProducerSurface::QueryIfBufferAvailable() 47632a6e48fSopenharmony_ci{ 47732a6e48fSopenharmony_ci return false; 47832a6e48fSopenharmony_ci} 47932a6e48fSopenharmony_ci 48032a6e48fSopenharmony_ciuint32_t ProducerSurface::GetQueueSize() 48132a6e48fSopenharmony_ci{ 48232a6e48fSopenharmony_ci if (producer_ == nullptr) { 48332a6e48fSopenharmony_ci return 0; 48432a6e48fSopenharmony_ci } 48532a6e48fSopenharmony_ci return producer_->GetQueueSize(); 48632a6e48fSopenharmony_ci} 48732a6e48fSopenharmony_ci 48832a6e48fSopenharmony_ciGSError ProducerSurface::SetQueueSize(uint32_t queueSize) 48932a6e48fSopenharmony_ci{ 49032a6e48fSopenharmony_ci if (producer_ == nullptr) { 49132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 49232a6e48fSopenharmony_ci } 49332a6e48fSopenharmony_ci return producer_->SetQueueSize(queueSize); 49432a6e48fSopenharmony_ci} 49532a6e48fSopenharmony_ci 49632a6e48fSopenharmony_ciconst std::string& ProducerSurface::GetName() 49732a6e48fSopenharmony_ci{ 49832a6e48fSopenharmony_ci if (!inited_.load()) { 49932a6e48fSopenharmony_ci BLOGW("ProducerSurface is not initialized."); 50032a6e48fSopenharmony_ci } 50132a6e48fSopenharmony_ci return name_; 50232a6e48fSopenharmony_ci} 50332a6e48fSopenharmony_ci 50432a6e48fSopenharmony_ciint32_t ProducerSurface::GetDefaultWidth() 50532a6e48fSopenharmony_ci{ 50632a6e48fSopenharmony_ci if (producer_ == nullptr) { 50732a6e48fSopenharmony_ci return -1; 50832a6e48fSopenharmony_ci } 50932a6e48fSopenharmony_ci return producer_->GetDefaultWidth(); 51032a6e48fSopenharmony_ci} 51132a6e48fSopenharmony_ci 51232a6e48fSopenharmony_ciint32_t ProducerSurface::GetDefaultHeight() 51332a6e48fSopenharmony_ci{ 51432a6e48fSopenharmony_ci if (producer_ == nullptr) { 51532a6e48fSopenharmony_ci return -1; 51632a6e48fSopenharmony_ci } 51732a6e48fSopenharmony_ci return producer_->GetDefaultHeight(); 51832a6e48fSopenharmony_ci} 51932a6e48fSopenharmony_ci 52032a6e48fSopenharmony_ciGraphicTransformType ProducerSurface::GetTransformHint() const 52132a6e48fSopenharmony_ci{ 52232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 52332a6e48fSopenharmony_ci return lastSetTransformHint_; 52432a6e48fSopenharmony_ci} 52532a6e48fSopenharmony_ci 52632a6e48fSopenharmony_ciGSError ProducerSurface::SetTransformHint(GraphicTransformType transformHint) 52732a6e48fSopenharmony_ci{ 52832a6e48fSopenharmony_ci if (producer_ == nullptr) { 52932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 53032a6e48fSopenharmony_ci } 53132a6e48fSopenharmony_ci GSError err = producer_->SetTransformHint(transformHint); 53232a6e48fSopenharmony_ci if (err == GSERROR_OK) { 53332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 53432a6e48fSopenharmony_ci lastSetTransformHint_ = transformHint; 53532a6e48fSopenharmony_ci } 53632a6e48fSopenharmony_ci return err; 53732a6e48fSopenharmony_ci} 53832a6e48fSopenharmony_ci 53932a6e48fSopenharmony_ciGSError ProducerSurface::SetDefaultUsage(uint64_t usage) 54032a6e48fSopenharmony_ci{ 54132a6e48fSopenharmony_ci if (producer_ == nullptr) { 54232a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 54332a6e48fSopenharmony_ci } 54432a6e48fSopenharmony_ci return producer_->SetDefaultUsage(usage); 54532a6e48fSopenharmony_ci} 54632a6e48fSopenharmony_ci 54732a6e48fSopenharmony_ciuint64_t ProducerSurface::GetDefaultUsage() 54832a6e48fSopenharmony_ci{ 54932a6e48fSopenharmony_ci if (producer_ == nullptr) { 55032a6e48fSopenharmony_ci return 0; 55132a6e48fSopenharmony_ci } 55232a6e48fSopenharmony_ci return producer_->GetDefaultUsage(); 55332a6e48fSopenharmony_ci} 55432a6e48fSopenharmony_ci 55532a6e48fSopenharmony_ciGSError ProducerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType) 55632a6e48fSopenharmony_ci{ 55732a6e48fSopenharmony_ci if (producer_ == nullptr) { 55832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 55932a6e48fSopenharmony_ci } 56032a6e48fSopenharmony_ci return producer_->SetSurfaceSourceType(sourceType); 56132a6e48fSopenharmony_ci} 56232a6e48fSopenharmony_ci 56332a6e48fSopenharmony_ciOHSurfaceSource ProducerSurface::GetSurfaceSourceType() const 56432a6e48fSopenharmony_ci{ 56532a6e48fSopenharmony_ci if (producer_ == nullptr) { 56632a6e48fSopenharmony_ci return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT; 56732a6e48fSopenharmony_ci } 56832a6e48fSopenharmony_ci OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT; 56932a6e48fSopenharmony_ci if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) { 57032a6e48fSopenharmony_ci BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", queueId_); 57132a6e48fSopenharmony_ci return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT; 57232a6e48fSopenharmony_ci } 57332a6e48fSopenharmony_ci return sourceType; 57432a6e48fSopenharmony_ci} 57532a6e48fSopenharmony_ci 57632a6e48fSopenharmony_ciGSError ProducerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType) 57732a6e48fSopenharmony_ci{ 57832a6e48fSopenharmony_ci if (producer_ == nullptr) { 57932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 58032a6e48fSopenharmony_ci } 58132a6e48fSopenharmony_ci return producer_->SetSurfaceAppFrameworkType(appFrameworkType); 58232a6e48fSopenharmony_ci} 58332a6e48fSopenharmony_ci 58432a6e48fSopenharmony_cistd::string ProducerSurface::GetSurfaceAppFrameworkType() const 58532a6e48fSopenharmony_ci{ 58632a6e48fSopenharmony_ci if (producer_ == nullptr) { 58732a6e48fSopenharmony_ci return ""; 58832a6e48fSopenharmony_ci } 58932a6e48fSopenharmony_ci std::string appFrameworkType = ""; 59032a6e48fSopenharmony_ci if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) { 59132a6e48fSopenharmony_ci BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", queueId_); 59232a6e48fSopenharmony_ci return ""; 59332a6e48fSopenharmony_ci } 59432a6e48fSopenharmony_ci return appFrameworkType; 59532a6e48fSopenharmony_ci} 59632a6e48fSopenharmony_ci 59732a6e48fSopenharmony_ciGSError ProducerSurface::SetUserData(const std::string& key, const std::string& val) 59832a6e48fSopenharmony_ci{ 59932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(lockMutex_); 60032a6e48fSopenharmony_ci if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) { 60132a6e48fSopenharmony_ci BLOGE("userData_ size out: %{public}zu, uniqueId: %{public}" PRIu64 ".", userData_.size(), queueId_); 60232a6e48fSopenharmony_ci return GSERROR_OUT_OF_RANGE; 60332a6e48fSopenharmony_ci } 60432a6e48fSopenharmony_ci 60532a6e48fSopenharmony_ci auto iterUserData = userData_.find(key); 60632a6e48fSopenharmony_ci if (iterUserData != userData_.end() && iterUserData->second == val) { 60732a6e48fSopenharmony_ci return GSERROR_API_FAILED; 60832a6e48fSopenharmony_ci } 60932a6e48fSopenharmony_ci 61032a6e48fSopenharmony_ci userData_[key] = val; 61132a6e48fSopenharmony_ci auto iter = onUserDataChange_.begin(); 61232a6e48fSopenharmony_ci while (iter != onUserDataChange_.end()) { 61332a6e48fSopenharmony_ci if (iter->second != nullptr) { 61432a6e48fSopenharmony_ci iter->second(key, val); 61532a6e48fSopenharmony_ci } 61632a6e48fSopenharmony_ci iter++; 61732a6e48fSopenharmony_ci } 61832a6e48fSopenharmony_ci 61932a6e48fSopenharmony_ci return GSERROR_OK; 62032a6e48fSopenharmony_ci} 62132a6e48fSopenharmony_ci 62232a6e48fSopenharmony_cistd::string ProducerSurface::GetUserData(const std::string& key) 62332a6e48fSopenharmony_ci{ 62432a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(lockMutex_); 62532a6e48fSopenharmony_ci if (userData_.find(key) != userData_.end()) { 62632a6e48fSopenharmony_ci return userData_[key]; 62732a6e48fSopenharmony_ci } 62832a6e48fSopenharmony_ci 62932a6e48fSopenharmony_ci return ""; 63032a6e48fSopenharmony_ci} 63132a6e48fSopenharmony_ci 63232a6e48fSopenharmony_ciGSError ProducerSurface::RegisterReleaseListener(OnReleaseFunc func) 63332a6e48fSopenharmony_ci{ 63432a6e48fSopenharmony_ci if (func == nullptr || producer_ == nullptr) { 63532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 63632a6e48fSopenharmony_ci } 63732a6e48fSopenharmony_ci sptr<IProducerListener> listener; 63832a6e48fSopenharmony_ci { 63932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(listenerMutex_); 64032a6e48fSopenharmony_ci listener_ = new BufferReleaseProducerListener(func); 64132a6e48fSopenharmony_ci listener = listener_; 64232a6e48fSopenharmony_ci } 64332a6e48fSopenharmony_ci return producer_->RegisterReleaseListener(listener); 64432a6e48fSopenharmony_ci} 64532a6e48fSopenharmony_ci 64632a6e48fSopenharmony_ciGSError ProducerSurface::RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence) 64732a6e48fSopenharmony_ci{ 64832a6e48fSopenharmony_ci if (funcWithFence == nullptr || producer_ == nullptr) { 64932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 65032a6e48fSopenharmony_ci } 65132a6e48fSopenharmony_ci sptr<IProducerListener> listener; 65232a6e48fSopenharmony_ci { 65332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(listenerMutex_); 65432a6e48fSopenharmony_ci listener_ = new BufferReleaseProducerListener(nullptr, funcWithFence); 65532a6e48fSopenharmony_ci listener = listener_; 65632a6e48fSopenharmony_ci } 65732a6e48fSopenharmony_ci return producer_->RegisterReleaseListener(listener); 65832a6e48fSopenharmony_ci} 65932a6e48fSopenharmony_ci 66032a6e48fSopenharmony_ciGSError ProducerSurface::UnRegisterReleaseListener() 66132a6e48fSopenharmony_ci{ 66232a6e48fSopenharmony_ci if (producer_ == nullptr) { 66332a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 66432a6e48fSopenharmony_ci } 66532a6e48fSopenharmony_ci { 66632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(delegatorMutex_); 66732a6e48fSopenharmony_ci wpPSurfaceDelegator_ = nullptr; 66832a6e48fSopenharmony_ci } 66932a6e48fSopenharmony_ci { 67032a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(listenerMutex_); 67132a6e48fSopenharmony_ci if (listener_ != nullptr) { 67232a6e48fSopenharmony_ci listener_->ResetReleaseFunc(); 67332a6e48fSopenharmony_ci } 67432a6e48fSopenharmony_ci } 67532a6e48fSopenharmony_ci return producer_->UnRegisterReleaseListener(); 67632a6e48fSopenharmony_ci} 67732a6e48fSopenharmony_ci 67832a6e48fSopenharmony_ciGSError ProducerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw) 67932a6e48fSopenharmony_ci{ 68032a6e48fSopenharmony_ci return GSERROR_NOT_SUPPORT; 68132a6e48fSopenharmony_ci} 68232a6e48fSopenharmony_ci 68332a6e48fSopenharmony_ciGSError ProducerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func) 68432a6e48fSopenharmony_ci{ 68532a6e48fSopenharmony_ci if (func == nullptr) { 68632a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 68732a6e48fSopenharmony_ci } 68832a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(lockMutex_); 68932a6e48fSopenharmony_ci if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) { 69032a6e48fSopenharmony_ci BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".", 69132a6e48fSopenharmony_ci funcName.c_str(), queueId_); 69232a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 69332a6e48fSopenharmony_ci } 69432a6e48fSopenharmony_ci 69532a6e48fSopenharmony_ci onUserDataChange_[funcName] = func; 69632a6e48fSopenharmony_ci return GSERROR_OK; 69732a6e48fSopenharmony_ci} 69832a6e48fSopenharmony_ci 69932a6e48fSopenharmony_ciGSError ProducerSurface::UnRegisterUserDataChangeListener(const std::string& funcName) 70032a6e48fSopenharmony_ci{ 70132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(lockMutex_); 70232a6e48fSopenharmony_ci if (onUserDataChange_.erase(funcName) == 0) { 70332a6e48fSopenharmony_ci BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".", funcName.c_str(), queueId_); 70432a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 70532a6e48fSopenharmony_ci } 70632a6e48fSopenharmony_ci 70732a6e48fSopenharmony_ci return GSERROR_OK; 70832a6e48fSopenharmony_ci} 70932a6e48fSopenharmony_ci 71032a6e48fSopenharmony_ciGSError ProducerSurface::ClearUserDataChangeListener() 71132a6e48fSopenharmony_ci{ 71232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(lockMutex_); 71332a6e48fSopenharmony_ci onUserDataChange_.clear(); 71432a6e48fSopenharmony_ci return GSERROR_OK; 71532a6e48fSopenharmony_ci} 71632a6e48fSopenharmony_ci 71732a6e48fSopenharmony_cibool ProducerSurface::IsRemote() 71832a6e48fSopenharmony_ci{ 71932a6e48fSopenharmony_ci if (producer_ == nullptr || producer_->AsObject() == nullptr) { 72032a6e48fSopenharmony_ci return false; 72132a6e48fSopenharmony_ci } 72232a6e48fSopenharmony_ci return producer_->AsObject()->IsProxyObject(); 72332a6e48fSopenharmony_ci} 72432a6e48fSopenharmony_ci 72532a6e48fSopenharmony_civoid ProducerSurface::CleanAllLocked() 72632a6e48fSopenharmony_ci{ 72732a6e48fSopenharmony_ci bufferProducerCache_.clear(); 72832a6e48fSopenharmony_ci auto spNativeWindow = wpNativeWindow_.promote(); 72932a6e48fSopenharmony_ci if (spNativeWindow != nullptr) { 73032a6e48fSopenharmony_ci auto& bufferCache = spNativeWindow->bufferCache_; 73132a6e48fSopenharmony_ci for (auto& [seqNum, buffer] : bufferCache) { 73232a6e48fSopenharmony_ci NativeObjectUnreference(buffer); 73332a6e48fSopenharmony_ci } 73432a6e48fSopenharmony_ci bufferCache.clear(); 73532a6e48fSopenharmony_ci } 73632a6e48fSopenharmony_ci} 73732a6e48fSopenharmony_ci 73832a6e48fSopenharmony_ciGSError ProducerSurface::CleanCacheLocked(bool cleanAll) 73932a6e48fSopenharmony_ci{ 74032a6e48fSopenharmony_ci BLOGD("CleanCacheLocked, uniqueId: %{public}" PRIu64 ".", queueId_); 74132a6e48fSopenharmony_ci CleanAllLocked(); 74232a6e48fSopenharmony_ci return producer_->CleanCache(cleanAll); 74332a6e48fSopenharmony_ci} 74432a6e48fSopenharmony_ci 74532a6e48fSopenharmony_ciGSError ProducerSurface::CleanCache(bool cleanAll) 74632a6e48fSopenharmony_ci{ 74732a6e48fSopenharmony_ci if (producer_ == nullptr) { 74832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 74932a6e48fSopenharmony_ci } 75032a6e48fSopenharmony_ci BLOGD("CleanCache, uniqueId: %{public}" PRIu64 ".", queueId_); 75132a6e48fSopenharmony_ci { 75232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 75332a6e48fSopenharmony_ci CleanAllLocked(); 75432a6e48fSopenharmony_ci } 75532a6e48fSopenharmony_ci return producer_->CleanCache(cleanAll); 75632a6e48fSopenharmony_ci} 75732a6e48fSopenharmony_ci 75832a6e48fSopenharmony_ciGSError ProducerSurface::GoBackground() 75932a6e48fSopenharmony_ci{ 76032a6e48fSopenharmony_ci if (producer_ == nullptr) { 76132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 76232a6e48fSopenharmony_ci } 76332a6e48fSopenharmony_ci BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", queueId_); 76432a6e48fSopenharmony_ci { 76532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 76632a6e48fSopenharmony_ci CleanAllLocked(); 76732a6e48fSopenharmony_ci } 76832a6e48fSopenharmony_ci return producer_->GoBackground(); 76932a6e48fSopenharmony_ci} 77032a6e48fSopenharmony_ci 77132a6e48fSopenharmony_ciuint64_t ProducerSurface::GetUniqueId() const 77232a6e48fSopenharmony_ci{ 77332a6e48fSopenharmony_ci if (!inited_.load()) { 77432a6e48fSopenharmony_ci BLOGW("ProducerSurface is not initialized."); 77532a6e48fSopenharmony_ci } 77632a6e48fSopenharmony_ci return queueId_; 77732a6e48fSopenharmony_ci} 77832a6e48fSopenharmony_ci 77932a6e48fSopenharmony_ciGSError ProducerSurface::SetTransform(GraphicTransformType transform) 78032a6e48fSopenharmony_ci{ 78132a6e48fSopenharmony_ci if (producer_ == nullptr) { 78232a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 78332a6e48fSopenharmony_ci } 78432a6e48fSopenharmony_ci return producer_->SetTransform(transform); 78532a6e48fSopenharmony_ci} 78632a6e48fSopenharmony_ci 78732a6e48fSopenharmony_ciGraphicTransformType ProducerSurface::GetTransform() const 78832a6e48fSopenharmony_ci{ 78932a6e48fSopenharmony_ci if (producer_ == nullptr) { 79032a6e48fSopenharmony_ci return GraphicTransformType::GRAPHIC_ROTATE_BUTT; 79132a6e48fSopenharmony_ci } 79232a6e48fSopenharmony_ci GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT; 79332a6e48fSopenharmony_ci if (producer_->GetTransform(transform) != GSERROR_OK) { 79432a6e48fSopenharmony_ci BLOGE("GetTransform failed, uniqueId: %{public}" PRIu64 ".", queueId_); 79532a6e48fSopenharmony_ci return GraphicTransformType::GRAPHIC_ROTATE_BUTT; 79632a6e48fSopenharmony_ci } 79732a6e48fSopenharmony_ci return transform; 79832a6e48fSopenharmony_ci} 79932a6e48fSopenharmony_ci 80032a6e48fSopenharmony_ciGSError ProducerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo>& infos, 80132a6e48fSopenharmony_ci std::vector<bool>& supporteds) 80232a6e48fSopenharmony_ci{ 80332a6e48fSopenharmony_ci if (producer_ == nullptr || infos.size() == 0 || infos.size() != supporteds.size()) { 80432a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 80532a6e48fSopenharmony_ci } 80632a6e48fSopenharmony_ci return producer_->IsSupportedAlloc(infos, supporteds); 80732a6e48fSopenharmony_ci} 80832a6e48fSopenharmony_ci 80932a6e48fSopenharmony_ciGSError ProducerSurface::Connect() 81032a6e48fSopenharmony_ci{ 81132a6e48fSopenharmony_ci if (producer_ == nullptr) { 81232a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 81332a6e48fSopenharmony_ci } 81432a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 81532a6e48fSopenharmony_ci if (!isDisconnected_) { 81632a6e48fSopenharmony_ci BLOGE("Surface has been connect, uniqueId: %{public}" PRIu64 ".", queueId_); 81732a6e48fSopenharmony_ci return SURFACE_ERROR_CONSUMER_IS_CONNECTED; 81832a6e48fSopenharmony_ci } 81932a6e48fSopenharmony_ci BLOGD("Connect, uniqueId: %{public}" PRIu64 ".", queueId_); 82032a6e48fSopenharmony_ci GSError ret = producer_->Connect(); 82132a6e48fSopenharmony_ci if (ret == GSERROR_OK) { 82232a6e48fSopenharmony_ci isDisconnected_ = false; 82332a6e48fSopenharmony_ci } 82432a6e48fSopenharmony_ci return ret; 82532a6e48fSopenharmony_ci} 82632a6e48fSopenharmony_ci 82732a6e48fSopenharmony_ciGSError ProducerSurface::Disconnect() 82832a6e48fSopenharmony_ci{ 82932a6e48fSopenharmony_ci if (producer_ == nullptr) { 83032a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 83132a6e48fSopenharmony_ci } 83232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 83332a6e48fSopenharmony_ci if (isDisconnected_) { 83432a6e48fSopenharmony_ci BLOGD("Surface is disconnect, uniqueId: %{public}" PRIu64 ".", queueId_); 83532a6e48fSopenharmony_ci return SURFACE_ERROR_CONSUMER_DISCONNECTED; 83632a6e48fSopenharmony_ci } 83732a6e48fSopenharmony_ci BLOGD("Disconnect, uniqueId: %{public}" PRIu64 ".", queueId_); 83832a6e48fSopenharmony_ci CleanAllLocked(); 83932a6e48fSopenharmony_ci GSError ret = producer_->Disconnect(); 84032a6e48fSopenharmony_ci if (ret == GSERROR_OK) { 84132a6e48fSopenharmony_ci isDisconnected_ = true; 84232a6e48fSopenharmony_ci } 84332a6e48fSopenharmony_ci return ret; 84432a6e48fSopenharmony_ci} 84532a6e48fSopenharmony_ci 84632a6e48fSopenharmony_ciGSError ProducerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode) 84732a6e48fSopenharmony_ci{ 84832a6e48fSopenharmony_ci if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE || 84932a6e48fSopenharmony_ci scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) { 85032a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 85132a6e48fSopenharmony_ci } 85232a6e48fSopenharmony_ci return producer_->SetScalingMode(sequence, scalingMode); 85332a6e48fSopenharmony_ci} 85432a6e48fSopenharmony_ci 85532a6e48fSopenharmony_ciGSError ProducerSurface::SetScalingMode(ScalingMode scalingMode) 85632a6e48fSopenharmony_ci{ 85732a6e48fSopenharmony_ci if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE || 85832a6e48fSopenharmony_ci scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) { 85932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 86032a6e48fSopenharmony_ci } 86132a6e48fSopenharmony_ci return producer_->SetScalingMode(scalingMode); 86232a6e48fSopenharmony_ci} 86332a6e48fSopenharmony_ci 86432a6e48fSopenharmony_civoid ProducerSurface::SetBufferHold(bool hold) 86532a6e48fSopenharmony_ci{ 86632a6e48fSopenharmony_ci if (producer_ == nullptr) { 86732a6e48fSopenharmony_ci return; 86832a6e48fSopenharmony_ci } 86932a6e48fSopenharmony_ci producer_->SetBufferHold(hold); 87032a6e48fSopenharmony_ci} 87132a6e48fSopenharmony_ci 87232a6e48fSopenharmony_ciGSError ProducerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData) 87332a6e48fSopenharmony_ci{ 87432a6e48fSopenharmony_ci if (producer_ == nullptr || metaData.size() == 0) { 87532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 87632a6e48fSopenharmony_ci } 87732a6e48fSopenharmony_ci return producer_->SetMetaData(sequence, metaData); 87832a6e48fSopenharmony_ci} 87932a6e48fSopenharmony_ci 88032a6e48fSopenharmony_ciGSError ProducerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key, 88132a6e48fSopenharmony_ci const std::vector<uint8_t>& metaData) 88232a6e48fSopenharmony_ci{ 88332a6e48fSopenharmony_ci if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X || 88432a6e48fSopenharmony_ci key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) { 88532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 88632a6e48fSopenharmony_ci } 88732a6e48fSopenharmony_ci return producer_->SetMetaDataSet(sequence, key, metaData); 88832a6e48fSopenharmony_ci} 88932a6e48fSopenharmony_ci 89032a6e48fSopenharmony_ciGSError ProducerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle) 89132a6e48fSopenharmony_ci{ 89232a6e48fSopenharmony_ci if (producer_ == nullptr) { 89332a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 89432a6e48fSopenharmony_ci } 89532a6e48fSopenharmony_ci return producer_->SetTunnelHandle(handle); 89632a6e48fSopenharmony_ci} 89732a6e48fSopenharmony_ci 89832a6e48fSopenharmony_ciGSError ProducerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, 89932a6e48fSopenharmony_ci int64_t& time) const 90032a6e48fSopenharmony_ci{ 90132a6e48fSopenharmony_ci if (producer_ == nullptr || type <= GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED || 90232a6e48fSopenharmony_ci type > GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP) { 90332a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 90432a6e48fSopenharmony_ci } 90532a6e48fSopenharmony_ci return producer_->GetPresentTimestamp(sequence, type, time); 90632a6e48fSopenharmony_ci} 90732a6e48fSopenharmony_ci 90832a6e48fSopenharmony_ciGSError ProducerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow) 90932a6e48fSopenharmony_ci{ 91032a6e48fSopenharmony_ci if (nativeWindow == nullptr) { 91132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 91232a6e48fSopenharmony_ci } 91332a6e48fSopenharmony_ci NativeWindow *nw = reinterpret_cast<NativeWindow *>(nativeWindow); 91432a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 91532a6e48fSopenharmony_ci wpNativeWindow_ = nw; 91632a6e48fSopenharmony_ci return GSERROR_OK; 91732a6e48fSopenharmony_ci} 91832a6e48fSopenharmony_ci 91932a6e48fSopenharmony_civoid ProducerSurface::SetRequestWidthAndHeight(int32_t width, int32_t height) 92032a6e48fSopenharmony_ci{ 92132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 92232a6e48fSopenharmony_ci requestWidth_ = width; 92332a6e48fSopenharmony_ci requestHeight_ = height; 92432a6e48fSopenharmony_ci} 92532a6e48fSopenharmony_ci 92632a6e48fSopenharmony_ciint32_t ProducerSurface::GetRequestWidth() 92732a6e48fSopenharmony_ci{ 92832a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 92932a6e48fSopenharmony_ci return requestWidth_; 93032a6e48fSopenharmony_ci} 93132a6e48fSopenharmony_ci 93232a6e48fSopenharmony_ciint32_t ProducerSurface::GetRequestHeight() 93332a6e48fSopenharmony_ci{ 93432a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 93532a6e48fSopenharmony_ci return requestHeight_; 93632a6e48fSopenharmony_ci} 93732a6e48fSopenharmony_ci 93832a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfig(const BufferRequestConfig& config) 93932a6e48fSopenharmony_ci{ 94032a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 94132a6e48fSopenharmony_ci windowConfig_ = config; 94232a6e48fSopenharmony_ci} 94332a6e48fSopenharmony_ci 94432a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigWidthAndHeight(int32_t width, int32_t height) 94532a6e48fSopenharmony_ci{ 94632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 94732a6e48fSopenharmony_ci windowConfig_.width = width; 94832a6e48fSopenharmony_ci windowConfig_.height = height; 94932a6e48fSopenharmony_ci} 95032a6e48fSopenharmony_ci 95132a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigStride(int32_t stride) 95232a6e48fSopenharmony_ci{ 95332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 95432a6e48fSopenharmony_ci windowConfig_.strideAlignment = stride; 95532a6e48fSopenharmony_ci} 95632a6e48fSopenharmony_ci 95732a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigFormat(int32_t format) 95832a6e48fSopenharmony_ci{ 95932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 96032a6e48fSopenharmony_ci windowConfig_.format = format; 96132a6e48fSopenharmony_ci} 96232a6e48fSopenharmony_ci 96332a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigUsage(uint64_t usage) 96432a6e48fSopenharmony_ci{ 96532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 96632a6e48fSopenharmony_ci windowConfig_.usage = usage; 96732a6e48fSopenharmony_ci} 96832a6e48fSopenharmony_ci 96932a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigTimeout(int32_t timeout) 97032a6e48fSopenharmony_ci{ 97132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 97232a6e48fSopenharmony_ci windowConfig_.timeout = timeout; 97332a6e48fSopenharmony_ci} 97432a6e48fSopenharmony_ci 97532a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigColorGamut(GraphicColorGamut colorGamut) 97632a6e48fSopenharmony_ci{ 97732a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 97832a6e48fSopenharmony_ci windowConfig_.colorGamut = colorGamut; 97932a6e48fSopenharmony_ci} 98032a6e48fSopenharmony_ci 98132a6e48fSopenharmony_civoid ProducerSurface::SetWindowConfigTransform(GraphicTransformType transform) 98232a6e48fSopenharmony_ci{ 98332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 98432a6e48fSopenharmony_ci windowConfig_.transform = transform; 98532a6e48fSopenharmony_ci} 98632a6e48fSopenharmony_ci 98732a6e48fSopenharmony_ciBufferRequestConfig ProducerSurface::GetWindowConfig() 98832a6e48fSopenharmony_ci{ 98932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 99032a6e48fSopenharmony_ci return windowConfig_; 99132a6e48fSopenharmony_ci} 99232a6e48fSopenharmony_ci 99332a6e48fSopenharmony_ciGSError ProducerSurface::SetHdrWhitePointBrightness(float brightness) 99432a6e48fSopenharmony_ci{ 99532a6e48fSopenharmony_ci if (producer_ == nullptr) { 99632a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 99732a6e48fSopenharmony_ci } 99832a6e48fSopenharmony_ci if (brightness < 0.0 || brightness > 1.0) { 99932a6e48fSopenharmony_ci BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_); 100032a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 100132a6e48fSopenharmony_ci } 100232a6e48fSopenharmony_ci return producer_->SetHdrWhitePointBrightness(brightness); 100332a6e48fSopenharmony_ci} 100432a6e48fSopenharmony_ci 100532a6e48fSopenharmony_ciGSError ProducerSurface::SetSdrWhitePointBrightness(float brightness) 100632a6e48fSopenharmony_ci{ 100732a6e48fSopenharmony_ci if (producer_ == nullptr) { 100832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 100932a6e48fSopenharmony_ci } 101032a6e48fSopenharmony_ci if (brightness < 0.0 || brightness > 1.0) { 101132a6e48fSopenharmony_ci BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_); 101232a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 101332a6e48fSopenharmony_ci } 101432a6e48fSopenharmony_ci return producer_->SetSdrWhitePointBrightness(brightness); 101532a6e48fSopenharmony_ci} 101632a6e48fSopenharmony_ci 101732a6e48fSopenharmony_ciGSError ProducerSurface::AcquireLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence, 101832a6e48fSopenharmony_ci float matrix[16], uint32_t matrixSize, bool isUseNewMatrix) 101932a6e48fSopenharmony_ci{ 102032a6e48fSopenharmony_ci if (producer_ == nullptr) { 102132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 102232a6e48fSopenharmony_ci } 102332a6e48fSopenharmony_ci return producer_->AcquireLastFlushedBuffer(buffer, fence, matrix, matrixSize, isUseNewMatrix); 102432a6e48fSopenharmony_ci} 102532a6e48fSopenharmony_ci 102632a6e48fSopenharmony_ciGSError ProducerSurface::ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer) 102732a6e48fSopenharmony_ci{ 102832a6e48fSopenharmony_ci if (buffer == nullptr || producer_ == nullptr) { 102932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 103032a6e48fSopenharmony_ci } 103132a6e48fSopenharmony_ci return producer_->ReleaseLastFlushedBuffer(buffer->GetSeqNum()); 103232a6e48fSopenharmony_ci} 103332a6e48fSopenharmony_ci 103432a6e48fSopenharmony_ciGSError ProducerSurface::SetGlobalAlpha(int32_t alpha) 103532a6e48fSopenharmony_ci{ 103632a6e48fSopenharmony_ci if (producer_ == nullptr || alpha < FORCE_GLOBAL_ALPHA_MIN || alpha > FORCE_GLOBAL_ALPHA_MAX) { 103732a6e48fSopenharmony_ci BLOGE("Invalid producer global alpha value: %{public}d, queueId: %{public}" PRIu64 ".", alpha, queueId_); 103832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 103932a6e48fSopenharmony_ci } 104032a6e48fSopenharmony_ci return producer_->SetGlobalAlpha(alpha); 104132a6e48fSopenharmony_ci} 104232a6e48fSopenharmony_ci} // namespace OHOS 1043