• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "hdi_framebuffer_surface.h"
17 
18 #include "hdi_log.h"
19 
20 using namespace OHOS;
21 
22 namespace OHOS {
23 namespace Rosen {
24 
HdiFramebufferSurface()25 HdiFramebufferSurface::HdiFramebufferSurface()
26 {
27 }
28 
~HdiFramebufferSurface()29 HdiFramebufferSurface::~HdiFramebufferSurface()
30 {
31 }
32 
CreateFramebufferSurface()33 sptr<HdiFramebufferSurface> HdiFramebufferSurface::CreateFramebufferSurface()
34 {
35     sptr<HdiFramebufferSurface> fbSurface = new HdiFramebufferSurface();
36 
37     SurfaceError ret = fbSurface->CreateSurface(fbSurface);
38     if (ret != SURFACE_ERROR_OK) {
39         HLOGE("FramebufferSurface CreateSurface failed, ret is %{public}d", ret);
40         return nullptr;
41     }
42 
43     ret = fbSurface->SetBufferQueueSize(MAX_BUFFER_SIZE);
44     if (ret != SURFACE_ERROR_OK) {
45         HLOGE("FramebufferSurface SetBufferQueueSize failed, ret is %{public}d", ret);
46         return nullptr;
47     }
48 
49     return fbSurface;
50 }
51 
CreateSurface(sptr<HdiFramebufferSurface> & fbSurface)52 SurfaceError HdiFramebufferSurface::CreateSurface(sptr<HdiFramebufferSurface> &fbSurface)
53 {
54     consumerSurface_ = Surface::CreateSurfaceAsConsumer();
55 
56     sptr<IBufferProducer> producer = consumerSurface_->GetProducer();
57     producerSurface_ = Surface::CreateSurfaceAsProducer(producer);
58 
59     sptr<IBufferConsumerListener> listener = fbSurface;
60     SurfaceError ret = consumerSurface_->RegisterConsumerListener(listener);
61     if (ret != SURFACE_ERROR_OK) {
62         return SURFACE_ERROR_NO_CONSUMER;
63     }
64 
65     return SURFACE_ERROR_OK;
66 }
67 
SetBufferQueueSize(uint32_t bufferSize)68 SurfaceError HdiFramebufferSurface::SetBufferQueueSize(uint32_t bufferSize)
69 {
70     SurfaceError ret = consumerSurface_->SetQueueSize(bufferSize);
71     if (ret != SURFACE_ERROR_OK) {
72         HLOGE("fb SetQueueSize failed, ret is %{public}d", ret);
73         return ret;
74     }
75 
76     return SURFACE_ERROR_OK;
77 }
78 
OnBufferAvailable()79 void HdiFramebufferSurface::OnBufferAvailable()
80 {
81     // check, how to use timestamp and damage
82     oldBuffer_ = currentBuffer_;
83     int64_t timestamp;
84     Rect damage;
85     int32_t fbAcquireFence = -1;
86     SurfaceError ret = consumerSurface_->AcquireBuffer(currentBuffer_, fbAcquireFence,
87                                                        timestamp, damage);
88     if (ret != SURFACE_ERROR_OK) {
89         HLOGE("AcquireBuffer failed, ret is %{public}d", ret);
90         return;
91     }
92 
93     fbAcquireFence_ = new SyncFence(fbAcquireFence);
94 
95     // We've got framebuffer, signal now
96     framebufferSem_.Inc();
97 }
98 
GetProducerSurface()99 sptr<Surface> HdiFramebufferSurface::GetProducerSurface()
100 {
101     return producerSurface_;
102 }
103 
GetFramebuffer()104 sptr<SurfaceBuffer> HdiFramebufferSurface::GetFramebuffer()
105 {
106     return currentBuffer_;
107 }
108 
GetFramebufferFence()109 sptr<SyncFence> HdiFramebufferSurface::GetFramebufferFence()
110 {
111     return fbAcquireFence_;
112 }
113 
ReleaseFramebuffer(const sptr<SyncFence> & releaseFence)114 int32_t HdiFramebufferSurface::ReleaseFramebuffer(const sptr<SyncFence> &releaseFence)
115 {
116     if (oldBuffer_ == nullptr) {
117         return SURFACE_ERROR_OK;
118     }
119 
120     if (releaseFence == nullptr) {
121         return SURFACE_ERROR_NULLPTR;
122     }
123 
124     int32_t fenceFd = releaseFence->Dup();
125     SurfaceError ret = consumerSurface_->ReleaseBuffer(oldBuffer_, fenceFd);
126     if (ret != SURFACE_ERROR_OK) {
127         HLOGE("ReleaseBuffer failed ret is %{public}d", ret);
128     }
129 
130     oldBuffer_ = nullptr;
131 
132     return ret;
133 }
134 
FramebufferSemWait()135 void HdiFramebufferSurface::FramebufferSemWait()
136 {
137     // wait for framebuffer available
138     framebufferSem_.Dec();
139 }
140 
141 } // namespace Rosen
142 } // namespace OHOS
143