From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Milan Burda <milan.burda@gmail.com>
Date: Thu, 20 Sep 2018 17:47:01 -0700
Subject: webgl_context_attributes.patch


diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 4f7bbf765f92efe6a8453b9f7d2842f3bf691a64..27a164a5afb50ffb7414f5867f000ea77a16dc3f 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -906,8 +906,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 3b36d5710b08016e3c467c47b31a8220c91dc971..a6d7bc8dfe52ce17926d018467371579101a687f 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -541,6 +541,7 @@ class BLINK_PLATFORM_EXPORT Platform {
     kWebGPUContextType,  // WebGPU 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 614e4e3a8737c1149baac1aedb985c6be62c9a84..3ae0b2a809532707ca9c8b3964737a1a5941e132 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 = "uint8";
   bool premultiplied_alpha = true;
   bool preserve_drawing_buffer = false;
+  String power_preference = "default";
   bool stencil = false;
   bool xr_compatible = false;
 };
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 ad9f867f46be2c652da9fd328517de6d87de31a7..b4f97a0fdc658a23d5d021172e32d68f68a7c38f 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] boolean xrCompatible = false;
 };
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 7a74942ab1f4495956d8e96ecd98b8028a20efa3..9a868cdb36ce468d3116379cfc04da28acfe010b 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
@@ -17,6 +17,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->setXrCompatible(attrs.xr_compatible);
@@ -29,6 +30,7 @@ Platform::ContextAttributes ToPlatformContextAttributes(
     Platform::ContextType context_type,
     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 = context_type;
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 725dbfb351e7556e137750d95104648c879dffc1..2e4df15a8dfe1a8ea504205e951a3d270e23ed46 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] boolean xrCompatible = false;
     // TODO(crbug.com/788439): remove OriginTrialEnabled.
