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