94 lines
1.7 KiB
JavaScript
94 lines
1.7 KiB
JavaScript
import Stats from '../libs/stats.module.js';
|
|
|
|
// https://www.khronos.org/registry/webgl/extensions/EXT_disjoint_timer_query_webgl2/
|
|
export class GPUStatsPanel extends Stats.Panel {
|
|
|
|
constructor( context, name = 'GPU MS' ) {
|
|
|
|
super( name, '#f90', '#210' );
|
|
|
|
const extension = context.getExtension( 'EXT_disjoint_timer_query_webgl2' );
|
|
|
|
if ( extension === null ) {
|
|
|
|
console.warn( 'GPUStatsPanel: disjoint_time_query extension not available.' );
|
|
|
|
}
|
|
|
|
this.context = context;
|
|
this.extension = extension;
|
|
this.maxTime = 30;
|
|
this.activeQueries = 0;
|
|
|
|
this.startQuery = function () {
|
|
|
|
const gl = this.context;
|
|
const ext = this.extension;
|
|
|
|
if ( ext === null ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// create the query object
|
|
const query = gl.createQuery();
|
|
gl.beginQuery( ext.TIME_ELAPSED_EXT, query );
|
|
|
|
this.activeQueries ++;
|
|
|
|
const checkQuery = () => {
|
|
|
|
// check if the query is available and valid
|
|
|
|
const available = gl.getQueryParameter( query, gl.QUERY_RESULT_AVAILABLE );
|
|
const disjoint = gl.getParameter( ext.GPU_DISJOINT_EXT );
|
|
const ns = gl.getQueryParameter( query, gl.QUERY_RESULT );
|
|
|
|
const ms = ns * 1e-6;
|
|
|
|
if ( available ) {
|
|
|
|
// update the display if it is valid
|
|
if ( ! disjoint ) {
|
|
|
|
this.update( ms, this.maxTime );
|
|
|
|
}
|
|
|
|
this.activeQueries --;
|
|
|
|
|
|
} else if ( gl.isContextLost() === false ) {
|
|
|
|
// otherwise try again the next frame
|
|
requestAnimationFrame( checkQuery );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
requestAnimationFrame( checkQuery );
|
|
|
|
};
|
|
|
|
this.endQuery = function () {
|
|
|
|
// finish the query measurement
|
|
const ext = this.extension;
|
|
const gl = this.context;
|
|
|
|
if ( ext === null ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
gl.endQuery( ext.TIME_ELAPSED_EXT );
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|