Browse Source

Merge pull request #12753 from luruke/powerPreference

Add `powerPreference` preference #12533
Mr.doob 7 years ago
parent
commit
ed7cafe5ef

+ 4 - 1
docs/api/renderers/WebGLRenderer.html

@@ -51,7 +51,10 @@
 		Default is *true*.<br />
 		Default is *true*.<br />
 
 
 		[page:Boolean preserveDrawingBuffer] - whether to preserve the buffers until manually cleared
 		[page:Boolean preserveDrawingBuffer] - whether to preserve the buffers until manually cleared
-	  or overwritten. Default is *false*.<br />
+		or overwritten. Default is *false*.<br />
+		
+		[page:String powerPreference] - Provides a hint to the user agent indicating what configuration
+		of GPU is suitable for this WebGL context. Can be *"high-performance"*, *"low-power"* or *"default"*. Default is *"default"*.<br />
 
 
 		[page:Boolean depth] - whether the drawing buffer has a
 		[page:Boolean depth] - whether the drawing buffer has a
 		[link:https://en.wikipedia.org/wiki/Z-buffering depth buffer] of at least 16 bits.
 		[link:https://en.wikipedia.org/wiki/Z-buffering depth buffer] of at least 16 bits.

+ 9 - 4
src/renderers/WebGL2Renderer.js

@@ -22,7 +22,8 @@ function WebGL2Renderer( parameters ) {
 		_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
 		_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
 		_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
 		_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
 		_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
 		_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
-		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;
+		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
+		_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';
 
 
 	// initialize
 	// initialize
 
 
@@ -36,9 +37,15 @@ function WebGL2Renderer( parameters ) {
 			stencil: _stencil,
 			stencil: _stencil,
 			antialias: _antialias,
 			antialias: _antialias,
 			premultipliedAlpha: _premultipliedAlpha,
 			premultipliedAlpha: _premultipliedAlpha,
-			preserveDrawingBuffer: _preserveDrawingBuffer
+			preserveDrawingBuffer: _preserveDrawingBuffer,
+			powerPreference: _powerPreference
 		};
 		};
 
 
+		// event listeners must be registered before WebGL context is created, see #12753
+
+		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
+		_canvas.addEventListener( 'webglcontextrestored', function () { } );
+
 		gl = _context || _canvas.getContext( 'webgl2', attributes );
 		gl = _context || _canvas.getContext( 'webgl2', attributes );
 
 
 		if ( gl === null ) {
 		if ( gl === null ) {
@@ -55,8 +62,6 @@ function WebGL2Renderer( parameters ) {
 
 
 		}
 		}
 
 
-		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
-
 	} catch ( error ) {
 	} catch ( error ) {
 
 
 		console.error( 'THREE.WebGL2Renderer: ' + error );
 		console.error( 'THREE.WebGL2Renderer: ' + error );

+ 9 - 5
src/renderers/WebGLRenderer.js

@@ -53,7 +53,8 @@ function WebGLRenderer( parameters ) {
 		_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
 		_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
 		_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
 		_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
 		_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
 		_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
-		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;
+		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
+		_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';
 
 
 	var lightsArray = [];
 	var lightsArray = [];
 	var shadowsArray = [];
 	var shadowsArray = [];
@@ -199,9 +200,15 @@ function WebGLRenderer( parameters ) {
 			stencil: _stencil,
 			stencil: _stencil,
 			antialias: _antialias,
 			antialias: _antialias,
 			premultipliedAlpha: _premultipliedAlpha,
 			premultipliedAlpha: _premultipliedAlpha,
-			preserveDrawingBuffer: _preserveDrawingBuffer
+			preserveDrawingBuffer: _preserveDrawingBuffer,
+			powerPreference: _powerPreference
 		};
 		};
 
 
+		// event listeners must be registered before WebGL context is created, see #12753
+
+		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
+		_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
+
 		_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
 		_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
 
 
 		if ( _gl === null ) {
 		if ( _gl === null ) {
@@ -230,9 +237,6 @@ function WebGLRenderer( parameters ) {
 
 
 		}
 		}
 
 
-		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
-		_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
-
 	} catch ( error ) {
 	} catch ( error ) {
 
 
 		console.error( 'THREE.WebGLRenderer: ' + error );
 		console.error( 'THREE.WebGLRenderer: ' + error );