summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-mochitest/driver-info.js
blob: 5e68ce50ba74d4df9874b65df65b67549b846710 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
DriverInfo = (function () {
  // ---------------------------------------------------------------------------
  // Debug info handling

  function info(str) {
    window.console.log("Info: " + str);
  }

  // ---------------------------------------------------------------------------
  // OS and driver identification
  //   Stolen from dom/canvas/test/webgl/test_webgl_conformance_test_suite.html
  function detectDriverInfo() {
    var canvas = document.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");
    if (!ext) {
      throw "WEBGL_debug_renderer_info not available";
    }

    var webglRenderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
    return webglRenderer;
  }

  function detectOSInfo() {
    var os = null;
    var version = null;
    if (navigator.platform.indexOf("Win") == 0) {
      os = OS.WINDOWS;

      var versionMatch = /Windows NT (\d+.\d+)/.exec(navigator.userAgent);
      version = versionMatch ? parseFloat(versionMatch[1]) : null;
      // 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 (navigator.appVersion.includes("Android")) {
      os = OS.ANDROID;

      try {
        // From layout/tools/reftest/reftest.js:
        version = SpecialPowers.Services.sysinfo.getProperty("version");
      } catch (e) {
        info("No SpecialPowers: can't query android 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",
  };

  var DRIVER = {
    INTEL: "intel",
    MESA: "mesa",
    NVIDIA: "nvidia",
    ANDROID_X86_EMULATOR: "android x86 emulator",
    ANGLE: "angle",
  };

  var kOS = null;
  var kOSVersion = null;
  var kRawDriver = null;
  var kDriver = null;

  try {
    [kOS, kOSVersion] = detectOSInfo();
  } catch (e) {
    // Generally just fails when we don't have SpecialPowers.
  }

  try {
    kRawDriver = detectDriverInfo();

    if (kRawDriver.includes("llvmpipe")) {
      kDriver = DRIVER.MESA;
    } else if (kRawDriver.includes("Android Emulator")) {
      kDriver = DRIVER.ANDROID_X86_EMULATOR;
    } else if (kRawDriver.includes("ANGLE")) {
      kDriver = DRIVER.ANGLE;
    } else if (kRawDriver.includes("NVIDIA")) {
      kDriver = DRIVER.NVIDIA;
    } else if (kRawDriver.includes("Intel")) {
      kDriver = DRIVER.INTEL;
    }
  } catch (e) {
    // detectDriverInfo is fallible where WebGL fails.
  }

  function dump(line_out_func) {
    let lines = [
      "[DriverInfo] userAgent: " + navigator.userAgent,
      "[DriverInfo] kRawDriver: " + kRawDriver,
      "[DriverInfo] kDriver: " + kDriver,
      "[DriverInfo] kOS: " + kOS,
      "[DriverInfo] kOSVersion: " + kOSVersion,
    ];
    lines.forEach(line_out_func);
  }

  dump(x => console.log(x));

  return {
    DRIVER,
    OS,
    dump,
    getDriver() {
      return kDriver;
    },
    getOS() {
      return kOS;
    },
    getOSVersion() {
      return kOSVersion;
    },
  };
})();