content/canvas/test/webgl-mochitest/driver-info.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/content/canvas/test/webgl-mochitest/driver-info.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,169 @@
     1.4 +DriverInfo = (function() {
     1.5 +  // ---------------------------------------------------------------------------
     1.6 +  // Debug info handling
     1.7 +
     1.8 +  function defaultInfoFunc(str) {
     1.9 +    console.log('Info: ' + str);
    1.10 +  }
    1.11 +
    1.12 +  var gInfoFunc = defaultInfoFunc;
    1.13 +  function setInfoFunc(func) {
    1.14 +    gInfoFunc = func;
    1.15 +  }
    1.16 +
    1.17 +  function info(str) {
    1.18 +    gInfoFunc(str);
    1.19 +  }
    1.20 +
    1.21 +  // ---------------------------------------------------------------------------
    1.22 +  // OS and driver identification
    1.23 +  //   Stolen from content/canvas/test/webgl/test_webgl_conformance_test_suite.html
    1.24 +  function detectDriverInfo() {
    1.25 +    try {
    1.26 +      var cc = SpecialPowers.Cc;
    1.27 +    } catch (e) {
    1.28 +      throw 'No SpecialPowers!';
    1.29 +    }
    1.30 +
    1.31 +    const Cc = SpecialPowers.Cc;
    1.32 +    const Ci = SpecialPowers.Ci;
    1.33 +    var doc = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser).parseFromString("<html/>", "text/html");
    1.34 +
    1.35 +    var canvas = doc.createElement("canvas");
    1.36 +    canvas.width = 1;
    1.37 +    canvas.height = 1;
    1.38 +
    1.39 +    var type = "";
    1.40 +    var gl = null;
    1.41 +    try {
    1.42 +      gl = canvas.getContext("experimental-webgl");
    1.43 +    } catch(e) {}
    1.44 +
    1.45 +    if (!gl) {
    1.46 +      info('Failed to create WebGL context for querying driver info.');
    1.47 +      throw 'WebGL failed';
    1.48 +    }
    1.49 +
    1.50 +    var ext = gl.getExtension("WEBGL_debug_renderer_info");
    1.51 +    // this extension is unconditionally available to chrome. No need to check.
    1.52 +
    1.53 +    var webglRenderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
    1.54 +    var webglVendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);
    1.55 +    return [webglVendor, webglRenderer];
    1.56 +  }
    1.57 +
    1.58 +  function detectOSInfo() {
    1.59 +    try {
    1.60 +      var cc = SpecialPowers.Cc;
    1.61 +    } catch (e) {
    1.62 +      throw 'No SpecialPowers!';
    1.63 +    }
    1.64 +
    1.65 +    const Cc = SpecialPowers.Cc;
    1.66 +    const Ci = SpecialPowers.Ci;
    1.67 +
    1.68 +    // From reftest.js:
    1.69 +    var runtime = Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULRuntime);
    1.70 +
    1.71 +    var os = null;
    1.72 +    var version = null;
    1.73 +    if (navigator.platform.indexOf('Win') == 0) {
    1.74 +      os = OS.WINDOWS;
    1.75 +
    1.76 +      // code borrowed from browser/modules/test/browser_taskbar_preview.js
    1.77 +      version = SpecialPowers.Services.sysinfo.getProperty('version');
    1.78 +      version = parseFloat(version);
    1.79 +      // Version 6.0 is Vista, 6.1 is 7.
    1.80 +
    1.81 +    } else if (navigator.platform.indexOf('Mac') == 0) {
    1.82 +      os = OS.MAC;
    1.83 +
    1.84 +      var versionMatch = /Mac OS X (\d+.\d+)/.exec(navigator.userAgent);
    1.85 +      version = versionMatch ? parseFloat(versionMatch[1]) : null;
    1.86 +
    1.87 +    } else if (runtime.widgetToolkit == 'gonk') {
    1.88 +      os = OS.B2G;
    1.89 +
    1.90 +    } else if (navigator.appVersion.indexOf('Android') != -1) {
    1.91 +      os = OS.ANDROID;
    1.92 +      // From layout/tools/reftest/reftest.js:
    1.93 +      version = SpecialPowers.Services.sysinfo.getProperty('version');
    1.94 +
    1.95 +    } else if (navigator.platform.indexOf('Linux') == 0) {
    1.96 +      // Must be checked after android, as android also has a 'Linux' platform string.
    1.97 +      os = OS.LINUX;
    1.98 +    }
    1.99 +
   1.100 +    return [os, version];
   1.101 +  }
   1.102 +
   1.103 +  var OS = {
   1.104 +    WINDOWS: 'windows',
   1.105 +    MAC: 'mac',
   1.106 +    LINUX: 'linux',
   1.107 +    ANDROID: 'android',
   1.108 +    B2G: 'b2g',
   1.109 +  };
   1.110 +
   1.111 +  var DRIVER = {
   1.112 +    MESA: 'mesa',
   1.113 +    NVIDIA: 'nvidia',
   1.114 +    ANDROID_X86_EMULATOR: 'android x86 emulator',
   1.115 +    ANGLE: 'angle',
   1.116 +  };
   1.117 +
   1.118 +  var kOS = null;
   1.119 +  var kOSVersion = null;
   1.120 +  var kDriver = null;
   1.121 +
   1.122 +  try {
   1.123 +    [kOS, kOSVersion] = detectOSInfo();
   1.124 +  } catch (e) {
   1.125 +    // Generally just fails when we don't have SpecialPowers.
   1.126 +  }
   1.127 +
   1.128 +  try {
   1.129 +    var glVendor, glRenderer;
   1.130 +    [glVendor, glRenderer] = detectDriverInfo();
   1.131 +    info('GL vendor: ' + glVendor);
   1.132 +    info('GL renderer: ' + glRenderer);
   1.133 +
   1.134 +    if (glRenderer.contains('llvmpipe')) {
   1.135 +      kDriver = DRIVER.MESA;
   1.136 +    } else if (glRenderer.contains('Android Emulator')) {
   1.137 +      kDriver = DRIVER.ANDROID_X86_EMULATOR;
   1.138 +    } else if (glRenderer.contains('ANGLE')) {
   1.139 +      kDriver = DRIVER.ANGLE;
   1.140 +    } else if (glVendor.contains('NVIDIA')) {
   1.141 +      kDriver = DRIVER.NVIDIA;
   1.142 +    }
   1.143 +  } catch (e) {
   1.144 +    // detectDriverInfo is fallible where WebGL fails.
   1.145 +  }
   1.146 +
   1.147 +  if (kOS) {
   1.148 +    info('OS detected as: ' + kOS);
   1.149 +    info('  Version: ' + kOSVersion);
   1.150 +  } else {
   1.151 +    info('OS not detected.');
   1.152 +    info('  `platform`:   ' + navigator.platform);
   1.153 +    info('  `appVersion`: ' + navigator.appVersion);
   1.154 +    info('  `userAgent`:  ' + navigator.userAgent);
   1.155 +  }
   1.156 +  if (kDriver) {
   1.157 +    info('GL driver detected as: ' + kDriver);
   1.158 +  } else {
   1.159 +    info('GL driver not detected.');
   1.160 +  }
   1.161 +
   1.162 +  return {
   1.163 +    setInfoFunc: setInfoFunc,
   1.164 +
   1.165 +    OS: OS,
   1.166 +    DRIVER: DRIVER,
   1.167 +    getOS: function() { return kOS; },
   1.168 +    getDriver: function() { return kDriver; },
   1.169 +    getOSVersion: function() { return kOSVersion; },
   1.170 +  };
   1.171 +})();
   1.172 +

mercurial