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