зеркало из https://github.com/mozilla/gecko-dev.git
165 строки
4.2 KiB
JavaScript
165 строки
4.2 KiB
JavaScript
/* 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;
|
|
}
|
|
}
|
|
}); |