|
1 DriverInfo = (function() { |
|
2 // --------------------------------------------------------------------------- |
|
3 // Debug info handling |
|
4 |
|
5 function defaultInfoFunc(str) { |
|
6 console.log('Info: ' + str); |
|
7 } |
|
8 |
|
9 var gInfoFunc = defaultInfoFunc; |
|
10 function setInfoFunc(func) { |
|
11 gInfoFunc = func; |
|
12 } |
|
13 |
|
14 function info(str) { |
|
15 gInfoFunc(str); |
|
16 } |
|
17 |
|
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 } |
|
27 |
|
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"); |
|
31 |
|
32 var canvas = doc.createElement("canvas"); |
|
33 canvas.width = 1; |
|
34 canvas.height = 1; |
|
35 |
|
36 var type = ""; |
|
37 var gl = null; |
|
38 try { |
|
39 gl = canvas.getContext("experimental-webgl"); |
|
40 } catch(e) {} |
|
41 |
|
42 if (!gl) { |
|
43 info('Failed to create WebGL context for querying driver info.'); |
|
44 throw 'WebGL failed'; |
|
45 } |
|
46 |
|
47 var ext = gl.getExtension("WEBGL_debug_renderer_info"); |
|
48 // this extension is unconditionally available to chrome. No need to check. |
|
49 |
|
50 var webglRenderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); |
|
51 var webglVendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); |
|
52 return [webglVendor, webglRenderer]; |
|
53 } |
|
54 |
|
55 function detectOSInfo() { |
|
56 try { |
|
57 var cc = SpecialPowers.Cc; |
|
58 } catch (e) { |
|
59 throw 'No SpecialPowers!'; |
|
60 } |
|
61 |
|
62 const Cc = SpecialPowers.Cc; |
|
63 const Ci = SpecialPowers.Ci; |
|
64 |
|
65 // From reftest.js: |
|
66 var runtime = Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULRuntime); |
|
67 |
|
68 var os = null; |
|
69 var version = null; |
|
70 if (navigator.platform.indexOf('Win') == 0) { |
|
71 os = OS.WINDOWS; |
|
72 |
|
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. |
|
77 |
|
78 } else if (navigator.platform.indexOf('Mac') == 0) { |
|
79 os = OS.MAC; |
|
80 |
|
81 var versionMatch = /Mac OS X (\d+.\d+)/.exec(navigator.userAgent); |
|
82 version = versionMatch ? parseFloat(versionMatch[1]) : null; |
|
83 |
|
84 } else if (runtime.widgetToolkit == 'gonk') { |
|
85 os = OS.B2G; |
|
86 |
|
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'); |
|
91 |
|
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 } |
|
96 |
|
97 return [os, version]; |
|
98 } |
|
99 |
|
100 var OS = { |
|
101 WINDOWS: 'windows', |
|
102 MAC: 'mac', |
|
103 LINUX: 'linux', |
|
104 ANDROID: 'android', |
|
105 B2G: 'b2g', |
|
106 }; |
|
107 |
|
108 var DRIVER = { |
|
109 MESA: 'mesa', |
|
110 NVIDIA: 'nvidia', |
|
111 ANDROID_X86_EMULATOR: 'android x86 emulator', |
|
112 ANGLE: 'angle', |
|
113 }; |
|
114 |
|
115 var kOS = null; |
|
116 var kOSVersion = null; |
|
117 var kDriver = null; |
|
118 |
|
119 try { |
|
120 [kOS, kOSVersion] = detectOSInfo(); |
|
121 } catch (e) { |
|
122 // Generally just fails when we don't have SpecialPowers. |
|
123 } |
|
124 |
|
125 try { |
|
126 var glVendor, glRenderer; |
|
127 [glVendor, glRenderer] = detectDriverInfo(); |
|
128 info('GL vendor: ' + glVendor); |
|
129 info('GL renderer: ' + glRenderer); |
|
130 |
|
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 } |
|
143 |
|
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 } |
|
158 |
|
159 return { |
|
160 setInfoFunc: setInfoFunc, |
|
161 |
|
162 OS: OS, |
|
163 DRIVER: DRIVER, |
|
164 getOS: function() { return kOS; }, |
|
165 getDriver: function() { return kDriver; }, |
|
166 getOSVersion: function() { return kOSVersion; }, |
|
167 }; |
|
168 })(); |
|
169 |