• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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), &params);
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), &params);
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), &params);
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), &params);
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), &params);
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