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

Thu, 15 Jan 2015 21:03:48 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 21:03:48 +0100
branch
TOR_BUG_9701
changeset 11
deefc01c0e14
permissions
-rw-r--r--

Integrate friendly tips from Tor colleagues to make (or not) 4.5 alpha 3;
This includes removal of overloaded (but unused) methods, and addition of
a overlooked call to DataStruct::SetData(nsISupports, uint32_t, bool.)

     1 DriverInfo = (function() {
     2   // ---------------------------------------------------------------------------
     3   // Debug info handling
     5   function defaultInfoFunc(str) {
     6     console.log('Info: ' + str);
     7   }
     9   var gInfoFunc = defaultInfoFunc;
    10   function setInfoFunc(func) {
    11     gInfoFunc = func;
    12   }
    14   function info(str) {
    15     gInfoFunc(str);
    16   }
    18   // ---------------------------------------------------------------------------
    19   // OS and driver identification
    20   //   Stolen from content/canvas/test/webgl/test_webgl_conformance_test_suite.html
    21   function detectDriverInfo() {
    22     try {
    23       var cc = SpecialPowers.Cc;
    24     } catch (e) {
    25       throw 'No SpecialPowers!';
    26     }
    28     const Cc = SpecialPowers.Cc;
    29     const Ci = SpecialPowers.Ci;
    30     var doc = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser).parseFromString("<html/>", "text/html");
    32     var canvas = doc.createElement("canvas");
    33     canvas.width = 1;
    34     canvas.height = 1;
    36     var type = "";
    37     var gl = null;
    38     try {
    39       gl = canvas.getContext("experimental-webgl");
    40     } catch(e) {}
    42     if (!gl) {
    43       info('Failed to create WebGL context for querying driver info.');
    44       throw 'WebGL failed';
    45     }
    47     var ext = gl.getExtension("WEBGL_debug_renderer_info");
    48     // this extension is unconditionally available to chrome. No need to check.
    50     var webglRenderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
    51     var webglVendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);
    52     return [webglVendor, webglRenderer];
    53   }
    55   function detectOSInfo() {
    56     try {
    57       var cc = SpecialPowers.Cc;
    58     } catch (e) {
    59       throw 'No SpecialPowers!';
    60     }
    62     const Cc = SpecialPowers.Cc;
    63     const Ci = SpecialPowers.Ci;
    65     // From reftest.js:
    66     var runtime = Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULRuntime);
    68     var os = null;
    69     var version = null;
    70     if (navigator.platform.indexOf('Win') == 0) {
    71       os = OS.WINDOWS;
    73       // code borrowed from browser/modules/test/browser_taskbar_preview.js
    74       version = SpecialPowers.Services.sysinfo.getProperty('version');
    75       version = parseFloat(version);
    76       // Version 6.0 is Vista, 6.1 is 7.
    78     } else if (navigator.platform.indexOf('Mac') == 0) {
    79       os = OS.MAC;
    81       var versionMatch = /Mac OS X (\d+.\d+)/.exec(navigator.userAgent);
    82       version = versionMatch ? parseFloat(versionMatch[1]) : null;
    84     } else if (runtime.widgetToolkit == 'gonk') {
    85       os = OS.B2G;
    87     } else if (navigator.appVersion.indexOf('Android') != -1) {
    88       os = OS.ANDROID;
    89       // From layout/tools/reftest/reftest.js:
    90       version = SpecialPowers.Services.sysinfo.getProperty('version');
    92     } else if (navigator.platform.indexOf('Linux') == 0) {
    93       // Must be checked after android, as android also has a 'Linux' platform string.
    94       os = OS.LINUX;
    95     }
    97     return [os, version];
    98   }
   100   var OS = {
   101     WINDOWS: 'windows',
   102     MAC: 'mac',
   103     LINUX: 'linux',
   104     ANDROID: 'android',
   105     B2G: 'b2g',
   106   };
   108   var DRIVER = {
   109     MESA: 'mesa',
   110     NVIDIA: 'nvidia',
   111     ANDROID_X86_EMULATOR: 'android x86 emulator',
   112     ANGLE: 'angle',
   113   };
   115   var kOS = null;
   116   var kOSVersion = null;
   117   var kDriver = null;
   119   try {
   120     [kOS, kOSVersion] = detectOSInfo();
   121   } catch (e) {
   122     // Generally just fails when we don't have SpecialPowers.
   123   }
   125   try {
   126     var glVendor, glRenderer;
   127     [glVendor, glRenderer] = detectDriverInfo();
   128     info('GL vendor: ' + glVendor);
   129     info('GL renderer: ' + glRenderer);
   131     if (glRenderer.contains('llvmpipe')) {
   132       kDriver = DRIVER.MESA;
   133     } else if (glRenderer.contains('Android Emulator')) {
   134       kDriver = DRIVER.ANDROID_X86_EMULATOR;
   135     } else if (glRenderer.contains('ANGLE')) {
   136       kDriver = DRIVER.ANGLE;
   137     } else if (glVendor.contains('NVIDIA')) {
   138       kDriver = DRIVER.NVIDIA;
   139     }
   140   } catch (e) {
   141     // detectDriverInfo is fallible where WebGL fails.
   142   }
   144   if (kOS) {
   145     info('OS detected as: ' + kOS);
   146     info('  Version: ' + kOSVersion);
   147   } else {
   148     info('OS not detected.');
   149     info('  `platform`:   ' + navigator.platform);
   150     info('  `appVersion`: ' + navigator.appVersion);
   151     info('  `userAgent`:  ' + navigator.userAgent);
   152   }
   153   if (kDriver) {
   154     info('GL driver detected as: ' + kDriver);
   155   } else {
   156     info('GL driver not detected.');
   157   }
   159   return {
   160     setInfoFunc: setInfoFunc,
   162     OS: OS,
   163     DRIVER: DRIVER,
   164     getOS: function() { return kOS; },
   165     getDriver: function() { return kDriver; },
   166     getOSVersion: function() { return kOSVersion; },
   167   };
   168 })();

mercurial