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 "buffer_queue_producer.h" 1732a6e48fSopenharmony_ci 1832a6e48fSopenharmony_ci#include <cinttypes> 1932a6e48fSopenharmony_ci#include <mutex> 2032a6e48fSopenharmony_ci#include <set> 2132a6e48fSopenharmony_ci 2232a6e48fSopenharmony_ci#include "buffer_extra_data_impl.h" 2332a6e48fSopenharmony_ci#include "buffer_log.h" 2432a6e48fSopenharmony_ci#include "buffer_producer_listener.h" 2532a6e48fSopenharmony_ci#include "buffer_utils.h" 2632a6e48fSopenharmony_ci#include "frame_report.h" 2732a6e48fSopenharmony_ci#include "sync_fence.h" 2832a6e48fSopenharmony_ci 2932a6e48fSopenharmony_ci#define BUFFER_PRODUCER_API_FUNC_PAIR(apiSequenceNum, func) \ 3032a6e48fSopenharmony_ci {apiSequenceNum, [](BufferQueueProducer *that, MessageParcel &arguments, MessageParcel &reply, \ 3132a6e48fSopenharmony_ci MessageOption &option){return that->func(arguments, reply, option);}} \ 3232a6e48fSopenharmony_ci 3332a6e48fSopenharmony_cinamespace OHOS { 3432a6e48fSopenharmony_cinamespace { 3532a6e48fSopenharmony_ciconstexpr int32_t BUFFER_MATRIX_SIZE = 16; 3632a6e48fSopenharmony_ci} // namespace 3732a6e48fSopenharmony_ci 3832a6e48fSopenharmony_ciBufferQueueProducer::BufferQueueProducer(sptr<BufferQueue> bufferQueue) 3932a6e48fSopenharmony_ci : producerSurfaceDeathRecipient_(new ProducerSurfaceDeathRecipient(this)) 4032a6e48fSopenharmony_ci{ 4132a6e48fSopenharmony_ci bufferQueue_ = std::move(bufferQueue); 4232a6e48fSopenharmony_ci if (bufferQueue_ != nullptr) { 4332a6e48fSopenharmony_ci bufferQueue_->GetName(name_); 4432a6e48fSopenharmony_ci uniqueId_ = bufferQueue_->GetUniqueId(); 4532a6e48fSopenharmony_ci } 4632a6e48fSopenharmony_ci memberFuncMap_ = { 4732a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_INIT_INFO, GetProducerInitInfoRemote), 4832a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REQUEST_BUFFER, RequestBufferRemote), 4932a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REQUEST_BUFFERS, RequestBuffersRemote), 5032a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CANCEL_BUFFER, CancelBufferRemote), 5132a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_FLUSH_BUFFER, FlushBufferRemote), 5232a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_FLUSH_BUFFERS, FlushBuffersRemote), 5332a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ATTACH_BUFFER, AttachBufferRemote), 5432a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DETACH_BUFFER, DetachBufferRemote), 5532a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_QUEUE_SIZE, GetQueueSizeRemote), 5632a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_QUEUE_SIZE, SetQueueSizeRemote), 5732a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_NAME, GetNameRemote), 5832a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, GetDefaultWidthRemote), 5932a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, GetDefaultHeightRemote), 6032a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_DEFAULT_USAGE, GetDefaultUsageRemote), 6132a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_UNIQUE_ID, GetUniqueIdRemote), 6232a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CLEAN_CACHE, CleanCacheRemote), 6332a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, RegisterReleaseListenerRemote), 6432a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TRANSFORM, SetTransformRemote), 6532a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_IS_SUPPORTED_ALLOC, IsSupportedAllocRemote), 6632a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, GetNameAndUniqueIdRemote), 6732a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DISCONNECT, DisconnectRemote), 6832a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_CONNECT, ConnectRemote), 6932a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SCALING_MODE, SetScalingModeRemote), 7032a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_METADATA, SetMetaDataRemote), 7132a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_METADATASET, SetMetaDataSetRemote), 7232a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, SetTunnelHandleRemote), 7332a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GO_BACKGROUND, GoBackgroundRemote), 7432a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, GetPresentTimestampRemote), 7532a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, UnRegisterReleaseListenerRemote), 7632a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER, GetLastFlushedBufferRemote), 7732a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_TRANSFORM, GetTransformRemote), 7832a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, AttachBufferToQueueRemote), 7932a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, DetachBufferFromQueueRemote), 8032a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_DEFAULT_USAGE, SetDefaultUsageRemote), 8132a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_TRANSFORMHINT, GetTransformHintRemote), 8232a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_TRANSFORMHINT, SetTransformHintRemote), 8332a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_BUFFER_HOLD, SetBufferHoldRemote), 8432a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SCALING_MODEV2, SetScalingModeV2Remote), 8532a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_SOURCE_TYPE, SetSurfaceSourceTypeRemote), 8632a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_SOURCE_TYPE, GetSurfaceSourceTypeRemote), 8732a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, SetSurfaceAppFrameworkTypeRemote), 8832a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, GetSurfaceAppFrameworkTypeRemote), 8932a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR( 9032a6e48fSopenharmony_ci BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, SetHdrWhitePointBrightnessRemote), 9132a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR( 9232a6e48fSopenharmony_ci BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, SetSdrWhitePointBrightnessRemote), 9332a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER, AcquireLastFlushedBufferRemote), 9432a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, ReleaseLastFlushedBufferRemote), 9532a6e48fSopenharmony_ci BUFFER_PRODUCER_API_FUNC_PAIR(BUFFER_PRODUCER_SET_GLOBALALPHA, SetGlobalAlphaRemote), 9632a6e48fSopenharmony_ci }; 9732a6e48fSopenharmony_ci} 9832a6e48fSopenharmony_ci 9932a6e48fSopenharmony_ciBufferQueueProducer::~BufferQueueProducer() 10032a6e48fSopenharmony_ci{ 10132a6e48fSopenharmony_ci if (token_ && producerSurfaceDeathRecipient_) { 10232a6e48fSopenharmony_ci token_->RemoveDeathRecipient(producerSurfaceDeathRecipient_); 10332a6e48fSopenharmony_ci token_ = nullptr; 10432a6e48fSopenharmony_ci } 10532a6e48fSopenharmony_ci} 10632a6e48fSopenharmony_ci 10732a6e48fSopenharmony_ciGSError BufferQueueProducer::CheckConnectLocked() 10832a6e48fSopenharmony_ci{ 10932a6e48fSopenharmony_ci if (connectedPid_ == 0) { 11032a6e48fSopenharmony_ci BLOGW("no connections, uniqueId: %{public}" PRIu64 ".", uniqueId_); 11132a6e48fSopenharmony_ci return SURFACE_ERROR_CONSUMER_DISCONNECTED; 11232a6e48fSopenharmony_ci } 11332a6e48fSopenharmony_ci 11432a6e48fSopenharmony_ci if (connectedPid_ != GetCallingPid()) { 11532a6e48fSopenharmony_ci BLOGW("connected by: %{public}d, uniqueId: %{public}" PRIu64 ".", connectedPid_, uniqueId_); 11632a6e48fSopenharmony_ci return SURFACE_ERROR_CONSUMER_IS_CONNECTED; 11732a6e48fSopenharmony_ci } 11832a6e48fSopenharmony_ci 11932a6e48fSopenharmony_ci return GSERROR_OK; 12032a6e48fSopenharmony_ci} 12132a6e48fSopenharmony_ci 12232a6e48fSopenharmony_ciint32_t BufferQueueProducer::OnRemoteRequest(uint32_t code, MessageParcel &arguments, 12332a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &option) 12432a6e48fSopenharmony_ci{ 12532a6e48fSopenharmony_ci auto it = memberFuncMap_.find(code); 12632a6e48fSopenharmony_ci if (it == memberFuncMap_.end()) { 12732a6e48fSopenharmony_ci BLOGE("cannot process %{public}u", code); 12832a6e48fSopenharmony_ci return IPCObjectStub::OnRemoteRequest(code, arguments, reply, option); 12932a6e48fSopenharmony_ci } 13032a6e48fSopenharmony_ci 13132a6e48fSopenharmony_ci if (it->second == nullptr) { 13232a6e48fSopenharmony_ci BLOGE("memberFuncMap_[%{public}u] is nullptr", code); 13332a6e48fSopenharmony_ci return ERR_NONE; 13432a6e48fSopenharmony_ci } 13532a6e48fSopenharmony_ci 13632a6e48fSopenharmony_ci auto remoteDescriptor = arguments.ReadInterfaceToken(); 13732a6e48fSopenharmony_ci if (GetDescriptor() != remoteDescriptor) { 13832a6e48fSopenharmony_ci return ERR_INVALID_STATE; 13932a6e48fSopenharmony_ci } 14032a6e48fSopenharmony_ci 14132a6e48fSopenharmony_ci auto ret = it->second(this, arguments, reply, option); 14232a6e48fSopenharmony_ci return ret; 14332a6e48fSopenharmony_ci} 14432a6e48fSopenharmony_ci 14532a6e48fSopenharmony_ciint32_t BufferQueueProducer::RequestBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 14632a6e48fSopenharmony_ci{ 14732a6e48fSopenharmony_ci RequestBufferReturnValue retval; 14832a6e48fSopenharmony_ci sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl; 14932a6e48fSopenharmony_ci BufferRequestConfig config = {}; 15032a6e48fSopenharmony_ci int64_t startTimeNs = 0; 15132a6e48fSopenharmony_ci int64_t endTimeNs = 0; 15232a6e48fSopenharmony_ci bool isActiveGame = false; 15332a6e48fSopenharmony_ci int32_t connectedPid = 0; 15432a6e48fSopenharmony_ci { 15532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 15632a6e48fSopenharmony_ci connectedPid = connectedPid_; 15732a6e48fSopenharmony_ci } 15832a6e48fSopenharmony_ci isActiveGame = Rosen::FrameReport::GetInstance().IsActiveGameWithPid(connectedPid); 15932a6e48fSopenharmony_ci if (isActiveGame) { 16032a6e48fSopenharmony_ci startTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>( 16132a6e48fSopenharmony_ci std::chrono::steady_clock::now().time_since_epoch()).count(); 16232a6e48fSopenharmony_ci } 16332a6e48fSopenharmony_ci 16432a6e48fSopenharmony_ci ReadRequestConfig(arguments, config); 16532a6e48fSopenharmony_ci 16632a6e48fSopenharmony_ci GSError sRet = RequestBuffer(config, bedataimpl, retval); 16732a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 16832a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 16932a6e48fSopenharmony_ci } 17032a6e48fSopenharmony_ci if (sRet == GSERROR_OK && 17132a6e48fSopenharmony_ci (WriteSurfaceBufferImpl(reply, retval.sequence, retval.buffer) != GSERROR_OK || 17232a6e48fSopenharmony_ci bedataimpl->WriteToParcel(reply) != GSERROR_OK || !retval.fence->WriteToMessageParcel(reply) || 17332a6e48fSopenharmony_ci !reply.WriteUInt32Vector(retval.deletingBuffers))) { 17432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 17532a6e48fSopenharmony_ci } else if (sRet != GSERROR_OK && !reply.WriteBool(retval.isConnected)) { 17632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 17732a6e48fSopenharmony_ci } 17832a6e48fSopenharmony_ci 17932a6e48fSopenharmony_ci if (isActiveGame) { 18032a6e48fSopenharmony_ci endTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>( 18132a6e48fSopenharmony_ci std::chrono::steady_clock::now().time_since_epoch()).count(); 18232a6e48fSopenharmony_ci Rosen::FrameReport::GetInstance().SetDequeueBufferTime(name_, (endTimeNs - startTimeNs)); 18332a6e48fSopenharmony_ci } 18432a6e48fSopenharmony_ci 18532a6e48fSopenharmony_ci return ERR_NONE; 18632a6e48fSopenharmony_ci} 18732a6e48fSopenharmony_ci 18832a6e48fSopenharmony_ciint32_t BufferQueueProducer::RequestBuffersRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 18932a6e48fSopenharmony_ci{ 19032a6e48fSopenharmony_ci std::vector<RequestBufferReturnValue> retvalues; 19132a6e48fSopenharmony_ci std::vector<sptr<BufferExtraData>> bedataimpls; 19232a6e48fSopenharmony_ci BufferRequestConfig config = {}; 19332a6e48fSopenharmony_ci uint32_t num = 0; 19432a6e48fSopenharmony_ci 19532a6e48fSopenharmony_ci arguments.ReadUint32(num); 19632a6e48fSopenharmony_ci ReadRequestConfig(arguments, config); 19732a6e48fSopenharmony_ci if (num == 0 || num > SURFACE_MAX_QUEUE_SIZE) { 19832a6e48fSopenharmony_ci return ERR_NONE; 19932a6e48fSopenharmony_ci } 20032a6e48fSopenharmony_ci retvalues.resize(num); 20132a6e48fSopenharmony_ci bedataimpls.reserve(num); 20232a6e48fSopenharmony_ci 20332a6e48fSopenharmony_ci for (uint32_t i = 0; i < num; ++i) { 20432a6e48fSopenharmony_ci sptr<BufferExtraData> data = new BufferExtraDataImpl; 20532a6e48fSopenharmony_ci bedataimpls.emplace_back(data); 20632a6e48fSopenharmony_ci } 20732a6e48fSopenharmony_ci GSError sRet = RequestBuffers(config, bedataimpls, retvalues); 20832a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 20932a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 21032a6e48fSopenharmony_ci } 21132a6e48fSopenharmony_ci if (sRet == GSERROR_OK || sRet == GSERROR_NO_BUFFER) { 21232a6e48fSopenharmony_ci num = static_cast<uint32_t>(retvalues.size()); 21332a6e48fSopenharmony_ci if (!reply.WriteUint32(num)) { 21432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 21532a6e48fSopenharmony_ci } 21632a6e48fSopenharmony_ci for (uint32_t i = 0; i < num; ++i) { 21732a6e48fSopenharmony_ci if (WriteSurfaceBufferImpl(reply, retvalues[i].sequence, retvalues[i].buffer) != GSERROR_OK || 21832a6e48fSopenharmony_ci bedataimpls[i]->WriteToParcel(reply) != GSERROR_OK || 21932a6e48fSopenharmony_ci !retvalues[i].fence->WriteToMessageParcel(reply) || 22032a6e48fSopenharmony_ci !reply.WriteUInt32Vector(retvalues[i].deletingBuffers)) { 22132a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 22232a6e48fSopenharmony_ci } 22332a6e48fSopenharmony_ci } 22432a6e48fSopenharmony_ci } else if (sRet != GSERROR_OK && !reply.WriteBool(retvalues[0].isConnected)) { 22532a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 22632a6e48fSopenharmony_ci } 22732a6e48fSopenharmony_ci return ERR_NONE; 22832a6e48fSopenharmony_ci} 22932a6e48fSopenharmony_ci 23032a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetProducerInitInfoRemote(MessageParcel &arguments, 23132a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &option) 23232a6e48fSopenharmony_ci{ 23332a6e48fSopenharmony_ci ProducerInitInfo info; 23432a6e48fSopenharmony_ci sptr<IRemoteObject> token = arguments.ReadRemoteObject(); 23532a6e48fSopenharmony_ci if (token == nullptr || !arguments.ReadString(info.appName)) { 23632a6e48fSopenharmony_ci if (!reply.WriteInt32(GSERROR_INVALID_ARGUMENTS)) { 23732a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 23832a6e48fSopenharmony_ci } 23932a6e48fSopenharmony_ci return ERR_INVALID_DATA; 24032a6e48fSopenharmony_ci } 24132a6e48fSopenharmony_ci (void)GetProducerInitInfo(info); 24232a6e48fSopenharmony_ci if (!reply.WriteInt32(info.width) || !reply.WriteInt32(info.height) || !reply.WriteUint64(info.uniqueId) || 24332a6e48fSopenharmony_ci !reply.WriteString(info.name) || !reply.WriteBool(info.isInHebcList)) { 24432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 24532a6e48fSopenharmony_ci } 24632a6e48fSopenharmony_ci 24732a6e48fSopenharmony_ci bool result = HandleDeathRecipient(token); 24832a6e48fSopenharmony_ci if (!reply.WriteInt32(result ? GSERROR_OK : SURFACE_ERROR_UNKOWN)) { 24932a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 25032a6e48fSopenharmony_ci } 25132a6e48fSopenharmony_ci return ERR_NONE; 25232a6e48fSopenharmony_ci} 25332a6e48fSopenharmony_ci 25432a6e48fSopenharmony_ciint32_t BufferQueueProducer::CancelBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 25532a6e48fSopenharmony_ci{ 25632a6e48fSopenharmony_ci uint32_t sequence; 25732a6e48fSopenharmony_ci sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl; 25832a6e48fSopenharmony_ci 25932a6e48fSopenharmony_ci sequence = arguments.ReadUint32(); 26032a6e48fSopenharmony_ci if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) { 26132a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 26232a6e48fSopenharmony_ci } 26332a6e48fSopenharmony_ci 26432a6e48fSopenharmony_ci GSError sRet = CancelBuffer(sequence, bedataimpl); 26532a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 26632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 26732a6e48fSopenharmony_ci } 26832a6e48fSopenharmony_ci return ERR_NONE; 26932a6e48fSopenharmony_ci} 27032a6e48fSopenharmony_ci 27132a6e48fSopenharmony_ciint32_t BufferQueueProducer::FlushBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 27232a6e48fSopenharmony_ci{ 27332a6e48fSopenharmony_ci uint32_t sequence; 27432a6e48fSopenharmony_ci BufferFlushConfigWithDamages config; 27532a6e48fSopenharmony_ci sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl; 27632a6e48fSopenharmony_ci int64_t startTimeNs = 0; 27732a6e48fSopenharmony_ci int64_t endTimeNs = 0; 27832a6e48fSopenharmony_ci bool isActiveGame = false; 27932a6e48fSopenharmony_ci int32_t connectedPid = 0; 28032a6e48fSopenharmony_ci { 28132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 28232a6e48fSopenharmony_ci connectedPid = connectedPid_; 28332a6e48fSopenharmony_ci } 28432a6e48fSopenharmony_ci isActiveGame = Rosen::FrameReport::GetInstance().IsActiveGameWithPid(connectedPid); 28532a6e48fSopenharmony_ci if (isActiveGame) { 28632a6e48fSopenharmony_ci startTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>( 28732a6e48fSopenharmony_ci std::chrono::steady_clock::now().time_since_epoch()).count(); 28832a6e48fSopenharmony_ci } 28932a6e48fSopenharmony_ci 29032a6e48fSopenharmony_ci sequence = arguments.ReadUint32(); 29132a6e48fSopenharmony_ci if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) { 29232a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 29332a6e48fSopenharmony_ci } 29432a6e48fSopenharmony_ci 29532a6e48fSopenharmony_ci sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments); 29632a6e48fSopenharmony_ci if (ReadFlushConfig(arguments, config) != GSERROR_OK) { 29732a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 29832a6e48fSopenharmony_ci } 29932a6e48fSopenharmony_ci 30032a6e48fSopenharmony_ci GSError sRet = FlushBuffer(sequence, bedataimpl, fence, config); 30132a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 30232a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 30332a6e48fSopenharmony_ci } 30432a6e48fSopenharmony_ci 30532a6e48fSopenharmony_ci if (isActiveGame) { 30632a6e48fSopenharmony_ci uint64_t uniqueId = GetUniqueId(); 30732a6e48fSopenharmony_ci endTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>( 30832a6e48fSopenharmony_ci std::chrono::steady_clock::now().time_since_epoch()).count(); 30932a6e48fSopenharmony_ci Rosen::FrameReport::GetInstance().SetQueueBufferTime(uniqueId, name_, (endTimeNs - startTimeNs)); 31032a6e48fSopenharmony_ci Rosen::FrameReport::GetInstance().Report(name_); 31132a6e48fSopenharmony_ci } 31232a6e48fSopenharmony_ci 31332a6e48fSopenharmony_ci return ERR_NONE; 31432a6e48fSopenharmony_ci} 31532a6e48fSopenharmony_ci 31632a6e48fSopenharmony_ciint32_t BufferQueueProducer::FlushBuffersRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 31732a6e48fSopenharmony_ci{ 31832a6e48fSopenharmony_ci std::vector<uint32_t> sequences; 31932a6e48fSopenharmony_ci std::vector<BufferFlushConfigWithDamages> configs; 32032a6e48fSopenharmony_ci std::vector<sptr<BufferExtraData>> bedataimpls; 32132a6e48fSopenharmony_ci std::vector<sptr<SyncFence>> fences; 32232a6e48fSopenharmony_ci arguments.ReadUInt32Vector(&sequences); 32332a6e48fSopenharmony_ci if (sequences.size() == 0 || sequences.size() > SURFACE_MAX_QUEUE_SIZE) { 32432a6e48fSopenharmony_ci return ERR_NONE; 32532a6e48fSopenharmony_ci } 32632a6e48fSopenharmony_ci for (size_t i = 0; i < sequences.size(); ++i) { 32732a6e48fSopenharmony_ci sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl; 32832a6e48fSopenharmony_ci if (bedataimpl->ReadFromParcel(arguments) != GSERROR_OK) { 32932a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 33032a6e48fSopenharmony_ci } 33132a6e48fSopenharmony_ci bedataimpls.emplace_back(bedataimpl); 33232a6e48fSopenharmony_ci sptr<SyncFence> fence = SyncFence::ReadFromMessageParcel(arguments); 33332a6e48fSopenharmony_ci fences.emplace_back(fence); 33432a6e48fSopenharmony_ci BufferFlushConfigWithDamages config; 33532a6e48fSopenharmony_ci if (ReadFlushConfig(arguments, config) != GSERROR_OK) { 33632a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 33732a6e48fSopenharmony_ci } 33832a6e48fSopenharmony_ci configs.emplace_back(config); 33932a6e48fSopenharmony_ci } 34032a6e48fSopenharmony_ci 34132a6e48fSopenharmony_ci GSError sRet = FlushBuffers(sequences, bedataimpls, fences, configs); 34232a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 34332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 34432a6e48fSopenharmony_ci } 34532a6e48fSopenharmony_ci return ERR_NONE; 34632a6e48fSopenharmony_ci} 34732a6e48fSopenharmony_ci 34832a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetLastFlushedBufferRemote(MessageParcel &arguments, 34932a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &option) 35032a6e48fSopenharmony_ci{ 35132a6e48fSopenharmony_ci sptr<SurfaceBuffer> buffer; 35232a6e48fSopenharmony_ci sptr<SyncFence> fence; 35332a6e48fSopenharmony_ci float matrix[BUFFER_MATRIX_SIZE]; 35432a6e48fSopenharmony_ci bool isUseNewMatrix = arguments.ReadBool(); 35532a6e48fSopenharmony_ci GSError sRet = GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix); 35632a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 35732a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 35832a6e48fSopenharmony_ci } 35932a6e48fSopenharmony_ci if (sRet == GSERROR_OK) { 36032a6e48fSopenharmony_ci uint32_t sequence = buffer->GetSeqNum(); 36132a6e48fSopenharmony_ci if (WriteSurfaceBufferImpl(reply, sequence, buffer) != GSERROR_OK || 36232a6e48fSopenharmony_ci buffer->WriteBufferRequestConfig(reply) != GSERROR_OK) { 36332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 36432a6e48fSopenharmony_ci } 36532a6e48fSopenharmony_ci std::vector<float> writeMatrixVector(matrix, matrix + sizeof(matrix) / sizeof(float)); 36632a6e48fSopenharmony_ci if (!fence->WriteToMessageParcel(reply) || !reply.WriteFloatVector(writeMatrixVector)) { 36732a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 36832a6e48fSopenharmony_ci } 36932a6e48fSopenharmony_ci } 37032a6e48fSopenharmony_ci return ERR_NONE; 37132a6e48fSopenharmony_ci} 37232a6e48fSopenharmony_ci 37332a6e48fSopenharmony_ciint32_t BufferQueueProducer::AttachBufferToQueueRemote(MessageParcel &arguments, 37432a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &option) 37532a6e48fSopenharmony_ci{ 37632a6e48fSopenharmony_ci sptr<SurfaceBuffer> buffer = nullptr; 37732a6e48fSopenharmony_ci uint32_t sequence; 37832a6e48fSopenharmony_ci GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer); 37932a6e48fSopenharmony_ci if (ret != GSERROR_OK || buffer == nullptr) { 38032a6e48fSopenharmony_ci if (!reply.WriteInt32(SURFACE_ERROR_UNKOWN)) { 38132a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 38232a6e48fSopenharmony_ci } 38332a6e48fSopenharmony_ci return ERR_INVALID_DATA; 38432a6e48fSopenharmony_ci } 38532a6e48fSopenharmony_ci ret = buffer->ReadBufferRequestConfig(arguments); 38632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 38732a6e48fSopenharmony_ci if (!reply.WriteInt32(SURFACE_ERROR_UNKOWN)) { 38832a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 38932a6e48fSopenharmony_ci } 39032a6e48fSopenharmony_ci return ERR_INVALID_DATA; 39132a6e48fSopenharmony_ci } 39232a6e48fSopenharmony_ci ret = AttachBufferToQueue(buffer); 39332a6e48fSopenharmony_ci if (!reply.WriteInt32(ret)) { 39432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 39532a6e48fSopenharmony_ci } 39632a6e48fSopenharmony_ci return ERR_NONE; 39732a6e48fSopenharmony_ci} 39832a6e48fSopenharmony_ci 39932a6e48fSopenharmony_ciint32_t BufferQueueProducer::DetachBufferFromQueueRemote(MessageParcel &arguments, 40032a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &option) 40132a6e48fSopenharmony_ci{ 40232a6e48fSopenharmony_ci sptr<SurfaceBuffer> buffer = nullptr; 40332a6e48fSopenharmony_ci uint32_t sequence; 40432a6e48fSopenharmony_ci GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer); 40532a6e48fSopenharmony_ci if (ret != GSERROR_OK || buffer == nullptr) { 40632a6e48fSopenharmony_ci if (!reply.WriteInt32(SURFACE_ERROR_UNKOWN)) { 40732a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 40832a6e48fSopenharmony_ci } 40932a6e48fSopenharmony_ci return ERR_INVALID_DATA; 41032a6e48fSopenharmony_ci } 41132a6e48fSopenharmony_ci ret = DetachBufferFromQueue(buffer); 41232a6e48fSopenharmony_ci if (!reply.WriteInt32(ret)) { 41332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 41432a6e48fSopenharmony_ci } 41532a6e48fSopenharmony_ci return ERR_NONE; 41632a6e48fSopenharmony_ci} 41732a6e48fSopenharmony_ci 41832a6e48fSopenharmony_ciint32_t BufferQueueProducer::AttachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 41932a6e48fSopenharmony_ci{ 42032a6e48fSopenharmony_ci sptr<SurfaceBuffer> buffer; 42132a6e48fSopenharmony_ci uint32_t sequence; 42232a6e48fSopenharmony_ci int32_t timeOut; 42332a6e48fSopenharmony_ci GSError ret = ReadSurfaceBufferImpl(arguments, sequence, buffer); 42432a6e48fSopenharmony_ci if (ret != GSERROR_OK || buffer == nullptr) { 42532a6e48fSopenharmony_ci if (!reply.WriteInt32(ret)) { 42632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 42732a6e48fSopenharmony_ci } 42832a6e48fSopenharmony_ci return ERR_INVALID_DATA; 42932a6e48fSopenharmony_ci } 43032a6e48fSopenharmony_ci timeOut = arguments.ReadInt32(); 43132a6e48fSopenharmony_ci 43232a6e48fSopenharmony_ci ret = AttachBuffer(buffer, timeOut); 43332a6e48fSopenharmony_ci if (!reply.WriteInt32(ret)) { 43432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 43532a6e48fSopenharmony_ci } 43632a6e48fSopenharmony_ci return ERR_NONE; 43732a6e48fSopenharmony_ci} 43832a6e48fSopenharmony_ci 43932a6e48fSopenharmony_ciint32_t BufferQueueProducer::DetachBufferRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 44032a6e48fSopenharmony_ci{ 44132a6e48fSopenharmony_ci return ERR_NONE; 44232a6e48fSopenharmony_ci} 44332a6e48fSopenharmony_ci 44432a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 44532a6e48fSopenharmony_ci{ 44632a6e48fSopenharmony_ci if (!reply.WriteInt32(GetQueueSize())) { 44732a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 44832a6e48fSopenharmony_ci } 44932a6e48fSopenharmony_ci return ERR_NONE; 45032a6e48fSopenharmony_ci} 45132a6e48fSopenharmony_ci 45232a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetQueueSizeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 45332a6e48fSopenharmony_ci{ 45432a6e48fSopenharmony_ci uint32_t queueSize = arguments.ReadUint32(); 45532a6e48fSopenharmony_ci GSError sRet = SetQueueSize(queueSize); 45632a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 45732a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 45832a6e48fSopenharmony_ci } 45932a6e48fSopenharmony_ci return ERR_NONE; 46032a6e48fSopenharmony_ci} 46132a6e48fSopenharmony_ci 46232a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetNameRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 46332a6e48fSopenharmony_ci{ 46432a6e48fSopenharmony_ci std::string name; 46532a6e48fSopenharmony_ci auto sRet = bufferQueue_->GetName(name); 46632a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 46732a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 46832a6e48fSopenharmony_ci } 46932a6e48fSopenharmony_ci if (sRet == GSERROR_OK && !reply.WriteString(name)) { 47032a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 47132a6e48fSopenharmony_ci } 47232a6e48fSopenharmony_ci return ERR_NONE; 47332a6e48fSopenharmony_ci} 47432a6e48fSopenharmony_ci 47532a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetNameAndUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply, 47632a6e48fSopenharmony_ci MessageOption &option) 47732a6e48fSopenharmony_ci{ 47832a6e48fSopenharmony_ci std::string name = "not init"; 47932a6e48fSopenharmony_ci uint64_t uniqueId = 0; 48032a6e48fSopenharmony_ci auto ret = GetNameAndUniqueId(name, uniqueId); 48132a6e48fSopenharmony_ci if (!reply.WriteInt32(ret)) { 48232a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 48332a6e48fSopenharmony_ci } 48432a6e48fSopenharmony_ci if (ret == GSERROR_OK && (!reply.WriteString(name) || !reply.WriteUint64(uniqueId))) { 48532a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 48632a6e48fSopenharmony_ci } 48732a6e48fSopenharmony_ci return ERR_NONE; 48832a6e48fSopenharmony_ci} 48932a6e48fSopenharmony_ci 49032a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultWidthRemote(MessageParcel &arguments, MessageParcel &reply, 49132a6e48fSopenharmony_ci MessageOption &option) 49232a6e48fSopenharmony_ci{ 49332a6e48fSopenharmony_ci if (!reply.WriteInt32(GetDefaultWidth())) { 49432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 49532a6e48fSopenharmony_ci } 49632a6e48fSopenharmony_ci return ERR_NONE; 49732a6e48fSopenharmony_ci} 49832a6e48fSopenharmony_ci 49932a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultHeightRemote(MessageParcel &arguments, MessageParcel &reply, 50032a6e48fSopenharmony_ci MessageOption &option) 50132a6e48fSopenharmony_ci{ 50232a6e48fSopenharmony_ci if (!reply.WriteInt32(GetDefaultHeight())) { 50332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 50432a6e48fSopenharmony_ci } 50532a6e48fSopenharmony_ci return ERR_NONE; 50632a6e48fSopenharmony_ci} 50732a6e48fSopenharmony_ci 50832a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetDefaultUsageRemote(MessageParcel &arguments, MessageParcel &reply, 50932a6e48fSopenharmony_ci MessageOption &option) 51032a6e48fSopenharmony_ci{ 51132a6e48fSopenharmony_ci uint64_t usage = arguments.ReadUint64(); 51232a6e48fSopenharmony_ci GSError sRet = SetDefaultUsage(usage); 51332a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 51432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 51532a6e48fSopenharmony_ci } 51632a6e48fSopenharmony_ci return ERR_NONE; 51732a6e48fSopenharmony_ci} 51832a6e48fSopenharmony_ci 51932a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultUsageRemote(MessageParcel &arguments, MessageParcel &reply, 52032a6e48fSopenharmony_ci MessageOption &option) 52132a6e48fSopenharmony_ci{ 52232a6e48fSopenharmony_ci if (!reply.WriteUint64(GetDefaultUsage())) { 52332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 52432a6e48fSopenharmony_ci } 52532a6e48fSopenharmony_ci return ERR_NONE; 52632a6e48fSopenharmony_ci} 52732a6e48fSopenharmony_ci 52832a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetUniqueIdRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 52932a6e48fSopenharmony_ci{ 53032a6e48fSopenharmony_ci if (!reply.WriteUint64(GetUniqueId())) { 53132a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 53232a6e48fSopenharmony_ci } 53332a6e48fSopenharmony_ci return ERR_NONE; 53432a6e48fSopenharmony_ci} 53532a6e48fSopenharmony_ci 53632a6e48fSopenharmony_ciint32_t BufferQueueProducer::CleanCacheRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 53732a6e48fSopenharmony_ci{ 53832a6e48fSopenharmony_ci bool cleanAll = arguments.ReadBool(); 53932a6e48fSopenharmony_ci if (!reply.WriteInt32(CleanCache(cleanAll))) { 54032a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 54132a6e48fSopenharmony_ci } 54232a6e48fSopenharmony_ci return ERR_NONE; 54332a6e48fSopenharmony_ci} 54432a6e48fSopenharmony_ci 54532a6e48fSopenharmony_ciint32_t BufferQueueProducer::GoBackgroundRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 54632a6e48fSopenharmony_ci{ 54732a6e48fSopenharmony_ci if (!reply.WriteInt32(GoBackground())) { 54832a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 54932a6e48fSopenharmony_ci } 55032a6e48fSopenharmony_ci return ERR_NONE; 55132a6e48fSopenharmony_ci} 55232a6e48fSopenharmony_ci 55332a6e48fSopenharmony_ciint32_t BufferQueueProducer::RegisterReleaseListenerRemote(MessageParcel &arguments, 55432a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &option) 55532a6e48fSopenharmony_ci{ 55632a6e48fSopenharmony_ci sptr<IRemoteObject> listenerObject = arguments.ReadRemoteObject(); 55732a6e48fSopenharmony_ci if (listenerObject == nullptr) { 55832a6e48fSopenharmony_ci if (!reply.WriteInt32(GSERROR_INVALID_ARGUMENTS)) { 55932a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 56032a6e48fSopenharmony_ci } 56132a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 56232a6e48fSopenharmony_ci } 56332a6e48fSopenharmony_ci sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject); 56432a6e48fSopenharmony_ci GSError sRet = RegisterReleaseListener(listener); 56532a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 56632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 56732a6e48fSopenharmony_ci } 56832a6e48fSopenharmony_ci return ERR_NONE; 56932a6e48fSopenharmony_ci} 57032a6e48fSopenharmony_ci 57132a6e48fSopenharmony_ciint32_t BufferQueueProducer::UnRegisterReleaseListenerRemote(MessageParcel &arguments, 57232a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &option) 57332a6e48fSopenharmony_ci{ 57432a6e48fSopenharmony_ci GSError sRet = UnRegisterReleaseListener(); 57532a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 57632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 57732a6e48fSopenharmony_ci } 57832a6e48fSopenharmony_ci return ERR_NONE; 57932a6e48fSopenharmony_ci} 58032a6e48fSopenharmony_ci 58132a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetTransformRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 58232a6e48fSopenharmony_ci{ 58332a6e48fSopenharmony_ci GraphicTransformType transform = static_cast<GraphicTransformType>(arguments.ReadUint32()); 58432a6e48fSopenharmony_ci GSError sRet = SetTransform(transform); 58532a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 58632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 58732a6e48fSopenharmony_ci } 58832a6e48fSopenharmony_ci return ERR_NONE; 58932a6e48fSopenharmony_ci} 59032a6e48fSopenharmony_ci 59132a6e48fSopenharmony_ciint32_t BufferQueueProducer::IsSupportedAllocRemote(MessageParcel &arguments, MessageParcel &reply, 59232a6e48fSopenharmony_ci MessageOption &option) 59332a6e48fSopenharmony_ci{ 59432a6e48fSopenharmony_ci std::vector<BufferVerifyAllocInfo> infos; 59532a6e48fSopenharmony_ci ReadVerifyAllocInfo(arguments, infos); 59632a6e48fSopenharmony_ci 59732a6e48fSopenharmony_ci std::vector<bool> supporteds; 59832a6e48fSopenharmony_ci GSError sRet = IsSupportedAlloc(infos, supporteds); 59932a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 60032a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 60132a6e48fSopenharmony_ci } 60232a6e48fSopenharmony_ci if (sRet == GSERROR_OK && !reply.WriteBoolVector(supporteds)) { 60332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 60432a6e48fSopenharmony_ci } 60532a6e48fSopenharmony_ci 60632a6e48fSopenharmony_ci return ERR_NONE; 60732a6e48fSopenharmony_ci} 60832a6e48fSopenharmony_ci 60932a6e48fSopenharmony_ciint32_t BufferQueueProducer::ConnectRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 61032a6e48fSopenharmony_ci{ 61132a6e48fSopenharmony_ci GSError sRet = Connect(); 61232a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 61332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 61432a6e48fSopenharmony_ci } 61532a6e48fSopenharmony_ci return ERR_NONE; 61632a6e48fSopenharmony_ci} 61732a6e48fSopenharmony_ci 61832a6e48fSopenharmony_ciint32_t BufferQueueProducer::DisconnectRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 61932a6e48fSopenharmony_ci{ 62032a6e48fSopenharmony_ci GSError sRet = Disconnect(); 62132a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 62232a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 62332a6e48fSopenharmony_ci } 62432a6e48fSopenharmony_ci return ERR_NONE; 62532a6e48fSopenharmony_ci} 62632a6e48fSopenharmony_ci 62732a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetScalingModeRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 62832a6e48fSopenharmony_ci{ 62932a6e48fSopenharmony_ci uint32_t sequence = arguments.ReadUint32(); 63032a6e48fSopenharmony_ci ScalingMode scalingMode = static_cast<ScalingMode>(arguments.ReadInt32()); 63132a6e48fSopenharmony_ci GSError sRet = SetScalingMode(sequence, scalingMode); 63232a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 63332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 63432a6e48fSopenharmony_ci } 63532a6e48fSopenharmony_ci return ERR_NONE; 63632a6e48fSopenharmony_ci} 63732a6e48fSopenharmony_ci 63832a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetScalingModeV2Remote(MessageParcel &arguments, MessageParcel &reply, 63932a6e48fSopenharmony_ci MessageOption &option) 64032a6e48fSopenharmony_ci{ 64132a6e48fSopenharmony_ci ScalingMode scalingMode = static_cast<ScalingMode>(arguments.ReadInt32()); 64232a6e48fSopenharmony_ci GSError sRet = SetScalingMode(scalingMode); 64332a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 64432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 64532a6e48fSopenharmony_ci } 64632a6e48fSopenharmony_ci return ERR_NONE; 64732a6e48fSopenharmony_ci} 64832a6e48fSopenharmony_ci 64932a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetBufferHoldRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 65032a6e48fSopenharmony_ci{ 65132a6e48fSopenharmony_ci bool hold = arguments.ReadBool(); 65232a6e48fSopenharmony_ci GSError sRet = SetBufferHold(hold); 65332a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 65432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 65532a6e48fSopenharmony_ci } 65632a6e48fSopenharmony_ci return ERR_NONE; 65732a6e48fSopenharmony_ci} 65832a6e48fSopenharmony_ci 65932a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetMetaDataRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 66032a6e48fSopenharmony_ci{ 66132a6e48fSopenharmony_ci uint32_t sequence = arguments.ReadUint32(); 66232a6e48fSopenharmony_ci std::vector<GraphicHDRMetaData> metaData; 66332a6e48fSopenharmony_ci if (ReadHDRMetaData(arguments, metaData) != GSERROR_OK) { 66432a6e48fSopenharmony_ci return GSERROR_BINDER; 66532a6e48fSopenharmony_ci } 66632a6e48fSopenharmony_ci GSError sRet = SetMetaData(sequence, metaData); 66732a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 66832a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 66932a6e48fSopenharmony_ci } 67032a6e48fSopenharmony_ci return ERR_NONE; 67132a6e48fSopenharmony_ci} 67232a6e48fSopenharmony_ci 67332a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetMetaDataSetRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 67432a6e48fSopenharmony_ci{ 67532a6e48fSopenharmony_ci uint32_t sequence = arguments.ReadUint32(); 67632a6e48fSopenharmony_ci GraphicHDRMetadataKey key = static_cast<GraphicHDRMetadataKey>(arguments.ReadUint32()); 67732a6e48fSopenharmony_ci std::vector<uint8_t> metaData; 67832a6e48fSopenharmony_ci if (ReadHDRMetaDataSet(arguments, metaData) != GSERROR_OK) { 67932a6e48fSopenharmony_ci return GSERROR_BINDER; 68032a6e48fSopenharmony_ci } 68132a6e48fSopenharmony_ci GSError sRet = SetMetaDataSet(sequence, key, metaData); 68232a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 68332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 68432a6e48fSopenharmony_ci } 68532a6e48fSopenharmony_ci return ERR_NONE; 68632a6e48fSopenharmony_ci} 68732a6e48fSopenharmony_ci 68832a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetTunnelHandleRemote(MessageParcel &arguments, MessageParcel &reply, 68932a6e48fSopenharmony_ci MessageOption &option) 69032a6e48fSopenharmony_ci{ 69132a6e48fSopenharmony_ci sptr<SurfaceTunnelHandle> handle = nullptr; 69232a6e48fSopenharmony_ci if (arguments.ReadBool()) { 69332a6e48fSopenharmony_ci handle = new SurfaceTunnelHandle(); 69432a6e48fSopenharmony_ci if (ReadExtDataHandle(arguments, handle) != GSERROR_OK) { 69532a6e48fSopenharmony_ci return GSERROR_BINDER; 69632a6e48fSopenharmony_ci } 69732a6e48fSopenharmony_ci } 69832a6e48fSopenharmony_ci GSError sRet = SetTunnelHandle(handle); 69932a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 70032a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 70132a6e48fSopenharmony_ci } 70232a6e48fSopenharmony_ci return ERR_NONE; 70332a6e48fSopenharmony_ci} 70432a6e48fSopenharmony_ci 70532a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetPresentTimestampRemote(MessageParcel &arguments, MessageParcel &reply, 70632a6e48fSopenharmony_ci MessageOption &option) 70732a6e48fSopenharmony_ci{ 70832a6e48fSopenharmony_ci uint32_t sequence = arguments.ReadUint32(); 70932a6e48fSopenharmony_ci GraphicPresentTimestampType type = static_cast<GraphicPresentTimestampType>(arguments.ReadUint32()); 71032a6e48fSopenharmony_ci int64_t time = 0; 71132a6e48fSopenharmony_ci GSError sRet = GetPresentTimestamp(sequence, type, time); 71232a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 71332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 71432a6e48fSopenharmony_ci } 71532a6e48fSopenharmony_ci if (sRet == GSERROR_OK && !reply.WriteInt64(time)) { 71632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 71732a6e48fSopenharmony_ci } 71832a6e48fSopenharmony_ci return ERR_NONE; 71932a6e48fSopenharmony_ci} 72032a6e48fSopenharmony_ci 72132a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetTransformRemote( 72232a6e48fSopenharmony_ci MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 72332a6e48fSopenharmony_ci{ 72432a6e48fSopenharmony_ci GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT; 72532a6e48fSopenharmony_ci auto ret = GetTransform(transform); 72632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 72732a6e48fSopenharmony_ci if (!reply.WriteInt32(static_cast<int32_t>(ret))) { 72832a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 72932a6e48fSopenharmony_ci } 73032a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 73132a6e48fSopenharmony_ci } 73232a6e48fSopenharmony_ci 73332a6e48fSopenharmony_ci if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(static_cast<uint32_t>(transform))) { 73432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 73532a6e48fSopenharmony_ci } 73632a6e48fSopenharmony_ci 73732a6e48fSopenharmony_ci return ERR_NONE; 73832a6e48fSopenharmony_ci} 73932a6e48fSopenharmony_ci 74032a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetTransformHintRemote(MessageParcel &arguments, 74132a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &option) 74232a6e48fSopenharmony_ci{ 74332a6e48fSopenharmony_ci GraphicTransformType transformHint = static_cast<GraphicTransformType>(arguments.ReadUint32()); 74432a6e48fSopenharmony_ci GSError sRet = SetTransformHint(transformHint); 74532a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 74632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 74732a6e48fSopenharmony_ci } 74832a6e48fSopenharmony_ci return ERR_NONE; 74932a6e48fSopenharmony_ci} 75032a6e48fSopenharmony_ci 75132a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetTransformHintRemote( 75232a6e48fSopenharmony_ci MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 75332a6e48fSopenharmony_ci{ 75432a6e48fSopenharmony_ci GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT; 75532a6e48fSopenharmony_ci auto ret = GetTransformHint(transformHint); 75632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 75732a6e48fSopenharmony_ci if (!reply.WriteInt32(static_cast<int32_t>(ret))) { 75832a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 75932a6e48fSopenharmony_ci } 76032a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 76132a6e48fSopenharmony_ci } 76232a6e48fSopenharmony_ci 76332a6e48fSopenharmony_ci if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(static_cast<uint32_t>(transformHint))) { 76432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 76532a6e48fSopenharmony_ci } 76632a6e48fSopenharmony_ci 76732a6e48fSopenharmony_ci return ERR_NONE; 76832a6e48fSopenharmony_ci} 76932a6e48fSopenharmony_ci 77032a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetSurfaceSourceTypeRemote(MessageParcel &arguments, 77132a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &option) 77232a6e48fSopenharmony_ci{ 77332a6e48fSopenharmony_ci OHSurfaceSource sourceType = static_cast<OHSurfaceSource>(arguments.ReadUint32()); 77432a6e48fSopenharmony_ci GSError sRet = SetSurfaceSourceType(sourceType); 77532a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 77632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 77732a6e48fSopenharmony_ci } 77832a6e48fSopenharmony_ci return ERR_NONE; 77932a6e48fSopenharmony_ci} 78032a6e48fSopenharmony_ci 78132a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetSurfaceSourceTypeRemote( 78232a6e48fSopenharmony_ci MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 78332a6e48fSopenharmony_ci{ 78432a6e48fSopenharmony_ci OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT; 78532a6e48fSopenharmony_ci auto ret = GetSurfaceSourceType(sourceType); 78632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 78732a6e48fSopenharmony_ci if (!reply.WriteInt32(static_cast<int32_t>(ret))) { 78832a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 78932a6e48fSopenharmony_ci } 79032a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 79132a6e48fSopenharmony_ci } 79232a6e48fSopenharmony_ci 79332a6e48fSopenharmony_ci if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteUint32(static_cast<uint32_t>(sourceType))) { 79432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 79532a6e48fSopenharmony_ci } 79632a6e48fSopenharmony_ci 79732a6e48fSopenharmony_ci return ERR_NONE; 79832a6e48fSopenharmony_ci} 79932a6e48fSopenharmony_ci 80032a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetSurfaceAppFrameworkTypeRemote( 80132a6e48fSopenharmony_ci MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 80232a6e48fSopenharmony_ci{ 80332a6e48fSopenharmony_ci std::string appFrameworkType = arguments.ReadString(); 80432a6e48fSopenharmony_ci GSError sRet = SetSurfaceAppFrameworkType(appFrameworkType); 80532a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 80632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 80732a6e48fSopenharmony_ci } 80832a6e48fSopenharmony_ci return ERR_NONE; 80932a6e48fSopenharmony_ci} 81032a6e48fSopenharmony_ci 81132a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetSurfaceAppFrameworkTypeRemote( 81232a6e48fSopenharmony_ci MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 81332a6e48fSopenharmony_ci{ 81432a6e48fSopenharmony_ci std::string appFrameworkType = ""; 81532a6e48fSopenharmony_ci auto ret = GetSurfaceAppFrameworkType(appFrameworkType); 81632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 81732a6e48fSopenharmony_ci if (!reply.WriteInt32(static_cast<int32_t>(ret))) { 81832a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 81932a6e48fSopenharmony_ci } 82032a6e48fSopenharmony_ci return ERR_INVALID_REPLY; 82132a6e48fSopenharmony_ci } 82232a6e48fSopenharmony_ci 82332a6e48fSopenharmony_ci if (!reply.WriteInt32(GSERROR_OK) || !reply.WriteString(appFrameworkType)) { 82432a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 82532a6e48fSopenharmony_ci } 82632a6e48fSopenharmony_ci 82732a6e48fSopenharmony_ci return ERR_NONE; 82832a6e48fSopenharmony_ci} 82932a6e48fSopenharmony_ci 83032a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetHdrWhitePointBrightnessRemote( 83132a6e48fSopenharmony_ci MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 83232a6e48fSopenharmony_ci{ 83332a6e48fSopenharmony_ci float brightness = arguments.ReadFloat(); 83432a6e48fSopenharmony_ci GSError sRet = SetHdrWhitePointBrightness(brightness); 83532a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 83632a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 83732a6e48fSopenharmony_ci } 83832a6e48fSopenharmony_ci return ERR_NONE; 83932a6e48fSopenharmony_ci} 84032a6e48fSopenharmony_ci 84132a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetSdrWhitePointBrightnessRemote( 84232a6e48fSopenharmony_ci MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 84332a6e48fSopenharmony_ci{ 84432a6e48fSopenharmony_ci float brightness = arguments.ReadFloat(); 84532a6e48fSopenharmony_ci GSError sRet = SetSdrWhitePointBrightness(brightness); 84632a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 84732a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 84832a6e48fSopenharmony_ci } 84932a6e48fSopenharmony_ci return ERR_NONE; 85032a6e48fSopenharmony_ci} 85132a6e48fSopenharmony_ci 85232a6e48fSopenharmony_ciint32_t BufferQueueProducer::AcquireLastFlushedBufferRemote( 85332a6e48fSopenharmony_ci MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 85432a6e48fSopenharmony_ci{ 85532a6e48fSopenharmony_ci sptr<SurfaceBuffer> buffer; 85632a6e48fSopenharmony_ci sptr<SyncFence> fence; 85732a6e48fSopenharmony_ci float matrix[BUFFER_MATRIX_SIZE]; 85832a6e48fSopenharmony_ci bool isUseNewMatrix = arguments.ReadBool(); 85932a6e48fSopenharmony_ci GSError sRet = AcquireLastFlushedBuffer(buffer, fence, matrix, BUFFER_MATRIX_SIZE, isUseNewMatrix); 86032a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 86132a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 86232a6e48fSopenharmony_ci } 86332a6e48fSopenharmony_ci if (sRet == GSERROR_OK) { 86432a6e48fSopenharmony_ci uint32_t sequence = buffer->GetSeqNum(); 86532a6e48fSopenharmony_ci if (WriteSurfaceBufferImpl(reply, sequence, buffer) != GSERROR_OK || 86632a6e48fSopenharmony_ci buffer->WriteBufferRequestConfig(reply) != GSERROR_OK) { 86732a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 86832a6e48fSopenharmony_ci } 86932a6e48fSopenharmony_ci std::vector<float> writeMatrixVector(matrix, matrix + sizeof(matrix) / sizeof(float)); 87032a6e48fSopenharmony_ci if (!fence->WriteToMessageParcel(reply) || !reply.WriteFloatVector(writeMatrixVector)) { 87132a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 87232a6e48fSopenharmony_ci } 87332a6e48fSopenharmony_ci } 87432a6e48fSopenharmony_ci return ERR_NONE; 87532a6e48fSopenharmony_ci} 87632a6e48fSopenharmony_ci 87732a6e48fSopenharmony_ciint32_t BufferQueueProducer::ReleaseLastFlushedBufferRemote( 87832a6e48fSopenharmony_ci MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 87932a6e48fSopenharmony_ci{ 88032a6e48fSopenharmony_ci uint32_t sequence = arguments.ReadUint32(); 88132a6e48fSopenharmony_ci GSError sRet = ReleaseLastFlushedBuffer(sequence); 88232a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 88332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 88432a6e48fSopenharmony_ci } 88532a6e48fSopenharmony_ci return ERR_NONE; 88632a6e48fSopenharmony_ci} 88732a6e48fSopenharmony_ci 88832a6e48fSopenharmony_ciint32_t BufferQueueProducer::SetGlobalAlphaRemote(MessageParcel &arguments, MessageParcel &reply, MessageOption &option) 88932a6e48fSopenharmony_ci{ 89032a6e48fSopenharmony_ci int32_t alpha = arguments.ReadInt32(); 89132a6e48fSopenharmony_ci GSError sRet = SetGlobalAlpha(alpha); 89232a6e48fSopenharmony_ci if (!reply.WriteInt32(sRet)) { 89332a6e48fSopenharmony_ci return IPC_STUB_WRITE_PARCEL_ERR; 89432a6e48fSopenharmony_ci } 89532a6e48fSopenharmony_ci return ERR_NONE; 89632a6e48fSopenharmony_ci} 89732a6e48fSopenharmony_ci 89832a6e48fSopenharmony_ciGSError BufferQueueProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, 89932a6e48fSopenharmony_ci sptr<SyncFence> &fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix) 90032a6e48fSopenharmony_ci{ 90132a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 90232a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 90332a6e48fSopenharmony_ci } 90432a6e48fSopenharmony_ci return bufferQueue_->AcquireLastFlushedBuffer(buffer, fence, matrix, matrixSize, isUseNewMatrix); 90532a6e48fSopenharmony_ci} 90632a6e48fSopenharmony_ci 90732a6e48fSopenharmony_ciGSError BufferQueueProducer::ReleaseLastFlushedBuffer(uint32_t sequence) 90832a6e48fSopenharmony_ci{ 90932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 91032a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 91132a6e48fSopenharmony_ci } 91232a6e48fSopenharmony_ci return bufferQueue_->ReleaseLastFlushedBuffer(sequence); 91332a6e48fSopenharmony_ci} 91432a6e48fSopenharmony_ci 91532a6e48fSopenharmony_ciGSError BufferQueueProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata, 91632a6e48fSopenharmony_ci RequestBufferReturnValue &retval) 91732a6e48fSopenharmony_ci{ 91832a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 91932a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 92032a6e48fSopenharmony_ci } 92132a6e48fSopenharmony_ci 92232a6e48fSopenharmony_ci retval.isConnected = false; 92332a6e48fSopenharmony_ci auto ret = Connect(); 92432a6e48fSopenharmony_ci if (ret != SURFACE_ERROR_OK) { 92532a6e48fSopenharmony_ci return ret; 92632a6e48fSopenharmony_ci } 92732a6e48fSopenharmony_ci retval.isConnected = true; 92832a6e48fSopenharmony_ci return bufferQueue_->RequestBuffer(config, bedata, retval); 92932a6e48fSopenharmony_ci} 93032a6e48fSopenharmony_ci 93132a6e48fSopenharmony_ciGSError BufferQueueProducer::RequestBuffers(const BufferRequestConfig &config, 93232a6e48fSopenharmony_ci std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues) 93332a6e48fSopenharmony_ci{ 93432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 93532a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 93632a6e48fSopenharmony_ci } 93732a6e48fSopenharmony_ci retvalues[0].isConnected = false; 93832a6e48fSopenharmony_ci auto ret = Connect(); 93932a6e48fSopenharmony_ci if (ret != SURFACE_ERROR_OK) { 94032a6e48fSopenharmony_ci return ret; 94132a6e48fSopenharmony_ci } 94232a6e48fSopenharmony_ci bufferQueue_->SetBatchHandle(true); 94332a6e48fSopenharmony_ci for (size_t i = 0; i < retvalues.size(); ++i) { 94432a6e48fSopenharmony_ci ret = bufferQueue_->RequestBuffer(config, bedata[i], retvalues[i]); 94532a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 94632a6e48fSopenharmony_ci retvalues.resize(i); 94732a6e48fSopenharmony_ci break; 94832a6e48fSopenharmony_ci } 94932a6e48fSopenharmony_ci } 95032a6e48fSopenharmony_ci bufferQueue_->SetBatchHandle(false); 95132a6e48fSopenharmony_ci if (retvalues.size() == 0) { 95232a6e48fSopenharmony_ci retvalues.resize(1); 95332a6e48fSopenharmony_ci retvalues[0].isConnected = true; 95432a6e48fSopenharmony_ci return ret; 95532a6e48fSopenharmony_ci } 95632a6e48fSopenharmony_ci return GSERROR_OK; 95732a6e48fSopenharmony_ci} 95832a6e48fSopenharmony_ci 95932a6e48fSopenharmony_ciGSError BufferQueueProducer::GetProducerInitInfo(ProducerInitInfo &info) 96032a6e48fSopenharmony_ci{ 96132a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 96232a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 96332a6e48fSopenharmony_ci } 96432a6e48fSopenharmony_ci return bufferQueue_->GetProducerInitInfo(info); 96532a6e48fSopenharmony_ci} 96632a6e48fSopenharmony_ci 96732a6e48fSopenharmony_ciGSError BufferQueueProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata) 96832a6e48fSopenharmony_ci{ 96932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 97032a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 97132a6e48fSopenharmony_ci } 97232a6e48fSopenharmony_ci return bufferQueue_->CancelBuffer(sequence, bedata); 97332a6e48fSopenharmony_ci} 97432a6e48fSopenharmony_ci 97532a6e48fSopenharmony_ciGSError BufferQueueProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata, 97632a6e48fSopenharmony_ci sptr<SyncFence> fence, BufferFlushConfigWithDamages &config) 97732a6e48fSopenharmony_ci{ 97832a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 97932a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 98032a6e48fSopenharmony_ci } 98132a6e48fSopenharmony_ci return bufferQueue_->FlushBuffer(sequence, bedata, fence, config); 98232a6e48fSopenharmony_ci} 98332a6e48fSopenharmony_ci 98432a6e48fSopenharmony_ciGSError BufferQueueProducer::FlushBuffers(const std::vector<uint32_t> &sequences, 98532a6e48fSopenharmony_ci const std::vector<sptr<BufferExtraData>> &bedata, 98632a6e48fSopenharmony_ci const std::vector<sptr<SyncFence>> &fences, 98732a6e48fSopenharmony_ci const std::vector<BufferFlushConfigWithDamages> &configs) 98832a6e48fSopenharmony_ci{ 98932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 99032a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 99132a6e48fSopenharmony_ci } 99232a6e48fSopenharmony_ci GSError ret; 99332a6e48fSopenharmony_ci for (size_t i = 0; i < sequences.size(); ++i) { 99432a6e48fSopenharmony_ci ret = bufferQueue_->FlushBuffer(sequences[i], bedata[i], fences[i], configs[i]); 99532a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 99632a6e48fSopenharmony_ci BLOGE("FlushBuffer failed: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_); 99732a6e48fSopenharmony_ci return ret; 99832a6e48fSopenharmony_ci } 99932a6e48fSopenharmony_ci } 100032a6e48fSopenharmony_ci return ret; 100132a6e48fSopenharmony_ci} 100232a6e48fSopenharmony_ci 100332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, 100432a6e48fSopenharmony_ci sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix) 100532a6e48fSopenharmony_ci{ 100632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 100732a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 100832a6e48fSopenharmony_ci } 100932a6e48fSopenharmony_ci return bufferQueue_->GetLastFlushedBuffer(buffer, fence, matrix, BUFFER_MATRIX_SIZE, isUseNewMatrix); 101032a6e48fSopenharmony_ci} 101132a6e48fSopenharmony_ci 101232a6e48fSopenharmony_ciGSError BufferQueueProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer) 101332a6e48fSopenharmony_ci{ 101432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 101532a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 101632a6e48fSopenharmony_ci } 101732a6e48fSopenharmony_ci return bufferQueue_->AttachBufferToQueue(buffer, InvokerType::PRODUCER_INVOKER); 101832a6e48fSopenharmony_ci} 101932a6e48fSopenharmony_ci 102032a6e48fSopenharmony_ciGSError BufferQueueProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer) 102132a6e48fSopenharmony_ci{ 102232a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 102332a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 102432a6e48fSopenharmony_ci } 102532a6e48fSopenharmony_ci return bufferQueue_->DetachBufferFromQueue(buffer, InvokerType::PRODUCER_INVOKER); 102632a6e48fSopenharmony_ci} 102732a6e48fSopenharmony_ci 102832a6e48fSopenharmony_ciGSError BufferQueueProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer) 102932a6e48fSopenharmony_ci{ 103032a6e48fSopenharmony_ci int32_t timeOut = 0; 103132a6e48fSopenharmony_ci return AttachBuffer(buffer, timeOut); 103232a6e48fSopenharmony_ci} 103332a6e48fSopenharmony_ci 103432a6e48fSopenharmony_ciGSError BufferQueueProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut) 103532a6e48fSopenharmony_ci{ 103632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 103732a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 103832a6e48fSopenharmony_ci } 103932a6e48fSopenharmony_ci return bufferQueue_->AttachBuffer(buffer, timeOut); 104032a6e48fSopenharmony_ci} 104132a6e48fSopenharmony_ci 104232a6e48fSopenharmony_ciGSError BufferQueueProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer) 104332a6e48fSopenharmony_ci{ 104432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 104532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 104632a6e48fSopenharmony_ci } 104732a6e48fSopenharmony_ci 104832a6e48fSopenharmony_ci return bufferQueue_->DetachBuffer(buffer); 104932a6e48fSopenharmony_ci} 105032a6e48fSopenharmony_ci 105132a6e48fSopenharmony_ciuint32_t BufferQueueProducer::GetQueueSize() 105232a6e48fSopenharmony_ci{ 105332a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 105432a6e48fSopenharmony_ci return 0; 105532a6e48fSopenharmony_ci } 105632a6e48fSopenharmony_ci return bufferQueue_->GetQueueSize(); 105732a6e48fSopenharmony_ci} 105832a6e48fSopenharmony_ci 105932a6e48fSopenharmony_ciGSError BufferQueueProducer::SetQueueSize(uint32_t queueSize) 106032a6e48fSopenharmony_ci{ 106132a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 106232a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 106332a6e48fSopenharmony_ci } 106432a6e48fSopenharmony_ci return bufferQueue_->SetQueueSize(queueSize); 106532a6e48fSopenharmony_ci} 106632a6e48fSopenharmony_ci 106732a6e48fSopenharmony_ciGSError BufferQueueProducer::GetName(std::string &name) 106832a6e48fSopenharmony_ci{ 106932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 107032a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 107132a6e48fSopenharmony_ci } 107232a6e48fSopenharmony_ci return bufferQueue_->GetName(name); 107332a6e48fSopenharmony_ci} 107432a6e48fSopenharmony_ci 107532a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultWidth() 107632a6e48fSopenharmony_ci{ 107732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 107832a6e48fSopenharmony_ci return 0; 107932a6e48fSopenharmony_ci } 108032a6e48fSopenharmony_ci return bufferQueue_->GetDefaultWidth(); 108132a6e48fSopenharmony_ci} 108232a6e48fSopenharmony_ci 108332a6e48fSopenharmony_ciint32_t BufferQueueProducer::GetDefaultHeight() 108432a6e48fSopenharmony_ci{ 108532a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 108632a6e48fSopenharmony_ci return 0; 108732a6e48fSopenharmony_ci } 108832a6e48fSopenharmony_ci return bufferQueue_->GetDefaultHeight(); 108932a6e48fSopenharmony_ci} 109032a6e48fSopenharmony_ci 109132a6e48fSopenharmony_ciGSError BufferQueueProducer::SetDefaultUsage(uint64_t usage) 109232a6e48fSopenharmony_ci{ 109332a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 109432a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 109532a6e48fSopenharmony_ci } 109632a6e48fSopenharmony_ci return bufferQueue_->SetDefaultUsage(usage); 109732a6e48fSopenharmony_ci} 109832a6e48fSopenharmony_ci 109932a6e48fSopenharmony_ciuint64_t BufferQueueProducer::GetDefaultUsage() 110032a6e48fSopenharmony_ci{ 110132a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 110232a6e48fSopenharmony_ci return 0; 110332a6e48fSopenharmony_ci } 110432a6e48fSopenharmony_ci return bufferQueue_->GetDefaultUsage(); 110532a6e48fSopenharmony_ci} 110632a6e48fSopenharmony_ci 110732a6e48fSopenharmony_ciuint64_t BufferQueueProducer::GetUniqueId() 110832a6e48fSopenharmony_ci{ 110932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 111032a6e48fSopenharmony_ci return 0; 111132a6e48fSopenharmony_ci } 111232a6e48fSopenharmony_ci return bufferQueue_->GetUniqueId(); 111332a6e48fSopenharmony_ci} 111432a6e48fSopenharmony_ci 111532a6e48fSopenharmony_ciGSError BufferQueueProducer::CleanCache(bool cleanAll) 111632a6e48fSopenharmony_ci{ 111732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 111832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 111932a6e48fSopenharmony_ci } 112032a6e48fSopenharmony_ci 112132a6e48fSopenharmony_ci { 112232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 112332a6e48fSopenharmony_ci auto ret = CheckConnectLocked(); 112432a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 112532a6e48fSopenharmony_ci return ret; 112632a6e48fSopenharmony_ci } 112732a6e48fSopenharmony_ci } 112832a6e48fSopenharmony_ci 112932a6e48fSopenharmony_ci return bufferQueue_->CleanCache(cleanAll); 113032a6e48fSopenharmony_ci} 113132a6e48fSopenharmony_ci 113232a6e48fSopenharmony_ciGSError BufferQueueProducer::GoBackground() 113332a6e48fSopenharmony_ci{ 113432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 113532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 113632a6e48fSopenharmony_ci } 113732a6e48fSopenharmony_ci 113832a6e48fSopenharmony_ci { 113932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 114032a6e48fSopenharmony_ci auto ret = CheckConnectLocked(); 114132a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 114232a6e48fSopenharmony_ci return ret; 114332a6e48fSopenharmony_ci } 114432a6e48fSopenharmony_ci } 114532a6e48fSopenharmony_ci return bufferQueue_->SetProducerCacheCleanFlag(true); 114632a6e48fSopenharmony_ci} 114732a6e48fSopenharmony_ci 114832a6e48fSopenharmony_ciGSError BufferQueueProducer::RegisterReleaseListener(sptr<IProducerListener> listener) 114932a6e48fSopenharmony_ci{ 115032a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 115132a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 115232a6e48fSopenharmony_ci } 115332a6e48fSopenharmony_ci return bufferQueue_->RegisterProducerReleaseListener(listener); 115432a6e48fSopenharmony_ci} 115532a6e48fSopenharmony_ci 115632a6e48fSopenharmony_ciGSError BufferQueueProducer::UnRegisterReleaseListener() 115732a6e48fSopenharmony_ci{ 115832a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 115932a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 116032a6e48fSopenharmony_ci } 116132a6e48fSopenharmony_ci return bufferQueue_->UnRegisterProducerReleaseListener(); 116232a6e48fSopenharmony_ci} 116332a6e48fSopenharmony_ci 116432a6e48fSopenharmony_cibool BufferQueueProducer::HandleDeathRecipient(sptr<IRemoteObject> token) 116532a6e48fSopenharmony_ci{ 116632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 116732a6e48fSopenharmony_ci if (token_ != nullptr) { 116832a6e48fSopenharmony_ci token_->RemoveDeathRecipient(producerSurfaceDeathRecipient_); 116932a6e48fSopenharmony_ci } 117032a6e48fSopenharmony_ci token_ = token; 117132a6e48fSopenharmony_ci return token_->AddDeathRecipient(producerSurfaceDeathRecipient_); 117232a6e48fSopenharmony_ci} 117332a6e48fSopenharmony_ci 117432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetTransform(GraphicTransformType transform) 117532a6e48fSopenharmony_ci{ 117632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 117732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 117832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 117932a6e48fSopenharmony_ci } 118032a6e48fSopenharmony_ci return bufferQueue_->SetTransform(transform); 118132a6e48fSopenharmony_ci} 118232a6e48fSopenharmony_ci 118332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetTransform(GraphicTransformType &transform) 118432a6e48fSopenharmony_ci{ 118532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 118632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 118732a6e48fSopenharmony_ci transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT; 118832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 118932a6e48fSopenharmony_ci } 119032a6e48fSopenharmony_ci transform = bufferQueue_->GetTransform(); 119132a6e48fSopenharmony_ci return GSERROR_OK; 119232a6e48fSopenharmony_ci} 119332a6e48fSopenharmony_ci 119432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetTransformHint(GraphicTransformType transformHint) 119532a6e48fSopenharmony_ci{ 119632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 119732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 119832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 119932a6e48fSopenharmony_ci } 120032a6e48fSopenharmony_ci return bufferQueue_->SetTransformHint(transformHint); 120132a6e48fSopenharmony_ci} 120232a6e48fSopenharmony_ci 120332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetTransformHint(GraphicTransformType &transformHint) 120432a6e48fSopenharmony_ci{ 120532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 120632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 120732a6e48fSopenharmony_ci transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT; 120832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 120932a6e48fSopenharmony_ci } 121032a6e48fSopenharmony_ci transformHint = bufferQueue_->GetTransformHint(); 121132a6e48fSopenharmony_ci return GSERROR_OK; 121232a6e48fSopenharmony_ci} 121332a6e48fSopenharmony_ci 121432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetSurfaceSourceType(OHSurfaceSource sourceType) 121532a6e48fSopenharmony_ci{ 121632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 121732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 121832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 121932a6e48fSopenharmony_ci } 122032a6e48fSopenharmony_ci return bufferQueue_->SetSurfaceSourceType(sourceType); 122132a6e48fSopenharmony_ci} 122232a6e48fSopenharmony_ci 122332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType) 122432a6e48fSopenharmony_ci{ 122532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 122632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 122732a6e48fSopenharmony_ci sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT; 122832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 122932a6e48fSopenharmony_ci } 123032a6e48fSopenharmony_ci sourceType = bufferQueue_->GetSurfaceSourceType(); 123132a6e48fSopenharmony_ci return GSERROR_OK; 123232a6e48fSopenharmony_ci} 123332a6e48fSopenharmony_ci 123432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType) 123532a6e48fSopenharmony_ci{ 123632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 123732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 123832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 123932a6e48fSopenharmony_ci } 124032a6e48fSopenharmony_ci return bufferQueue_->SetSurfaceAppFrameworkType(appFrameworkType); 124132a6e48fSopenharmony_ci} 124232a6e48fSopenharmony_ci 124332a6e48fSopenharmony_ciGSError BufferQueueProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType) 124432a6e48fSopenharmony_ci{ 124532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 124632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 124732a6e48fSopenharmony_ci appFrameworkType = ""; 124832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 124932a6e48fSopenharmony_ci } 125032a6e48fSopenharmony_ci appFrameworkType = bufferQueue_->GetSurfaceAppFrameworkType(); 125132a6e48fSopenharmony_ci return GSERROR_OK; 125232a6e48fSopenharmony_ci} 125332a6e48fSopenharmony_ci 125432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetHdrWhitePointBrightness(float brightness) 125532a6e48fSopenharmony_ci{ 125632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 125732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 125832a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 125932a6e48fSopenharmony_ci } 126032a6e48fSopenharmony_ci return bufferQueue_->SetHdrWhitePointBrightness(brightness); 126132a6e48fSopenharmony_ci} 126232a6e48fSopenharmony_ci 126332a6e48fSopenharmony_ciGSError BufferQueueProducer::SetSdrWhitePointBrightness(float brightness) 126432a6e48fSopenharmony_ci{ 126532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 126632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 126732a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 126832a6e48fSopenharmony_ci } 126932a6e48fSopenharmony_ci return bufferQueue_->SetSdrWhitePointBrightness(brightness); 127032a6e48fSopenharmony_ci} 127132a6e48fSopenharmony_ci 127232a6e48fSopenharmony_ciGSError BufferQueueProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos, 127332a6e48fSopenharmony_ci std::vector<bool> &supporteds) 127432a6e48fSopenharmony_ci{ 127532a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 127632a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 127732a6e48fSopenharmony_ci } 127832a6e48fSopenharmony_ci 127932a6e48fSopenharmony_ci return bufferQueue_->IsSupportedAlloc(infos, supporteds); 128032a6e48fSopenharmony_ci} 128132a6e48fSopenharmony_ci 128232a6e48fSopenharmony_ciGSError BufferQueueProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId) 128332a6e48fSopenharmony_ci{ 128432a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 128532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 128632a6e48fSopenharmony_ci } 128732a6e48fSopenharmony_ci uniqueId = GetUniqueId(); 128832a6e48fSopenharmony_ci return GetName(name); 128932a6e48fSopenharmony_ci} 129032a6e48fSopenharmony_ci 129132a6e48fSopenharmony_ciGSError BufferQueueProducer::Connect() 129232a6e48fSopenharmony_ci{ 129332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 129432a6e48fSopenharmony_ci auto callingPid = GetCallingPid(); 129532a6e48fSopenharmony_ci if (connectedPid_ != 0 && connectedPid_ != callingPid) { 129632a6e48fSopenharmony_ci BLOGW("connected by: %{public}d, request by: %{public}d , uniqueId: %{public}" PRIu64 ".", 129732a6e48fSopenharmony_ci connectedPid_, callingPid, uniqueId_); 129832a6e48fSopenharmony_ci return SURFACE_ERROR_CONSUMER_IS_CONNECTED; 129932a6e48fSopenharmony_ci } 130032a6e48fSopenharmony_ci connectedPid_ = callingPid; 130132a6e48fSopenharmony_ci return SURFACE_ERROR_OK; 130232a6e48fSopenharmony_ci} 130332a6e48fSopenharmony_ci 130432a6e48fSopenharmony_ciGSError BufferQueueProducer::Disconnect() 130532a6e48fSopenharmony_ci{ 130632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 130732a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 130832a6e48fSopenharmony_ci } 130932a6e48fSopenharmony_ci 131032a6e48fSopenharmony_ci { 131132a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 131232a6e48fSopenharmony_ci auto ret = CheckConnectLocked(); 131332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 131432a6e48fSopenharmony_ci return ret; 131532a6e48fSopenharmony_ci } 131632a6e48fSopenharmony_ci connectedPid_ = 0; 131732a6e48fSopenharmony_ci } 131832a6e48fSopenharmony_ci return bufferQueue_->CleanCache(false); 131932a6e48fSopenharmony_ci} 132032a6e48fSopenharmony_ci 132132a6e48fSopenharmony_ciGSError BufferQueueProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode) 132232a6e48fSopenharmony_ci{ 132332a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 132432a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 132532a6e48fSopenharmony_ci } 132632a6e48fSopenharmony_ci return bufferQueue_->SetScalingMode(sequence, scalingMode); 132732a6e48fSopenharmony_ci} 132832a6e48fSopenharmony_ci 132932a6e48fSopenharmony_ciGSError BufferQueueProducer::SetScalingMode(ScalingMode scalingMode) 133032a6e48fSopenharmony_ci{ 133132a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 133232a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 133332a6e48fSopenharmony_ci } 133432a6e48fSopenharmony_ci return bufferQueue_->SetScalingMode(scalingMode); 133532a6e48fSopenharmony_ci} 133632a6e48fSopenharmony_ci 133732a6e48fSopenharmony_ciGSError BufferQueueProducer::SetBufferHold(bool hold) 133832a6e48fSopenharmony_ci{ 133932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 134032a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 134132a6e48fSopenharmony_ci } 134232a6e48fSopenharmony_ci return bufferQueue_->SetBufferHold(hold); 134332a6e48fSopenharmony_ci} 134432a6e48fSopenharmony_ci 134532a6e48fSopenharmony_ciGSError BufferQueueProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData) 134632a6e48fSopenharmony_ci{ 134732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 134832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 134932a6e48fSopenharmony_ci } 135032a6e48fSopenharmony_ci 135132a6e48fSopenharmony_ci return bufferQueue_->SetMetaData(sequence, metaData); 135232a6e48fSopenharmony_ci} 135332a6e48fSopenharmony_ci 135432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key, 135532a6e48fSopenharmony_ci const std::vector<uint8_t> &metaData) 135632a6e48fSopenharmony_ci{ 135732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 135832a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 135932a6e48fSopenharmony_ci } 136032a6e48fSopenharmony_ci 136132a6e48fSopenharmony_ci return bufferQueue_->SetMetaDataSet(sequence, key, metaData); 136232a6e48fSopenharmony_ci} 136332a6e48fSopenharmony_ci 136432a6e48fSopenharmony_ciGSError BufferQueueProducer::SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle) 136532a6e48fSopenharmony_ci{ 136632a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 136732a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 136832a6e48fSopenharmony_ci } 136932a6e48fSopenharmony_ci return bufferQueue_->SetTunnelHandle(handle); 137032a6e48fSopenharmony_ci} 137132a6e48fSopenharmony_ci 137232a6e48fSopenharmony_ciGSError BufferQueueProducer::SetTunnelHandle(const GraphicExtDataHandle *handle) 137332a6e48fSopenharmony_ci{ 137432a6e48fSopenharmony_ci sptr<SurfaceTunnelHandle> tunnelHandle = new SurfaceTunnelHandle(); 137532a6e48fSopenharmony_ci if (tunnelHandle->SetHandle(handle) != GSERROR_OK) { 137632a6e48fSopenharmony_ci return GSERROR_INVALID_OPERATING; 137732a6e48fSopenharmony_ci } 137832a6e48fSopenharmony_ci return bufferQueue_->SetTunnelHandle(tunnelHandle); 137932a6e48fSopenharmony_ci} 138032a6e48fSopenharmony_ci 138132a6e48fSopenharmony_ciGSError BufferQueueProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time) 138232a6e48fSopenharmony_ci{ 138332a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 138432a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 138532a6e48fSopenharmony_ci } 138632a6e48fSopenharmony_ci return bufferQueue_->GetPresentTimestamp(sequence, type, time); 138732a6e48fSopenharmony_ci} 138832a6e48fSopenharmony_ci 138932a6e48fSopenharmony_cibool BufferQueueProducer::GetStatus() const 139032a6e48fSopenharmony_ci{ 139132a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 139232a6e48fSopenharmony_ci return false; 139332a6e48fSopenharmony_ci } 139432a6e48fSopenharmony_ci return bufferQueue_->GetStatus(); 139532a6e48fSopenharmony_ci} 139632a6e48fSopenharmony_ci 139732a6e48fSopenharmony_civoid BufferQueueProducer::SetStatus(bool status) 139832a6e48fSopenharmony_ci{ 139932a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 140032a6e48fSopenharmony_ci return; 140132a6e48fSopenharmony_ci } 140232a6e48fSopenharmony_ci bufferQueue_->SetStatus(status); 140332a6e48fSopenharmony_ci} 140432a6e48fSopenharmony_ci 140532a6e48fSopenharmony_ciGSError BufferQueueProducer::SetGlobalAlpha(int32_t alpha) 140632a6e48fSopenharmony_ci{ 140732a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 140832a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 140932a6e48fSopenharmony_ci } 141032a6e48fSopenharmony_ci return bufferQueue_->SetGlobalAlpha(alpha); 141132a6e48fSopenharmony_ci} 141232a6e48fSopenharmony_ci 141332a6e48fSopenharmony_cisptr<NativeSurface> BufferQueueProducer::GetNativeSurface() 141432a6e48fSopenharmony_ci{ 141532a6e48fSopenharmony_ci return nullptr; 141632a6e48fSopenharmony_ci} 141732a6e48fSopenharmony_ci 141832a6e48fSopenharmony_civoid BufferQueueProducer::OnBufferProducerRemoteDied() 141932a6e48fSopenharmony_ci{ 142032a6e48fSopenharmony_ci if (bufferQueue_ == nullptr) { 142132a6e48fSopenharmony_ci return; 142232a6e48fSopenharmony_ci } 142332a6e48fSopenharmony_ci 142432a6e48fSopenharmony_ci { 142532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 142632a6e48fSopenharmony_ci if (connectedPid_ == 0) { 142732a6e48fSopenharmony_ci BLOGD("no connections, uniqueId: %{public}" PRIu64 ".", uniqueId_); 142832a6e48fSopenharmony_ci return; 142932a6e48fSopenharmony_ci } 143032a6e48fSopenharmony_ci connectedPid_ = 0; 143132a6e48fSopenharmony_ci } 143232a6e48fSopenharmony_ci bufferQueue_->CleanCache(false); 143332a6e48fSopenharmony_ci} 143432a6e48fSopenharmony_ci 143532a6e48fSopenharmony_ciBufferQueueProducer::ProducerSurfaceDeathRecipient::ProducerSurfaceDeathRecipient( 143632a6e48fSopenharmony_ci wptr<BufferQueueProducer> producer) : producer_(producer) 143732a6e48fSopenharmony_ci{ 143832a6e48fSopenharmony_ci} 143932a6e48fSopenharmony_ci 144032a6e48fSopenharmony_civoid BufferQueueProducer::ProducerSurfaceDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remoteObject) 144132a6e48fSopenharmony_ci{ 144232a6e48fSopenharmony_ci auto remoteToken = remoteObject.promote(); 144332a6e48fSopenharmony_ci if (remoteToken == nullptr) { 144432a6e48fSopenharmony_ci BLOGW("can't promote remote object."); 144532a6e48fSopenharmony_ci return; 144632a6e48fSopenharmony_ci } 144732a6e48fSopenharmony_ci 144832a6e48fSopenharmony_ci auto producer = producer_.promote(); 144932a6e48fSopenharmony_ci if (producer == nullptr) { 145032a6e48fSopenharmony_ci BLOGD("producer is nullptr"); 145132a6e48fSopenharmony_ci return; 145232a6e48fSopenharmony_ci } 145332a6e48fSopenharmony_ci 145432a6e48fSopenharmony_ci if (producer->token_ != remoteToken) { 145532a6e48fSopenharmony_ci BLOGD("token doesn't match, ignore it, uniqueId: %{public}" PRIu64 ".", producer->GetUniqueId()); 145632a6e48fSopenharmony_ci return; 145732a6e48fSopenharmony_ci } 145832a6e48fSopenharmony_ci BLOGD("remote object died, uniqueId: %{public}" PRIu64 ".", producer->GetUniqueId()); 145932a6e48fSopenharmony_ci producer->OnBufferProducerRemoteDied(); 146032a6e48fSopenharmony_ci} 146132a6e48fSopenharmony_ci}; // namespace OHOS 1462