var pool = require('./util/pool') var GL_SUBPIXEL_BITS = 0x0D50 var GL_RED_BITS = 0x0D52 var GL_GREEN_BITS = 0x0D53 var GL_BLUE_BITS = 0x0D54 var GL_ALPHA_BITS = 0x0D55 var GL_DEPTH_BITS = 0x0D56 var GL_STENCIL_BITS = 0x0D57 var GL_ALIASED_POINT_SIZE_RANGE = 0x846D var GL_ALIASED_LINE_WIDTH_RANGE = 0x846E var GL_MAX_TEXTURE_SIZE = 0x0D33 var GL_MAX_VIEWPORT_DIMS = 0x0D3A var GL_MAX_VERTEX_ATTRIBS = 0x8869 var GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB var GL_MAX_VARYING_VECTORS = 0x8DFC var GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D var GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C var GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872 var GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD var GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C var GL_MAX_RENDERBUFFER_SIZE = 0x84E8 var GL_VENDOR = 0x1F00 var GL_RENDERER = 0x1F01 var GL_VERSION = 0x1F02 var GL_SHADING_LANGUAGE_VERSION = 0x8B8C var GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF var GL_MAX_COLOR_ATTACHMENTS_WEBGL = 0x8CDF var GL_MAX_DRAW_BUFFERS_WEBGL = 0x8824 var GL_TEXTURE_2D = 0x0DE1 var GL_TEXTURE_CUBE_MAP = 0x8513 var GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515 var GL_TEXTURE0 = 0x84C0 var GL_RGBA = 0x1908 var GL_FLOAT = 0x1406 var GL_UNSIGNED_BYTE = 0x1401 var GL_FRAMEBUFFER = 0x8D40 var GL_FRAMEBUFFER_COMPLETE = 0x8CD5 var GL_COLOR_ATTACHMENT0 = 0x8CE0 var GL_COLOR_BUFFER_BIT = 0x4000 module.exports = function (gl, extensions) { var maxAnisotropic = 1 if (extensions.ext_texture_filter_anisotropic) { maxAnisotropic = gl.getParameter(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT) } var maxDrawbuffers = 1 var maxColorAttachments = 1 if (extensions.webgl_draw_buffers) { maxDrawbuffers = gl.getParameter(GL_MAX_DRAW_BUFFERS_WEBGL) maxColorAttachments = gl.getParameter(GL_MAX_COLOR_ATTACHMENTS_WEBGL) } // detect if reading float textures is available (Safari doesn't support) var readFloat = !!extensions.oes_texture_float if (readFloat) { var readFloatTexture = gl.createTexture() gl.bindTexture(GL_TEXTURE_2D, readFloatTexture) gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_FLOAT, null) var fbo = gl.createFramebuffer() gl.bindFramebuffer(GL_FRAMEBUFFER, fbo) gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, readFloatTexture, 0) gl.bindTexture(GL_TEXTURE_2D, null) if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) !== GL_FRAMEBUFFER_COMPLETE) readFloat = false else { gl.viewport(0, 0, 1, 1) gl.clearColor(1.0, 0.0, 0.0, 1.0) gl.clear(GL_COLOR_BUFFER_BIT) var pixels = pool.allocType(GL_FLOAT, 4) gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, pixels) if (gl.getError()) readFloat = false else { gl.deleteFramebuffer(fbo) gl.deleteTexture(readFloatTexture) readFloat = pixels[0] === 1.0 } pool.freeType(pixels) } } // detect non power of two cube textures support (IE doesn't support) var isIE = typeof navigator !== 'undefined' && (/MSIE/.test(navigator.userAgent) || /Trident\//.test(navigator.appVersion) || /Edge/.test(navigator.userAgent)) var npotTextureCube = true if (!isIE) { var cubeTexture = gl.createTexture() var data = pool.allocType(GL_UNSIGNED_BYTE, 36) gl.activeTexture(GL_TEXTURE0) gl.bindTexture(GL_TEXTURE_CUBE_MAP, cubeTexture) gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, data) pool.freeType(data) gl.bindTexture(GL_TEXTURE_CUBE_MAP, null) gl.deleteTexture(cubeTexture) npotTextureCube = !gl.getError() } return { // drawing buffer bit depth colorBits: [ gl.getParameter(GL_RED_BITS), gl.getParameter(GL_GREEN_BITS), gl.getParameter(GL_BLUE_BITS), gl.getParameter(GL_ALPHA_BITS) ], depthBits: gl.getParameter(GL_DEPTH_BITS), stencilBits: gl.getParameter(GL_STENCIL_BITS), subpixelBits: gl.getParameter(GL_SUBPIXEL_BITS), // supported extensions extensions: Object.keys(extensions).filter(function (ext) { return !!extensions[ext] }), // max aniso samples maxAnisotropic: maxAnisotropic, // max draw buffers maxDrawbuffers: maxDrawbuffers, maxColorAttachments: maxColorAttachments, // point and line size ranges pointSizeDims: gl.getParameter(GL_ALIASED_POINT_SIZE_RANGE), lineWidthDims: gl.getParameter(GL_ALIASED_LINE_WIDTH_RANGE), maxViewportDims: gl.getParameter(GL_MAX_VIEWPORT_DIMS), maxCombinedTextureUnits: gl.getParameter(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS), maxCubeMapSize: gl.getParameter(GL_MAX_CUBE_MAP_TEXTURE_SIZE), maxRenderbufferSize: gl.getParameter(GL_MAX_RENDERBUFFER_SIZE), maxTextureUnits: gl.getParameter(GL_MAX_TEXTURE_IMAGE_UNITS), maxTextureSize: gl.getParameter(GL_MAX_TEXTURE_SIZE), maxAttributes: gl.getParameter(GL_MAX_VERTEX_ATTRIBS), maxVertexUniforms: gl.getParameter(GL_MAX_VERTEX_UNIFORM_VECTORS), maxVertexTextureUnits: gl.getParameter(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS), maxVaryingVectors: gl.getParameter(GL_MAX_VARYING_VECTORS), maxFragmentUniforms: gl.getParameter(GL_MAX_FRAGMENT_UNIFORM_VECTORS), // vendor info glsl: gl.getParameter(GL_SHADING_LANGUAGE_VERSION), renderer: gl.getParameter(GL_RENDERER), vendor: gl.getParameter(GL_VENDOR), version: gl.getParameter(GL_VERSION), // quirks readFloat: readFloat, npotTextureCube: npotTextureCube } }