1 /*
2  * Copyright (c) 2024 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 "ohos_native_buffer_adapter_impl.h"
17 #include "surface_buffer_impl.h"
18 #include "nweb_log.h"
19 
20 #include <EGL/egl.h>
21 #include <EGL/eglext.h>
22 #include <GLES3/gl3.h>
23 
24 namespace OHOS::NWeb {
25 
GetInstance()26 OhosNativeBufferAdapter& OhosNativeBufferAdapterImpl::GetInstance()
27 {
28     WVLOG_D("Native buffer adapter impl get instance.");
29     static OhosNativeBufferAdapterImpl instance;
30     return instance;
31 }
32 
OhosNativeBufferAdapterImpl()33 OhosNativeBufferAdapterImpl::OhosNativeBufferAdapterImpl()
34 {
35     WVLOG_D("Native buffer adapter impl constructor.");
36 }
37 
~OhosNativeBufferAdapterImpl()38 OhosNativeBufferAdapterImpl::~OhosNativeBufferAdapterImpl()
39 {
40     WVLOG_D("Native buffer adapter impl destructor.");
41 }
42 
AcquireBuffer(void * buffer)43 void OhosNativeBufferAdapterImpl::AcquireBuffer(void* buffer)
44 {
45     if (buffer == nullptr) {
46         WVLOG_E("native buffer acquire, buffer is null.");
47         return;
48     }
49     WVLOG_D("native buffer acquired buffer %{public}p.", buffer);
50     OH_NativeBuffer_Reference(static_cast<OH_NativeBuffer*>(buffer));
51 }
52 
Release(void * buffer)53 void OhosNativeBufferAdapterImpl::Release(void* buffer)
54 {
55     if (buffer == nullptr) {
56         WVLOG_E("native buffer release, buffer is null.");
57         return;
58     }
59 
60     WVLOG_D("native buffer release buffer %{public}p.", buffer);
61     if (OH_NativeBuffer_Unreference(static_cast<OH_NativeBuffer*>(buffer)) == 0) {
62         WVLOG_D("native buffer release, unreference buffer.");
63     }
64 }
65 
GetEGLBuffer(void * buffer,void ** eglBuffer)66 int OhosNativeBufferAdapterImpl::GetEGLBuffer(void* buffer, void** eglBuffer)
67 {
68     if (buffer == nullptr) {
69         WVLOG_E("native buffer get egl buffer, buffer is null.");
70         return -1;
71     }
72     WVLOG_D("native buffer GetEGLBuffer %{public}p.", buffer);
73 
74     OHNativeWindowBuffer* nativeWindowBuffer =
75         OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(static_cast<OH_NativeBuffer*>(buffer));
76     if (nativeWindowBuffer == nullptr) {
77         WVLOG_E("native buffer failed to create native window buffer from native buffer.");
78         return -1;
79     } else {
80         WVLOG_D("native buffer create native window buffer from native bufferL %{public}p.", *eglBuffer);
81         *eglBuffer = nativeWindowBuffer;
82         return 0;
83     }
84 }
85 
FreeEGLBuffer(void * eglBuffer)86 int OhosNativeBufferAdapterImpl::FreeEGLBuffer(void* eglBuffer)
87 {
88     if (eglBuffer == nullptr) {
89         WVLOG_E("native buffer free EGLBuffer is null.");
90         return -1;
91     }
92 
93     WVLOG_D("native buffer free EGLBuffer %{public}p", eglBuffer);
94     OH_NativeWindow_NativeObjectUnreference(eglBuffer);
95     return 0;
96 }
97 
NativeBufferFromNativeWindowBuffer(void * nativeWindowBuffer,void ** nativeBuffer)98 int OhosNativeBufferAdapterImpl::NativeBufferFromNativeWindowBuffer(void* nativeWindowBuffer, void** nativeBuffer)
99 {
100     if (nativeWindowBuffer == nullptr) {
101         WVLOG_E("native buffer NativeBufferFromNativeWindowBuffer, native window buffer is null.");
102         return -1;
103     }
104 
105     *nativeBuffer = OH_NativeBufferFromNativeWindowBuffer(static_cast<NativeWindowBuffer*>(nativeWindowBuffer));
106     if (*nativeBuffer == nullptr) {
107         WVLOG_E("native buffer NativeBufferFromNativeWindowBuffer, native buffer is null.");
108         return -1;
109     }
110     WVLOG_D("native buffer NativeBufferFromNativeWindowBuffer %{public}p", nativeWindowBuffer);
111     return 0;
112 }
113 
GetSeqNum(void * nativeBuffer)114 uint32_t OhosNativeBufferAdapterImpl::GetSeqNum(void* nativeBuffer)
115 {
116     if (nativeBuffer == nullptr) {
117         WVLOG_E("native buffer GetSeqNum, nativeBuffer is null.");
118         return 0;
119     }
120     SurfaceBufferImpl* buffer = reinterpret_cast<SurfaceBufferImpl *>(nativeBuffer);
121     return buffer->GetSeqNum();
122 }
123 } // namespace OHOS::NWeb
124