• 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 createProgram(gl, vSource, fSource, beforeLink) {
16    let createShader = (gl, type, source) => {
17        let shader = gl.createShader(type);
18        if (shader == null) {
19            console.log('unable to create shader');
20            return null;
21        }
22        gl.shaderSource(shader, source);
23        gl.compileShader(shader);
24        let shaderParameter = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
25        if (!shaderParameter) {
26            let error = gl.getShaderInfoLog(shader);
27            console.log('failed to compile shader: ' + error);
28            gl.deleteShader(shader);
29            return null;
30        }
31        return shader;
32    };
33    let vertexShader = createShader(gl, gl.VERTEX_SHADER, vSource);
34    let fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fSource);
35    if (!vertexShader || !fragmentShader) {
36        console.log('failed to link program');
37        return null;
38    }
39    let program = gl.createProgram();
40    if (!program) {
41        console.log('failed to link program');
42        return null;
43    }
44    gl.attachShader(program, vertexShader);
45    gl.attachShader(program, fragmentShader);
46    if (beforeLink && beforeLink instanceof Function) {
47        beforeLink(program);
48    }
49    gl.linkProgram(program);
50    let linked = gl.getProgramParameter(program, gl.LINK_STATUS);
51    if (!linked) {
52        let error = gl.getProgramInfoLog(program);
53        console.log('failed to link program: ' + error);
54        gl.deleteProgram(program);
55        gl.deleteShader(fragmentShader);
56        gl.deleteShader(vertexShader);
57        return null;
58    }
59    gl.useProgram(program);
60    return {
61        program, vertexShader, fragmentShader
62    };
63}
64export function checkError(gl, err) {
65    let error;
66    if (err) {
67        error = err;
68    }
69    else {
70        error = gl.getError();
71    }
72    switch (error) {
73        case gl.NO_ERROR:
74            console.info("webgltest checkError:NO_ERROR code:", error);
75            break;
76        case gl.INVALID_ENUM:
77            console.info("webgltest checkError:INVALID_ENUM code:", error);
78            break;
79        case gl.INVALID_VALUE:
80            console.info("webgltest checkError:INVALID_VALUE code:", error);
81            break;
82        case gl.INVALID_OPERATION:
83            console.info("webgltest checkError:INVALID_OPERATION code:", error);
84            break;
85        case gl.INVALID_FRAMEBUFFER_OPERATION:
86            console.info("webgltest checkError:INVALID_FRAMEBUFFER_OPERATION code:", error);
87            break;
88        case gl.OUT_OF_MEMORY:
89            console.info("webgltest checkError:OUT_OF_MEMORY code:", error);
90            break;
91        case gl.CONTEXT_LOST_WEBGL:
92            console.info("webgltest checkError:CONTEXT_LOST_WEBGL code:", error);
93            break;
94        default:
95            console.info("webgltest checkError:Unknow Error code:", error);
96            break;
97    }
98    return error;
99}
100export function clear(gl) {
101    gl.clearColor(0.0, 0.0, 0.0, 1.0);
102    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
103}
104export const WEBGL2_FRAGMENT_SHADER_DEMO = `#version 300 es
105    precision mediump float;
106    out vec4 color;
107    void main(){
108        color = vec4(1.0,0.0,0.0,1.0);
109    }
110`;
111export function getColorUint8Array(width, height, red, green, blue, alpha) {
112    const data = new Uint8Array(width * height * 4);
113    for (let i = 0; i < data.length; i += 4) {
114        data[i] = red;
115        data[i + 1] = green;
116        data[i + 2] = blue;
117        data[i + 3] = alpha;
118    }
119    return data;
120}
121export async function loadImage(src) {
122    return new Promise((resolve, reject) => {
123        let image = new Image();
124        image.onload = ev => {
125            resolve(image);
126        };
127        image.onerror = ev => {
128            reject(ev);
129        };
130        image.src = src;
131    });
132}
133