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 "consumer_surface.h"
17
18 #include <cinttypes>
19
20 #include "buffer_log.h"
21 #include "buffer_queue_producer.h"
22 #include "sync_fence.h"
23
24 namespace OHOS {
CreateSurfaceAsConsumer(std::string name)25 sptr<Surface> Surface::CreateSurfaceAsConsumer(std::string name)
26 {
27 sptr<ConsumerSurface> surf = new ConsumerSurface(name);
28 if (surf->Init() != GSERROR_OK) {
29 BLOGE("consumer surf init failed");
30 return nullptr;
31 }
32 return surf;
33 }
34
Create(std::string name)35 sptr<IConsumerSurface> IConsumerSurface::Create(std::string name)
36 {
37 sptr<ConsumerSurface> surf = new ConsumerSurface(name);
38 if (surf->Init() != GSERROR_OK) {
39 BLOGE("consumer surf init failed");
40 return nullptr;
41 }
42 return surf;
43 }
44
ConsumerSurface(const std::string & name)45 ConsumerSurface::ConsumerSurface(const std::string& name)
46 : name_(name)
47 {
48 consumer_ = nullptr;
49 producer_ = nullptr;
50 }
51
~ConsumerSurface()52 ConsumerSurface::~ConsumerSurface()
53 {
54 if (consumer_ != nullptr) {
55 consumer_->OnConsumerDied();
56 consumer_->SetStatus(false);
57 }
58 if (producer_ != nullptr) {
59 BLOGI("~ConsumerSurface, producer_ sptrCnt: %{public}d, uniqueId: %{public}" PRIu64 ".",
60 producer_->GetSptrRefCount(), uniqueId_);
61 }
62 consumer_ = nullptr;
63 producer_ = nullptr;
64 }
65
Init()66 GSError ConsumerSurface::Init()
67 {
68 sptr<BufferQueue> queue_ = new BufferQueue(name_);
69 producer_ = new BufferQueueProducer(queue_);
70 consumer_ = new BufferQueueConsumer(queue_);
71 uniqueId_ = GetUniqueId();
72 BLOGD("ConsumerSurface Init, uniqueId: %{public}" PRIu64 ".", uniqueId_);
73 return GSERROR_OK;
74 }
75
IsConsumer() const76 bool ConsumerSurface::IsConsumer() const
77 {
78 return true;
79 }
80
GetProducer() const81 sptr<IBufferProducer> ConsumerSurface::GetProducer() const
82 {
83 return producer_;
84 }
85
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)86 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
87 int64_t& timestamp, Rect& damage)
88 {
89 std::vector<Rect> damages;
90 GSError ret = AcquireBuffer(buffer, fence, timestamp, damages);
91 if (ret != GSERROR_OK) {
92 return ret;
93 }
94 if (damages.size() == 1) {
95 damage = damages[0];
96 return GSERROR_OK;
97 }
98 BLOGE("damages is %{public}zu, uniqueId: %{public}" PRIu64 ".", damages.size(), uniqueId_);
99 return GSERROR_INVALID_ARGUMENTS;
100 }
101
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,std::vector<Rect> & damages,bool isLppMode)102 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
103 int64_t& timestamp, std::vector<Rect>& damages, bool isLppMode)
104 {
105 if (consumer_ == nullptr) {
106 return GSERROR_INVALID_ARGUMENTS;
107 }
108 return consumer_->AcquireBuffer(buffer, fence, timestamp, damages, isLppMode);
109 }
110
AcquireBuffer(AcquireBufferReturnValue & returnValue,int64_t expectPresentTimestamp,bool isUsingAutoTimestamp)111 GSError ConsumerSurface::AcquireBuffer(AcquireBufferReturnValue &returnValue, int64_t expectPresentTimestamp,
112 bool isUsingAutoTimestamp)
113 {
114 if (consumer_ == nullptr) {
115 return GSERROR_INVALID_ARGUMENTS;
116 }
117 return consumer_->AcquireBuffer(returnValue, expectPresentTimestamp, isUsingAutoTimestamp);
118 }
119
AcquireBuffer(AcquireBufferReturnValue & returnValue)120 GSError ConsumerSurface::AcquireBuffer(AcquireBufferReturnValue &returnValue)
121 {
122 if (consumer_ == nullptr) {
123 return SURFACE_ERROR_UNKOWN;
124 }
125 return consumer_->AcquireBuffer(returnValue);
126 }
127
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)128 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
129 {
130 if (buffer == nullptr || consumer_ == nullptr) {
131 return GSERROR_INVALID_ARGUMENTS;
132 }
133 return consumer_->ReleaseBuffer(buffer, fence);
134 }
135
ReleaseBuffer(uint32_t sequence,const sptr<SyncFence> & fence)136 GSError ConsumerSurface::ReleaseBuffer(uint32_t sequence, const sptr<SyncFence>& fence)
137 {
138 if (sequence == 0 || consumer_ == nullptr) {
139 return GSERROR_INVALID_ARGUMENTS;
140 }
141 return consumer_->ReleaseBuffer(sequence, fence);
142 }
143
SetIsActiveGame(bool isTransactonActiveGame)144 GSError ConsumerSurface::SetIsActiveGame(bool isTransactonActiveGame)
145 {
146 if (consumer_ == nullptr) {
147 return SURFACE_ERROR_UNKOWN;
148 }
149 return consumer_->SetIsActiveGame(isTransactonActiveGame);
150 }
151
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)152 GSError ConsumerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t& fence,
153 int64_t& timestamp, Rect& damage)
154 {
155 sptr<SyncFence> syncFence = SyncFence::InvalidFence();
156 auto ret = AcquireBuffer(buffer, syncFence, timestamp, damage);
157 if (ret != GSERROR_OK) {
158 fence = -1;
159 return ret;
160 }
161 fence = syncFence->Dup();
162 return GSERROR_OK;
163 }
164
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)165 GSError ConsumerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
166 {
167 sptr<SyncFence> syncFence = new SyncFence(fence);
168 return ReleaseBuffer(buffer, syncFence);
169 }
170
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)171 GSError ConsumerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
172 {
173 if (buffer == nullptr || consumer_ == nullptr) {
174 return GSERROR_INVALID_ARGUMENTS;
175 }
176 buffer->SetConsumerAttachBufferFlag(true);
177 return consumer_->AttachBufferToQueue(buffer);
178 }
179
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer,bool isReserveSlot)180 GSError ConsumerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer, bool isReserveSlot)
181 {
182 if (buffer == nullptr || consumer_ == nullptr) {
183 return GSERROR_INVALID_ARGUMENTS;
184 }
185 buffer->SetConsumerAttachBufferFlag(false);
186 return consumer_->DetachBufferFromQueue(buffer, isReserveSlot);
187 }
188
AttachBuffer(sptr<SurfaceBuffer> & buffer)189 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
190 {
191 if (buffer == nullptr || consumer_ == nullptr) {
192 return GSERROR_INVALID_ARGUMENTS;
193 }
194 return consumer_->AttachBuffer(buffer);
195 }
196
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)197 GSError ConsumerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
198 {
199 if (buffer == nullptr || consumer_ == nullptr) {
200 return GSERROR_INVALID_ARGUMENTS;
201 }
202 return consumer_->AttachBuffer(buffer, timeOut);
203 }
204
DetachBuffer(sptr<SurfaceBuffer> & buffer)205 GSError ConsumerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
206 {
207 if (buffer == nullptr || consumer_ == nullptr) {
208 return GSERROR_INVALID_ARGUMENTS;
209 }
210 return consumer_->DetachBuffer(buffer);
211 }
212
RegisterSurfaceDelegator(sptr<IRemoteObject> client)213 GSError ConsumerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
214 {
215 if (client == nullptr || consumer_ == nullptr) {
216 return GSERROR_INVALID_ARGUMENTS;
217 }
218 return consumer_->RegisterSurfaceDelegator(client, this);
219 }
220
QueryIfBufferAvailable()221 bool ConsumerSurface::QueryIfBufferAvailable()
222 {
223 if (consumer_ == nullptr) {
224 return false;
225 }
226 return consumer_->QueryIfBufferAvailable();
227 }
228
GetQueueSize()229 uint32_t ConsumerSurface::GetQueueSize()
230 {
231 if (producer_ == nullptr) {
232 return 0;
233 }
234 return producer_->GetQueueSize();
235 }
236
SetQueueSize(uint32_t queueSize)237 GSError ConsumerSurface::SetQueueSize(uint32_t queueSize)
238 {
239 if (producer_ == nullptr) {
240 return GSERROR_INVALID_ARGUMENTS;
241 }
242 return producer_->SetQueueSize(queueSize);
243 }
244
GetName()245 const std::string& ConsumerSurface::GetName()
246 {
247 return name_;
248 }
249
SetDefaultWidthAndHeight(int32_t width,int32_t height)250 GSError ConsumerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
251 {
252 if (consumer_ == nullptr) {
253 return GSERROR_INVALID_ARGUMENTS;
254 }
255 return consumer_->SetDefaultWidthAndHeight(width, height);
256 }
257
GetDefaultWidth()258 int32_t ConsumerSurface::GetDefaultWidth()
259 {
260 if (producer_ == nullptr) {
261 return -1;
262 }
263 return producer_->GetDefaultWidth();
264 }
265
GetDefaultHeight()266 int32_t ConsumerSurface::GetDefaultHeight()
267 {
268 if (producer_ == nullptr) {
269 return -1;
270 }
271 return producer_->GetDefaultHeight();
272 }
273
SetDefaultUsage(uint64_t usage)274 GSError ConsumerSurface::SetDefaultUsage(uint64_t usage)
275 {
276 if (consumer_ == nullptr) {
277 return GSERROR_INVALID_ARGUMENTS;
278 }
279 return consumer_->SetDefaultUsage(usage);
280 }
281
GetDefaultUsage()282 uint64_t ConsumerSurface::GetDefaultUsage()
283 {
284 if (producer_ == nullptr) {
285 return 0;
286 }
287 return producer_->GetDefaultUsage();
288 }
289
SetUserData(const std::string & key,const std::string & val)290 GSError ConsumerSurface::SetUserData(const std::string& key, const std::string& val)
291 {
292 std::lock_guard<std::mutex> lockGuard(lockMutex_);
293 if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
294 BLOGE("userData_ size(%{public}zu) out, uniqueId: %{public}" PRIu64 ".", userData_.size(), uniqueId_);
295 return GSERROR_OUT_OF_RANGE;
296 }
297
298 auto iterUserData = userData_.find(key);
299 if (iterUserData != userData_.end() && iterUserData->second == val) {
300 BLOGE("not find key:%{public}s, val:%{public}s exist, uniqueId: %{public}" PRIu64 ".",
301 key.c_str(), val.c_str(), uniqueId_);
302 return GSERROR_API_FAILED;
303 }
304
305 userData_[key] = val;
306 auto iter = onUserDataChange_.begin();
307 while (iter != onUserDataChange_.end()) {
308 if (iter->second != nullptr) {
309 iter->second(key, val);
310 }
311 iter++;
312 }
313
314 return GSERROR_OK;
315 }
316
GetUserData(const std::string & key)317 std::string ConsumerSurface::GetUserData(const std::string& key)
318 {
319 std::lock_guard<std::mutex> lockGuard(lockMutex_);
320 if (userData_.find(key) != userData_.end()) {
321 return userData_[key];
322 }
323
324 return "";
325 }
326
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)327 GSError ConsumerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
328 {
329 if (listener == nullptr || consumer_ == nullptr) {
330 return GSERROR_INVALID_ARGUMENTS;
331 }
332 return consumer_->RegisterConsumerListener(listener);
333 }
334
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)335 GSError ConsumerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
336 {
337 if (listener == nullptr || consumer_ == nullptr) {
338 return GSERROR_INVALID_ARGUMENTS;
339 }
340 return consumer_->RegisterConsumerListener(listener);
341 }
342
RegisterReleaseListener(OnReleaseFunc func)343 GSError ConsumerSurface::RegisterReleaseListener(OnReleaseFunc func)
344 {
345 if (func == nullptr || consumer_ == nullptr) {
346 return GSERROR_INVALID_ARGUMENTS;
347 }
348 return consumer_->RegisterReleaseListener(func);
349 }
350
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)351 GSError ConsumerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
352 {
353 if (func == nullptr || consumer_ == nullptr) {
354 return GSERROR_INVALID_ARGUMENTS;
355 }
356 if (isForUniRedraw) {
357 bool hasRegistercallBackForRedraw = false;
358 if (!hasRegistercallBackForRedraw_.compare_exchange_strong(hasRegistercallBackForRedraw, true)) {
359 return GSERROR_OK;
360 }
361 } else {
362 bool hasRegistercallBackForRT = false;
363 if (!hasRegistercallBackForRT_.compare_exchange_strong(hasRegistercallBackForRT, true)) {
364 return GSERROR_OK;
365 }
366 }
367 return consumer_->RegisterDeleteBufferListener(func, isForUniRedraw);
368 }
369
UnregisterConsumerListener()370 GSError ConsumerSurface::UnregisterConsumerListener()
371 {
372 if (consumer_ == nullptr) {
373 return GSERROR_INVALID_ARGUMENTS;
374 }
375 return consumer_->UnregisterConsumerListener();
376 }
377
RegisterUserDataChangeListener(const std::string & funcName,OnUserDataChangeFunc func)378 GSError ConsumerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
379 {
380 if (func == nullptr) {
381 return GSERROR_INVALID_ARGUMENTS;
382 }
383 std::lock_guard<std::mutex> lockGuard(lockMutex_);
384 if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
385 BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
386 funcName.c_str(), uniqueId_);
387 return GSERROR_INVALID_ARGUMENTS;
388 }
389
390 onUserDataChange_[funcName] = func;
391 return GSERROR_OK;
392 }
393
UnRegisterUserDataChangeListener(const std::string & funcName)394 GSError ConsumerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
395 {
396 std::lock_guard<std::mutex> lockGuard(lockMutex_);
397 if (onUserDataChange_.erase(funcName) == 0) {
398 BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".",
399 funcName.c_str(), uniqueId_);
400 return GSERROR_INVALID_ARGUMENTS;
401 }
402
403 return GSERROR_OK;
404 }
405
ClearUserDataChangeListener()406 GSError ConsumerSurface::ClearUserDataChangeListener()
407 {
408 std::lock_guard<std::mutex> lockGuard(lockMutex_);
409 onUserDataChange_.clear();
410 return GSERROR_OK;
411 }
412
GoBackground()413 GSError ConsumerSurface::GoBackground()
414 {
415 if (consumer_ == nullptr) {
416 return GSERROR_INVALID_ARGUMENTS;
417 }
418 if (producer_ != nullptr) {
419 BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", uniqueId_);
420 }
421 return consumer_->GoBackground();
422 }
423
GetUniqueId() const424 uint64_t ConsumerSurface::GetUniqueId() const
425 {
426 if (producer_ == nullptr) {
427 return 0;
428 }
429 return producer_->GetUniqueId();
430 }
431
Dump(std::string & result) const432 void ConsumerSurface::Dump(std::string& result) const
433 {
434 if (consumer_ == nullptr) {
435 return;
436 }
437 return consumer_->Dump(result);
438 }
439
DumpCurrentFrameLayer() const440 void ConsumerSurface::DumpCurrentFrameLayer() const
441 {
442 if (consumer_ == nullptr) {
443 return;
444 }
445 return consumer_->DumpCurrentFrameLayer();
446 }
447
SetTransform(GraphicTransformType transform)448 GSError ConsumerSurface::SetTransform(GraphicTransformType transform)
449 {
450 if (producer_ == nullptr) {
451 return GSERROR_INVALID_ARGUMENTS;
452 }
453 return producer_->SetTransform(transform);
454 }
455
GetTransform() const456 GraphicTransformType ConsumerSurface::GetTransform() const
457 {
458 if (consumer_ == nullptr) {
459 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
460 }
461 return consumer_->GetTransform();
462 }
463
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)464 GSError ConsumerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
465 {
466 if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
467 scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
468 return GSERROR_INVALID_ARGUMENTS;
469 }
470 return producer_->SetScalingMode(sequence, scalingMode);
471 }
472
SetScalingMode(ScalingMode scalingMode)473 GSError ConsumerSurface::SetScalingMode(ScalingMode scalingMode)
474 {
475 if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
476 scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
477 return GSERROR_INVALID_ARGUMENTS;
478 }
479 return producer_->SetScalingMode(scalingMode);
480 }
481
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)482 GSError ConsumerSurface::GetScalingMode(uint32_t sequence, ScalingMode& scalingMode)
483 {
484 if (consumer_ == nullptr) {
485 return GSERROR_INVALID_ARGUMENTS;
486 }
487 return consumer_->GetScalingMode(sequence, scalingMode);
488 }
489
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)490 GSError ConsumerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
491 {
492 if (producer_ == nullptr || metaData.size() == 0) {
493 return GSERROR_INVALID_ARGUMENTS;
494 }
495 return producer_->SetMetaData(sequence, metaData);
496 }
497
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)498 GSError ConsumerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
499 const std::vector<uint8_t>& metaData)
500 {
501 if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
502 key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
503 return GSERROR_INVALID_ARGUMENTS;
504 }
505 return producer_->SetMetaDataSet(sequence, key, metaData);
506 }
507
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const508 GSError ConsumerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType& type) const
509 {
510 if (consumer_ == nullptr) {
511 return GSERROR_INVALID_ARGUMENTS;
512 }
513 return consumer_->QueryMetaDataType(sequence, type);
514 }
515
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const516 GSError ConsumerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData>& metaData) const
517 {
518 if (consumer_ == nullptr) {
519 return GSERROR_INVALID_ARGUMENTS;
520 }
521 return consumer_->GetMetaData(sequence, metaData);
522 }
523
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const524 GSError ConsumerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey& key,
525 std::vector<uint8_t>& metaData) const
526 {
527 if (consumer_ == nullptr) {
528 return GSERROR_INVALID_ARGUMENTS;
529 }
530 return consumer_->GetMetaDataSet(sequence, key, metaData);
531 }
532
SetTunnelHandle(const GraphicExtDataHandle * handle)533 GSError ConsumerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
534 {
535 if (producer_ == nullptr || handle == nullptr || handle->reserveInts == 0) {
536 return GSERROR_INVALID_ARGUMENTS;
537 }
538 return producer_->SetTunnelHandle(handle);
539 }
540
GetTunnelHandle() const541 sptr<SurfaceTunnelHandle> ConsumerSurface::GetTunnelHandle() const
542 {
543 if (consumer_ == nullptr) {
544 return nullptr;
545 }
546 return consumer_->GetTunnelHandle();
547 }
548
SetBufferHold(bool hold)549 void ConsumerSurface::SetBufferHold(bool hold)
550 {
551 if (consumer_ == nullptr) {
552 return;
553 }
554 consumer_->SetBufferHold(hold);
555 }
556
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)557 GSError ConsumerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp& timestamp)
558 {
559 if (consumer_ == nullptr || timestamp.type == GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED) {
560 return GSERROR_INVALID_ARGUMENTS;
561 }
562 return consumer_->SetPresentTimestamp(sequence, timestamp);
563 }
564
ConsumerRequestCpuAccess(bool on)565 void ConsumerSurface::ConsumerRequestCpuAccess(bool on)
566 {
567 if (consumer_ == nullptr) {
568 return;
569 }
570 consumer_->ConsumerRequestCpuAccess(on);
571 }
572
GetTransformHint() const573 GraphicTransformType ConsumerSurface::GetTransformHint() const
574 {
575 if (producer_ == nullptr) {
576 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
577 }
578 GraphicTransformType transformHint = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
579 if (producer_->GetTransformHint(transformHint) != GSERROR_OK) {
580 BLOGE("GetTransformHint failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
581 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
582 }
583 return transformHint;
584 }
585
SetTransformHint(GraphicTransformType transformHint)586 GSError ConsumerSurface::SetTransformHint(GraphicTransformType transformHint)
587 {
588 if (producer_ == nullptr) {
589 return GSERROR_INVALID_ARGUMENTS;
590 }
591 return producer_->SetTransformHint(transformHint, 0); // broadcast to all producerSurfaces
592 }
593
SetSurfaceSourceType(OHSurfaceSource sourceType)594 GSError ConsumerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
595 {
596 if (producer_ == nullptr) {
597 return GSERROR_INVALID_ARGUMENTS;
598 }
599 return producer_->SetSurfaceSourceType(sourceType);
600 }
601
GetSurfaceSourceType() const602 OHSurfaceSource ConsumerSurface::GetSurfaceSourceType() const
603 {
604 if (producer_ == nullptr) {
605 return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
606 }
607 OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
608 if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
609 BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
610 return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
611 }
612 return sourceType;
613 }
614
SetSurfaceAppFrameworkType(std::string appFrameworkType)615 GSError ConsumerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
616 {
617 if (producer_ == nullptr) {
618 return GSERROR_INVALID_ARGUMENTS;
619 }
620 return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
621 }
622
GetSurfaceAppFrameworkType() const623 std::string ConsumerSurface::GetSurfaceAppFrameworkType() const
624 {
625 if (producer_ == nullptr) {
626 return "";
627 }
628 std::string appFrameworkType = "";
629 if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
630 BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", uniqueId_);
631 return "";
632 }
633 return appFrameworkType;
634 }
635
GetHdrWhitePointBrightness() const636 float ConsumerSurface::GetHdrWhitePointBrightness() const
637 {
638 if (consumer_ == nullptr) {
639 return 0;
640 }
641 return consumer_->GetHdrWhitePointBrightness();
642 }
643
GetSdrWhitePointBrightness() const644 float ConsumerSurface::GetSdrWhitePointBrightness() const
645 {
646 if (consumer_ == nullptr) {
647 return 0;
648 }
649 return consumer_->GetSdrWhitePointBrightness();
650 }
651
GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,GraphicTransformType * transformType)652 GSError ConsumerSurface::GetSurfaceBufferTransformType(sptr<SurfaceBuffer> buffer,
653 GraphicTransformType *transformType)
654 {
655 if (buffer == nullptr || transformType == nullptr) {
656 return SURFACE_ERROR_INVALID_PARAM;
657 }
658 *transformType = buffer->GetSurfaceBufferTransform();
659 return GSERROR_OK;
660 }
661
IsSurfaceBufferInCache(uint32_t seqNum,bool & isInCache)662 GSError ConsumerSurface::IsSurfaceBufferInCache(uint32_t seqNum, bool& isInCache)
663 {
664 if (consumer_ == nullptr) {
665 return SURFACE_ERROR_UNKOWN;
666 }
667 return consumer_->IsSurfaceBufferInCache(seqNum, isInCache);
668 }
669
GetGlobalAlpha(int32_t & alpha)670 GSError ConsumerSurface::GetGlobalAlpha(int32_t &alpha)
671 {
672 if (consumer_ == nullptr) {
673 return SURFACE_ERROR_UNKOWN;
674 }
675 return consumer_->GetGlobalAlpha(alpha);
676 }
677
GetAvailableBufferCount() const678 uint32_t ConsumerSurface::GetAvailableBufferCount() const
679 {
680 if (consumer_ == nullptr) {
681 return 0;
682 }
683 return consumer_->GetAvailableBufferCount();
684 }
685
GetLastFlushedDesiredPresentTimeStamp(int64_t & lastFlushedDesiredPresentTimeStamp) const686 GSError ConsumerSurface::GetLastFlushedDesiredPresentTimeStamp(int64_t &lastFlushedDesiredPresentTimeStamp) const
687 {
688 if (consumer_ == nullptr) {
689 return SURFACE_ERROR_UNKOWN;
690 }
691 return consumer_->GetLastFlushedDesiredPresentTimeStamp(lastFlushedDesiredPresentTimeStamp);
692 }
693
GetFrontDesiredPresentTimeStamp(int64_t & desiredPresentTimeStamp,bool & isAutoTimeStamp) const694 GSError ConsumerSurface::GetFrontDesiredPresentTimeStamp(int64_t &desiredPresentTimeStamp, bool &isAutoTimeStamp) const
695 {
696 if (consumer_ == nullptr) {
697 return SURFACE_ERROR_UNKOWN;
698 }
699 return consumer_->GetFrontDesiredPresentTimeStamp(desiredPresentTimeStamp, isAutoTimeStamp);
700 }
701
GetBufferSupportFastCompose(bool & bufferSupportFastCompose)702 GSError ConsumerSurface::GetBufferSupportFastCompose(bool &bufferSupportFastCompose)
703 {
704 if (consumer_ == nullptr) {
705 return SURFACE_ERROR_UNKOWN;
706 }
707 if (isFirstBuffer_.load()) {
708 GSError ret = consumer_->GetBufferSupportFastCompose(bufferSupportFastCompose);
709 if (ret == GSERROR_OK) {
710 supportFastCompose_.store(bufferSupportFastCompose);
711 isFirstBuffer_.store(false);
712 }
713 return ret;
714 } else {
715 bufferSupportFastCompose = supportFastCompose_.load();
716 return GSERROR_OK;
717 }
718 }
719
GetBufferCacheConfig(const sptr<SurfaceBuffer> & buffer,BufferRequestConfig & config)720 GSError ConsumerSurface::GetBufferCacheConfig(const sptr<SurfaceBuffer>& buffer, BufferRequestConfig& config)
721 {
722 if (buffer == nullptr) {
723 return GSERROR_INVALID_ARGUMENTS;
724 }
725 if (consumer_ == nullptr) {
726 return SURFACE_ERROR_UNKOWN;
727 }
728 return consumer_->GetBufferCacheConfig(buffer, config);
729 }
730
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)731 GSError ConsumerSurface::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
732 {
733 if (consumer_ == nullptr) {
734 return SURFACE_ERROR_UNKOWN;
735 }
736 return consumer_->GetCycleBuffersNumber(cycleBuffersNumber);
737 }
738
GetFrameGravity(int32_t & frameGravity)739 GSError ConsumerSurface::GetFrameGravity(int32_t &frameGravity)
740 {
741 if (consumer_ == nullptr) {
742 return SURFACE_ERROR_UNKOWN;
743 }
744 return consumer_->GetFrameGravity(frameGravity);
745 }
746
GetFixedRotation(int32_t & fixedRotation)747 GSError ConsumerSurface::GetFixedRotation(int32_t &fixedRotation)
748 {
749 if (consumer_ == nullptr) {
750 return SURFACE_ERROR_UNKOWN;
751 }
752 return consumer_->GetFixedRotation(fixedRotation);
753 }
754
GetLastConsumeTime(int64_t & lastConsumeTime) const755 GSError ConsumerSurface::GetLastConsumeTime(int64_t &lastConsumeTime) const
756 {
757 if (consumer_ == nullptr) {
758 return SURFACE_ERROR_UNKOWN;
759 }
760 return consumer_->GetLastConsumeTime(lastConsumeTime);
761 }
762
SetMaxQueueSize(uint32_t queueSize)763 GSError ConsumerSurface::SetMaxQueueSize(uint32_t queueSize)
764 {
765 if (consumer_ == nullptr) {
766 return SURFACE_ERROR_UNKOWN;
767 }
768 return consumer_->SetMaxQueueSize(queueSize);
769 }
GetMaxQueueSize(uint32_t & queueSize) const770 GSError ConsumerSurface::GetMaxQueueSize(uint32_t &queueSize) const
771 {
772 if (consumer_ == nullptr) {
773 return SURFACE_ERROR_UNKOWN;
774 }
775 return consumer_->GetMaxQueueSize(queueSize);
776 }
SetLppDrawSource(bool isShbSource,bool isRsSource)777 GSError ConsumerSurface::SetLppDrawSource(bool isShbSource, bool isRsSource)
778 {
779 if (consumer_ == nullptr) {
780 return SURFACE_ERROR_UNKOWN;
781 }
782 return consumer_->SetLppDrawSource(isShbSource, isRsSource);
783 }
784
GetAlphaType(GraphicAlphaType & alphaType)785 GSError ConsumerSurface::GetAlphaType(GraphicAlphaType &alphaType)
786 {
787 if (consumer_ == nullptr) {
788 return SURFACE_ERROR_UNKOWN;
789 }
790 return consumer_->GetAlphaType(alphaType);
791 }
792
SetIsPriorityAlloc(bool isPriorityAlloc)793 GSError ConsumerSurface::SetIsPriorityAlloc(bool isPriorityAlloc)
794 {
795 if (consumer_ == nullptr) {
796 return SURFACE_ERROR_UNKOWN;
797 }
798 return consumer_->SetIsPriorityAlloc(isPriorityAlloc);
799 }
800 } // namespace OHOS
801