diff options
Diffstat (limited to 'devtools/server/primitive.js')
-rw-r--r-- | devtools/server/primitive.js | 165 |
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; + } + } +}); |