diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index 4205c92765af..c82360f146d1 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc @@ -1021,8 +1021,10 @@ RendererBlinkPlatformImpl::CreateOffscreenGraphicsContext3DProvider( attributes.sample_buffers = 0; attributes.bind_generates_resource = false; attributes.enable_raster_interface = web_attributes.enable_raster_interface; - // Prefer discrete GPU for WebGL. - attributes.gpu_preference = gl::PreferDiscreteGpu; + + attributes.gpu_preference = web_attributes.prefer_integrated_gpu + ? gl::PreferIntegratedGpu + : gl::PreferDiscreteGpu; attributes.fail_if_major_perf_caveat = web_attributes.fail_if_major_performance_caveat; diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h index f3ec52975650..920d161a1b81 100644 --- a/third_party/blink/public/platform/platform.h +++ b/third_party/blink/public/platform/platform.h @@ -493,6 +493,7 @@ class BLINK_PLATFORM_EXPORT Platform { kGLES3ContextType, // GLES 3.0 context }; struct ContextAttributes { + bool prefer_integrated_gpu = false; bool fail_if_major_performance_caveat = false; ContextType context_type = kGLES2ContextType; // Offscreen contexts usually share a surface for the default frame buffer diff --git a/third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h b/third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h index 298e186289a0..5223ae30db6b 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h +++ b/third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h @@ -30,6 +30,7 @@ class CORE_EXPORT CanvasContextCreationAttributesCore { String pixel_format = "8-8-8-8"; bool premultiplied_alpha = true; bool preserve_drawing_buffer = false; + String power_preference = "default"; bool stencil = false; // This attribute is of type XRDevice, defined in modules/xr/XRDevice.h diff --git a/third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_module.idl b/third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_module.idl index 7b655dd12a77..8969eb7d98f3 100644 --- a/third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_module.idl +++ b/third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_module.idl @@ -28,6 +28,12 @@ enum CanvasPixelFormat { "float16", }; +enum CanvasPowerPreference { + "default", + "low-power", + "high-performance", +}; + [PermissiveDictionaryConversion] dictionary CanvasContextCreationAttributesModule { // This is an experimental feature, but it is not hidden behind a flag in @@ -47,6 +53,7 @@ dictionary CanvasContextCreationAttributesModule { boolean antialias = true; boolean premultipliedAlpha = true; boolean preserveDrawingBuffer = false; + CanvasPowerPreference powerPreference = "default"; boolean failIfMajorPerformanceCaveat = false; [OriginTrialEnabled=WebXR] XRDevice compatibleXRDevice = null; }; diff --git a/third_party/blink/renderer/modules/webgl/webgl_context_attribute_helpers.cc b/third_party/blink/renderer/modules/webgl/webgl_context_attribute_helpers.cc index 7274af57b8ee..2a2737da1a56 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_context_attribute_helpers.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_context_attribute_helpers.cc @@ -18,6 +18,7 @@ WebGLContextAttributes ToWebGLContextAttributes( result.setAntialias(attrs.antialias); result.setPremultipliedAlpha(attrs.premultiplied_alpha); result.setPreserveDrawingBuffer(attrs.preserve_drawing_buffer); + result.setPowerPreference(attrs.power_preference); result.setFailIfMajorPerformanceCaveat( attrs.fail_if_major_performance_caveat); result.setCompatibleXRDevice( @@ -30,6 +31,7 @@ Platform::ContextAttributes ToPlatformContextAttributes( unsigned web_gl_version, bool support_own_offscreen_surface) { Platform::ContextAttributes result; + result.prefer_integrated_gpu = attrs.power_preference == "low-power"; result.fail_if_major_performance_caveat = attrs.fail_if_major_performance_caveat; result.context_type = web_gl_version == 2 ? Platform::kWebGL2ContextType diff --git a/third_party/blink/renderer/modules/webgl/webgl_context_attributes.idl b/third_party/blink/renderer/modules/webgl/webgl_context_attributes.idl index 38ca0f6b6a0c..90cfe8497daf 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_context_attributes.idl +++ b/third_party/blink/renderer/modules/webgl/webgl_context_attributes.idl @@ -26,6 +26,12 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2 +enum WebGLPowerPreference { + "default", + "low-power", + "high-performance", +}; + dictionary WebGLContextAttributes { boolean alpha = true; boolean depth = true; @@ -33,6 +39,7 @@ dictionary WebGLContextAttributes { boolean antialias = true; boolean premultipliedAlpha = true; boolean preserveDrawingBuffer = false; + WebGLPowerPreference powerPreference = "default"; boolean failIfMajorPerformanceCaveat = false; [OriginTrialEnabled=WebXR] XRDevice compatibleXRDevice = null; }; -- 2.17.0