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 "wl_buffer.h"
17
18 #include "window_manager_hilog.h"
19
20 namespace OHOS {
21 namespace {
22 constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, 0, "WMWlBuffer" };
23 } // namespace
24
Release(void * data,struct wl_buffer * buffer)25 void WlBuffer::Release(void *data, struct wl_buffer *buffer)
26 {
27 auto wb = reinterpret_cast<WlBuffer *>(data);
28 if (wb != nullptr && wb->release == nullptr) {
29 wb->onRelease->OnWlBufferRelease(wb->buffer, -1);
30 }
31 }
32
FencedRelease(void * data,struct zwp_linux_buffer_release_v1 * release,int32_t fence)33 void WlBuffer::FencedRelease(void *data, struct zwp_linux_buffer_release_v1 *release, int32_t fence)
34 {
35 auto wb = reinterpret_cast<WlBuffer *>(data);
36 if (wb != nullptr && wb->release != nullptr) {
37 wb->onRelease->OnWlBufferRelease(wb->buffer, fence);
38 zwp_linux_buffer_release_v1_destroy(release);
39 wb->release = nullptr;
40 }
41 }
42
ImmediateRelease(void * data,struct zwp_linux_buffer_release_v1 * release)43 void WlBuffer::ImmediateRelease(void *data, struct zwp_linux_buffer_release_v1 *release)
44 {
45 auto wb = reinterpret_cast<WlBuffer *>(data);
46 if (wb != nullptr && wb->release != nullptr) {
47 wb->onRelease->OnWlBufferRelease(wb->buffer, -1);
48 zwp_linux_buffer_release_v1_destroy(release);
49 wb->release = nullptr;
50 }
51 }
52
WlBuffer(struct wl_buffer * wb)53 WlBuffer::WlBuffer(struct wl_buffer *wb)
54 {
55 buffer = wb;
56 if (buffer == nullptr) {
57 return;
58 }
59
60 const struct wl_buffer_listener listener = { WlBuffer::Release };
61 if (wl_buffer_add_listener(buffer, &listener, this) == -1) {
62 WMLOGFW("wl_buffer_add_listener failed");
63 }
64 }
65
~WlBuffer()66 WlBuffer::~WlBuffer()
67 {
68 if (release != nullptr) {
69 zwp_linux_buffer_release_v1_destroy(release);
70 release = nullptr;
71 }
72
73 if (buffer != nullptr) {
74 wl_buffer_destroy(buffer);
75 buffer = nullptr;
76 }
77 }
78
GetRawPtr() const79 struct wl_buffer *WlBuffer::GetRawPtr() const
80 {
81 return buffer;
82 }
83
SetBufferRelease(struct zwp_linux_buffer_release_v1 * br)84 void WlBuffer::SetBufferRelease(struct zwp_linux_buffer_release_v1 *br)
85 {
86 release = br;
87 if (release == nullptr) {
88 return;
89 }
90
91 const struct zwp_linux_buffer_release_v1_listener listener = {
92 WlBuffer::FencedRelease,
93 WlBuffer::ImmediateRelease,
94 };
95 if (zwp_linux_buffer_release_v1_add_listener(release, &listener, this) == -1) {
96 WMLOGFW("zwp_linux_buffer_release_v1_add_listener failed");
97 zwp_linux_buffer_release_v1_destroy(release);
98 release = nullptr;
99 }
100 }
101
OnRelease(IWlBufferReleaseClazz * func)102 void WlBuffer::OnRelease(IWlBufferReleaseClazz *func)
103 {
104 onRelease = func;
105 }
106 } // namespace OHOS
107