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 +