diff options
Diffstat (limited to 'dom/canvas/test/webgl-mochitest/driver-info.js')
-rw-r--r-- | dom/canvas/test/webgl-mochitest/driver-info.js | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-mochitest/driver-info.js b/dom/canvas/test/webgl-mochitest/driver-info.js new file mode 100644 index 000000000..e2f6e003a --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/driver-info.js @@ -0,0 +1,169 @@ +DriverInfo = (function() { + // --------------------------------------------------------------------------- + // Debug info handling + + function defaultInfoFunc(str) { + console.log('Info: ' + str); + } + + var gInfoFunc = defaultInfoFunc; + function setInfoFunc(func) { + gInfoFunc = func; + } + + function info(str) { + gInfoFunc(str); + } + + // --------------------------------------------------------------------------- + // OS and driver identification + // Stolen from dom/canvas/test/webgl/test_webgl_conformance_test_suite.html + function detectDriverInfo() { + try { + var cc = SpecialPowers.Cc; + } catch (e) { + throw 'No SpecialPowers!'; + } + + const Cc = SpecialPowers.Cc; + const Ci = SpecialPowers.Ci; + var doc = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser).parseFromString("<html/>", "text/html"); + + var canvas = doc.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + + var type = ""; + var gl = null; + try { + gl = canvas.getContext("experimental-webgl"); + } catch(e) {} + + if (!gl) { + info('Failed to create WebGL context for querying driver info.'); + throw 'WebGL failed'; + } + + var ext = gl.getExtension("WEBGL_debug_renderer_info"); + // this extension is unconditionally available to chrome. No need to check. + + var webglRenderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); + var webglVendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); + return [webglVendor, webglRenderer]; + } + + function detectOSInfo() { + try { + var cc = SpecialPowers.Cc; + } catch (e) { + throw 'No SpecialPowers!'; + } + + const Cc = SpecialPowers.Cc; + const Ci = SpecialPowers.Ci; + + // From reftest.js: + var runtime = Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULRuntime); + + var os = null; + var version = null; + if (navigator.platform.indexOf('Win') == 0) { + os = OS.WINDOWS; + + // code borrowed from browser/modules/test/browser_taskbar_preview.js + version = SpecialPowers.Services.sysinfo.getProperty('version'); + version = parseFloat(version); + // Version 6.0 is Vista, 6.1 is 7. + + } else if (navigator.platform.indexOf('Mac') == 0) { + os = OS.MAC; + + var versionMatch = /Mac OS X (\d+.\d+)/.exec(navigator.userAgent); + version = versionMatch ? parseFloat(versionMatch[1]) : null; + + } else if (runtime.widgetToolkit == 'gonk') { + os = OS.B2G; + + } else if (navigator.appVersion.indexOf('Android') != -1) { + os = OS.ANDROID; + // From layout/tools/reftest/reftest.js: + version = SpecialPowers.Services.sysinfo.getProperty('version'); + + } else if (navigator.platform.indexOf('Linux') == 0) { + // Must be checked after android, as android also has a 'Linux' platform string. + os = OS.LINUX; + } + + return [os, version]; + } + + var OS = { + WINDOWS: 'windows', + MAC: 'mac', + LINUX: 'linux', + ANDROID: 'android', + B2G: 'b2g', + }; + + var DRIVER = { + MESA: 'mesa', + NVIDIA: 'nvidia', + ANDROID_X86_EMULATOR: 'android x86 emulator', + ANGLE: 'angle', + }; + + var kOS = null; + var kOSVersion = null; + var kDriver = null; + + try { + [kOS, kOSVersion] = detectOSInfo(); + } catch (e) { + // Generally just fails when we don't have SpecialPowers. + } + + try { + var glVendor, glRenderer; + [glVendor, glRenderer] = detectDriverInfo(); + info('GL vendor: ' + glVendor); + info('GL renderer: ' + glRenderer); + + if (glRenderer.includes('llvmpipe')) { + kDriver = DRIVER.MESA; + } else if (glRenderer.includes('Android Emulator')) { + kDriver = DRIVER.ANDROID_X86_EMULATOR; + } else if (glRenderer.includes('ANGLE')) { + kDriver = DRIVER.ANGLE; + } else if (glVendor.includes('NVIDIA')) { + kDriver = DRIVER.NVIDIA; + } + } catch (e) { + // detectDriverInfo is fallible where WebGL fails. + } + + if (kOS) { + info('OS detected as: ' + kOS); + info(' Version: ' + kOSVersion); + } else { + info('OS not detected.'); + info(' `platform`: ' + navigator.platform); + info(' `appVersion`: ' + navigator.appVersion); + info(' `userAgent`: ' + navigator.userAgent); + } + if (kDriver) { + info('GL driver detected as: ' + kDriver); + } else { + info('GL driver not detected.'); + } + + return { + setInfoFunc: setInfoFunc, + + OS: OS, + DRIVER: DRIVER, + getOS: function() { return kOS; }, + getDriver: function() { return kDriver; }, + getOSVersion: function() { return kOSVersion; }, + }; +})(); + |