summaryrefslogtreecommitdiffstats
path: root/devtools/server/primitive.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/server/primitive.js')
-rw-r--r--devtools/server/primitive.js165
1 files changed, 165 insertions, 0 deletions
diff --git a/devtools/server/primitive.js b/devtools/server/primitive.js
new file mode 100644
index 000000000..45346bc78
--- /dev/null
+++ b/devtools/server/primitive.js
@@ -0,0 +1,165 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const { on, once, off, emit } = require("sdk/event/core");
+const { Class } = require("sdk/core/heritage");
+
+const WebGLPrimitivesType = {
+ "POINTS": 0,
+ "LINES": 1,
+ "LINE_LOOP": 2,
+ "LINE_STRIP": 3,
+ "TRIANGLES": 4,
+ "TRIANGLE_STRIP": 5,
+ "TRIANGLE_FAN": 6
+};
+
+/**
+ * A utility for monitoring WebGL primitive draws. Takes a `tabActor`
+ * and monitors primitive draws over time.
+ */
+const WebGLDrawArrays = "drawArrays";
+const WebGLDrawElements = "drawElements";
+
+var WebGLPrimitiveCounter = exports.WebGLPrimitiveCounter = Class({
+ initialize: function (tabActor) {
+ this.tabActor = tabActor;
+ },
+
+ destroy: function () {
+ this.stopRecording();
+ },
+
+ /**
+ * Starts monitoring primitive draws, storing the primitives count per tick.
+ */
+ resetCounts: function () {
+ this._tris = 0;
+ this._vertices = 0;
+ this._points = 0;
+ this._lines = 0;
+ this._startTime = this.tabActor.docShell.now();
+ },
+
+ /**
+ * Stops monitoring primitive draws, returning the recorded values.
+ */
+ getCounts: function () {
+ var result = {
+ tris: this._tris,
+ vertices: this._vertices,
+ points: this._points,
+ lines: this._lines
+ };
+
+ this._tris = 0;
+ this._vertices = 0;
+ this._points = 0;
+ this._lines = 0;
+ return result;
+ },
+
+ /**
+ * Handles WebGL draw primitive functions to catch primitive info.
+ */
+ handleDrawPrimitive: function (functionCall) {
+ let { name, args } = functionCall.details;
+
+ if (name === WebGLDrawArrays) {
+ this._processDrawArrays(args);
+ } else if (name === WebGLDrawElements) {
+ this._processDrawElements(args);
+ }
+ },
+
+ /**
+ * Processes WebGL drawArrays method to count primitve numbers
+ */
+ _processDrawArrays: function (args) {
+ let mode = args[0];
+ let count = args[2];
+
+ switch (mode) {
+ case WebGLPrimitivesType.POINTS:
+ this._vertices += count;
+ this._points += count;
+ break;
+ case WebGLPrimitivesType.LINES:
+ this._vertices += count;
+ this._lines += (count / 2);
+ break;
+ case WebGLPrimitivesType.LINE_LOOP:
+ this._vertices += count;
+ this._lines += count;
+ break;
+ case WebGLPrimitivesType.LINE_STRIP:
+ this._vertices += count;
+ this._lines += (count - 1);
+ break;
+ case WebGLPrimitivesType.TRIANGLES:
+ this._tris += (count / 3);
+ this._vertices += count;
+ break;
+ case WebGLPrimitivesType.TRIANGLE_STRIP:
+ this._tris += (count - 2);
+ this._vertices += count;
+ break;
+ case WebGLPrimitivesType.TRIANGLE_FAN:
+ this._tris += (count - 2);
+ this._vertices += count;
+ break;
+ default:
+ console.error("_processDrawArrays doesn't define this type.");
+ break;
+ }
+ },
+
+ /**
+ * Processes WebGL drawElements method to count primitve numbers
+ */
+ _processDrawElements: function (args) {
+ let mode = args[0];
+ let count = args[1];
+
+ switch (mode) {
+ case WebGLPrimitivesType.POINTS:
+ this._vertices += count;
+ this._points += count;
+ break;
+ case WebGLPrimitivesType.LINES:
+ this._vertices += count;
+ this._lines += (count / 2);
+ break;
+ case WebGLPrimitivesType.LINE_LOOP:
+ this._vertices += count;
+ this._lines += count;
+ break;
+ case WebGLPrimitivesType.LINE_STRIP:
+ this._vertices += count;
+ this._lines += (count - 1);
+ break;
+ case WebGLPrimitivesType.TRIANGLES:
+ let tris = count / 3;
+ let vertex = tris * 3;
+
+ if (tris > 1) {
+ vertex = tris * 2;
+ }
+ this._tris += tris;
+ this._vertices += vertex;
+ break;
+ case WebGLPrimitivesType.TRIANGLE_STRIP:
+ this._tris += (count - 2);
+ this._vertices += count;
+ break;
+ case WebGLPrimitivesType.TRIANGLE_FAN:
+ this._tris += (count - 2);
+ this._vertices += count;
+ default:
+ console.error("_processDrawElements doesn't define this type.");
+ break;
+ }
+ }
+});