161 lines
5.3 KiB
JavaScript
161 lines
5.3 KiB
JavaScript
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
|
|
}
|
|
}
|