1 /*
2 * Copyright (c) 2021-2025 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 if (info.propertyListener && !arguments.WriteRemoteObject(info.propertyListener->AsObject())) {
251 return GSERROR_BINDER;
252 }
253 SEND_REQUEST(BUFFER_PRODUCER_GET_INIT_INFO, arguments, reply, option);
254 if (!reply.ReadInt32(info.width) || !reply.ReadInt32(info.height) ||
255 !reply.ReadUint64(info.uniqueId)) {
256 return GSERROR_BINDER;
257 }
258 uniqueId_ = info.uniqueId;
259 if (!reply.ReadString(info.name) || !reply.ReadBool(info.isInHebcList) || !reply.ReadString(info.bufferName) ||
260 !reply.ReadUint64(info.producerId) || !reply.ReadInt32(info.transformHint)) {
261 return GSERROR_BINDER;
262 }
263 return CheckRetval(reply);
264 }
265
CancelBuffer(uint32_t sequence,sptr<BufferExtraData> bedata)266 GSError BufferClientProducer::CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata)
267 {
268 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
269
270 if (!arguments.WriteUint32(sequence)) {
271 return GSERROR_BINDER;
272 }
273 GSError ret = bedata->WriteToParcel(arguments);
274 if (ret != GSERROR_OK) {
275 return GSERROR_BINDER;
276 }
277
278 SEND_REQUEST(BUFFER_PRODUCER_CANCEL_BUFFER, arguments, reply, option);
279 return CheckRetval(reply);
280 }
281
FlushBuffer(uint32_t sequence,sptr<BufferExtraData> bedata,sptr<SyncFence> fence,BufferFlushConfigWithDamages & config)282 GSError BufferClientProducer::FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
283 sptr<SyncFence> fence, BufferFlushConfigWithDamages &config)
284 {
285 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
286
287 if (!arguments.WriteUint32(sequence)) {
288 return GSERROR_BINDER;
289 }
290 GSError ret = bedata->WriteToParcel(arguments);
291 if (ret != GSERROR_OK) {
292 return ret;
293 }
294 if (!fence->WriteToMessageParcel(arguments)) {
295 return GSERROR_BINDER;
296 }
297 ret = WriteFlushConfig(arguments, config);
298 if (ret != GSERROR_OK) {
299 return ret;
300 }
301
302 SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFER, arguments, reply, option);
303 ret = CheckRetval(reply);
304 if (ret != GSERROR_OK) {
305 return ret;
306 }
307
308 if (OHOS::RsFrameReportExt::GetInstance().GetEnable()) {
309 OHOS::RsFrameReportExt::GetInstance().HandleSwapBuffer();
310 }
311 return GSERROR_OK;
312 }
313
FlushBuffers(const std::vector<uint32_t> & sequences,const std::vector<sptr<BufferExtraData>> & bedata,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)314 GSError BufferClientProducer::FlushBuffers(const std::vector<uint32_t> &sequences,
315 const std::vector<sptr<BufferExtraData>> &bedata,
316 const std::vector<sptr<SyncFence>> &fences,
317 const std::vector<BufferFlushConfigWithDamages> &configs)
318 {
319 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
320
321 if (sequences.empty() || sequences.size() > SURFACE_MAX_QUEUE_SIZE) {
322 return SURFACE_ERROR_UNKOWN;
323 }
324 if (!arguments.WriteUInt32Vector(sequences)) {
325 return GSERROR_BINDER;
326 }
327 GSError ret = GSERROR_OK;
328 for (uint32_t i = 0; i < sequences.size(); ++i) {
329 ret = bedata[i]->WriteToParcel(arguments);
330 if (ret != GSERROR_OK) {
331 return ret;
332 }
333 if (!fences[i]->WriteToMessageParcel(arguments)) {
334 return GSERROR_BINDER;
335 }
336 ret = WriteFlushConfig(arguments, configs[i]);
337 if (ret != GSERROR_OK) {
338 return ret;
339 }
340 }
341 SEND_REQUEST(BUFFER_PRODUCER_FLUSH_BUFFERS, arguments, reply, option);
342 return CheckRetval(reply);
343 }
344
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)345 GSError BufferClientProducer::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
346 {
347 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
348 uint32_t sequence = buffer->GetSeqNum();
349 GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
350 if (ret != GSERROR_OK) {
351 return ret;
352 }
353 ret = buffer->WriteBufferRequestConfig(arguments);
354 if (ret != GSERROR_OK) {
355 BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
356 return ret;
357 }
358 SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER_TO_QUEUE, arguments, reply, option);
359 return CheckRetval(reply);
360 }
361
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)362 GSError BufferClientProducer::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
363 {
364 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
365 uint32_t sequence = buffer->GetSeqNum();
366 GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
367 if (ret != GSERROR_OK) {
368 return ret;
369 }
370 SEND_REQUEST(BUFFER_PRODUCER_DETACH_BUFFER_FROM_QUEUE, arguments, reply, option);
371 return CheckRetval(reply);
372 }
373
AttachBuffer(sptr<SurfaceBuffer> & buffer)374 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer)
375 {
376 return GSERROR_NOT_SUPPORT;
377 }
378
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)379 GSError BufferClientProducer::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
380 {
381 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
382 uint32_t sequence = buffer->GetSeqNum();
383 GSError ret = WriteSurfaceBufferImpl(arguments, sequence, buffer);
384 if (ret != GSERROR_OK) {
385 return ret;
386 }
387 if (!arguments.WriteInt32(timeOut)) {
388 return GSERROR_BINDER;
389 }
390 SEND_REQUEST(BUFFER_PRODUCER_ATTACH_BUFFER, arguments, reply, option);
391 return CheckRetval(reply);
392 }
393
DetachBuffer(sptr<SurfaceBuffer> & buffer)394 GSError BufferClientProducer::DetachBuffer(sptr<SurfaceBuffer>& buffer)
395 {
396 return GSERROR_NOT_SUPPORT;
397 }
398
RegisterReleaseListener(sptr<IProducerListener> listener)399 GSError BufferClientProducer::RegisterReleaseListener(sptr<IProducerListener> listener)
400 {
401 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
402
403 if (!arguments.WriteRemoteObject(listener->AsObject())) {
404 return GSERROR_BINDER;
405 }
406
407 SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER, arguments, reply, option);
408 return CheckRetval(reply);
409 }
410
RegisterPropertyListener(sptr<IProducerListener> listener,uint64_t producerId)411 GSError BufferClientProducer::RegisterPropertyListener(sptr<IProducerListener> listener, uint64_t producerId)
412 {
413 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
414
415 if (!arguments.WriteRemoteObject(listener->AsObject())) {
416 return GSERROR_BINDER;
417 }
418 if (!arguments.WriteUint64(producerId)) {
419 return GSERROR_BINDER;
420 }
421
422 SEND_REQUEST(BUFFER_PRODUCER_REGISTER_PROPERTY_LISTENER, arguments, reply, option);
423 return CheckRetval(reply);
424 }
425
UnRegisterPropertyListener(uint64_t producerId)426 GSError BufferClientProducer::UnRegisterPropertyListener(uint64_t producerId)
427 {
428 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
429
430 if (!arguments.WriteUint64(producerId)) {
431 return GSERROR_BINDER;
432 }
433
434 SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_PROPERTY_LISTENER, arguments, reply, option);
435 return CheckRetval(reply);
436 }
437
RegisterReleaseListenerBackup(sptr<IProducerListener> listener)438 GSError BufferClientProducer::RegisterReleaseListenerBackup(sptr<IProducerListener> listener)
439 {
440 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
441
442 if (listener == nullptr) {
443 return GSERROR_INVALID_ARGUMENTS;
444 }
445
446 if (!arguments.WriteRemoteObject(listener->AsObject())) {
447 return GSERROR_BINDER;
448 }
449
450 SEND_REQUEST(BUFFER_PRODUCER_REGISTER_RELEASE_LISTENER_BACKUP, arguments, reply, option);
451 return CheckRetval(reply);
452 }
453
UnRegisterReleaseListener()454 GSError BufferClientProducer::UnRegisterReleaseListener()
455 {
456 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
457 SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER, arguments, reply, option);
458 return CheckRetval(reply);
459 }
460
UnRegisterReleaseListenerBackup()461 GSError BufferClientProducer::UnRegisterReleaseListenerBackup()
462 {
463 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
464 SEND_REQUEST(BUFFER_PRODUCER_UNREGISTER_RELEASE_LISTENER_BACKUP, arguments, reply, option);
465 return CheckRetval(reply);
466 }
467
GetQueueSize()468 uint32_t BufferClientProducer::GetQueueSize()
469 {
470 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
471
472 SEND_REQUEST(BUFFER_PRODUCER_GET_QUEUE_SIZE, arguments, reply, option);
473
474 return reply.ReadUint32();
475 }
476
SetQueueSize(uint32_t queueSize)477 GSError BufferClientProducer::SetQueueSize(uint32_t queueSize)
478 {
479 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
480
481 if (!arguments.WriteUint32(queueSize)) {
482 return GSERROR_BINDER;
483 }
484
485 SEND_REQUEST(BUFFER_PRODUCER_SET_QUEUE_SIZE, arguments, reply, option);
486 return CheckRetval(reply);
487 }
488
GetName(std::string & name)489 GSError BufferClientProducer::GetName(std::string &name)
490 {
491 {
492 std::lock_guard<std::mutex> lockGuard(mutex_);
493 if (name_ != DEFAULT_NAME) {
494 name = name_;
495 return GSERROR_OK;
496 }
497 }
498 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
499
500 SEND_REQUEST(BUFFER_PRODUCER_GET_NAME, arguments, reply, option);
501 GSError ret = CheckRetval(reply);
502 if (ret != GSERROR_OK) {
503 return ret;
504 }
505 if (!reply.ReadString(name)) {
506 BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
507 return GSERROR_BINDER;
508 }
509 {
510 std::lock_guard<std::mutex> lockGuard(mutex_);
511 name_ = name;
512 }
513 return ret;
514 }
515
GetUniqueId()516 uint64_t BufferClientProducer::GetUniqueId()
517 {
518 {
519 std::lock_guard<std::mutex> lockGuard(mutex_);
520 if (uniqueId_ != 0) {
521 return uniqueId_;
522 }
523 }
524 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
525 SEND_REQUEST(BUFFER_PRODUCER_GET_UNIQUE_ID, arguments, reply, option);
526 {
527 std::lock_guard<std::mutex> lockGuard(mutex_);
528 uniqueId_ = reply.ReadUint64();
529 return uniqueId_;
530 }
531 }
532
GetNameAndUniqueId(std::string & name,uint64_t & uniqueId)533 GSError BufferClientProducer::GetNameAndUniqueId(std::string& name, uint64_t& uniqueId)
534 {
535 {
536 std::lock_guard<std::mutex> lockGuard(mutex_);
537 if (uniqueId_ != 0 && name_ != DEFAULT_NAME) {
538 uniqueId = uniqueId_;
539 name = name_;
540 return GSERROR_OK;
541 }
542 }
543 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
544
545 SEND_REQUEST(BUFFER_PRODUCER_GET_NAMEANDUNIQUEDID, arguments, reply, option);
546 GSError ret = CheckRetval(reply);
547 if (ret != GSERROR_OK) {
548 return ret;
549 }
550 if (!reply.ReadString(name)) {
551 BLOGE("reply.ReadString return false, uniqueId: %{public}" PRIu64 ".", uniqueId_);
552 return GSERROR_BINDER;
553 }
554
555 uniqueId = reply.ReadUint64();
556 {
557 std::lock_guard<std::mutex> lockGuard(mutex_);
558 name_ = name;
559 uniqueId_ = uniqueId;
560 }
561 return ret;
562 }
563
GetDefaultWidth()564 int32_t BufferClientProducer::GetDefaultWidth()
565 {
566 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
567
568 SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_WIDTH, arguments, reply, option);
569
570 return reply.ReadInt32();
571 }
572
GetDefaultHeight()573 int32_t BufferClientProducer::GetDefaultHeight()
574 {
575 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
576
577 SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_HEIGHT, arguments, reply, option);
578
579 return reply.ReadInt32();
580 }
581
SetDefaultUsage(uint64_t usage)582 GSError BufferClientProducer::SetDefaultUsage(uint64_t usage)
583 {
584 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
585
586 if (!arguments.WriteUint64(usage)) {
587 return GSERROR_BINDER;
588 }
589
590 SEND_REQUEST(BUFFER_PRODUCER_SET_DEFAULT_USAGE, arguments, reply, option);
591
592 return CheckRetval(reply);
593 }
594
GetDefaultUsage()595 uint64_t BufferClientProducer::GetDefaultUsage()
596 {
597 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
598
599 SEND_REQUEST(BUFFER_PRODUCER_GET_DEFAULT_USAGE, arguments, reply, option);
600
601 return reply.ReadUint64();
602 }
603
CleanCache(bool cleanAll,uint32_t * bufSeqNum)604 GSError BufferClientProducer::CleanCache(bool cleanAll, uint32_t *bufSeqNum)
605 {
606 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
607
608 if (!arguments.WriteBool(cleanAll)) {
609 return GSERROR_BINDER;
610 }
611 SEND_REQUEST(BUFFER_PRODUCER_CLEAN_CACHE, arguments, reply, option);
612 GSError ret = CheckRetval(reply);
613 if (ret == GSERROR_OK && bufSeqNum != nullptr) {
614 *bufSeqNum = reply.ReadUint32();
615 }
616 return ret;
617 }
618
GoBackground()619 GSError BufferClientProducer::GoBackground()
620 {
621 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
622
623 SEND_REQUEST(BUFFER_PRODUCER_GO_BACKGROUND, arguments, reply, option);
624 return CheckRetval(reply);
625 }
626
SetTransform(GraphicTransformType transform)627 GSError BufferClientProducer::SetTransform(GraphicTransformType transform)
628 {
629 {
630 std::lock_guard<std::mutex> lockGuard(mutex_);
631 if (lastSetTransformType_ == transform) {
632 return GSERROR_OK;
633 }
634 lastSetTransformType_ = transform;
635 }
636
637 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
638
639 if (!arguments.WriteUint32(static_cast<uint32_t>(transform))) {
640 return GSERROR_BINDER;
641 }
642
643 SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORM, arguments, reply, option);
644 GSError ret = CheckRetval(reply);
645 if (ret != GSERROR_OK) {
646 {
647 std::lock_guard<std::mutex> lockGuard(mutex_);
648 lastSetTransformType_ = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
649 }
650 return ret;
651 }
652
653 return GSERROR_OK;
654 }
655
Connect()656 GSError BufferClientProducer::Connect()
657 {
658 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
659
660 SEND_REQUEST(BUFFER_PRODUCER_CONNECT, arguments, reply, option);
661 return CheckRetval(reply);
662 }
663
Disconnect(uint32_t * bufSeqNum)664 GSError BufferClientProducer::Disconnect(uint32_t *bufSeqNum)
665 {
666 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
667
668 SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT, arguments, reply, option);
669 GSError ret = CheckRetval(reply);
670 if (ret == GSERROR_OK && bufSeqNum != nullptr) {
671 *bufSeqNum = reply.ReadUint32();
672 }
673 return ret;
674 }
675
ConnectStrictly()676 GSError BufferClientProducer::ConnectStrictly()
677 {
678 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
679
680 SEND_REQUEST(BUFFER_PRODUCER_CONNECT_STRICTLY, arguments, reply, option);
681 return CheckRetval(reply);
682 }
683
DisconnectStrictly()684 GSError BufferClientProducer::DisconnectStrictly()
685 {
686 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
687
688 SEND_REQUEST(BUFFER_PRODUCER_DISCONNECT_STRICTLY, arguments, reply, option);
689 return CheckRetval(reply);
690 }
691
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)692 GSError BufferClientProducer::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
693 {
694 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
695 if (!arguments.WriteUint32(sequence) || !arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
696 return GSERROR_BINDER;
697 }
698 SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODE, arguments, reply, option);
699 return CheckRetval(reply);
700 }
701
SetScalingMode(ScalingMode scalingMode)702 GSError BufferClientProducer::SetScalingMode(ScalingMode scalingMode)
703 {
704 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
705 if (!arguments.WriteInt32(static_cast<int32_t>(scalingMode))) {
706 return GSERROR_BINDER;
707 }
708 SEND_REQUEST(BUFFER_PRODUCER_SET_SCALING_MODEV2, arguments, reply, option);
709 return CheckRetval(reply);
710 }
711
SetBufferHold(bool hold)712 GSError BufferClientProducer::SetBufferHold(bool hold)
713 {
714 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
715 if (!arguments.WriteBool(hold)) {
716 return GSERROR_BINDER;
717 }
718 SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_HOLD, arguments, reply, option);
719 return CheckRetval(reply);
720 }
721
SetBufferReallocFlag(bool flag)722 GSError BufferClientProducer::SetBufferReallocFlag(bool flag)
723 {
724 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
725 if (!arguments.WriteBool(flag)) {
726 return GSERROR_BINDER;
727 }
728 SEND_REQUEST(BUFFER_PRODUCER_BUFFER_REALLOC_FLAG, arguments, reply, option);
729 return CheckRetval(reply);
730 }
731
SetBufferName(const std::string & bufferName)732 GSError BufferClientProducer::SetBufferName(const std::string &bufferName)
733 {
734 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
735 if (!arguments.WriteString(bufferName)) {
736 return GSERROR_BINDER;
737 }
738 SEND_REQUEST(BUFFER_PRODUCER_SET_BUFFER_NAME, arguments, reply, option);
739 return CheckRetval(reply);
740 }
741
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)742 GSError BufferClientProducer::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData)
743 {
744 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
745 if (!arguments.WriteUint32(sequence)) {
746 return GSERROR_BINDER;
747 }
748 GSError ret = WriteHDRMetaData(arguments, metaData);
749 if (ret != GSERROR_OK) {
750 return ret;
751 }
752 SEND_REQUEST(BUFFER_PRODUCER_SET_METADATA, arguments, reply, option);
753 return CheckRetval(reply);
754 }
755
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)756 GSError BufferClientProducer::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
757 const std::vector<uint8_t> &metaData)
758 {
759 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
760 if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(key))) {
761 return GSERROR_BINDER;
762 }
763 GSError ret = WriteHDRMetaDataSet(arguments, metaData);
764 if (ret != GSERROR_OK) {
765 return ret;
766 }
767 SEND_REQUEST(BUFFER_PRODUCER_SET_METADATASET, arguments, reply, option);
768 return CheckRetval(reply);
769 }
770
SetTunnelHandle(const GraphicExtDataHandle * handle)771 GSError BufferClientProducer::SetTunnelHandle(const GraphicExtDataHandle *handle)
772 {
773 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
774 if (handle == nullptr) {
775 if (!arguments.WriteBool(false)) {
776 return GSERROR_BINDER;
777 }
778 } else {
779 if (!arguments.WriteBool(true)) {
780 return GSERROR_BINDER;
781 }
782 GSError ret = WriteExtDataHandle(arguments, handle);
783 if (ret != GSERROR_OK) {
784 return ret;
785 }
786 }
787 SEND_REQUEST(BUFFER_PRODUCER_SET_TUNNEL_HANDLE, arguments, reply, option);
788 return CheckRetval(reply);
789 }
790
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time)791 GSError BufferClientProducer::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time)
792 {
793 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
794 if (!arguments.WriteUint32(sequence) || !arguments.WriteUint32(static_cast<uint32_t>(type))) {
795 return GSERROR_BINDER;
796 }
797 SEND_REQUEST(BUFFER_PRODUCER_GET_PRESENT_TIMESTAMP, arguments, reply, option);
798 GSError ret = CheckRetval(reply);
799 if (ret != GSERROR_OK) {
800 return ret;
801 }
802 time = reply.ReadInt64();
803 return static_cast<GSError>(ret);
804 }
805
GetNativeSurface()806 sptr<NativeSurface> BufferClientProducer::GetNativeSurface()
807 {
808 return nullptr;
809 }
810
GetTransform(GraphicTransformType & transform)811 GSError BufferClientProducer::GetTransform(GraphicTransformType &transform)
812 {
813 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
814 SEND_REQUEST(BUFFER_PRODUCER_GET_TRANSFORM, arguments, reply, option);
815
816 GSError ret = CheckRetval(reply);
817 if (ret != GSERROR_OK) {
818 return ret;
819 }
820 transform = static_cast<GraphicTransformType>(reply.ReadUint32());
821 return GSERROR_OK;
822 }
823
GetTransformHint(GraphicTransformType & transformHint)824 GSError BufferClientProducer::GetTransformHint(GraphicTransformType &transformHint)
825 {
826 return GSERROR_NOT_SUPPORT;
827 }
828
SetTransformHint(GraphicTransformType transformHint,uint64_t fromId)829 GSError BufferClientProducer::SetTransformHint(GraphicTransformType transformHint, uint64_t fromId)
830 {
831 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
832
833 if (!arguments.WriteUint32(static_cast<uint32_t>(transformHint))) {
834 return GSERROR_BINDER;
835 }
836
837 if (!arguments.WriteUint64(fromId)) {
838 return GSERROR_BINDER;
839 }
840
841 SEND_REQUEST(BUFFER_PRODUCER_SET_TRANSFORMHINT, arguments, reply, option);
842 return CheckRetval(reply);
843 }
844
SetSurfaceSourceType(OHSurfaceSource sourceType)845 GSError BufferClientProducer::SetSurfaceSourceType(OHSurfaceSource sourceType)
846 {
847 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
848 if (!arguments.WriteUint32(static_cast<uint32_t>(sourceType))) {
849 return GSERROR_BINDER;
850 }
851 SEND_REQUEST(BUFFER_PRODUCER_SET_SOURCE_TYPE, arguments, reply, option);
852 return CheckRetval(reply);
853 }
854
GetSurfaceSourceType(OHSurfaceSource & sourceType)855 GSError BufferClientProducer::GetSurfaceSourceType(OHSurfaceSource &sourceType)
856 {
857 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
858 SEND_REQUEST(BUFFER_PRODUCER_GET_SOURCE_TYPE, arguments, reply, option);
859 GSError ret = CheckRetval(reply);
860 if (ret != GSERROR_OK) {
861 return ret;
862 }
863 sourceType = static_cast<OHSurfaceSource>(reply.ReadUint32());
864 return GSERROR_OK;
865 }
866
SetSurfaceAppFrameworkType(std::string appFrameworkType)867 GSError BufferClientProducer::SetSurfaceAppFrameworkType(std::string appFrameworkType)
868 {
869 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
870 if (!arguments.WriteString(appFrameworkType)) {
871 return GSERROR_BINDER;
872 }
873 SEND_REQUEST(BUFFER_PRODUCER_SET_APP_FRAMEWORK_TYPE, arguments, reply, option);
874 return CheckRetval(reply);
875 }
876
GetSurfaceAppFrameworkType(std::string & appFrameworkType)877 GSError BufferClientProducer::GetSurfaceAppFrameworkType(std::string &appFrameworkType)
878 {
879 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
880 SEND_REQUEST(BUFFER_PRODUCER_GET_APP_FRAMEWORK_TYPE, arguments, reply, option);
881 GSError ret = CheckRetval(reply);
882 if (ret != GSERROR_OK) {
883 return ret;
884 }
885 appFrameworkType = static_cast<std::string>(reply.ReadString());
886 return GSERROR_OK;
887 }
888
SetHdrWhitePointBrightness(float brightness)889 GSError BufferClientProducer::SetHdrWhitePointBrightness(float brightness)
890 {
891 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
892
893 if (!arguments.WriteFloat(brightness)) {
894 return GSERROR_BINDER;
895 }
896
897 SEND_REQUEST(BUFFER_PRODUCER_SET_HDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
898 return CheckRetval(reply);
899 }
900
SetSdrWhitePointBrightness(float brightness)901 GSError BufferClientProducer::SetSdrWhitePointBrightness(float brightness)
902 {
903 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
904
905 if (!arguments.WriteFloat(brightness)) {
906 return GSERROR_BINDER;
907 }
908
909 SEND_REQUEST(BUFFER_PRODUCER_SET_SDRWHITEPOINTBRIGHTNESS, arguments, reply, option);
910 return CheckRetval(reply);
911 }
912
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)913 GSError BufferClientProducer::AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
914 float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
915 {
916 return GetLastFlushedBufferCommon(buffer, fence,
917 matrix, matrixSize, isUseNewMatrix, BUFFER_PRODUCER_ACQUIRE_LAST_FLUSHED_BUFFER);
918 }
919
ReleaseLastFlushedBuffer(uint32_t sequence)920 GSError BufferClientProducer::ReleaseLastFlushedBuffer(uint32_t sequence)
921 {
922 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
923 if (!arguments.WriteUint32(sequence)) {
924 return GSERROR_BINDER;
925 }
926 SEND_REQUEST(BUFFER_PRODUCER_RELEASE_LAST_FLUSHED_BUFFER, arguments, reply, option);
927 return CheckRetval(reply);
928 }
929
SetGlobalAlpha(int32_t alpha)930 GSError BufferClientProducer::SetGlobalAlpha(int32_t alpha)
931 {
932 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
933 if (!arguments.WriteInt32(alpha)) {
934 return GSERROR_BINDER;
935 }
936 SEND_REQUEST(BUFFER_PRODUCER_SET_GLOBALALPHA, arguments, reply, option);
937 return CheckRetval(reply);
938 }
939
SetRequestBufferNoblockMode(bool noblock)940 GSError BufferClientProducer::SetRequestBufferNoblockMode(bool noblock)
941 {
942 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
943 if (!arguments.WriteBool(noblock)) {
944 return GSERROR_BINDER;
945 }
946 SEND_REQUEST(BUFFER_PRODUCER_SET_REQUESTBUFFER_NOBLOCKMODE, arguments, reply, option);
947 return CheckRetval(reply);
948 }
949
RequestAndDetachBuffer(const BufferRequestConfig & config,sptr<BufferExtraData> & bedata,RequestBufferReturnValue & retval)950 GSError BufferClientProducer::RequestAndDetachBuffer(const BufferRequestConfig& config,
951 sptr<BufferExtraData>& bedata, RequestBufferReturnValue& retval)
952 {
953 return RequestBufferCommon(config, bedata, retval, BUFFER_PRODUCER_REQUEST_AND_DETACH_BUFFER);
954 }
955
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,sptr<BufferExtraData> & bedata,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config,bool needMap)956 GSError BufferClientProducer::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, sptr<BufferExtraData>& bedata,
957 const sptr<SyncFence>& fence, BufferFlushConfigWithDamages& config, bool needMap)
958 {
959 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
960 GSError ret = WriteSurfaceBufferImpl(arguments, buffer->GetSeqNum(), buffer);
961 if (ret != GSERROR_OK) {
962 return ret;
963 }
964 ret = buffer->WriteBufferRequestConfig(arguments);
965 if (ret != GSERROR_OK) {
966 BLOGE("WriteBufferRequestConfig ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, uniqueId_);
967 return ret;
968 }
969
970 ret = bedata->WriteToParcel(arguments);
971 if (ret != GSERROR_OK) {
972 return ret;
973 }
974 if (!fence->WriteToMessageParcel(arguments)) {
975 return GSERROR_BINDER;
976 }
977 ret = WriteFlushConfig(arguments, config);
978 if (ret != GSERROR_OK) {
979 return ret;
980 }
981 if (!arguments.WriteBool(needMap)) {
982 return GSERROR_BINDER;
983 }
984 SEND_REQUEST(BUFFER_PRODUCER_ATTACH_AND_FLUSH_BUFFER, arguments, reply, option);
985 return CheckRetval(reply);
986 }
987
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)988 GSError BufferClientProducer::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
989 {
990 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
991 SEND_REQUEST(BUFFER_PRODUCER_GET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
992 GSError ret = CheckRetval(reply);
993 if (ret != GSERROR_OK) {
994 return ret;
995 }
996 cycleBuffersNumber = reply.ReadUint32();
997 return GSERROR_OK;
998 }
999
SetCycleBuffersNumber(uint32_t cycleBuffersNumber)1000 GSError BufferClientProducer::SetCycleBuffersNumber(uint32_t cycleBuffersNumber)
1001 {
1002 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1003 if (!arguments.WriteUint32(cycleBuffersNumber)) {
1004 return GSERROR_BINDER;
1005 }
1006 SEND_REQUEST(BUFFER_PRODUCER_SET_ROTATING_BUFFERS_NUMBER, arguments, reply, option);
1007 return CheckRetval(reply);
1008 }
1009
SetFrameGravity(int32_t frameGravity)1010 GSError BufferClientProducer::SetFrameGravity(int32_t frameGravity)
1011 {
1012 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1013 if (!arguments.WriteInt32(frameGravity)) {
1014 return GSERROR_BINDER;
1015 }
1016 SEND_REQUEST(BUFFER_PRODUCER_SET_FRAME_GRAVITY, arguments, reply, option);
1017 return CheckRetval(reply);
1018 }
1019
SetFixedRotation(int32_t fixedRotation)1020 GSError BufferClientProducer::SetFixedRotation(int32_t fixedRotation)
1021 {
1022 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1023 if (!arguments.WriteInt32(fixedRotation)) {
1024 return GSERROR_BINDER;
1025 }
1026 SEND_REQUEST(BUFFER_PRODUCER_SET_FIXED_ROTATION, arguments, reply, option);
1027 return CheckRetval(reply);
1028 }
1029
PreAllocBuffers(const BufferRequestConfig & config,uint32_t allocBufferCount)1030 GSError BufferClientProducer::PreAllocBuffers(const BufferRequestConfig &config, uint32_t allocBufferCount)
1031 {
1032 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1033 GSError ret = WriteRequestConfig(arguments, config);
1034 if (ret != GSERROR_OK) {
1035 return ret;
1036 }
1037 if (!arguments.WriteUint32(allocBufferCount)) {
1038 return GSERROR_BINDER;
1039 }
1040 option.SetFlags(MessageOption::TF_ASYNC);
1041 SEND_REQUEST(BUFFER_PRODUCER_PRE_ALLOC_BUFFERS, arguments, reply, option);
1042 return GSERROR_OK;
1043 }
1044
SetLppShareFd(int fd,bool state)1045 GSError BufferClientProducer::SetLppShareFd(int fd, bool state)
1046 {
1047 if (fd < 0) {
1048 return GSERROR_INVALID_ARGUMENTS;
1049 }
1050 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1051 if (!arguments.WriteFileDescriptor(fd) || !arguments.WriteBool(state)) {
1052 return GSERROR_BINDER;
1053 }
1054 SEND_REQUEST(BUFFER_PRODUCER_SET_LPP_FD, arguments, reply, option);
1055 return CheckRetval(reply);
1056 }
1057
SetAlphaType(GraphicAlphaType alphaType)1058 GSError BufferClientProducer::SetAlphaType(GraphicAlphaType alphaType)
1059 {
1060 DEFINE_MESSAGE_VARIABLES(arguments, reply, option);
1061 if (!arguments.WriteInt32(alphaType)) {
1062 return GSERROR_BINDER;
1063 }
1064 SEND_REQUEST(BUFFER_PRODUCER_SET_ALPHA_TYPE, arguments, reply, option);
1065 return CheckRetval(reply);
1066 }
1067 }; // namespace OHOS
1068