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 "hebc_white_list.h"
24 #include "sync_fence.h"
25 #include "message_option.h"
26 #include "securec.h"
27 #include "rs_frame_report_ext.h"
28
29 #define DEFINE_MESSAGE_VARIABLES(arg, ret, opt) \
30 MessageOption opt; \
31 MessageParcel arg; \
32 MessageParcel ret; \
33 do { \
34 GSError retCode = MessageVariables(arg); \
35 if (retCode != GSERROR_OK) { \
36 return retCode; \
37 } \
38 } while (0)
39
40 #define SEND_REQUEST(COMMAND, arguments, reply, option) \
41 do { \
42 GSError ret = SendRequest(COMMAND, arguments, reply, option); \
43 if (ret != GSERROR_OK) { \
44 return ret; \
45 } \
46 } while (0)
47
48 namespace OHOS {
49 namespace {
50 constexpr size_t MATRIX4_SIZE = 16;
51 }
BufferClientProducer(const sptr<IRemoteObject> & impl)52 BufferClientProducer::BufferClientProducer(const sptr<IRemoteObject>& impl)
53 : IRemoteProxy<IBufferProducer>(impl)
54 {
55 }
56
~BufferClientProducer()57 BufferClientProducer::~BufferClientProducer()
58 {
59 }
60
MessageVariables(MessageParcel & arg)61 GSError BufferClientProducer::MessageVariables(MessageParcel &arg)
62 {
63 if (!(arg).WriteInterfaceToken(GetDescriptor())) {
64 BLOGE("WriteInterfaceToken failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
65 return GSERROR_BINDER;
66 }
67 return GSERROR_OK;
68 }
69
SendRequest(uint32_t command,MessageParcel & arg,MessageParcel & reply,MessageOption & opt)70 GSError BufferClientProducer::SendRequest(uint32_t command, MessageParcel &arg,
71 MessageParcel &reply, MessageOption &opt)
72 {
73 sptr<IRemoteObject> remote = Remote();
74 if (remote == nullptr) {
75 BLOGE("Remote is nullptr, uniqueId: %{public}" PRIu64 ".", uniqueId_);
76 return GSERROR_SERVER_ERROR;
77 }
78 int32_t ret = remote->SendRequest(command, arg, reply, opt);
79 if (ret != ERR_NONE) {
80 BLOGE("SendRequest ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
81 return GSERROR_BINDER;
82 }
83 return GSERROR_OK;
84 }
85
CheckRetval(MessageParcel & reply)86 GSError BufferClientProducer::CheckRetval(MessageParcel &reply)
87 {
88 int32_t ret = reply.ReadInt32();
89 if (ret != GSERROR_OK) {
90 BLOGE("Remote ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
91 return static_cast<GSError>(ret);
92 }
93 return GSERROR_OK;
94 }
95
RequestBufferCommon(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval,uint32_t command)96 GSError BufferClientProducer::RequestBufferCommon(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
97 RequestBufferReturnValue &retval, uint32_t command)
98 {
99 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
100
101 GSError ret = WriteRequestConfig(arguments, config);
102 if (ret != GSERROR_OK) {
103 return ret;
104 }
105
106 retval.isConnected = false;
107 SEND_REQUEST(command, arguments, reply, option);
108 ret = CheckRetval(reply);
109 if (ret != GSERROR_OK) {
110 reply.ReadBool(retval.isConnected);
111 return ret;
112 }
113
114 ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
115 if (ret != GSERROR_OK) {
116 return SURFACE_ERROR_UNKOWN;
117 }
118 if (retval.buffer != nullptr) {
119 BufferRequestConfig updateConfig = config;
120 updateConfig.usage = reply.ReadUint64(); // consumer may change input usgae by defaultUsage
121 retval.buffer->SetBufferRequestConfig(updateConfig);
122 }
123
124 ret = bedata->ReadFromParcel(reply);
125 if (ret != GSERROR_OK) {
126 return SURFACE_ERROR_UNKOWN;
127 }
128 retval.fence = SyncFence::ReadFromMessageParcel(reply);
129 if (!reply.ReadUInt32Vector(&retval.deletingBuffers)) {
130 return GSERROR_BINDER;
131 }
132
133 return GSERROR_OK;
134 }
135
RequestBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)136 GSError BufferClientProducer::RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
137 RequestBufferReturnValue &retval)
138 {
139 return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_BUFFER);
140 }
141
RequestBuffers(const BufferRequestConfig & config,std::vector<sptr<BufferExtraData>> & bedata,std::vector<RequestBufferReturnValue> & retvalues)142 GSError BufferClientProducer::RequestBuffers(const BufferRequestConfig &config,
143 std::vector<sptr<BufferExtraData>> &bedata, std::vector<RequestBufferReturnValue> &retvalues)
144 {
145 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
146
147 uint32_t num = static_cast<uint32_t>(bedata.size());
148 if (!arguments.WriteUint32(num)) {
149 return GSERROR_BINDER;
150 }
151 GSError ret = WriteRequestConfig(arguments, config);
152 if (ret != GSERROR_OK) {
153 return ret;
154 }
155 retvalues[0].isConnected = false;
156 SEND_REQUEST(BUFFER_PRODUCER_REQUEST_BUFFERS, arguments, reply, option);
157 ret = CheckRetval(reply);
158 if (ret != GSERROR_OK && ret != GSERROR_NO_BUFFER) {
159 reply.ReadBool(retvalues[0].isConnected);
160 return ret;
161 }
162
163 num = reply.ReadUint32();
164 if (num > SURFACE_MAX_QUEUE_SIZE || num == 0) {
165 BLOGE("num is invalid, %{public}u, uniqueId: %{public}" PRIu64 ".", num, uniqueId_);
166 return SURFACE_ERROR_UNKOWN;
167 }
168
169 ret = GSERROR_OK;
170 retvalues.resize(num);
171 for (size_t i = 0; i < num; ++i) {
172 auto &retval = retvalues[i];
173 ret = ReadSurfaceBufferImpl(reply, retval.sequence, retval.buffer);
174 if (ret != GSERROR_OK) {
175 return SURFACE_ERROR_UNKOWN;
176 }
177 if (retval.buffer != nullptr) {
178 BufferRequestConfig updateConfig = config;
179 updateConfig.usage = reply.ReadUint64(); // consumer may change input usgae by defaultUsage
180 retval.buffer->SetBufferRequestConfig(updateConfig);
181 }
182 ret = bedata[i]->ReadFromParcel(reply);
183 if (ret != GSERROR_OK) {
184 return SURFACE_ERROR_UNKOWN;
185 }
186 retval.fence = SyncFence::ReadFromMessageParcel(reply);
187 if (!reply.ReadUInt32Vector(&retval.deletingBuffers)) {
188 return GSERROR_BINDER;
189 }
190 }
191 return ret;
192 }
193
GetLastFlushedBufferCommon(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix,uint32_t command)194 GSError BufferClientProducer::GetLastFlushedBufferCommon(sptr<SurfaceBuffer>& buffer,
195 sptr<SyncFence>& fence, float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, uint32_t command)
196 {
197 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
198 if (!arguments.WriteBool(isUseNewMatrix)) {
199 return GSERROR_BINDER;
200 }
201 SEND_REQUEST(command, arguments, reply, option);
202 GSError ret = CheckRetval(reply);
203 if (ret != GSERROR_OK) {
204 return ret;
205 }
206 uint32_t sequence;
207 ret = ReadSurfaceBufferImpl(reply, sequence, buffer);
208 if (ret != GSERROR_OK) {
209 return SURFACE_ERROR_UNKOWN;
210 }
211 if (buffer == nullptr) {
212 return SURFACE_ERROR_NULLPTR;
213 }
214 ret = buffer->ReadBufferRequestConfig(reply);
215 if (ret != GSERROR_OK) {
216 return SURFACE_ERROR_UNKOWN;
217 }
218
219 fence = SyncFence::ReadFromMessageParcel(reply);
220 std::vector<float> readMatrixVector;
221 if (!reply.ReadFloatVector(&readMatrixVector)) {
222 return GSERROR_BINDER;
223 }
224 if (readMatrixVector.size() != MATRIX4_SIZE) {
225 return GSERROR_INVALID_ARGUMENTS;
226 }
227 if (memcpy_s(matrix, matrixSize * sizeof(float),
228 readMatrixVector.data(), readMatrixVector.size() * sizeof(float)) != EOK) {
229 BLOGE("memcpy_s fail, uniqueId: %{public}" PRIu64 ".", uniqueId_);
230 return SURFACE_ERROR_UNKOWN;
231 }
232 return GSERROR_OK;
233 }
234
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)235 GSError BufferClientProducer::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
236 sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
237 {
238 return GetLastFlushedBufferCommon(buffer, fence,
239 matrix, MATRIX4_SIZE, isUseNewMatrix, BUFFER_PRODUCER_GET_LAST_FLUSHED_BUFFER);
240 }
241
GetProducerInitInfo(ProducerInitInfo & info)242 GSError BufferClientProducer::GetProducerInitInfo(ProducerInitInfo &info)
243 {
244 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
245 token_ = new IRemoteStub<IBufferProducerToken>();
246 HebcWhiteList::GetInstance().GetApplicationName(info.appName);
247 if (!arguments.WriteRemoteObject(token_->AsObject()) || !arguments.WriteString(info.appName)) {
248 return GSERROR_BINDER;
249 }
250 SEND_REQUEST(BUFFER_PRODUCER_GET_INIT_INFO, arguments, reply, option);
251 if (!reply.ReadInt32(info.width) || !reply.ReadInt32(info.height) ||
252 !reply.ReadUint64(info.uniqueId)) {
253 return GSERROR_BINDER;
254 }
255 uniqueId_ = info.uniqueId;
256 if (!reply.ReadString(info.name) || !reply.ReadBool(info.isInHebcList) || !reply.ReadString(info.bufferName) ||
257 !reply.ReadUint64(info.producerId) || !reply.ReadInt32(info.transformHint)) {
258 return GSERROR_BINDER;
259 }
260 return CheckRetval(reply);
261 }
262
CancelBuffer(uint32_t sequence,sptr<BufferExtraData> bedata)263 GSError BufferClientProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
264 {
265 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
266
267 if (!arguments.WriteUint32(sequence)) {
268 return GSERROR_BINDER;
269 }
270 GSError ret = bedata->WriteToParcel(arguments);
271 if (ret != GSERROR_OK) {
272 return GSERROR_BINDER;
273 }
274
275 SEND_REQUEST(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option);
276 return CheckRetval(reply);
277 }
278
FlushBuffer(uint32_t sequence,sptr<BufferExtraData> bedata,sptr<SyncFence> fence,BufferFlushConfigWithDamages & config)279 GSError BufferClientProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
280 sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
281 {
282 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
283
284 if (!arguments.WriteUint32(sequence)) {
285 return GSERROR_BINDER;
286 }
287 GSError ret = bedata->WriteToParcel(arguments);
288 if (ret != GSERROR_OK) {
289 return ret;
290 }
291 if (!fence->WriteToMessageParcel(arguments)) {
292 return GSERROR_BINDER;
293 }
294 ret = WriteFlushConfig(arguments, config);
295 if (ret != GSERROR_OK) {
296 return ret;
297 }
298
299 SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option);
300 ret = CheckRetval(reply);
301 if (ret != GSERROR_OK) {
302 return ret;
303 }
304
305 if (OHOS::RsFrameReportExt::GetInstance().GetEnable()) {
306 OHOS::RsFrameReportExt::GetInstance().HandleSwapBuffer();
307 }
308 return GSERROR_OK;
309 }
310
FlushBuffers(const std::vector<uint32_t> & sequences,const std::vector<sptr<BufferExtraData>> & bedata,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)311 GSError BufferClientProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
312 const std::vector<sptr<BufferExtraData>> &bedata,
313 const std::vector<sptr<SyncFence>> &fences,
314 const std::vector<BufferFlushConfigWithDamages> &configs)
315 {
316 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
317
318 if (sequences.empty() || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
319 return SURFACE_ERROR_UNKOWN;
320 }
321 if (!arguments.WriteUInt32Vector(sequences)) {
322 return GSERROR_BINDER;
323 }
324 GSError ret = GSERROR_OK;
325 for (uint32_t i = 0; i < sequences.size(); ++i) {
326 ret = bedata[i]->WriteToParcel(arguments);
327 if (ret != GSERROR_OK) {
328 return ret;
329 }
330 if (!fences[i]->WriteToMessageParcel(arguments)) {
331 return GSERROR_BINDER;
332 }
333 ret = WriteFlushConfig(arguments, configs[i]);
334 if (ret != GSERROR_OK) {
335 return ret;
336 }
337 }
338 SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFERS, arguments, reply, option);
339 return CheckRetval(reply);
340 }
341
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)342 GSError BufferClientProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
343 {
344 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
345 uint32_t sequence = buffer->GetSeqNum();
346 GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
347 if (ret != GSERROR_OK) {
348 return ret;
349 }
350 ret = buffer->WriteBufferRequestConfig(arguments);
351 if (ret != GSERROR_OK) {
352 BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
353 return ret;
354 }
355 SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, arguments, reply, option);
356 return CheckRetval(reply);
357 }
358
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)359 GSError BufferClientProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
360 {
361 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
362 uint32_t sequence = buffer->GetSeqNum();
363 GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
364 if (ret != GSERROR_OK) {
365 return ret;
366 }
367 SEND_REQUEST(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, arguments, reply, option);
368 return CheckRetval(reply);
369 }
370
AttachBuffer(sptr<SurfaceBuffer> & buffer)371 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
372 {
373 return GSERROR_NOT_SUPPORT;
374 }
375
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)376 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
377 {
378 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
379 uint32_t sequence = buffer->GetSeqNum();
380 GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
381 if (ret != GSERROR_OK) {
382 return ret;
383 }
384 if (!arguments.WriteInt32(timeOut)) {
385 return GSERROR_BINDER;
386 }
387 SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER, arguments, reply, option);
388 return CheckRetval(reply);
389 }
390
DetachBuffer(sptr<SurfaceBuffer> & buffer)391 GSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
392 {
393 return GSERROR_NOT_SUPPORT;
394 }
395
RegisterReleaseListener(sptr<IProducerListener> listener)396 GSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
397 {
398 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
399
400 if (!arguments.WriteRemoteObject(listener->AsObject())) {
401 return GSERROR_BINDER;
402 }
403
404 SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option);
405 return CheckRetval(reply);
406 }
407
RegisterPropertyListener(sptr<IProducerListener> listener,uint64_t producerId)408 GSError BufferClientProducer::RegisterPropertyListener(sptr<IProducerListener> listener, uint64_t producerId)
409 {
410 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
411
412 if (!arguments.WriteRemoteObject(listener->AsObject())) {
413 return GSERROR_BINDER;
414 }
415 if (!arguments.WriteUint64(producerId)) {
416 return GSERROR_BINDER;
417 }
418
419 SEND_REQUEST(BUFFER_PRODUCER_REGISTER_PROPERTY_LISTENER, arguments, reply, option);
420 return CheckRetval(reply);
421 }
422
UnRegisterPropertyListener(uint64_t producerId)423 GSError BufferClientProducer::UnRegisterPropertyListener(uint64_t producerId)
424 {
425 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
426
427 if (!arguments.WriteUint64(producerId)) {
428 return GSERROR_BINDER;
429 }
430
431 SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_PROPERTY_LISTENER, arguments, reply, option);
432 return CheckRetval(reply);
433 }
434
RegisterReleaseListenerBackup(sptr<IProducerListener> listener)435 GSError BufferClientProducer::RegisterReleaseListenerBackup(sptr<IProducerListener> listener)
436 {
437 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
438
439 if (listener == nullptr) {
440 return GSERROR_INVALID_ARGUMENTS;
441 }
442
443 if (!arguments.WriteRemoteObject(listener->AsObject())) {
444 return GSERROR_BINDER;
445 }
446
447 SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER_BACKUP, arguments, reply, option);
448 return CheckRetval(reply);
449 }
450
UnRegisterReleaseListener()451 GSError BufferClientProducer::UnRegisterReleaseListener()
452 {
453 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
454 SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option);
455 return CheckRetval(reply);
456 }
457
UnRegisterReleaseListenerBackup()458 GSError BufferClientProducer::UnRegisterReleaseListenerBackup()
459 {
460 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
461 SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER_BACKUP, arguments, reply, option);
462 return CheckRetval(reply);
463 }
464
GetQueueSize()465 uint32_t BufferClientProducer::GetQueueSize()
466 {
467 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
468
469 SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option);
470
471 return reply.ReadUint32();
472 }
473
SetQueueSize(uint32_t queueSize)474 GSError BufferClientProducer::SetQueueSize(uint32_t queueSize)
475 {
476 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
477
478 if (!arguments.WriteUint32(queueSize)) {
479 return GSERROR_BINDER;
480 }
481
482 SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option);
483 return CheckRetval(reply);
484 }
485
GetName(std::string & name)486 GSError BufferClientProducer::GetName(std::string &name)
487 {
488 {
489 std::lock_guard<std::mutex> lockGuard(mutex_);
490 if (name_ != DEFAULT_NAME) {
491 name = name_;
492 return GSERROR_OK;
493 }
494 }
495 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
496
497 SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option);
498 GSError ret = CheckRetval(reply);
499 if (ret != GSERROR_OK) {
500 return ret;
501 }
502 if (!reply.ReadString(name)) {
503 BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
504 return GSERROR_BINDER;
505 }
506 {
507 std::lock_guard<std::mutex> lockGuard(mutex_);
508 name_ = name;
509 }
510 return ret;
511 }
512
GetUniqueId()513 uint64_t BufferClientProducer::GetUniqueId()
514 {
515 {
516 std::lock_guard<std::mutex> lockGuard(mutex_);
517 if (uniqueId_ != 0) {
518 return uniqueId_;
519 }
520 }
521 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
522 SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option);
523 {
524 std::lock_guard<std::mutex> lockGuard(mutex_);
525 uniqueId_ = reply.ReadUint64();
526 return uniqueId_;
527 }
528 }
529
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)530 GSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
531 {
532 {
533 std::lock_guard<std::mutex> lockGuard(mutex_);
534 if (uniqueId_ != 0 && name_ != DEFAULT_NAME) {
535 uniqueId = uniqueId_;
536 name = name_;
537 return GSERROR_OK;
538 }
539 }
540 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
541
542 SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option);
543 GSError ret = CheckRetval(reply);
544 if (ret != GSERROR_OK) {
545 return ret;
546 }
547 if (!reply.ReadString(name)) {
548 BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
549 return GSERROR_BINDER;
550 }
551
552 uniqueId = reply.ReadUint64();
553 {
554 std::lock_guard<std::mutex> lockGuard(mutex_);
555 name_ = name;
556 uniqueId_ = uniqueId;
557 }
558 return ret;
559 }
560
GetDefaultWidth()561 int32_t BufferClientProducer::GetDefaultWidth()
562 {
563 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
564
565 SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option);
566
567 return reply.ReadInt32();
568 }
569
GetDefaultHeight()570 int32_t BufferClientProducer::GetDefaultHeight()
571 {
572 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
573
574 SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option);
575
576 return reply.ReadInt32();
577 }
578
SetDefaultUsage(uint64_t usage)579 GSError BufferClientProducer::SetDefaultUsage(uint64_t usage)
580 {
581 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
582
583 if (!arguments.WriteUint64(usage)) {
584 return GSERROR_BINDER;
585 }
586
587 SEND_REQUEST(BUFFER_PRODUCER_SET_DEFAULT_USAGE, arguments, reply, option);
588
589 return CheckRetval(reply);
590 }
591
GetDefaultUsage()592 uint64_t BufferClientProducer::GetDefaultUsage()
593 {
594 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
595
596 SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option);
597
598 return reply.ReadUint64();
599 }
600
CleanCache(bool cleanAll,uint32_t * bufSeqNum)601 GSError BufferClientProducer::CleanCache(bool cleanAll, uint32_t *bufSeqNum)
602 {
603 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
604
605 if (!arguments.WriteBool(cleanAll)) {
606 return GSERROR_BINDER;
607 }
608 SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option);
609 GSError ret = CheckRetval(reply);
610 if (ret == GSERROR_OK && bufSeqNum != nullptr) {
611 *bufSeqNum = reply.ReadUint32();
612 }
613 return ret;
614 }
615
GoBackground()616 GSError BufferClientProducer::GoBackground()
617 {
618 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
619
620 SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option);
621 return CheckRetval(reply);
622 }
623
SetTransform(GraphicTransformType transform)624 GSError BufferClientProducer::SetTransform(GraphicTransformType transform)
625 {
626 {
627 std::lock_guard<std::mutex> lockGuard(mutex_);
628 if (lastSetTransformType_ == transform) {
629 return GSERROR_OK;
630 }
631 lastSetTransformType_ = transform;
632 }
633
634 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
635
636 if (!arguments.WriteUint32(static_cast<uint32_t>(transform))) {
637 return GSERROR_BINDER;
638 }
639
640 SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option);
641 GSError ret = CheckRetval(reply);
642 if (ret != GSERROR_OK) {
643 {
644 std::lock_guard<std::mutex> lockGuard(mutex_);
645 lastSetTransformType_ = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
646 }
647 return ret;
648 }
649
650 return GSERROR_OK;
651 }
652
Connect()653 GSError BufferClientProducer::Connect()
654 {
655 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
656
657 SEND_REQUEST(BUFFER_PRODUCER_CONNECT, arguments, reply, option);
658 return CheckRetval(reply);
659 }
660
Disconnect(uint32_t * bufSeqNum)661 GSError BufferClientProducer::Disconnect(uint32_t *bufSeqNum)
662 {
663 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
664
665 SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option);
666 GSError ret = CheckRetval(reply);
667 if (ret == GSERROR_OK && bufSeqNum != nullptr) {
668 *bufSeqNum = reply.ReadUint32();
669 }
670 return ret;
671 }
672
ConnectStrictly()673 GSError BufferClientProducer::ConnectStrictly()
674 {
675 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
676
677 SEND_REQUEST(BUFFER_PRODUCER_CONNECT_STRICTLY, arguments, reply, option);
678 return CheckRetval(reply);
679 }
680
DisconnectStrictly()681 GSError BufferClientProducer::DisconnectStrictly()
682 {
683 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
684
685 SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT_STRICTLY, arguments, reply, option);
686 return CheckRetval(reply);
687 }
688
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)689 GSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
690 {
691 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
692 if (!arguments.WriteUint32(sequence) || !arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
693 return GSERROR_BINDER;
694 }
695 SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option);
696 return CheckRetval(reply);
697 }
698
SetScalingMode(ScalingMode scalingMode)699 GSError BufferClientProducer::SetScalingMode(ScalingMode scalingMode)
700 {
701 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
702 if (!arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
703 return GSERROR_BINDER;
704 }
705 SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODEV2, arguments, reply, option);
706 return CheckRetval(reply);
707 }
708
SetBufferHold(bool hold)709 GSError BufferClientProducer::SetBufferHold(bool hold)
710 {
711 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
712 if (!arguments.WriteBool(hold)) {
713 return GSERROR_BINDER;
714 }
715 SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_HOLD, arguments, reply, option);
716 return CheckRetval(reply);
717 }
718
SetBufferName(const std::string & bufferName)719 GSError BufferClientProducer::SetBufferName(const std::string &bufferName)
720 {
721 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
722 if (!arguments.WriteString(bufferName)) {
723 return GSERROR_BINDER;
724 }
725 SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_NAME, arguments, reply, option);
726 return CheckRetval(reply);
727 }
728
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)729 GSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
730 {
731 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
732 if (!arguments.WriteUint32(sequence)) {
733 return GSERROR_BINDER;
734 }
735 GSError ret = WriteHDRMetaData(arguments, metaData);
736 if (ret != GSERROR_OK) {
737 return ret;
738 }
739 SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option);
740 return CheckRetval(reply);
741 }
742
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)743 GSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
744 const std::vector<uint8_t> &metaData)
745 {
746 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
747 if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(key))) {
748 return GSERROR_BINDER;
749 }
750 GSError ret = WriteHDRMetaDataSet(arguments, metaData);
751 if (ret != GSERROR_OK) {
752 return ret;
753 }
754 SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option);
755 return CheckRetval(reply);
756 }
757
SetTunnelHandle(const GraphicExtDataHandle * handle)758 GSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
759 {
760 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
761 if (handle == nullptr) {
762 if (!arguments.WriteBool(false)) {
763 return GSERROR_BINDER;
764 }
765 } else {
766 if (!arguments.WriteBool(true)) {
767 return GSERROR_BINDER;
768 }
769 GSError ret = WriteExtDataHandle(arguments, handle);
770 if (ret != GSERROR_OK) {
771 return ret;
772 }
773 }
774 SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option);
775 return CheckRetval(reply);
776 }
777
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)778 GSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
779 {
780 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
781 if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(type))) {
782 return GSERROR_BINDER;
783 }
784 SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option);
785 GSError ret = CheckRetval(reply);
786 if (ret != GSERROR_OK) {
787 return ret;
788 }
789 time = reply.ReadInt64();
790 return static_cast<GSError>(ret);
791 }
792
GetNativeSurface()793 sptr<NativeSurface> BufferClientProducer::GetNativeSurface()
794 {
795 return nullptr;
796 }
797
GetTransform(GraphicTransformType & transform)798 GSError BufferClientProducer::GetTransform(GraphicTransformType &transform)
799 {
800 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
801 SEND_REQUEST(BUFFER_PRODUCER_GET_TRANSFORM, arguments, reply, option);
802
803 GSError ret = CheckRetval(reply);
804 if (ret != GSERROR_OK) {
805 return ret;
806 }
807 transform = static_cast<GraphicTransformType>(reply.ReadUint32());
808 return GSERROR_OK;
809 }
810
GetTransformHint(GraphicTransformType & transformHint)811 GSError BufferClientProducer::GetTransformHint(GraphicTransformType &transformHint)
812 {
813 return GSERROR_NOT_SUPPORT;
814 }
815
SetTransformHint(GraphicTransformType transformHint,uint64_t fromId)816 GSError BufferClientProducer::SetTransformHint(GraphicTransformType transformHint, uint64_t fromId)
817 {
818 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
819
820 if (!arguments.WriteUint32(static_cast<uint32_t>(transformHint))) {
821 return GSERROR_BINDER;
822 }
823
824 if (!arguments.WriteUint64(fromId)) {
825 return GSERROR_BINDER;
826 }
827
828 SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORMHINT, arguments, reply, option);
829 return CheckRetval(reply);
830 }
831
SetSurfaceSourceType(OHSurfaceSource sourceType)832 GSError BufferClientProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
833 {
834 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
835 if (!arguments.WriteUint32(static_cast<uint32_t>(sourceType))) {
836 return GSERROR_BINDER;
837 }
838 SEND_REQUEST(BUFFER_PRODUCER_SET_SOURCE_TYPE, arguments, reply, option);
839 return CheckRetval(reply);
840 }
841
GetSurfaceSourceType(OHSurfaceSource & sourceType)842 GSError BufferClientProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
843 {
844 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
845 SEND_REQUEST(BUFFER_PRODUCER_GET_SOURCE_TYPE, arguments, reply, option);
846 GSError ret = CheckRetval(reply);
847 if (ret != GSERROR_OK) {
848 return ret;
849 }
850 sourceType = static_cast<OHSurfaceSource>(reply.ReadUint32());
851 return GSERROR_OK;
852 }
853
SetSurfaceAppFrameworkType(std::string appFrameworkType)854 GSError BufferClientProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
855 {
856 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
857 if (!arguments.WriteString(appFrameworkType)) {
858 return GSERROR_BINDER;
859 }
860 SEND_REQUEST(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, arguments, reply, option);
861 return CheckRetval(reply);
862 }
863
GetSurfaceAppFrameworkType(std::string & appFrameworkType)864 GSError BufferClientProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
865 {
866 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
867 SEND_REQUEST(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, arguments, reply, option);
868 GSError ret = CheckRetval(reply);
869 if (ret != GSERROR_OK) {
870 return ret;
871 }
872 appFrameworkType = static_cast<std::string>(reply.ReadString());
873 return GSERROR_OK;
874 }
875
SetHdrWhitePointBrightness(float brightness)876 GSError BufferClientProducer::SetHdrWhitePointBrightness(float brightness)
877 {
878 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
879
880 if (!arguments.WriteFloat(brightness)) {
881 return GSERROR_BINDER;
882 }
883
884 SEND_REQUEST(BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
885 return CheckRetval(reply);
886 }
887
SetSdrWhitePointBrightness(float brightness)888 GSError BufferClientProducer::SetSdrWhitePointBrightness(float brightness)
889 {
890 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
891
892 if (!arguments.WriteFloat(brightness)) {
893 return GSERROR_BINDER;
894 }
895
896 SEND_REQUEST(BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
897 return CheckRetval(reply);
898 }
899
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)900 GSError BufferClientProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
901 float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
902 {
903 return GetLastFlushedBufferCommon(buffer, fence,
904 matrix, matrixSize, isUseNewMatrix, BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER);
905 }
906
ReleaseLastFlushedBuffer(uint32_t sequence)907 GSError BufferClientProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
908 {
909 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
910 if (!arguments.WriteUint32(sequence)) {
911 return GSERROR_BINDER;
912 }
913 SEND_REQUEST(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, arguments, reply, option);
914 return CheckRetval(reply);
915 }
916
SetGlobalAlpha(int32_t alpha)917 GSError BufferClientProducer::SetGlobalAlpha(int32_t alpha)
918 {
919 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
920 if (!arguments.WriteInt32(alpha)) {
921 return GSERROR_BINDER;
922 }
923 SEND_REQUEST(BUFFER_PRODUCER_SET_GLOBALALPHA, arguments, reply, option);
924 return CheckRetval(reply);
925 }
926
RequestAndDetachBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)927 GSError BufferClientProducer::RequestAndDetachBuffer(const BufferRequestConfig& config,
928 sptr<BufferExtraData>& bedata, RequestBufferReturnValue& retval)
929 {
930 return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_AND_DETACH_BUFFER);
931 }
932
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,sptr<BufferExtraData> & bedata,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config,bool needMap)933 GSError BufferClientProducer::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, sptr<BufferExtraData>& bedata,
934 const sptr<SyncFence>& fence, BufferFlushConfigWithDamages& config, bool needMap)
935 {
936 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
937 GSError ret = WriteSurfaceBufferImpl(arguments, buffer->GetSeqNum(), buffer);
938 if (ret != GSERROR_OK) {
939 return ret;
940 }
941 ret = buffer->WriteBufferRequestConfig(arguments);
942 if (ret != GSERROR_OK) {
943 BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
944 return ret;
945 }
946
947 ret = bedata->WriteToParcel(arguments);
948 if (ret != GSERROR_OK) {
949 return ret;
950 }
951 if (!fence->WriteToMessageParcel(arguments)) {
952 return GSERROR_BINDER;
953 }
954 ret = WriteFlushConfig(arguments, config);
955 if (ret != GSERROR_OK) {
956 return ret;
957 }
958 if (!arguments.WriteBool(needMap)) {
959 return GSERROR_BINDER;
960 }
961 SEND_REQUEST(BUFFER_PRODUCER_ATTACH_AND_FLUSH_BUFFER, arguments, reply, option);
962 return CheckRetval(reply);
963 }
964
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)965 GSError BufferClientProducer::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
966 {
967 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
968 SEND_REQUEST(BUFFER_PRODUCER_GET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
969 GSError ret = CheckRetval(reply);
970 if (ret != GSERROR_OK) {
971 return ret;
972 }
973 cycleBuffersNumber = reply.ReadUint32();
974 return GSERROR_OK;
975 }
976
SetCycleBuffersNumber(uint32_t cycleBuffersNumber)977 GSError BufferClientProducer::SetCycleBuffersNumber(uint32_t cycleBuffersNumber)
978 {
979 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
980 if (!arguments.WriteUint32(cycleBuffersNumber)) {
981 return GSERROR_BINDER;
982 }
983 SEND_REQUEST(BUFFER_PRODUCER_SET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
984 return CheckRetval(reply);
985 }
986 }; // namespace OHOS
987