1 /*
2 * Copyright (c) 2021-2022 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 #include "../include/context/webgl2_rendering_context_base.h"
16 #include "../../common/napi/n_func_arg.h"
17 #include "../../common/napi/n_class.h"
18 #include "../include/webgl/webgl_active_info.h"
19 #include "../include/webgl/webgl_shader.h"
20 #include "../include/webgl/webgl_buffer.h"
21 #include "../include/webgl/webgl_framebuffer.h"
22 #include "../include/webgl/webgl_program.h"
23 #include "../include/webgl/webgl_renderbuffer.h"
24 #include "../include/webgl/webgl_texture.h"
25 #include "../include/webgl/webgl_sync.h"
26 #include "../include/webgl/webgl_sampler.h"
27 #include "../include/webgl/webgl_query.h"
28 #include "../include/webgl/webgl_transform_feedback.h"
29 #include "../include/webgl/webgl_uniform_location.h"
30 #include "../include/webgl/webgl_vertex_array_object.h"
31 #include "../include/util/log.h"
32 #include "../include/util/util.h"
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38 namespace OHOS {
39 namespace Rosen {
40 namespace {
41 const int UNIFORM_NAMES_MAX_LENGTH = 1000;
42 }
43 using namespace std;
44
DrawBuffers(napi_env env,napi_callback_info info)45 napi_value WebGL2RenderingContextBase::DrawBuffers(napi_env env, napi_callback_info info)
46 {
47 NFuncArg funcArg(env, info);
48
49 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
50 return nullptr;
51 }
52 LOGI("WebGL2 drawBuffers start");
53 napi_value array = funcArg[NARG_POS::FIRST];
54 bool isArray = false;
55 bool succ = false;
56 tie(succ, isArray) = NVal(env, array).IsArray();
57 if (!isArray || !succ) {
58 return nullptr;
59 }
60 uint32_t length;
61 napi_status lengthStatus = napi_get_array_length(env, array, &length);
62 if (lengthStatus != napi_ok) {
63 return nullptr;
64 }
65 int64_t drawBuffers[length];
66 uint32_t i;
67 for (i = 0; i < length; i++) {
68 napi_value element;
69 napi_status eleStatus = napi_get_element(env, array, i, &element);
70 if (eleStatus != napi_ok) {
71 return nullptr;
72 }
73 int64_t ele;
74 napi_status intStatus = napi_get_value_int64(env, element, &ele);
75 if (intStatus != napi_ok) {
76 return nullptr;
77 }
78 drawBuffers[i] = ele;
79 }
80 glDrawBuffers(static_cast<GLsizei>(length), reinterpret_cast<GLenum *>(drawBuffers));
81 LOGI("WebGL2 drawBuffers end");
82 return nullptr;
83 }
84
ClearBufferfv(napi_env env,napi_callback_info info)85 napi_value WebGL2RenderingContextBase::ClearBufferfv(napi_env env, napi_callback_info info)
86 {
87 NFuncArg funcArg(env, info);
88
89 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FOUR)) {
90 return nullptr;
91 }
92
93 LOGI("WebGL2 clearBufferfv start");
94 bool succ = false;
95 int64_t buffer;
96 tie(succ, buffer) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
97 if (!succ) {
98 return nullptr;
99 }
100 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferfv buffer = %{public}u", buffer);
101 int64_t drawbuffer;
102 tie(succ, drawbuffer) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
103 if (!succ) {
104 return nullptr;
105 }
106 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferfv drawbuffer = %{public}u", drawbuffer);
107
108 if (funcArg[NARG_POS::THIRD] == nullptr) {
109 return nullptr;
110 }
111 int64_t srcOffset = 0;
112 if (funcArg[NARG_POS::FOURTH] != nullptr) {
113 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
114 if (!succ) {
115 return nullptr;
116 }
117 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferfv srcOffset = %{public}u", srcOffset);
118 }
119
120 napi_value array = funcArg[NARG_POS::THIRD];
121 bool isArray = false;
122 tie(succ, isArray) = NVal(env, array).IsArray();
123 if (isArray) {
124 uint32_t length;
125 napi_status lengthStatus = napi_get_array_length(env, array, &length);
126 if (lengthStatus != napi_ok) {
127 return nullptr;
128 }
129 float clearBufferfv[length];
130 uint32_t i;
131 for (i = 0; i < length; i++) {
132 napi_value element;
133 napi_status eleStatus = napi_get_element(env, array, i, &element);
134 if (eleStatus != napi_ok) {
135 return nullptr;
136 }
137 double ele;
138 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
139 if (doubleStatus != napi_ok) {
140 return nullptr;
141 }
142 clearBufferfv[i] = static_cast<float>(ele);
143 }
144 glClearBufferfv(static_cast<GLenum>(buffer), static_cast<GLint>(drawbuffer),
145 reinterpret_cast<GLfloat *>(clearBufferfv + srcOffset));
146 LOGI("WebGL2 clearBufferfv array end");
147 return nullptr;
148 }
149 bool isTypedarray = false;
150 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
151 if (!isTypedarray || !succ) {
152 return nullptr;
153 }
154 void *data = nullptr;
155 size_t length;
156 napi_typedarray_type type;
157 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
158 if (!succ) {
159 return nullptr;
160 }
161 if (type == napi_float32_array) {
162 float inputFloat[INPUTFLOAT_LENGTH] = {0};
163 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
164 if (ret != EOK) {
165 LOGE("WebGL2 clearBufferfv memcpy_s failed");
166 return nullptr;
167 }
168 glClearBufferfv(static_cast<GLenum>(buffer), static_cast<GLint>(drawbuffer),
169 reinterpret_cast<GLfloat *>(inputFloat));
170 }
171 LOGI("WebGL2 clearBufferfv typeArray end");
172 return nullptr;
173 }
174
ClearBufferiv(napi_env env,napi_callback_info info)175 napi_value WebGL2RenderingContextBase::ClearBufferiv(napi_env env, napi_callback_info info)
176 {
177 NFuncArg funcArg(env, info);
178
179 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FOUR)) {
180 return nullptr;
181 }
182
183 LOGI("WebGL2 clearBufferiv start");
184
185 bool succ = false;
186 int64_t buffer;
187 tie(succ, buffer) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
188 if (!succ) {
189 return nullptr;
190 }
191 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferiv buffer = %{public}u", buffer);
192 int64_t drawbuffer;
193 tie(succ, drawbuffer) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
194 if (!succ) {
195 return nullptr;
196 }
197 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferiv drawbuffer = %{public}u", drawbuffer);
198
199 if (funcArg[NARG_POS::THIRD] == nullptr) {
200 return nullptr;
201 }
202 int64_t srcOffset = 0;
203 if (funcArg[NARG_POS::FOURTH] != nullptr) {
204 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
205 if (!succ) {
206 return nullptr;
207 }
208 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferiv srcOffset = %{public}u", srcOffset);
209 }
210
211 napi_value array = funcArg[NARG_POS::THIRD];
212 bool isArray = false;
213 tie(succ, isArray) = NVal(env, array).IsArray();
214 if (isArray) {
215 uint32_t length;
216 napi_status lengthStatus = napi_get_array_length(env, array, &length);
217 if (lengthStatus != napi_ok) {
218 return nullptr;
219 }
220 int64_t clearBufferiv[length];
221 uint32_t i;
222 for (i = 0; i < length; i++) {
223 napi_value element;
224 napi_status eleStatus = napi_get_element(env, array, i, &element);
225 if (eleStatus != napi_ok) {
226 return nullptr;
227 }
228 int64_t ele;
229 napi_status intStatus = napi_get_value_int64(env, element, &ele);
230 if (intStatus != napi_ok) {
231 return nullptr;
232 }
233 clearBufferiv[i] = ele;
234 }
235 glClearBufferiv(static_cast<GLenum>(buffer), static_cast<GLint>(drawbuffer),
236 reinterpret_cast<GLint *>(clearBufferiv + srcOffset));
237 LOGI("WebGL2 clearBufferiv array end");
238 return nullptr;
239 }
240 bool isTypedarray = false;
241 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
242 if (!isTypedarray || !succ) {
243 return nullptr;
244 }
245 void *data = nullptr;
246 size_t length;
247 napi_typedarray_type type;
248 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
249 if (!succ) {
250 return nullptr;
251 }
252 if (type == napi_int8_array) {
253 int8_t* inputInt8 = reinterpret_cast<int8_t*>(reinterpret_cast<uint8_t*>(data) + srcOffset);
254 glClearBufferiv(static_cast<GLenum>(buffer), static_cast<GLint>(drawbuffer),
255 reinterpret_cast<GLint *>(inputInt8));
256 }
257 LOGI("WebGL2 clearBufferiv typeArray end");
258 return nullptr;
259 }
260
ClearBufferuiv(napi_env env,napi_callback_info info)261 napi_value WebGL2RenderingContextBase::ClearBufferuiv(napi_env env, napi_callback_info info)
262 {
263 NFuncArg funcArg(env, info);
264
265 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FOUR)) {
266 return nullptr;
267 }
268
269 LOGI("WebGL2 clearBufferuiv start");
270
271 bool succ = false;
272 int64_t buffer;
273 tie(succ, buffer) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
274 if (!succ) {
275 return nullptr;
276 }
277 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferuiv buffer = %{public}u", buffer);
278 int64_t drawbuffer;
279 tie(succ, drawbuffer) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
280 if (!succ) {
281 return nullptr;
282 }
283 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferuiv drawbuffer = %{public}u", drawbuffer);
284
285 if (funcArg[NARG_POS::THIRD] == nullptr) {
286 return nullptr;
287 }
288 int64_t srcOffset = 0;
289 if (funcArg[NARG_POS::FOURTH] != nullptr) {
290 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
291 if (!succ) {
292 return nullptr;
293 }
294 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferuiv srcOffset = %{public}u", srcOffset);
295 }
296
297 napi_value array = funcArg[NARG_POS::THIRD];
298 bool isArray = false;
299 tie(succ, isArray) = NVal(env, array).IsArray();
300 if (isArray) {
301 uint32_t length;
302 napi_status lengthStatus = napi_get_array_length(env, array, &length);
303 if (lengthStatus != napi_ok) {
304 return nullptr;
305 }
306 uint32_t clearBufferuiv[length];
307 uint32_t i;
308 for (i = 0; i < length; i++) {
309 napi_value element;
310 napi_status eleStatus = napi_get_element(env, array, i, &element);
311 if (eleStatus != napi_ok) {
312 return nullptr;
313 }
314 uint32_t ele;
315 napi_status uintStatus = napi_get_value_uint32(env, element, &ele);
316 if (uintStatus != napi_ok) {
317 return nullptr;
318 }
319 clearBufferuiv[i] = ele;
320 }
321 glClearBufferuiv(static_cast<GLenum>(buffer), static_cast<GLint>(drawbuffer),
322 reinterpret_cast<GLuint *>(clearBufferuiv + srcOffset));
323 LOGI("WebGL2 clearBufferuiv array end");
324 return nullptr;
325 }
326 bool isTypedarray = false;
327 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
328 if (!isTypedarray || !succ) {
329 return nullptr;
330 }
331 void *data = nullptr;
332 size_t length;
333 napi_typedarray_type type;
334 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
335 if (!succ) {
336 return nullptr;
337 }
338 if (type == napi_int8_array) {
339 uint8_t* inputUint8 = reinterpret_cast<uint8_t*>(reinterpret_cast<uint8_t*>(data) + srcOffset);
340 glClearBufferuiv(static_cast<GLenum>(buffer), static_cast<GLint>(drawbuffer),
341 reinterpret_cast<GLuint *>(inputUint8));
342 }
343
344 LOGI("WebGL2 clearBufferuiv typeArray end");
345 return nullptr;
346 }
347
ClearBufferfi(napi_env env,napi_callback_info info)348 napi_value WebGL2RenderingContextBase::ClearBufferfi(napi_env env, napi_callback_info info)
349 {
350 NFuncArg funcArg(env, info);
351
352 if (!funcArg.InitArgs(NARG_CNT::FOUR)) {
353 return nullptr;
354 }
355 bool succ = false;
356 LOGI("WebGL2 clearBufferfi start");
357 int64_t buffer;
358 tie(succ, buffer) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
359 if (!succ) {
360 return nullptr;
361 }
362 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferfi buffer = %{public}u", buffer);
363 int64_t drawbuffer;
364 tie(succ, drawbuffer) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
365 if (!succ) {
366 return nullptr;
367 }
368 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferfi drawbuffer = %{public}u", drawbuffer);
369 double depth;
370 tie(succ, depth) = NVal(env, funcArg[NARG_POS::THIRD]).ToDouble();
371 if (!succ) {
372 return nullptr;
373 }
374
375 int64_t stencil;
376 tie(succ, stencil) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
377 if (!succ) {
378 return nullptr;
379 }
380 LOGI("WebGL2 WebGL2RenderingContextBase::clearBufferfi stencil = %{public}u", stencil);
381 glClearBufferfi(static_cast<GLenum>(buffer), static_cast<GLint>(drawbuffer),
382 static_cast<GLfloat>((float) depth), static_cast<GLint>(stencil));
383 LOGI("WebGL2 clearBufferfi end");
384 return nullptr;
385 }
386
CreateQuery(napi_env env,napi_callback_info info)387 napi_value WebGL2RenderingContextBase::CreateQuery(napi_env env, napi_callback_info info)
388 {
389 LOGI("WebGL2 createQuery start");
390 napi_value objQuery = NClass::InstantiateClass(env, WebGLQuery::className, {});
391 if (!objQuery) {
392 return nullptr;
393 }
394 auto webGlQuery = NClass::GetEntityOf<WebGLQuery>(env, objQuery);
395 if (!webGlQuery) {
396 return nullptr;
397 }
398 unsigned int queryId;
399 glGenQueries(1, &queryId);
400 webGlQuery->SetQuery(queryId);
401 LOGI("WebGL2 WebGL2RenderingContextBase::createQuery queryId = %{public}u", queryId);
402 LOGI("WebGL2 createQuery end");
403 return objQuery;
404 }
405
DeleteQuery(napi_env env,napi_callback_info info)406 napi_value WebGL2RenderingContextBase::DeleteQuery(napi_env env, napi_callback_info info)
407 {
408 NFuncArg funcArg(env, info);
409
410 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
411 return nullptr;
412 }
413 LOGI("WebGL2 deleteQuery start");
414 if (funcArg[NARG_POS::FIRST] == nullptr) {
415 return nullptr;
416 }
417
418 WebGLQuery *webGlQuery = nullptr;
419 napi_status queryStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlQuery);
420 if (queryStatus != napi_ok) {
421 return nullptr;
422 }
423 unsigned int query = webGlQuery->GetQuery();
424
425 glDeleteQueries(1, &query);
426 LOGI("WebGL2 deleteQuery end");
427 return nullptr;
428 }
429
IsQuery(napi_env env,napi_callback_info info)430 napi_value WebGL2RenderingContextBase::IsQuery(napi_env env, napi_callback_info info)
431 {
432 NFuncArg funcArg(env, info);
433
434 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
435 return NVal::CreateBool(env, false).val_;
436 }
437 LOGI("WebGL2 isQuery start");
438 if (funcArg[NARG_POS::FIRST] == nullptr) {
439 return NVal::CreateBool(env, false).val_;
440 }
441
442 WebGLQuery *webGlQuery = nullptr;
443 napi_status queryStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlQuery);
444 if (queryStatus != napi_ok) {
445 return NVal::CreateBool(env, false).val_;
446 }
447 unsigned int query = webGlQuery->GetQuery();
448
449 GLboolean returnValue = glIsQuery(static_cast<GLuint>(query));
450 bool res = static_cast<bool>(returnValue);
451 LOGI("WebGL2 isQuery end");
452 return NVal::CreateBool(env, res).val_;
453 }
454
BeginQuery(napi_env env,napi_callback_info info)455 napi_value WebGL2RenderingContextBase::BeginQuery(napi_env env, napi_callback_info info)
456 {
457 NFuncArg funcArg(env, info);
458
459 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
460 return nullptr;
461 }
462 bool succ = false;
463 LOGI("WebGL2 beginQuery start");
464 int64_t target;
465 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
466 if (!succ) {
467 return nullptr;
468 }
469 LOGI("WebGL2 WebGL2RenderingContextBase::BeginQuery target = %{public}u", target);
470
471 if (funcArg[NARG_POS::SECOND] == nullptr) {
472 return nullptr;
473 }
474
475 WebGLQuery *webGlQuery = nullptr;
476 napi_status queryStatus = napi_unwrap(env, funcArg[NARG_POS::SECOND], (void **) &webGlQuery);
477 if (queryStatus != napi_ok) {
478 return nullptr;
479 }
480 unsigned int query = webGlQuery->GetQuery();
481
482 WebGL2RenderingContextBase *obj = reinterpret_cast<WebGL2RenderingContextBase *>(Util::GetContextObject(env,
483 funcArg.GetThisVar(), "webgl2"));
484 if (obj == nullptr) {
485 return nullptr;
486 }
487
488 obj->queryMaps.insert({ static_cast<GLenum>(target), static_cast<GLuint>(query) });
489
490 glBeginQuery(static_cast<GLenum>(target), static_cast<GLuint>(query));
491 LOGI("WebGL2 beginQuery end");
492 return nullptr;
493 }
494
EndQuery(napi_env env,napi_callback_info info)495 napi_value WebGL2RenderingContextBase::EndQuery(napi_env env, napi_callback_info info)
496 {
497 NFuncArg funcArg(env, info);
498
499 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
500 return nullptr;
501 }
502 bool succ = false;
503 LOGI("WebGL2 endQuery start");
504 int64_t target;
505 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
506 if (!succ) {
507 return nullptr;
508 }
509 LOGI("WebGL2 WebGL2RenderingContextBase::endQuery target = %{public}u", target);
510
511 WebGL2RenderingContextBase *obj = reinterpret_cast<WebGL2RenderingContextBase *>(Util::GetContextObject(env,
512 funcArg.GetThisVar(), "webgl2"));
513 if (obj == nullptr) {
514 return nullptr;
515 }
516 obj->queryMaps.erase(static_cast<GLenum>(target));
517
518 glEndQuery(static_cast<GLenum>(target));
519 LOGI("WebGL2 endQuery end");
520 return nullptr;
521 }
522
GetQuery(napi_env env,napi_callback_info info)523 napi_value WebGL2RenderingContextBase::GetQuery(napi_env env, napi_callback_info info)
524 {
525 NFuncArg funcArg(env, info);
526
527 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
528 return nullptr;
529 }
530 bool succ = false;
531 LOGI("WebGL2 getQuery start");
532 int64_t target;
533 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
534 if (!succ) {
535 return nullptr;
536 }
537 LOGI("WebGL2 WebGL2RenderingContextBase::getQuery target = %{public}u", target);
538
539 int64_t pName;
540 tie(succ, pName) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
541 if (!succ) {
542 return nullptr;
543 }
544 LOGI("WebGL2 WebGL2RenderingContextBase::getQuery pName = %{public}u", pName);
545
546 WebGL2RenderingContextBase *obj = reinterpret_cast<WebGL2RenderingContextBase *>(Util::GetContextObject(env,
547 funcArg.GetThisVar(), "webgl2"));
548 if (obj == nullptr) {
549 return nullptr;
550 }
551 auto objects = obj->queryMaps;
552 auto it = objects.find(static_cast<GLenum>(target));
553 if (it == objects.end()) {
554 return NVal::CreateNull(env).val_;
555 }
556 GLint params;
557 glGetQueryiv(static_cast<GLenum>(target), static_cast<GLenum>(pName), ¶ms);
558 napi_value objQuery = NClass::InstantiateClass(env, WebGLQuery::className, {});
559 if (!objQuery) {
560 return nullptr;
561 }
562 auto webGlQuery = NClass::GetEntityOf<WebGLQuery>(env, objQuery);
563 if (!webGlQuery) {
564 return nullptr;
565 }
566 webGlQuery->SetQuery(it->second);
567 LOGI("WebGL2 getQuery end");
568 return objQuery;
569 }
570
GetQueryParameter(napi_env env,napi_callback_info info)571 napi_value WebGL2RenderingContextBase::GetQueryParameter(napi_env env, napi_callback_info info)
572 {
573 NFuncArg funcArg(env, info);
574
575 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
576 return nullptr;
577 }
578
579 if (funcArg[NARG_POS::FIRST] == nullptr) {
580 return nullptr;
581 }
582 LOGI("WebGL2 getQueryParameter start");
583 WebGLSampler *webGlSampler = nullptr;
584 napi_status samplerStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSampler);
585 if (samplerStatus != napi_ok) {
586 return nullptr;
587 }
588 unsigned int sampler = webGlSampler->GetSampler();
589
590 bool succ = false;
591 int64_t pName;
592 tie(succ, pName) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
593 if (!succ) {
594 return nullptr;
595 }
596 LOGI("WebGL2 WebGL2RenderingContextBase::getQueryParameter pName = %{public}u", pName);
597 GLuint params;
598 glGetQueryObjectuiv(static_cast<GLuint>(sampler), static_cast<GLenum>(pName), ¶ms);
599 if (pName == GL_QUERY_RESULT) {
600 int64_t res = static_cast<int64_t>(params);
601 LOGI("WebGL2 getQueryParameter end");
602 return NVal::CreateInt64(env, res).val_;
603 } else if (pName == GL_QUERY_RESULT_AVAILABLE) {
604 bool res = (params == GL_FALSE) ? false : true;
605 LOGI("WebGL2 getQueryParameter end");
606 return NVal::CreateBool(env, res).val_;
607 } else {
608 return nullptr;
609 }
610 }
611
CreateSampler(napi_env env,napi_callback_info info)612 napi_value WebGL2RenderingContextBase::CreateSampler(napi_env env, napi_callback_info info)
613 {
614 LOGI("WebGL2 createSampler start");
615 napi_value objSampler = NClass::InstantiateClass(env, WebGLSampler::className, {});
616 if (!objSampler) {
617 return nullptr;
618 }
619 auto webGlSampler = NClass::GetEntityOf<WebGLSampler>(env, objSampler);
620 if (!webGlSampler) {
621 return nullptr;
622 }
623 unsigned int samplerId;
624 glGenSamplers(1, &samplerId);
625 webGlSampler->SetSampler(samplerId);
626 LOGI("WebGL2 WebGL2RenderingContextBase::createSampler samplerId = %{public}u", samplerId);
627 LOGI("WebGL2 createSampler end");
628 return objSampler;
629 }
630
DeleteSampler(napi_env env,napi_callback_info info)631 napi_value WebGL2RenderingContextBase::DeleteSampler(napi_env env, napi_callback_info info)
632 {
633 NFuncArg funcArg(env, info);
634
635 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
636 return nullptr;
637 }
638 LOGI("WebGL2 deleteSampler start");
639 if (funcArg[NARG_POS::FIRST] == nullptr) {
640 return nullptr;
641 }
642
643 WebGLSampler *webGlSampler = nullptr;
644 napi_status samplerStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSampler);
645 if (samplerStatus != napi_ok) {
646 return nullptr;
647 }
648 unsigned int sampler = webGlSampler->GetSampler();
649
650 glDeleteSamplers(1, &sampler);
651 LOGI("WebGL2 deleteSampler end");
652 return nullptr;
653 }
654
IsSampler(napi_env env,napi_callback_info info)655 napi_value WebGL2RenderingContextBase::IsSampler(napi_env env, napi_callback_info info)
656 {
657 NFuncArg funcArg(env, info);
658
659 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
660 return NVal::CreateBool(env, false).val_;
661 }
662 LOGI("WebGL2 isSampler start");
663 if (funcArg[NARG_POS::FIRST] == nullptr) {
664 return NVal::CreateBool(env, false).val_;
665 }
666
667 WebGLSampler *webGlSampler = nullptr;
668 napi_status samplerStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSampler);
669 if (samplerStatus != napi_ok) {
670 return NVal::CreateBool(env, false).val_;
671 }
672 unsigned int sampler = webGlSampler->GetSampler();
673
674 GLboolean returnValue = glIsSampler(static_cast<GLuint>(sampler));
675 bool res = static_cast<bool>(returnValue);
676 LOGI("WebGL2 isSampler end");
677 return NVal::CreateBool(env, res).val_;
678 }
679
BindSampler(napi_env env,napi_callback_info info)680 napi_value WebGL2RenderingContextBase::BindSampler(napi_env env, napi_callback_info info)
681 {
682 NFuncArg funcArg(env, info);
683
684 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
685 return nullptr;
686 }
687 bool succ = false;
688 LOGI("WebGL2 bindSampler start");
689 int64_t unit;
690 tie(succ, unit) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
691 if (!succ) {
692 return nullptr;
693 }
694 LOGI("WebGL2 WebGL2RenderingContextBase::bindSampler unit = %{public}u", unit);
695
696 if (funcArg[NARG_POS::SECOND] == nullptr) {
697 return nullptr;
698 }
699
700 WebGLSampler *webGlSampler = nullptr;
701 napi_status samplerStatus = napi_unwrap(env, funcArg[NARG_POS::SECOND], (void **) &webGlSampler);
702 if (samplerStatus != napi_ok) {
703 return nullptr;
704 }
705 unsigned int sampler = webGlSampler->GetSampler();
706 glBindSampler(static_cast<GLuint>(unit), static_cast<GLuint>(sampler));
707 LOGI("WebGL2 bindSampler end");
708 return nullptr;
709 }
710
SamplerParameteri(napi_env env,napi_callback_info info)711 napi_value WebGL2RenderingContextBase::SamplerParameteri(napi_env env, napi_callback_info info)
712 {
713 NFuncArg funcArg(env, info);
714
715 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
716 return nullptr;
717 }
718
719 if (funcArg[NARG_POS::FIRST] == nullptr) {
720 return nullptr;
721 }
722 LOGI("WebGL2 samplerParameteri start");
723 WebGLSampler *webGlSampler = nullptr;
724 napi_status samplerStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSampler);
725 if (samplerStatus != napi_ok) {
726 return nullptr;
727 }
728 unsigned int sampler = webGlSampler->GetSampler();
729
730 bool succ = false;
731 int64_t pName;
732 tie(succ, pName) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
733 if (!succ) {
734 return nullptr;
735 }
736 LOGI("WebGL2 WebGL2RenderingContextBase::samplerParameteri pName = %{public}u", pName);
737 int64_t param;
738 tie(succ, param) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
739 if (!succ) {
740 return nullptr;
741 }
742 LOGI("WebGL2 WebGL2RenderingContextBase::samplerParameteri param = %{public}u", param);
743 glSamplerParameteri(static_cast<GLuint>(sampler), static_cast<GLenum>(pName), static_cast<GLint>(param));
744 LOGI("WebGL2 samplerParameteri end");
745 return nullptr;
746 }
747
SamplerParameterf(napi_env env,napi_callback_info info)748 napi_value WebGL2RenderingContextBase::SamplerParameterf(napi_env env, napi_callback_info info)
749 {
750 NFuncArg funcArg(env, info);
751
752 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
753 return nullptr;
754 }
755
756 if (funcArg[NARG_POS::FIRST] == nullptr) {
757 return nullptr;
758 }
759 LOGI("WebGL2 samplerParameterf start");
760 WebGLSampler *webGlSampler = nullptr;
761 napi_status samplerStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSampler);
762 if (samplerStatus != napi_ok) {
763 return nullptr;
764 }
765 unsigned int sampler = webGlSampler->GetSampler();
766
767 bool succ = false;
768 int64_t pName;
769 tie(succ, pName) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
770 if (!succ) {
771 return nullptr;
772 }
773 LOGI("WebGL2 WebGL2RenderingContextBase::samplerParameterf pName = %{public}u", pName);
774 double param;
775 tie(succ, param) = NVal(env, funcArg[NARG_POS::THIRD]).ToDouble();
776 if (!succ) {
777 return nullptr;
778 }
779 glSamplerParameterf(static_cast<GLuint>(sampler), static_cast<GLenum>(pName),
780 static_cast<GLfloat>((float) param));
781 LOGI("WebGL2 samplerParameterf end");
782 return nullptr;
783 }
784
GetSamplerParameter(napi_env env,napi_callback_info info)785 napi_value WebGL2RenderingContextBase::GetSamplerParameter(napi_env env, napi_callback_info info)
786 {
787 NFuncArg funcArg(env, info);
788
789 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
790 return nullptr;
791 }
792
793 if (funcArg[NARG_POS::FIRST] == nullptr) {
794 return nullptr;
795 }
796 LOGI("WebGL2 getSamplerParameter start");
797 WebGLSampler *webGlSampler = nullptr;
798 napi_status samplerStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSampler);
799 if (samplerStatus != napi_ok) {
800 return nullptr;
801 }
802 unsigned int sampler = webGlSampler->GetSampler();
803
804 bool succ = false;
805 int64_t pName;
806 tie(succ, pName) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
807 if (!succ) {
808 return nullptr;
809 }
810 LOGI("WebGL2 WebGL2RenderingContextBase::getSamplerParameter pName = %{public}u", pName);
811 if (pName == GL_TEXTURE_MAX_LOD || pName == GL_TEXTURE_MIN_LOD) {
812 GLfloat params;
813 glGetSamplerParameterfv(static_cast<GLuint>(sampler), static_cast<GLenum>(pName), ¶ms);
814 float res = static_cast<float>(params);
815 LOGI("WebGL2 getSamplerParameter end");
816 return NVal::CreateDouble(env, (double) res).val_;
817 } else {
818 GLint params;
819 glGetSamplerParameteriv(static_cast<GLuint>(sampler), static_cast<GLenum>(pName), ¶ms);
820 int64_t res = static_cast<int64_t>(params);
821 LOGI("WebGL2 getSamplerParameter end");
822 return NVal::CreateInt64(env, res).val_;
823 }
824 }
825
FenceSync(napi_env env,napi_callback_info info)826 napi_value WebGL2RenderingContextBase::FenceSync(napi_env env, napi_callback_info info)
827 {
828 NFuncArg funcArg(env, info);
829
830 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
831 return nullptr;
832 }
833 bool succ = false;
834 LOGI("WebGL2 fenceSync start");
835 int64_t condition;
836 tie(succ, condition) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
837 if (!succ) {
838 return nullptr;
839 }
840 LOGI("WebGL2 WebGL2RenderingContextBase::fenceSync condition = %{public}u", condition);
841
842 int64_t flags;
843 tie(succ, flags) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
844 if (!succ) {
845 return nullptr;
846 }
847 LOGI("WebGL2 WebGL2RenderingContextBase::fenceSync flags = %{public}u", flags);
848
849 napi_value objSync = NClass::InstantiateClass(env, WebGLSync::className, {});
850 if (!objSync) {
851 return nullptr;
852 }
853 auto webGlSync = NClass::GetEntityOf<WebGLSync>(env, objSync);
854 if (!webGlSync) {
855 return nullptr;
856 }
857 GLsync returnValue = glFenceSync(static_cast<GLenum>(condition), static_cast<GLbitfield>(flags));
858 long value = reinterpret_cast<long>(returnValue);
859 webGlSync->SetSync(value);
860 LOGI("WebGL2 fenceSync end");
861 return objSync;
862 }
863
IsSync(napi_env env,napi_callback_info info)864 napi_value WebGL2RenderingContextBase::IsSync(napi_env env, napi_callback_info info)
865 {
866 NFuncArg funcArg(env, info);
867
868 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
869 return NVal::CreateBool(env, false).val_;
870 }
871 LOGI("WebGL2 isSync start");
872 if (funcArg[NARG_POS::FIRST] == nullptr) {
873 return NVal::CreateBool(env, false).val_;
874 }
875
876 WebGLSync *webGlSync = nullptr;
877 napi_status syncStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSync);
878 if (syncStatus != napi_ok) {
879 return NVal::CreateBool(env, false).val_;
880 }
881 long sync = webGlSync->GetSync();
882
883 GLboolean returnValue = glIsSync(reinterpret_cast<GLsync>(sync));
884 bool res = static_cast<bool>(returnValue);
885 LOGI("WebGL2 isSync end");
886 return NVal::CreateBool(env, res).val_;
887 }
888
DeleteSync(napi_env env,napi_callback_info info)889 napi_value WebGL2RenderingContextBase::DeleteSync(napi_env env, napi_callback_info info)
890 {
891 NFuncArg funcArg(env, info);
892
893 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
894 return nullptr;
895 }
896 LOGI("WebGL2 deleteSync start");
897 if (funcArg[NARG_POS::FIRST] == nullptr) {
898 return nullptr;
899 }
900
901 WebGLSync *webGlSync = nullptr;
902 napi_status syncStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSync);
903 if (syncStatus != napi_ok) {
904 return nullptr;
905 }
906 long sync = webGlSync->GetSync();
907
908 glDeleteSync(reinterpret_cast<GLsync>(sync));
909 LOGI("WebGL2 deleteSync end");
910 return nullptr;
911 }
912
ClientWaitSync(napi_env env,napi_callback_info info)913 napi_value WebGL2RenderingContextBase::ClientWaitSync(napi_env env, napi_callback_info info)
914 {
915 NFuncArg funcArg(env, info);
916 int res = 0;
917 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
918 return NVal::CreateInt64(env, res).val_;
919 }
920
921 if (funcArg[NARG_POS::FIRST] == nullptr) {
922 return NVal::CreateInt64(env, res).val_;
923 }
924 LOGI("WebGL2 clientWaitSync start");
925 WebGLSync *webGlSync = nullptr;
926 napi_status syncStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSync);
927 if (syncStatus != napi_ok) {
928 return NVal::CreateInt64(env, res).val_;
929 }
930 long sync = webGlSync->GetSync();
931
932 bool succ = false;
933 int64_t flags;
934 tie(succ, flags) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
935 if (!succ) {
936 return NVal::CreateInt64(env, res).val_;
937 }
938 LOGI("WebGL2 WebGL2RenderingContextBase::clientWaitSync flags = %{public}u", flags);
939 int64_t timeout;
940 tie(succ, timeout) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
941 if (!succ) {
942 return NVal::CreateInt64(env, res).val_;
943 }
944 LOGI("WebGL2 WebGL2RenderingContextBase::clientWaitSync timeout = %{public}u", timeout);
945 GLenum returnValue = glClientWaitSync(reinterpret_cast<GLsync>(sync), static_cast<GLbitfield>(flags),
946 static_cast<GLuint64>(timeout));
947 res = static_cast<int>(returnValue);
948 LOGI("WebGL2 clientWaitSync end");
949 return NVal::CreateInt64(env, res).val_;
950 }
951
WaitSync(napi_env env,napi_callback_info info)952 napi_value WebGL2RenderingContextBase::WaitSync(napi_env env, napi_callback_info info)
953 {
954 NFuncArg funcArg(env, info);
955
956 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
957 return nullptr;
958 }
959
960 if (funcArg[NARG_POS::FIRST] == nullptr) {
961 return nullptr;
962 }
963 LOGI("WebGL2 waitSync start");
964 WebGLSync *webGlSync = nullptr;
965 napi_status syncStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSync);
966 if (syncStatus != napi_ok) {
967 return nullptr;
968 }
969 long sync = webGlSync->GetSync();
970
971 bool succ = false;
972 int64_t flags;
973 tie(succ, flags) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
974 if (!succ) {
975 return nullptr;
976 }
977 LOGI("WebGL2 WebGL2RenderingContextBase::waitSync flags = %{public}u", flags);
978 int64_t timeout;
979 tie(succ, timeout) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
980 if (!succ) {
981 return nullptr;
982 }
983 LOGI("WebGL2 WebGL2RenderingContextBase::waitSync timeout = %{public}u", timeout);
984 glWaitSync(reinterpret_cast<GLsync>(sync), static_cast<GLbitfield>(flags),
985 static_cast<GLuint64>(timeout));
986 LOGI("WebGL2 waitSync end");
987 return nullptr;
988 }
989
GetSyncParameter(napi_env env,napi_callback_info info)990 napi_value WebGL2RenderingContextBase::GetSyncParameter(napi_env env, napi_callback_info info)
991 {
992 NFuncArg funcArg(env, info);
993
994 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
995 return nullptr;
996 }
997
998 if (funcArg[NARG_POS::FIRST] == nullptr) {
999 return nullptr;
1000 }
1001 LOGI("WebGL2 getSyncParameter start");
1002 WebGLSync *webGlSync = nullptr;
1003 napi_status syncStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlSync);
1004 if (syncStatus != napi_ok) {
1005 return nullptr;
1006 }
1007 long sync = webGlSync->GetSync();
1008
1009 bool succ = false;
1010 int64_t pname;
1011 tie(succ, pname) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
1012 if (!succ) {
1013 return nullptr;
1014 }
1015 LOGI("WebGL2 WebGL2RenderingContextBase::getSyncParameter pname = %{public}u", pname);
1016 GLint status;
1017 glGetSynciv(reinterpret_cast<GLsync>(sync), static_cast<GLenum>(pname),
1018 sizeof(GLint), nullptr, &status);
1019 int res = static_cast<int>(status);
1020 LOGI("WebGL2 getSyncParameter end");
1021 return NVal::CreateInt64(env, res).val_;
1022 }
1023
CreateTransformFeedback(napi_env env,napi_callback_info info)1024 napi_value WebGL2RenderingContextBase::CreateTransformFeedback(napi_env env, napi_callback_info info)
1025 {
1026 LOGI("WebGL2 createTransformFeedback start");
1027 napi_value objTransformFeedback = NClass::InstantiateClass(env, WebGLTransformFeedback::className, {});
1028 if (!objTransformFeedback) {
1029 return nullptr;
1030 }
1031 auto webGlTransformFeedback = NClass::GetEntityOf<WebGLTransformFeedback>(env, objTransformFeedback);
1032 if (!webGlTransformFeedback) {
1033 return nullptr;
1034 }
1035 unsigned int transformFeedbackId;
1036 glGenTransformFeedbacks(1, &transformFeedbackId);
1037 webGlTransformFeedback->SetTransformFeedback(transformFeedbackId);
1038 LOGI("WebGL2 createTransformFeedback end");
1039 return objTransformFeedback;
1040 }
1041
DeleteTransformFeedback(napi_env env,napi_callback_info info)1042 napi_value WebGL2RenderingContextBase::DeleteTransformFeedback(napi_env env, napi_callback_info info)
1043 {
1044 NFuncArg funcArg(env, info);
1045
1046 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
1047 return nullptr;
1048 }
1049 LOGI("WebGL2 deleteTransformFeedback start");
1050 if (funcArg[NARG_POS::FIRST] == nullptr) {
1051 return nullptr;
1052 }
1053
1054 WebGLTransformFeedback *webGlTransformFeedback = nullptr;
1055 napi_status transformFeedbackStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST],
1056 (void **)&webGlTransformFeedback);
1057 if (transformFeedbackStatus != napi_ok) {
1058 return nullptr;
1059 }
1060 unsigned int transformFeedback = static_cast<unsigned int>(webGlTransformFeedback->GetTransformFeedback());
1061
1062 glDeleteTransformFeedbacks(1, &transformFeedback);
1063 LOGI("WebGL2 deleteTransformFeedback end");
1064 return nullptr;
1065 }
1066
IsTransformFeedback(napi_env env,napi_callback_info info)1067 napi_value WebGL2RenderingContextBase::IsTransformFeedback(napi_env env, napi_callback_info info)
1068 {
1069 NFuncArg funcArg(env, info);
1070
1071 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
1072 return NVal::CreateBool(env, false).val_;
1073 }
1074 LOGI("WebGL2 isTransformFeedback start");
1075 if (funcArg[NARG_POS::FIRST] == nullptr) {
1076 return NVal::CreateBool(env, false).val_;
1077 }
1078
1079 WebGLTransformFeedback *webGlTransformFeedback = nullptr;
1080 napi_status transformFeedbackStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST],
1081 (void **) &webGlTransformFeedback);
1082 if (transformFeedbackStatus != napi_ok) {
1083 return NVal::CreateBool(env, false).val_;
1084 }
1085 unsigned int transformFeedback = static_cast<unsigned int>(webGlTransformFeedback->GetTransformFeedback());
1086
1087 GLboolean returnValue = glIsTransformFeedback(static_cast<GLuint>(transformFeedback));
1088 bool res = static_cast<bool>(returnValue);
1089 LOGI("WebGL2 isTransformFeedback end");
1090 return NVal::CreateBool(env, res).val_;
1091 }
1092
BindTransformFeedback(napi_env env,napi_callback_info info)1093 napi_value WebGL2RenderingContextBase::BindTransformFeedback(napi_env env, napi_callback_info info)
1094 {
1095 NFuncArg funcArg(env, info);
1096
1097 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
1098 return nullptr;
1099 }
1100 bool succ = false;
1101 LOGI("WebGL2 bindTransformFeedback start");
1102 int64_t target;
1103 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
1104 if (!succ) {
1105 return nullptr;
1106 }
1107 WebGLTransformFeedback *webGlTransformFeedback = nullptr;
1108 napi_status transformFeedbackStatus = napi_unwrap(env, funcArg[NARG_POS::SECOND],
1109 (void **) &webGlTransformFeedback);
1110 if (transformFeedbackStatus != napi_ok) {
1111 return nullptr;
1112 }
1113 unsigned int transformFeedback = static_cast<unsigned int>(webGlTransformFeedback->GetTransformFeedback());
1114
1115 glBindTransformFeedback(static_cast<GLenum>(target), static_cast<GLuint>(transformFeedback));
1116 LOGI("WebGL2 bindTransformFeedback end");
1117 return nullptr;
1118 }
1119
BeginTransformFeedback(napi_env env,napi_callback_info info)1120 napi_value WebGL2RenderingContextBase::BeginTransformFeedback(napi_env env, napi_callback_info info)
1121 {
1122 NFuncArg funcArg(env, info);
1123
1124 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
1125 return nullptr;
1126 }
1127 bool succ = false;
1128 LOGI("WebGL2 beginTransformFeedback start");
1129 int64_t primitiveMode;
1130 tie(succ, primitiveMode) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
1131 if (!succ) {
1132 return nullptr;
1133 }
1134 LOGI("WebGL2 WebGL2RenderingContextBase::beginTransformFeedback primitiveMode = %{public}u", primitiveMode);
1135 glBeginTransformFeedback(static_cast<GLenum>(primitiveMode));
1136 LOGI("WebGL2 beginTransformFeedback end");
1137 return nullptr;
1138 }
1139
EndTransformFeedback(napi_env env,napi_callback_info info)1140 napi_value WebGL2RenderingContextBase::EndTransformFeedback(napi_env env, napi_callback_info info)
1141 {
1142 LOGI("WebGL2 endTransformFeedback start");
1143 glEndTransformFeedback();
1144 LOGI("WebGL2 cullendTransformFeedbackFace end");
1145 return nullptr;
1146 }
1147
TexStorage3D(napi_env env,napi_callback_info info)1148 napi_value WebGL2RenderingContextBase::TexStorage3D(napi_env env, napi_callback_info info)
1149 {
1150 NFuncArg funcArg(env, info);
1151
1152 if (!funcArg.InitArgs(NARG_CNT::SIX)) {
1153 return nullptr;
1154 }
1155 bool succ = false;
1156 LOGI("WebGL2 texStorage3D start");
1157 int32_t target;
1158 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
1159 if (!succ) {
1160 return nullptr;
1161 }
1162 LOGI("WebGL WebGL2RenderingContextBase::texStorage3D target = %{public}u", target);
1163 int32_t levels;
1164 tie(succ, levels) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1165 if (!succ) {
1166 return nullptr;
1167 }
1168 LOGI("WebGL WebGL2RenderingContextBase::texStorage3D levels = %{public}u", levels);
1169 int32_t internalFormat;
1170 tie(succ, internalFormat) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
1171 if (!succ) {
1172 return nullptr;
1173 }
1174 LOGI("WebGL WebGL2RenderingContextBase::texStorage3D internalFormat = %{public}u", internalFormat);
1175 int32_t width;
1176 tie(succ, width) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
1177 if (!succ) {
1178 return nullptr;
1179 }
1180 LOGI("WebGL WebGL2RenderingContextBase::texStorage3D width = %{public}u", width);
1181 int32_t height;
1182 tie(succ, height) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
1183 if (!succ) {
1184 return nullptr;
1185 }
1186 LOGI("WebGL WebGL2RenderingContextBase::texStorage3D height = %{public}u", height);
1187 int32_t depth;
1188 tie(succ, depth) = NVal(env, funcArg[NARG_POS::SIXTH]).ToInt32();
1189 if (!succ) {
1190 return nullptr;
1191 }
1192 LOGI("WebGL WebGL2RenderingContextBase::texStorage3D depth = %{public}u", depth);
1193 glTexStorage3D(static_cast<GLenum>(target), static_cast<GLsizei>(levels),
1194 static_cast<GLenum>(internalFormat),
1195 static_cast<GLsizei>(width), static_cast<GLsizei>(height), static_cast<GLsizei>(depth));
1196 LOGI("WebGL2 texStorage3D end");
1197 return nullptr;
1198 }
1199
TexImage3D(napi_env env,napi_callback_info info)1200 napi_value WebGL2RenderingContextBase::TexImage3D(napi_env env, napi_callback_info info)
1201 {
1202 NFuncArg funcArg(env, info);
1203
1204 if (!funcArg.InitArgs(NARG_CNT::TEN, NARG_CNT::ELEVEN)) {
1205 return nullptr;
1206 }
1207
1208 bool succ = false;
1209 int32_t target;
1210 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
1211 if (!succ) {
1212 return nullptr;
1213 }
1214 LOGI("WebGL WebGL2RenderingContextBase::texImage3D target = %{public}u", target);
1215 int32_t level;
1216 tie(succ, level) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1217 if (!succ) {
1218 return nullptr;
1219 }
1220 LOGI("WebGL WebGL2RenderingContextBase::texImage3D level = %{public}u", level);
1221 int32_t internalFormat;
1222 tie(succ, internalFormat) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
1223 if (!succ) {
1224 return nullptr;
1225 }
1226 LOGI("WebGL WebGL2RenderingContextBase::texImage3D internalFormat = %{public}u", internalFormat);
1227 int32_t width;
1228 tie(succ, width) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
1229 if (!succ) {
1230 return nullptr;
1231 }
1232 LOGI("WebGL WebGL2RenderingContextBase::texImage3D width = %{public}u", width);
1233 int32_t height;
1234 tie(succ, height) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
1235 if (!succ) {
1236 return nullptr;
1237 }
1238 LOGI("WebGL WebGL2RenderingContextBase::texImage3D height = %{public}u", height);
1239 int32_t depth;
1240 tie(succ, depth) = NVal(env, funcArg[NARG_POS::SIXTH]).ToInt32();
1241 if (!succ) {
1242 return nullptr;
1243 }
1244 LOGI("WebGL WebGL2RenderingContextBase::texImage3D depth = %{public}u", depth);
1245 int32_t border;
1246 tie(succ, border) = NVal(env, funcArg[NARG_POS::SEVENTH]).ToInt32();
1247 if (!succ) {
1248 return nullptr;
1249 }
1250 LOGI("WebGL WebGL2RenderingContextBase::texImage3D border = %{public}u", border);
1251 int32_t format;
1252 tie(succ, format) = NVal(env, funcArg[NARG_POS::EIGHTH]).ToInt32();
1253 if (!succ) {
1254 return nullptr;
1255 }
1256 LOGI("WebGL WebGL2RenderingContextBase::texImage3D format = %{public}u", format);
1257 int32_t type;
1258 tie(succ, type) = NVal(env, funcArg[NARG_POS::NINTH]).ToInt32();
1259 if (!succ) {
1260 return nullptr;
1261 }
1262 LOGI("WebGL WebGL2RenderingContextBase::texImage3D type = %{public}u", type);
1263 int32_t pboOffset;
1264 void *pixels = nullptr;
1265 bool usagesucc = NVal(env, funcArg[NARG_POS::TENTH]).TypeIs(napi_number);
1266 if (funcArg.InitArgs(NARG_CNT::TEN)) {
1267 LOGI("WebGL WebGL2RenderingContextBase::texImage3D into TEN");
1268 size_t size;
1269 char *pixelsBase = nullptr;
1270 if (usagesucc) {
1271 tie(succ, pboOffset) = NVal(env, funcArg[NARG_POS::TENTH]).ToInt32();
1272 if (!succ) {
1273 return nullptr;
1274 }
1275 LOGI("WebGL WebGL2RenderingContextBase::texImage3D pboOffset = %{public}u", pboOffset);
1276 pixels = reinterpret_cast<GLvoid *>((pixelsBase + pboOffset));
1277 LOGI("WebGL WebGLRenderContext::texImage3D1 pixels = %{public}u", pixels);
1278 } else if (funcArg[NARG_POS::TENTH] != nullptr) {
1279 LOGI("WebGL WebGLRenderContext::texImage3D1 into 11 ArrayBufferView");
1280 void *source = nullptr;
1281 tie(succ, source, size) = NVal(env, funcArg[NARG_POS::TENTH]).ToArraybuffer();
1282 if (!succ) {
1283 napi_value teximagesource = funcArg[NARG_POS::TENTH];
1284 napi_value resultobject = nullptr;
1285 napi_status statusobject = napi_coerce_to_object(env, teximagesource, &resultobject);
1286 if (statusobject != napi_ok) {
1287 return nullptr;
1288 }
1289 LOGI("WebGL WebGLRenderContext::texImage3D resultobject = %{public}u", resultobject);
1290 napi_value resultwidth = nullptr;
1291 napi_status widthstatus = napi_get_named_property(env, resultobject, "width", &resultwidth);
1292 if (widthstatus != napi_ok) {
1293 return nullptr;
1294 }
1295 int64_t dataWidth;
1296 tie(succ, dataWidth) = NVal(env, resultwidth).ToInt64();
1297 if (!succ) {
1298 return nullptr;
1299 }
1300 LOGI("WebGL WebGLRenderContext::texImage3D dataWidth= %{public}u", dataWidth);
1301 napi_value resultheight = nullptr;
1302 napi_status heightstatus = napi_get_named_property(env, resultobject, "height", &resultheight);
1303 if (heightstatus != napi_ok) {
1304 return nullptr;
1305 }
1306 int64_t dataHeight;
1307 tie(succ, dataHeight) = NVal(env, resultheight).ToInt64();
1308 if (!succ) {
1309 return nullptr;
1310 }
1311 LOGI("WebGL WebGLRenderContext::texImage3D dataHeight = %{public}u", dataHeight);
1312 napi_value resultdata = nullptr;
1313 napi_status datares = napi_get_named_property(env, resultobject, "data", &resultdata);
1314 if (datares != napi_ok) {
1315 return nullptr;
1316 }
1317 napi_value resultstr;
1318 napi_status rsuStatus = napi_coerce_to_string(env, resultdata, &resultstr);
1319 LOGI("WebGL WebGLRenderContext::texImage3D rsuStatus = %{public}u", rsuStatus);
1320 if (rsuStatus != napi_ok) {
1321 return nullptr;
1322 }
1323 unique_ptr<char[]> name;
1324 tie(succ, name, ignore) = NVal(env, resultstr).ToUTF8String();
1325 if (!succ) {
1326 return nullptr;
1327 }
1328 glTexImage3D(static_cast<GLenum>(target), static_cast<GLint>(level), static_cast<GLint>(internalFormat),
1329 static_cast<GLsizei>((width != 0) ? width : dataWidth),
1330 static_cast<GLsizei>((height != 0) ? height : dataHeight),
1331 static_cast<GLsizei>(depth), static_cast<GLint>(border), static_cast<GLenum>(format),
1332 static_cast<GLenum>(type), reinterpret_cast<GLvoid *>(name.get()));
1333 LOGI("WebGL texImage3D end");
1334 return nullptr;
1335 }
1336 char *sourceBase = static_cast<char *>(source);
1337 pixels = reinterpret_cast<GLvoid *>((sourceBase + 0));
1338 LOGI("WebGL WebGLRenderContext::texImage3D source = %{public}u", source);
1339 LOGI("WebGL WebGLRenderContext::texImage3D pixels = %{public}u", pixels);
1340 }
1341 } else if (funcArg.InitArgs(NARG_CNT::ELEVEN)) { // 参数是十一个情况
1342 int32_t srcOffset;
1343 size_t size;
1344 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::ELEVENTH]).ToInt32();
1345 if (!succ) {
1346 return nullptr;
1347 }
1348 LOGI("WebGL WebGL2RenderingContextBase::texImage3D srcOffset = %{public}u", srcOffset);
1349 void *srcData = nullptr;
1350 tie(succ, srcData, size) = NVal(env, funcArg[NARG_POS::TENTH]).ToArraybuffer();
1351 char *srcDataBase = static_cast<char *>(srcData);
1352 pixels = reinterpret_cast<GLvoid *>((srcDataBase + srcOffset));
1353 LOGI("WebGL WebGL2RenderingContextBase::texImage3D srcData = %{public}u", srcData);
1354 LOGI("WebGL WebGL2RenderingContextBase::texImage3D pixels = %{public}u", pixels);
1355 } else {
1356 return nullptr;
1357 }
1358 glTexImage3D(static_cast<GLenum>(target), static_cast<GLint>(level), static_cast<GLint>(internalFormat),
1359 static_cast<GLsizei>(width), static_cast<GLsizei>(height),
1360 static_cast<GLsizei>(depth), static_cast<GLint>(border), static_cast<GLenum>(format),
1361 static_cast<GLenum>(type), reinterpret_cast<GLvoid *>(pixels));
1362 LOGI("WebGL texImage3D end");
1363 return nullptr;
1364 }
1365
TexSubImage3D(napi_env env,napi_callback_info info)1366 napi_value WebGL2RenderingContextBase::TexSubImage3D(napi_env env, napi_callback_info info)
1367 {
1368 NFuncArg funcArg(env, info);
1369
1370 if (!funcArg.InitArgs(NARG_CNT::ELEVEN, NARG_CNT::TWELVE)) {
1371 return nullptr;
1372 }
1373 bool succ = false;
1374 LOGI("WebGL2 texSubImage3D start");
1375 int32_t target;
1376 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
1377 if (!succ) {
1378 return nullptr;
1379 }
1380 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D target = %{public}u", target);
1381 int32_t level;
1382 tie(succ, level) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1383 if (!succ) {
1384 return nullptr;
1385 }
1386 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D level = %{public}u", level);
1387 int32_t xOffset;
1388 tie(succ, xOffset) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
1389 if (!succ) {
1390 return nullptr;
1391 }
1392 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D xOffset = %{public}u", xOffset);
1393 int32_t yOffset;
1394 tie(succ, yOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
1395 if (!succ) {
1396 return nullptr;
1397 }
1398 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D yOffset = %{public}u", yOffset);
1399 int32_t zOffset;
1400 tie(succ, zOffset) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
1401 if (!succ) {
1402 return nullptr;
1403 }
1404 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D zOffset = %{public}u", zOffset);
1405 int32_t width;
1406 tie(succ, width) = NVal(env, funcArg[NARG_POS::SIXTH]).ToInt32();
1407 if (!succ) {
1408 return nullptr;
1409 }
1410 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D width = %{public}u", width);
1411 int32_t height;
1412 tie(succ, height) = NVal(env, funcArg[NARG_POS::SEVENTH]).ToInt32();
1413 if (!succ) {
1414 return nullptr;
1415 }
1416 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D height = %{public}u", height);
1417 int32_t depth;
1418 tie(succ, depth) = NVal(env, funcArg[NARG_POS::EIGHTH]).ToInt32();
1419 if (!succ) {
1420 return nullptr;
1421 }
1422 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D depth = %{public}u", depth);
1423 int32_t format;
1424 tie(succ, format) = NVal(env, funcArg[NARG_POS::NINTH]).ToInt32();
1425 if (!succ) {
1426 return nullptr;
1427 }
1428 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D format = %{public}u", format);
1429 int32_t type;
1430 tie(succ, type) = NVal(env, funcArg[NARG_POS::TENTH]).ToInt32();
1431 if (!succ) {
1432 return nullptr;
1433 }
1434 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D type = %{public}u", type);
1435 void *offset = nullptr;
1436 bool offsetsucc = NVal(env, funcArg[NARG_POS::TENTH]).TypeIs(napi_number);
1437 if (funcArg.InitArgs(NARG_CNT::ELEVEN)) { // 十一个参数
1438 if (offsetsucc) {
1439 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D into eleven on GLint");
1440 char *offsetBase = nullptr;
1441 int32_t pboOffset;
1442 tie(succ, pboOffset) = NVal(env, funcArg[NARG_POS::ELEVENTH]).ToInt32();
1443 if (!succ) {
1444 napi_value teximagesource = funcArg[NARG_POS::ELEVENTH];
1445 napi_value resultobject = nullptr;
1446 napi_status statusobject = napi_coerce_to_object(env, teximagesource, &resultobject);
1447 if (statusobject != napi_ok) {
1448 return nullptr;
1449 }
1450 LOGI("WebGL WebGLRenderContext::texSubImage3D resultobject = %{public}u", resultobject);
1451 napi_value resultwidth = nullptr;
1452 napi_status widthstatus = napi_get_named_property(env, resultobject, "width", &resultwidth);
1453 if (widthstatus != napi_ok) {
1454 return nullptr;
1455 }
1456 int64_t dataWidth;
1457 tie(succ, dataWidth) = NVal(env, resultwidth).ToInt64();
1458 if (!succ) {
1459 return nullptr;
1460 }
1461 LOGI("WebGL WebGLRenderContext::texSubImage3D dataWidth = %{public}u", dataWidth);
1462 napi_value resultheight = nullptr;
1463 napi_status heightstatus = napi_get_named_property(env, resultobject, "height", &resultheight);
1464 if (heightstatus != napi_ok) {
1465 return nullptr;
1466 }
1467 int64_t dataHeight;
1468 tie(succ, dataHeight) = NVal(env, resultheight).ToInt64();
1469 if (!succ) {
1470 return nullptr;
1471 }
1472 LOGI("WebGL WebGLRenderContext::texSubImage3D dataHeight = %{public}u", dataHeight);
1473 napi_value resultdata = nullptr;
1474 napi_status datares = napi_get_named_property(env, resultobject, "data", &resultdata);
1475 if (datares != napi_ok) {
1476 return nullptr;
1477 }
1478 napi_value resultstr;
1479 napi_status rsuStatus = napi_coerce_to_string(env, resultdata, &resultstr);
1480 LOGI("WebGL WebGLRenderContext::texSubImage3D rsuStatus = %{public}u", rsuStatus);
1481 if (rsuStatus != napi_ok) {
1482 return nullptr;
1483 }
1484 unique_ptr<char[]> name;
1485 tie(succ, name, ignore) = NVal(env, resultstr).ToUTF8String();
1486 if (!succ) {
1487 return nullptr;
1488 }
1489 glTexSubImage3D(static_cast<GLenum>(target), static_cast<GLint>(level), static_cast<GLint>(xOffset),
1490 static_cast<GLint>(yOffset), static_cast<GLint>(zOffset),
1491 static_cast<GLsizei>((width != 0) ? width : dataWidth),
1492 static_cast<GLsizei>((height != 0) ? height : dataHeight), static_cast<GLsizei>(depth),
1493 static_cast<GLenum>(format),
1494 static_cast<GLenum>(type), reinterpret_cast<GLvoid *>(name.get()));
1495 LOGI("WebGL texSubImage3D end");
1496 return nullptr;
1497 }
1498 LOGI("WebGL WebGLRenderContext::texSubImage3D pboOffset = %{public}u", pboOffset);
1499 offset = reinterpret_cast<GLvoid *>((offsetBase + pboOffset));
1500 LOGI("WebGL WebGLRenderContext::texSubImage3D offset = %{public}u", offset);
1501 } else {
1502 return nullptr; // TexImageSource
1503 }
1504 } else if (funcArg.InitArgs(NARG_CNT::TWELVE)) { // 十二个参数
1505 int32_t srcOffset;
1506 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::TWELVETH]).ToInt32();
1507 if (!succ) {
1508 return nullptr;
1509 }
1510 LOGI("WebGL WebGL2RenderingContextBase::texSubImage3D srcOffset = %{public}u", srcOffset);
1511 void *srcData = nullptr;
1512 size_t size;
1513 tie(succ, srcData, size) = NVal(env, funcArg[NARG_POS::ELEVENTH]).ToArraybuffer();
1514 char *srcDataBase = static_cast<char *>(srcData);
1515 offset = reinterpret_cast<GLvoid *>((srcDataBase + srcOffset));
1516 } else {
1517 return nullptr;
1518 }
1519 glTexSubImage3D(static_cast<GLenum>(target), static_cast<GLint>(level), static_cast<GLint>(xOffset),
1520 static_cast<GLint>(yOffset), static_cast<GLint>(zOffset), static_cast<GLsizei>(width),
1521 static_cast<GLsizei>(height), static_cast<GLsizei>(depth), static_cast<GLenum>(format),
1522 static_cast<GLenum>(type), reinterpret_cast<GLvoid *>(offset));
1523 LOGI("WebGL texSubImage3D end");
1524 return nullptr;
1525 }
1526
CopyTexSubImage3D(napi_env env,napi_callback_info info)1527 napi_value WebGL2RenderingContextBase::CopyTexSubImage3D(napi_env env, napi_callback_info info)
1528 {
1529 NFuncArg funcArg(env, info);
1530
1531 if (!funcArg.InitArgs(NARG_CNT::NINE)) {
1532 return nullptr;
1533 }
1534 bool succ = false;
1535 LOGI("WebGL2 copyTexSubImage3D start");
1536 int32_t target;
1537 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
1538 if (!succ) {
1539 return nullptr;
1540 }
1541 LOGI("WebGL WebGL2RenderingContextBase::copyTexSubImage3D target = %{public}u", target);
1542 int32_t level;
1543 tie(succ, level) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1544 if (!succ) {
1545 return nullptr;
1546 }
1547 LOGI("WebGL WebGL2RenderingContextBase::copyTexSubImage3D level = %{public}u", level);
1548 int32_t xOffset;
1549 tie(succ, xOffset) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
1550 if (!succ) {
1551 return nullptr;
1552 }
1553 LOGI("WebGL WebGL2RenderingContextBase::copyTexSubImage3D xOffset = %{public}u", xOffset);
1554 int32_t yOffset;
1555 tie(succ, yOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
1556 if (!succ) {
1557 return nullptr;
1558 }
1559 LOGI("WebGL WebGL2RenderingContextBase::copyTexSubImage3D yOffset = %{public}u", yOffset);
1560 int32_t zOffset;
1561 tie(succ, zOffset) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
1562 if (!succ) {
1563 return nullptr;
1564 }
1565 LOGI("WebGL WebGL2RenderingContextBase::copyTexSubImage3D zOffset = %{public}u", zOffset);
1566 int32_t x;
1567 tie(succ, x) = NVal(env, funcArg[NARG_POS::SIXTH]).ToInt32();
1568 if (!succ) {
1569 return nullptr;
1570 }
1571 LOGI("WebGL WebGL2RenderingContextBase::copyTexSubImage3D x = %{public}u", x);
1572 int32_t y;
1573 tie(succ, y) = NVal(env, funcArg[NARG_POS::SEVENTH]).ToInt32();
1574 if (!succ) {
1575 return nullptr;
1576 }
1577 LOGI("WebGL WebGL2RenderingContextBase::copyTexSubImage3D y = %{public}u", y);
1578 int32_t width;
1579 tie(succ, width) = NVal(env, funcArg[NARG_POS::EIGHTH]).ToInt32();
1580 if (!succ) {
1581 return nullptr;
1582 }
1583 LOGI("WebGL WebGL2RenderingContextBase::copyTexSubImage3D width = %{public}u", width);
1584 int32_t height;
1585 tie(succ, height) = NVal(env, funcArg[NARG_POS::NINTH]).ToInt32();
1586 if (!succ) {
1587 return nullptr;
1588 }
1589 LOGI("WebGL WebGL2RenderingContextBase::copyTexSubImage3D height = %{public}u", height);
1590 glCopyTexSubImage3D(static_cast<GLenum>(target), static_cast<GLint>(level), static_cast<GLint>(xOffset),
1591 static_cast<GLint>(yOffset), static_cast<GLint>(zOffset), static_cast<GLint>(x),
1592 static_cast<GLint>(y), static_cast<GLsizei>(width), static_cast<GLsizei>(height));
1593 LOGI("WebGL copyTexSubImage3D end");
1594 return nullptr;
1595 }
1596
CompressedTexImage3D(napi_env env,napi_callback_info info)1597 napi_value WebGL2RenderingContextBase::CompressedTexImage3D(napi_env env, napi_callback_info info)
1598 {
1599 NFuncArg funcArg(env, info);
1600
1601 if (!funcArg.InitArgs(NARG_CNT::NINE, NARG_CNT::TEN)) {
1602 return nullptr;
1603 }
1604
1605 bool succ = false;
1606 LOGI("WebGL compressedTexImage3D start");
1607 int32_t target;
1608 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
1609 if (!succ) {
1610 return nullptr;
1611 }
1612 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D target = %{public}u", target);
1613 int32_t level;
1614 tie(succ, level) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1615 if (!succ) {
1616 return nullptr;
1617 }
1618 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D level = %{public}u", level);
1619 int32_t internalFormat;
1620 tie(succ, internalFormat) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
1621 if (!succ) {
1622 return nullptr;
1623 }
1624 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D internalFormat = %{public}u", internalFormat);
1625 int32_t width;
1626 tie(succ, width) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
1627 if (!succ) {
1628 return nullptr;
1629 }
1630 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D width = %{public}u", width);
1631 int32_t height;
1632 tie(succ, height) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
1633 if (!succ) {
1634 return nullptr;
1635 }
1636 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D height = %{public}u", height);
1637 int32_t depth;
1638 tie(succ, depth) = NVal(env, funcArg[NARG_POS::SIXTH]).ToInt32();
1639 if (!succ) {
1640 return nullptr;
1641 }
1642 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D depth = %{public}u", depth);
1643 int32_t border;
1644 tie(succ, border) = NVal(env, funcArg[NARG_POS::SEVENTH]).ToInt32();
1645 if (!succ) {
1646 return nullptr;
1647 }
1648 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D border = %{public}u", border);
1649 bool imagesucc = NVal(env, funcArg[NARG_POS::EIGHTH]).TypeIs(napi_number);
1650 void *offset = nullptr;
1651 int32_t imageSize;
1652 if (imagesucc) {
1653 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D into nine");
1654 tie(succ, imageSize) = NVal(env, funcArg[NARG_POS::EIGHTH]).ToInt32();
1655 if (!succ) {
1656 return nullptr;
1657 }
1658 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D imageSize = %{public}u", imageSize);
1659 int32_t srcOffset;
1660 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::NINTH]).ToInt32();
1661 if (!succ) {
1662 return nullptr;
1663 }
1664 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D srcOffset = %{public}u", srcOffset);
1665 void *srcData = nullptr;
1666 char *srcDataBase = static_cast<char *>(srcData);
1667 offset = reinterpret_cast<GLvoid *>((srcDataBase + srcOffset));
1668 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D offset = %{public}u", offset);
1669 } else {
1670 int32_t srcOffset = 0;
1671 int32_t srcLengthOverride = 0;
1672 void *srcData = nullptr;
1673 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::NINTH]).ToInt32();
1674 if (!succ) {
1675 return nullptr;
1676 }
1677 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D srcOffset = %{public}u", srcOffset);
1678 tie(succ, srcLengthOverride) = NVal(env, funcArg[NARG_POS::TENTH]).ToInt32();
1679 if (!succ) {
1680 return nullptr;
1681 }
1682 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D srcLengthOverride = %{public}u",
1683 srcLengthOverride);
1684 tie(succ, srcData, srcLengthOverride) = NVal(env, funcArg[NARG_POS::EIGHTH]).ToArraybuffer();
1685 char *srcDataBase = static_cast<char *>(srcData);
1686 offset = reinterpret_cast<GLvoid *>((srcDataBase + srcOffset));
1687 imageSize = static_cast<int>(srcLengthOverride);
1688 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D offset = %{public}u", offset);
1689 LOGI("WebGL WebGL2RenderingContextBase::compressedTexImage3D imageSize = %{public}u", imageSize);
1690 }
1691
1692 glCompressedTexImage3D(static_cast<GLenum>(target), static_cast<GLint>(level),
1693 static_cast<GLenum>(internalFormat),
1694 static_cast<GLsizei>(width), static_cast<GLsizei>(height),
1695 static_cast<GLsizei>(depth),
1696 static_cast<GLint>(border), static_cast<GLsizei>(imageSize),
1697 reinterpret_cast<GLvoid *>(offset));
1698 LOGI("WebGL compressedTexImage3D end");
1699 return nullptr;
1700 }
1701
CompressedTexSubImage3D(napi_env env,napi_callback_info info)1702 napi_value WebGL2RenderingContextBase::CompressedTexSubImage3D(napi_env env, napi_callback_info info)
1703 {
1704 NFuncArg funcArg(env, info);
1705
1706 if (!funcArg.InitArgs(NARG_CNT::ELEVEN, NARG_CNT::TWELVE)) {
1707 return nullptr;
1708 }
1709 bool succ = false;
1710 LOGI("WebGL compressedTexSubImage3D start");
1711 int32_t target;
1712 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
1713 if (!succ) {
1714 return nullptr;
1715 }
1716 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D target = %{public}u", target);
1717 int32_t level;
1718 tie(succ, level) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1719 if (!succ) {
1720 return nullptr;
1721 }
1722 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D level = %{public}u", level);
1723 int32_t xOffset;
1724 tie(succ, xOffset) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
1725 if (!succ) {
1726 return nullptr;
1727 }
1728 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D xOffset = %{public}u", xOffset);
1729 int32_t yOffset;
1730 tie(succ, yOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
1731 if (!succ) {
1732 return nullptr;
1733 }
1734 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D yOffset = %{public}u", yOffset);
1735 int32_t zOffset;
1736 tie(succ, zOffset) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
1737 if (!succ) {
1738 return nullptr;
1739 }
1740 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D zOffset = %{public}u", zOffset);
1741 int32_t width;
1742 tie(succ, width) = NVal(env, funcArg[NARG_POS::SIXTH]).ToInt32();
1743 if (!succ) {
1744 return nullptr;
1745 }
1746 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D width = %{public}u", width);
1747 int32_t height;
1748 tie(succ, height) = NVal(env, funcArg[NARG_POS::SEVENTH]).ToInt32();
1749 if (!succ) {
1750 return nullptr;
1751 }
1752 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D height = %{public}u", height);
1753 int32_t depth;
1754 tie(succ, depth) = NVal(env, funcArg[NARG_POS::EIGHTH]).ToInt32();
1755 if (!succ) {
1756 return nullptr;
1757 }
1758 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D depth = %{public}u", depth);
1759 int32_t format;
1760 tie(succ, format) = NVal(env, funcArg[NARG_POS::NINTH]).ToInt32();
1761 if (!succ) {
1762 return nullptr;
1763 }
1764 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D format = %{public}u", format);
1765 bool imagesucc = NVal(env, funcArg[NARG_POS::TENTH]).TypeIs(napi_number);
1766 void *offset = nullptr;
1767 int32_t imageSize;
1768 if (imagesucc) {
1769 // 是十一个参数
1770 tie(succ, imageSize) = NVal(env, funcArg[NARG_POS::TENTH]).ToInt32();
1771 if (!succ) {
1772 return nullptr;
1773 }
1774 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D imageSize = %{public}u", imageSize);
1775 int32_t srcOffset;
1776 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::ELEVENTH]).ToInt32();
1777 if (!succ) {
1778 return nullptr;
1779 }
1780 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D srcOffset = %{public}u", srcOffset);
1781 void *srcData = nullptr;
1782 char *srcDataBase = static_cast<char *>(srcData);
1783 offset = reinterpret_cast<GLvoid *>((srcDataBase + srcOffset));
1784 } else {
1785 int32_t srcOffset = 0;
1786 int32_t srcLengthOverride = 0;
1787 void *srcData = nullptr;
1788 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::ELEVENTH]).ToInt32();
1789 if (!succ) {
1790 return nullptr;
1791 }
1792 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D srcOffset = %{public}u", srcOffset);
1793 tie(succ, srcLengthOverride) = NVal(env, funcArg[NARG_POS::TWELVETH]).ToInt32();
1794 if (!succ) {
1795 return nullptr;
1796 }
1797 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D srcLengthOverride = %{public}u",
1798 srcLengthOverride);
1799 tie(succ, srcData, srcLengthOverride) = NVal(env, funcArg[NARG_POS::TENTH]).ToArraybuffer();
1800 char *srcDataBase = static_cast<char *>(srcData);
1801 offset = reinterpret_cast<GLvoid *>((srcDataBase + srcOffset));
1802 imageSize = static_cast<int>(srcLengthOverride);
1803 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D srcDataBase = %{public}u", srcDataBase);
1804 LOGI("WebGL WebGL2RenderingContextBase::compressedTexSubImage3D imageSize = %{public}u", imageSize);
1805 }
1806 glCompressedTexSubImage3D(static_cast<GLenum>(target), static_cast<GLint>(level),
1807 static_cast<GLint>(xOffset),
1808 static_cast<GLint>(yOffset), static_cast<GLint>(zOffset),
1809 static_cast<GLsizei>(width), static_cast<GLsizei>(height),
1810 static_cast<GLsizei>(depth),
1811 static_cast<GLenum>(format), static_cast<GLsizei>(imageSize),
1812 reinterpret_cast<GLvoid *>(offset));
1813 LOGI("WebGL compressedTexSubImage3D end");
1814 return nullptr;
1815 }
1816
GetFragDataLocation(napi_env env,napi_callback_info info)1817 napi_value WebGL2RenderingContextBase::GetFragDataLocation(napi_env env, napi_callback_info info)
1818 {
1819 NFuncArg funcArg(env, info);
1820
1821 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
1822 return nullptr;
1823 }
1824 LOGI("WebGL2 getFragDataLocation start");
1825 WebGLProgram *webGlProgram = nullptr;
1826 napi_status programStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlProgram);
1827 if (programStatus != napi_ok) {
1828 return nullptr;
1829 }
1830 bool succ = false;
1831 int program = webGlProgram->GetProgramId();
1832 unique_ptr<char[]> name;
1833 tie(succ, name, ignore) = NVal(env, funcArg[NARG_POS::SECOND]).ToUTF8String();
1834 if (!succ) {
1835 return nullptr;
1836 }
1837 LOGI("WebGL WebGLRenderingContextBase::getFragDataLocation name = %{public}s", name.get());
1838 int32_t res = static_cast<int32_t>(glGetFragDataLocation(static_cast<GLuint>(program),
1839 const_cast<char *>(name.get())));
1840 LOGI("WebGL getFragDataLocation end");
1841 return NVal::CreateInt64(env, res).val_;
1842 }
1843
Uniform1ui(napi_env env,napi_callback_info info)1844 napi_value WebGL2RenderingContextBase::Uniform1ui(napi_env env, napi_callback_info info)
1845 {
1846 NFuncArg funcArg(env, info);
1847
1848 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
1849 return nullptr;
1850 }
1851 bool succ = false;
1852 LOGI("WebGL2 uniform1ui start");
1853 WebGLUniformLocation *webGLUniformLocation = nullptr;
1854 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
1855 if (locationStatus != napi_ok) {
1856 return nullptr;
1857 }
1858 int location = webGLUniformLocation->GetUniformLocationId();
1859 LOGI("WebGL WebGL2RenderingContextBase::uniform1ui location = %{public}u", location);
1860 int32_t v0;
1861 tie(succ, v0) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1862 if (!succ) {
1863 return nullptr;
1864 }
1865 LOGI("WebGL WebGL2RenderingContextBase::uniform1ui v0 = %{public}u", v0);
1866 glUniform1ui(static_cast<GLint>(location), static_cast<GLuint>(v0));
1867 LOGI("WebGL uniform1ui end");
1868 return nullptr;
1869 }
1870
Uniform2ui(napi_env env,napi_callback_info info)1871 napi_value WebGL2RenderingContextBase::Uniform2ui(napi_env env, napi_callback_info info)
1872 {
1873 NFuncArg funcArg(env, info);
1874
1875 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
1876 return nullptr;
1877 }
1878 bool succ = false;
1879 LOGI("WebGL2 uniform2ui start");
1880 WebGLUniformLocation *webGLUniformLocation = nullptr;
1881 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
1882 if (locationStatus != napi_ok) {
1883 return nullptr;
1884 }
1885 int location = webGLUniformLocation->GetUniformLocationId();
1886 LOGI("WebGL WebGL2RenderingContextBase::uniform2ui location = %{public}u", location);
1887 int32_t v0;
1888 tie(succ, v0) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1889 if (!succ) {
1890 return nullptr;
1891 }
1892 LOGI("WebGL WebGL2RenderingContextBase::uniform2ui v0 = %{public}u", v0);
1893 int32_t v1;
1894 tie(succ, v1) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1895 if (!succ) {
1896 return nullptr;
1897 }
1898 LOGI("WebGL WebGL2RenderingContextBase::uniform2ui v1 = %{public}u", v1);
1899 glUniform2ui(static_cast<GLint>(location), static_cast<GLuint>(v0), static_cast<GLuint>(v1));
1900 LOGI("WebGL uniform2ui end");
1901 return nullptr;
1902 }
1903
Uniform3ui(napi_env env,napi_callback_info info)1904 napi_value WebGL2RenderingContextBase::Uniform3ui(napi_env env, napi_callback_info info)
1905 {
1906 NFuncArg funcArg(env, info);
1907
1908 if (!funcArg.InitArgs(NARG_CNT::FOUR)) {
1909 return nullptr;
1910 }
1911 bool succ = false;
1912 LOGI("WebGL2 uniform3ui start");
1913 WebGLUniformLocation *webGLUniformLocation = nullptr;
1914 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
1915 if (locationStatus != napi_ok) {
1916 return nullptr;
1917 }
1918 int location = webGLUniformLocation->GetUniformLocationId();
1919 LOGI("WebGL WebGL2RenderingContextBase::uniform3ui location = %{public}u", location);
1920 int32_t v0;
1921 tie(succ, v0) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1922 if (!succ) {
1923 return nullptr;
1924 }
1925 LOGI("WebGL WebGL2RenderingContextBase::uniform3ui v0 = %{public}u", v0);
1926 int32_t v1;
1927 tie(succ, v1) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
1928 if (!succ) {
1929 return nullptr;
1930 }
1931 LOGI("WebGL WebGL2RenderingContextBase::uniform3ui v1 = %{public}u", v1);
1932 int32_t v2;
1933 tie(succ, v2) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
1934 if (!succ) {
1935 return nullptr;
1936 }
1937 LOGI("WebGL WebGL2RenderingContextBase::uniform3ui v2 = %{public}u", v2);
1938 glUniform3ui(static_cast<GLint>(location), static_cast<GLuint>(v0), static_cast<GLuint>(v1),
1939 static_cast<GLuint>(v2));
1940 LOGI("WebGL uniform3ui end");
1941 return nullptr;
1942 }
1943
Uniform4ui(napi_env env,napi_callback_info info)1944 napi_value WebGL2RenderingContextBase::Uniform4ui(napi_env env, napi_callback_info info)
1945 {
1946 NFuncArg funcArg(env, info);
1947
1948 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
1949 return nullptr;
1950 }
1951 bool succ = false;
1952 LOGI("WebGL2 uniform4ui start");
1953 WebGLUniformLocation *webGLUniformLocation = nullptr;
1954 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
1955 if (locationStatus != napi_ok) {
1956 return nullptr;
1957 }
1958 int location = webGLUniformLocation->GetUniformLocationId();
1959 LOGI("WebGL WebGL2RenderingContextBase::uniform4ui location = %{public}u", location);
1960 int32_t v0;
1961 tie(succ, v0) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
1962 if (!succ) {
1963 return nullptr;
1964 }
1965 LOGI("WebGL WebGL2RenderingContextBase::uniform4ui v0 = %{public}u", v0);
1966 int32_t v1;
1967 tie(succ, v1) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
1968 if (!succ) {
1969 return nullptr;
1970 }
1971 LOGI("WebGL WebGL2RenderingContextBase::uniform4ui v1 = %{public}u", v1);
1972 int32_t v2;
1973 tie(succ, v2) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
1974 if (!succ) {
1975 return nullptr;
1976 }
1977 LOGI("WebGL WebGL2RenderingContextBase::uniform4ui v2 = %{public}u", v2);
1978 int32_t v3;
1979 tie(succ, v3) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
1980 if (!succ) {
1981 return nullptr;
1982 }
1983 LOGI("WebGL WebGL2RenderingContextBase::uniform4ui v3 = %{public}u", v3);
1984 glUniform4ui(static_cast<GLint>(location), static_cast<GLuint>(v0), static_cast<GLuint>(v1),
1985 static_cast<GLuint>(v2), static_cast<GLuint>(v3));
1986 LOGI("WebGL uniform4ui end");
1987 return nullptr;
1988 }
1989
VertexAttribI4i(napi_env env,napi_callback_info info)1990 napi_value WebGL2RenderingContextBase::VertexAttribI4i(napi_env env, napi_callback_info info)
1991 {
1992 NFuncArg funcArg(env, info);
1993
1994 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
1995 return nullptr;
1996 }
1997 bool succ = false;
1998 LOGI("WebGL vertexAttribI4i start");
1999 int32_t index;
2000 tie(succ, index) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
2001 if (!succ) {
2002 return nullptr;
2003 }
2004 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4i index = %{public}u", index);
2005 int32_t x;
2006 tie(succ, x) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
2007 if (!succ) {
2008 return nullptr;
2009 }
2010 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4i x = %{public}u", x);
2011 int32_t y;
2012 tie(succ, y) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
2013 if (!succ) {
2014 return nullptr;
2015 }
2016 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4i y = %{public}u", y);
2017 int32_t z;
2018 tie(succ, z) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
2019 if (!succ) {
2020 return nullptr;
2021 }
2022 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4i z = %{public}u", z);
2023 int32_t w;
2024 tie(succ, w) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
2025 if (!succ) {
2026 return nullptr;
2027 }
2028 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4i w = %{public}u", w);
2029 glVertexAttribI4i(static_cast<GLuint>(index), static_cast<GLint>(x), static_cast<GLint>(y),
2030 static_cast<GLint>(z), static_cast<GLint>(w));
2031 LOGI("WebGL vertexAttribI4i end");
2032 return nullptr;
2033 }
2034
VertexAttribI4ui(napi_env env,napi_callback_info info)2035 napi_value WebGL2RenderingContextBase::VertexAttribI4ui(napi_env env, napi_callback_info info)
2036 {
2037 NFuncArg funcArg(env, info);
2038
2039 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
2040 return nullptr;
2041 }
2042 bool succ = false;
2043 LOGI("WebGL vertexAttribI4ui start");
2044 int32_t index;
2045 tie(succ, index) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
2046 if (!succ) {
2047 return nullptr;
2048 }
2049 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4ui index = %{public}u", index);
2050 int32_t x;
2051 tie(succ, x) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
2052 if (!succ) {
2053 return nullptr;
2054 }
2055 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4ui x = %{public}u", x);
2056 int32_t y;
2057 tie(succ, y) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
2058 if (!succ) {
2059 return nullptr;
2060 }
2061 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4ui y = %{public}u", y);
2062 int32_t z;
2063 tie(succ, z) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
2064 if (!succ) {
2065 return nullptr;
2066 }
2067 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4ui z = %{public}u", z);
2068 int32_t w;
2069 tie(succ, w) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
2070 if (!succ) {
2071 return nullptr;
2072 }
2073 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribI4ui w = %{public}u", w);
2074 glVertexAttribI4ui(static_cast<GLuint>(index), static_cast<GLuint>(x), static_cast<GLuint>(y),
2075 static_cast<GLuint>(z), static_cast<GLuint>(w));
2076 LOGI("WebGL vertexAttribI4ui end");
2077 return nullptr;
2078 }
2079
VertexAttribIPointer(napi_env env,napi_callback_info info)2080 napi_value WebGL2RenderingContextBase::VertexAttribIPointer(napi_env env, napi_callback_info info)
2081 {
2082 NFuncArg funcArg(env, info);
2083
2084 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
2085 return nullptr;
2086 }
2087 bool succ = false;
2088 LOGI("WebGL vertexAttribIPointer start");
2089 int32_t index;
2090 tie(succ, index) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
2091 if (!succ) {
2092 return nullptr;
2093 }
2094 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribIPointer index = %{public}u", index);
2095 int32_t size;
2096 tie(succ, size) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
2097 if (!succ) {
2098 return nullptr;
2099 }
2100 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribIPointer size = %{public}u", size);
2101 int32_t type;
2102 tie(succ, type) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
2103 if (!succ) {
2104 return nullptr;
2105 }
2106 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribIPointer type = %{public}u", type);
2107 int32_t stride;
2108 tie(succ, stride) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
2109 if (!succ) {
2110 return nullptr;
2111 }
2112 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribIPointer stride = %{public}u", stride);
2113 int32_t offset;
2114 tie(succ, offset) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
2115 if (!succ) {
2116 return nullptr;
2117 }
2118 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribIPointer offset = %{public}u", offset);
2119 glVertexAttribIPointer(static_cast<GLuint>(index), static_cast<GLuint>(size), static_cast<GLenum>(type),
2120 static_cast<GLsizei>(stride), reinterpret_cast<GLvoid *>(static_cast<intptr_t>(offset)));
2121 LOGI("WebGL vertexAttribIPointer end");
2122 return nullptr;
2123 }
2124
VertexAttribDivisor(napi_env env,napi_callback_info info)2125 napi_value WebGL2RenderingContextBase::VertexAttribDivisor(napi_env env, napi_callback_info info)
2126 {
2127 NFuncArg funcArg(env, info);
2128
2129 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
2130 return nullptr;
2131 }
2132 bool succ = false;
2133 LOGI("WebGL2 vertexAttribDivisor start");
2134 int32_t index;
2135 tie(succ, index) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
2136 if (!succ) {
2137 return nullptr;
2138 }
2139 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribDivisor index = %{public}u", index);
2140 int32_t divisor;
2141 tie(succ, divisor) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
2142 if (!succ) {
2143 return nullptr;
2144 }
2145 LOGI("WebGL WebGL2RenderingContextBase::vertexAttribDivisor divisor = %{public}u", divisor);
2146 glVertexAttribDivisor(static_cast<GLuint>(index), static_cast<GLuint>(divisor));
2147 LOGI("WebGL vertexAttribDivisor end");
2148 return nullptr;
2149 }
2150
DrawArraysInstanced(napi_env env,napi_callback_info info)2151 napi_value WebGL2RenderingContextBase::DrawArraysInstanced(napi_env env, napi_callback_info info)
2152 {
2153 NFuncArg funcArg(env, info);
2154
2155 if (!funcArg.InitArgs(NARG_CNT::FOUR)) {
2156 return nullptr;
2157 }
2158 bool succ = false;
2159 LOGI("WebGL2 drawArraysInstanced start");
2160 int32_t mode;
2161 tie(succ, mode) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
2162 if (!succ) {
2163 return nullptr;
2164 }
2165 LOGI("WebGL WebGL2RenderingContextBase::drawArraysInstanced mode = %{public}u", mode);
2166 int32_t first;
2167 tie(succ, first) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
2168 if (!succ) {
2169 return nullptr;
2170 }
2171 LOGI("WebGL WebGL2RenderingContextBase::drawArraysInstanced first = %{public}u", first);
2172 int32_t count;
2173 tie(succ, count) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
2174 if (!succ) {
2175 return nullptr;
2176 }
2177 LOGI("WebGL WebGL2RenderingContextBase::drawArraysInstanced count = %{public}u", count);
2178 int32_t instanceCount;
2179 tie(succ, instanceCount) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
2180 if (!succ) {
2181 return nullptr;
2182 }
2183 LOGI("WebGL WebGL2RenderingContextBase::drawArraysInstanced instanceCount = %{public}u", instanceCount);
2184 glDrawArraysInstanced(static_cast<GLenum>(mode), static_cast<GLint>(first), static_cast<GLsizei>(count),
2185 static_cast<GLsizei>(instanceCount));
2186 LOGI("WebGL drawArraysInstanced end");
2187 return nullptr;
2188 }
2189
DrawElementsInstanced(napi_env env,napi_callback_info info)2190 napi_value WebGL2RenderingContextBase::DrawElementsInstanced(napi_env env, napi_callback_info info)
2191 {
2192 NFuncArg funcArg(env, info);
2193
2194 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
2195 return nullptr;
2196 }
2197 bool succ = false;
2198 LOGI("WebGL2 drawElementsInstanced start");
2199 int32_t mode;
2200 tie(succ, mode) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
2201 if (!succ) {
2202 return nullptr;
2203 }
2204 LOGI("WebGL WebGL2RenderingContextBase::drawElementsInstanced mode = %{public}u", mode);
2205 int32_t count;
2206 tie(succ, count) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
2207 if (!succ) {
2208 return nullptr;
2209 }
2210 LOGI("WebGL WebGL2RenderingContextBase::drawElementsInstanced count = %{public}u", count);
2211 int32_t type;
2212 tie(succ, type) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
2213 if (!succ) {
2214 return nullptr;
2215 }
2216 LOGI("WebGL WebGL2RenderingContextBase::drawElementsInstanced type = %{public}u", type);
2217 int32_t offset;
2218 tie(succ, offset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
2219 if (!succ) {
2220 return nullptr;
2221 }
2222 LOGI("WebGL WebGL2RenderingContextBase::drawElementsInstanced offset = %{public}u", offset);
2223 int32_t instanceCount;
2224 tie(succ, instanceCount) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
2225 if (!succ) {
2226 return nullptr;
2227 }
2228 LOGI("WebGL WebGL2RenderingContextBase::drawElementsInstanced instanceCount = %{public}u", instanceCount);
2229 glDrawElementsInstanced(static_cast<GLenum>(mode), static_cast<GLsizei>(count), static_cast<GLenum>(type),
2230 reinterpret_cast<GLvoid *>(static_cast<intptr_t>(offset)),
2231 static_cast<GLsizei>(instanceCount));
2232 LOGI("WebGL drawElementsInstanced end");
2233 return nullptr;
2234 }
2235
DrawRangeElements(napi_env env,napi_callback_info info)2236 napi_value WebGL2RenderingContextBase::DrawRangeElements(napi_env env, napi_callback_info info)
2237 {
2238 NFuncArg funcArg(env, info);
2239
2240 if (!funcArg.InitArgs(NARG_CNT::SIX)) {
2241 return nullptr;
2242 }
2243 bool succ = false;
2244 LOGI("WebGL2 drawRangeElements start");
2245 int32_t mode;
2246 tie(succ, mode) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt32();
2247 if (!succ) {
2248 return nullptr;
2249 }
2250 LOGI("WebGL WebGL2RenderingContextBase::drawRangeElements mode = %{public}u", mode);
2251 int32_t start;
2252 tie(succ, start) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt32();
2253 if (!succ) {
2254 return nullptr;
2255 }
2256 LOGI("WebGL WebGL2RenderingContextBase::drawRangeElements start = %{public}u", start);
2257 int32_t end;
2258 tie(succ, end) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt32();
2259 if (!succ) {
2260 return nullptr;
2261 }
2262 LOGI("WebGL WebGL2RenderingContextBase::drawRangeElements end = %{public}u", end);
2263 int32_t count;
2264 tie(succ, count) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt32();
2265 if (!succ) {
2266 return nullptr;
2267 }
2268 LOGI("WebGL WebGL2RenderingContextBase::drawRangeElements count = %{public}u", count);
2269 int32_t type;
2270 tie(succ, type) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt32();
2271 if (!succ) {
2272 return nullptr;
2273 }
2274 LOGI("WebGL WebGL2RenderingContextBase::drawRangeElements type = %{public}u", type);
2275 int32_t offset;
2276 tie(succ, offset) = NVal(env, funcArg[NARG_POS::SIXTH]).ToInt32();
2277 if (!succ) {
2278 return nullptr;
2279 }
2280 LOGI("WebGL WebGL2RenderingContextBase::drawRangeElements offset = %{public}u", offset);
2281 glDrawRangeElements(static_cast<GLenum>(mode), static_cast<GLuint>(start), static_cast<GLuint>(end),
2282 static_cast<GLsizei>(count), static_cast<GLenum>(type),
2283 reinterpret_cast<GLvoid *>(static_cast<intptr_t>(offset)));
2284 LOGI("WebGL drawRangeElements end");
2285 return nullptr;
2286 }
2287
CopyBufferSubData(napi_env env,napi_callback_info info)2288 napi_value WebGL2RenderingContextBase::CopyBufferSubData(napi_env env, napi_callback_info info)
2289 {
2290 NFuncArg funcArg(env, info);
2291
2292 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
2293 return nullptr;
2294 }
2295 bool succ = false;
2296 LOGI("WebGL copyBufferSubData start");
2297 int64_t readtarget;
2298 tie(succ, readtarget) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
2299 if (!succ) {
2300 return nullptr;
2301 }
2302 LOGI("WebGL WebGL2RenderingContextBase::copyBufferSubData readtarget = %{public}u", readtarget);
2303 int64_t writetarget;
2304 tie(succ, writetarget) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2305 if (!succ) {
2306 return nullptr;
2307 }
2308 LOGI("WebGL WebGL2RenderingContextBase::copyBufferSubData writetarget = %{public}u", writetarget);
2309 int64_t readoffset;
2310 tie(succ, readoffset) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
2311 if (!succ) {
2312 return nullptr;
2313 }
2314 LOGI("WebGL WebGL2RenderingContextBase::copyBufferSubData readoffset = %{public}u", readoffset);
2315
2316 int64_t writeoffset;
2317 tie(succ, writeoffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
2318 if (!succ) {
2319 return nullptr;
2320 }
2321 LOGI("WebGL WebGL2RenderingContextBase::copyBufferSubData writeoffset = %{public}u", writeoffset);
2322
2323 int64_t size;
2324 tie(succ, size) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
2325 if (!succ) {
2326 return nullptr;
2327 }
2328 LOGI("WebGL WebGL2RenderingContextBase::copyBufferSubData size = %{public}u", size);
2329 glCopyBufferSubData(static_cast<GLenum>(readtarget), static_cast<GLenum>(writetarget),
2330 static_cast<GLintptr>(readoffset), static_cast<GLintptr>(writeoffset), static_cast<GLsizeiptr>(size));
2331 LOGI("WebGL copyBufferSubData end");
2332 return nullptr;
2333 }
2334
GetBufferSubData(napi_env env,napi_callback_info info)2335 napi_value WebGL2RenderingContextBase::GetBufferSubData(napi_env env, napi_callback_info info)
2336 {
2337 NFuncArg funcArg(env, info);
2338 size_t argc = 5;
2339 napi_value args[5];
2340 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
2341 int64_t target;
2342 napi_get_value_int64(env, args[0], &target);
2343 LOGI("WebGL WebGL2RenderingContextBase::getBufferSubData target = %{public}u", target);
2344 int64_t srcByteOffset;
2345 napi_get_value_int64(env, args[1], &srcByteOffset);
2346 LOGI("WebGL WebGL2RenderingContextBase::getBufferSubData srcByteOffset = %{public}u", srcByteOffset);
2347 LOGI("WebGL WebGL2RenderingContextBase::getBufferSubData funcArg[NARG_POS::THIRD] = %{public}u",
2348 funcArg[NARG_POS::THIRD]);
2349 size_t bufLen = 0;
2350 void *buf = nullptr;
2351 napi_value arraybuffer = nullptr;
2352 size_t byteoff = 0;
2353 int a = 2;
2354 napi_get_dataview_info(env, args[a], &bufLen, &buf, &arraybuffer, &byteoff);
2355 LOGI("WebGL WebGL2RenderingContextBase::getBufferSubData buf = %{public}u", buf);
2356 LOGI("WebGL WebGL2RenderingContextBase::getBufferSubData bufLen = %{public}u", bufLen);
2357 LOGI("WebGL WebGL2RenderingContextBase::getBufferSubData arraybuffer = %{public}u", arraybuffer);
2358 LOGI("WebGL WebGL2RenderingContextBase::getBufferSubData byteoff = %{public}u", byteoff);
2359
2360 glBufferSubData(static_cast<GLenum>(target), static_cast<GLintptr>(srcByteOffset),
2361 static_cast<GLsizeiptr>(bufLen), static_cast<void*>(buf));
2362 LOGI("WebGL getBufferSubData end");
2363 return nullptr;
2364 }
2365
BlitFramebuffer(napi_env env,napi_callback_info info)2366 napi_value WebGL2RenderingContextBase::BlitFramebuffer(napi_env env, napi_callback_info info)
2367 {
2368 NFuncArg funcArg(env, info);
2369
2370 if (!funcArg.InitArgs(NARG_CNT::TEN)) {
2371 return nullptr;
2372 }
2373 bool succ = false;
2374 LOGI("WebGL blitFramebuffer start");
2375 int64_t srcX0;
2376 tie(succ, srcX0) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
2377 if (!succ) {
2378 return nullptr;
2379 }
2380 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer srcX0 = %{public}u", srcX0);
2381 int64_t srcY0;
2382 tie(succ, srcY0) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2383 if (!succ) {
2384 return nullptr;
2385 }
2386 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer srcY0 = %{public}u", srcY0);
2387 int64_t srcX1;
2388 tie(succ, srcX1) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
2389 if (!succ) {
2390 return nullptr;
2391 }
2392 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer srcX1 = %{public}u", srcX1);
2393 int64_t srcY1;
2394 tie(succ, srcY1) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
2395 if (!succ) {
2396 return nullptr;
2397 }
2398 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer srcY1 = %{public}u", srcY1);
2399 int64_t dstX0;
2400 tie(succ, dstX0) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
2401 if (!succ) {
2402 return nullptr;
2403 }
2404 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer dstX0 = %{public}u", dstX0);
2405 int64_t dstY0;
2406 tie(succ, dstY0) = NVal(env, funcArg[NARG_POS::SIXTH]).ToInt64();
2407 if (!succ) {
2408 return nullptr;
2409 }
2410 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer dstY0 = %{public}u", dstY0);
2411 int64_t dstX1;
2412 tie(succ, dstX1) = NVal(env, funcArg[NARG_POS::SEVENTH]).ToInt64();
2413 if (!succ) {
2414 return nullptr;
2415 }
2416 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer dstX1 = %{public}u", dstX1);
2417 int64_t dstY1;
2418 tie(succ, dstY1) = NVal(env, funcArg[NARG_POS::EIGHTH]).ToInt64();
2419 if (!succ) {
2420 return nullptr;
2421 }
2422 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer dstY1 = %{public}u", dstY1);
2423 int64_t mask;
2424 tie(succ, mask) = NVal(env, funcArg[NARG_POS::NINTH]).ToInt64();
2425 if (!succ) {
2426 return nullptr;
2427 }
2428 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer mask = %{public}u", mask);
2429 int64_t filter;
2430 tie(succ, filter) = NVal(env, funcArg[NARG_POS::TENTH]).ToInt64();
2431 if (!succ) {
2432 return nullptr;
2433 }
2434 LOGI("WebGL WebGL2RenderingContextBase::blitFramebuffer filter = %{public}u", filter);
2435 glBlitFramebuffer(static_cast<GLint>(srcX0), static_cast<GLint>(srcY0), static_cast<GLint>(srcX1),
2436 static_cast<GLint>(srcY1), static_cast<GLint>(dstX0),
2437 static_cast<GLint>(dstY0), static_cast<GLint>(dstX1), static_cast<GLint>(dstY1),
2438 static_cast<GLbitfield>(mask), static_cast<GLenum>(filter));
2439 LOGI("WebGL blitFramebuffer end");
2440 return nullptr;
2441 }
2442
FramebufferTextureLayer(napi_env env,napi_callback_info info)2443 napi_value WebGL2RenderingContextBase::FramebufferTextureLayer(napi_env env, napi_callback_info info)
2444 {
2445 NFuncArg funcArg(env, info);
2446 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
2447 return nullptr;
2448 }
2449 bool succ = false;
2450 LOGI("WebGL framebufferTextureLayer start");
2451 int64_t target;
2452 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
2453 if (!succ) {
2454 return nullptr;
2455 }
2456 LOGI("WebGL WebGL2RenderingContextBase::framebufferTextureLayer target = %{public}u", target);
2457 int64_t attachment;
2458 tie(succ, attachment) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2459 if (!succ) {
2460 return nullptr;
2461 }
2462 LOGI("WebGL WebGL2RenderingContextBase::framebufferTextureLayer attachment = %{public}u", attachment);
2463 if (funcArg[NARG_POS::THIRD] == nullptr) {
2464 return nullptr;
2465 }
2466 WebGLTexture *webGlTexture = nullptr;
2467 napi_status textureStatus = napi_unwrap(env, funcArg[NARG_POS::THIRD], (void **)&webGlTexture);
2468 if (textureStatus != napi_ok) {
2469 return nullptr;
2470 }
2471 unsigned int texture = webGlTexture->GetTexture();
2472 LOGI("WebGL WebGLRenderContext::WebGL2RenderingContextBase framebufferTextureLayer texture= %{public}u", texture);
2473 int64_t level;
2474 tie(succ, level) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
2475 if (!succ) {
2476 return nullptr;
2477 }
2478 LOGI("WebGL WebGL2RenderingContextBase::framebufferTextureLayer level = %{public}u", level);
2479 int64_t layer;
2480 tie(succ, layer) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
2481 if (!succ) {
2482 return nullptr;
2483 }
2484 LOGI("WebGL WebGL2RenderingContextBase::framebufferTextureLayer layer = %{public}u", layer);
2485 glFramebufferTextureLayer(static_cast<GLenum>(target), static_cast<GLenum>(attachment),
2486 static_cast<GLuint>(texture), static_cast<GLint>(level),
2487 static_cast<GLint>(layer));
2488 LOGI("WebGL framebufferTextureLayer end");
2489 return nullptr;
2490 }
2491
ReadBuffer(napi_env env,napi_callback_info info)2492 napi_value WebGL2RenderingContextBase::ReadBuffer(napi_env env, napi_callback_info info)
2493 {
2494 NFuncArg funcArg(env, info);
2495 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
2496 return nullptr;
2497 }
2498 bool succ = false;
2499 LOGI("WebGL readBuffer start");
2500 int64_t src;
2501 tie(succ, src) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
2502 if (!succ) {
2503 return nullptr;
2504 }
2505 LOGI("WebGL WebGL2RenderingContextBase::readBuffer src = %{public}u", src);
2506 glReadBuffer(static_cast<GLenum>(src));
2507 LOGI("WebGL readBuffer end");
2508 return nullptr;
2509 }
2510
RenderbufferStorageMultisample(napi_env env,napi_callback_info info)2511 napi_value WebGL2RenderingContextBase::RenderbufferStorageMultisample(napi_env env, napi_callback_info info)
2512 {
2513 NFuncArg funcArg(env, info);
2514 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
2515 return nullptr;
2516 }
2517 bool succ = false;
2518 LOGI("WebGL renderbufferStorageMultisample start");
2519 int64_t target;
2520 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
2521 if (!succ) {
2522 return nullptr;
2523 }
2524 LOGI("WebGL WebGL2RenderingContextBase::renderbufferStorageMultisample target = %{public}u", target);
2525 int64_t samples;
2526 tie(succ, samples) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2527 if (!succ) {
2528 return nullptr;
2529 }
2530 LOGI("WebGL WebGL2RenderingContextBase::renderbufferStorageMultisample samples = %{public}u", samples);
2531 int64_t internalformat;
2532 tie(succ, internalformat) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
2533 if (!succ) {
2534 return nullptr;
2535 }
2536 LOGI("WebGL WebGL2RenderingContextBase::renderbufferStorageMultisample internalformat end");
2537 int64_t width;
2538 tie(succ, width) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
2539 if (!succ) {
2540 return nullptr;
2541 }
2542 LOGI("WebGL WebGL2RenderingContextBase::renderbufferStorageMultisample level = %{public}u", width);
2543 int64_t height;
2544 tie(succ, height) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
2545 if (!succ) {
2546 return nullptr;
2547 }
2548 LOGI("WebGL WebGL2RenderingContextBase::renderbufferStorageMultisample height = %{public}u", height);
2549 glRenderbufferStorageMultisample(static_cast<GLenum>(target),
2550 static_cast<GLsizei>(samples), static_cast<GLenum>(internalformat),
2551 static_cast<GLsizei>(width), static_cast<GLsizei>(height));
2552 LOGI("WebGL renderbufferStorageMultisample end");
2553 return nullptr;
2554 }
2555
TexStorage2D(napi_env env,napi_callback_info info)2556 napi_value WebGL2RenderingContextBase::TexStorage2D(napi_env env, napi_callback_info info)
2557 {
2558 NFuncArg funcArg(env, info);
2559 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
2560 return nullptr;
2561 }
2562 bool succ = false;
2563 LOGI("WebGL texStorage2D start");
2564 int64_t target;
2565 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
2566 if (!succ) {
2567 return nullptr;
2568 }
2569 LOGI("WebGL WebGL2RenderingContextBase::texStorage2D target = %{public}u", target);
2570 int64_t levels;
2571 tie(succ, levels) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2572 if (!succ) {
2573 return nullptr;
2574 }
2575 LOGI("WebGL WebGL2RenderingContextBase::texStorage2D levels = %{public}u", levels);
2576 int64_t internalformat;
2577 tie(succ, internalformat) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
2578 if (!succ) {
2579 return nullptr;
2580 }
2581 LOGI("WebGL WebGLRenderContext::WebGL2RenderingContextBase texStorage2D internalformat= %{public}u",
2582 internalformat);
2583 int64_t width;
2584 tie(succ, width) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
2585 if (!succ) {
2586 return nullptr;
2587 }
2588 LOGI("WebGL WebGL2RenderingContextBase::texStorage2D level = %{public}u", width);
2589 int64_t height;
2590 tie(succ, height) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
2591 if (!succ) {
2592 return nullptr;
2593 }
2594 LOGI("WebGL WebGL2RenderingContextBase::texStorage2D height = %{public}u", height);
2595 glTexStorage2D(static_cast<GLenum>(target), static_cast<GLsizei>(levels), static_cast<GLenum>(internalformat),
2596 static_cast<GLsizei>(width), static_cast<GLsizei>(height));
2597 LOGI("WebGL texStorage2D end");
2598 return nullptr;
2599 }
2600
GetTransformFeedbackVarying(napi_env env,napi_callback_info info)2601 napi_value WebGL2RenderingContextBase::GetTransformFeedbackVarying(napi_env env, napi_callback_info info)
2602 {
2603 NFuncArg funcArg(env, info);
2604 napi_value res = nullptr;
2605 size_t argc = 2;
2606 napi_value args[2];
2607 napi_get_cb_info(env, info, &argc, args, &res, nullptr);
2608 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
2609 return nullptr;
2610 }
2611 bool succ = false;
2612 LOGI("WebGL GetTransformFeedbackVarying start");
2613 WebGLProgram *webGlProgram = nullptr;
2614 napi_status programStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlProgram);
2615 if (programStatus != napi_ok) {
2616 return nullptr;
2617 }
2618 int programId = webGlProgram->GetProgramId();
2619 LOGI("WebGL WebGL2RenderingContextBase::getTransformFeedbackVarying programId = %{public}u", programId);
2620 int64_t index;
2621 tie(succ, index) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2622 if (!succ) {
2623 return nullptr;
2624 }
2625 napi_value objActiveInfo = NClass::InstantiateClass(env, WebGLActiveInfo::className, {});
2626 if (!objActiveInfo) {
2627 return nullptr;
2628 }
2629 auto webGLActiveInfo = NClass::GetEntityOf<WebGLActiveInfo>(env, objActiveInfo);
2630 if (!webGLActiveInfo) {
2631 return nullptr;
2632 }
2633
2634 GLsizei bufSize = WEBGL_ACTIVE_INFO_NAME_MAX_LENGTH;
2635 int length;
2636 int size;
2637 unsigned int type;
2638 GLchar name[WEBGL_ACTIVE_INFO_NAME_MAX_LENGTH] = {0};
2639 LOGI("WebGL WebGL2RenderingContextBase::getTransformFeedbackVarying index = %{public}u", index);
2640 glGetTransformFeedbackVarying(static_cast<GLuint>(programId), static_cast<GLuint>(index),
2641 static_cast<GLsizei>(bufSize), static_cast<GLsizei*>(&length),
2642 static_cast<GLsizei*>(&size), static_cast<GLenum*>(&type), name);
2643 if (bufSize > WEBGL_ACTIVE_INFO_NAME_MAX_LENGTH) {
2644 LOGE("WebGL: GetTransformFeedbackVarying: [error] bufSize exceed!");
2645 }
2646 webGLActiveInfo->SetActiveName(name);
2647 webGLActiveInfo->SetActiveSize(size);
2648 webGLActiveInfo->SetActiveType(type);
2649 LOGI("WebGL getTransformFeedbackVarying end");
2650 return res;
2651 }
2652
PauseTransformFeedback(napi_env env,napi_callback_info info)2653 napi_value WebGL2RenderingContextBase::PauseTransformFeedback(napi_env env, napi_callback_info info)
2654 {
2655 NFuncArg funcArg(env, info);
2656 LOGI("WebGL pauseTransformFeedback start");
2657 glPauseTransformFeedback();
2658 LOGI("WebGL pauseTransformFeedback end");
2659 return nullptr;
2660 }
2661
ResumeTransformFeedback(napi_env env,napi_callback_info info)2662 napi_value WebGL2RenderingContextBase::ResumeTransformFeedback(napi_env env, napi_callback_info info)
2663 {
2664 NFuncArg funcArg(env, info);
2665 LOGI("WebGL resumeTransformFeedback start");
2666 glResumeTransformFeedback();
2667 LOGI("WebGL resumeTransformFeedback end");
2668 return nullptr;
2669 }
2670
BindBufferBase(napi_env env,napi_callback_info info)2671 napi_value WebGL2RenderingContextBase::BindBufferBase(napi_env env, napi_callback_info info)
2672 {
2673 NFuncArg funcArg(env, info);
2674
2675 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
2676 return nullptr;
2677 }
2678 bool succ = false;
2679 LOGI("WebGL bindBufferBase start");
2680 int64_t target;
2681 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
2682 if (!succ) {
2683 return nullptr;
2684 }
2685 LOGI("WebGL WebGL2RenderingContextBase::bindBufferBase target = %{public}u", target);
2686 int64_t index;
2687 tie(succ, index) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2688 if (!succ) {
2689 return nullptr;
2690 }
2691 LOGI("WebGL WebGL2RenderingContextBase::bindBufferBase index = %{public}u", index);
2692 if (funcArg[NARG_POS::THIRD] == nullptr) {
2693 return nullptr;
2694 }
2695 WebGLBuffer *webGlBuffer = nullptr;
2696 napi_status bufferStatus = napi_unwrap(env, funcArg[NARG_POS::THIRD], (void **)&webGlBuffer);
2697 if (bufferStatus != napi_ok) {
2698 return nullptr;
2699 }
2700 unsigned int buffer = webGlBuffer->GetBuffer();
2701 LOGI("WebGL WebGLRenderContext::WebGL2RenderingContextBase bindBufferBase buffer= %{public}u", buffer);
2702 glBindBufferBase(static_cast<GLenum>(target), static_cast<GLuint>(index), static_cast<GLuint>(buffer));
2703 LOGI("WebGL bindBufferBase end");
2704 return nullptr;
2705 }
2706
BindBufferRange(napi_env env,napi_callback_info info)2707 napi_value WebGL2RenderingContextBase::BindBufferRange(napi_env env, napi_callback_info info)
2708 {
2709 NFuncArg funcArg(env, info);
2710 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
2711 return nullptr;
2712 }
2713 bool succ = false;
2714 LOGI("WebGL bindBufferRange start");
2715 int64_t target;
2716 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
2717 if (!succ) {
2718 return nullptr;
2719 }
2720 LOGI("WebGL WebGL2RenderingContextBase::bindBufferRange target = %{public}u", target);
2721 int64_t index;
2722 tie(succ, index) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2723 if (!succ) {
2724 return nullptr;
2725 }
2726 LOGI("WebGL WebGL2RenderingContextBase::bindBufferRange index = %{public}u", index);
2727 if (funcArg[NARG_POS::THIRD] == nullptr) {
2728 return nullptr;
2729 }
2730 WebGLBuffer *webGlBuffer = nullptr;
2731 napi_status bufferStatus = napi_unwrap(env, funcArg[NARG_POS::THIRD], (void **)&webGlBuffer);
2732 if (bufferStatus != napi_ok) {
2733 return nullptr;
2734 }
2735 unsigned int buffer = webGlBuffer->GetBuffer();
2736 LOGI("WebGL WebGLRenderContext::WebGL2RenderingContextBase bindBufferRange buffer= %{public}u", buffer);
2737 int64_t offset;
2738 tie(succ, offset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
2739 if (!succ) {
2740 return nullptr;
2741 }
2742 LOGI("WebGL WebGL2RenderingContextBase::bindBufferRange offset = %{public}u", offset);
2743 int64_t size;
2744 tie(succ, size) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
2745 if (!succ) {
2746 return nullptr;
2747 }
2748 LOGI("WebGL WebGL2RenderingContextBase::bindBufferRange size = %{public}u", size);
2749 glBindBufferRange(static_cast<GLenum>(target), static_cast<GLuint>(index), static_cast<GLuint>(buffer),
2750 static_cast<GLintptr>(offset), static_cast<GLsizeiptr>(size));
2751 LOGI("WebGL bindBufferRange end");
2752 return nullptr;
2753 }
2754
GetIndexedParameter(napi_env env,napi_callback_info info)2755 napi_value WebGL2RenderingContextBase::GetIndexedParameter(napi_env env, napi_callback_info info)
2756 {
2757 NFuncArg funcArg(env, info);
2758 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
2759 return nullptr;
2760 }
2761 bool succ = false;
2762 LOGI("WebGL getIndexedParameter start");
2763 int64_t target;
2764 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
2765 if (!succ) {
2766 return nullptr;
2767 }
2768 LOGI("WebGL WebGL2RenderingContextBase::getIndexedParameter target = %{public}u", target);
2769 int64_t index;
2770 tie(succ, index) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2771 if (!succ) {
2772 return nullptr;
2773 }
2774 LOGI("WebGL WebGL2RenderingContextBase::getIndexedParameter index = %{public}u", index);
2775 if (target == GL_TRANSFORM_FEEDBACK_BUFFER_BINDING || target == GL_UNIFORM_BUFFER_BINDING) {
2776 LOGI("WebGL getIndexedParameter return webGLBuffer start");
2777 napi_value objBuffer = NClass::InstantiateClass(env, WebGLBuffer::className, {});
2778 if (!objBuffer) {
2779 return nullptr;
2780 }
2781 auto webGlBuffer = NClass::GetEntityOf<WebGLBuffer>(env, objBuffer);
2782 if (!webGlBuffer) {
2783 return nullptr;
2784 }
2785 webGlBuffer->SetBuffer(index);
2786 LOGI("WebGL getIndexedParameter end");
2787 return objBuffer;
2788 } else if (target == GL_TRANSFORM_FEEDBACK_BUFFER_SIZE || target == GL_UNIFORM_BUFFER_SIZE) {
2789 int64_t data;
2790 glGetInteger64i_v(target, index, &data);
2791 LOGI("WebGL getIndexedParameter end");
2792 return NVal::CreateInt64(env, data).val_;
2793 } else if (target == GL_UNIFORM_BUFFER_SIZE || target == GL_UNIFORM_BUFFER_START) {
2794 int64_t data;
2795 glGetInteger64i_v(target, index, &data);
2796 LOGI("WebGL getIndexedParameter end");
2797 return NVal::CreateInt64(env, data).val_;
2798 } else {
2799 LOGI("WebGL getIndexedParameter end");
2800 return nullptr;
2801 }
2802 }
2803
GetUniformBlockIndex(napi_env env,napi_callback_info info)2804 napi_value WebGL2RenderingContextBase::GetUniformBlockIndex(napi_env env, napi_callback_info info)
2805 {
2806 NFuncArg funcArg(env, info);
2807
2808 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
2809 return nullptr;
2810 }
2811 if (funcArg[NARG_POS::FIRST] == nullptr) {
2812 return nullptr;
2813 }
2814 bool succ = false;
2815 LOGI("WebGL2 getUniformBlockIndex start");
2816 WebGLProgram *webGlProgram = nullptr;
2817 napi_status programStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **)&webGlProgram);
2818 if (programStatus != napi_ok) {
2819 return nullptr;
2820 }
2821 int programId = webGlProgram->GetProgramId();
2822 LOGI("WebGL2 WebGL2RenderContext::getUniformBlockIndex programId = %{public}u", programId);
2823 unique_ptr<char[]> name;
2824 tie(succ, name, ignore) = NVal(env, funcArg[NARG_POS::SECOND]).ToUTF8String();
2825 if (!succ) {
2826 return nullptr;
2827 }
2828 const GLchar *uniformBlockName = name.get();
2829 LOGI("WebGL2 WebGL2RenderContext::getUniformBlockIndex uniformBlockName = %{public}s", name.get());
2830 GLuint returnValue = glGetUniformBlockIndex(static_cast<GLuint>(programId), uniformBlockName);
2831 int64_t res = static_cast<int64_t>(returnValue);
2832 LOGI("WebGL2 getUniformBlockIndex end");
2833 return NVal::CreateInt64(env, res).val_;
2834 }
2835
UniformBlockBinding(napi_env env,napi_callback_info info)2836 napi_value WebGL2RenderingContextBase::UniformBlockBinding(napi_env env, napi_callback_info info)
2837 {
2838 NFuncArg funcArg(env, info);
2839
2840 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
2841 return nullptr;
2842 }
2843 if (funcArg[NARG_POS::FIRST] == nullptr) {
2844 return nullptr;
2845 }
2846 bool succ = false;
2847 LOGI("WebGL2 uniformBlockBinding start");
2848 WebGLProgram *webGlProgram = nullptr;
2849 napi_status programStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **)&webGlProgram);
2850 if (programStatus != napi_ok) {
2851 return nullptr;
2852 }
2853 int programId = webGlProgram->GetProgramId();
2854 LOGI("WebGL2 WebGL2RenderContext::uniformBlockBinding programId = %{public}u", programId);
2855 int64_t uniformBlockIndex;
2856 tie(succ, uniformBlockIndex) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
2857 if (!succ) {
2858 return nullptr;
2859 }
2860 LOGI("WebGL2 WebGL2RenderContext::uniformBlockBinding uniformBlockIndex = %{public}u", uniformBlockIndex);
2861 int64_t uniformBlockBinding;
2862 tie(succ, uniformBlockBinding) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
2863 if (!succ) {
2864 return nullptr;
2865 }
2866 LOGI("WebGL2 WebGL2RenderContext::uniformBlockBinding uniformBlockBinding = %{public}u", uniformBlockBinding);
2867 glUniformBlockBinding(static_cast<GLuint>(programId), static_cast<GLuint>(uniformBlockIndex),
2868 static_cast<GLuint>(uniformBlockBinding));
2869 LOGI("WebGL2 uniformBlockBinding end");
2870 return nullptr;
2871 }
2872
CreateVertexArray(napi_env env,napi_callback_info info)2873 napi_value WebGL2RenderingContextBase::CreateVertexArray(napi_env env, napi_callback_info info)
2874 {
2875 LOGI("WebGL2 createVertexArray start");
2876 napi_value objVertexArrayObject = NClass::InstantiateClass(env, WebGLVertexArrayObject::className, {});
2877 if (!objVertexArrayObject) {
2878 return nullptr;
2879 }
2880 auto webGLVertexArrayObject = NClass::GetEntityOf<WebGLVertexArrayObject>(env, objVertexArrayObject);
2881 if (!webGLVertexArrayObject) {
2882 return nullptr;
2883 }
2884 unsigned int vertexArraysId;
2885 glGenVertexArrays(1, &vertexArraysId);
2886 webGLVertexArrayObject->SetVertexArrays(vertexArraysId);
2887 LOGI("WebGL2 WebGL2RenderingContextBase::createVertexArray vertexArraysId = %{public}u", vertexArraysId);
2888 LOGI("WebGL2 createVertexArray end");
2889 return objVertexArrayObject;
2890 }
2891
DeleteVertexArray(napi_env env,napi_callback_info info)2892 napi_value WebGL2RenderingContextBase::DeleteVertexArray(napi_env env, napi_callback_info info)
2893 {
2894 NFuncArg funcArg(env, info);
2895
2896 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
2897 return nullptr;
2898 }
2899 LOGI("WebGL deleteVertexArray start");
2900 if (funcArg[NARG_POS::FIRST] == nullptr) {
2901 return nullptr;
2902 }
2903 WebGLVertexArrayObject *webGLVertexArrayObject = nullptr;
2904 napi_status vertexArraysStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **)&webGLVertexArrayObject);
2905 if (vertexArraysStatus != napi_ok) {
2906 return nullptr;
2907 }
2908 unsigned int vertexArrays = webGLVertexArrayObject->GetVertexArrays();
2909
2910 glDeleteVertexArrays(1, &vertexArrays);
2911 LOGI("WebGL deleteVertexArray end");
2912 return nullptr;
2913 }
2914
IsVertexArray(napi_env env,napi_callback_info info)2915 napi_value WebGL2RenderingContextBase::IsVertexArray(napi_env env, napi_callback_info info)
2916 {
2917 NFuncArg funcArg(env, info);
2918 bool res = false;
2919 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
2920 return NVal::CreateBool(env, res).val_;
2921 }
2922 LOGI("WebGL isVertexArray start");
2923 if (funcArg[NARG_POS::FIRST] == nullptr) {
2924 return NVal::CreateBool(env, res).val_;
2925 }
2926 WebGLVertexArrayObject *webGlVertexArrayObject = nullptr;
2927 napi_status vertexArraysStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **)&webGlVertexArrayObject);
2928 if (vertexArraysStatus != napi_ok) {
2929 return NVal::CreateBool(env, res).val_;
2930 }
2931 unsigned int vertexArrays = webGlVertexArrayObject->GetVertexArrays();
2932 GLboolean returnValue = glIsVertexArray(static_cast<GLuint>(vertexArrays));
2933 res = static_cast<bool>(returnValue);
2934 LOGI("WebGL isVertexArray end");
2935 return NVal::CreateBool(env, res).val_;
2936 }
2937
BindVertexArray(napi_env env,napi_callback_info info)2938 napi_value WebGL2RenderingContextBase::BindVertexArray(napi_env env, napi_callback_info info)
2939 {
2940 NFuncArg funcArg(env, info);
2941
2942 if (!funcArg.InitArgs(NARG_CNT::ONE)) {
2943 return nullptr;
2944 }
2945 if (funcArg[NARG_POS::FIRST] == nullptr) {
2946 return nullptr;
2947 }
2948 LOGI("WebGL bindVertexArray start");
2949 WebGLVertexArrayObject *webGlVertexArrayObject = nullptr;
2950 napi_status vertexArraysStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **)&webGlVertexArrayObject);
2951 if (vertexArraysStatus != napi_ok) {
2952 return nullptr;
2953 }
2954 unsigned int vertexArrays = webGlVertexArrayObject->GetVertexArrays();
2955 glBindVertexArray(static_cast<GLuint>(vertexArrays));
2956 LOGI("WebGL bindVertexArray end");
2957 return nullptr;
2958 }
2959
Uniform1uiv(napi_env env,napi_callback_info info)2960 napi_value WebGL2RenderingContextBase::Uniform1uiv(napi_env env, napi_callback_info info)
2961 {
2962 NFuncArg funcArg(env, info);
2963
2964 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FOUR)) {
2965 return nullptr;
2966 }
2967
2968 LOGI("WebGL2 uniform1uiv start");
2969 bool succ = false;
2970 WebGLUniformLocation *webGLUniformLocation = nullptr;
2971 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
2972 if (locationStatus != napi_ok) {
2973 return nullptr;
2974 }
2975 int location = webGLUniformLocation->GetUniformLocationId();
2976 LOGI("WebGL2 WebGLRenderContext::uniform1uiv location = %{public}u", location);
2977 if (funcArg[NARG_POS::THIRD] == nullptr) {
2978 return nullptr;
2979 }
2980 int64_t srcOffset = 0;
2981 if (funcArg[NARG_POS::THIRD] != nullptr) {
2982 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
2983 if (!succ) {
2984 return nullptr;
2985 }
2986 LOGI("WebGL2 WebGL2RenderingContextBase::uniform1uiv srcOffset = %{public}u", srcOffset);
2987 }
2988 int64_t srcLength = 0;
2989 if (funcArg[NARG_POS::FOURTH] != nullptr) {
2990 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
2991 if (!succ) {
2992 return nullptr;
2993 }
2994 LOGI("WebGL2 WebGL2RenderingContextBase::uniform1uiv srcLength = %{public}u", srcLength);
2995 }
2996 napi_value array = funcArg[NARG_POS::SECOND];
2997 bool isArray = false;
2998 tie(succ, isArray) = NVal(env, array).IsArray();
2999 if (isArray) {
3000 LOGI("WebGL2 uniform1uiv is Array");
3001 uint32_t length;
3002 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3003 if (lengthStatus != napi_ok) {
3004 return nullptr;
3005 }
3006 float uniform1uiv[length];
3007 uint32_t i;
3008 for (i = 0; i < length; i++) {
3009 napi_value element;
3010 napi_status eleStatus = napi_get_element(env, array, i, &element);
3011 if (eleStatus != napi_ok) {
3012 return nullptr;
3013 }
3014 double ele;
3015 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3016 if (doubleStatus != napi_ok) {
3017 return nullptr;
3018 }
3019 uniform1uiv[i] = static_cast<float>(ele);
3020 }
3021 glUniform1uiv(static_cast<GLint>(location), static_cast<GLsizei>(srcLength),
3022 reinterpret_cast<GLuint *>(uniform1uiv + srcOffset));
3023 LOGI("WebGL2 uniform1uiv array end");
3024 return nullptr;
3025 }
3026 bool isTypedarray = false;
3027 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3028 if (!isTypedarray || !succ) {
3029 return nullptr;
3030 }
3031 void *data = nullptr;
3032 size_t length;
3033 napi_typedarray_type type;
3034 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3035 if (!succ) {
3036 return nullptr;
3037 }
3038 if (type == napi_float32_array) {
3039 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3040 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3041 if (ret != EOK) {
3042 LOGE("WebGL2 uniform1uiv memcpy_s failed");
3043 return nullptr;
3044 }
3045 glUniform1uiv(static_cast<GLint>(location), static_cast<GLsizei>(srcLength),
3046 reinterpret_cast<GLuint *>(inputFloat));
3047 }
3048 LOGI("WebGL2 uniform1uiv typeArray end");
3049 return nullptr;
3050 }
3051
Uniform2uiv(napi_env env,napi_callback_info info)3052 napi_value WebGL2RenderingContextBase::Uniform2uiv(napi_env env, napi_callback_info info)
3053 {
3054 NFuncArg funcArg(env, info);
3055
3056 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FOUR)) {
3057 return nullptr;
3058 }
3059
3060 LOGI("WebGL2 uniform2uiv start");
3061 bool succ = false;
3062 WebGLUniformLocation *webGLUniformLocation = nullptr;
3063 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
3064 if (locationStatus != napi_ok) {
3065 return nullptr;
3066 }
3067 int location = webGLUniformLocation->GetUniformLocationId();
3068 LOGI("WebGL2 WebGLRenderContext::uniform2uiv location = %{public}u", location);
3069 if (funcArg[NARG_POS::THIRD] == nullptr) {
3070 return nullptr;
3071 }
3072 int64_t srcOffset = 0;
3073 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3074 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
3075 if (!succ) {
3076 return nullptr;
3077 }
3078 LOGI("WebGL2 WebGL2RenderingContextBase::uniform2uiv srcOffset = %{public}u", srcOffset);
3079 }
3080 int64_t srcLength = 0;
3081 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3082 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
3083 if (!succ) {
3084 return nullptr;
3085 }
3086 LOGI("WebGL2 WebGL2RenderingContextBase::uniform2uiv srcLength = %{public}u", srcLength);
3087 }
3088 napi_value array = funcArg[NARG_POS::SECOND];
3089 bool isArray = false;
3090 tie(succ, isArray) = NVal(env, array).IsArray();
3091 if (isArray) {
3092 LOGI("WebGL2 uniform2uiv is Array");
3093 uint32_t length;
3094 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3095 if (lengthStatus != napi_ok) {
3096 return nullptr;
3097 }
3098 float uniform2uiv[length];
3099 uint32_t i;
3100 for (i = 0; i < length; i++) {
3101 napi_value element;
3102 napi_status eleStatus = napi_get_element(env, array, i, &element);
3103 if (eleStatus != napi_ok) {
3104 return nullptr;
3105 }
3106 double ele;
3107 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3108 if (doubleStatus != napi_ok) {
3109 return nullptr;
3110 }
3111 uniform2uiv[i] = static_cast<float>(ele);
3112 }
3113 glUniform2uiv(static_cast<GLint>(location), static_cast<GLsizei>(srcLength),
3114 reinterpret_cast<GLuint *>(uniform2uiv + srcOffset));
3115 LOGI("WebGL2 uniform2uiv array end");
3116 return nullptr;
3117 }
3118 bool isTypedarray = false;
3119 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3120 if (!isTypedarray || !succ) {
3121 return nullptr;
3122 }
3123 void *data = nullptr;
3124 size_t length;
3125 napi_typedarray_type type;
3126 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3127 if (!succ) {
3128 return nullptr;
3129 }
3130 if (type == napi_float32_array) {
3131 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3132 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3133 if (ret != EOK) {
3134 LOGE("WebGL2 uniform2uiv memcpy_s failed");
3135 return nullptr;
3136 }
3137 glUniform2uiv(static_cast<GLint>(location), static_cast<GLsizei>(srcLength),
3138 reinterpret_cast<GLuint *>(inputFloat));
3139 }
3140 LOGI("WebGL2 uniform2uiv typeArray end");
3141 return nullptr;
3142 }
3143
Uniform3uiv(napi_env env,napi_callback_info info)3144 napi_value WebGL2RenderingContextBase::Uniform3uiv(napi_env env, napi_callback_info info)
3145 {
3146 NFuncArg funcArg(env, info);
3147
3148 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FOUR)) {
3149 return nullptr;
3150 }
3151
3152 LOGI("WebGL2 uniform3uiv start");
3153 bool succ = false;
3154 WebGLUniformLocation *webGLUniformLocation = nullptr;
3155 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
3156 if (locationStatus != napi_ok) {
3157 return nullptr;
3158 }
3159 int location = webGLUniformLocation->GetUniformLocationId();
3160 LOGI("WebGL2 WebGLRenderContext::uniform3uiv location = %{public}u", location);
3161 if (funcArg[NARG_POS::THIRD] == nullptr) {
3162 return nullptr;
3163 }
3164 int64_t srcOffset = 0;
3165 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3166 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
3167 if (!succ) {
3168 return nullptr;
3169 }
3170 LOGI("WebGL2 WebGL2RenderingContextBase::uniform3uiv srcOffset = %{public}u", srcOffset);
3171 }
3172 int64_t srcLength = 0;
3173 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3174 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
3175 if (!succ) {
3176 return nullptr;
3177 }
3178 LOGI("WebGL2 WebGL2RenderingContextBase::uniform3uiv srcLength = %{public}u", srcLength);
3179 }
3180 napi_value array = funcArg[NARG_POS::SECOND];
3181 bool isArray = false;
3182 tie(succ, isArray) = NVal(env, array).IsArray();
3183 if (isArray) {
3184 LOGI("WebGL2 uniform3uiv is Array");
3185 uint32_t length;
3186 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3187 if (lengthStatus != napi_ok) {
3188 return nullptr;
3189 }
3190 float uniform3uiv[length];
3191 uint32_t i;
3192 for (i = 0; i < length; i++) {
3193 napi_value element;
3194 napi_status eleStatus = napi_get_element(env, array, i, &element);
3195 if (eleStatus != napi_ok) {
3196 return nullptr;
3197 }
3198 double ele;
3199 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3200 if (doubleStatus != napi_ok) {
3201 return nullptr;
3202 }
3203 uniform3uiv[i] = static_cast<float>(ele);
3204 }
3205 glUniform3uiv(static_cast<GLint>(location), static_cast<GLsizei>(srcLength),
3206 reinterpret_cast<GLuint *>(uniform3uiv + srcOffset));
3207 LOGI("WebGL2 uniform3uiv array end");
3208 return nullptr;
3209 }
3210 bool isTypedarray = false;
3211 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3212 if (!isTypedarray || !succ) {
3213 return nullptr;
3214 }
3215 void *data = nullptr;
3216 size_t length;
3217 napi_typedarray_type type;
3218 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3219 if (!succ) {
3220 return nullptr;
3221 }
3222 if (type == napi_float32_array) {
3223 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3224 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3225 if (ret != EOK) {
3226 LOGE("WebGL2 uniform3uiv memcpy_s failed");
3227 return nullptr;
3228 }
3229 glUniform3uiv(static_cast<GLint>(location), static_cast<GLsizei>(srcLength),
3230 reinterpret_cast<GLuint *>(inputFloat));
3231 }
3232 LOGI("WebGL2 uniform3uiv typeArray end");
3233 return nullptr;
3234 }
3235
Uniform4uiv(napi_env env,napi_callback_info info)3236 napi_value WebGL2RenderingContextBase::Uniform4uiv(napi_env env, napi_callback_info info)
3237 {
3238 NFuncArg funcArg(env, info);
3239
3240 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FOUR)) {
3241 return nullptr;
3242 }
3243
3244 LOGI("WebGL2 uniform4uiv start");
3245 bool succ = false;
3246 WebGLUniformLocation *webGLUniformLocation = nullptr;
3247 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
3248 if (locationStatus != napi_ok) {
3249 return nullptr;
3250 }
3251 int location = webGLUniformLocation->GetUniformLocationId();
3252 LOGI("WebGL2 WebGLRenderContext::uniform4uiv location = %{public}u", location);
3253 if (funcArg[NARG_POS::THIRD] == nullptr) {
3254 return nullptr;
3255 }
3256 int64_t srcOffset = 0;
3257 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3258 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
3259 if (!succ) {
3260 return nullptr;
3261 }
3262 LOGI("WebGL2 WebGL2RenderingContextBase::uniform4uiv srcOffset = %{public}u", srcOffset);
3263 }
3264 int64_t srcLength = 0;
3265 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3266 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
3267 if (!succ) {
3268 return nullptr;
3269 }
3270 LOGI("WebGL2 WebGL2RenderingContextBase::uniform4uiv srcLength = %{public}u", srcLength);
3271 }
3272 napi_value array = funcArg[NARG_POS::SECOND];
3273 bool isArray = false;
3274 tie(succ, isArray) = NVal(env, array).IsArray();
3275 if (isArray) {
3276 LOGI("WebGL2 uniform4uiv is Array");
3277 uint32_t length;
3278 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3279 if (lengthStatus != napi_ok) {
3280 return nullptr;
3281 }
3282 float uniform4uiv[length];
3283 uint32_t i;
3284 for (i = 0; i < length; i++) {
3285 napi_value element;
3286 napi_status eleStatus = napi_get_element(env, array, i, &element);
3287 if (eleStatus != napi_ok) {
3288 return nullptr;
3289 }
3290 double ele;
3291 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3292 if (doubleStatus != napi_ok) {
3293 return nullptr;
3294 }
3295 uniform4uiv[i] = static_cast<float>(ele);
3296 }
3297 glUniform4uiv(static_cast<GLint>(location), static_cast<GLsizei>(srcLength),
3298 reinterpret_cast<GLuint *>(uniform4uiv + srcOffset));
3299 LOGI("WebGL2 uniform4uiv array end");
3300 return nullptr;
3301 }
3302 bool isTypedarray = false;
3303 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3304 if (!isTypedarray || !succ) {
3305 return nullptr;
3306 }
3307 void *data = nullptr;
3308 size_t length;
3309 napi_typedarray_type type;
3310 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3311 if (!succ) {
3312 return nullptr;
3313 }
3314 if (type == napi_float32_array) {
3315 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3316 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3317 if (ret != EOK) {
3318 LOGE("WebGL2 uniform4uiv memcpy_s failed");
3319 return nullptr;
3320 }
3321 glUniform4uiv(static_cast<GLint>(location), static_cast<GLsizei>(srcLength),
3322 reinterpret_cast<GLuint *>(inputFloat));
3323 }
3324 LOGI("WebGL2 uniform4uiv typeArray end");
3325 return nullptr;
3326 }
3327
UniformMatrix3x2fv(napi_env env,napi_callback_info info)3328 napi_value WebGL2RenderingContextBase::UniformMatrix3x2fv(napi_env env, napi_callback_info info)
3329 {
3330 NFuncArg funcArg(env, info);
3331
3332 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FIVE)) {
3333 return nullptr;
3334 }
3335
3336 LOGI("WebGL2 uniformMatrix3x2fv start");
3337 bool succ = false;
3338 WebGLUniformLocation *webGLUniformLocation = nullptr;
3339 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
3340 if (locationStatus != napi_ok) {
3341 return nullptr;
3342 }
3343 int location = webGLUniformLocation->GetUniformLocationId();
3344 LOGI("WebGL2 WebGLRenderContext::uniformMatrix3x2fv location = %{public}u", location);
3345 if (funcArg[NARG_POS::SECOND] == nullptr) {
3346 return nullptr;
3347 }
3348 bool transpose = false;
3349 tie(succ, transpose) = NVal(env, funcArg[NARG_POS::SECOND]).ToBool();
3350 if (!succ) {
3351 return nullptr;
3352 }
3353 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix3x2fv transpose = %{public}u", transpose);
3354
3355 int64_t srcOffset = 0;
3356 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3357 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
3358 if (!succ) {
3359 return nullptr;
3360 }
3361 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix3x2fv srcOffset = %{public}u", srcOffset);
3362 }
3363 int64_t srcLength = 0;
3364 if (funcArg[NARG_POS::FIFTH] != nullptr) {
3365 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
3366 if (!succ) {
3367 return nullptr;
3368 }
3369 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix3x2fv srcLength = %{public}u", srcLength);
3370 }
3371 napi_value array = funcArg[NARG_POS::THIRD];
3372 bool isArray = false;
3373 tie(succ, isArray) = NVal(env, array).IsArray();
3374 if (isArray) {
3375 LOGI("WebGL2 uniformMatrix3x2fv is Array");
3376 uint32_t length;
3377 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3378 if (lengthStatus != napi_ok) {
3379 return nullptr;
3380 }
3381 float uniformMatrix3x2fv[length];
3382 uint32_t i;
3383 for (i = 0; i < length; i++) {
3384 napi_value element;
3385 napi_status eleStatus = napi_get_element(env, array, i, &element);
3386 if (eleStatus != napi_ok) {
3387 return nullptr;
3388 }
3389 double ele;
3390 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3391 if (doubleStatus != napi_ok) {
3392 return nullptr;
3393 }
3394 uniformMatrix3x2fv[i] = static_cast<float>(ele);
3395 }
3396 glUniformMatrix3x2fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3397 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(uniformMatrix3x2fv + srcOffset));
3398 LOGI("WebGL2 uniformMatrix3x2fv array end");
3399 return nullptr;
3400 }
3401 bool isTypedarray = false;
3402 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3403 if (!isTypedarray || !succ) {
3404 return nullptr;
3405 }
3406 void *data = nullptr;
3407 size_t length;
3408 napi_typedarray_type type;
3409 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3410 if (!succ) {
3411 return nullptr;
3412 }
3413 if (type == napi_float32_array) {
3414 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3415 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3416 if (ret != EOK) {
3417 LOGE("WebGL2 uniformMatrix3x2fv memcpy_s failed");
3418 return nullptr;
3419 }
3420 glUniformMatrix3x2fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3421 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(inputFloat));
3422 }
3423 LOGI("WebGL2 uniformMatrix3x2fv typeArray end");
3424 return nullptr;
3425 }
3426
UniformMatrix4x2fv(napi_env env,napi_callback_info info)3427 napi_value WebGL2RenderingContextBase::UniformMatrix4x2fv(napi_env env, napi_callback_info info)
3428 {
3429 NFuncArg funcArg(env, info);
3430
3431 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FIVE)) {
3432 return nullptr;
3433 }
3434
3435 LOGI("WebGL2 uniformMatrix4x2fv start");
3436 bool succ = false;
3437 WebGLUniformLocation *webGLUniformLocation = nullptr;
3438 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
3439 if (locationStatus != napi_ok) {
3440 return nullptr;
3441 }
3442 int location = webGLUniformLocation->GetUniformLocationId();
3443 LOGI("WebGL2 WebGLRenderContext::uniformMatrix4x2fv location = %{public}u", location);
3444 if (funcArg[NARG_POS::SECOND] == nullptr) {
3445 return nullptr;
3446 }
3447 bool transpose = false;
3448 tie(succ, transpose) = NVal(env, funcArg[NARG_POS::SECOND]).ToBool();
3449 if (!succ) {
3450 return nullptr;
3451 }
3452 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix4x2fv transpose = %{public}u", transpose);
3453
3454 int64_t srcOffset = 0;
3455 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3456 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
3457 if (!succ) {
3458 return nullptr;
3459 }
3460 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix4x2fv srcOffset = %{public}u", srcOffset);
3461 }
3462 int64_t srcLength = 0;
3463 if (funcArg[NARG_POS::FIFTH] != nullptr) {
3464 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
3465 if (!succ) {
3466 return nullptr;
3467 }
3468 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix4x2fv srcLength = %{public}u", srcLength);
3469 }
3470 napi_value array = funcArg[NARG_POS::THIRD];
3471 bool isArray = false;
3472 tie(succ, isArray) = NVal(env, array).IsArray();
3473 if (isArray) {
3474 LOGI("WebGL2 uniformMatrix4x2fv is Array");
3475 uint32_t length;
3476 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3477 if (lengthStatus != napi_ok) {
3478 return nullptr;
3479 }
3480 float uniformMatrix4x2fv[length];
3481 uint32_t i;
3482 for (i = 0; i < length; i++) {
3483 napi_value element;
3484 napi_status eleStatus = napi_get_element(env, array, i, &element);
3485 if (eleStatus != napi_ok) {
3486 return nullptr;
3487 }
3488 double ele;
3489 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3490 if (doubleStatus != napi_ok) {
3491 return nullptr;
3492 }
3493 uniformMatrix4x2fv[i] = static_cast<float>(ele);
3494 }
3495 glUniformMatrix4x2fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3496 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(uniformMatrix4x2fv + srcOffset));
3497 LOGI("WebGL2 uniformMatrix4x2fv array end");
3498 return nullptr;
3499 }
3500 bool isTypedarray = false;
3501 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3502 if (!isTypedarray || !succ) {
3503 return nullptr;
3504 }
3505 void *data = nullptr;
3506 size_t length;
3507 napi_typedarray_type type;
3508 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3509 if (!succ) {
3510 return nullptr;
3511 }
3512 if (type == napi_float32_array) {
3513 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3514 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3515 if (ret != EOK) {
3516 LOGE("WebGL2 uniformMatrix4x2fv memcpy_s failed");
3517 return nullptr;
3518 }
3519 glUniformMatrix4x2fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3520 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(inputFloat));
3521 }
3522 LOGI("WebGL2 uniformMatrix4x2fv typeArray end");
3523 return nullptr;
3524 }
3525
UniformMatrix2x3fv(napi_env env,napi_callback_info info)3526 napi_value WebGL2RenderingContextBase::UniformMatrix2x3fv(napi_env env, napi_callback_info info)
3527 {
3528 NFuncArg funcArg(env, info);
3529
3530 if (!funcArg.InitArgs(NARG_CNT::THREE, NARG_CNT::FIVE)) {
3531 return nullptr;
3532 }
3533
3534 LOGI("WebGL2 uniformMatrix2x3fv start");
3535 bool succ = false;
3536 WebGLUniformLocation *webGLUniformLocation = nullptr;
3537 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
3538 if (locationStatus != napi_ok) {
3539 return nullptr;
3540 }
3541 int location = webGLUniformLocation->GetUniformLocationId();
3542 LOGI("WebGL2 WebGLRenderContext::uniformMatrix2x3fv location = %{public}u", location);
3543 if (funcArg[NARG_POS::SECOND] == nullptr) {
3544 return nullptr;
3545 }
3546 bool transpose = false;
3547 tie(succ, transpose) = NVal(env, funcArg[NARG_POS::SECOND]).ToBool();
3548 if (!succ) {
3549 return nullptr;
3550 }
3551 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix2x3fv transpose = %{public}u", transpose);
3552
3553 int64_t srcOffset = 0;
3554 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3555 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
3556 if (!succ) {
3557 return nullptr;
3558 }
3559 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix2x3fv srcOffset = %{public}u", srcOffset);
3560 }
3561 int64_t srcLength = 0;
3562 if (funcArg[NARG_POS::FIFTH] != nullptr) {
3563 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
3564 if (!succ) {
3565 return nullptr;
3566 }
3567 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix2x3fv srcLength = %{public}u", srcLength);
3568 }
3569 napi_value array = funcArg[NARG_POS::THIRD];
3570 bool isArray = false;
3571 tie(succ, isArray) = NVal(env, array).IsArray();
3572 if (isArray) {
3573 LOGI("WebGL2 uniformMatrix2x3fv is Array");
3574 uint32_t length;
3575 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3576 if (lengthStatus != napi_ok) {
3577 return nullptr;
3578 }
3579 float uniformMatrix2x3fv[length];
3580 uint32_t i;
3581 for (i = 0; i < length; i++) {
3582 napi_value element;
3583 napi_status eleStatus = napi_get_element(env, array, i, &element);
3584 if (eleStatus != napi_ok) {
3585 return nullptr;
3586 }
3587 double ele;
3588 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3589 if (doubleStatus != napi_ok) {
3590 return nullptr;
3591 }
3592 uniformMatrix2x3fv[i] = static_cast<float>(ele);
3593 }
3594 glUniformMatrix2x3fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3595 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(uniformMatrix2x3fv + srcOffset));
3596 LOGI("WebGL2 uniformMatrix2x3fv array end");
3597 return nullptr;
3598 }
3599 bool isTypedarray = false;
3600 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3601 if (!isTypedarray || !succ) {
3602 return nullptr;
3603 }
3604 void *data = nullptr;
3605 size_t length;
3606 napi_typedarray_type type;
3607 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3608 if (!succ) {
3609 return nullptr;
3610 }
3611 if (type == napi_float32_array) {
3612 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3613 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3614 if (ret != EOK) {
3615 LOGE("WebGL2 uniformMatrix2x3fv memcpy_s failed");
3616 return nullptr;
3617 }
3618 glUniformMatrix2x3fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3619 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(inputFloat));
3620 }
3621 LOGI("WebGL2 uniformMatrix2x3fv typeArray end");
3622 return nullptr;
3623 }
3624
UniformMatrix4x3fv(napi_env env,napi_callback_info info)3625 napi_value WebGL2RenderingContextBase::UniformMatrix4x3fv(napi_env env, napi_callback_info info)
3626 {
3627 NFuncArg funcArg(env, info);
3628
3629 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
3630 return nullptr;
3631 }
3632 LOGI("WebGL2 uniformMatrix4x3fv start");
3633 bool succ = false;
3634 WebGLUniformLocation *webGLUniformLocation = nullptr;
3635 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
3636 if (locationStatus != napi_ok) {
3637 return nullptr;
3638 }
3639 int location = webGLUniformLocation->GetUniformLocationId();
3640 LOGI("WebGL2 WebGLRenderContext::uniformMatrix4x3fv location = %{public}u", location);
3641 if (funcArg[NARG_POS::SECOND] == nullptr) {
3642 return nullptr;
3643 }
3644 bool transpose = false;
3645 tie(succ, transpose) = NVal(env, funcArg[NARG_POS::SECOND]).ToBool();
3646 if (!succ) {
3647 return nullptr;
3648 }
3649 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix4x3fv transpose = %{public}u", transpose);
3650
3651 int64_t srcOffset = 0;
3652 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3653 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
3654 if (!succ) {
3655 return nullptr;
3656 }
3657 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix4x3fv srcOffset = %{public}u", srcOffset);
3658 }
3659 int64_t srcLength = 0;
3660 if (funcArg[NARG_POS::FIFTH] != nullptr) {
3661 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
3662 if (!succ) {
3663 return nullptr;
3664 }
3665 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix4x3fv srcLength = %{public}u", srcLength);
3666 }
3667 napi_value array = funcArg[NARG_POS::THIRD];
3668 bool isArray = false;
3669 tie(succ, isArray) = NVal(env, array).IsArray();
3670 if (isArray) {
3671 LOGI("WebGL2 uniformMatrix4x3fv is Array");
3672 uint32_t length;
3673 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3674 if (lengthStatus != napi_ok) {
3675 return nullptr;
3676 }
3677 float uniformMatrix4x3fv[length];
3678 uint32_t i;
3679 for (i = 0; i < length; i++) {
3680 napi_value element;
3681 napi_status eleStatus = napi_get_element(env, array, i, &element);
3682 if (eleStatus != napi_ok) {
3683 return nullptr;
3684 }
3685 double ele;
3686 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3687 if (doubleStatus != napi_ok) {
3688 return nullptr;
3689 }
3690 uniformMatrix4x3fv[i] = static_cast<float>(ele);
3691 }
3692 glUniformMatrix4x3fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3693 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(uniformMatrix4x3fv + srcOffset));
3694 LOGI("WebGL2 uniformMatrix4x3fv array end");
3695 return nullptr;
3696 }
3697 bool isTypedarray = false;
3698 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3699 if (!isTypedarray || !succ) {
3700 return nullptr;
3701 }
3702 void *data = nullptr;
3703 size_t length;
3704 napi_typedarray_type type;
3705 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3706 if (!succ) {
3707 return nullptr;
3708 }
3709 if (type == napi_float32_array) {
3710 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3711 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3712 if (ret != EOK) {
3713 LOGE("WebGL2 uniformMatrix4x3fv memcpy_s failed");
3714 return nullptr;
3715 }
3716 glUniformMatrix4x3fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3717 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(inputFloat));
3718 }
3719 LOGI("WebGL2 uniformMatrix4x3fv typeArray end");
3720 return nullptr;
3721 }
3722
UniformMatrix2x4fv(napi_env env,napi_callback_info info)3723 napi_value WebGL2RenderingContextBase::UniformMatrix2x4fv(napi_env env, napi_callback_info info)
3724 {
3725 NFuncArg funcArg(env, info);
3726
3727 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
3728 return nullptr;
3729 }
3730
3731 LOGI("WebGL2 uniformMatrix2x4fv start");
3732 bool succ = false;
3733 WebGLUniformLocation *webGLUniformLocation = nullptr;
3734 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
3735 if (locationStatus != napi_ok) {
3736 return nullptr;
3737 }
3738 int location = webGLUniformLocation->GetUniformLocationId();
3739 LOGI("WebGL2 WebGLRenderContext::uniformMatrix2x4fv location = %{public}u", location);
3740 if (funcArg[NARG_POS::SECOND] == nullptr) {
3741 return nullptr;
3742 }
3743 bool transpose = false;
3744 tie(succ, transpose) = NVal(env, funcArg[NARG_POS::SECOND]).ToBool();
3745 if (!succ) {
3746 return nullptr;
3747 }
3748 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix2x4fv transpose = %{public}u", transpose);
3749
3750 int64_t srcOffset = 0;
3751 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3752 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
3753 if (!succ) {
3754 return nullptr;
3755 }
3756 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix2x4fv srcOffset = %{public}u", srcOffset);
3757 }
3758 int64_t srcLength = 0;
3759 if (funcArg[NARG_POS::FIFTH] != nullptr) {
3760 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
3761 if (!succ) {
3762 return nullptr;
3763 }
3764 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix2x4fv srcLength = %{public}u", srcLength);
3765 }
3766 napi_value array = funcArg[NARG_POS::THIRD];
3767 bool isArray = false;
3768 tie(succ, isArray) = NVal(env, array).IsArray();
3769 if (isArray) {
3770 LOGI("WebGL2 uniformMatrix2x4fv is Array");
3771 uint32_t length;
3772 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3773 if (lengthStatus != napi_ok) {
3774 return nullptr;
3775 }
3776 float uniformMatrix2x4fv[length];
3777 uint32_t i;
3778 for (i = 0; i < length; i++) {
3779 napi_value element;
3780 napi_status eleStatus = napi_get_element(env, array, i, &element);
3781 if (eleStatus != napi_ok) {
3782 return nullptr;
3783 }
3784 double ele;
3785 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3786 if (doubleStatus != napi_ok) {
3787 return nullptr;
3788 }
3789 uniformMatrix2x4fv[i] = static_cast<float>(ele);
3790 }
3791 glUniformMatrix2x4fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3792 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(uniformMatrix2x4fv + srcOffset));
3793 LOGI("WebGL2 uniformMatrix2x4fv array end");
3794 return nullptr;
3795 }
3796 bool isTypedarray = false;
3797 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3798 if (!isTypedarray || !succ) {
3799 return nullptr;
3800 }
3801 void *data = nullptr;
3802 size_t length;
3803 napi_typedarray_type type;
3804 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3805 if (!succ) {
3806 return nullptr;
3807 }
3808 if (type == napi_float32_array) {
3809 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3810 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3811 if (ret != EOK) {
3812 LOGE("WebGL2 uniformMatrix2x4fv memcpy_s failed");
3813 return nullptr;
3814 }
3815 glUniformMatrix2x4fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3816 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(inputFloat));
3817 }
3818 LOGI("WebGL2 uniformMatrix2x4fv typeArray end");
3819 return nullptr;
3820 }
3821
UniformMatrix3x4fv(napi_env env,napi_callback_info info)3822 napi_value WebGL2RenderingContextBase::UniformMatrix3x4fv(napi_env env, napi_callback_info info)
3823 {
3824 NFuncArg funcArg(env, info);
3825
3826 if (!funcArg.InitArgs(NARG_CNT::FIVE)) {
3827 return nullptr;
3828 }
3829 LOGI("WebGL2 uniformMatrix3x4fv start");
3830 bool succ = false;
3831 WebGLUniformLocation *webGLUniformLocation = nullptr;
3832 napi_status locationStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGLUniformLocation);
3833 if (locationStatus != napi_ok) {
3834 return nullptr;
3835 }
3836 int location = webGLUniformLocation->GetUniformLocationId();
3837 LOGI("WebGL2 WebGLRenderContext::uniformMatrix3x4fv location = %{public}u", location);
3838 if (funcArg[NARG_POS::SECOND] == nullptr) {
3839 return nullptr;
3840 }
3841 bool transpose = false;
3842 tie(succ, transpose) = NVal(env, funcArg[NARG_POS::SECOND]).ToBool();
3843 if (!succ) {
3844 return nullptr;
3845 }
3846 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix3x4fv transpose = %{public}u", transpose);
3847
3848 int64_t srcOffset = 0;
3849 if (funcArg[NARG_POS::FOURTH] != nullptr) {
3850 tie(succ, srcOffset) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
3851 if (!succ) {
3852 return nullptr;
3853 }
3854 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix3x4fv srcOffset = %{public}u", srcOffset);
3855 }
3856 int64_t srcLength = 0;
3857 if (funcArg[NARG_POS::FIFTH] != nullptr) {
3858 tie(succ, srcLength) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
3859 if (!succ) {
3860 return nullptr;
3861 }
3862 LOGI("WebGL2 WebGL2RenderingContextBase::uniformMatrix3x4fv srcLength = %{public}u", srcLength);
3863 }
3864 napi_value array = funcArg[NARG_POS::THIRD];
3865 bool isArray = false;
3866 tie(succ, isArray) = NVal(env, array).IsArray();
3867 if (isArray) {
3868 LOGI("WebGL2 uniformMatrix3x4fv is Array");
3869 uint32_t length;
3870 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3871 if (lengthStatus != napi_ok) {
3872 return nullptr;
3873 }
3874 float uniformMatrix3x4fv[length];
3875 uint32_t i;
3876 for (i = 0; i < length; i++) {
3877 napi_value element;
3878 napi_status eleStatus = napi_get_element(env, array, i, &element);
3879 if (eleStatus != napi_ok) {
3880 return nullptr;
3881 }
3882 double ele;
3883 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3884 if (doubleStatus != napi_ok) {
3885 return nullptr;
3886 }
3887 uniformMatrix3x4fv[i] = static_cast<float>(ele);
3888 }
3889 glUniformMatrix3x4fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3890 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(uniformMatrix3x4fv + srcOffset));
3891 LOGI("WebGL2 uniformMatrix3x4fv array end");
3892 return nullptr;
3893 }
3894 bool isTypedarray = false;
3895 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3896 if (!isTypedarray || !succ) {
3897 return nullptr;
3898 }
3899 void *data = nullptr;
3900 size_t length;
3901 napi_typedarray_type type;
3902 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3903 if (!succ) {
3904 return nullptr;
3905 }
3906 if (type == napi_float32_array) {
3907 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3908 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), reinterpret_cast<uint8_t*>(data) + srcOffset, length);
3909 if (ret != EOK) {
3910 LOGE("WebGL2 uniformMatrix3x4fv memcpy_s failed");
3911 return nullptr;
3912 }
3913 glUniformMatrix3x4fv(static_cast<GLuint>(location), static_cast<GLsizei>(srcLength),
3914 static_cast<GLboolean>(transpose), reinterpret_cast<GLfloat*>(inputFloat));
3915 }
3916 LOGI("WebGL2 uniformMatrix3x4fv typeArray end");
3917 return nullptr;
3918 }
3919
VertexAttribI4iv(napi_env env,napi_callback_info info)3920 napi_value WebGL2RenderingContextBase::VertexAttribI4iv(napi_env env, napi_callback_info info)
3921 {
3922 NFuncArg funcArg(env, info);
3923
3924 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
3925 return nullptr;
3926 }
3927 LOGI("WebGL2 vertexAttribI4iv start");
3928 bool succ = false;
3929 int64_t index;
3930 tie(succ, index) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
3931 if (!succ) {
3932 return nullptr;
3933 }
3934 LOGI("WebGL2 WebGL2RenderingContextBase::vertexAttribI4iv index = %{public}u", index);
3935 napi_value array = funcArg[NARG_POS::SECOND];
3936 bool isArray = false;
3937 tie(succ, isArray) = NVal(env, array).IsArray();
3938 if (isArray) {
3939 LOGI("WebGL2 vertexAttribI4iv is Array");
3940 uint32_t length;
3941 napi_status lengthStatus = napi_get_array_length(env, array, &length);
3942 if (lengthStatus != napi_ok) {
3943 return nullptr;
3944 }
3945 float vertexAttribI4iv[length];
3946 uint32_t i;
3947 for (i = 0; i < length; i++) {
3948 napi_value element;
3949 napi_status eleStatus = napi_get_element(env, array, i, &element);
3950 if (eleStatus != napi_ok) {
3951 return nullptr;
3952 }
3953 double ele;
3954 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
3955 if (doubleStatus != napi_ok) {
3956 return nullptr;
3957 }
3958 vertexAttribI4iv[i] = static_cast<float>(ele);
3959 }
3960 glVertexAttribI4iv(static_cast<GLuint>(index), reinterpret_cast<GLint *>(vertexAttribI4iv));
3961 LOGI("WebGL2 vertexAttribI4iv array end");
3962 return nullptr;
3963 }
3964 bool isTypedarray = false;
3965 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
3966 if (!isTypedarray || !succ) {
3967 return nullptr;
3968 }
3969 void *data = nullptr;
3970 size_t length;
3971 napi_typedarray_type type;
3972 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
3973 if (!succ) {
3974 return nullptr;
3975 }
3976 if (type == napi_float32_array) {
3977 float inputFloat[INPUTFLOAT_LENGTH] = {0};
3978 errno_t ret = memcpy_s(inputFloat, sizeof(inputFloat), data, length);
3979 if (ret != EOK) {
3980 LOGE("WebGL2 vertexAttribI4iv memcpy_s failed");
3981 return nullptr;
3982 }
3983 glVertexAttribI4iv(static_cast<GLuint>(index), reinterpret_cast<GLint *>(inputFloat));
3984 }
3985 LOGI("WebGL2 vertexAttribI4iv typeArray end");
3986 return nullptr;
3987 }
3988
VertexAttribI4uiv(napi_env env,napi_callback_info info)3989 napi_value WebGL2RenderingContextBase::VertexAttribI4uiv(napi_env env, napi_callback_info info)
3990 {
3991 NFuncArg funcArg(env, info);
3992
3993 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
3994 return nullptr;
3995 }
3996
3997 LOGI("WebGL2 vertexAttribI4uiv start");
3998 bool succ = false;
3999 int64_t index;
4000 tie(succ, index) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
4001 if (!succ) {
4002 return nullptr;
4003 }
4004 LOGI("WebGL2 WebGL2RenderingContextBase::vertexAttribI4uiv index = %{public}u", index);
4005 napi_value array = funcArg[NARG_POS::SECOND];
4006 bool isArray = false;
4007 tie(succ, isArray) = NVal(env, array).IsArray();
4008 if (isArray) {
4009 LOGI("WebGL2 vertexAttribI4uiv is Array");
4010 uint32_t length;
4011 napi_status lengthStatus = napi_get_array_length(env, array, &length);
4012 if (lengthStatus != napi_ok) {
4013 return nullptr;
4014 }
4015 float vertexAttribI4uiv[length];
4016 uint32_t i;
4017 for (i = 0; i < length; i++) {
4018 napi_value element;
4019 napi_status eleStatus = napi_get_element(env, array, i, &element);
4020 if (eleStatus != napi_ok) {
4021 return nullptr;
4022 }
4023 double ele;
4024 napi_status doubleStatus = napi_get_value_double(env, element, &ele);
4025 if (doubleStatus != napi_ok) {
4026 return nullptr;
4027 }
4028 vertexAttribI4uiv[i] = static_cast<float>(ele);
4029 }
4030 glVertexAttribI4uiv(static_cast<GLuint>(index), reinterpret_cast<const GLuint *>(vertexAttribI4uiv));
4031 LOGI("WebGL2 vertexAttribI4uiv array end");
4032 return nullptr;
4033 }
4034 bool isTypedarray = false;
4035 tie(succ, isTypedarray) = NVal(env, array).IsTypeArray();
4036 if (!isTypedarray || !succ) {
4037 return nullptr;
4038 }
4039 void *data = nullptr;
4040 size_t length;
4041 napi_typedarray_type type;
4042 tie(succ, type, data, length) = NVal(env, array).ToTypedArray();
4043 if (!succ) {
4044 return nullptr;
4045 }
4046 if (type == napi_float32_array) {
4047 int *inputFloat = reinterpret_cast<int*>(reinterpret_cast<uint8_t*>(data));
4048 glVertexAttribI4uiv(static_cast<GLuint>(index), reinterpret_cast<const GLuint *>(inputFloat));
4049 }
4050 LOGI("WebGL2 vertexAttribI4uiv typeArray end");
4051 return nullptr;
4052 }
4053
InvalidateFramebuffer(napi_env env,napi_callback_info info)4054 napi_value WebGL2RenderingContextBase::InvalidateFramebuffer(napi_env env, napi_callback_info info)
4055 {
4056 NFuncArg funcArg(env, info);
4057
4058 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
4059 return nullptr;
4060 }
4061 bool succ = false;
4062 LOGI("WebGL2 invalidateFramebuffer start");
4063 int64_t target;
4064 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
4065 if (!succ) {
4066 return nullptr;
4067 }
4068 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateFramebuffer target = %{public}u", target);
4069 napi_value uniformarray = funcArg[NARG_POS::SECOND];
4070 bool isUniformArray = false;
4071 tie(succ, isUniformArray) = NVal(env, uniformarray).IsArray();
4072 if (isUniformArray) {
4073 LOGI("WebGL2 invalidateFramebuffer is isUniformArray");
4074 uint32_t numAttachments;
4075 napi_status countStatus = napi_get_array_length(env, uniformarray, &numAttachments);
4076 if (countStatus != napi_ok) {
4077 return nullptr;
4078 }
4079 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateFramebuffer numAttachments = %{public}u", numAttachments);
4080 int64_t attachments[numAttachments];
4081 uint32_t i;
4082 for (i = 0; i < numAttachments; i++) {
4083 napi_value element;
4084 napi_status eleStatus = napi_get_element(env, uniformarray, i, &element);
4085 if (eleStatus != napi_ok) {
4086 return nullptr;
4087 }
4088 int64_t ele;
4089 napi_status doubleStatus = napi_get_value_int64(env, element, &ele);
4090 if (doubleStatus != napi_ok) {
4091 return nullptr;
4092 }
4093 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateFramebuffer ele = %{public}u", ele);
4094 attachments[i] = ele;
4095 }
4096 glInvalidateFramebuffer(static_cast<GLenum>(target),
4097 static_cast<GLsizei>(numAttachments), reinterpret_cast<GLenum*>(attachments));
4098 LOGI("WebGL2 invalidateFramebuffer invalidateFramebuffer end");
4099 return nullptr;
4100 }
4101 LOGI("WebGL2 invalidateFramebuffer end");
4102 return nullptr;
4103 }
4104
InvalidateSubFramebuffer(napi_env env,napi_callback_info info)4105 napi_value WebGL2RenderingContextBase::InvalidateSubFramebuffer(napi_env env, napi_callback_info info)
4106 {
4107 NFuncArg funcArg(env, info);
4108 if (!funcArg.InitArgs(NARG_CNT::SIX)) {
4109 return nullptr;
4110 }
4111 bool succ = false;
4112 LOGI("WebGL2 invalidateSubFramebuffer start");
4113 int64_t target;
4114 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
4115 if (!succ) {
4116 return nullptr;
4117 }
4118 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateSubFramebuffer target = %{public}u", target);
4119 napi_value uniformarray = funcArg[NARG_POS::SECOND];
4120 uint32_t numAttachments;
4121 void *attachments;
4122 bool isUniformArray = false;
4123 tie(succ, isUniformArray) = NVal(env, uniformarray).IsArray();
4124 if (isUniformArray) {
4125 LOGI("WebGL2 invalidateSubFramebuffer is isUniformArray");
4126 napi_status countStatus = napi_get_array_length(env, uniformarray, &numAttachments);
4127 if (countStatus != napi_ok) {
4128 return nullptr;
4129 }
4130 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateSubFramebuffer numAttachments = %{public}u", numAttachments);
4131 int64_t attachments1[numAttachments];
4132 uint32_t i;
4133 for (i = 0; i < numAttachments; i++) {
4134 napi_value element;
4135 napi_status eleStatus = napi_get_element(env, uniformarray, i, &element);
4136 if (eleStatus != napi_ok) {
4137 return nullptr;
4138 }
4139 int64_t ele;
4140 napi_status doubleStatus = napi_get_value_int64(env, element, &ele);
4141 if (doubleStatus != napi_ok) {
4142 return nullptr;
4143 }
4144 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateSubFramebuffer ele = %{public}u", ele);
4145 attachments1[i] = ele;
4146 }
4147 attachments = attachments1;
4148 } else {
4149 return nullptr;
4150 }
4151
4152 int64_t x;
4153 tie(succ, x) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
4154 if (!succ) {
4155 return nullptr;
4156 }
4157 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateSubFramebuffer x = %{public}u", x);
4158 int64_t y;
4159 tie(succ, y) = NVal(env, funcArg[NARG_POS::FOURTH]).ToInt64();
4160 if (!succ) {
4161 return nullptr;
4162 }
4163 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateSubFramebuffer y = %{public}u", y);
4164 int64_t width;
4165 tie(succ, width) = NVal(env, funcArg[NARG_POS::FIFTH]).ToInt64();
4166 if (!succ) {
4167 return nullptr;
4168 }
4169 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateSubFramebuffer width = %{public}u", width);
4170 int64_t height;
4171 tie(succ, height) = NVal(env, funcArg[NARG_POS::SIXTH]).ToInt64();
4172 if (!succ) {
4173 return nullptr;
4174 }
4175 LOGI("WebGL2 WebGL2RenderingContextBase::invalidateSubFramebuffer height = %{public}u", height);
4176 glInvalidateSubFramebuffer(static_cast<GLenum>(target), static_cast<GLsizei>(numAttachments),
4177 reinterpret_cast<GLenum*>(attachments), static_cast<GLint>(x),
4178 static_cast<GLint>(y), static_cast<GLsizei>(width), static_cast<GLsizei>(height));
4179 LOGI("WebGL2 invalidateSubFramebuffer end");
4180 return nullptr;
4181 }
4182
GetInternalformatParameter(napi_env env,napi_callback_info info)4183 napi_value WebGL2RenderingContextBase::GetInternalformatParameter(napi_env env, napi_callback_info info)
4184 {
4185 NFuncArg funcArg(env, info);
4186 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
4187 return nullptr;
4188 }
4189 bool succ = false;
4190 LOGI("WebGL2 getInternalformatParameter start");
4191 int64_t target;
4192 tie(succ, target) = NVal(env, funcArg[NARG_POS::FIRST]).ToInt64();
4193 if (!succ) {
4194 return nullptr;
4195 }
4196 LOGI("WebGL2 WebGL2RenderingContextBase::getInternalformatParameter target = %{public}u", target);
4197 int64_t internalformat;
4198 tie(succ, internalformat) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
4199 if (!succ) {
4200 return nullptr;
4201 }
4202 LOGI("WebGL2 WebGL2RenderingContextBase::getInternalformatParameter internalformat = %{public}u", internalformat);
4203 int64_t pname;
4204 tie(succ, pname) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
4205 if (!succ) {
4206 return nullptr;
4207 }
4208 LOGI("WebGL2 WebGL2RenderingContextBase::getInternalformatParameter pname = %{public}u", pname);
4209
4210 napi_value retures = nullptr;
4211 static GLint* params = nullptr;
4212 if (pname == GL_SAMPLES) {
4213 LOGI("WebGL2 WebGL2RenderingContextBase::getInternalformatParameter GL_SAMPLES start");
4214 GLint length = -1;
4215 glGetInternalformativ(static_cast<GLenum>(target), static_cast<GLenum>(internalformat), GL_NUM_SAMPLE_COUNTS,
4216 1, &length);
4217 LOGI("WebGL2 WebGL2RenderingContextBase::getInternalformatParameter length = %{public}u", length);
4218 if (length <= 0) {
4219 return nullptr;
4220 }
4221 int a = static_cast<int>(length);
4222 params = new GLint[a];
4223 glGetInternalformativ(static_cast<GLenum>(target), static_cast<GLenum>(internalformat),
4224 static_cast<GLenum>(pname), static_cast<GLsizei>(length), static_cast<GLint *>(params));
4225 LOGI("WebGL2 WebGL2RenderingContextBase::getInternalformatParameter params = %{public}u", params);
4226 int res[length];
4227 for (int i = 0; i < length; i++) {
4228 res[i] = static_cast<int>(params[i]);
4229 }
4230 napi_value outputBuffer = nullptr;
4231 napi_create_external_arraybuffer(env, res, sizeof(res),
4232 [](napi_env env, void *finalize_data, void *finalize_hint) { },
4233 NULL, &outputBuffer);
4234 napi_create_typedarray(env, napi_int32_array, sizeof(res) / sizeof(int), outputBuffer, 0, &retures);
4235 delete []params;
4236 }
4237 LOGI("WebGL2 getInternalformatParameter end");
4238 return retures;
4239 }
4240
TransformFeedbackVaryings(napi_env env,napi_callback_info info)4241 napi_value WebGL2RenderingContextBase::TransformFeedbackVaryings(napi_env env, napi_callback_info info)
4242 {
4243 NFuncArg funcArg(env, info);
4244 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
4245 return nullptr;
4246 }
4247 bool succ = false;
4248 LOGI("WebGL2 TransformFeedbackVaryings start");
4249 WebGLProgram *webGlProgram = nullptr;
4250 napi_status programStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlProgram);
4251 if (programStatus != napi_ok) {
4252 return nullptr;
4253 }
4254 int programId = webGlProgram->GetProgramId();
4255 LOGI("WebGL2 WebGL2RenderingContextBase::transformFeedbackVaryings programId = %{public}u", programId);
4256
4257 napi_value transformFeedbackarray = funcArg[NARG_POS::SECOND];
4258 uint32_t count;
4259 bool istransformFeedbackArray = false;
4260 tie(succ, istransformFeedbackArray) = NVal(env, transformFeedbackarray).IsArray();
4261 if (istransformFeedbackArray) {
4262 LOGI("WebGL2 transformFeedbackVaryings is isUniformArray");
4263 napi_status countStatus = napi_get_array_length(env, transformFeedbackarray, &count);
4264 if (countStatus != napi_ok) {
4265 return nullptr;
4266 }
4267 LOGI("WebGL2 WebGL2RenderingContextBase::transformFeedbackVaryings count = %{public}u", count);
4268 char *varyings[count];
4269 uint32_t i;
4270 for (i = 0; i < count; i++) {
4271 napi_value element;
4272 napi_status eleStatus = napi_get_element(env, transformFeedbackarray, i, &element);
4273 LOGI("WebGL2 WebGL2RenderingContextBase::transformFeedbackVaryings element = %{public}u", element);
4274 if (eleStatus != napi_ok) {
4275 return nullptr;
4276 }
4277 napi_value result;
4278 napi_status rsuStatus = napi_coerce_to_string(env, element, &result);
4279 if (rsuStatus != napi_ok) {
4280 return nullptr;
4281 }
4282 unique_ptr<char[]> name;
4283 tie(succ, name, ignore) = NVal(env, result).ToUTF8String();
4284 if (!succ) {
4285 return nullptr;
4286 }
4287 LOGI("WebGL2 WebGL2RenderingContextBase::transformFeedbackVaryings name = %{public}s", name.get());
4288 varyings[i] = name.get();
4289 }
4290 int64_t bufferMode;
4291 tie(succ, bufferMode) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
4292 if (!succ) {
4293 return nullptr;
4294 }
4295 LOGI("WebGL2 WebGL2RenderingContextBase::transformFeedbackVaryings bufferMode = %{public}u", bufferMode);
4296 glTransformFeedbackVaryings(static_cast<GLuint>(programId), static_cast<GLsizei>(count),
4297 varyings, static_cast<GLenum>(bufferMode));
4298 LOGI("WebGL2 transformFeedbackVaryings end");
4299 }
4300 return nullptr;
4301 }
4302
GetUniformIndices(napi_env env,napi_callback_info info)4303 napi_value WebGL2RenderingContextBase::GetUniformIndices(napi_env env, napi_callback_info info)
4304 {
4305 NFuncArg funcArg(env, info);
4306 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
4307 return nullptr;
4308 }
4309 bool succ = false;
4310 LOGI("WebGL2 getUniformIndices start");
4311 WebGLProgram *webGlProgram = nullptr;
4312 napi_status programStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlProgram);
4313 if (programStatus != napi_ok) {
4314 return nullptr;
4315 }
4316 int programId = webGlProgram->GetProgramId();
4317 LOGI("WebGL2 WebGL2RenderingContextBase::getUniformIndices programId = %{public}u", programId);
4318 napi_value transformFeedbackarray = funcArg[NARG_POS::SECOND];
4319 uint32_t uniformCount;
4320 char** uniformNames = NULL;
4321 bool istransformFeedbackArray = false;
4322 tie(succ, istransformFeedbackArray) = NVal(env, transformFeedbackarray).IsArray();
4323 if (istransformFeedbackArray) {
4324 LOGI("WebGL2 transformFeedbackVaryings is isUniformArray");
4325 napi_status countStatus = napi_get_array_length(env, transformFeedbackarray, &uniformCount);
4326 if (countStatus != napi_ok) {
4327 return nullptr;
4328 }
4329 LOGI("WebGL2 WebGLRenderingContextOverloads::getUniformIndices count = %{public}u", uniformCount);
4330 if (uniformCount > UNIFORM_NAMES_MAX_LENGTH) {
4331 LOGE("WebGL2 WebGLRenderingContextOverloads::getUniformIndicesuniformCount is invalid");
4332 return nullptr;
4333 }
4334 uniformNames = (char**)malloc(uniformCount * sizeof(char*));
4335 if (uniformNames == NULL) {
4336 LOGE("WebGL2 WebGLRenderingContextOverloads::getUniformIndices malloc failed");
4337 return nullptr;
4338 }
4339 uint32_t i;
4340 for (i = 0; i < uniformCount; i++) {
4341 napi_value element;
4342 napi_status eleStatus = napi_get_element(env, transformFeedbackarray, i, &element);
4343 if (eleStatus != napi_ok) {
4344 free(uniformNames);
4345 return nullptr;
4346 }
4347 napi_value result;
4348 napi_status rsuStatus = napi_coerce_to_string(env, element, &result);
4349 if (rsuStatus != napi_ok) {
4350 free(uniformNames);
4351 return nullptr;
4352 }
4353 unique_ptr<char[]> name;
4354 tie(succ, name, ignore) = NVal(env, result).ToUTF8String();
4355 if (!succ) {
4356 free(uniformNames);
4357 return nullptr;
4358 }
4359 LOGI("WebGL2 WebGLRenderingContextOverloads::getUniformIndices str = %{public}s", name.get());
4360 uniformNames[i] = name.get();
4361 }
4362 } else {
4363 return nullptr;
4364 }
4365 LOGI("WebGL2 WebGL2RenderingContextBase::getUniformIndices uniformCount = %{public}u", uniformCount);
4366 GLuint* uniformIndices = new GLuint[uniformCount];
4367 glGetUniformIndices(static_cast<GLuint>(programId), static_cast<GLsizei>(uniformCount),
4368 const_cast<const GLchar **>(uniformNames), static_cast<GLuint *>(uniformIndices));
4369 napi_value ret;
4370 napi_create_array(env, &ret);
4371 for (uint32_t i = 0; i < uniformCount; i++) {
4372 uint32_t a = static_cast<GLuint>(uniformIndices[i]);
4373 LOGI("WebGL2 WebGL2RenderingContextBase::getUniformIndices a = %{public}u", a);
4374 napi_value result;
4375 napi_status status = napi_create_uint32(env, a, &result);
4376 if (status != napi_ok) {
4377 delete []uniformIndices;
4378 free(uniformNames);
4379 return nullptr;
4380 }
4381 napi_set_element(env, ret, i, result);
4382 }
4383 LOGI("WebGL2 getUniformIndices end");
4384 delete []uniformIndices;
4385 free(uniformNames);
4386 return ret;
4387 }
4388
GetActiveUniforms(napi_env env,napi_callback_info info)4389 napi_value WebGL2RenderingContextBase::GetActiveUniforms(napi_env env, napi_callback_info info)
4390 {
4391 NFuncArg funcArg(env, info);
4392 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
4393 return nullptr;
4394 }
4395 bool succ = false;
4396 LOGI("WebGL2 getActiveUniforms start");
4397 WebGLProgram *webGlProgram = nullptr;
4398 napi_status programStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **) &webGlProgram);
4399 if (programStatus != napi_ok) {
4400 return nullptr;
4401 }
4402 int programId = webGlProgram->GetProgramId();
4403 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms programId = %{public}u", programId);
4404 napi_value activeUniforms = funcArg[NARG_POS::SECOND];
4405 uint32_t uniformCount;
4406 void *uniformIndices;
4407 bool istransformFeedbackArray = false;
4408 int* transformFeedback = nullptr;
4409 tie(succ, istransformFeedbackArray) = NVal(env, activeUniforms).IsArray();
4410 if (istransformFeedbackArray) {
4411 LOGI("WebGL2 getActiveUniforms is isUniformArray");
4412 napi_status countStatus = napi_get_array_length(env, activeUniforms, &uniformCount);
4413 if (countStatus != napi_ok) {
4414 return nullptr;
4415 }
4416 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms count = %{public}u", uniformCount);
4417 if (uniformCount == 0) {
4418 return nullptr;
4419 }
4420 transformFeedback = new int[uniformCount];
4421 uint32_t i;
4422 for (i = 0; i < uniformCount; i++) {
4423 napi_value element;
4424 napi_status eleStatus = napi_get_element(env, activeUniforms, i, &element);
4425 if (eleStatus != napi_ok) {
4426 delete []transformFeedback;
4427 return nullptr;
4428 }
4429 napi_value result;
4430 napi_status rsuStatus = napi_coerce_to_number(env, element, &result);
4431 if (rsuStatus != napi_ok) {
4432 delete []transformFeedback;
4433 return nullptr;
4434 }
4435 int64_t ele;
4436 napi_status doubleStatus = napi_get_value_int64(env, result, &ele);
4437 if (doubleStatus != napi_ok) {
4438 delete []transformFeedback;
4439 return nullptr;
4440 }
4441 transformFeedback[i] = ele;
4442 }
4443 uniformIndices = transformFeedback;
4444 } else {
4445 return nullptr;
4446 }
4447 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms uniformCount = %{public}u", uniformCount);
4448 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms uniformIndices = %{public}u", uniformIndices);
4449 int64_t pname;
4450 tie(succ, pname) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
4451 if (!succ) {
4452 delete []transformFeedback;
4453 return nullptr;
4454 }
4455 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms pname = %{public}u", pname);
4456 napi_value res = nullptr;
4457 napi_create_array(env, &res);
4458 if (pname == GL_UNIFORM_TYPE) {
4459 LOGI("WebGL2 getActiveUniforms GL_UNIFORM_TYPE start");
4460 auto params = new unsigned int[uniformCount];
4461 glGetActiveUniformsiv(static_cast<GLuint>(programId), static_cast<GLsizei>(uniformCount),
4462 static_cast<GLuint *>(uniformIndices), static_cast<GLenum>(pname),
4463 reinterpret_cast<GLint *>(params));
4464 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms params = %{public}u", params);
4465 for (uint32_t i = 0; i < uniformCount; i++) {
4466 int64_t a = (reinterpret_cast<int64_t*>(params))[i];
4467 napi_value result;
4468 napi_status status = napi_create_int64(env, a, &result);
4469 if (status != napi_ok) {
4470 delete []transformFeedback;
4471 delete []params;
4472 return nullptr;
4473 }
4474 napi_set_element(env, res, i, result);
4475 }
4476 delete []params;
4477 } else if (pname == GL_UNIFORM_SIZE) {
4478 LOGI("WebGL2 getActiveUniforms GL_UNIFORM_SIZE start");
4479 auto params = new unsigned int[uniformCount];
4480 glGetActiveUniformsiv(static_cast<GLuint>(programId), static_cast<GLsizei>(uniformCount),
4481 static_cast<GLuint *>(uniformIndices), static_cast<GLenum>(pname),
4482 reinterpret_cast<GLint *>(params));
4483 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms params = %{public}u", params);
4484 for (uint32_t i = 0; i < uniformCount; i++) {
4485 uint32_t a = (static_cast<uint32_t*>(params))[i];
4486 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms a = %{public}u", a);
4487 napi_value result;
4488 napi_status status = napi_create_uint32(env, a, &result);
4489 if (status != napi_ok) {
4490 delete []transformFeedback;
4491 delete []params;
4492 return nullptr;
4493 }
4494 napi_set_element(env, res, i, result);
4495 }
4496 delete []params;
4497 } else if (pname == GL_UNIFORM_BLOCK_INDEX || pname == GL_UNIFORM_OFFSET || pname == GL_UNIFORM_ARRAY_STRIDE
4498 || pname == GL_UNIFORM_MATRIX_STRIDE) {
4499 LOGI("WebGL2 getActiveUniforms GL_UNIFORM_BLOCK_INDEX start");
4500 auto params = new int[uniformCount];
4501 glGetActiveUniformsiv(static_cast<GLuint>(programId), static_cast<GLsizei>(uniformCount),
4502 static_cast<GLuint *>(uniformIndices), static_cast<GLenum>(pname),
4503 reinterpret_cast<GLint *>(params));
4504 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms params = %{public}u", params);
4505 for (uint32_t i = 0; i < uniformCount; i++) {
4506 int32_t a = (static_cast<int32_t*>(params))[i];
4507 napi_value result;
4508 napi_status status = napi_create_int32(env, a, &result);
4509 if (status != napi_ok) {
4510 delete []transformFeedback;
4511 delete []params;
4512 return nullptr;
4513 }
4514 napi_set_element(env, res, i, result);
4515 }
4516 delete []params;
4517 } else if (pname == GL_UNIFORM_IS_ROW_MAJOR) {
4518 LOGI("WebGL2 getActiveUniforms GL_UNIFORM_IS_ROW_MAJOR start");
4519 auto params = new unsigned int[uniformCount];
4520 glGetActiveUniformsiv(static_cast<GLuint>(programId), static_cast<GLsizei>(uniformCount),
4521 static_cast<GLuint *>(uniformIndices), static_cast<GLenum>(pname),
4522 reinterpret_cast<GLint *>(params));
4523 LOGI("WebGL2 WebGL2RenderingContextBase::getActiveUniforms params = %{public}u", params);
4524 for (uint32_t i = 0; i < uniformCount; i++) {
4525 bool a = (reinterpret_cast<bool*>(params))[i];
4526 napi_value result = nullptr;
4527 napi_status status = napi_get_boolean(env, a, &result);
4528 if (status != napi_ok) {
4529 delete []transformFeedback;
4530 delete []params;
4531 return nullptr;
4532 }
4533 napi_set_element(env, res, i, result);
4534 }
4535 delete []params;
4536 }
4537 LOGI("WebGL2 getActiveUniforms end");
4538 delete []transformFeedback;
4539 return res;
4540 }
4541
GetActiveUniformBlockParameter(napi_env env,napi_callback_info info)4542 napi_value WebGL2RenderingContextBase::GetActiveUniformBlockParameter(napi_env env, napi_callback_info info)
4543 {
4544 NFuncArg funcArg(env, info);
4545
4546 if (!funcArg.InitArgs(NARG_CNT::THREE)) {
4547 return nullptr;
4548 }
4549 if (funcArg[NARG_POS::FIRST] == nullptr) {
4550 return nullptr;
4551 }
4552 bool succ = false;
4553 LOGI("WebGL2 getActiveUniformBlockParameter start");
4554 WebGLProgram *webGlProgram = nullptr;
4555 napi_status programStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **)&webGlProgram);
4556 if (programStatus != napi_ok) {
4557 return nullptr;
4558 }
4559 int programId = webGlProgram->GetProgramId();
4560 LOGI("WebGL2 WebGL2RenderContext::getActiveUniformBlockParameter programId = %{public}u", programId);
4561 int64_t uniformBlockIndex;
4562 tie(succ, uniformBlockIndex) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
4563 if (!succ) {
4564 return nullptr;
4565 }
4566 LOGI("WebGL2 WebGL2RenderContext::getActiveUniformBlockParameter uniformBlockIndex = %{public}u",
4567 uniformBlockIndex);
4568 int64_t pname;
4569 tie(succ, pname) = NVal(env, funcArg[NARG_POS::THIRD]).ToInt64();
4570 if (!succ) {
4571 return nullptr;
4572 }
4573 LOGI("WebGL2 WebGL2RenderContext::getActiveUniformBlockParameter pname = %{public}u", pname);
4574 GLint params;
4575 glGetActiveUniformBlockiv(static_cast<GLuint>(programId), static_cast<GLuint>(uniformBlockIndex),
4576 static_cast<GLenum>(pname), ¶ms);
4577 if (pname == GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER ||
4578 pname == GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER) {
4579 bool res = (params == GL_FALSE) ? false : true;
4580 LOGI("WebGL2 getActiveUniformBlockParameter end");
4581 return NVal::CreateBool(env, res).val_;
4582 } else if (pname == GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES) {
4583 GLint uniformCount = 1;
4584 LOGI("WebGL2 WebGL2RenderContext::getActiveUniformBlockParameter uniform_count = %{public}d",
4585 GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS);
4586 glGetActiveUniformBlockiv(static_cast<GLuint>(programId), static_cast<GLuint>(uniformBlockIndex),
4587 GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &uniformCount);
4588 LOGI("WebGL2 WebGL2RenderContext::getActiveUniformBlockParameter uniform_count = %{public}d", uniformCount);
4589 GLint params[uniformCount];
4590 glGetActiveUniformBlockiv(static_cast<GLuint>(programId), static_cast<GLuint>(uniformBlockIndex),
4591 static_cast<GLenum>(pname), static_cast<GLint *>(params));
4592 static uint32_t *res = new uint32_t[uniformCount];
4593 int i;
4594 for (i = 0; i < uniformCount; i++) {
4595 res[i] = static_cast<uint32_t>(params[i]);
4596 }
4597 napi_value outputBuffer = nullptr;
4598 napi_create_external_arraybuffer(env, res, sizeof(params),
4599 [](napi_env env, void *finalize_data, void *finalize_hint) { },
4600 NULL, &outputBuffer);
4601 napi_value outputArray = nullptr;
4602 napi_create_typedarray(env, napi_uint32_array, sizeof(params) / sizeof(uint32_t),
4603 outputBuffer, 0, &outputArray);
4604 LOGI("WebGL2 getActiveUniformBlockParameter end");
4605 return outputArray;
4606 } else if (pname == GL_UNIFORM_BLOCK_BINDING ||
4607 pname == GL_UNIFORM_BLOCK_DATA_SIZE ||
4608 pname == GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS) {
4609 int64_t res = static_cast<int64_t>(params);
4610 LOGI("WebGL2 getActiveUniformBlockParameter end");
4611 return NVal::CreateInt64(env, res).val_;
4612 } else {
4613 LOGI("WebGL getActiveUniformBlockParameter : pname is wrong");
4614 return nullptr;
4615 }
4616 }
4617
GetActiveUniformBlockName(napi_env env,napi_callback_info info)4618 napi_value WebGL2RenderingContextBase::GetActiveUniformBlockName(napi_env env, napi_callback_info info)
4619 {
4620 NFuncArg funcArg(env, info);
4621
4622 if (!funcArg.InitArgs(NARG_CNT::TWO)) {
4623 return nullptr;
4624 }
4625 if (funcArg[NARG_POS::FIRST] == nullptr) {
4626 return nullptr;
4627 }
4628 bool succ = false;
4629 LOGI("WebGL2 getActiveUniformBlockName start");
4630 WebGLProgram *webGlProgram = nullptr;
4631 napi_status programStatus = napi_unwrap(env, funcArg[NARG_POS::FIRST], (void **)&webGlProgram);
4632 if (programStatus != napi_ok) {
4633 return nullptr;
4634 }
4635 int programId = webGlProgram->GetProgramId();
4636 LOGI("WebGL2 WebGL2RenderContext::getActiveUniformBlockName programId = %{public}u", programId);
4637 int64_t uniformBlockIndex;
4638 tie(succ, uniformBlockIndex) = NVal(env, funcArg[NARG_POS::SECOND]).ToInt64();
4639 if (!succ) {
4640 return nullptr;
4641 }
4642 LOGI("WebGL2 WebGL2RenderContext::getActiveUniformBlockName uniformBlockIndex = %{public}u", uniformBlockIndex);
4643 GLint length = 0;
4644 GLsizei size = 0;
4645 glGetProgramiv(static_cast<GLuint>(programId), GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, &length);
4646 std::unique_ptr<char[]> buf = std::make_unique<char[]>(length);
4647 if (buf == nullptr) {
4648 return nullptr;
4649 }
4650 glGetActiveUniformBlockName(programId, uniformBlockIndex, length, &size, buf.get());
4651 string str = buf.get();
4652 return NVal::CreateUTF8String(env, str).val_;
4653 }
4654 } // namespace Rosen
4655 } // namespace OHOS
4656
4657 #ifdef __cplusplus
4658 }
4659 #endif