• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "buffer_client_producer.h"
17 
18 #include <cinttypes>
19 
20 #include <iremote_stub.h>
21 #include "buffer_log.h"
22 #include "buffer_utils.h"
23 #include "sync_fence.h"
24 #include "message_option.h"
25 #include "securec.h"
26 #include "rs_frame_report_ext.h"
27 
28 #define DEFINE_MESSAGE_VARIABLES(arg, ret, opt)                            \
29     MessageOption opt;                                                     \
30     MessageParcel arg;                                                     \
31     MessageParcel ret;                                                     \
32     do {                                                                   \
33         GSError retCode = MessageVariables(arg);                           \
34         if (retCode != GSERROR_OK) {                                       \
35             return retCode;                                                \
36         }                                                                  \
37     } while (0)
38 
39 #define SEND_REQUEST(COMMAND, arguments, reply, option)                    \
40     do {                                                                   \
41         GSError ret = SendRequest(COMMAND, arguments, reply, option);      \
42         if (ret != GSERROR_OK) {                                           \
43             return ret;                                                    \
44         }                                                                  \
45     } while (0)
46 
47 namespace OHOS {
48 namespace {
49     constexpr size_t MATRIX4_SIZE = 16;
50 }
BufferClientProducer(const sptr<IRemoteObject> & impl)51 BufferClientProducer::BufferClientProducer(const sptr<IRemoteObject>& impl)
52     : IRemoteProxy<IBufferProducer>(impl)
53 {
54 }
55 
~BufferClientProducer()56 BufferClientProducer::~BufferClientProducer()
57 {
58 }
59 
MessageVariables(MessageParcel & arg)60 GSError BufferClientProducer::MessageVariables(MessageParcel &arg)
61 {
62     if (!(arg).WriteInterfaceToken(GetDescriptor())) {
63         BLOGE("WriteInterfaceToken failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
64         return GSERROR_BINDER;
65     }
66     return GSERROR_OK;
67 }
68 
SendRequest(uint32_t command,MessageParcel & arg,MessageParcel & reply,MessageOption & opt)69 GSError BufferClientProducer::SendRequest(uint32_t command, MessageParcel &arg,
70                                           MessageParcel &reply, MessageOption &opt)
71 {
72     sptr<IRemoteObject> remote = Remote();
73     if (remote == nullptr) {
74         BLOGE("Remote is nullptr!");
75         return GSERROR_SERVER_ERROR;
76     }
77     int32_t ret = remote->SendRequest(command, arg, reply, opt);
78     if (ret != ERR_NONE) {
79         BLOGE("SendRequest ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
80         return GSERROR_BINDER;
81     }
82     return GSERROR_OK;
83 }
84 
CheckRetval(MessageParcel & reply)85 GSError BufferClientProducer::CheckRetval(MessageParcel &reply)
86 {
87     int32_t ret = reply.ReadInt32();
88     if (ret != GSERROR_OK) {
89         BLOGE("Remote ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
90         return static_cast<GSError>(ret);
91     }
92     return GSERROR_OK;
93 }
94 
RequestBufferCommon(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval,uint32_t command)95 GSError BufferClientProducer::RequestBufferCommon(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
96                                                   RequestBufferReturnValue &retval, uint32_t command)
97 {
98     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
99 
100     WriteRequestConfig(arguments, config);
101 
102     retval.isConnected = false;
103     SEND_REQUEST(command, arguments, reply, option);
104     GSError ret = CheckRetval(reply);
105     if (ret != GSERROR_OK) {
106         reply.ReadBool(retval.isConnected);
107         return ret;
108     }
109 
110     ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
111     if (ret != GSERROR_OK) {
112         return SURFACE_ERROR_UNKOWN;
113     }
114     if (retval.buffer != nullptr) {
115         BufferRequestConfig updateConfig = config;
116         updateConfig.usage = reply.ReadUint64();  // consumer may change input usgae by defaultUsage
117         retval.buffer->SetBufferRequestConfig(updateConfig);
118     }
119 
120     ret = bedata->ReadFromParcel(reply);
121     if (ret != GSERROR_OK) {
122         return SURFACE_ERROR_UNKOWN;
123     }
124     retval.fence = SyncFence::ReadFromMessageParcel(reply);
125     reply.ReadUInt32Vector(&retval.deletingBuffers);
126 
127     return GSERROR_OK;
128 }
129 
RequestBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)130 GSError BufferClientProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
131                                             RequestBufferReturnValue &retval)
132 {
133     return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_BUFFER);
134 }
135 
RequestBuffers(const BufferRequestConfig & config,std::vector<sptr<BufferExtraData>> & bedata,std::vector<RequestBufferReturnValue> & retvalues)136 GSError BufferClientProducer::RequestBuffers(const BufferRequestConfig &config,
137     std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues)
138 {
139     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
140 
141     uint32_t num = static_cast<uint32_t>(bedata.size());
142     arguments.WriteUint32(num);
143     WriteRequestConfig(arguments, config);
144     retvalues[0].isConnected = false;
145     SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFERS, arguments, reply, option);
146     GSError ret = CheckRetval(reply);
147     if (ret != GSERROR_OK && ret != GSERROR_NO_BUFFER) {
148         reply.ReadBool(retvalues[0].isConnected);
149         return ret;
150     }
151 
152     num = reply.ReadUint32();
153     if (num > SURFACE_MAX_QUEUE_SIZE || num == 0) {
154         BLOGE("num is invalid, %{public}u, uniqueId: %{public}" PRIu64 ".", num, uniqueId_);
155         return SURFACE_ERROR_UNKOWN;
156     }
157 
158     ret = GSERROR_OK;
159     retvalues.resize(num);
160     for (size_t i = 0; i < num; ++i) {
161         auto &retval = retvalues[i];
162         ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
163         if (ret != GSERROR_OK) {
164             return SURFACE_ERROR_UNKOWN;
165         }
166         if (retval.buffer != nullptr) {
167             BufferRequestConfig updateConfig = config;
168             updateConfig.usage = reply.ReadUint64();  // consumer may change input usgae by defaultUsage
169             retval.buffer->SetBufferRequestConfig(updateConfig);
170         }
171         ret = bedata[i]->ReadFromParcel(reply);
172         if (ret != GSERROR_OK) {
173             return SURFACE_ERROR_UNKOWN;
174         }
175         retval.fence = SyncFence::ReadFromMessageParcel(reply);
176         reply.ReadUInt32Vector(&retval.deletingBuffers);
177     }
178     return ret;
179 }
180 
GetLastFlushedBufferCommon(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix,uint32_t command)181 GSError BufferClientProducer::GetLastFlushedBufferCommon(sptr<SurfaceBuffer>& buffer,
182     sptr<SyncFence>& fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, uint32_t command)
183 {
184     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
185     arguments.WriteBool(isUseNewMatrix);
186     SEND_REQUEST(command, arguments, reply, option);
187     GSError ret = CheckRetval(reply);
188     if (ret != GSERROR_OK) {
189         return ret;
190     }
191     uint32_t sequence;
192     ret = ReadSurfaceBufferImpl(reply, sequence, buffer);
193     if (ret != GSERROR_OK) {
194         return SURFACE_ERROR_UNKOWN;
195     }
196     ret = buffer->ReadBufferRequestConfig(reply);
197     if (ret != GSERROR_OK) {
198         return SURFACE_ERROR_UNKOWN;
199     }
200 
201     fence = SyncFence::ReadFromMessageParcel(reply);
202     std::vector<float> readMatrixVector;
203     reply.ReadFloatVector(&readMatrixVector);
204     if (memcpy_s(matrix, matrixSize * sizeof(float),
205         readMatrixVector.data(), readMatrixVector.size() * sizeof(float)) != EOK) {
206         BLOGE("memcpy_s fail, uniqueId: %{public}" PRIu64 ".", uniqueId_);
207         return SURFACE_ERROR_UNKOWN;
208     }
209     return GSERROR_OK;
210 }
211 
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)212 GSError BufferClientProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
213     sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
214 {
215     return GetLastFlushedBufferCommon(buffer, fence,
216         matrix, MATRIX4_SIZE, isUseNewMatrix, BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER);
217 }
218 
GetProducerInitInfo(ProducerInitInfo & info)219 GSError BufferClientProducer::GetProducerInitInfo(ProducerInitInfo &info)
220 {
221     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
222     token_ = new IRemoteStub<IBufferProducerToken>();
223     arguments.WriteRemoteObject(token_->AsObject());
224     SEND_REQUEST(BUFFER_PRODUCER_GET_INIT_INFO, arguments, reply, option);
225     reply.ReadInt32(info.width);
226     reply.ReadInt32(info.height);
227     reply.ReadUint64(info.uniqueId);
228     uniqueId_ = info.uniqueId;
229     reply.ReadString(info.name);
230     return CheckRetval(reply);
231 }
232 
CancelBuffer(uint32_t sequence,sptr<BufferExtraData> bedata)233 GSError BufferClientProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
234 {
235     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
236 
237     arguments.WriteUint32(sequence);
238     bedata->WriteToParcel(arguments);
239 
240     SEND_REQUEST(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option);
241     return CheckRetval(reply);
242 }
243 
FlushBuffer(uint32_t sequence,sptr<BufferExtraData> bedata,sptr<SyncFence> fence,BufferFlushConfigWithDamages & config)244 GSError BufferClientProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
245                                           sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
246 {
247     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
248 
249     arguments.WriteUint32(sequence);
250     bedata->WriteToParcel(arguments);
251     fence->WriteToMessageParcel(arguments);
252     WriteFlushConfig(arguments, config);
253 
254     SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option);
255     GSError ret = CheckRetval(reply);
256     if (ret != GSERROR_OK) {
257         return ret;
258     }
259 
260     if (OHOS::RsFrameReportExt::GetInstance().GetEnable()) {
261         OHOS::RsFrameReportExt::GetInstance().HandleSwapBuffer();
262     }
263     return GSERROR_OK;
264 }
265 
FlushBuffers(const std::vector<uint32_t> & sequences,const std::vector<sptr<BufferExtraData>> & bedata,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)266 GSError BufferClientProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
267     const std::vector<sptr<BufferExtraData>> &bedata,
268     const std::vector<sptr<SyncFence>> &fences,
269     const std::vector<BufferFlushConfigWithDamages> &configs)
270 {
271     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
272 
273     if (sequences.size() <= 0 || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
274         return SURFACE_ERROR_UNKOWN;
275     }
276     arguments.WriteUInt32Vector(sequences);
277     for (uint32_t i = 0; i < sequences.size(); ++i) {
278         bedata[i]->WriteToParcel(arguments);
279         fences[i]->WriteToMessageParcel(arguments);
280         WriteFlushConfig(arguments, configs[i]);
281     }
282     SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFERS, arguments, reply, option);
283     return CheckRetval(reply);
284 }
285 
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)286 GSError BufferClientProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
287 {
288     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
289     uint32_t sequence = buffer->GetSeqNum();
290     WriteSurfaceBufferImpl(arguments, sequence, buffer);
291     GSError ret = buffer->WriteBufferRequestConfig(arguments);
292     if (ret != GSERROR_OK) {
293         BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
294         return ret;
295     }
296     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, arguments, reply, option);
297     return CheckRetval(reply);
298 }
299 
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)300 GSError BufferClientProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
301 {
302     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
303     uint32_t sequence = buffer->GetSeqNum();
304     WriteSurfaceBufferImpl(arguments, sequence, buffer);
305     SEND_REQUEST(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, arguments, reply, option);
306     return CheckRetval(reply);
307 }
308 
AttachBuffer(sptr<SurfaceBuffer> & buffer)309 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
310 {
311     return GSERROR_NOT_SUPPORT;
312 }
313 
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)314 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
315 {
316     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
317     uint32_t sequence = buffer->GetSeqNum();
318     WriteSurfaceBufferImpl(arguments, sequence, buffer);
319     arguments.WriteInt32(timeOut);
320     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER, arguments, reply, option);
321     return CheckRetval(reply);
322 }
323 
DetachBuffer(sptr<SurfaceBuffer> & buffer)324 GSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
325 {
326     return GSERROR_NOT_SUPPORT;
327 }
328 
RegisterReleaseListener(sptr<IProducerListener> listener)329 GSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
330 {
331     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
332 
333     arguments.WriteRemoteObject(listener->AsObject());
334 
335     SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option);
336     return CheckRetval(reply);
337 }
338 
UnRegisterReleaseListener()339 GSError BufferClientProducer::UnRegisterReleaseListener()
340 {
341     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
342     SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option);
343     return CheckRetval(reply);
344 }
345 
GetQueueSize()346 uint32_t BufferClientProducer::GetQueueSize()
347 {
348     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
349 
350     SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option);
351 
352     return reply.ReadUint32();
353 }
354 
SetQueueSize(uint32_t queueSize)355 GSError BufferClientProducer::SetQueueSize(uint32_t queueSize)
356 {
357     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
358 
359     arguments.WriteUint32(queueSize);
360 
361     SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option);
362     return CheckRetval(reply);
363 }
364 
GetName(std::string & name)365 GSError BufferClientProducer::GetName(std::string &name)
366 {
367     {
368         std::lock_guard<std::mutex> lockGuard(mutex_);
369         if (name_ != "not init") {
370             name = name_;
371             return GSERROR_OK;
372         }
373     }
374     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
375 
376     SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option);
377     GSError ret = CheckRetval(reply);
378     if (ret != GSERROR_OK) {
379         return ret;
380     }
381     if (reply.ReadString(name) == false) {
382         BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
383         return GSERROR_BINDER;
384     }
385     {
386         std::lock_guard<std::mutex> lockGuard(mutex_);
387         name_ = name;
388     }
389     return ret;
390 }
391 
GetUniqueId()392 uint64_t BufferClientProducer::GetUniqueId()
393 {
394     {
395         std::lock_guard<std::mutex> lockGuard(mutex_);
396         if (uniqueId_ != 0) {
397             return uniqueId_;
398         }
399     }
400     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
401     SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option);
402     {
403         std::lock_guard<std::mutex> lockGuard(mutex_);
404         uniqueId_ = reply.ReadUint64();
405         return uniqueId_;
406     }
407 }
408 
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)409 GSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
410 {
411     {
412         std::lock_guard<std::mutex> lockGuard(mutex_);
413         if (uniqueId_ != 0 && name_ != "not init") {
414             uniqueId = uniqueId_;
415             name = name_;
416             return GSERROR_OK;
417         }
418     }
419     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
420 
421     SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option);
422     GSError ret = CheckRetval(reply);
423     if (ret != GSERROR_OK) {
424         return ret;
425     }
426     if (reply.ReadString(name) == false) {
427         BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
428         return GSERROR_BINDER;
429     }
430 
431     uniqueId = reply.ReadUint64();
432     {
433         std::lock_guard<std::mutex> lockGuard(mutex_);
434         name_ = name;
435         uniqueId_ = uniqueId;
436     }
437     return ret;
438 }
439 
GetDefaultWidth()440 int32_t BufferClientProducer::GetDefaultWidth()
441 {
442     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
443 
444     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option);
445 
446     return reply.ReadInt32();
447 }
448 
GetDefaultHeight()449 int32_t BufferClientProducer::GetDefaultHeight()
450 {
451     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
452 
453     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option);
454 
455     return reply.ReadInt32();
456 }
457 
SetDefaultUsage(uint64_t usage)458 GSError BufferClientProducer::SetDefaultUsage(uint64_t usage)
459 {
460     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
461 
462     arguments.WriteUint64(usage);
463 
464     SEND_REQUEST(BUFFER_PRODUCER_SET_DEFAULT_USAGE, arguments, reply, option);
465 
466     return CheckRetval(reply);
467 }
468 
GetDefaultUsage()469 uint64_t BufferClientProducer::GetDefaultUsage()
470 {
471     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
472 
473     SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option);
474 
475     return reply.ReadUint64();
476 }
477 
CleanCache(bool cleanAll,uint32_t * bufSeqNum)478 GSError BufferClientProducer::CleanCache(bool cleanAll, uint32_t *bufSeqNum)
479 {
480     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
481 
482     arguments.WriteBool(cleanAll);
483     SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option);
484     GSError ret = CheckRetval(reply);
485     if (ret == GSERROR_OK && bufSeqNum != nullptr) {
486         *bufSeqNum = reply.ReadUint32();
487     }
488     return ret;
489 }
490 
GoBackground()491 GSError BufferClientProducer::GoBackground()
492 {
493     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
494 
495     SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option);
496     return CheckRetval(reply);
497 }
498 
SetTransform(GraphicTransformType transform)499 GSError BufferClientProducer::SetTransform(GraphicTransformType transform)
500 {
501     {
502         std::lock_guard<std::mutex> lockGuard(mutex_);
503         if (lastSetTransformType_ == transform) {
504             return GSERROR_OK;
505         }
506         lastSetTransformType_ = transform;
507     }
508 
509     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
510 
511     arguments.WriteUint32(static_cast<uint32_t>(transform));
512 
513     SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option);
514     GSError ret = CheckRetval(reply);
515     if (ret != GSERROR_OK) {
516         {
517             std::lock_guard<std::mutex> lockGuard(mutex_);
518             lastSetTransformType_ = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
519         }
520         return ret;
521     }
522 
523     return GSERROR_OK;
524 }
525 
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)526 GSError BufferClientProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
527                                                std::vector<bool> &supporteds)
528 {
529     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
530 
531     WriteVerifyAllocInfo(arguments, infos);
532 
533     SEND_REQUEST(BUFFER_PRODUCER_IS_SUPPORTED_ALLOC, arguments, reply, option);
534     GSError ret = CheckRetval(reply);
535     if (ret != GSERROR_OK) {
536         return ret;
537     }
538 
539     if (reply.ReadBoolVector(&supporteds) == false) {
540         BLOGE("reply.ReadBoolVector return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
541         return GSERROR_BINDER;
542     }
543 
544     return static_cast<GSError>(ret);
545 }
546 
Connect()547 GSError BufferClientProducer::Connect()
548 {
549     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
550 
551     SEND_REQUEST(BUFFER_PRODUCER_CONNECT, arguments, reply, option);
552     return CheckRetval(reply);
553 }
554 
Disconnect(uint32_t * bufSeqNum)555 GSError BufferClientProducer::Disconnect(uint32_t *bufSeqNum)
556 {
557     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
558 
559     SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option);
560     GSError ret = CheckRetval(reply);
561     if (ret == GSERROR_OK && bufSeqNum != nullptr) {
562         *bufSeqNum = reply.ReadUint32();
563     }
564     return ret;
565 }
566 
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)567 GSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
568 {
569     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
570     arguments.WriteUint32(sequence);
571     arguments.WriteInt32(static_cast<int32_t>(scalingMode));
572     SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option);
573     return CheckRetval(reply);
574 }
575 
SetScalingMode(ScalingMode scalingMode)576 GSError BufferClientProducer::SetScalingMode(ScalingMode scalingMode)
577 {
578     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
579     arguments.WriteInt32(static_cast<int32_t>(scalingMode));
580     SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODEV2, arguments, reply, option);
581     return CheckRetval(reply);
582 }
583 
SetBufferHold(bool hold)584 GSError BufferClientProducer::SetBufferHold(bool hold)
585 {
586     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
587     arguments.WriteBool(hold);
588     SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_HOLD, arguments, reply, option);
589     return CheckRetval(reply);
590 }
591 
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)592 GSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
593 {
594     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
595     arguments.WriteUint32(sequence);
596     WriteHDRMetaData(arguments, metaData);
597     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option);
598     return CheckRetval(reply);
599 }
600 
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)601 GSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
602                                              const std::vector<uint8_t> &metaData)
603 {
604     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
605     arguments.WriteUint32(sequence);
606     arguments.WriteUint32(static_cast<uint32_t>(key));
607     WriteHDRMetaDataSet(arguments, metaData);
608     SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option);
609     return CheckRetval(reply);
610 }
611 
SetTunnelHandle(const GraphicExtDataHandle * handle)612 GSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
613 {
614     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
615     if (handle == nullptr) {
616         arguments.WriteBool(false);
617     } else {
618         arguments.WriteBool(true);
619         WriteExtDataHandle(arguments, handle);
620     }
621     SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option);
622     return CheckRetval(reply);
623 }
624 
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)625 GSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
626 {
627     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
628     arguments.WriteUint32(sequence);
629     arguments.WriteUint32(static_cast<uint32_t>(type));
630     SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option);
631     GSError ret = CheckRetval(reply);
632     if (ret != GSERROR_OK) {
633         return ret;
634     }
635     time = reply.ReadInt64();
636     return static_cast<GSError>(ret);
637 }
638 
GetNativeSurface()639 sptr<NativeSurface> BufferClientProducer::GetNativeSurface()
640 {
641     return nullptr;
642 }
643 
GetTransform(GraphicTransformType & transform)644 GSError BufferClientProducer::GetTransform(GraphicTransformType &transform)
645 {
646     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
647     SEND_REQUEST(BUFFER_PRODUCER_GET_TRANSFORM, arguments, reply, option);
648 
649     GSError ret = CheckRetval(reply);
650     if (ret != GSERROR_OK) {
651         return ret;
652     }
653     transform = static_cast<GraphicTransformType>(reply.ReadUint32());
654     return GSERROR_OK;
655 }
656 
GetTransformHint(GraphicTransformType & transformHint)657 GSError BufferClientProducer::GetTransformHint(GraphicTransformType &transformHint)
658 {
659     return GSERROR_NOT_SUPPORT;
660 }
661 
SetTransformHint(GraphicTransformType transformHint)662 GSError BufferClientProducer::SetTransformHint(GraphicTransformType transformHint)
663 {
664     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
665 
666     arguments.WriteUint32(static_cast<uint32_t>(transformHint));
667 
668     SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORMHINT, arguments, reply, option);
669     return CheckRetval(reply);
670 }
671 
SetSurfaceSourceType(OHSurfaceSource sourceType)672 GSError BufferClientProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
673 {
674     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
675     arguments.WriteUint32(static_cast<uint32_t>(sourceType));
676     SEND_REQUEST(BUFFER_PRODUCER_SET_SOURCE_TYPE, arguments, reply, option);
677     return CheckRetval(reply);
678 }
679 
GetSurfaceSourceType(OHSurfaceSource & sourceType)680 GSError BufferClientProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
681 {
682     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
683     SEND_REQUEST(BUFFER_PRODUCER_GET_SOURCE_TYPE, arguments, reply, option);
684     GSError ret = CheckRetval(reply);
685     if (ret != GSERROR_OK) {
686         return ret;
687     }
688     sourceType = static_cast<OHSurfaceSource>(reply.ReadUint32());
689     return GSERROR_OK;
690 }
691 
SetSurfaceAppFrameworkType(std::string appFrameworkType)692 GSError BufferClientProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
693 {
694     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
695     arguments.WriteString(appFrameworkType);
696     SEND_REQUEST(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, arguments, reply, option);
697     return CheckRetval(reply);
698 }
699 
GetSurfaceAppFrameworkType(std::string & appFrameworkType)700 GSError BufferClientProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
701 {
702     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
703     SEND_REQUEST(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, arguments, reply, option);
704     GSError ret = CheckRetval(reply);
705     if (ret != GSERROR_OK) {
706         return ret;
707     }
708     appFrameworkType = static_cast<std::string>(reply.ReadString());
709     return GSERROR_OK;
710 }
711 
SetHdrWhitePointBrightness(float brightness)712 GSError BufferClientProducer::SetHdrWhitePointBrightness(float brightness)
713 {
714     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
715 
716     arguments.WriteFloat(brightness);
717 
718     SEND_REQUEST(BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
719     return CheckRetval(reply);
720 }
721 
SetSdrWhitePointBrightness(float brightness)722 GSError BufferClientProducer::SetSdrWhitePointBrightness(float brightness)
723 {
724     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
725 
726     arguments.WriteFloat(brightness);
727 
728     SEND_REQUEST(BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
729     return CheckRetval(reply);
730 }
731 
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)732 GSError BufferClientProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
733     float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
734 {
735     return GetLastFlushedBufferCommon(buffer, fence,
736         matrix, matrixSize, isUseNewMatrix, BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER);
737 }
738 
ReleaseLastFlushedBuffer(uint32_t sequence)739 GSError BufferClientProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
740 {
741     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
742     arguments.WriteUint32(sequence);
743     SEND_REQUEST(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, arguments, reply, option);
744     return CheckRetval(reply);
745 }
746 
RequestAndDetachBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)747 GSError BufferClientProducer::RequestAndDetachBuffer(const BufferRequestConfig& config,
748     sptr<BufferExtraData>& bedata, RequestBufferReturnValue& retval)
749 {
750     return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_AND_DETACH_BUFFER);
751 }
752 
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,sptr<BufferExtraData> & bedata,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config,bool needMap)753 GSError BufferClientProducer::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, sptr<BufferExtraData>& bedata,
754     const sptr<SyncFence>& fence, BufferFlushConfigWithDamages& config, bool needMap)
755 {
756     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
757     WriteSurfaceBufferImpl(arguments, buffer->GetSeqNum(), buffer);
758     auto ret = buffer->WriteBufferRequestConfig(arguments);
759     if (ret != GSERROR_OK) {
760         BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
761         return ret;
762     }
763 
764     bedata->WriteToParcel(arguments);
765     fence->WriteToMessageParcel(arguments);
766     WriteFlushConfig(arguments, config);
767     arguments.WriteBool(needMap);
768     SEND_REQUEST(BUFFER_PRODUCER_ATTACH_AND_FLUSH_BUFFER, arguments, reply, option);
769     return CheckRetval(reply);
770 }
771 
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)772 GSError BufferClientProducer::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
773 {
774     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
775     SEND_REQUEST(BUFFER_PRODUCER_GET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
776     GSError ret = CheckRetval(reply);
777     if (ret != GSERROR_OK) {
778         return ret;
779     }
780     cycleBuffersNumber = reply.ReadUint32();
781     return GSERROR_OK;
782 }
783 
SetCycleBuffersNumber(uint32_t cycleBuffersNumber)784 GSError BufferClientProducer::SetCycleBuffersNumber(uint32_t cycleBuffersNumber)
785 {
786     DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
787     if (!arguments.WriteUint32(cycleBuffersNumber)) {
788         return GSERROR_BINDER;
789     }
790     SEND_REQUEST(BUFFER_PRODUCER_SET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
791     return CheckRetval(reply);
792 }
793 }; // namespace OHOS
794