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 "producer_surface.h"
17
18 #include <cinttypes>
19
20 #include "buffer_log.h"
21 #include "buffer_extra_data_impl.h"
22 #include "buffer_producer_listener.h"
23 #include "sync_fence.h"
24 #include "native_window.h"
25 #include "surface_utils.h"
26 #include "metadata_helper.h"
27
28 using namespace OHOS::HDI::Display::Graphic::Common::V1_0;
29 namespace OHOS {
30
CreateSurfaceAsProducer(sptr<IBufferProducer> & producer)31 sptr<Surface> Surface::CreateSurfaceAsProducer(sptr<IBufferProducer>& producer)
32 {
33 if (producer == nullptr) {
34 return nullptr;
35 }
36
37 sptr<ProducerSurface> surf = new ProducerSurface(producer);
38 GSError ret = surf->Init();
39 if (ret != GSERROR_OK) {
40 BLOGE("producer surf init failed");
41 return nullptr;
42 }
43 auto utils = SurfaceUtils::GetInstance();
44 utils->Add(surf->GetUniqueId(), surf);
45 return surf;
46 }
47
ProducerSurface(sptr<IBufferProducer> & producer)48 ProducerSurface::ProducerSurface(sptr<IBufferProducer>& producer)
49 {
50 producer_ = producer;
51 GetProducerInitInfo(initInfo_);
52 windowConfig_.width = initInfo_.width;
53 windowConfig_.height = initInfo_.height;
54 windowConfig_.usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_DMA;
55 windowConfig_.format = GRAPHIC_PIXEL_FMT_RGBA_8888;
56 windowConfig_.strideAlignment = 8; // default stride is 8
57 windowConfig_.timeout = 3000; // default timeout is 3000 ms
58 windowConfig_.colorGamut = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
59 windowConfig_.transform = GraphicTransformType::GRAPHIC_ROTATE_NONE;
60 BLOGD("ProducerSurface ctor");
61 }
62
~ProducerSurface()63 ProducerSurface::~ProducerSurface()
64 {
65 BLOGD("~ProducerSurface dtor, name: %{public}s, uniqueId: %{public}" PRIu64 ".", name_.c_str(), queueId_);
66 Disconnect();
67 auto utils = SurfaceUtils::GetInstance();
68 utils->Remove(GetUniqueId());
69 }
70
GetProducerInitInfo(ProducerInitInfo & info)71 GSError ProducerSurface::GetProducerInitInfo(ProducerInitInfo& info)
72 {
73 if (producer_ == nullptr) {
74 return GSERROR_INVALID_ARGUMENTS;
75 }
76 return producer_->GetProducerInitInfo(info);
77 }
78
Init()79 GSError ProducerSurface::Init()
80 {
81 if (inited_.load()) {
82 return GSERROR_OK;
83 }
84 name_ = initInfo_.name;
85 queueId_ = initInfo_.uniqueId;
86 inited_.store(true);
87 BLOGD("Init name: %{public}s, uniqueId: %{public}" PRIu64 ".", name_.c_str(), queueId_);
88 return GSERROR_OK;
89 }
90
IsConsumer() const91 bool ProducerSurface::IsConsumer() const
92 {
93 return false;
94 }
95
GetProducer() const96 sptr<IBufferProducer> ProducerSurface::GetProducer() const
97 {
98 return producer_;
99 }
100
RequestBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)101 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
102 sptr<SyncFence>& fence, BufferRequestConfig& config)
103 {
104 if (producer_ == nullptr) {
105 return GSERROR_INVALID_ARGUMENTS;
106 }
107 IBufferProducer::RequestBufferReturnValue retval;
108 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
109 GSError ret;
110 {
111 std::lock_guard<std::mutex> lockGuard(mutex_);
112 ret = producer_->RequestBuffer(config, bedataimpl, retval);
113 if (ret != GSERROR_OK) {
114 if (ret == GSERROR_NO_CONSUMER) {
115 CleanCacheLocked(false);
116 }
117 /**
118 * if server is connected, but result is failed.
119 * client needs to synchronize status.
120 */
121 if (retval.isConnected) {
122 isDisconnected_ = false;
123 }
124 BLOGD("RequestBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
125 return ret;
126 }
127 isDisconnected_ = false;
128 AddCacheLocked(bedataimpl, retval, config);
129 }
130 buffer = retval.buffer;
131 fence = retval.fence;
132 if (SetMetadataValue(buffer) != GSERROR_OK) {
133 BLOGD("SetMetadataValue fail, uniqueId: %{public}" PRIu64 ".", queueId_);
134 }
135 return ret;
136 }
137
SetMetadataValue(sptr<SurfaceBuffer> & buffer)138 GSError ProducerSurface::SetMetadataValue(sptr<SurfaceBuffer>& buffer)
139 {
140 GSError ret = GSERROR_OK;
141 std::vector<uint8_t> metaData;
142 std::string value = GetUserData("ATTRKEY_COLORSPACE_INFO");
143 if (!value.empty()) {
144 ret = MetadataHelper::SetColorSpaceType(buffer, static_cast<CM_ColorSpaceType>(atoi(value.c_str())));
145 if (ret != GSERROR_OK) {
146 BLOGD("SetColorSpaceType ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
147 return ret;
148 }
149 }
150 value = GetUserData("OH_HDR_DYNAMIC_METADATA");
151 if (!value.empty()) {
152 metaData.resize(value.size());
153 metaData.assign(value.begin(), value.end());
154 ret = MetadataHelper::SetHDRDynamicMetadata(buffer, metaData);
155 if (ret != GSERROR_OK) {
156 BLOGD("SetHDRDynamicMetadata ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
157 return ret;
158 }
159 }
160 value = GetUserData("OH_HDR_STATIC_METADATA");
161 if (!value.empty()) {
162 metaData.resize(value.size());
163 metaData.assign(value.begin(), value.end());
164 ret = MetadataHelper::SetHDRStaticMetadata(buffer, metaData);
165 if (ret != GSERROR_OK) {
166 BLOGD("SetHDRStaticMetadata ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
167 return ret;
168 }
169 }
170 value = GetUserData("OH_HDR_METADATA_TYPE");
171 if (!value.empty()) {
172 ret = MetadataHelper::SetHDRMetadataType(buffer, static_cast<CM_HDR_Metadata_Type>(atoi(value.c_str())));
173 if (ret != GSERROR_OK) {
174 BLOGD("SetHDRMetadataType ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
175 }
176 }
177 return ret;
178 }
179
SetBufferConfigLocked(sptr<BufferExtraData> & bedataimpl,IBufferProducer::RequestBufferReturnValue & retval,BufferRequestConfig & config)180 void ProducerSurface::SetBufferConfigLocked(sptr<BufferExtraData>& bedataimpl,
181 IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
182 {
183 if (retval.buffer != nullptr) {
184 retval.buffer->SetSurfaceBufferColorGamut(config.colorGamut);
185 retval.buffer->SetSurfaceBufferTransform(config.transform);
186 retval.buffer->SetExtraData(bedataimpl);
187 }
188 }
189
DeleteCacheBufferLocked(sptr<BufferExtraData> & bedataimpl,IBufferProducer::RequestBufferReturnValue & retval,BufferRequestConfig & config)190 void ProducerSurface::DeleteCacheBufferLocked(sptr<BufferExtraData>& bedataimpl,
191 IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
192 {
193 for (auto it = retval.deletingBuffers.begin(); it != retval.deletingBuffers.end(); it++) {
194 uint32_t seqNum = static_cast<uint32_t>(*it);
195 bufferProducerCache_.erase(seqNum);
196 auto spNativeWindow = wpNativeWindow_.promote();
197 if (spNativeWindow != nullptr) {
198 auto& bufferCache = spNativeWindow->bufferCache_;
199 if (bufferCache.find(seqNum) != bufferCache.end()) {
200 NativeObjectUnreference(bufferCache[seqNum]);
201 bufferCache.erase(seqNum);
202 }
203 }
204 }
205 }
206
AddCacheLocked(sptr<BufferExtraData> & bedataimpl,IBufferProducer::RequestBufferReturnValue & retval,BufferRequestConfig & config)207 GSError ProducerSurface::AddCacheLocked(sptr<BufferExtraData>& bedataimpl,
208 IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
209 {
210 // add cache
211 if (retval.buffer != nullptr) {
212 bufferProducerCache_[retval.sequence] = retval.buffer;
213 ReleasePreCacheBuffer(static_cast<int>(bufferProducerCache_.size()));
214 } else {
215 auto it = bufferProducerCache_.find(retval.sequence);
216 if (it == bufferProducerCache_.end()) {
217 DeleteCacheBufferLocked(bedataimpl, retval, config);
218 BLOGE("cache not find buffer(%{public}u), uniqueId: %{public}" PRIu64 ".", retval.sequence, queueId_);
219 return SURFACE_ERROR_UNKOWN;
220 } else {
221 retval.buffer = it->second;
222 }
223 }
224 SetBufferConfigLocked(bedataimpl, retval, config);
225 DeleteCacheBufferLocked(bedataimpl, retval, config);
226 return SURFACE_ERROR_OK;
227 }
228
RequestBuffers(std::vector<sptr<SurfaceBuffer>> & buffers,std::vector<sptr<SyncFence>> & fences,BufferRequestConfig & config)229 GSError ProducerSurface::RequestBuffers(std::vector<sptr<SurfaceBuffer>>& buffers,
230 std::vector<sptr<SyncFence>>& fences, BufferRequestConfig& config)
231 {
232 if (producer_ == nullptr) {
233 return GSERROR_INVALID_ARGUMENTS;
234 }
235 std::vector<IBufferProducer::RequestBufferReturnValue> retvalues;
236 retvalues.resize(SURFACE_MAX_QUEUE_SIZE);
237 std::vector<sptr<BufferExtraData>> bedataimpls;
238 for (size_t i = 0; i < retvalues.size(); ++i) {
239 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
240 bedataimpls.emplace_back(bedataimpl);
241 }
242 std::lock_guard<std::mutex> lockGuard(mutex_);
243 GSError ret = producer_->RequestBuffers(config, bedataimpls, retvalues);
244 if (ret != GSERROR_NO_BUFFER && ret != GSERROR_OK) {
245 /**
246 * if server is connected, but result is failed.
247 * client needs to synchronize status.
248 */
249 if (retvalues[0].isConnected) {
250 isDisconnected_ = false;
251 }
252 BLOGD("RequestBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
253 return ret;
254 }
255 isDisconnected_ = false;
256 for (size_t i = 0; i < retvalues.size(); ++i) {
257 AddCacheLocked(bedataimpls[i], retvalues[i], config);
258 buffers.emplace_back(retvalues[i].buffer);
259 fences.emplace_back(retvalues[i].fence);
260 }
261 return GSERROR_OK;
262 }
263
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config)264 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
265 const sptr<SyncFence>& fence, BufferFlushConfig& config)
266 {
267 BufferFlushConfigWithDamages configWithDamages;
268 configWithDamages.damages.push_back(config.damage);
269 configWithDamages.timestamp = config.timestamp;
270 configWithDamages.desiredPresentTimestamp = config.desiredPresentTimestamp;
271 return FlushBuffer(buffer, fence, configWithDamages);
272 }
273
FlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfigWithDamages & config)274 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
275 BufferFlushConfigWithDamages& config)
276 {
277 if (buffer == nullptr || fence == nullptr || producer_ == nullptr) {
278 return GSERROR_INVALID_ARGUMENTS;
279 }
280
281 sptr<BufferExtraData> bedata = buffer->GetExtraData();
282 if (bedata == nullptr) {
283 return GSERROR_INVALID_ARGUMENTS;
284 }
285 auto ret = producer_->FlushBuffer(buffer->GetSeqNum(), bedata, fence, config);
286 if (ret == GSERROR_NO_CONSUMER) {
287 CleanCache();
288 BLOGD("FlushBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
289 }
290 return ret;
291 }
292
FlushBuffers(const std::vector<sptr<SurfaceBuffer>> & buffers,const std::vector<sptr<SyncFence>> & fences,const std::vector<BufferFlushConfigWithDamages> & configs)293 GSError ProducerSurface::FlushBuffers(const std::vector<sptr<SurfaceBuffer>>& buffers,
294 const std::vector<sptr<SyncFence>>& fences, const std::vector<BufferFlushConfigWithDamages>& configs)
295 {
296 if (buffers.size() == 0 || buffers.size() != fences.size() || producer_ == nullptr
297 || buffers.size() > SURFACE_MAX_QUEUE_SIZE) {
298 return GSERROR_INVALID_ARGUMENTS;
299 }
300 for (size_t i = 0; i < buffers.size(); ++i) {
301 if (buffers[i] == nullptr || fences[i] == nullptr) {
302 BLOGE("buffer or fence is nullptr, i: %{public}zu, uniqueId: %{public}" PRIu64 ".", i, queueId_);
303 return GSERROR_INVALID_ARGUMENTS;
304 }
305 }
306 std::vector<sptr<BufferExtraData>> bedata;
307 bedata.reserve(buffers.size());
308 std::vector<uint32_t> sequences;
309 sequences.reserve(buffers.size());
310 for (uint32_t i = 0; i < buffers.size(); ++i) {
311 bedata.emplace_back(buffers[i]->GetExtraData());
312 sequences.emplace_back(buffers[i]->GetSeqNum());
313 }
314 auto ret = producer_->FlushBuffers(sequences, bedata, fences, configs);
315 if (ret == GSERROR_NO_CONSUMER) {
316 CleanCache();
317 BLOGD("FlushBuffers ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
318 }
319 return ret;
320 }
321
GetLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],bool isUseNewMatrix)322 GSError ProducerSurface::GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer,
323 sptr<SyncFence>& fence, float matrix[16], bool isUseNewMatrix)
324 {
325 if (producer_ == nullptr) {
326 return GSERROR_INVALID_ARGUMENTS;
327 }
328 return producer_->GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix);
329 }
330
AcquireBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,int64_t & timestamp,Rect & damage)331 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
332 int64_t ×tamp, Rect &damage)
333 {
334 return GSERROR_NOT_SUPPORT;
335 }
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)336 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence)
337 {
338 return GSERROR_NOT_SUPPORT;
339 }
340
RequestBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,BufferRequestConfig & config)341 GSError ProducerSurface::RequestBuffer(sptr<SurfaceBuffer>& buffer,
342 int32_t& fence, BufferRequestConfig& config)
343 {
344 sptr<SyncFence> syncFence = SyncFence::InvalidFence();
345 auto ret = RequestBuffer(buffer, syncFence, config);
346 if (ret != GSERROR_OK) {
347 fence = -1;
348 return ret;
349 }
350 fence = syncFence->Dup();
351 return GSERROR_OK;
352 }
353
CancelBuffer(sptr<SurfaceBuffer> & buffer)354 GSError ProducerSurface::CancelBuffer(sptr<SurfaceBuffer>& buffer)
355 {
356 if (buffer == nullptr || producer_ == nullptr) {
357 return GSERROR_INVALID_ARGUMENTS;
358 }
359
360 sptr<BufferExtraData> bedata = buffer->GetExtraData();
361 if (bedata == nullptr) {
362 return GSERROR_INVALID_ARGUMENTS;
363 }
364 return producer_->CancelBuffer(buffer->GetSeqNum(), bedata);
365 }
366
FlushBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence,BufferFlushConfig & config)367 GSError ProducerSurface::FlushBuffer(sptr<SurfaceBuffer>& buffer,
368 int32_t fence, BufferFlushConfig& config)
369 {
370 // fence need close?
371 sptr<SyncFence> syncFence = new SyncFence(fence);
372 return FlushBuffer(buffer, syncFence, config);
373 }
374
AcquireBuffer(sptr<SurfaceBuffer> & buffer,int32_t & fence,int64_t & timestamp,Rect & damage)375 GSError ProducerSurface::AcquireBuffer(sptr<SurfaceBuffer>& buffer, int32_t &fence,
376 int64_t ×tamp, Rect &damage)
377 {
378 return GSERROR_NOT_SUPPORT;
379 }
380
ReleaseBuffer(sptr<SurfaceBuffer> & buffer,int32_t fence)381 GSError ProducerSurface::ReleaseBuffer(sptr<SurfaceBuffer>& buffer, int32_t fence)
382 {
383 return GSERROR_NOT_SUPPORT;
384 }
385
AttachBufferToQueue(sptr<SurfaceBuffer> buffer)386 GSError ProducerSurface::AttachBufferToQueue(sptr<SurfaceBuffer> buffer)
387 {
388 if (buffer == nullptr || producer_ == nullptr) {
389 return SURFACE_ERROR_UNKOWN;
390 }
391 auto ret = producer_->AttachBufferToQueue(buffer);
392 if (ret == GSERROR_OK) {
393 std::lock_guard<std::mutex> lockGuard(mutex_);
394 if (bufferProducerCache_.find(buffer->GetSeqNum()) != bufferProducerCache_.end()) {
395 BLOGE("Attach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
396 return SURFACE_ERROR_BUFFER_IS_INCACHE;
397 }
398 bufferProducerCache_[buffer->GetSeqNum()] = buffer;
399 ReleasePreCacheBuffer(static_cast<int>(bufferProducerCache_.size()));
400 }
401 return ret;
402 }
403
DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)404 GSError ProducerSurface::DetachBufferFromQueue(sptr<SurfaceBuffer> buffer)
405 {
406 if (buffer == nullptr || producer_ == nullptr) {
407 return SURFACE_ERROR_UNKOWN;
408 }
409 auto ret = producer_->DetachBufferFromQueue(buffer);
410 if (ret == GSERROR_OK) {
411 std::lock_guard<std::mutex> lockGuard(mutex_);
412 if (bufferProducerCache_.find(buffer->GetSeqNum()) == bufferProducerCache_.end()) {
413 BLOGE("Detach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
414 return SURFACE_ERROR_BUFFER_NOT_INCACHE;
415 }
416 bufferProducerCache_.erase(buffer->GetSeqNum());
417 }
418 return ret;
419 }
420
AttachBuffer(sptr<SurfaceBuffer> & buffer)421 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer)
422 {
423 if (buffer == nullptr || producer_ == nullptr) {
424 return GSERROR_INVALID_ARGUMENTS;
425 }
426
427 return producer_->AttachBuffer(buffer);
428 }
429
AttachBuffer(sptr<SurfaceBuffer> & buffer,int32_t timeOut)430 GSError ProducerSurface::AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut)
431 {
432 if (buffer == nullptr || producer_ == nullptr) {
433 return GSERROR_INVALID_ARGUMENTS;
434 }
435
436 return producer_->AttachBuffer(buffer, timeOut);
437 }
438
DetachBuffer(sptr<SurfaceBuffer> & buffer)439 GSError ProducerSurface::DetachBuffer(sptr<SurfaceBuffer>& buffer)
440 {
441 if (buffer == nullptr || producer_ == nullptr) {
442 return GSERROR_INVALID_ARGUMENTS;
443 }
444 return producer_->DetachBuffer(buffer);
445 }
446
RegisterSurfaceDelegator(sptr<IRemoteObject> client)447 GSError ProducerSurface::RegisterSurfaceDelegator(sptr<IRemoteObject> client)
448 {
449 if (client == nullptr) {
450 return GSERROR_INVALID_ARGUMENTS;
451 }
452 sptr<ProducerSurfaceDelegator> surfaceDelegator = ProducerSurfaceDelegator::Create();
453 if (surfaceDelegator == nullptr) {
454 BLOGE("surfaceDelegator is nullptr");
455 return GSERROR_INVALID_ARGUMENTS;
456 }
457 if (!surfaceDelegator->SetClient(client)) {
458 BLOGE("SetClient failed");
459 return GSERROR_INVALID_ARGUMENTS;
460 }
461
462 surfaceDelegator->SetSurface(this);
463 {
464 std::lock_guard<std::mutex> lockGuard(delegatorMutex_);
465 wpPSurfaceDelegator_ = surfaceDelegator;
466 }
467
468 auto releaseBufferCallBack = [weakThis = wptr(this)] (const sptr<SurfaceBuffer>& buffer,
469 const sptr<SyncFence>& fence) -> GSError {
470 auto pSurface = weakThis.promote();
471 if (pSurface == nullptr) {
472 BLOGE("pSurface is nullptr");
473 return GSERROR_INVALID_ARGUMENTS;
474 }
475 sptr<ProducerSurfaceDelegator> surfaceDelegator = nullptr;
476 {
477 std::lock_guard<std::mutex> lockGuard(pSurface->delegatorMutex_);
478 surfaceDelegator = pSurface->wpPSurfaceDelegator_.promote();
479 }
480 if (surfaceDelegator == nullptr) {
481 return GSERROR_INVALID_ARGUMENTS;
482 }
483 int error = surfaceDelegator->ReleaseBuffer(buffer, fence);
484 return static_cast<GSError>(error);
485 };
486 RegisterReleaseListener(releaseBufferCallBack);
487 return GSERROR_OK;
488 }
489
QueryIfBufferAvailable()490 bool ProducerSurface::QueryIfBufferAvailable()
491 {
492 return false;
493 }
494
GetQueueSize()495 uint32_t ProducerSurface::GetQueueSize()
496 {
497 if (producer_ == nullptr) {
498 return 0;
499 }
500 return producer_->GetQueueSize();
501 }
502
SetQueueSize(uint32_t queueSize)503 GSError ProducerSurface::SetQueueSize(uint32_t queueSize)
504 {
505 if (producer_ == nullptr) {
506 return GSERROR_INVALID_ARGUMENTS;
507 }
508 return producer_->SetQueueSize(queueSize);
509 }
510
GetName()511 const std::string& ProducerSurface::GetName()
512 {
513 if (!inited_.load()) {
514 BLOGW("ProducerSurface is not initialized.");
515 }
516 return name_;
517 }
518
SetDefaultWidthAndHeight(int32_t width,int32_t height)519 GSError ProducerSurface::SetDefaultWidthAndHeight(int32_t width, int32_t height)
520 {
521 return GSERROR_NOT_SUPPORT;
522 }
523
GetDefaultWidth()524 int32_t ProducerSurface::GetDefaultWidth()
525 {
526 if (producer_ == nullptr) {
527 return -1;
528 }
529 return producer_->GetDefaultWidth();
530 }
531
GetDefaultHeight()532 int32_t ProducerSurface::GetDefaultHeight()
533 {
534 if (producer_ == nullptr) {
535 return -1;
536 }
537 return producer_->GetDefaultHeight();
538 }
539
GetTransformHint() const540 GraphicTransformType ProducerSurface::GetTransformHint() const
541 {
542 std::lock_guard<std::mutex> lockGuard(mutex_);
543 return lastSetTransformHint_;
544 }
545
SetTransformHint(GraphicTransformType transformHint)546 GSError ProducerSurface::SetTransformHint(GraphicTransformType transformHint)
547 {
548 if (producer_ == nullptr) {
549 return GSERROR_INVALID_ARGUMENTS;
550 }
551 GSError err = producer_->SetTransformHint(transformHint);
552 if (err == GSERROR_OK) {
553 std::lock_guard<std::mutex> lockGuard(mutex_);
554 lastSetTransformHint_ = transformHint;
555 }
556 return err;
557 }
558
SetDefaultUsage(uint64_t usage)559 GSError ProducerSurface::SetDefaultUsage(uint64_t usage)
560 {
561 if (producer_ == nullptr) {
562 return GSERROR_INVALID_ARGUMENTS;
563 }
564 return producer_->SetDefaultUsage(usage);
565 }
566
GetDefaultUsage()567 uint64_t ProducerSurface::GetDefaultUsage()
568 {
569 if (producer_ == nullptr) {
570 return 0;
571 }
572 return producer_->GetDefaultUsage();
573 }
574
SetSurfaceSourceType(OHSurfaceSource sourceType)575 GSError ProducerSurface::SetSurfaceSourceType(OHSurfaceSource sourceType)
576 {
577 if (producer_ == nullptr) {
578 return GSERROR_INVALID_ARGUMENTS;
579 }
580 return producer_->SetSurfaceSourceType(sourceType);
581 }
582
GetSurfaceSourceType() const583 OHSurfaceSource ProducerSurface::GetSurfaceSourceType() const
584 {
585 if (producer_ == nullptr) {
586 return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
587 }
588 OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
589 if (producer_->GetSurfaceSourceType(sourceType) != GSERROR_OK) {
590 BLOGE("GetSurfaceSourceType failed, uniqueId: %{public}" PRIu64 ".", queueId_);
591 return OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
592 }
593 return sourceType;
594 }
595
SetSurfaceAppFrameworkType(std::string appFrameworkType)596 GSError ProducerSurface::SetSurfaceAppFrameworkType(std::string appFrameworkType)
597 {
598 if (producer_ == nullptr) {
599 return GSERROR_INVALID_ARGUMENTS;
600 }
601 return producer_->SetSurfaceAppFrameworkType(appFrameworkType);
602 }
603
GetSurfaceAppFrameworkType() const604 std::string ProducerSurface::GetSurfaceAppFrameworkType() const
605 {
606 if (producer_ == nullptr) {
607 return "";
608 }
609 std::string appFrameworkType = "";
610 if (producer_->GetSurfaceAppFrameworkType(appFrameworkType) != GSERROR_OK) {
611 BLOGE("GetSurfaceAppFrameworkType failed, uniqueId: %{public}" PRIu64 ".", queueId_);
612 return "";
613 }
614 return appFrameworkType;
615 }
616
SetUserData(const std::string & key,const std::string & val)617 GSError ProducerSurface::SetUserData(const std::string& key, const std::string& val)
618 {
619 std::lock_guard<std::mutex> lockGuard(lockMutex_);
620 if (userData_.size() >= SURFACE_MAX_USER_DATA_COUNT) {
621 BLOGE("userData_ size out: %{public}zu, uniqueId: %{public}" PRIu64 ".", userData_.size(), queueId_);
622 return GSERROR_OUT_OF_RANGE;
623 }
624
625 auto iterUserData = userData_.find(key);
626 if (iterUserData != userData_.end() && iterUserData->second == val) {
627 BLOGE("SetUserData failed: key:%{public}s, val:%{public}s exist, uniqueId: %{public}" PRIu64 ".",
628 key.c_str(), val.c_str(), queueId_);
629 return GSERROR_API_FAILED;
630 }
631
632 userData_[key] = val;
633 auto iter = onUserDataChange_.begin();
634 while (iter != onUserDataChange_.end()) {
635 if (iter->second != nullptr) {
636 iter->second(key, val);
637 }
638 iter++;
639 }
640
641 return GSERROR_OK;
642 }
643
GetUserData(const std::string & key)644 std::string ProducerSurface::GetUserData(const std::string& key)
645 {
646 std::lock_guard<std::mutex> lockGuard(lockMutex_);
647 if (userData_.find(key) != userData_.end()) {
648 return userData_[key];
649 }
650
651 return "";
652 }
653
RegisterConsumerListener(sptr<IBufferConsumerListener> & listener)654 GSError ProducerSurface::RegisterConsumerListener(sptr<IBufferConsumerListener>& listener)
655 {
656 return GSERROR_NOT_SUPPORT;
657 }
658
RegisterConsumerListener(IBufferConsumerListenerClazz * listener)659 GSError ProducerSurface::RegisterConsumerListener(IBufferConsumerListenerClazz *listener)
660 {
661 return GSERROR_NOT_SUPPORT;
662 }
663
UnregisterConsumerListener()664 GSError ProducerSurface::UnregisterConsumerListener()
665 {
666 return GSERROR_NOT_SUPPORT;
667 }
668
RegisterReleaseListener(OnReleaseFunc func)669 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFunc func)
670 {
671 if (func == nullptr || producer_ == nullptr) {
672 return GSERROR_INVALID_ARGUMENTS;
673 }
674 sptr<IProducerListener> listener;
675 {
676 std::lock_guard<std::mutex> lockGuard(listenerMutex_);
677 listener_ = new BufferReleaseProducerListener(func);
678 listener = listener_;
679 }
680 return producer_->RegisterReleaseListener(listener);
681 }
682
RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence)683 GSError ProducerSurface::RegisterReleaseListener(OnReleaseFuncWithFence funcWithFence)
684 {
685 if (funcWithFence == nullptr || producer_ == nullptr) {
686 return GSERROR_INVALID_ARGUMENTS;
687 }
688 sptr<IProducerListener> listener;
689 {
690 std::lock_guard<std::mutex> lockGuard(listenerMutex_);
691 listener_ = new BufferReleaseProducerListener(nullptr, funcWithFence);
692 listener = listener_;
693 }
694 return producer_->RegisterReleaseListener(listener);
695 }
696
UnRegisterReleaseListener()697 GSError ProducerSurface::UnRegisterReleaseListener()
698 {
699 if (producer_ == nullptr) {
700 return GSERROR_INVALID_ARGUMENTS;
701 }
702 {
703 std::lock_guard<std::mutex> lockGuard(delegatorMutex_);
704 wpPSurfaceDelegator_ = nullptr;
705 }
706 {
707 std::lock_guard<std::mutex> lockGuard(listenerMutex_);
708 if (listener_ != nullptr) {
709 listener_->ResetReleaseFunc();
710 }
711 }
712 return producer_->UnRegisterReleaseListener();
713 }
714
RegisterDeleteBufferListener(OnDeleteBufferFunc func,bool isForUniRedraw)715 GSError ProducerSurface::RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw)
716 {
717 return GSERROR_NOT_SUPPORT;
718 }
719
RegisterUserDataChangeListener(const std::string & funcName,OnUserDataChangeFunc func)720 GSError ProducerSurface::RegisterUserDataChangeListener(const std::string& funcName, OnUserDataChangeFunc func)
721 {
722 if (func == nullptr) {
723 return GSERROR_INVALID_ARGUMENTS;
724 }
725 std::lock_guard<std::mutex> lockGuard(lockMutex_);
726 if (onUserDataChange_.find(funcName) != onUserDataChange_.end()) {
727 BLOGD("already register func: %{public}s, uniqueId: %{public}" PRIu64 ".",
728 funcName.c_str(), queueId_);
729 return GSERROR_INVALID_ARGUMENTS;
730 }
731
732 onUserDataChange_[funcName] = func;
733 return GSERROR_OK;
734 }
735
UnRegisterUserDataChangeListener(const std::string & funcName)736 GSError ProducerSurface::UnRegisterUserDataChangeListener(const std::string& funcName)
737 {
738 std::lock_guard<std::mutex> lockGuard(lockMutex_);
739 if (onUserDataChange_.erase(funcName) == 0) {
740 BLOGD("no register funcName: %{public}s, uniqueId: %{public}" PRIu64 ".", funcName.c_str(), queueId_);
741 return GSERROR_INVALID_ARGUMENTS;
742 }
743
744 return GSERROR_OK;
745 }
746
ClearUserDataChangeListener()747 GSError ProducerSurface::ClearUserDataChangeListener()
748 {
749 std::lock_guard<std::mutex> lockGuard(lockMutex_);
750 onUserDataChange_.clear();
751 return GSERROR_OK;
752 }
753
IsRemote()754 bool ProducerSurface::IsRemote()
755 {
756 if (producer_ == nullptr || producer_->AsObject() == nullptr) {
757 return false;
758 }
759 return producer_->AsObject()->IsProxyObject();
760 }
761
CleanAllLocked(uint32_t * bufSeqNum)762 void ProducerSurface::CleanAllLocked(uint32_t *bufSeqNum)
763 {
764 if (bufSeqNum && bufferProducerCache_.find(*bufSeqNum) != bufferProducerCache_.end()) {
765 preCacheBuffer_ = bufferProducerCache_[*bufSeqNum];
766 }
767 bufferProducerCache_.clear();
768 auto spNativeWindow = wpNativeWindow_.promote();
769 if (spNativeWindow != nullptr) {
770 auto& bufferCache = spNativeWindow->bufferCache_;
771 for (auto& [seqNum, buffer] : bufferCache) {
772 NativeObjectUnreference(buffer);
773 }
774 bufferCache.clear();
775 }
776 }
777
CleanCacheLocked(bool cleanAll)778 GSError ProducerSurface::CleanCacheLocked(bool cleanAll)
779 {
780 BLOGD("CleanCacheLocked, uniqueId: %{public}" PRIu64 ".", queueId_);
781 if (producer_ == nullptr) {
782 return GSERROR_INVALID_ARGUMENTS;
783 }
784 uint32_t bufSeqNum = 0;
785 GSError ret = producer_->CleanCache(cleanAll, &bufSeqNum);
786 CleanAllLocked(&bufSeqNum);
787 if (cleanAll) {
788 preCacheBuffer_ = nullptr;
789 }
790 return ret;
791 }
792
CleanCache(bool cleanAll)793 GSError ProducerSurface::CleanCache(bool cleanAll)
794 {
795 if (producer_ == nullptr) {
796 return GSERROR_INVALID_ARGUMENTS;
797 }
798 BLOGD("CleanCache, uniqueId: %{public}" PRIu64 ".", queueId_);
799 std::lock_guard<std::mutex> lockGuard(mutex_);
800 uint32_t bufSeqNum = 0;
801 GSError ret = producer_->CleanCache(cleanAll, &bufSeqNum);
802 CleanAllLocked(&bufSeqNum);
803 if (cleanAll) {
804 preCacheBuffer_ = nullptr;
805 }
806 return ret;
807 }
808
GoBackground()809 GSError ProducerSurface::GoBackground()
810 {
811 if (producer_ == nullptr) {
812 return GSERROR_INVALID_ARGUMENTS;
813 }
814 BLOGD("GoBackground, uniqueId: %{public}" PRIu64 ".", queueId_);
815 {
816 std::lock_guard<std::mutex> lockGuard(mutex_);
817 CleanAllLocked(nullptr);
818 }
819 return producer_->GoBackground();
820 }
821
GetUniqueId() const822 uint64_t ProducerSurface::GetUniqueId() const
823 {
824 if (!inited_.load()) {
825 BLOGW("ProducerSurface is not initialized.");
826 }
827 return queueId_;
828 }
829
SetTransform(GraphicTransformType transform)830 GSError ProducerSurface::SetTransform(GraphicTransformType transform)
831 {
832 if (producer_ == nullptr) {
833 return GSERROR_INVALID_ARGUMENTS;
834 }
835 return producer_->SetTransform(transform);
836 }
837
GetTransform() const838 GraphicTransformType ProducerSurface::GetTransform() const
839 {
840 if (producer_ == nullptr) {
841 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
842 }
843 GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT;
844 if (producer_->GetTransform(transform) != GSERROR_OK) {
845 BLOGE("GetTransform failed, uniqueId: %{public}" PRIu64 ".", queueId_);
846 return GraphicTransformType::GRAPHIC_ROTATE_BUTT;
847 }
848 return transform;
849 }
850
IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> & infos,std::vector<bool> & supporteds)851 GSError ProducerSurface::IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo>& infos,
852 std::vector<bool>& supporteds)
853 {
854 if (producer_ == nullptr || infos.size() == 0 || infos.size() != supporteds.size()) {
855 return GSERROR_INVALID_ARGUMENTS;
856 }
857 return producer_->IsSupportedAlloc(infos, supporteds);
858 }
859
Connect()860 GSError ProducerSurface::Connect()
861 {
862 if (producer_ == nullptr) {
863 return GSERROR_INVALID_ARGUMENTS;
864 }
865 std::lock_guard<std::mutex> lockGuard(mutex_);
866 if (!isDisconnected_) {
867 BLOGE("Surface has been connect, uniqueId: %{public}" PRIu64 ".", queueId_);
868 return SURFACE_ERROR_CONSUMER_IS_CONNECTED;
869 }
870 BLOGD("Connect, uniqueId: %{public}" PRIu64 ".", queueId_);
871 GSError ret = producer_->Connect();
872 if (ret == GSERROR_OK) {
873 isDisconnected_ = false;
874 }
875 return ret;
876 }
877
Disconnect()878 GSError ProducerSurface::Disconnect()
879 {
880 if (producer_ == nullptr) {
881 return GSERROR_INVALID_ARGUMENTS;
882 }
883 std::lock_guard<std::mutex> lockGuard(mutex_);
884 if (isDisconnected_) {
885 BLOGD("Surface is disconnect, uniqueId: %{public}" PRIu64 ".", queueId_);
886 return SURFACE_ERROR_CONSUMER_DISCONNECTED;
887 }
888 BLOGD("Disconnect, uniqueId: %{public}" PRIu64 ".", queueId_);
889 uint32_t bufSeqNum = 0;
890 GSError ret = producer_->Disconnect(&bufSeqNum);
891 if (ret == GSERROR_OK) {
892 isDisconnected_ = true;
893 }
894 CleanAllLocked(&bufSeqNum);
895 return ret;
896 }
897
SetScalingMode(uint32_t sequence,ScalingMode scalingMode)898 GSError ProducerSurface::SetScalingMode(uint32_t sequence, ScalingMode scalingMode)
899 {
900 if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
901 scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
902 return GSERROR_INVALID_ARGUMENTS;
903 }
904 return producer_->SetScalingMode(sequence, scalingMode);
905 }
906
SetScalingMode(ScalingMode scalingMode)907 GSError ProducerSurface::SetScalingMode(ScalingMode scalingMode)
908 {
909 if (producer_ == nullptr || scalingMode < ScalingMode::SCALING_MODE_FREEZE ||
910 scalingMode > ScalingMode::SCALING_MODE_SCALE_FIT) {
911 return GSERROR_INVALID_ARGUMENTS;
912 }
913 return producer_->SetScalingMode(scalingMode);
914 }
915
SetBufferHold(bool hold)916 void ProducerSurface::SetBufferHold(bool hold)
917 {
918 if (producer_ == nullptr) {
919 return;
920 }
921 producer_->SetBufferHold(hold);
922 }
923
GetScalingMode(uint32_t sequence,ScalingMode & scalingMode)924 GSError ProducerSurface::GetScalingMode(uint32_t sequence, ScalingMode& scalingMode)
925 {
926 return GSERROR_NOT_SUPPORT;
927 }
928
SetMetaData(uint32_t sequence,const std::vector<GraphicHDRMetaData> & metaData)929 GSError ProducerSurface::SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData>& metaData)
930 {
931 if (producer_ == nullptr || metaData.size() == 0) {
932 return GSERROR_INVALID_ARGUMENTS;
933 }
934 return producer_->SetMetaData(sequence, metaData);
935 }
936
SetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey key,const std::vector<uint8_t> & metaData)937 GSError ProducerSurface::SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
938 const std::vector<uint8_t>& metaData)
939 {
940 if (producer_ == nullptr || key < GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ||
941 key > GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR_VIVID || metaData.size() == 0) {
942 return GSERROR_INVALID_ARGUMENTS;
943 }
944 return producer_->SetMetaDataSet(sequence, key, metaData);
945 }
946
QueryMetaDataType(uint32_t sequence,HDRMetaDataType & type) const947 GSError ProducerSurface::QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type) const
948 {
949 return GSERROR_NOT_SUPPORT;
950 }
951
GetMetaData(uint32_t sequence,std::vector<GraphicHDRMetaData> & metaData) const952 GSError ProducerSurface::GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData) const
953 {
954 return GSERROR_NOT_SUPPORT;
955 }
956
GetMetaDataSet(uint32_t sequence,GraphicHDRMetadataKey & key,std::vector<uint8_t> & metaData) const957 GSError ProducerSurface::GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
958 std::vector<uint8_t> &metaData) const
959 {
960 return GSERROR_NOT_SUPPORT;
961 }
962
SetTunnelHandle(const GraphicExtDataHandle * handle)963 GSError ProducerSurface::SetTunnelHandle(const GraphicExtDataHandle *handle)
964 {
965 if (producer_ == nullptr) {
966 return GSERROR_INVALID_ARGUMENTS;
967 }
968 return producer_->SetTunnelHandle(handle);
969 }
970
GetTunnelHandle() const971 sptr<SurfaceTunnelHandle> ProducerSurface::GetTunnelHandle() const
972 {
973 // not support
974 return nullptr;
975 }
976
SetPresentTimestamp(uint32_t sequence,const GraphicPresentTimestamp & timestamp)977 GSError ProducerSurface::SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp ×tamp)
978 {
979 return GSERROR_NOT_SUPPORT;
980 }
981
GetPresentTimestamp(uint32_t sequence,GraphicPresentTimestampType type,int64_t & time) const982 GSError ProducerSurface::GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type,
983 int64_t& time) const
984 {
985 if (producer_ == nullptr || type <= GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED ||
986 type > GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP) {
987 return GSERROR_INVALID_ARGUMENTS;
988 }
989 return producer_->GetPresentTimestamp(sequence, type, time);
990 }
991
GetDefaultFormat()992 int32_t ProducerSurface::GetDefaultFormat()
993 {
994 return 0;
995 }
996
SetDefaultFormat(int32_t format)997 GSError ProducerSurface::SetDefaultFormat(int32_t format)
998 {
999 return GSERROR_NOT_SUPPORT;
1000 }
1001
GetDefaultColorGamut()1002 int32_t ProducerSurface::GetDefaultColorGamut()
1003 {
1004 return 0;
1005 }
1006
SetDefaultColorGamut(int32_t colorGamut)1007 GSError ProducerSurface::SetDefaultColorGamut(int32_t colorGamut)
1008 {
1009 return GSERROR_NOT_SUPPORT;
1010 }
1011
GetNativeSurface()1012 sptr<NativeSurface> ProducerSurface::GetNativeSurface()
1013 {
1014 return nullptr;
1015 }
1016
SetWptrNativeWindowToPSurface(void * nativeWindow)1017 GSError ProducerSurface::SetWptrNativeWindowToPSurface(void* nativeWindow)
1018 {
1019 NativeWindow *nw = reinterpret_cast<NativeWindow *>(nativeWindow);
1020 std::lock_guard<std::mutex> lockGuard(mutex_);
1021 wpNativeWindow_ = nw;
1022 return GSERROR_OK;
1023 }
1024
SetRequestWidthAndHeight(int32_t width,int32_t height)1025 void ProducerSurface::SetRequestWidthAndHeight(int32_t width, int32_t height)
1026 {
1027 std::lock_guard<std::mutex> lockGuard(mutex_);
1028 requestWidth_ = width;
1029 requestHeight_ = height;
1030 }
1031
GetRequestWidth()1032 int32_t ProducerSurface::GetRequestWidth()
1033 {
1034 std::lock_guard<std::mutex> lockGuard(mutex_);
1035 return requestWidth_;
1036 }
1037
GetRequestHeight()1038 int32_t ProducerSurface::GetRequestHeight()
1039 {
1040 std::lock_guard<std::mutex> lockGuard(mutex_);
1041 return requestHeight_;
1042 }
1043
GetWindowConfig()1044 BufferRequestConfig* ProducerSurface::GetWindowConfig()
1045 {
1046 return &windowConfig_;
1047 }
1048
SetHdrWhitePointBrightness(float brightness)1049 GSError ProducerSurface::SetHdrWhitePointBrightness(float brightness)
1050 {
1051 if (producer_ == nullptr) {
1052 return GSERROR_INVALID_ARGUMENTS;
1053 }
1054 if (brightness < 0.0 || brightness > 1.0) {
1055 BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_);
1056 return GSERROR_INVALID_ARGUMENTS;
1057 }
1058 return producer_->SetHdrWhitePointBrightness(brightness);
1059 }
1060
SetSdrWhitePointBrightness(float brightness)1061 GSError ProducerSurface::SetSdrWhitePointBrightness(float brightness)
1062 {
1063 if (producer_ == nullptr) {
1064 return GSERROR_INVALID_ARGUMENTS;
1065 }
1066 if (brightness < 0.0 || brightness > 1.0) {
1067 BLOGE("brightness:%{public}f, uniqueId: %{public}" PRIu64 ".", brightness, queueId_);
1068 return GSERROR_INVALID_ARGUMENTS;
1069 }
1070 return producer_->SetSdrWhitePointBrightness(brightness);
1071 }
1072
AcquireLastFlushedBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,float matrix[16],uint32_t matrixSize,bool isUseNewMatrix)1073 GSError ProducerSurface::AcquireLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
1074 float matrix[16], uint32_t matrixSize, bool isUseNewMatrix)
1075 {
1076 if (producer_ == nullptr) {
1077 return GSERROR_INVALID_ARGUMENTS;
1078 }
1079 return producer_->AcquireLastFlushedBuffer(buffer, fence, matrix, matrixSize, isUseNewMatrix);
1080 }
1081
ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)1082 GSError ProducerSurface::ReleaseLastFlushedBuffer(sptr<SurfaceBuffer> buffer)
1083 {
1084 if (buffer == nullptr || producer_ == nullptr) {
1085 return GSERROR_INVALID_ARGUMENTS;
1086 }
1087 return producer_->ReleaseLastFlushedBuffer(buffer->GetSeqNum());
1088 }
1089
UpdateCacheLocked(sptr<BufferExtraData> & bedataimpl,IBufferProducer::RequestBufferReturnValue & retval,BufferRequestConfig & config)1090 GSError ProducerSurface::UpdateCacheLocked(sptr<BufferExtraData>& bedataimpl,
1091 IBufferProducer::RequestBufferReturnValue& retval, BufferRequestConfig& config)
1092 {
1093 // add cache
1094 if (retval.buffer == nullptr) {
1095 auto it = bufferProducerCache_.find(retval.sequence);
1096 if (it == bufferProducerCache_.end()) {
1097 DeleteCacheBufferLocked(bedataimpl, retval, config);
1098 BLOGE("cache not find buffer(%{public}u), uniqueId: %{public}" PRIu64 ".", retval.sequence, queueId_);
1099 return SURFACE_ERROR_UNKOWN;
1100 } else {
1101 retval.buffer = it->second;
1102 }
1103 }
1104 bufferProducerCache_.erase(retval.sequence);
1105 SetBufferConfigLocked(bedataimpl, retval, config);
1106 DeleteCacheBufferLocked(bedataimpl, retval, config);
1107 return SURFACE_ERROR_OK;
1108 }
1109
RequestAndDetachBuffer(sptr<SurfaceBuffer> & buffer,sptr<SyncFence> & fence,BufferRequestConfig & config)1110 GSError ProducerSurface::RequestAndDetachBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
1111 BufferRequestConfig& config)
1112 {
1113 if (producer_ == nullptr) {
1114 return GSERROR_INVALID_ARGUMENTS;
1115 }
1116 IBufferProducer::RequestBufferReturnValue retval;
1117 sptr<BufferExtraData> bedataimpl = new BufferExtraDataImpl;
1118
1119 std::lock_guard<std::mutex> lockGuard(mutex_);
1120 GSError ret = producer_->RequestAndDetachBuffer(config, bedataimpl, retval);
1121 if (ret != GSERROR_OK) {
1122 if (ret == GSERROR_NO_CONSUMER) {
1123 CleanCacheLocked(false);
1124 }
1125 /**
1126 * if server is connected, but result is failed.
1127 * client needs to synchronize status.
1128 */
1129 if (retval.isConnected) {
1130 isDisconnected_ = false;
1131 }
1132 BLOGD("RequestAndDetachBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
1133 return ret;
1134 }
1135 isDisconnected_ = false;
1136 UpdateCacheLocked(bedataimpl, retval, config);
1137 buffer = retval.buffer;
1138 fence = retval.fence;
1139
1140 if (SetMetadataValue(buffer) != GSERROR_OK) {
1141 BLOGD("SetMetadataValue fail, uniqueId: %{public}" PRIu64 ".", queueId_);
1142 }
1143 return ret;
1144 }
1145
AttachAndFlushBuffer(sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence,BufferFlushConfig & config,bool needMap)1146 GSError ProducerSurface::AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence,
1147 BufferFlushConfig& config, bool needMap)
1148 {
1149 if (buffer == nullptr || fence == nullptr || producer_ == nullptr) {
1150 return GSERROR_INVALID_ARGUMENTS;
1151 }
1152
1153 sptr<BufferExtraData> bedata = buffer->GetExtraData();
1154 if (bedata == nullptr) {
1155 return GSERROR_INVALID_ARGUMENTS;
1156 }
1157
1158 BufferFlushConfigWithDamages configWithDamages;
1159 configWithDamages.damages.push_back(config.damage);
1160 configWithDamages.timestamp = config.timestamp;
1161 configWithDamages.desiredPresentTimestamp = config.desiredPresentTimestamp;
1162
1163 auto ret = producer_->AttachAndFlushBuffer(buffer, bedata, fence, configWithDamages, needMap);
1164 if (ret == GSERROR_OK) {
1165 std::lock_guard<std::mutex> lockGuard(mutex_);
1166 if (bufferProducerCache_.find(buffer->GetSeqNum()) != bufferProducerCache_.end()) {
1167 BLOGE("Attach buffer %{public}d, uniqueId: %{public}" PRIu64 ".", buffer->GetSeqNum(), queueId_);
1168 return SURFACE_ERROR_BUFFER_IS_INCACHE;
1169 }
1170 bufferProducerCache_[buffer->GetSeqNum()] = buffer;
1171 } else if (ret == GSERROR_NO_CONSUMER) {
1172 CleanCache();
1173 BLOGD("FlushBuffer ret: %{public}d, uniqueId: %{public}" PRIu64 ".", ret, queueId_);
1174 }
1175 return ret;
1176 }
1177
ReleasePreCacheBuffer(int bufferCacheSize)1178 void ProducerSurface::ReleasePreCacheBuffer(int bufferCacheSize)
1179 {
1180 // client must have more than two buffer, otherwise RS can not delete the prebuffer.
1181 // Because RS has two buffer(pre and cur).
1182 const int deletePreCacheBufferThreshold = 2; // 2 is delete threshold.
1183 if (bufferCacheSize >= deletePreCacheBufferThreshold) {
1184 preCacheBuffer_ = nullptr;
1185 }
1186 }
1187
GetCycleBuffersNumber(uint32_t & cycleBuffersNumber)1188 GSError ProducerSurface::GetCycleBuffersNumber(uint32_t& cycleBuffersNumber)
1189 {
1190 if (producer_ == nullptr) {
1191 return SURFACE_ERROR_UNKOWN;
1192 }
1193 return producer_->GetCycleBuffersNumber(cycleBuffersNumber);
1194 }
1195
SetCycleBuffersNumber(uint32_t cycleBuffersNumber)1196 GSError ProducerSurface::SetCycleBuffersNumber(uint32_t cycleBuffersNumber)
1197 {
1198 if (producer_ == nullptr) {
1199 return SURFACE_ERROR_UNKOWN;
1200 }
1201 return producer_->SetCycleBuffersNumber(cycleBuffersNumber);
1202 }
1203 } // namespace OHOS
1204