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_client_producer.h" 1732a6e48fSopenharmony_ci 1832a6e48fSopenharmony_ci#include <cinttypes> 1932a6e48fSopenharmony_ci 2032a6e48fSopenharmony_ci#include <iremote_stub.h> 2132a6e48fSopenharmony_ci#include "buffer_log.h" 2232a6e48fSopenharmony_ci#include "buffer_utils.h" 2332a6e48fSopenharmony_ci#include "hebc_white_list.h" 2432a6e48fSopenharmony_ci#include "sync_fence.h" 2532a6e48fSopenharmony_ci#include "message_option.h" 2632a6e48fSopenharmony_ci#include "securec.h" 2732a6e48fSopenharmony_ci#include "rs_frame_report_ext.h" 2832a6e48fSopenharmony_ci 2932a6e48fSopenharmony_ci#define DEFINE_MESSAGE_VARIABLES(arg, ret, opt) \ 3032a6e48fSopenharmony_ci MessageOption opt; \ 3132a6e48fSopenharmony_ci MessageParcel arg; \ 3232a6e48fSopenharmony_ci MessageParcel ret; \ 3332a6e48fSopenharmony_ci do { \ 3432a6e48fSopenharmony_ci GSError retCode = MessageVariables(arg); \ 3532a6e48fSopenharmony_ci if (retCode != GSERROR_OK) { \ 3632a6e48fSopenharmony_ci return retCode; \ 3732a6e48fSopenharmony_ci } \ 3832a6e48fSopenharmony_ci } while (0) 3932a6e48fSopenharmony_ci 4032a6e48fSopenharmony_ci#define SEND_REQUEST(COMMAND, arguments, reply, option) \ 4132a6e48fSopenharmony_ci do { \ 4232a6e48fSopenharmony_ci GSError ret = SendRequest(COMMAND, arguments, reply, option); \ 4332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { \ 4432a6e48fSopenharmony_ci return ret; \ 4532a6e48fSopenharmony_ci } \ 4632a6e48fSopenharmony_ci } while (0) 4732a6e48fSopenharmony_ci 4832a6e48fSopenharmony_cinamespace OHOS { 4932a6e48fSopenharmony_cinamespace { 5032a6e48fSopenharmony_ci constexpr size_t MATRIX4_SIZE = 16; 5132a6e48fSopenharmony_ci} 5232a6e48fSopenharmony_ciBufferClientProducer::BufferClientProducer(const sptr<IRemoteObject>& impl) 5332a6e48fSopenharmony_ci : IRemoteProxy<IBufferProducer>(impl) 5432a6e48fSopenharmony_ci{ 5532a6e48fSopenharmony_ci} 5632a6e48fSopenharmony_ci 5732a6e48fSopenharmony_ciBufferClientProducer::~BufferClientProducer() 5832a6e48fSopenharmony_ci{ 5932a6e48fSopenharmony_ci} 6032a6e48fSopenharmony_ci 6132a6e48fSopenharmony_ciGSError BufferClientProducer::MessageVariables(MessageParcel &arg) 6232a6e48fSopenharmony_ci{ 6332a6e48fSopenharmony_ci if (!(arg).WriteInterfaceToken(GetDescriptor())) { 6432a6e48fSopenharmony_ci BLOGE("WriteInterfaceToken failed, uniqueId: %{public}" PRIu64 ".", uniqueId_); 6532a6e48fSopenharmony_ci return GSERROR_BINDER; 6632a6e48fSopenharmony_ci } 6732a6e48fSopenharmony_ci return GSERROR_OK; 6832a6e48fSopenharmony_ci} 6932a6e48fSopenharmony_ci 7032a6e48fSopenharmony_ciGSError BufferClientProducer::SendRequest(uint32_t command, MessageParcel &arg, 7132a6e48fSopenharmony_ci MessageParcel &reply, MessageOption &opt) 7232a6e48fSopenharmony_ci{ 7332a6e48fSopenharmony_ci sptr<IRemoteObject> remote = Remote(); 7432a6e48fSopenharmony_ci if (remote == nullptr) { 7532a6e48fSopenharmony_ci BLOGE("Remote is nullptr, uniqueId: %{public}" PRIu64 ".", uniqueId_); 7632a6e48fSopenharmony_ci return GSERROR_SERVER_ERROR; 7732a6e48fSopenharmony_ci } 7832a6e48fSopenharmony_ci int32_t ret = remote->SendRequest(command, arg, reply, opt); 7932a6e48fSopenharmony_ci if (ret != ERR_NONE) { 8032a6e48fSopenharmony_ci BLOGE("SendRequest ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_); 8132a6e48fSopenharmony_ci return GSERROR_BINDER; 8232a6e48fSopenharmony_ci } 8332a6e48fSopenharmony_ci return GSERROR_OK; 8432a6e48fSopenharmony_ci} 8532a6e48fSopenharmony_ci 8632a6e48fSopenharmony_ciGSError BufferClientProducer::CheckRetval(MessageParcel &reply) 8732a6e48fSopenharmony_ci{ 8832a6e48fSopenharmony_ci int32_t ret = reply.ReadInt32(); 8932a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 9032a6e48fSopenharmony_ci BLOGE("Remote ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_); 9132a6e48fSopenharmony_ci return static_cast<GSError>(ret); 9232a6e48fSopenharmony_ci } 9332a6e48fSopenharmony_ci return GSERROR_OK; 9432a6e48fSopenharmony_ci} 9532a6e48fSopenharmony_ci 9632a6e48fSopenharmony_ciGSError BufferClientProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata, 9732a6e48fSopenharmony_ci RequestBufferReturnValue &retval) 9832a6e48fSopenharmony_ci{ 9932a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 10032a6e48fSopenharmony_ci 10132a6e48fSopenharmony_ci GSError ret = WriteRequestConfig(arguments, config); 10232a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 10332a6e48fSopenharmony_ci return ret; 10432a6e48fSopenharmony_ci } 10532a6e48fSopenharmony_ci 10632a6e48fSopenharmony_ci retval.isConnected = false; 10732a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFER, arguments, reply, option); 10832a6e48fSopenharmony_ci ret = CheckRetval(reply); 10932a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 11032a6e48fSopenharmony_ci reply.ReadBool(retval.isConnected); 11132a6e48fSopenharmony_ci return ret; 11232a6e48fSopenharmony_ci } 11332a6e48fSopenharmony_ci 11432a6e48fSopenharmony_ci ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer); 11532a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 11632a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 11732a6e48fSopenharmony_ci } 11832a6e48fSopenharmony_ci if (retval.buffer != nullptr) { 11932a6e48fSopenharmony_ci retval.buffer->SetBufferRequestConfig(config); 12032a6e48fSopenharmony_ci } 12132a6e48fSopenharmony_ci 12232a6e48fSopenharmony_ci ret = bedata->ReadFromParcel(reply); 12332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 12432a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 12532a6e48fSopenharmony_ci } 12632a6e48fSopenharmony_ci retval.fence = SyncFence::ReadFromMessageParcel(reply); 12732a6e48fSopenharmony_ci if (!reply.ReadUInt32Vector(&retval.deletingBuffers)) { 12832a6e48fSopenharmony_ci return GSERROR_BINDER; 12932a6e48fSopenharmony_ci } 13032a6e48fSopenharmony_ci 13132a6e48fSopenharmony_ci return GSERROR_OK; 13232a6e48fSopenharmony_ci} 13332a6e48fSopenharmony_ci 13432a6e48fSopenharmony_ciGSError BufferClientProducer::RequestBuffers(const BufferRequestConfig &config, 13532a6e48fSopenharmony_ci std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues) 13632a6e48fSopenharmony_ci{ 13732a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 13832a6e48fSopenharmony_ci 13932a6e48fSopenharmony_ci uint32_t num = static_cast<uint32_t>(bedata.size()); 14032a6e48fSopenharmony_ci if (!arguments.WriteUint32(num)) { 14132a6e48fSopenharmony_ci return GSERROR_BINDER; 14232a6e48fSopenharmony_ci } 14332a6e48fSopenharmony_ci GSError ret = WriteRequestConfig(arguments, config); 14432a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 14532a6e48fSopenharmony_ci return ret; 14632a6e48fSopenharmony_ci } 14732a6e48fSopenharmony_ci retvalues[0].isConnected = false; 14832a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFERS, arguments, reply, option); 14932a6e48fSopenharmony_ci ret = CheckRetval(reply); 15032a6e48fSopenharmony_ci if (ret != GSERROR_OK && ret != GSERROR_NO_BUFFER) { 15132a6e48fSopenharmony_ci reply.ReadBool(retvalues[0].isConnected); 15232a6e48fSopenharmony_ci return ret; 15332a6e48fSopenharmony_ci } 15432a6e48fSopenharmony_ci 15532a6e48fSopenharmony_ci num = reply.ReadUint32(); 15632a6e48fSopenharmony_ci if (num > SURFACE_MAX_QUEUE_SIZE || num == 0) { 15732a6e48fSopenharmony_ci BLOGE("num is invalid, %{public}u, uniqueId: %{public}" PRIu64 ".", num, uniqueId_); 15832a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 15932a6e48fSopenharmony_ci } 16032a6e48fSopenharmony_ci 16132a6e48fSopenharmony_ci ret = GSERROR_OK; 16232a6e48fSopenharmony_ci retvalues.resize(num); 16332a6e48fSopenharmony_ci for (size_t i = 0; i < num; ++i) { 16432a6e48fSopenharmony_ci auto &retval = retvalues[i]; 16532a6e48fSopenharmony_ci ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer); 16632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 16732a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 16832a6e48fSopenharmony_ci } 16932a6e48fSopenharmony_ci if (retval.buffer != nullptr) { 17032a6e48fSopenharmony_ci retval.buffer->SetBufferRequestConfig(config); 17132a6e48fSopenharmony_ci } 17232a6e48fSopenharmony_ci ret = bedata[i]->ReadFromParcel(reply); 17332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 17432a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 17532a6e48fSopenharmony_ci } 17632a6e48fSopenharmony_ci retval.fence = SyncFence::ReadFromMessageParcel(reply); 17732a6e48fSopenharmony_ci if (!reply.ReadUInt32Vector(&retval.deletingBuffers)) { 17832a6e48fSopenharmony_ci return GSERROR_BINDER; 17932a6e48fSopenharmony_ci } 18032a6e48fSopenharmony_ci } 18132a6e48fSopenharmony_ci return ret; 18232a6e48fSopenharmony_ci} 18332a6e48fSopenharmony_ci 18432a6e48fSopenharmony_ciGSError BufferClientProducer::GetLastFlushedBufferCommon(sptr<SurfaceBuffer>& buffer, 18532a6e48fSopenharmony_ci sptr<SyncFence>& fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, uint32_t command) 18632a6e48fSopenharmony_ci{ 18732a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 18832a6e48fSopenharmony_ci if (!arguments.WriteBool(isUseNewMatrix)) { 18932a6e48fSopenharmony_ci return GSERROR_BINDER; 19032a6e48fSopenharmony_ci } 19132a6e48fSopenharmony_ci SEND_REQUEST(command, arguments, reply, option); 19232a6e48fSopenharmony_ci GSError ret = CheckRetval(reply); 19332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 19432a6e48fSopenharmony_ci return ret; 19532a6e48fSopenharmony_ci } 19632a6e48fSopenharmony_ci uint32_t sequence; 19732a6e48fSopenharmony_ci ret = ReadSurfaceBufferImpl(reply, sequence, buffer); 19832a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 19932a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 20032a6e48fSopenharmony_ci } 20132a6e48fSopenharmony_ci if (buffer == nullptr) { 20232a6e48fSopenharmony_ci return SURFACE_ERROR_NULLPTR; 20332a6e48fSopenharmony_ci } 20432a6e48fSopenharmony_ci ret = buffer->ReadBufferRequestConfig(reply); 20532a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 20632a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 20732a6e48fSopenharmony_ci } 20832a6e48fSopenharmony_ci 20932a6e48fSopenharmony_ci fence = SyncFence::ReadFromMessageParcel(reply); 21032a6e48fSopenharmony_ci std::vector<float> readMatrixVector; 21132a6e48fSopenharmony_ci if (!reply.ReadFloatVector(&readMatrixVector)) { 21232a6e48fSopenharmony_ci return GSERROR_BINDER; 21332a6e48fSopenharmony_ci } 21432a6e48fSopenharmony_ci if (readMatrixVector.size() != MATRIX4_SIZE) { 21532a6e48fSopenharmony_ci return GSERROR_INVALID_ARGUMENTS; 21632a6e48fSopenharmony_ci } 21732a6e48fSopenharmony_ci if (memcpy_s(matrix, matrixSize * sizeof(float), 21832a6e48fSopenharmony_ci readMatrixVector.data(), readMatrixVector.size() * sizeof(float)) != EOK) { 21932a6e48fSopenharmony_ci BLOGE("memcpy_s fail, uniqueId: %{public}" PRIu64 ".", uniqueId_); 22032a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 22132a6e48fSopenharmony_ci } 22232a6e48fSopenharmony_ci return GSERROR_OK; 22332a6e48fSopenharmony_ci} 22432a6e48fSopenharmony_ci 22532a6e48fSopenharmony_ciGSError BufferClientProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, 22632a6e48fSopenharmony_ci sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix) 22732a6e48fSopenharmony_ci{ 22832a6e48fSopenharmony_ci return GetLastFlushedBufferCommon(buffer, fence, 22932a6e48fSopenharmony_ci matrix, MATRIX4_SIZE, isUseNewMatrix, BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER); 23032a6e48fSopenharmony_ci} 23132a6e48fSopenharmony_ci 23232a6e48fSopenharmony_ciGSError BufferClientProducer::GetProducerInitInfo(ProducerInitInfo &info) 23332a6e48fSopenharmony_ci{ 23432a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 23532a6e48fSopenharmony_ci token_ = new IRemoteStub<IBufferProducerToken>(); 23632a6e48fSopenharmony_ci HebcWhiteList::GetInstance().GetApplicationName(info.appName); 23732a6e48fSopenharmony_ci if (!arguments.WriteRemoteObject(token_->AsObject()) || !arguments.WriteString(info.appName)) { 23832a6e48fSopenharmony_ci return GSERROR_BINDER; 23932a6e48fSopenharmony_ci } 24032a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_INIT_INFO, arguments, reply, option); 24132a6e48fSopenharmony_ci if (!reply.ReadInt32(info.width) || !reply.ReadInt32(info.height) || 24232a6e48fSopenharmony_ci !reply.ReadUint64(info.uniqueId)) { 24332a6e48fSopenharmony_ci return GSERROR_BINDER; 24432a6e48fSopenharmony_ci } 24532a6e48fSopenharmony_ci uniqueId_ = info.uniqueId; 24632a6e48fSopenharmony_ci if (!reply.ReadString(info.name) || !reply.ReadBool(info.isInHebcList)) { 24732a6e48fSopenharmony_ci return GSERROR_BINDER; 24832a6e48fSopenharmony_ci } 24932a6e48fSopenharmony_ci return CheckRetval(reply); 25032a6e48fSopenharmony_ci} 25132a6e48fSopenharmony_ci 25232a6e48fSopenharmony_ciGSError BufferClientProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata) 25332a6e48fSopenharmony_ci{ 25432a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 25532a6e48fSopenharmony_ci 25632a6e48fSopenharmony_ci if (!arguments.WriteUint32(sequence)) { 25732a6e48fSopenharmony_ci return GSERROR_BINDER; 25832a6e48fSopenharmony_ci } 25932a6e48fSopenharmony_ci GSError ret = bedata->WriteToParcel(arguments); 26032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 26132a6e48fSopenharmony_ci return GSERROR_BINDER; 26232a6e48fSopenharmony_ci } 26332a6e48fSopenharmony_ci 26432a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option); 26532a6e48fSopenharmony_ci return CheckRetval(reply); 26632a6e48fSopenharmony_ci} 26732a6e48fSopenharmony_ci 26832a6e48fSopenharmony_ciGSError BufferClientProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata, 26932a6e48fSopenharmony_ci sptr<SyncFence> fence, BufferFlushConfigWithDamages &config) 27032a6e48fSopenharmony_ci{ 27132a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 27232a6e48fSopenharmony_ci 27332a6e48fSopenharmony_ci if (!arguments.WriteUint32(sequence)) { 27432a6e48fSopenharmony_ci return GSERROR_BINDER; 27532a6e48fSopenharmony_ci } 27632a6e48fSopenharmony_ci GSError ret = bedata->WriteToParcel(arguments); 27732a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 27832a6e48fSopenharmony_ci return ret; 27932a6e48fSopenharmony_ci } 28032a6e48fSopenharmony_ci if (!fence->WriteToMessageParcel(arguments)) { 28132a6e48fSopenharmony_ci return GSERROR_BINDER; 28232a6e48fSopenharmony_ci } 28332a6e48fSopenharmony_ci ret = WriteFlushConfig(arguments, config); 28432a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 28532a6e48fSopenharmony_ci return ret; 28632a6e48fSopenharmony_ci } 28732a6e48fSopenharmony_ci 28832a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option); 28932a6e48fSopenharmony_ci ret = CheckRetval(reply); 29032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 29132a6e48fSopenharmony_ci return ret; 29232a6e48fSopenharmony_ci } 29332a6e48fSopenharmony_ci 29432a6e48fSopenharmony_ci if (OHOS::RsFrameReportExt::GetInstance().GetEnable()) { 29532a6e48fSopenharmony_ci OHOS::RsFrameReportExt::GetInstance().HandleSwapBuffer(); 29632a6e48fSopenharmony_ci } 29732a6e48fSopenharmony_ci return GSERROR_OK; 29832a6e48fSopenharmony_ci} 29932a6e48fSopenharmony_ci 30032a6e48fSopenharmony_ciGSError BufferClientProducer::FlushBuffers(const std::vector<uint32_t> &sequences, 30132a6e48fSopenharmony_ci const std::vector<sptr<BufferExtraData>> &bedata, 30232a6e48fSopenharmony_ci const std::vector<sptr<SyncFence>> &fences, 30332a6e48fSopenharmony_ci const std::vector<BufferFlushConfigWithDamages> &configs) 30432a6e48fSopenharmony_ci{ 30532a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 30632a6e48fSopenharmony_ci 30732a6e48fSopenharmony_ci if (sequences.empty() || sequences.size() > SURFACE_MAX_QUEUE_SIZE) { 30832a6e48fSopenharmony_ci return SURFACE_ERROR_UNKOWN; 30932a6e48fSopenharmony_ci } 31032a6e48fSopenharmony_ci if (!arguments.WriteUInt32Vector(sequences)) { 31132a6e48fSopenharmony_ci return GSERROR_BINDER; 31232a6e48fSopenharmony_ci } 31332a6e48fSopenharmony_ci GSError ret = GSERROR_OK; 31432a6e48fSopenharmony_ci for (uint32_t i = 0; i < sequences.size(); ++i) { 31532a6e48fSopenharmony_ci ret = bedata[i]->WriteToParcel(arguments); 31632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 31732a6e48fSopenharmony_ci return ret; 31832a6e48fSopenharmony_ci } 31932a6e48fSopenharmony_ci if (!fences[i]->WriteToMessageParcel(arguments)) { 32032a6e48fSopenharmony_ci return GSERROR_BINDER; 32132a6e48fSopenharmony_ci } 32232a6e48fSopenharmony_ci ret = WriteFlushConfig(arguments, configs[i]); 32332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 32432a6e48fSopenharmony_ci return ret; 32532a6e48fSopenharmony_ci } 32632a6e48fSopenharmony_ci } 32732a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFERS, arguments, reply, option); 32832a6e48fSopenharmony_ci return CheckRetval(reply); 32932a6e48fSopenharmony_ci} 33032a6e48fSopenharmony_ci 33132a6e48fSopenharmony_ciGSError BufferClientProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer) 33232a6e48fSopenharmony_ci{ 33332a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 33432a6e48fSopenharmony_ci uint32_t sequence = buffer->GetSeqNum(); 33532a6e48fSopenharmony_ci GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer); 33632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 33732a6e48fSopenharmony_ci return ret; 33832a6e48fSopenharmony_ci } 33932a6e48fSopenharmony_ci ret = buffer->WriteBufferRequestConfig(arguments); 34032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 34132a6e48fSopenharmony_ci BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_); 34232a6e48fSopenharmony_ci return ret; 34332a6e48fSopenharmony_ci } 34432a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, arguments, reply, option); 34532a6e48fSopenharmony_ci return CheckRetval(reply); 34632a6e48fSopenharmony_ci} 34732a6e48fSopenharmony_ci 34832a6e48fSopenharmony_ciGSError BufferClientProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer) 34932a6e48fSopenharmony_ci{ 35032a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 35132a6e48fSopenharmony_ci uint32_t sequence = buffer->GetSeqNum(); 35232a6e48fSopenharmony_ci GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer); 35332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 35432a6e48fSopenharmony_ci return ret; 35532a6e48fSopenharmony_ci } 35632a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, arguments, reply, option); 35732a6e48fSopenharmony_ci return CheckRetval(reply); 35832a6e48fSopenharmony_ci} 35932a6e48fSopenharmony_ci 36032a6e48fSopenharmony_ciGSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer) 36132a6e48fSopenharmony_ci{ 36232a6e48fSopenharmony_ci return GSERROR_NOT_SUPPORT; 36332a6e48fSopenharmony_ci} 36432a6e48fSopenharmony_ci 36532a6e48fSopenharmony_ciGSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut) 36632a6e48fSopenharmony_ci{ 36732a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 36832a6e48fSopenharmony_ci uint32_t sequence = buffer->GetSeqNum(); 36932a6e48fSopenharmony_ci GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer); 37032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 37132a6e48fSopenharmony_ci return ret; 37232a6e48fSopenharmony_ci } 37332a6e48fSopenharmony_ci if (!arguments.WriteInt32(timeOut)) { 37432a6e48fSopenharmony_ci return GSERROR_BINDER; 37532a6e48fSopenharmony_ci } 37632a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER, arguments, reply, option); 37732a6e48fSopenharmony_ci return CheckRetval(reply); 37832a6e48fSopenharmony_ci} 37932a6e48fSopenharmony_ci 38032a6e48fSopenharmony_ciGSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer) 38132a6e48fSopenharmony_ci{ 38232a6e48fSopenharmony_ci return GSERROR_NOT_SUPPORT; 38332a6e48fSopenharmony_ci} 38432a6e48fSopenharmony_ci 38532a6e48fSopenharmony_ciGSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener) 38632a6e48fSopenharmony_ci{ 38732a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 38832a6e48fSopenharmony_ci 38932a6e48fSopenharmony_ci if (!arguments.WriteRemoteObject(listener->AsObject())) { 39032a6e48fSopenharmony_ci return GSERROR_BINDER; 39132a6e48fSopenharmony_ci } 39232a6e48fSopenharmony_ci 39332a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option); 39432a6e48fSopenharmony_ci return CheckRetval(reply); 39532a6e48fSopenharmony_ci} 39632a6e48fSopenharmony_ci 39732a6e48fSopenharmony_ciGSError BufferClientProducer::UnRegisterReleaseListener() 39832a6e48fSopenharmony_ci{ 39932a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 40032a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option); 40132a6e48fSopenharmony_ci return CheckRetval(reply); 40232a6e48fSopenharmony_ci} 40332a6e48fSopenharmony_ci 40432a6e48fSopenharmony_ciuint32_t BufferClientProducer::GetQueueSize() 40532a6e48fSopenharmony_ci{ 40632a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 40732a6e48fSopenharmony_ci 40832a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option); 40932a6e48fSopenharmony_ci 41032a6e48fSopenharmony_ci return reply.ReadUint32(); 41132a6e48fSopenharmony_ci} 41232a6e48fSopenharmony_ci 41332a6e48fSopenharmony_ciGSError BufferClientProducer::SetQueueSize(uint32_t queueSize) 41432a6e48fSopenharmony_ci{ 41532a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 41632a6e48fSopenharmony_ci 41732a6e48fSopenharmony_ci if (!arguments.WriteUint32(queueSize)) { 41832a6e48fSopenharmony_ci return GSERROR_BINDER; 41932a6e48fSopenharmony_ci } 42032a6e48fSopenharmony_ci 42132a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option); 42232a6e48fSopenharmony_ci return CheckRetval(reply); 42332a6e48fSopenharmony_ci} 42432a6e48fSopenharmony_ci 42532a6e48fSopenharmony_ciGSError BufferClientProducer::GetName(std::string &name) 42632a6e48fSopenharmony_ci{ 42732a6e48fSopenharmony_ci { 42832a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 42932a6e48fSopenharmony_ci if (name_ != DEFAULT_NAME) { 43032a6e48fSopenharmony_ci name = name_; 43132a6e48fSopenharmony_ci return GSERROR_OK; 43232a6e48fSopenharmony_ci } 43332a6e48fSopenharmony_ci } 43432a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 43532a6e48fSopenharmony_ci 43632a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option); 43732a6e48fSopenharmony_ci GSError ret = CheckRetval(reply); 43832a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 43932a6e48fSopenharmony_ci return ret; 44032a6e48fSopenharmony_ci } 44132a6e48fSopenharmony_ci if (!reply.ReadString(name)) { 44232a6e48fSopenharmony_ci BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_); 44332a6e48fSopenharmony_ci return GSERROR_BINDER; 44432a6e48fSopenharmony_ci } 44532a6e48fSopenharmony_ci { 44632a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 44732a6e48fSopenharmony_ci name_ = name; 44832a6e48fSopenharmony_ci } 44932a6e48fSopenharmony_ci return ret; 45032a6e48fSopenharmony_ci} 45132a6e48fSopenharmony_ci 45232a6e48fSopenharmony_ciuint64_t BufferClientProducer::GetUniqueId() 45332a6e48fSopenharmony_ci{ 45432a6e48fSopenharmony_ci { 45532a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 45632a6e48fSopenharmony_ci if (uniqueId_ != 0) { 45732a6e48fSopenharmony_ci return uniqueId_; 45832a6e48fSopenharmony_ci } 45932a6e48fSopenharmony_ci } 46032a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 46132a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option); 46232a6e48fSopenharmony_ci { 46332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 46432a6e48fSopenharmony_ci uniqueId_ = reply.ReadUint64(); 46532a6e48fSopenharmony_ci return uniqueId_; 46632a6e48fSopenharmony_ci } 46732a6e48fSopenharmony_ci} 46832a6e48fSopenharmony_ci 46932a6e48fSopenharmony_ciGSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId) 47032a6e48fSopenharmony_ci{ 47132a6e48fSopenharmony_ci { 47232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 47332a6e48fSopenharmony_ci if (uniqueId_ != 0 && name_ != DEFAULT_NAME) { 47432a6e48fSopenharmony_ci uniqueId = uniqueId_; 47532a6e48fSopenharmony_ci name = name_; 47632a6e48fSopenharmony_ci return GSERROR_OK; 47732a6e48fSopenharmony_ci } 47832a6e48fSopenharmony_ci } 47932a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 48032a6e48fSopenharmony_ci 48132a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option); 48232a6e48fSopenharmony_ci GSError ret = CheckRetval(reply); 48332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 48432a6e48fSopenharmony_ci return ret; 48532a6e48fSopenharmony_ci } 48632a6e48fSopenharmony_ci if (!reply.ReadString(name)) { 48732a6e48fSopenharmony_ci BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_); 48832a6e48fSopenharmony_ci return GSERROR_BINDER; 48932a6e48fSopenharmony_ci } 49032a6e48fSopenharmony_ci 49132a6e48fSopenharmony_ci uniqueId = reply.ReadUint64(); 49232a6e48fSopenharmony_ci { 49332a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 49432a6e48fSopenharmony_ci name_ = name; 49532a6e48fSopenharmony_ci uniqueId_ = uniqueId; 49632a6e48fSopenharmony_ci } 49732a6e48fSopenharmony_ci return ret; 49832a6e48fSopenharmony_ci} 49932a6e48fSopenharmony_ci 50032a6e48fSopenharmony_ciint32_t BufferClientProducer::GetDefaultWidth() 50132a6e48fSopenharmony_ci{ 50232a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 50332a6e48fSopenharmony_ci 50432a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option); 50532a6e48fSopenharmony_ci 50632a6e48fSopenharmony_ci return reply.ReadInt32(); 50732a6e48fSopenharmony_ci} 50832a6e48fSopenharmony_ci 50932a6e48fSopenharmony_ciint32_t BufferClientProducer::GetDefaultHeight() 51032a6e48fSopenharmony_ci{ 51132a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 51232a6e48fSopenharmony_ci 51332a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option); 51432a6e48fSopenharmony_ci 51532a6e48fSopenharmony_ci return reply.ReadInt32(); 51632a6e48fSopenharmony_ci} 51732a6e48fSopenharmony_ci 51832a6e48fSopenharmony_ciGSError BufferClientProducer::SetDefaultUsage(uint64_t usage) 51932a6e48fSopenharmony_ci{ 52032a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 52132a6e48fSopenharmony_ci 52232a6e48fSopenharmony_ci if (!arguments.WriteUint64(usage)) { 52332a6e48fSopenharmony_ci return GSERROR_BINDER; 52432a6e48fSopenharmony_ci } 52532a6e48fSopenharmony_ci 52632a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_DEFAULT_USAGE, arguments, reply, option); 52732a6e48fSopenharmony_ci 52832a6e48fSopenharmony_ci return CheckRetval(reply); 52932a6e48fSopenharmony_ci} 53032a6e48fSopenharmony_ci 53132a6e48fSopenharmony_ciuint64_t BufferClientProducer::GetDefaultUsage() 53232a6e48fSopenharmony_ci{ 53332a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 53432a6e48fSopenharmony_ci 53532a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option); 53632a6e48fSopenharmony_ci 53732a6e48fSopenharmony_ci return reply.ReadUint64(); 53832a6e48fSopenharmony_ci} 53932a6e48fSopenharmony_ci 54032a6e48fSopenharmony_ciGSError BufferClientProducer::CleanCache(bool cleanAll) 54132a6e48fSopenharmony_ci{ 54232a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 54332a6e48fSopenharmony_ci 54432a6e48fSopenharmony_ci if (!arguments.WriteBool(cleanAll)) { 54532a6e48fSopenharmony_ci return GSERROR_BINDER; 54632a6e48fSopenharmony_ci } 54732a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option); 54832a6e48fSopenharmony_ci return CheckRetval(reply); 54932a6e48fSopenharmony_ci} 55032a6e48fSopenharmony_ci 55132a6e48fSopenharmony_ciGSError BufferClientProducer::GoBackground() 55232a6e48fSopenharmony_ci{ 55332a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 55432a6e48fSopenharmony_ci 55532a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option); 55632a6e48fSopenharmony_ci return CheckRetval(reply); 55732a6e48fSopenharmony_ci} 55832a6e48fSopenharmony_ci 55932a6e48fSopenharmony_ciGSError BufferClientProducer::SetTransform(GraphicTransformType transform) 56032a6e48fSopenharmony_ci{ 56132a6e48fSopenharmony_ci { 56232a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 56332a6e48fSopenharmony_ci if (lastSetTransformType_ == transform) { 56432a6e48fSopenharmony_ci return GSERROR_OK; 56532a6e48fSopenharmony_ci } 56632a6e48fSopenharmony_ci lastSetTransformType_ = transform; 56732a6e48fSopenharmony_ci } 56832a6e48fSopenharmony_ci 56932a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 57032a6e48fSopenharmony_ci 57132a6e48fSopenharmony_ci if (!arguments.WriteUint32(static_cast<uint32_t>(transform))) { 57232a6e48fSopenharmony_ci return GSERROR_BINDER; 57332a6e48fSopenharmony_ci } 57432a6e48fSopenharmony_ci 57532a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option); 57632a6e48fSopenharmony_ci GSError ret = CheckRetval(reply); 57732a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 57832a6e48fSopenharmony_ci { 57932a6e48fSopenharmony_ci std::lock_guard<std::mutex> lockGuard(mutex_); 58032a6e48fSopenharmony_ci lastSetTransformType_ = GraphicTransformType::GRAPHIC_ROTATE_BUTT; 58132a6e48fSopenharmony_ci } 58232a6e48fSopenharmony_ci return ret; 58332a6e48fSopenharmony_ci } 58432a6e48fSopenharmony_ci 58532a6e48fSopenharmony_ci return GSERROR_OK; 58632a6e48fSopenharmony_ci} 58732a6e48fSopenharmony_ci 58832a6e48fSopenharmony_ciGSError BufferClientProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos, 58932a6e48fSopenharmony_ci std::vector<bool> &supporteds) 59032a6e48fSopenharmony_ci{ 59132a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 59232a6e48fSopenharmony_ci 59332a6e48fSopenharmony_ci GSError ret = WriteVerifyAllocInfo(arguments, infos); 59432a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 59532a6e48fSopenharmony_ci return ret; 59632a6e48fSopenharmony_ci } 59732a6e48fSopenharmony_ci 59832a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_IS_SUPPORTED_ALLOC, arguments, reply, option); 59932a6e48fSopenharmony_ci ret = CheckRetval(reply); 60032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 60132a6e48fSopenharmony_ci return ret; 60232a6e48fSopenharmony_ci } 60332a6e48fSopenharmony_ci 60432a6e48fSopenharmony_ci if (!reply.ReadBoolVector(&supporteds)) { 60532a6e48fSopenharmony_ci BLOGE("reply.ReadBoolVector return false, uniqueId: %{public}" PRIu64 ".", uniqueId_); 60632a6e48fSopenharmony_ci return GSERROR_BINDER; 60732a6e48fSopenharmony_ci } 60832a6e48fSopenharmony_ci 60932a6e48fSopenharmony_ci return static_cast<GSError>(ret); 61032a6e48fSopenharmony_ci} 61132a6e48fSopenharmony_ci 61232a6e48fSopenharmony_ciGSError BufferClientProducer::Connect() 61332a6e48fSopenharmony_ci{ 61432a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 61532a6e48fSopenharmony_ci 61632a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_CONNECT, arguments, reply, option); 61732a6e48fSopenharmony_ci return CheckRetval(reply); 61832a6e48fSopenharmony_ci} 61932a6e48fSopenharmony_ci 62032a6e48fSopenharmony_ciGSError BufferClientProducer::Disconnect() 62132a6e48fSopenharmony_ci{ 62232a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 62332a6e48fSopenharmony_ci 62432a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option); 62532a6e48fSopenharmony_ci return CheckRetval(reply); 62632a6e48fSopenharmony_ci} 62732a6e48fSopenharmony_ci 62832a6e48fSopenharmony_ciGSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode) 62932a6e48fSopenharmony_ci{ 63032a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 63132a6e48fSopenharmony_ci if (!arguments.WriteUint32(sequence) || !arguments.WriteInt32(static_cast<int32_t>(scalingMode))) { 63232a6e48fSopenharmony_ci return GSERROR_BINDER; 63332a6e48fSopenharmony_ci } 63432a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option); 63532a6e48fSopenharmony_ci return CheckRetval(reply); 63632a6e48fSopenharmony_ci} 63732a6e48fSopenharmony_ci 63832a6e48fSopenharmony_ciGSError BufferClientProducer::SetScalingMode(ScalingMode scalingMode) 63932a6e48fSopenharmony_ci{ 64032a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 64132a6e48fSopenharmony_ci if (!arguments.WriteInt32(static_cast<int32_t>(scalingMode))) { 64232a6e48fSopenharmony_ci return GSERROR_BINDER; 64332a6e48fSopenharmony_ci } 64432a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODEV2, arguments, reply, option); 64532a6e48fSopenharmony_ci return CheckRetval(reply); 64632a6e48fSopenharmony_ci} 64732a6e48fSopenharmony_ci 64832a6e48fSopenharmony_ciGSError BufferClientProducer::SetBufferHold(bool hold) 64932a6e48fSopenharmony_ci{ 65032a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 65132a6e48fSopenharmony_ci if (!arguments.WriteBool(hold)) { 65232a6e48fSopenharmony_ci return GSERROR_BINDER; 65332a6e48fSopenharmony_ci } 65432a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_HOLD, arguments, reply, option); 65532a6e48fSopenharmony_ci return CheckRetval(reply); 65632a6e48fSopenharmony_ci} 65732a6e48fSopenharmony_ci 65832a6e48fSopenharmony_ciGSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData) 65932a6e48fSopenharmony_ci{ 66032a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 66132a6e48fSopenharmony_ci if (!arguments.WriteUint32(sequence)) { 66232a6e48fSopenharmony_ci return GSERROR_BINDER; 66332a6e48fSopenharmony_ci } 66432a6e48fSopenharmony_ci GSError ret = WriteHDRMetaData(arguments, metaData); 66532a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 66632a6e48fSopenharmony_ci return ret; 66732a6e48fSopenharmony_ci } 66832a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option); 66932a6e48fSopenharmony_ci return CheckRetval(reply); 67032a6e48fSopenharmony_ci} 67132a6e48fSopenharmony_ci 67232a6e48fSopenharmony_ciGSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key, 67332a6e48fSopenharmony_ci const std::vector<uint8_t> &metaData) 67432a6e48fSopenharmony_ci{ 67532a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 67632a6e48fSopenharmony_ci if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(key))) { 67732a6e48fSopenharmony_ci return GSERROR_BINDER; 67832a6e48fSopenharmony_ci } 67932a6e48fSopenharmony_ci GSError ret = WriteHDRMetaDataSet(arguments, metaData); 68032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 68132a6e48fSopenharmony_ci return ret; 68232a6e48fSopenharmony_ci } 68332a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option); 68432a6e48fSopenharmony_ci return CheckRetval(reply); 68532a6e48fSopenharmony_ci} 68632a6e48fSopenharmony_ci 68732a6e48fSopenharmony_ciGSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle) 68832a6e48fSopenharmony_ci{ 68932a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 69032a6e48fSopenharmony_ci if (handle == nullptr) { 69132a6e48fSopenharmony_ci if (!arguments.WriteBool(false)) { 69232a6e48fSopenharmony_ci return GSERROR_BINDER; 69332a6e48fSopenharmony_ci } 69432a6e48fSopenharmony_ci } else { 69532a6e48fSopenharmony_ci if (!arguments.WriteBool(true)) { 69632a6e48fSopenharmony_ci return GSERROR_BINDER; 69732a6e48fSopenharmony_ci } 69832a6e48fSopenharmony_ci GSError ret = WriteExtDataHandle(arguments, handle); 69932a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 70032a6e48fSopenharmony_ci return ret; 70132a6e48fSopenharmony_ci } 70232a6e48fSopenharmony_ci } 70332a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option); 70432a6e48fSopenharmony_ci return CheckRetval(reply); 70532a6e48fSopenharmony_ci} 70632a6e48fSopenharmony_ci 70732a6e48fSopenharmony_ciGSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time) 70832a6e48fSopenharmony_ci{ 70932a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 71032a6e48fSopenharmony_ci if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(type))) { 71132a6e48fSopenharmony_ci return GSERROR_BINDER; 71232a6e48fSopenharmony_ci } 71332a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option); 71432a6e48fSopenharmony_ci GSError ret = CheckRetval(reply); 71532a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 71632a6e48fSopenharmony_ci return ret; 71732a6e48fSopenharmony_ci } 71832a6e48fSopenharmony_ci time = reply.ReadInt64(); 71932a6e48fSopenharmony_ci return static_cast<GSError>(ret); 72032a6e48fSopenharmony_ci} 72132a6e48fSopenharmony_ci 72232a6e48fSopenharmony_cisptr<NativeSurface> BufferClientProducer::GetNativeSurface() 72332a6e48fSopenharmony_ci{ 72432a6e48fSopenharmony_ci return nullptr; 72532a6e48fSopenharmony_ci} 72632a6e48fSopenharmony_ci 72732a6e48fSopenharmony_ciGSError BufferClientProducer::GetTransform(GraphicTransformType &transform) 72832a6e48fSopenharmony_ci{ 72932a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 73032a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_TRANSFORM, arguments, reply, option); 73132a6e48fSopenharmony_ci 73232a6e48fSopenharmony_ci GSError ret = CheckRetval(reply); 73332a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 73432a6e48fSopenharmony_ci return ret; 73532a6e48fSopenharmony_ci } 73632a6e48fSopenharmony_ci transform = static_cast<GraphicTransformType>(reply.ReadUint32()); 73732a6e48fSopenharmony_ci return GSERROR_OK; 73832a6e48fSopenharmony_ci} 73932a6e48fSopenharmony_ci 74032a6e48fSopenharmony_ciGSError BufferClientProducer::GetTransformHint(GraphicTransformType &transformHint) 74132a6e48fSopenharmony_ci{ 74232a6e48fSopenharmony_ci return GSERROR_NOT_SUPPORT; 74332a6e48fSopenharmony_ci} 74432a6e48fSopenharmony_ci 74532a6e48fSopenharmony_ciGSError BufferClientProducer::SetTransformHint(GraphicTransformType transformHint) 74632a6e48fSopenharmony_ci{ 74732a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 74832a6e48fSopenharmony_ci 74932a6e48fSopenharmony_ci if (!arguments.WriteUint32(static_cast<uint32_t>(transformHint))) { 75032a6e48fSopenharmony_ci return GSERROR_BINDER; 75132a6e48fSopenharmony_ci } 75232a6e48fSopenharmony_ci 75332a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORMHINT, arguments, reply, option); 75432a6e48fSopenharmony_ci return CheckRetval(reply); 75532a6e48fSopenharmony_ci} 75632a6e48fSopenharmony_ci 75732a6e48fSopenharmony_ciGSError BufferClientProducer::SetSurfaceSourceType(OHSurfaceSource sourceType) 75832a6e48fSopenharmony_ci{ 75932a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 76032a6e48fSopenharmony_ci if (!arguments.WriteUint32(static_cast<uint32_t>(sourceType))) { 76132a6e48fSopenharmony_ci return GSERROR_BINDER; 76232a6e48fSopenharmony_ci } 76332a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_SOURCE_TYPE, arguments, reply, option); 76432a6e48fSopenharmony_ci return CheckRetval(reply); 76532a6e48fSopenharmony_ci} 76632a6e48fSopenharmony_ci 76732a6e48fSopenharmony_ciGSError BufferClientProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType) 76832a6e48fSopenharmony_ci{ 76932a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 77032a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_SOURCE_TYPE, arguments, reply, option); 77132a6e48fSopenharmony_ci GSError ret = CheckRetval(reply); 77232a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 77332a6e48fSopenharmony_ci return ret; 77432a6e48fSopenharmony_ci } 77532a6e48fSopenharmony_ci sourceType = static_cast<OHSurfaceSource>(reply.ReadUint32()); 77632a6e48fSopenharmony_ci return GSERROR_OK; 77732a6e48fSopenharmony_ci} 77832a6e48fSopenharmony_ci 77932a6e48fSopenharmony_ciGSError BufferClientProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType) 78032a6e48fSopenharmony_ci{ 78132a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 78232a6e48fSopenharmony_ci if (!arguments.WriteString(appFrameworkType)) { 78332a6e48fSopenharmony_ci return GSERROR_BINDER; 78432a6e48fSopenharmony_ci } 78532a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, arguments, reply, option); 78632a6e48fSopenharmony_ci return CheckRetval(reply); 78732a6e48fSopenharmony_ci} 78832a6e48fSopenharmony_ci 78932a6e48fSopenharmony_ciGSError BufferClientProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType) 79032a6e48fSopenharmony_ci{ 79132a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 79232a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, arguments, reply, option); 79332a6e48fSopenharmony_ci GSError ret = CheckRetval(reply); 79432a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 79532a6e48fSopenharmony_ci return ret; 79632a6e48fSopenharmony_ci } 79732a6e48fSopenharmony_ci appFrameworkType = static_cast<std::string>(reply.ReadString()); 79832a6e48fSopenharmony_ci return GSERROR_OK; 79932a6e48fSopenharmony_ci} 80032a6e48fSopenharmony_ci 80132a6e48fSopenharmony_ciGSError BufferClientProducer::SetHdrWhitePointBrightness(float brightness) 80232a6e48fSopenharmony_ci{ 80332a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 80432a6e48fSopenharmony_ci 80532a6e48fSopenharmony_ci if (!arguments.WriteFloat(brightness)) { 80632a6e48fSopenharmony_ci return GSERROR_BINDER; 80732a6e48fSopenharmony_ci } 80832a6e48fSopenharmony_ci 80932a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, arguments, reply, option); 81032a6e48fSopenharmony_ci return CheckRetval(reply); 81132a6e48fSopenharmony_ci} 81232a6e48fSopenharmony_ci 81332a6e48fSopenharmony_ciGSError BufferClientProducer::SetSdrWhitePointBrightness(float brightness) 81432a6e48fSopenharmony_ci{ 81532a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 81632a6e48fSopenharmony_ci 81732a6e48fSopenharmony_ci if (!arguments.WriteFloat(brightness)) { 81832a6e48fSopenharmony_ci return GSERROR_BINDER; 81932a6e48fSopenharmony_ci } 82032a6e48fSopenharmony_ci 82132a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, arguments, reply, option); 82232a6e48fSopenharmony_ci return CheckRetval(reply); 82332a6e48fSopenharmony_ci} 82432a6e48fSopenharmony_ci 82532a6e48fSopenharmony_ciGSError BufferClientProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence, 82632a6e48fSopenharmony_ci float matrix[16], uint32_t matrixSize, bool isUseNewMatrix) 82732a6e48fSopenharmony_ci{ 82832a6e48fSopenharmony_ci return GetLastFlushedBufferCommon(buffer, fence, 82932a6e48fSopenharmony_ci matrix, matrixSize, isUseNewMatrix, BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER); 83032a6e48fSopenharmony_ci} 83132a6e48fSopenharmony_ci 83232a6e48fSopenharmony_ciGSError BufferClientProducer::ReleaseLastFlushedBuffer(uint32_t sequence) 83332a6e48fSopenharmony_ci{ 83432a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 83532a6e48fSopenharmony_ci if (!arguments.WriteUint32(sequence)) { 83632a6e48fSopenharmony_ci return GSERROR_BINDER; 83732a6e48fSopenharmony_ci } 83832a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, arguments, reply, option); 83932a6e48fSopenharmony_ci return CheckRetval(reply); 84032a6e48fSopenharmony_ci} 84132a6e48fSopenharmony_ci 84232a6e48fSopenharmony_ciGSError BufferClientProducer::SetGlobalAlpha(int32_t alpha) 84332a6e48fSopenharmony_ci{ 84432a6e48fSopenharmony_ci DEFINE_MESSAGE_VARIABLES(arguments, reply, option); 84532a6e48fSopenharmony_ci if (!arguments.WriteInt32(alpha)) { 84632a6e48fSopenharmony_ci return GSERROR_BINDER; 84732a6e48fSopenharmony_ci } 84832a6e48fSopenharmony_ci SEND_REQUEST(BUFFER_PRODUCER_SET_GLOBALALPHA, arguments, reply, option); 84932a6e48fSopenharmony_ci return CheckRetval(reply); 85032a6e48fSopenharmony_ci} 85132a6e48fSopenharmony_ci}; // namespace OHOS 852