UNPKG

@luma.gl/gltools

Version:

WebGL2 API Polyfills for WebGL1 WebGLRenderingContext

157 lines (134 loc) 3.6 kB
import { assert } from '../utils/assert'; import { isWebGL2 } from '../utils/webgl-checks'; import { getParameterPolyfill } from './get-parameter-polyfill'; const OES_vertex_array_object = 'OES_vertex_array_object'; const ANGLE_instanced_arrays = 'ANGLE_instanced_arrays'; const WEBGL_draw_buffers = 'WEBGL_draw_buffers'; const EXT_disjoint_timer_query = 'EXT_disjoint_timer_query'; const EXT_texture_filter_anisotropic = 'EXT_texture_filter_anisotropic'; const ERR_VAO_NOT_SUPPORTED = 'VertexArray requires WebGL2 or OES_vertex_array_object extension'; function getExtensionData(gl, extension) { return { webgl2: isWebGL2(gl), ext: gl.getExtension(extension) }; } export const WEBGL2_CONTEXT_POLYFILLS = { [OES_vertex_array_object]: { meta: { suffix: 'OES' }, createVertexArray: () => { assert(false, ERR_VAO_NOT_SUPPORTED); }, deleteVertexArray: () => {}, bindVertexArray: () => {}, isVertexArray: () => false }, [ANGLE_instanced_arrays]: { meta: { suffix: 'ANGLE' }, vertexAttribDivisor(location, divisor) { assert(divisor === 0, 'WebGL instanced rendering not supported'); }, drawElementsInstanced: () => {}, drawArraysInstanced: () => {} }, [WEBGL_draw_buffers]: { meta: { suffix: 'WEBGL' }, drawBuffers: () => { assert(false); } }, [EXT_disjoint_timer_query]: { meta: { suffix: 'EXT' }, createQuery: () => { assert(false); }, deleteQuery: () => { assert(false); }, beginQuery: () => { assert(false); }, endQuery: () => {}, getQuery(handle, pname) { return this.getQueryObject(handle, pname); }, getQueryParameter(handle, pname) { return this.getQueryObject(handle, pname); }, getQueryObject: () => {} } }; export const WEBGL2_CONTEXT_OVERRIDES = { readBuffer: (gl, originalFunc, attachment) => { if (isWebGL2(gl)) { originalFunc(attachment); } else {} }, getVertexAttrib: (gl, originalFunc, location, pname) => { const { webgl2, ext } = getExtensionData(gl, ANGLE_instanced_arrays); let result; switch (pname) { case 35069: result = !webgl2 ? false : undefined; break; case 35070: result = !webgl2 && !ext ? 0 : undefined; break; default: } return result !== undefined ? result : originalFunc(location, pname); }, getProgramParameter: (gl, originalFunc, program, pname) => { if (!isWebGL2(gl)) { switch (pname) { case 35967: return 35981; case 35971: return 0; case 35382: return 0; default: } } return originalFunc(program, pname); }, getInternalformatParameter: (gl, originalFunc, target, format, pname) => { if (!isWebGL2(gl)) { switch (pname) { case 32937: return new Int32Array([0]); default: } } return gl.getInternalformatParameter(target, format, pname); }, getTexParameter(gl, originalFunc, target, pname) { switch (pname) { case 34046: const { extensions } = gl.luma; const ext = extensions[EXT_texture_filter_anisotropic]; pname = ext && ext.TEXTURE_MAX_ANISOTROPY_EXT || 34046; break; default: } return originalFunc(target, pname); }, getParameter: getParameterPolyfill, hint(gl, originalFunc, pname, value) { return originalFunc(pname, value); } }; //# sourceMappingURL=polyfill-table.js.map