| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 | import Stats from '../libs/stats.module.js';// https://www.khronos.org/registry/webgl/extensions/EXT_disjoint_timer_query/// 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' );		let isWebGL2 = true;		let extension = context.getExtension( 'EXT_disjoint_timer_query_webgl2' );		if ( extension === null ) {			isWebGL2 = false;			extension = context.getExtension( 'EXT_disjoint_timer_query' );			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			let query;			if ( isWebGL2 ) {				query = gl.createQuery();				gl.beginQuery( ext.TIME_ELAPSED_EXT, query );			} else {				query = ext.createQueryEXT();				ext.beginQueryEXT( ext.TIME_ELAPSED_EXT, query );			}			this.activeQueries ++;			const checkQuery = () => {				// check if the query is available and valid				let available, disjoint, ns;				if ( isWebGL2 ) {					available = gl.getQueryParameter( query, gl.QUERY_RESULT_AVAILABLE );					disjoint = gl.getParameter( ext.GPU_DISJOINT_EXT );					ns = gl.getQueryParameter( query, gl.QUERY_RESULT );				} else {					available = ext.getQueryObjectEXT( query, ext.QUERY_RESULT_AVAILABLE_EXT );					disjoint = gl.getParameter( ext.GPU_DISJOINT_EXT );					ns = ext.getQueryObjectEXT( query, ext.QUERY_RESULT_EXT );				}				const ms = ns * 1e-6;				if ( available ) {					// update the display if it is valid					if ( ! disjoint ) {						this.update( ms, this.maxTime );					}					this.activeQueries --;				} else {					// 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;			}			if ( isWebGL2 ) {				gl.endQuery( ext.TIME_ELAPSED_EXT );			} else {				ext.endQueryEXT( ext.TIME_ELAPSED_EXT );			}		};	}}
 |