• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2023 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 */
15export function checkError(gl, err) {
16    let error;
17    if (err) {
18        error = err;
19    }
20    else {
21        error = gl.getError();
22    }
23    switch (error) {
24        case gl.NO_ERROR:
25            console.info("webgltest checkError:NO_ERROR code:", error);
26            break;
27        case gl.INVALID_ENUM:
28            console.info("webgltest checkError:INVALID_ENUM code:", error);
29            break;
30        case gl.INVALID_VALUE:
31            console.info("webgltest checkError:INVALID_VALUE code:", error);
32            break;
33        case gl.INVALID_OPERATION:
34            console.info("webgltest checkError:INVALID_OPERATION code:", error);
35            break;
36        case gl.INVALID_FRAMEBUFFER_OPERATION:
37            console.info("webgltest checkError:INVALID_FRAMEBUFFER_OPERATION code:", error);
38            break;
39        case gl.OUT_OF_MEMORY:
40            console.info("webgltest checkError:OUT_OF_MEMORY code:", error);
41            break;
42        case gl.CONTEXT_LOST_WEBGL:
43            console.info("webgltest checkError:CONTEXT_LOST_WEBGL code:", error);
44            break;
45        default:
46            console.info("webgltest checkError:Unknow Error code:", error);
47            break;
48    }
49    return error;
50}
51export function wait(ms) {
52    return new Promise((resolve, reject) => {
53        setTimeout(() => {
54            console.log("Done waiting");
55            resolve(ms);
56        }, ms);
57    });
58}
59export function createProgram(gl, vSource, fSource, beforeLink) {
60    let createShader = (gl, type, source) => {
61        let shader = gl.createShader(type); //创建顶点着色器
62        if (shader == null) {
63            console.log('unable to create shader');
64            return null;
65        }
66        gl.shaderSource(shader, source); //设置着色器代码
67        gl.compileShader(shader); //编译
68        let shaderParameter = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
69        if (!shaderParameter) { //如果编译失败
70            let error = gl.getShaderInfoLog(shader);
71            console.log('failed to compile shader: ' + error);
72            gl.deleteShader(shader); //删除着色器
73            return null;
74        }
75        return shader;
76    };
77    let vertexShader = createShader(gl, gl.VERTEX_SHADER, vSource);
78    let fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fSource);
79    if (!vertexShader || !fragmentShader) {
80        console.log('failed to link program');
81        return null;
82    }
83    let program = gl.createProgram();
84    if (!program) {
85        console.log('failed to link program');
86        return null;
87    }
88    gl.attachShader(program, vertexShader);
89    gl.attachShader(program, fragmentShader);
90    if (beforeLink && beforeLink instanceof Function) {
91        beforeLink(program);
92    }
93    gl.linkProgram(program);
94    let linked = gl.getProgramParameter(program, gl.LINK_STATUS);
95    if (!linked) {
96        let error = gl.getProgramInfoLog(program);
97        console.log('failed to link program: ' + error);
98        gl.deleteProgram(program);
99        gl.deleteShader(fragmentShader);
100        gl.deleteShader(vertexShader);
101        return null;
102    }
103    gl.useProgram(program);
104    gl.program = program;
105    return {
106        program, vertexShader, fragmentShader
107    };
108}
109