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