/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import random from "../random/random.ts"; import numbers from "./numbers.ts"; export default class webgl { static get internalFormat() { return { RGB: { format: "RGB", type: ["UNSIGNED_BYTE", "UNSIGNED_SHORT_5_6_5"] }, RGBA: { format: "RGBA", type: [ "UNSIGNED_BYTE", "UNSIGNED_SHORT_4_4_4_4", "UNSIGNED_SHORT_5_5_5_1" ] }, LUMINANCE_ALPHA: { format: "LUMINANCE_ALPHA", type: ["UNSIGNED_BYTE"] }, LUMINANCE: { format: "LUMINANCE", type: ["UNSIGNED_BYTE"] }, ALPHA: { format: "ALPHA", type: ["UNSIGNED_BYTE"] }, R8: { format: "RED", type: ["UNSIGNED_BYTE"] }, R16F: { format: "RED", type: ["HALF_FLOAT", "FLOAT"] }, R32F: { format: "RED", type: ["FLOAT"] }, R8UI: { format: "RED_INTEGER", type: ["UNSIGNED_BYTE"] }, RG8: { format: "RG", type: ["UNSIGNED_BYTE"] }, RG16F: { format: "RG", type: ["HALF_FLOAT", "FLOAT"] }, RG32F: { format: "RG", type: ["FLOAT"] }, RG8UI: { format: "RG_INTEGER", type: ["UNSIGNED_BYTE"] }, RGB8: { format: "RGB", type: ["UNSIGNED_BYTE"] }, SRGB8: { format: "RGB", type: ["UNSIGNED_BYTE"] }, RGB565: { format: "RGB", type: ["RGB", "UNSIGNED_BYTE", "UNSIGNED_SHORT_5_6_5"] }, R11F_G11F_B10F: { format: "RGB", type: ["UNSIGNED_INT_10F_11F_11F_REV", "HALF_FLOAT", "FLOAT"] }, RGB9_E5: { format: "RGB", type: ["HALF_FLOAT", "FLOAT"] }, RGB16F: { format: "RGB", type: ["HALF_FLOAT", "FLOAT"] }, RGB32F: { format: "RGB", type: ["FLOAT"] }, RGB8UI: { format: "RGB_INTEGER", type: ["UNSIGNED_BYTE"] }, RGBA8: { format: "RGBA", type: ["UNSIGNED_BYTE"] }, SRGB8_ALPHA8: { format: "RGBA", type: ["UNSIGNED_BYTE"] }, RGB5_A1: { format: "RGBA", type: ["UNSIGNED_BYTE", "UNSIGNED_SHORT_5_5_5_1"] }, RGB10_A2: { format: "RGBA", type: ["UNSIGNED_INT_2_10_10_10_REV"] }, RGBA4: { format: "RGBA", type: ["UNSIGNED_BYTE", "UNSIGNED_SHORT_4_4_4_4"] }, RGBA16F: { format: "RGBA", type: ["HALF_FLOAT", "FLOAT"] }, RGBA32F: { format: "RGBA", type: ["FLOAT"] }, RGBA8UI: { format: "RGBA_INTEGER", type: ["UNSIGNED_BYTE"] } }; } static WebGLFormat() { let internalformat = random.item(Object.keys(webgl.internalFormat)); let format = webgl.internalFormat[internalformat].format; let type = random.item(webgl.internalFormat[internalformat].type); return [internalformat, format, type]; } static textureSources() { let sources = [ "HTMLCanvasElement", "HTMLImageElement", "HTMLVideoElement", "ImageData" ]; return random.item(sources); } static match(shader, regex, group = 1) { let matches = []; while (true) { let match = regex.exec(shader); if (match) { matches.push(match[group]); } else { break; } } return matches; } static parseUniforms(shader, group = 1) { /* Todo: Parse their individual data types into categories. */ return webgl.match(shader, /uniform .+? (\w+)(?=[\[;])/gm, group); // eslint-disable-line no-useless-escape } static parseAttributes(shader, group = 1) { return webgl.match(shader, /attribute .+? (\w+)(?=;)/gm, group); } static parseVaryings(shader, group = 1) { return webgl.match(shader, /varying .+? (\w+)(?=;)/gm, group); } static parseFragDatav2(shader, group = 1) { // #version 200 return webgl.match(shader, /(gl_Frag[^[ =]+)/gm, group); } static parseFragDatav3(shader, group = 1) { // #version 300 return webgl.match(shader, /out .+? (\w+)(?=[\[;])/gm, group); // eslint-disable-line no-useless-escape } static parseFrag(shader, group = 1) { let matches = webgl.parseFragDatav2(shader); if (matches.length) { return matches; } return webgl.parseFragDatav3(shader); } static randomBitmask() { const values = []; for (let i = 0; i < 8; i++) { values.push(random.item([1, 0])); } return parseInt(values.join("")); } static randomBufferTarget(isWebGL2) { let target = ["ARRAY_BUFFER", "ELEMENT_ARRAY_BUFFER"]; if (isWebGL2) { target = [ ...target, "COPY_READ_BUFFER", "COPY_WRITE_BUFFER", "TRANSFORM_FEEDBACK_BUFFER", "UNIFORM_BUFFER", "PIXEL_PACK_BUFFER", "PIXEL_UNPACK_BUFFER" ]; } return random.item(target); } static randomTexParameter(isWebGL2) { let pname = [ "TEXTURE_MAG_FILTER", "TEXTURE_MIN_FILTER", "TEXTURE_WRAP_S", "TEXTURE_WRAP_T" ]; if (isWebGL2) { pname = [ ...pname, "TEXTURE_BASE_LEVEL", "TEXTURE_COMPARE_FUNC", "TEXTURE_COMPARE_MODE", "TEXTURE_MAX_LEVEL", "TEXTURE_MAX_LOD", "TEXTURE_MIN_LOD", "TEXTURE_WRAP_R" ]; } return random.item(pname); } static randomTexParameterValue(isWebGL2) { let pnameparam = { TEXTURE_MAG_FILTER: ["LINEAR", "NEAREST"], TEXTURE_MIN_FILTER: [ "LINEAR", "NEAREST", "NEAREST_MIPMAP_NEAREST", "LINEAR_MIPMAP_NEAREST", "NEAREST_MIPMAP_LINEA", "LINEAR_MIPMAP_LINEAR" ], TEXTURE_WRAP_S: ["REPEAT", "CLAMP_TO_EDGE", "MIRRORED_REPEAT"], TEXTURE_WRAP_T: ["REPEAT", "CLAMP_TO_EDGE", "MIRRORED_REPEAT"] }; if (isWebGL2) { pnameparam = Object.assign(pnameparam, { TEXTURE_BASE_LEVEL: [numbers.any()], TEXTURE_COMPARE_FUNC: [ "LEQUAL", "GEQUAL", "LESS", "GREATER", "EQUAL", "NOTEQUAL", "ALWAYS", "NEVER" ], TEXTURE_COMPARE_MODE: ["NONE", "COMPARE_REF_TO_TEXTURE"], TEXTURE_MAX_LEVEL: [numbers.any()], TEXTURE_MAX_LOD: [numbers.float()], TEXTURE_MIN_LOD: [numbers.float()], TEXTURE_WRAP_R: ["REPEAT", "CLAMP_TO_EDGE", "MIRRORED_REPEAT"] }); } let pname = random.item(Object.keys(pnameparam)); let param = random.item(pnameparam[pname]); return [pname, param]; } static randomBlendMode(isWebGL2) { let mode = ["FUNC_ADD", "FUNC_SUBTRACT", "FUNC_REVERSE_SUBTRACT"]; if (isWebGL2) { mode = [...mode, "MIN", "MAX"]; } return random.item(mode); } static randomBlendFactor(isWebGL2) { let factor = [ "ZERO", "ONE", "SRC_COLOR", "ONE_MINUS_SRC_COLOR", "DST_COLOR", "ONE_MINUS_DST_COLOR", "SRC_ALPHA", "ONE_MINUS_SRC_ALPHA", "DST_ALPHA", "ONE_MINUS_DST_ALPHA", "CONSTANT_COLOR", "ONE_MINUS_CONSTANT_COLOR", "CONSTANT_ALPHA", "ONE_MINUS_CONSTANT_ALPHA", "SRC_ALPHA_SATURATE" ]; return random.item(factor); } static randomFace(isWebGL2) { let mode = ["FRONT", "BACK", "FRONT_AND_BACK"]; return random.item(mode); } static randomTexImage2DTarget(isWebGL2) { let target = [ "TEXTURE_2D", "TEXTURE_CUBE_MAP_POSITIVE_X", "TEXTURE_CUBE_MAP_NEGATIVE_X", "TEXTURE_CUBE_MAP_POSITIVE_Y", "TEXTURE_CUBE_MAP_NEGATIVE_Y", "TEXTURE_CUBE_MAP_POSITIVE_Z", "TEXTURE_CUBE_MAP_NEGATIVE_Z" ]; return random.item(target); } static randomTextureTarget(isWebGL2) { let target = ["TEXTURE_2D", "TEXTURE_CUBE_MAP"]; if (isWebGL2) { target = [...target, "TEXTURE_3D", "TEXTURE_2D_ARRAY"]; } return random.item(target); } static randomFunc(isWebGL2) { let func = [ "NEVER", "LESS", "EQUAL", "LEQUAL", "GREATER", "NOTEQUAL", "GEQUAL", "ALWAYS" ]; return random.item(func); } static randomCap(isWebGL2) { let cap = [ "BLEND", "CULL_FACE", "DEPTH_TEST", "DITHER", "POLYGON_OFFSET_FILL", "SAMPLE_ALPHA_TO_COVERAGE", "SAMPLE_COVERAGE", "SCISSOR_TEST", "STENCIL_TEST" ]; if (isWebGL2) { cap = [...cap, "RASTERIZER_DISCARD"]; } return random.item(cap); } static randomPrimitive(isWebGL2) { let mode = [ "POINTS", "LINE_STRIP", "LINE_LOOP", "LINES", "TRIANGLE_STRIP", "TRIANGLE_FAN", "TRIANGLES" ]; return random.item(mode); } static randomTextureAttachment(isWebGL2) { let attachment = [ "COLOR_ATTACHMENT0", "DEPTH_ATTACHMENT", "STENCIL_ATTACHMENT", "DEPTH_STENCIL_ATTACHMENT" ]; if (isWebGL2) { attachment = [...attachment, `COLOR_ATTACHMENT${random.range(0, 15)}`]; } return random.item(attachment); } static randomAttachmentQuery(isWebGL2) { let pname = [ "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE", "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME", "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL", "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE" ]; if (isWebGL2) { pname = [ ...pname, "FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE", "FRAMEBUFFER_ATTACHMENT_BLUE_SIZE", "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING", "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE", "FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE", "FRAMEBUFFER_ATTACHMENT_GREEN_SIZE", "FRAMEBUFFER_ATTACHMENT_RED_SIZE", "FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE", "FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER" ]; } return random.item(pname); } static randomShaderPrecision(isWebGL2) { let precisiontype = [ "LOW_FLOAT", "MEDIUM_FLOAT", "HIGH_FLOAT", "LOW_INT", "MEDIUM_INT", "HIGH_INT" ]; return random.item(precisiontype); } static randomStencilRefParameter(isWebGL2) { let param = [ "STENCIL_FUNC", "STENCIL_VALUE_MASK", "STENCIL_REF", "STENCIL_BACK_FUNC", "STENCIL_BACK_VALUE_MASK", "STENCIL_BACK_REF", "STENCIL_BITS" ]; return random.item(param); } static randomStencilMaskParameter(isWebGL2) { let param = ["STENCIL_WRITEMASK", "STENCIL_BACK_WRITEMASK", "STENCIL_BITS"]; return random.item(param); } static randomVertexAttribParameter(isWebGL2) { let pname = [ "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING", "VERTEX_ATTRIB_ARRAY_ENABLED", "VERTEX_ATTRIB_ARRAY_SIZE", "VERTEX_ATTRIB_ARRAY_STRIDE", "VERTEX_ATTRIB_ARRAY_TYPE", "VERTEX_ATTRIB_ARRAY_NORMALIZED", "CURRENT_VERTEX_ATTRIB" ]; if (isWebGL2) { pname = [ ...pname, "VERTEX_ATTRIB_ARRAY_INTEGER", "VERTEX_ATTRIB_ARRAY_DIVISOR", "VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE" ]; } return random.item(pname); } static randomHint(isWebGL2) { let target = ["GENERATE_MIPMAP_HINT"]; if (isWebGL2) { target = [...target, "FRAGMENT_SHADER_DERIVATIVE_HINT"]; } return random.item(target); } static randomHintMode(isWebGL2) { let mode = ["FASTEST", "NICEST", "DONT_CARE"]; return random.item(mode); } static randomPixelStorage(isWebGL2) { let pname = { PACK_ALIGNMENT: random.item([1, 2, 4, 8]), UNPACK_ALIGNMENT: random.item([1, 2, 4, 8]), UNPACK_FLIP_Y_WEBGL: random.bool(), UNPACK_PREMULTIPLY_ALPHA_WEBGL: random.bool(), UNPACK_COLORSPACE_CONVERSION_WEBGL: random.item([0, 0x9244]) }; if (isWebGL2) { Object.assign(pname, { PACK_ROW_LENGTH: numbers.any(), PACK_SKIP_PIXELS: numbers.any(), PACK_SKIP_ROWS: numbers.any(), UNPACK_ROW_LENGTH: numbers.any(), UNPACK_IMAGE_HEIGHT: numbers.any(), UNPACK_SKIP_PIXELS: numbers.any(), UNPACK_SKIP_ROWS: numbers.any(), UNPACK_SKIP_IMAGES: numbers.any() }); } let name = random.item(Object.keys(pname)); return [name, pname[name]]; } static randomStencilAction(isWebGL2) { let action = [ "KEEP", "ZERO", "REPLACE", "INCR", "INCR_WRAP", "DECR", "DECR_WRAP", "INVERT" ]; return random.item(action); } static randomQueryTarget(isWebGL2) { let target = [ "ANY_SAMPLES_PASSED", "ANY_SAMPLES_PASSED_CONSERVATIVE", "TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN" ]; return random.item(target); } static randomQueryPname(isWebGL2) { let pname = ["CURRENT_QUERY", "QUERY_RESULT", "QUERY_RESULT_AVAILABLE"]; return random.item(pname); } static randomSamplerParameter(isWebGL2) { let pname = [ "TEXTURE_MAG_FILTER", "TEXTURE_MIN_FILTER", "TEXTURE_WRAP_S", "TEXTURE_WRAP_T", "TEXTURE_BASE_LEVEL", "TEXTURE_COMPARE_FUNC", "TEXTURE_COMPARE_MODE", "TEXTURE_MAX_LEVEL", "TEXTURE_WRAP_R", "TEXTURE_MAX_LOD", "TEXTURE_MIN_LOD", "TEXTURE_MAX_ANISOTROPY_EXT" ]; return random.item(pname); } static randomSyncParameter(isWebGL2) { let pname = ["OBJECT_TYPE", "SYNC_STATUS", "SYNC_CONDITION", "SYNC_FLAGS"]; return random.item(pname); } static randomClearBuffer(isWebGL2) { let buffer = ["COLOR", "DEPTH", "STENCIL", "DEPTH_STENCIL"]; return random.item(buffer); } static randomBindBufferTarget(isWebGL2) { let target = ["TRANSFORM_FEEDBACK_BUFFER", "UNIFORM_BUFFER"]; return random.item(target); } static randomIndexedParameterTarget(isWebGL2) { let target = [ "TRANSFORM_FEEDBACK_BUFFER_BINDING", "TRANSFORM_FEEDBACK_BUFFER_SIZE", "TRANSFORM_FEEDBACK_BUFFER_START", "UNIFORM_BUFFER_BINDING", "UNIFORM_BUFFER_SIZE", "UNIFORM_BUFFER_START" ]; return random.item(target); } static randomUniformParameter(isWebGL2) { let pname = [ "UNIFORM_TYPE", "UNIFORM_SIZE", "UNIFORM_BLOCK_INDEX", "UNIFORM_OFFSET", "UNIFORM_ARRAY_STRIDE", "UNIFORM_MATRIX_STRIDE", "UNIFORM_IS_ROW_MAJOR" ]; return random.item(pname); } static randomUniformBlockParameter(isWebGL2) { let pname = [ "UNIFORM_BLOCK_BINDING", "UNIFORM_BLOCK_DATA_SIZE", "UNIFORM_BLOCK_ACTIVE_UNIFORMS", "UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES", "UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER", "UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER" ]; return random.item(pname); } static randomPixelDatatype(isWebGL2) { let type = [ "UNSIGNED_BYTE", "UNSIGNED_SHORT", "UNSIGNED_SHORT_5_6_5", "UNSIGNED_SHORT_4_4_4_4", "UNSIGNED_SHORT_5_5_5_1", "UNSIGNED_INT", "FLOAT" ]; return random.item(type); } static randomBufferUsage(isWebGL2) { let usage = ["STATIC_DRAW", "DYNAMIC_DRAW", "STREAM_DRAW"]; if (isWebGL2) { usage = [ ...usage, "STATIC_READ", "DYNAMIC_READ", "STREAM_READ", "STATIC_COPY", "DYNAMIC_COPY", "STREAM_COPY" ]; } return random.item(usage); } static randomParameter(isWebGL2) { let pname = [ "ACTIVE_TEXTURE", "ALIASED_LINE_WIDTH_RANGE", "ALIASED_POINT_SIZE_RANGE", "ALPHA_BITS", "ARRAY_BUFFER_BINDING", "BLEND", "BLEND_COLOR", "BLEND_DST_ALPHA", "BLEND_DST_RGB", "BLEND_EQUATION_ALPHA", "BLEND_EQUATION_RGB", "BLEND_SRC_ALPHA", "BLEND_SRC_RGB", "BLUE_BITS", "COLOR_CLEAR_VALUE", "COLOR_WRITEMASK", "COMPRESSED_TEXTURE_FORMATS", "CULL_FACE", "CULL_FACE_MODE", "CURRENT_PROGRAM", "DEPTH_BITS", "DEPTH_CLEAR_VALUE", "DEPTH_FUNC", "DEPTH_RANGE", "DEPTH_TEST", "DEPTH_WRITEMASK", "DITHER", "ELEMENT_ARRAY_BUFFER_BINDING", "FRAMEBUFFER_BINDING", "FRONT_FACE", "GENERATE_MIPMAP_HINT", "GREEN_BITS", "IMPLEMENTATION_COLOR_READ_FORMAT", "IMPLEMENTATION_COLOR_READ_TYPE", "LINE_WIDTH", "MAX_COMBINED_TEXTURE_IMAGE_UNITS", "MAX_CUBE_MAP_TEXTURE_SIZE", "MAX_FRAGMENT_UNIFORM_VECTORS", "MAX_RENDERBUFFER_SIZE", "MAX_TEXTURE_IMAGE_UNITS", "MAX_TEXTURE_SIZE", "MAX_VARYING_VECTORS", "MAX_VERTEX_ATTRIBS", "MAX_VERTEX_TEXTURE_IMAGE_UNITS", "MAX_VERTEX_UNIFORM_VECTORS", "MAX_VIEWPORT_DIMS", "PACK_ALIGNMENT", "POLYGON_OFFSET_FACTOR", "POLYGON_OFFSET_FILL", "POLYGON_OFFSET_UNITS", "RED_BITS", "RENDERBUFFER_BINDING", "RENDERER", "SAMPLE_ALPHA_TO_COVERAGE", "SAMPLE_BUFFERS", "SAMPLE_COVERAGE", "SAMPLE_COVERAGE_INVERT", "SAMPLE_COVERAGE_VALUE", "SAMPLES", "SCISSOR_BOX", "SCISSOR_TEST", "SHADING_LANGUAGE_VERSION", "STENCIL_BACK_FAIL", "STENCIL_BACK_FUNC", "STENCIL_BACK_PASS_DEPTH_FAIL", "STENCIL_BACK_PASS_DEPTH_PASS", "STENCIL_BACK_REF", "STENCIL_BACK_VALUE_MASK", "STENCIL_BACK_WRITEMASK", "STENCIL_BITS", "STENCIL_CLEAR_VALUE", "STENCIL_FAIL", "STENCIL_FUNC", "STENCIL_PASS_DEPTH_FAIL", "STENCIL_PASS_DEPTH_PASS", "STENCIL_REF", "STENCIL_TEST", "STENCIL_VALUE_MASK", "STENCIL_WRITEMASK", "SUBPIXEL_BITS", "TEXTURE_BINDING_2D", "TEXTURE_BINDING_CUBE_MAP", "UNPACK_ALIGNMENT", "UNPACK_COLORSPACE_CONVERSION_WEBGL", "UNPACK_FLIP_Y_WEBGL", "UNPACK_PREMULTIPLY_ALPHA_WEBGL", "VENDOR", "VERSION", "VIEWPORT", "VERSION", "SHADING_LANGUAGE_VERSION", "VENDOR", "RENDERER" ]; if (isWebGL2) { pname = [ ...pname, "COPY_READ_BUFFER_BINDING", "COPY_WRITE_BUFFER_BINDING", "DRAW_BUFFERi", "DRAW_FRAMEBUFFER_BINDING", "FRAGMENT_SHADER_DERIVATIVE_HINT", "MAX_3D_TEXTURE_SIZE", "MAX_ARRAY_TEXTURE_LAYERS", "MAX_CLIENT_WAIT_TIMEOUT_WEBGL", "MAX_COLOR_ATTACHMENTS", "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS", "MAX_COMBINED_UNIFORM_BLOCKS", "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS", "MAX_DRAW_BUFFERS", "MAX_ELEMENT_INDEX", "MAX_ELEMENTS_INDICE", "MAX_ELEMENTS_VERTICES", "MAX_FRAGMENT_INPUT_COMPONENTS", "MAX_FRAGMENT_UNIFORM_BLOCKS", "MAX_FRAGMENT_UNIFORM_COMPONENTS", "MAX_PROGRAM_TEXEL_OFFSET", "MAX_SAMPLES", "MAX_SERVER_WAIT_TIMEOUT", "MAX_TEXTURE_LOD_BIAS", "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS", "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS", "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS", "MAX_UNIFORM_BLOCK_SIZE", "MAX_UNIFORM_BUFFER_BINDINGS", "MAX_VARYING_COMPONENTS", "MAX_VERTEX_OUTPUT_COMPONENTS", "MAX_VERTEX_UNIFORM_BLOCKS", "MAX_VERTEX_UNIFORM_COMPONENTS", "MIN_PROGRAM_TEXEL_OFFSET", "PACK_ROW_LENGTH", "PACK_SKIP_PIXELS", "PACK_SKIP_ROWS", "PIXEL_PACK_BUFFER_BINDING", "PIXEL_UNPACK_BUFFER_BINDING", "RASTERIZER_DISCARD", "READ_BUFFER", "READ_FRAMEBUFFER_BINDING", "SAMPLER_BINDING", "TEXTURE_BINDING_2D_ARRAY", "TEXTURE_BINDING_3D", "TRANSFORM_FEEDBACK_ACTIVE", "TRANSFORM_FEEDBACK_BINDING", "TRANSFORM_FEEDBACK_BUFFER_BINDING", "TRANSFORM_FEEDBACK_PAUSED", "UNIFORM_BUFFER_BINDING", "UNIFORM_BUFFER_OFFSET_ALIGNMENT", "UNPACK_IMAGE_HEIGHT", "UNPACK_ROW_LENGTH", "UNPACK_SKIP_IMAGES", "UNPACK_SKIP_PIXELS", "UNPACK_SKIP_ROWS", "VERTEX_ARRAY_BINDING" ]; } return random.item(pname); } static randomProgramParameter() { let pname = [ "DELETE_STATUS", "LINK_STATUS", "VALIDATE_STATUS", "ATTACHED_SHADERS", "ACTIVE_ATTRIBUTES", "ACTIVE_UNIFORMS", "TRANSFORM_FEEDBACK_BUFFER_MODE", "TRANSFORM_FEEDBACK_VARYINGS", "ACTIVE_UNIFORM_BLOCKS" ]; return random.item(pname); } static randomRenderBufferParameter() { let pname = [ "RENDERBUFFER_WIDTH", "RENDERBUFFER_HEIGHT", "RENDERBUFFER_INTERNAL_FORMAT", "RENDERBUFFER_RED_SIZE", "RENDERBUFFER_GREEN_SIZE", "RENDERBUFFER_BLUE_SIZE", "RENDERBUFFER_ALPHA_SIZE", "RENDERBUFFER_DEPTH_SIZE", "RENDERBUFFER_STENCIL_SIZE" ]; return random.item(pname); } static randomExtension(pattern) { let extensions = [ "ANGLE_instanced_arrays", "EXT_blend_minmax", "EXT_color_buffer_half_float", "EXT_frag_depth", "EXT_sRGB", "EXT_shader_texture_lod", "EXT_texture_filter_anisotropic", "EXT_disjoint_timer_query", "OES_element_index_uint", "OES_standard_derivatives", "OES_texture_float", "OES_texture_float_linear", "OES_texture_half_float", "OES_texture_half_float_linear", "OES_vertex_array_object", "WEBGL_color_buffer_float", "WEBGL_compressed_texture_s3tc", "WEBGL_compressed_texture_s3tc_srgb", "WEBGL_debug_renderer_info", "WEBGL_debug_shaders", "WEBGL_depth_texture", "WEBGL_draw_buffers", "WEBGL_lose_context" ]; if (pattern) { let candidates = []; extensions.forEach(ext => ext.includes(pattern) ? candidates.push(ext) : "" ); if (candidates.length >= 0) { return random.item(candidates); } } return random.item(extensions); } }