/* Each config has a few properties: * - library version * - hw name * * We need to be able to enumerate the list of possiblities for hw * names given a version, and vice-versa. Ideally the list of hw names * across versions will be the same, but it doesn't have to match up * exactly. * * Unfortunately JavaScript doesn't allow arbitrary keys on maps, only * strings. Since we'll almost never need to access along both * dimensions at once, we'll just have 2 separate maps, indexing by * each dimension, to an array of values. Each config must also know * what it is so that it can be properly filtered. * * The type of context (compat/core/es) is considered to be part of * the library version. */ var VERSIONS = { "Mesa 10.1.0": { "LLVMpipe": "llvmpipe-glxinfo-10.1.js", "Intel(R) 965G / X3000": "gen4-glxinfo-10.1.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-10.1.js", "Intel(R) Ironlake": "gen5-glxinfo-10.1.js", "Intel(R) Sandybridge (HD 2000/3000)": "snb-glxinfo-10.1.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-ivb-glxinfo-10.1.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-10.1.js", "NVIDIA Riva TNT/TNT2": "nv05-glxinfo-10.1.js", "NVIDIA NV4x (GeForce 6, 7)": "nv4c-glxinfo-10.1.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv96-glxinfo-10.1.js", "NVIDIA GT21x (GeForce 200, 300)": "nva8-glxinfo-10.1.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvc3-glxinfo-10.1.js", "NVIDIA GKxxx (GeForce 600, 700)": "nve7-glxinfo-10.1.js", "ATI R500": "rv570-glxinfo-10.1.js", "AMD R600/R700": "rv770-glxinfo-10.1.js", "AMD Evergreen/Northern Islands": "barts-glxinfo-10.1.js", "AMD Southern/Sea Islands": "tahiti-glxinfo-10.1.js", "Adreno A3xx": "fd330-glxinfo-10.2-devel.js", }, "Mesa 10.2.0": { "LLVMPipe": "llvmpipe-glxinfo-10.2.js", "SoftPipe": "softpipe-glxinfo-10.2.js", "Intel(R) 965G / X3000": "gen4-glxinfo-10.2.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-10.2.js", "Intel(R) Ironlake": "gen5-glxinfo-10.2.js", "Intel(R) Sandybridge (HD 2000/3000)": "snb-glxinfo-10.2.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-10.2.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-10.2.js", "NVIDIA Riva TNT/TNT2": "nv05-glxinfo-10.2.js", "NVIDIA GeForce 2, 4MX": "nv17-glxinfo-10.2.js", "NVIDIA NV3x (GeForce FX)": "nv35-glxinfo-10.2.js", "NVIDIA NV4x (GeForce 6, 7)": "nv44-glxinfo-10.2.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv96-glxinfo-10.2.js", "NVIDIA GT21x (GeForce 200, 300)": "nva3-glxinfo-10.2.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvcx-glxinfo-10.2.js", "NVIDIA GKxxx (GeForce 600, 700)": "nve6-glxinfo-10.2.js", "AMD R600/R700": "rv740-glxinfo-10.2.js", "AMD Evergreen/Northern Islands": "cedar-glxinfo-10.2.js", "AMD Southern/Sea Islands": "bonaire-glxinfo-10.2.js", "Adreno A3xx": "fd320-glxinfo-10.2.js", }, "Mesa 10.3.0": { "LLVMPipe": "llvmpipe-glxinfo-10.3.js", "SoftPipe": "softpipe-glxinfo-10.3.js", "Intel(R) 965G / X3000": "gen4-glxinfo-10.3.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-10.3.js", "Intel(R) Ironlake": "gen5-glxinfo-10.3.js", "Intel(R) Sandybridge (HD 2000/3000)": "gen6-glxinfo-10.3.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-10.3.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-10.3.js", //"NVIDIA Riva TNT/TNT2": "nv05-glxinfo-10.3.js", "NVIDIA GeForce 2, 4MX": "nv17-glxinfo-10.3.js", //"NVIDIA NV3x (GeForce FX)": "nv35-glxinfo-10.3.js", //"NVIDIA NV4x (GeForce 6, 7)": "nv44-glxinfo-10.3.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv92-glxinfo-10.3.js", "NVIDIA GT21x (GeForce 200, 300)": "nva8-glxinfo-10.3.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvc1-glxinfo-10.3.js", "NVIDIA GKxxx (GeForce 600, 700)": "nve7-glxinfo-10.3.js", "AMD R600/R700": "rv770-glxinfo-10.3.js", "AMD Evergreen/Northern Islands": "turks-glxinfo-10.3.js", "AMD Southern/Sea Islands": "kabini-glxinfo-10.3.js", "Adreno A3xx": "fd320-glxinfo-10.3.js", }, "Mesa 10.4.0": { "LLVMPipe": "llvmpipe-glxinfo-10.4.js", "SoftPipe": "softpipe-glxinfo-10.4.js", "Intel(R) 965G / X3000": "gen4-glxinfo-10.4.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-10.4.js", "Intel(R) Ironlake": "gen5-glxinfo-10.4.js", "Intel(R) Sandybridge (HD 2000/3000)": "gen6-glxinfo-10.4.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-10.4.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-10.4.js", "Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)": "gen8-glxinfo-10.4.js", //"NVIDIA Riva TNT/TNT2": "nv05-glxinfo-10.3.js", //"NVIDIA GeForce 2, 4MX": "nv17-glxinfo-10.3.js", //"NVIDIA NV3x (GeForce FX)": "nv35-glxinfo-10.3.js", "NVIDIA NV4x (GeForce 6, 7)": "nv4b-glxinfo-10.4.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv86-glxinfo-10.4.js", "NVIDIA GT21x (GeForce 200, 300)": "nva8-glxinfo-10.4.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvcf-glxinfo-10.4.js", "NVIDIA GKxxx (GeForce 600, 700)": "nve7-glxinfo-10.4.js", "AMD R600/R700": "rv635-glxinfo-10.4.js", "AMD Evergreen/Northern Islands": "cayman-glxinfo-10.4.js", "AMD Southern/Sea Islands": "tahiti-glxinfo-10.4.js", "Adreno A3xx": "fd320-glxinfo-10.4.js", }, "Mesa 10.5.0": { "LLVMPipe": "llvmpipe-glxinfo-10.5.js", "SoftPipe": "softpipe-glxinfo-10.5.js", "Intel(R) 965G / X3000": "gen4-glxinfo-10.5.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-10.5.js", "Intel(R) Ironlake": "gen5-glxinfo-10.5.js", "Intel(R) Sandybridge (HD 2000/3000)": "gen6-glxinfo-10.5.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-10.5.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-10.5.js", "Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)": "gen8-glxinfo-10.5.js", "NVIDIA NV4x (GeForce 6, 7)": "nv4b-glxinfo-10.5.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv96-glxinfo-10.5.js", "NVIDIA GT21x (GeForce 200, 300)": "nva8-glxinfo-10.5.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvc1-glxinfo-10.5.js", "NVIDIA GKxxx (GeForce 600, 700)": "nve7-glxinfo-10.5.js", "AMD R600/R700": "rv770-glxinfo-10.5.js", "AMD Evergreen/Northern Islands": "turks-glxinfo-10.5.js", "AMD Southern/Sea Islands": "kabini-glxinfo-10.5.js", "Adreno A3xx": "fd320-glxinfo-10.5.js", }, "Mesa 10.6.0": { "LLVMPipe": "llvmpipe-glxinfo-10.6.js", "SoftPipe": "softpipe-glxinfo-10.6.js", "Intel(R) 965G / X3000": "gen4-glxinfo-10.6.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-10.6.js", "Intel(R) Ironlake": "gen5-glxinfo-10.6.js", "Intel(R) Sandybridge (HD 2000/3000)": "gen6-glxinfo-10.6.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-10.6.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-10.6.js", "Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)": "gen8-glxinfo-10.6.js", "NVIDIA NV4x (GeForce 6, 7)": "nv44-glxinfo-10.6.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv96-glxinfo-10.6.js", "NVIDIA GT21x (GeForce 200, 300)": "nva5-glxinfo-10.6.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvc1-glxinfo-10.6.js", "NVIDIA GKxxx (GeForce 600, 700)": "nv108-glxinfo-10.6.js", "AMD R600/R700": "rv770-glxinfo-10.6.js", "AMD Evergreen/Northern Islands": "turks-glxinfo-10.6.js", "AMD Southern/Sea Islands": "tahiti-glxinfo-10.6.js", "Adreno A3xx": "a320-glxinfo-10.6.js", "Adreno A4xx": "a420-glxinfo-10.6.js", }, "Mesa 11.0.0": { "LLVMPipe": "llvmpipe-glxinfo-11.0.js", "SoftPipe": "softpipe-glxinfo-11.0.js", "Intel(R) 965G / X3000": "gen4-glxinfo-11.0.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-11.0.js", "Intel(R) Ironlake": "gen5-glxinfo-11.0.js", "Intel(R) Sandybridge (HD 2000/3000)": "gen6-glxinfo-11.0.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-11.0.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-11.0.js", "Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)": "gen8-glxinfo-11.0.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv96-glxinfo-11.0.js", "NVIDIA GT21x (GeForce 200, 300)": "nva3-glxinfo-11.0.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvc1-glxinfo-11.0.js", "NVIDIA GKxxx (GeForce 600, 700)": "nv108-glxinfo-11.0.js", "ATI R200": "r200-glxinfo-11.0.js", "AMD R600/R700": "rv635-glxinfo-11.0.js", "AMD Evergreen/Northern Islands": "cayman-glxinfo-11.0.js", "AMD Southern/Sea Islands": "tahiti-glxinfo-11.0.js", "Adreno A3xx": "a320-glxinfo-11.0.js", "Adreno A4xx": "a420-glxinfo-11.0.js", }, "Mesa 11.1.0": { "LLVMPipe": "llvmpipe-glxinfo-11.1.js", "SoftPipe": "softpipe-glxinfo-11.1.js", "Intel(R) 965G / X3000": "gen4-glxinfo-11.1.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-11.1.js", "Intel(R) Ironlake": "gen5-glxinfo-11.1.js", "Intel(R) Sandybridge (HD 2000/3000)": "gen6-glxinfo-11.1.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-11.1.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-11.1.js", "Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)": "gen8-glxinfo-11.1.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv96-glxinfo-11.1.js", "NVIDIA GT21x (GeForce 200, 300)": "nva3-glxinfo-11.1.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvc1-glxinfo-11.1.js", "NVIDIA GKxxx (GeForce 600, 700)": "nv108-glxinfo-11.1.js", "AMD R600/R700": "rv635-glxinfo-11.1.js", "AMD Evergreen/Northern Islands": "cayman-glxinfo-11.1.js", "AMD Southern/Sea Islands": "tonga-glxinfo-11.1.js", "Adreno A3xx": "a305-glxinfo-11.1.js", "Adreno A4xx": "a420-glxinfo-11.1.js", "Broadcom VC4 V3D 2.1 (Raspberry Pi)": "vc4-v3d-2.1-glxinfo-11.1.js", }, "Mesa 11.2.0": { "LLVMPipe": "llvmpipe-glxinfo-11.2.js", "SoftPipe": "softpipe-glxinfo-11.2.js", "Intel(R) 965G / X3000": "gen4-glxinfo-11.2.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-11.2.js", "Intel(R) Ironlake": "gen5-glxinfo-11.2.js", "Intel(R) Sandybridge (HD 2000/3000)": "gen6-glxinfo-11.2.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-11.2.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-11.2.js", "Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)": "gen8-glxinfo-11.2.js", "Intel(R) Skylake (HD 5xx)": "gen9-glxinfo-11.2.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv96-glxinfo-11.2.js", "NVIDIA GT21x (GeForce 200, 300)": "nva3-glxinfo-11.2.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvc1-glxinfo-11.2.js", "NVIDIA GKxxx (GeForce 600, 700)": "nv108-glxinfo-11.2.js", "NVIDIA GMxxx (GeForce 900)": "gm107-glxinfo-11.2.js", "AMD R600/R700": "rv770-glxinfo-11.2.js", "AMD Evergreen/Northern Islands": "palm-glxinfo-11.2.js", "AMD Southern/Sea Islands": "tahiti-glxinfo-11.2.js", "Adreno A3xx": "a320-glxinfo-11.2.js", "Adreno A4xx": "a420-glxinfo-11.2.js", }, "Mesa 12.0.0": { "LLVMPipe": "llvmpipe-glxinfo-12.0.js", "SoftPipe": "softpipe-glxinfo-12.0.js", "Intel(R) 965G / X3000": "gen4-glxinfo-12.0.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-12.0.js", "Intel(R) Ironlake": "gen5-glxinfo-12.0.js", "Intel(R) Sandybridge (HD 2000/3000)": "gen6-glxinfo-12.0.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-12.0.js", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-12.0.js", "Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)": "gen8-glxinfo-12.0.js", "Intel(R) Skylake (HD 5xx)": "gen9-glxinfo-12.0.js", "NVIDIA NV3x (GeForce FX)": "nv34-glxinfo-12.0.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv96-glxinfo-12.0.js", "NVIDIA GT21x (GeForce 200, 300)": "nva3-glxinfo-12.0.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvd9-glxinfo-12.0.js", "NVIDIA GKxxx (GeForce 600, 700)": "nv106-glxinfo-12.0.js", "NVIDIA GMxxx (GeForce 900)": "gm107-glxinfo-12.0.js", "AMD R600/R700": "rv770-glxinfo-12.0.js", "AMD Evergreen/Northern Islands": "redwood-glxinfo-12.0.js", "AMD Southern/Sea Islands": "kaveri-glxinfo-12.0.js", "Adreno A3xx": "a320-glxinfo-12.0.js", "Adreno A4xx": "a420-glxinfo-12.0.js", }, "Mesa 13.0.0": { "LLVMPipe": "llvmpipe-glxinfo-13.0.js", "SoftPipe": "softpipe-glxinfo-13.0.js", "Intel(R) 965G / X3000": "gen4-glxinfo-13.0.js", "Intel\u00ae GM45 Express": "gen4.5-glxinfo-13.0.js", "Intel(R) Ironlake": "gen5-glxinfo-13.0.js", "Intel(R) Sandybridge (HD 2000/3000)": "gen6-glxinfo-13.0.js", "Intel(R) Ivybridge (HD 2500 / 4000)": "gen7-glxinfo-13.0.js", //"Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "gen7.5-glxinfo-12.0.js", //"Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)": "gen8-glxinfo-12.0.js", "Intel(R) Skylake (HD 5xx)": "gen9-glxinfo-13.0.js", "NVIDIA NV3x (GeForce FX)": "nv34-glxinfo-13.0.js", "NVIDIA G80-G98 (GeForce 8, 9)": "nv96-glxinfo-13.0.js", "NVIDIA GT21x (GeForce 200, 300)": "nva5-glxinfo-13.0.js", "NVIDIA GF1xx (GeForce 400, 500)": "nvc1-glxinfo-13.0.js", "NVIDIA GKxxx (GeForce 600, 700)": "nv106-glxinfo-13.0.js", "NVIDIA GMxxx (GeForce 900)": "gm107-glxinfo-13.0.js", "AMD R600/R700": "rv770-glxinfo-13.0.js", //"AMD Evergreen/Northern Islands": "redwood-glxinfo-12.0.js", "AMD Southern/Sea Islands": "tonga-glxinfo-13.0.js", //"Adreno A3xx": "a320-glxinfo-12.0.js", //"Adreno A4xx": "a420-glxinfo-12.0.js", }, "Vendor": { "Intel(R) Sandybridge (HD 2000/3000)": "snb-glxinfo-windows.js", "AMD Southern/Sea Islands": "hd7900-fglrx-14.20-glxinfo.js", "AMD Evergreen/Northern Islands": "hd5670-fglrx-14.20-glxinfo.js", "NVIDIA G80-G98 (GeForce 8, 9)": "gt8400m-nvidia-337.25-glxinfo.js", "NVIDIA GT21x (GeForce 200, 300)": "gt210-nvidia-337.25-glxinfo.js", "NVIDIA GF1xx (GeForce 400, 500)": "gtx560-nvidia-349.16-glxinfo.js", "NVIDIA GKxxx (GeForce 600, 700)": "gt720-nvidia-358.09-glxinfo.js", "NVIDIA GMxxx (GeForce 900)": "gtx960-nvidia-361.28-glxinfo.js", "Adreno A3xx": "a320-qcom-45.js", "Adreno A4xx": "a420-qcom-127.js", }, "Apple": { "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": "hsw-apple-10.11-glxinfo.js", }, }; var HWS = [ ["Software", ["LLVMPipe", "SoftPipe"]], ["Intel", [ "Intel(R) 965G / X3000", "Intel\u00ae GM45 Express", "Intel(R) Ironlake", "Intel(R) Sandybridge (HD 2000/3000)", "Intel(R) Ivybridge (HD 2500 / 4000)", "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)", "Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)", "Intel(R) Skylake (HD 5xx)", ]], ["NVIDIA", [ "NVIDIA Riva TNT/TNT2", "NVIDIA GeForce 2, 4MX", "NVIDIA NV3x (GeForce FX)", "NVIDIA NV4x (GeForce 6, 7)", "NVIDIA G80-G98 (GeForce 8, 9)", "NVIDIA GT21x (GeForce 200, 300)", "NVIDIA GF1xx (GeForce 400, 500)", "NVIDIA GKxxx (GeForce 600, 700)", "NVIDIA GMxxx (GeForce 900)", ]], ["AMD/ATI", [ "ATI R200", "ATI R500", "AMD R600/R700", "AMD Evergreen/Northern Islands", "AMD Southern/Sea Islands", ]], ["Other", [ "Adreno A3xx", "Adreno A4xx", "Broadcom VC4 V3D 2.1 (Raspberry Pi)", ]], ]; var UNSUPPORTED = { "Intel(R) Broadwell (HD 5x00/6000, Iris 6x00)": [ "GL_ARB_shader_stencil_export", "GL_KHR_texture_compression_astc_hdr", "GL_KHR_texture_compression_astc_ldr", "GL_AMD_shader_stencil_export", ], "Intel(R) Haswell (HD 4x00/5000, Iris 5x00)": [ "GL_ARB_shader_stencil_export", "GL_KHR_texture_compression_astc_hdr", "GL_KHR_texture_compression_astc_ldr", "GL_AMD_shader_stencil_export", ], "Intel(R) Ivybridge (HD 2500 / 4000)": [ "GL_ARB_shader_stencil_export", "GL_KHR_texture_compression_astc_hdr", "GL_KHR_texture_compression_astc_ldr", "GL_AMD_shader_stencil_export", ], "Intel(R) Sandybridge (HD 2000/3000)": [ "GL_ARB_conservative_depth", "GL_ARB_draw_indirect", "GL_ARB_multi_draw_indirect", "GL_ARB_shader_stencil_export", "GL_ARB_tessellation_shader", "GL_ARB_texture_compression_bptc", "GL_ARB_transform_feedback3", "GL_KHR_texture_compression_astc_hdr", "GL_KHR_texture_compression_astc_ldr", "GL_AMD_conservative_depth", "GL_AMD_shader_stencil_export", ], "Intel(R) Ironlake": [ "GL_ARB_conservative_depth", "GL_ARB_draw_indirect", "GL_ARB_multi_draw_indirect", "GL_ARB_shader_stencil_export", "GL_ARB_tessellation_shader", "GL_ARB_texture_compression_bptc", "GL_ARB_texture_query_lod", "GL_ARB_transform_feedback3", "GL_KHR_texture_compression_astc_hdr", "GL_KHR_texture_compression_astc_ldr", "GL_AMD_conservative_depth", "GL_AMD_shader_stencil_export", ], "Intel\u00ae GM45 Express": [ "GL_ARB_conservative_depth", "GL_ARB_draw_indirect", "GL_ARB_multi_draw_indirect", "GL_ARB_shader_stencil_export", "GL_ARB_tessellation_shader", "GL_ARB_texture_compression_bptc", "GL_ARB_texture_query_lod", "GL_ARB_transform_feedback3", "GL_KHR_texture_compression_astc_hdr", "GL_KHR_texture_compression_astc_ldr", "GL_AMD_conservative_depth", "GL_AMD_shader_stencil_export", ], "Intel(R) 965G / X3000": [ "GL_ARB_conservative_depth", "GL_ARB_draw_indirect", "GL_ARB_multi_draw_indirect", "GL_ARB_shader_stencil_export", "GL_ARB_tessellation_shader", "GL_ARB_texture_compression_bptc", "GL_ARB_texture_query_lod", "GL_ARB_transform_feedback3", "GL_KHR_texture_compression_astc_hdr", "GL_KHR_texture_compression_astc_ldr", "GL_AMD_conservative_depth", "GL_AMD_shader_stencil_export", ], "AMD R600/R700": [ "GL_ARB_ES3_1_compatibility", "GL_ARB_derivative_control", "GL_ARB_shader_texture_image_samples", "GL_ARB_compute_shader", "GL_ARB_multi_draw_indirect", "GL_ARB_shader_atomic_counters", "GL_ARB_shader_image_load_store", "GL_ARB_texture_compression_bptc", "GL_ARB_draw_indirect", "GL_ARB_gpu_shader5", "GL_ARB_tessellation_shader", "GL_ARB_texture_gather", "GL_ARB_texture_query_lod", "GL_ARB_seamless_cubemap_per_texture", "GL_3DFX_texture_compression_FXT1", "GL_AMD_seamless_cubemap_per_texture", "GL_ARB_query_buffer_object", "GL_ARB_shader_storage_buffer_object", "GL_ARB_shader_image_size", "GL_ARB_texture_cube_map_array", "GL_NV_vdpau_interop", ], "AMD Evergreen/Northern Islands": [ "GL_3DFX_texture_compression_FXT1", ], "AMD Southern/Sea Islands": [ "GL_3DFX_texture_compression_FXT1", ], "NVIDIA G80-G98 (GeForce 8, 9)": [ "GL_ARB_texture_query_lod", "GL_ARB_draw_buffers_blend", "GL_ARB_draw_indirect", "GL_ARB_gpu_shader5", "GL_ARB_gpu_shader_fp64", "GL_ARB_sample_shading", "GL_ARB_tessellation_shader", "GL_ARB_texture_buffer_object_rgb32", "GL_ARB_texture_cube_map_array", "GL_ARB_texture_gather", "GL_ARB_transform_feedback2", "GL_ARB_transform_feedback3", "GL_ARB_vertex_attrib_64bit", "GL_ARB_transform_feedback_instanced", "GL_ARB_texture_compression_bptc", "GL_ARB_shader_image_load_store", "GL_ARB_shader_atomic_counters", "GL_ARB_shader_storage_buffer_object", "GL_ARB_shader_image_size", "GL_ARB_compute_shader", "GL_ARB_multi_draw_indirect", "GL_ARB_query_buffer_object", "GL_ARB_ES3_1_compatibility", "GL_ARB_seamless_cubemap_per_texture", "GL_ARB_shader_stencil_export", "GL_3DFX_texture_compression_FXT1", "GL_AMD_draw_buffers_blend", "GL_AMD_seamless_cubemap_per_texture", "GL_AMD_shader_stencil_export", "GL_AMD_vertex_shader_layer", "GL_AMD_vertex_shader_viewport_index", ], "NVIDIA GT21x (GeForce 200, 300)": [ "GL_ARB_draw_indirect", "GL_ARB_gpu_shader5", "GL_ARB_gpu_shader_fp64", "GL_ARB_tessellation_shader", "GL_ARB_texture_buffer_object_rgb32", "GL_ARB_vertex_attrib_64bit", "GL_ARB_texture_compression_bptc", "GL_ARB_shader_image_load_store", "GL_ARB_shader_atomic_counters", "GL_ARB_shader_storage_buffer_object", "GL_ARB_shader_image_size", "GL_ARB_compute_shader", "GL_ARB_multi_draw_indirect", "GL_ARB_query_buffer_object", "GL_ARB_ES3_1_compatibility", "GL_ARB_seamless_cubemap_per_texture", "GL_ARB_shader_stencil_export", "GL_3DFX_texture_compression_FXT1", "GL_AMD_seamless_cubemap_per_texture", "GL_AMD_shader_stencil_export", "GL_AMD_vertex_shader_layer", "GL_AMD_vertex_shader_viewport_index", ], "NVIDIA GF1xx (GeForce 400, 500)": [ "GL_ARB_seamless_cubemap_per_texture", "GL_ARB_shader_stencil_export", "GL_3DFX_texture_compression_FXT1", "GL_AMD_seamless_cubemap_per_texture", "GL_AMD_shader_stencil_export", "GL_AMD_vertex_shader_layer", "GL_AMD_vertex_shader_viewport_index", ], "NVIDIA GKxxx (GeForce 600, 700)": [ "GL_ARB_shader_stencil_export", "GL_3DFX_texture_compression_FXT1", "GL_AMD_shader_stencil_export", "GL_AMD_vertex_shader_layer", "GL_AMD_vertex_shader_viewport_index", ], }; var LOADED = {}; var CONFIGS_BY_HW = {}; var CONFIGS_BY_VERSION = {}; var VERSION; var PROFILE = 'core'; var DEFAULT_VERSION = 'Mesa 13.0.0'; function load_script(name, complete) { if (name in LOADED) { complete(); } else { var script = document.createElement('script'), head = document.head || document.getElementsByTagName('head')[0]; script.src = name; script.async = true; script.onload = function() { LOADED[name] = 1; complete(); }; head.insertBefore(script, head.firstChild); } } function load_scripts(scripts, complete) { var count = 0; $.each(scripts, function() { load_script(this, function() { count++; if (count == scripts.length) complete(); }); }); } function load_version(version, complete) { scripts = []; $.each(VERSIONS[version], function(k, v) { scripts.push(v); }); load_scripts(scripts, complete); } function load_hw(hw, complete) { scripts = []; $.each(VERSIONS, function(k, v) { $.each(v, function(k, v) { if (k == hw) scripts.push(v); })}); load_scripts(scripts, complete); } function add_array(dict, key, val) { if (dict[key]) dict[key].push(val); else dict[key] = [val]; } /* called by scripts */ function register(vendor, renderer, data) { $.each(data, function() { var config = this; config.vendor = vendor; config.renderer = renderer; var extensions = {}; $.each(config.extensions, function() { extensions[this] = 1; }); config.extensions = extensions; var unsupported = UNSUPPORTED[renderer] || {}; config.unsupported = {}; $.each(unsupported, function() { config.unsupported[this] = 1; }); var profile = config.profile; if (!profile) { profile = config.core ? 'core' : 'compat'; config.profile = profile; } var key = config.library + '/' + profile; add_array(CONFIGS_BY_VERSION, key, config); add_array(CONFIGS_BY_HW, config.renderer, config); }); } function keys(obj) { var ret = []; $.each(obj, function(k, v) { ret.push(k); }); return ret; } var EXTORDER = {"ARB": 1, "OES": 1.5, "EXT": 2}; var EXTGROUPS = [ ["OpenGL 4.5", true, [ "GL_ARB_clip_control", "GL_ARB_conditional_render_inverted", "GL_ARB_cull_distance", "GL_ARB_derivative_control", "GL_ARB_direct_state_access", "GL_ARB_ES3_1_compatibility", "GL_ARB_get_texture_sub_image", "GL_KHR_robustness", "GL_ARB_shader_texture_image_samples", "GL_ARB_texture_barrier", "GL_KHR_context_flush_control", ]], ["OpenGL 4.4", true, [ "GL_ARB_buffer_storage", "GL_ARB_clear_texture", "GL_ARB_enhanced_layouts", "GL_ARB_multi_bind", "GL_ARB_query_buffer_object", "GL_ARB_texture_mirror_clamp_to_edge", "GL_ARB_texture_stencil8", "GL_ARB_vertex_type_10f_11f_11f_rev", ]], ["OpenGL 4.3", true, [ "GL_ARB_arrays_of_arrays", "GL_ARB_ES3_compatibility", "GL_ARB_clear_buffer_object", "GL_ARB_compute_shader", "GL_ARB_copy_image", "GL_KHR_debug", "GL_ARB_explicit_uniform_location", "GL_ARB_fragment_layer_viewport", "GL_ARB_framebuffer_no_attachments", "GL_ARB_internalformat_query2", "GL_ARB_invalidate_subdata", "GL_ARB_multi_draw_indirect", "GL_ARB_program_interface_query", "GL_ARB_robust_buffer_access_behavior", "GL_ARB_shader_image_size", "GL_ARB_shader_storage_buffer_object", "GL_ARB_stencil_texturing", "GL_ARB_texture_buffer_range", "GL_ARB_texture_query_levels", "GL_ARB_texture_storage_multisample", "GL_ARB_texture_view", "GL_ARB_vertex_attrib_binding", ]], ["OpenGL 4.2", true, [ "GL_ARB_texture_compression_bptc", "GL_ARB_compressed_texture_pixel_storage", "GL_ARB_shader_atomic_counters", "GL_ARB_texture_storage", "GL_ARB_transform_feedback_instanced", "GL_ARB_base_instance", "GL_ARB_shader_image_load_store", "GL_ARB_conservative_depth", "GL_ARB_shading_language_420pack", "GL_ARB_shading_language_packing", "GL_ARB_internalformat_query", "GL_ARB_map_buffer_alignment", ]], ["OpenGL 4.1", true, [ "GL_ARB_ES2_compatibility", "GL_ARB_get_program_binary", "GL_ARB_separate_shader_objects", "GL_ARB_shader_precision", "GL_ARB_vertex_attrib_64bit", "GL_ARB_viewport_array", ]], ["OpenGL 4.0", true, [ "GL_ARB_texture_query_lod", "GL_ARB_draw_buffers_blend", "GL_ARB_draw_indirect", "GL_ARB_gpu_shader5", "GL_ARB_gpu_shader_fp64", "GL_ARB_sample_shading", "GL_ARB_shader_subroutine", "GL_ARB_tessellation_shader", "GL_ARB_texture_buffer_object_rgb32", "GL_ARB_texture_cube_map_array", "GL_ARB_texture_gather", "GL_ARB_transform_feedback2", "GL_ARB_transform_feedback3", ]], ["OpenGL 3.3", true, [ "GL_ARB_blend_func_extended", "GL_ARB_explicit_attrib_location", "GL_ARB_occlusion_query2", "GL_ARB_sampler_objects", "GL_ARB_shader_bit_encoding", "GL_ARB_texture_rgb10_a2ui", "GL_ARB_texture_swizzle", "GL_ARB_timer_query", "GL_ARB_instanced_arrays", "GL_ARB_vertex_type_2_10_10_10_rev", ]], ["OpenGL 3.2", true, [ "GL_ARB_vertex_array_bgra", "GL_ARB_draw_elements_base_vertex", "GL_ARB_fragment_coord_conventions", "GL_ARB_provoking_vertex", "GL_ARB_seamless_cube_map", "GL_ARB_texture_multisample", "GL_ARB_depth_clamp", "GL_ARB_sync", ]], ["OpenGL 3.1", false, [ "GL_ARB_draw_instanced", "GL_ARB_copy_buffer", "GL_NV_primitive_restart", "GL_ARB_texture_buffer_object", "GL_ARB_texture_rectangle", "GL_ARB_uniform_buffer_object", "GL_EXT_texture_snorm", ]], ["OpenGL 3.0", false, [ "GL_NV_conditional_render", "GL_ARB_map_buffer_range", "GL_ARB_color_buffer_float", "GL_ARB_texture_float", "GL_EXT_packed_float", "GL_EXT_texture_shared_exponent", "GL_ARB_depth_buffer_float", "GL_ARB_framebuffer_object", "GL_ARB_half_float_pixel", "GL_ARB_half_float_vertex", "GL_EXT_texture_integer", "GL_EXT_texture_array", "GL_EXT_draw_buffers2", "GL_ARB_texture_compression_rgtc", "GL_ARB_texture_rg", "GL_EXT_transform_feedback", "GL_ARB_vertex_array_object", "GL_ARB_framebuffer_sRGB", "GL_ARB_shader_texture_lod", ]], ["OpenGL 2.1", false, [ "GL_ARB_pixel_buffer_object", "GL_EXT_texture_sRGB", ]], ["OpenGL 2.0", false, [ "GL_ARB_shading_language_100", "GL_ARB_shader_objects", "GL_ARB_draw_buffers", "GL_ARB_point_sprite", "GL_ARB_vertex_shader", "GL_ARB_fragment_shader", "GL_ARB_texture_non_power_of_two", "GL_EXT_blend_equation_separate", "GL_EXT_stencil_two_side", "GL_ATI_separate_stencil", ]], ["OpenGL 1.5", false, [ "GL_ARB_vertex_buffer_object", "GL_ARB_occlusion_query", "GL_EXT_shadow_funcs", ]], ["OpenGL 1.4", false, [ "GL_ARB_depth_texture", "GL_ARB_point_parameters", "GL_ARB_shadow", "GL_ARB_texture_env_crossbar", "GL_ARB_texture_mirrored_repeat", "GL_ARB_window_pos", "GL_EXT_blend_color", "GL_EXT_blend_func_separate", "GL_EXT_blend_minmax", "GL_EXT_blend_subtract", "GL_EXT_fog_coord", "GL_EXT_multi_draw_arrays", "GL_EXT_secondary_color", "GL_EXT_stencil_wrap", "GL_EXT_texture_lod_bias", "GL_NV_blend_square", "GL_SGIS_generate_mipmap", ]], ["OpenGL 1.3", false, [ "GL_ARB_multisample", "GL_ARB_multitexture", "GL_ARB_texture_border_clamp", "GL_ARB_texture_compression", "GL_ARB_texture_cube_map", "GL_ARB_texture_env_add", "GL_ARB_texture_env_combine", "GL_ARB_texture_env_dot3", "GL_ARB_transpose_matrix", ]], ["OpenGL 1.2", false, [ "GL_EXT_bgra", "GL_EXT_draw_range_elements", "GL_EXT_packed_pixels", "GL_EXT_rescale_normal", "GL_EXT_separate_specular_color", "GL_EXT_texture3D", "GL_SGIS_texture_edge_clamp", "GL_SGIS_texture_lod", ]], ["OpenGL 1.1", false, [ "GL_EXT_copy_texture", "GL_EXT_polygon_offset", "GL_EXT_subtexture", "GL_EXT_texture", "GL_EXT_texture_object", "GL_EXT_vertex_array", ]], ]; function extsort(a, b) { var asplit = a.match(/GL_([A-Z0-9]+)_(.*)/); var bsplit = b.match(/GL_([A-Z0-9]+)_(.*)/); var acmp, bcmp; if (EXTORDER[asplit[1]] && EXTORDER[bsplit[1]] && asplit[1] != bsplit[1]) return EXTORDER[asplit[1]] - EXTORDER[bsplit[1]]; if (EXTORDER[asplit[1]] && !EXTORDER[bsplit[1]]) return -1; if (EXTORDER[bsplit[1]] && !EXTORDER[asplit[1]]) return 1; if (asplit[1] == bsplit[1]) { acmp = asplit[2]; bcmp = bsplit[2]; } else { acmp = asplit[1]; bcmp = bsplit[1]; } return (acmp < bcmp) ? -1 : ((acmp > bcmp) ? 1 : 0); } // Sort strings like "Mesa 9.1" and "Mesa 10.0" the way we'd expect function versort(a, b) { var asplit = a.match(/^[^\d]* ([\d\.]+)(.*)/); var bsplit = b.match(/^[^\d]* ([\d\.]+)(.*)/); if (!asplit || !bsplit) { return (a < b) ? -1 : ((a > b) ? 1 : 0); } var aver = $.map(asplit[1].split("."), function(v) { return parseInt(v, 10); }); var bver = $.map(bsplit[1].split("."), function(v) { return parseInt(v, 10); }); var len = aver.length; if (bver.length > len) len = bver.length; for (var i = 0; i < len; i++) { if (aver[i] === undefined) return -1; if (bver[i] === undefined) return 1; if (aver[i] != bver[i]) return aver[i] - bver[i]; } return 0; } // Compute a class prefix to use for this config, based on the vendor function config_class(config) { if (config.vendor.indexOf("Intel") >= 0) return "intel"; if (config.vendor.indexOf("nouveau") >= 0) return "nouveau"; if (config.vendor.indexOf("NVIDIA") >= 0) return "nouveau"; if (config.vendor.indexOf("radeon") >= 0) return "radeon"; if (config.vendor.indexOf("Advanced Micro Devices") >= 0) return "radeon"; return "sw"; } function config_cell(f, ext, config) { var unsupported = ""; if (ext && ext in config.unsupported) unsupported = " unsupported"; return '' + f(config) + ''; } function config_cell_map(configs, f, ext) { return $.map(configs, $.proxy(config_cell, null, f, ext)); } function config_has_diff(configs, f) { var ret = $.map(configs, f); if (ret.length == 0) return false; var init = ret.shift(); for (var i = 0; i < ret.length; i++) if (ret[i] != init) return true; return false; } function render(configs, profile, name, diff, breakdown) { var extensions = {}; var limits = {}; // Each config is a column. Need to compute the collective set of // rows for each of extensions and limits. $.each(configs, function() { var config = this; $.each(config.extensions, function(k, v) { extensions[k] = 1; }); $.each(config.limits, function(k, v) { limits[k] = 1; }); }); var table = []; table.push("" + $.map(configs, function(config) { return "
" + name(config) + "
"; }).join("")); // Emit the headers into a first table var headers = "
" + table.join("") + "
" // GL/GLSL versions table.push("OpenGL Version" + config_cell_map(configs, function(config) { return config.gl }).join("")); table.push("GLSL Version" + config_cell_map(configs, function(config) { return '
' + (config.glsl || "N/A") + "
" }).join("")); var extrow = function() { var ext = this.match(/GL_([A-Z0-9]+)_(.*)/); var row = []; if (diff && !config_has_diff(configs, function(config) { return ext[0] in config.extensions })) { return; } var glurl, exturl; if (profile == "es") { glurl = 'https://www.khronos.org/registry/gles/extensions/'; exturl = ext[1] + '_' + ext[2]; } else { glurl = 'https://www.opengl.org/registry/specs/'; exturl = ext[2]; } row.push('' + ext[1] + '_' + ext[2] + ''); row = row.concat(config_cell_map(configs, function(config) { return ext[0] in config.extensions ? "•" : " "; }, ext[0])); table.push(row.join("")); }; // First go through the extension groups if (profile == "core" || profile == "compat") { $.each(EXTGROUPS, function() { if (profile == "core" && !this[1]) return; var name = this[0]; var exts = this[2]; exts.sort(extsort); table.push('' + name + ''); $.each(exts, function() { delete extensions[this]; }); $.each(exts, extrow); }); table.push('Misc'); } extensions = keys(extensions); extensions.sort(extsort); $.each(extensions, extrow); limits = keys(limits); limits.sort(); if (limits.length) { table.push('Limits'); } $.each(limits, function() { var limit = this; var row = []; if (diff && !config_has_diff(configs, function(config) { return config.limits[limit] || "" })) { return; } row.push('' + limit + ''); row = row.concat(config_cell_map(configs, function(config) { return config.limits[limit] || ""; })); table.push(row.join("")); }); $('#table').html(headers + "" + table.join("") + "
"); $('#table .breakdown').val(breakdown); $('#table .breakdown').change(function(e) { var breakdown = $(e.target).val(); $('#table .breakdown').val(breakdown); var qs = parse_qs(window.location.hash.slice(1)); if (breakdown == 'hw') { delete qs.b; delete qs.g; qs.v = $('#libs option:selected:first').val(); } else { delete qs.v; qs.b = breakdown; qs.g = $('#hw option:selected:first').val(); } if (qs.v == DEFAULT_VERSION || !qs.v) delete qs.v; var qs = escape_qs_map(qs); if (qs == location.hash) $(window).trigger('hashchange'); else location.hash = '#' + qs; }); } var BREAKDOWN; function breakdown_update(breakdown) { if (BREAKDOWN == breakdown) return; if (breakdown == 'hw') { // Need to disable the versions multiselect, and make hw a // multiselect again. var lib = $('#libs').val(); $('#libs').multiselect('destroy'); $('#libs').removeAttr('multiple'); $('#libs').val(libs[0]); $('#libs').multiselect(); $('#hw').multiselect('destroy'); $('#hw').attr('multiple', 'multiple'); $('#hw option').attr('selected', 'selected'); $('#hw').multiselect({ nSelectedText: 'GPUs Selected', includeSelectAllOption: true }); } else { // Need to convert the versions to a multiselect, and the hw to a // single select. $('#libs').multiselect('destroy'); $('#libs').attr('multiple', 'multiple'); $('#libs option').attr('selected', 'selected'); $('#libs').multiselect({ nSelectedText: 'Versions Selected', includeSelectAllOption: true }); var hws = $('#hw').val(); $('#hw').multiselect('destroy'); $('#hw').removeAttr('multiple'); $('#hw').val(hws[0]); $('#hw').multiselect(); } BREAKDOWN = breakdown; } function parse_qs(s) { var ret = {}; var parts = s.split("&"); $.each(parts, function() { if (!this.length) return; var kv = this.split("="); var k = decodeURIComponent(kv.shift()); ret[k] = decodeURIComponent(kv.join("=")); }); return ret; } /* expects an array of tuples */ function escape_qs(vals) { var ret = []; $.each(vals, function() { if (!this.length) return; var comp = $.map(this, encodeURIComponent); ret.push(comp.join("=")); }); return ret.join("&"); } function escape_qs_map(val) { var ret = []; $.each(val, function(k, v) { var arr = [k, v]; if (!v) arr.pop(); var comp = $.map(arr, encodeURIComponent); ret.push(comp.join("=")); }); return ret.join("&"); } $(function() { var $window = $(window); $window.scroll(function() { var $float_tds = $('.floating th'); $('.main tr:first th').each(function() { var width = this.offsetWidth; //if (this.cellIndex == 0) width -= 2; /* border */ $float_tds[this.cellIndex].style.width = width + 'px'; }); $('.floating')[0].style.width = Math.max($(window).width(), $('.main')[0].offsetWidth * 2) + 'px'; //var tablepos = $('.main tr:first').offset().top - 50; $('.floating') .toggle($window.scrollTop() > 0) .css('left', -$window.scrollLeft() + 'px'); }); $(window).bind('hashchange', function(e) { e = $.event.fix(e); e.preventDefault(); var params = parse_qs(window.location.hash.slice(1)); var profile = params.p ? params.p : 'core'; var version = params.v ? params.v : DEFAULT_VERSION; var breakdown = params.b ? params.b : 'hw'; var diff = "diff" in params; breakdown_update(breakdown); var hw = params.g ? params.g : $('#hw').val(); $('#table').html(''); $('#loading').show(); var load = function() { var configs, name, names; if (breakdown == 'hw') { var key = version + '/' + profile; configs = CONFIGS_BY_VERSION[key]; name = function(config) { return config.renderer; }; names = hw; $('#libs').val(version); $('#libs').multiselect('refresh'); } else { configs = CONFIGS_BY_HW[hw]; name = function(config) { return config.library; }; names = $('#libs').val(); configs = configs.filter(function(x) { return x.profile == profile }); $('#hw').val(hw); $('#hw').multiselect('refresh'); } if (!configs) { $('#loading').hide(); return; } $('#profiles a').each(function() { var $this = $(this); $this.toggleClass('active', $this.text().toLowerCase() == profile); }); $('#diffs').toggleClass('active', diff); var map = {}; $.each(configs, function() { map[name(this)] = this; }); configs = []; if (names) { $.each(names, function() { if (this in map) configs.push(map[this]); }); } render(configs, profile, name, diff, breakdown); $('#loading').hide(); }; if (breakdown == 'hw') load_version(version, load); else load_hw(hw, load); return false; }); });