UNPKG

@luma.gl/shadertools

Version:

Shader module system for luma.gl

97 lines (84 loc) 2.99 kB
import isOldIE from './is-old-ie'; import assert from './assert'; const GL_VENDOR = 0x1f00; const GL_RENDERER = 0x1f01; const GL_VERSION = 0x1f02; const GL_SHADING_LANGUAGE_VERSION = 0x8b8c; const WEBGL_FEATURES = { GLSL_FRAG_DATA: ['WEBGL_draw_buffers', true], GLSL_FRAG_DEPTH: ['EXT_frag_depth', true], GLSL_DERIVATIVES: ['OES_standard_derivatives', true], GLSL_TEXTURE_LOD: ['EXT_shader_texture_lod', true] }; const FEATURES = {}; Object.keys(WEBGL_FEATURES).forEach(key => { FEATURES[key] = key; }); export { FEATURES }; function isWebGL2(gl) { if (typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext) { return true; } return Boolean(gl && gl._version === 2); } export function getContextInfo(gl) { const info = gl.getExtension('WEBGL_debug_renderer_info'); const vendor = gl.getParameter(info && info.UNMASKED_VENDOR_WEBGL || GL_VENDOR); const renderer = gl.getParameter(info && info.UNMASKED_RENDERER_WEBGL || GL_RENDERER); const gpuVendor = identifyGPUVendor(vendor, renderer); const gpuInfo = { gpuVendor, vendor, renderer, version: gl.getParameter(GL_VERSION), shadingLanguageVersion: gl.getParameter(GL_SHADING_LANGUAGE_VERSION) }; return gpuInfo; } function identifyGPUVendor(vendor, renderer) { if (vendor.match(/NVIDIA/i) || renderer.match(/NVIDIA/i)) { return 'NVIDIA'; } if (vendor.match(/INTEL/i) || renderer.match(/INTEL/i)) { return 'INTEL'; } if (vendor.match(/AMD/i) || renderer.match(/AMD/i) || vendor.match(/ATI/i) || renderer.match(/ATI/i)) { return 'AMD'; } return 'UNKNOWN GPU'; } const compiledGlslExtensions = {}; export function canCompileGLGSExtension(gl, cap) { let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; const feature = WEBGL_FEATURES[cap]; assert(feature, cap); if (!isOldIE(opts)) { return true; } if (cap in compiledGlslExtensions) { return compiledGlslExtensions[cap]; } const extensionName = feature[0]; const behavior = opts.behavior || 'enable'; const source = "#extension GL_".concat(extensionName, " : ").concat(behavior, "\nvoid main(void) {}"); const shader = gl.createShader(35633); gl.shaderSource(shader, source); gl.compileShader(shader); const canCompile = gl.getShaderParameter(shader, 35713); gl.deleteShader(shader); compiledGlslExtensions[cap] = canCompile; return canCompile; } function getFeature(gl, cap) { const feature = WEBGL_FEATURES[cap]; assert(feature, cap); const extensionName = isWebGL2(gl) ? feature[1] || feature[0] : feature[0]; const value = typeof extensionName === 'string' ? Boolean(gl.getExtension(extensionName)) : extensionName; assert(value === false || value === true); return value; } export function hasFeatures(gl, features) { features = Array.isArray(features) ? features : [features]; return features.every(feature => getFeature(gl, feature)); } //# sourceMappingURL=webgl-info.js.map