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
RequestBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)95 GSError BufferClientProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
96 RequestBufferReturnValue &retval)
97 {
98 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
99
100 WriteRequestConfig(arguments, config);
101
102 retval.isConnected = false;
103 SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFER, 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 retval.buffer->SetBufferRequestConfig(config);
116 }
117
118 ret = bedata->ReadFromParcel(reply);
119 if (ret != GSERROR_OK) {
120 return SURFACE_ERROR_UNKOWN;
121 }
122 retval.fence = SyncFence::ReadFromMessageParcel(reply);
123 reply.ReadUInt32Vector(&retval.deletingBuffers);
124
125 return GSERROR_OK;
126 }
127
RequestBuffers(const BufferRequestConfig & config,std::vector<sptr<BufferExtraData>> & bedata,std::vector<RequestBufferReturnValue> & retvalues)128 GSError BufferClientProducer::RequestBuffers(const BufferRequestConfig &config,
129 std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues)
130 {
131 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
132
133 uint32_t num = static_cast<uint32_t>(bedata.size());
134 arguments.WriteUint32(num);
135 WriteRequestConfig(arguments, config);
136 retvalues[0].isConnected = false;
137 SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFERS, arguments, reply, option);
138 GSError ret = CheckRetval(reply);
139 if (ret != GSERROR_OK && ret != GSERROR_NO_BUFFER) {
140 reply.ReadBool(retvalues[0].isConnected);
141 return ret;
142 }
143
144 num = reply.ReadUint32();
145 if (num > SURFACE_MAX_QUEUE_SIZE || num == 0) {
146 BLOGE("num is invalid, %{public}u, uniqueId: %{public}" PRIu64 ".", num, uniqueId_);
147 return SURFACE_ERROR_UNKOWN;
148 }
149
150 ret = GSERROR_OK;
151 retvalues.resize(num);
152 for (size_t i = 0; i < num; ++i) {
153 auto &retval = retvalues[i];
154 ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
155 if (ret != GSERROR_OK) {
156 return SURFACE_ERROR_UNKOWN;
157 }
158 if (retval.buffer != nullptr) {
159 retval.buffer->SetBufferRequestConfig(config);
160 }
161 ret = bedata[i]->ReadFromParcel(reply);
162 if (ret != GSERROR_OK) {
163 return SURFACE_ERROR_UNKOWN;
164 }
165 retval.fence = SyncFence::ReadFromMessageParcel(reply);
166 reply.ReadUInt32Vector(&retval.deletingBuffers);
167 }
168 return ret;
169 }
170
GetLastFlushedBufferCommon(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix,uint32_t command)171 GSError BufferClientProducer::GetLastFlushedBufferCommon(sptr<SurfaceBuffer>& buffer,
172 sptr<SyncFence>& fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, uint32_t command)
173 {
174 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
175 arguments.WriteBool(isUseNewMatrix);
176 SEND_REQUEST(command, arguments, reply, option);
177 GSError ret = CheckRetval(reply);
178 if (ret != GSERROR_OK) {
179 return ret;
180 }
181 uint32_t sequence;
182 ret = ReadSurfaceBufferImpl(reply, sequence, buffer);
183 if (ret != GSERROR_OK) {
184 return SURFACE_ERROR_UNKOWN;
185 }
186 ret = buffer->ReadBufferRequestConfig(reply);
187 if (ret != GSERROR_OK) {
188 return SURFACE_ERROR_UNKOWN;
189 }
190
191 fence = SyncFence::ReadFromMessageParcel(reply);
192 std::vector<float> readMatrixVector;
193 reply.ReadFloatVector(&readMatrixVector);
194 if (memcpy_s(matrix, matrixSize * sizeof(float),
195 readMatrixVector.data(), readMatrixVector.size() * sizeof(float)) != EOK) {
196 BLOGE("memcpy_s fail, uniqueId: %{public}" PRIu64 ".", uniqueId_);
197 return SURFACE_ERROR_UNKOWN;
198 }
199 return GSERROR_OK;
200 }
201
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)202 GSError BufferClientProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
203 sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
204 {
205 return GetLastFlushedBufferCommon(buffer, fence,
206 matrix, MATRIX4_SIZE, isUseNewMatrix, BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER);
207 }
208
GetProducerInitInfo(ProducerInitInfo & info)209 GSError BufferClientProducer::GetProducerInitInfo(ProducerInitInfo &info)
210 {
211 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
212 token_ = new IRemoteStub<IBufferProducerToken>();
213 arguments.WriteRemoteObject(token_->AsObject());
214 SEND_REQUEST(BUFFER_PRODUCER_GET_INIT_INFO, arguments, reply, option);
215 reply.ReadInt32(info.width);
216 reply.ReadInt32(info.height);
217 reply.ReadUint64(info.uniqueId);
218 uniqueId_ = info.uniqueId;
219 reply.ReadString(info.name);
220 return CheckRetval(reply);
221 }
222
CancelBuffer(uint32_t sequence,sptr<BufferExtraData> bedata)223 GSError BufferClientProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
224 {
225 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
226
227 arguments.WriteUint32(sequence);
228 bedata->WriteToParcel(arguments);
229
230 SEND_REQUEST(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option);
231 return CheckRetval(reply);
232 }
233
FlushBuffer(uint32_t sequence,sptr<BufferExtraData> bedata,sptr<SyncFence> fence,BufferFlushConfigWithDamages & config)234 GSError BufferClientProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
235 sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
236 {
237 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
238
239 arguments.WriteUint32(sequence);
240 bedata->WriteToParcel(arguments);
241 fence->WriteToMessageParcel(arguments);
242 WriteFlushConfig(arguments, config);
243
244 SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option);
245 GSError ret = CheckRetval(reply);
246 if (ret != GSERROR_OK) {
247 return ret;
248 }
249
250 if (OHOS::RsFrameReportExt::GetInstance().GetEnable()) {
251 OHOS::RsFrameReportExt::GetInstance().HandleSwapBuffer();
252 }
253 return GSERROR_OK;
254 }
255
FlushBuffers(const std::vector<uint32_t> & sequences,const std::vector<sptr<BufferExtraData>> & bedata,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)256 GSError BufferClientProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
257 const std::vector<sptr<BufferExtraData>> &bedata,
258 const std::vector<sptr<SyncFence>> &fences,
259 const std::vector<BufferFlushConfigWithDamages> &configs)
260 {
261 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
262
263 if (sequences.size() <= 0 || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
264 return SURFACE_ERROR_UNKOWN;
265 }
266 arguments.WriteUInt32Vector(sequences);
267 for (uint32_t i = 0; i < sequences.size(); ++i) {
268 bedata[i]->WriteToParcel(arguments);
269 fences[i]->WriteToMessageParcel(arguments);
270 WriteFlushConfig(arguments, configs[i]);
271 }
272 SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFERS, arguments, reply, option);
273 return CheckRetval(reply);
274 }
275
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)276 GSError BufferClientProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
277 {
278 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
279 uint32_t sequence = buffer->GetSeqNum();
280 WriteSurfaceBufferImpl(arguments, sequence, buffer);
281 GSError ret = buffer->WriteBufferRequestConfig(arguments);
282 if (ret != GSERROR_OK) {
283 BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
284 return ret;
285 }
286 SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, arguments, reply, option);
287 return CheckRetval(reply);
288 }
289
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)290 GSError BufferClientProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
291 {
292 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
293 uint32_t sequence = buffer->GetSeqNum();
294 WriteSurfaceBufferImpl(arguments, sequence, buffer);
295 SEND_REQUEST(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, arguments, reply, option);
296 return CheckRetval(reply);
297 }
298
AttachBuffer(sptr<SurfaceBuffer> & buffer)299 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
300 {
301 return GSERROR_NOT_SUPPORT;
302 }
303
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)304 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
305 {
306 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
307 uint32_t sequence = buffer->GetSeqNum();
308 WriteSurfaceBufferImpl(arguments, sequence, buffer);
309 arguments.WriteInt32(timeOut);
310 SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER, arguments, reply, option);
311 return CheckRetval(reply);
312 }
313
DetachBuffer(sptr<SurfaceBuffer> & buffer)314 GSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
315 {
316 return GSERROR_NOT_SUPPORT;
317 }
318
RegisterReleaseListener(sptr<IProducerListener> listener)319 GSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
320 {
321 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
322
323 arguments.WriteRemoteObject(listener->AsObject());
324
325 SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option);
326 return CheckRetval(reply);
327 }
328
UnRegisterReleaseListener()329 GSError BufferClientProducer::UnRegisterReleaseListener()
330 {
331 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
332 SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option);
333 return CheckRetval(reply);
334 }
335
GetQueueSize()336 uint32_t BufferClientProducer::GetQueueSize()
337 {
338 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
339
340 SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option);
341
342 return reply.ReadUint32();
343 }
344
SetQueueSize(uint32_t queueSize)345 GSError BufferClientProducer::SetQueueSize(uint32_t queueSize)
346 {
347 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
348
349 arguments.WriteUint32(queueSize);
350
351 SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option);
352 return CheckRetval(reply);
353 }
354
GetName(std::string & name)355 GSError BufferClientProducer::GetName(std::string &name)
356 {
357 {
358 std::lock_guard<std::mutex> lockGuard(mutex_);
359 if (name_ != "not init") {
360 name = name_;
361 return GSERROR_OK;
362 }
363 }
364 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
365
366 SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option);
367 GSError ret = CheckRetval(reply);
368 if (ret != GSERROR_OK) {
369 return ret;
370 }
371 if (reply.ReadString(name) == false) {
372 BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
373 return GSERROR_BINDER;
374 }
375 {
376 std::lock_guard<std::mutex> lockGuard(mutex_);
377 name_ = name;
378 }
379 return ret;
380 }
381
GetUniqueId()382 uint64_t BufferClientProducer::GetUniqueId()
383 {
384 {
385 std::lock_guard<std::mutex> lockGuard(mutex_);
386 if (uniqueId_ != 0) {
387 return uniqueId_;
388 }
389 }
390 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
391 SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option);
392 {
393 std::lock_guard<std::mutex> lockGuard(mutex_);
394 uniqueId_ = reply.ReadUint64();
395 return uniqueId_;
396 }
397 }
398
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)399 GSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
400 {
401 {
402 std::lock_guard<std::mutex> lockGuard(mutex_);
403 if (uniqueId_ != 0 && name_ != "not init") {
404 uniqueId = uniqueId_;
405 name = name_;
406 return GSERROR_OK;
407 }
408 }
409 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
410
411 SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option);
412 GSError ret = CheckRetval(reply);
413 if (ret != GSERROR_OK) {
414 return ret;
415 }
416 if (reply.ReadString(name) == false) {
417 BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
418 return GSERROR_BINDER;
419 }
420
421 uniqueId = reply.ReadUint64();
422 {
423 std::lock_guard<std::mutex> lockGuard(mutex_);
424 name_ = name;
425 uniqueId_ = uniqueId;
426 }
427 return ret;
428 }
429
GetDefaultWidth()430 int32_t BufferClientProducer::GetDefaultWidth()
431 {
432 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
433
434 SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option);
435
436 return reply.ReadInt32();
437 }
438
GetDefaultHeight()439 int32_t BufferClientProducer::GetDefaultHeight()
440 {
441 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
442
443 SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option);
444
445 return reply.ReadInt32();
446 }
447
SetDefaultUsage(uint64_t usage)448 GSError BufferClientProducer::SetDefaultUsage(uint64_t usage)
449 {
450 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
451
452 arguments.WriteUint64(usage);
453
454 SEND_REQUEST(BUFFER_PRODUCER_SET_DEFAULT_USAGE, arguments, reply, option);
455
456 return CheckRetval(reply);
457 }
458
GetDefaultUsage()459 uint64_t BufferClientProducer::GetDefaultUsage()
460 {
461 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
462
463 SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option);
464
465 return reply.ReadUint64();
466 }
467
CleanCache(bool cleanAll)468 GSError BufferClientProducer::CleanCache(bool cleanAll)
469 {
470 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
471
472 arguments.WriteBool(cleanAll);
473 SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option);
474 return CheckRetval(reply);
475 }
476
GoBackground()477 GSError BufferClientProducer::GoBackground()
478 {
479 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
480
481 SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option);
482 return CheckRetval(reply);
483 }
484
SetTransform(GraphicTransformType transform)485 GSError BufferClientProducer::SetTransform(GraphicTransformType transform)
486 {
487 {
488 std::lock_guard<std::mutex> lockGuard(mutex_);
489 if (lastSetTransformType_ == transform) {
490 return GSERROR_OK;
491 }
492 lastSetTransformType_ = transform;
493 }
494
495 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
496
497 arguments.WriteUint32(static_cast<uint32_t>(transform));
498
499 SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option);
500 GSError ret = CheckRetval(reply);
501 if (ret != GSERROR_OK) {
502 {
503 std::lock_guard<std::mutex> lockGuard(mutex_);
504 lastSetTransformType_ = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
505 }
506 return ret;
507 }
508
509 return GSERROR_OK;
510 }
511
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)512 GSError BufferClientProducer::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
513 std::vector<bool> &supporteds)
514 {
515 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
516
517 WriteVerifyAllocInfo(arguments, infos);
518
519 SEND_REQUEST(BUFFER_PRODUCER_IS_SUPPORTED_ALLOC, arguments, reply, option);
520 GSError ret = CheckRetval(reply);
521 if (ret != GSERROR_OK) {
522 return ret;
523 }
524
525 if (reply.ReadBoolVector(&supporteds) == false) {
526 BLOGE("reply.ReadBoolVector return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
527 return GSERROR_BINDER;
528 }
529
530 return static_cast<GSError>(ret);
531 }
532
Connect()533 GSError BufferClientProducer::Connect()
534 {
535 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
536
537 SEND_REQUEST(BUFFER_PRODUCER_CONNECT, arguments, reply, option);
538 return CheckRetval(reply);
539 }
540
Disconnect()541 GSError BufferClientProducer::Disconnect()
542 {
543 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
544
545 SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option);
546 return CheckRetval(reply);
547 }
548
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)549 GSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
550 {
551 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
552 arguments.WriteUint32(sequence);
553 arguments.WriteInt32(static_cast<int32_t>(scalingMode));
554 SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option);
555 return CheckRetval(reply);
556 }
557
SetScalingMode(ScalingMode scalingMode)558 GSError BufferClientProducer::SetScalingMode(ScalingMode scalingMode)
559 {
560 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
561 arguments.WriteInt32(static_cast<int32_t>(scalingMode));
562 SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODEV2, arguments, reply, option);
563 return CheckRetval(reply);
564 }
565
SetBufferHold(bool hold)566 GSError BufferClientProducer::SetBufferHold(bool hold)
567 {
568 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
569 arguments.WriteBool(hold);
570 SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_HOLD, arguments, reply, option);
571 return CheckRetval(reply);
572 }
573
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)574 GSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
575 {
576 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
577 arguments.WriteUint32(sequence);
578 WriteHDRMetaData(arguments, metaData);
579 SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option);
580 return CheckRetval(reply);
581 }
582
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)583 GSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
584 const std::vector<uint8_t> &metaData)
585 {
586 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
587 arguments.WriteUint32(sequence);
588 arguments.WriteUint32(static_cast<uint32_t>(key));
589 WriteHDRMetaDataSet(arguments, metaData);
590 SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option);
591 return CheckRetval(reply);
592 }
593
SetTunnelHandle(const GraphicExtDataHandle * handle)594 GSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
595 {
596 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
597 if (handle == nullptr) {
598 arguments.WriteBool(false);
599 } else {
600 arguments.WriteBool(true);
601 WriteExtDataHandle(arguments, handle);
602 }
603 SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option);
604 return CheckRetval(reply);
605 }
606
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)607 GSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
608 {
609 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
610 arguments.WriteUint32(sequence);
611 arguments.WriteUint32(static_cast<uint32_t>(type));
612 SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option);
613 GSError ret = CheckRetval(reply);
614 if (ret != GSERROR_OK) {
615 return ret;
616 }
617 time = reply.ReadInt64();
618 return static_cast<GSError>(ret);
619 }
620
GetNativeSurface()621 sptr<NativeSurface> BufferClientProducer::GetNativeSurface()
622 {
623 return nullptr;
624 }
625
GetTransform(GraphicTransformType & transform)626 GSError BufferClientProducer::GetTransform(GraphicTransformType &transform)
627 {
628 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
629 SEND_REQUEST(BUFFER_PRODUCER_GET_TRANSFORM, arguments, reply, option);
630
631 GSError ret = CheckRetval(reply);
632 if (ret != GSERROR_OK) {
633 return ret;
634 }
635 transform = static_cast<GraphicTransformType>(reply.ReadUint32());
636 return GSERROR_OK;
637 }
638
GetTransformHint(GraphicTransformType & transformHint)639 GSError BufferClientProducer::GetTransformHint(GraphicTransformType &transformHint)
640 {
641 return GSERROR_NOT_SUPPORT;
642 }
643
SetTransformHint(GraphicTransformType transformHint)644 GSError BufferClientProducer::SetTransformHint(GraphicTransformType transformHint)
645 {
646 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
647
648 arguments.WriteUint32(static_cast<uint32_t>(transformHint));
649
650 SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORMHINT, arguments, reply, option);
651 return CheckRetval(reply);
652 }
653
SetSurfaceSourceType(OHSurfaceSource sourceType)654 GSError BufferClientProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
655 {
656 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
657 arguments.WriteUint32(static_cast<uint32_t>(sourceType));
658 SEND_REQUEST(BUFFER_PRODUCER_SET_SOURCE_TYPE, arguments, reply, option);
659 return CheckRetval(reply);
660 }
661
GetSurfaceSourceType(OHSurfaceSource & sourceType)662 GSError BufferClientProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
663 {
664 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
665 SEND_REQUEST(BUFFER_PRODUCER_GET_SOURCE_TYPE, arguments, reply, option);
666 GSError ret = CheckRetval(reply);
667 if (ret != GSERROR_OK) {
668 return ret;
669 }
670 sourceType = static_cast<OHSurfaceSource>(reply.ReadUint32());
671 return GSERROR_OK;
672 }
673
SetSurfaceAppFrameworkType(std::string appFrameworkType)674 GSError BufferClientProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
675 {
676 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
677 arguments.WriteString(appFrameworkType);
678 SEND_REQUEST(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, arguments, reply, option);
679 return CheckRetval(reply);
680 }
681
GetSurfaceAppFrameworkType(std::string & appFrameworkType)682 GSError BufferClientProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
683 {
684 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
685 SEND_REQUEST(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, arguments, reply, option);
686 GSError ret = CheckRetval(reply);
687 if (ret != GSERROR_OK) {
688 return ret;
689 }
690 appFrameworkType = static_cast<std::string>(reply.ReadString());
691 return GSERROR_OK;
692 }
693
SetHdrWhitePointBrightness(float brightness)694 GSError BufferClientProducer::SetHdrWhitePointBrightness(float brightness)
695 {
696 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
697
698 arguments.WriteFloat(brightness);
699
700 SEND_REQUEST(BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
701 return CheckRetval(reply);
702 }
703
SetSdrWhitePointBrightness(float brightness)704 GSError BufferClientProducer::SetSdrWhitePointBrightness(float brightness)
705 {
706 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
707
708 arguments.WriteFloat(brightness);
709
710 SEND_REQUEST(BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
711 return CheckRetval(reply);
712 }
713
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)714 GSError BufferClientProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
715 float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
716 {
717 return GetLastFlushedBufferCommon(buffer, fence,
718 matrix, matrixSize, isUseNewMatrix, BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER);
719 }
720
ReleaseLastFlushedBuffer(uint32_t sequence)721 GSError BufferClientProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
722 {
723 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
724 arguments.WriteUint32(sequence);
725 SEND_REQUEST(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, arguments, reply, option);
726 return CheckRetval(reply);
727 }
728 }; // namespace OHOS
729