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 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |