1 /*
2 * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development 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 #include "tcuOhosNativeContext.hpp"
16 #include "egluGLContextFactory.hpp"
17 #include "eglwLibrary.hpp"
18 #include "eglwFunctions.hpp"
19 #include "eglwEnums.hpp"
20 #include "deUniquePtr.hpp"
21 #include "tcuCommandLine.hpp"
22 #include "deDynamicLibrary.hpp"
23
24 #include "ohos_context_i.h"
25
26 using namespace tcu;
27 using namespace OHOS_ROSEN;
28 using namespace egl;
29
30 using de::MovePtr;
31 using de::UniquePtr;
32 using eglu::GLContextFactory;
33 using eglu::NativeDisplay;
34 using eglu::NativeDisplayFactory;
35 using eglu::NativePixmap;
36 using eglu::NativePixmapFactory;
37 using eglu::NativeWindow;
38 using eglu::NativeWindowFactory;
39 using eglu::WindowParams;
40 using glu::ContextFactory;
41 using std::string;
42 using tcu::TextureLevel;
43
44 class GLFunctionLoader : public glw::FunctionLoader
45 {
46 public:
GLFunctionLoader(const char * path)47 GLFunctionLoader(const char *path)
48 : m_library(path)
49 {
50 }
51
get(const char * name) const52 glw::GenericFuncType get(const char *name) const
53 {
54 return m_library.getFunction(name);
55 }
56
57 private:
58 de::DynamicLibrary m_library;
59 };
60
OhosRendContext(const glu::RenderConfig & config,const tcu::CommandLine & cmdLine)61 OhosRendContext::OhosRendContext(const glu::RenderConfig &config, const tcu::CommandLine &cmdLine)
62 : m_contextType(config.type)
63 {
64 DE_UNREF(cmdLine);
65
66 printf("~~~~~~~OhosRendContext~~~~~~~~\n");
67 printf("config.width = %d\n", config.width);
68 printf("config.height = %d\n", config.height);
69 printf("config.redBits = %d\n", config.redBits);
70 printf("config.greenBits = %d\n", config.greenBits);
71 printf("config.blueBits = %d\n", config.blueBits);
72 printf("config.alphaBits = %d\n", config.alphaBits);
73 printf("config.depthBits = %d\n", config.depthBits);
74 printf("config.stencilBits = %d\n", config.stencilBits);
75 printf("config.numSamples = %d\n", config.numSamples);
76 printf("config.type.getMajorVersion() = %d\n", config.type.getMajorVersion());
77 printf("config.type.getMinorVersion() = %d\n", config.type.getMinorVersion());
78 printf("~~~~~~~~~~~~~~~\n");
79 // TODO:
80 int32_t w = config.width;
81 int32_t h = config.height;
82 if (w == -1)
83 {
84 w = 512;
85 }
86 if (h == -1)
87 {
88 h = 512;
89 }
90
91 OHOS::RCI_GLES_VERSION ver;
92 if (config.type.getMajorVersion() == 2 && config.type.getMinorVersion() == 0)
93 {
94 ver = OHOS::RCI_GLES_VERSION::V20;
95 }
96 else if (config.type.getMajorVersion() == 3 && config.type.getMinorVersion() == 0)
97 {
98 ver = OHOS::RCI_GLES_VERSION::V30;
99 }
100 else if (config.type.getMajorVersion() == 3 && config.type.getMinorVersion() == 1)
101 {
102 ver = OHOS::RCI_GLES_VERSION::V31;
103 }
104 else if (config.type.getMajorVersion() == 3 && config.type.getMinorVersion() == 2)
105 {
106 ver = OHOS::RCI_GLES_VERSION::V32;
107 }
108 else
109 {
110 throw tcu::NotSupportedError("not support version");
111 }
112
113 OHOS::RCI_PIXEL_FORMAT pf = {
114 .redBits = 8,
115 .greenBits = 8,
116 .blueBits = 8,
117 .alphaBits = 8,
118 .depthBits = 24,
119 .stencilBits = 8,
120 .numSamples = 8,
121 };
122 if (config.redBits != -1)
123 {
124 pf.redBits = config.redBits;
125 }
126 if (config.greenBits != -1)
127 {
128 pf.greenBits = config.greenBits;
129 }
130 if (config.blueBits != -1)
131 {
132 pf.blueBits = config.blueBits;
133 }
134 if (config.alphaBits != -1)
135 {
136 pf.alphaBits = config.alphaBits;
137 }
138 if (config.depthBits != -1)
139 {
140 pf.depthBits = config.depthBits;
141 }
142 if (config.stencilBits != -1)
143 {
144 pf.stencilBits = config.stencilBits;
145 }
146 if (config.numSamples != -1)
147 {
148 pf.numSamples = config.numSamples;
149 }
150
151 OHOS::RCI_SURFACE_TYPE surfaceType;
152 switch (config.surfaceType)
153 {
154 case glu::RenderConfig::SURFACETYPE_DONT_CARE:
155 surfaceType = OHOS::RCI_SURFACE_TYPE::NONE;
156 break;
157 case glu::RenderConfig::SURFACETYPE_OFFSCREEN_NATIVE:
158 surfaceType = OHOS::RCI_SURFACE_TYPE::PIXMAP;
159 break;
160 case glu::RenderConfig::SURFACETYPE_OFFSCREEN_GENERIC:
161 surfaceType = OHOS::RCI_SURFACE_TYPE::PBUFFER;
162 break;
163 case glu::RenderConfig::SURFACETYPE_WINDOW:
164 surfaceType = OHOS::RCI_SURFACE_TYPE::WINDOW;
165 break;
166 case glu::RenderConfig::SURFACETYPE_LAST:
167 TCU_CHECK_INTERNAL(false);
168 }
169
170 OHOS::RCI_PROFILE profile;
171 switch (config.type.getProfile())
172 {
173 case glu::PROFILE_ES:
174 profile = OHOS::RCI_PROFILE::ES;
175 break;
176 case glu::PROFILE_CORE:
177 profile = OHOS::RCI_PROFILE::CORE;
178 break;
179 case glu::PROFILE_COMPATIBILITY:
180 profile = OHOS::RCI_PROFILE::COMPATIBILITY;
181 break;
182 case glu::PROFILE_LAST:
183 TCU_CHECK_INTERNAL(false);
184 }
185
186 int flags = 0;
187 if ((config.type.getFlags() & glu::CONTEXT_DEBUG) != 0)
188 flags |= static_cast<int>(OHOS::RCI_CONTEXT_FLAG::DEBUG);
189
190 if ((config.type.getFlags() & glu::CONTEXT_ROBUST) != 0)
191 flags |= static_cast<int>(OHOS::RCI_CONTEXT_FLAG::ROBUST);
192
193 if ((config.type.getFlags() & glu::CONTEXT_FORWARD_COMPATIBLE) != 0)
194 flags |= static_cast<int>(OHOS::RCI_CONTEXT_FLAG::FORWARD_COMPATIBLE);
195
196 if (!OHOS::OhosContextI::GetInstance().SetConfig(w, h, ver, pf, surfaceType, profile, static_cast<OHOS::RCI_CONTEXT_FLAG>(flags)))
197 {
198 throw tcu::NotSupportedError("not support context");
199 }
200 OHOS::OhosContextI::GetInstance().InitNativeWindow();
201 OHOS::OhosContextI::GetInstance().InitEglSurface();
202 OHOS::OhosContextI::GetInstance().InitEglContext();
203 OHOS::OhosContextI::GetInstance().MakeCurrent();
204
205 GLFunctionLoader loader("libEGL_impl.so");
206 glu::initFunctions(&m_glFunctions, &loader, config.type.getAPI());
207 while(m_glFunctions.getError()!=0)
208 {
209 printf("err pass\n");
210 }
211
212 m_renderTarget = tcu::RenderTarget(512, 512, PixelFormat(8, 8, 8, 8),
213 OHOS::OhosContextI::GetInstance().GetAttrib(EGL_DEPTH_SIZE),
214 OHOS::OhosContextI::GetInstance().GetAttrib(EGL_STENCIL_SIZE),
215 OHOS::OhosContextI::GetInstance().GetAttrib(EGL_SAMPLES));
216 };
217
~OhosRendContext(void)218 OhosRendContext::~OhosRendContext(void)
219 {
220 printf("~~~~~~~DEOhosRendContext~~~~~~~~\n");
221 OHOS::OhosContextI::GetInstance().SwapBuffer();
222 };
223
postIterate(void)224 void OhosRendContext::postIterate(void)
225 {
226 OHOS::OhosContextI::GetInstance().SwapBuffer();
227 }