Use an explicit attribute to signal that a context prefers to use a discrete GPU
authorjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Mar 2012 23:52:56 +0000 (23:52 +0000)
committerjamesr@google.com <jamesr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Mar 2012 23:52:56 +0000 (23:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=80639

Reviewed by Stephen White.

Source/Platform:

Adds preferDiscreteGPU attribute to WebGraphicsContext3D::Attributes. Also remove the forUseOnAnotherThread
attribute, this has been dead code for a while now.

* chromium/public/WebGraphicsContext3D.h:
(WebKit::WebGraphicsContext3D::Attributes::Attributes):
(Attributes):

Source/WebCore:

On platforms that support both integrated and discrete GPUs and can dynamically switch between the two, we
sometimes have a specific preference for a given context. Specifically, contexts used for WebGL and canvas 2d
acceleration should use the discrete GPU if available, but compositor contexts can run fine on an integrated
GPU. Instead of attempting to infer the intent from examining other context attributes, this adds an explicit
attribute to control this behavior.

* html/canvas/WebGLRenderingContext.cpp:
(WebCore):
(WebCore::WebGLRenderingContext::create):
* platform/graphics/GraphicsContext3D.h:
(WebCore::GraphicsContext3D::Attributes::Attributes):
(Attributes):
* platform/graphics/gpu/SharedGraphicsContext3D.cpp:
(WebCore::SharedGraphicsContext3D::get):

Source/WebKit/chromium:

* src/GraphicsContext3DChromium.cpp:
(WebCore::GraphicsContext3DPrivate::getContextAttributes):
(WebCore::GraphicsContext3D::create):
* src/WebViewImpl.cpp:
(WebKit::WebViewImpl::createCompositorGraphicsContext3D):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@110227 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/Platform/ChangeLog
Source/Platform/chromium/public/WebGraphicsContext3D.h
Source/WebCore/ChangeLog
Source/WebCore/html/canvas/WebGLRenderingContext.cpp
Source/WebCore/platform/graphics/GraphicsContext3D.h
Source/WebCore/platform/graphics/gpu/SharedGraphicsContext3D.cpp
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp
Source/WebKit/chromium/src/WebViewImpl.cpp

index ff5006ed8028f43c358622eaa7ff6ac681aae110..8eb711aaf61373438dd5e8e08d56f6b6955ac822 100644 (file)
@@ -1,3 +1,17 @@
+2012-03-08  James Robinson  <jamesr@chromium.org>
+
+        Use an explicit attribute to signal that a context prefers to use a discrete GPU
+        https://bugs.webkit.org/show_bug.cgi?id=80639
+
+        Reviewed by Stephen White.
+
+        Adds preferDiscreteGPU attribute to WebGraphicsContext3D::Attributes. Also remove the forUseOnAnotherThread
+        attribute, this has been dead code for a while now.
+
+        * chromium/public/WebGraphicsContext3D.h:
+        (WebKit::WebGraphicsContext3D::Attributes::Attributes):
+        (Attributes):
+
 2012-02-24  James Robinson  <jamesr@chromium.org>
 
         [chromium] WebKit::setColorNames is a client API
index 2f804d53ba1c3e08fe984e835da2d690d770f2d7..274c2794c1811208b153291f9b6ad16dcbd414bf 100644 (file)
@@ -94,7 +94,7 @@ public:
             , canRecoverFromContextLoss(true)
             , noExtensions(false)
             , shareResources(true)
-            , forUseOnAnotherThread(false)
+            , preferDiscreteGPU(false)
         {
         }
 
@@ -106,7 +106,7 @@ public:
         bool canRecoverFromContextLoss;
         bool noExtensions;
         bool shareResources;
-        bool forUseOnAnotherThread;
+        bool preferDiscreteGPU;
     };
 
     class WebGraphicsContextLostCallback {
index ccafb6f68535716ca56fa746c4714a505289ce56..15829948adb6b08c15c97e3efc7e230ed48f7986 100644 (file)
@@ -1,3 +1,25 @@
+2012-03-08  James Robinson  <jamesr@chromium.org>
+
+        Use an explicit attribute to signal that a context prefers to use a discrete GPU
+        https://bugs.webkit.org/show_bug.cgi?id=80639
+
+        Reviewed by Stephen White.
+
+        On platforms that support both integrated and discrete GPUs and can dynamically switch between the two, we
+        sometimes have a specific preference for a given context. Specifically, contexts used for WebGL and canvas 2d
+        acceleration should use the discrete GPU if available, but compositor contexts can run fine on an integrated
+        GPU. Instead of attempting to infer the intent from examining other context attributes, this adds an explicit
+        attribute to control this behavior.
+
+        * html/canvas/WebGLRenderingContext.cpp:
+        (WebCore):
+        (WebCore::WebGLRenderingContext::create):
+        * platform/graphics/GraphicsContext3D.h:
+        (WebCore::GraphicsContext3D::Attributes::Attributes):
+        (Attributes):
+        * platform/graphics/gpu/SharedGraphicsContext3D.cpp:
+        (WebCore::SharedGraphicsContext3D::get):
+
 2012-03-08  Andy Estes  <aestes@apple.com>
 
         NULL renderer possible in WebCore::HTMLInputElement::setCanReceiveDroppedFiles()
index cb1fc7165ee07558c3733ab41907c08d0d761a87..4ded9781dea6a2a9c30a222be12e8b10b3a0824e 100644 (file)
@@ -403,6 +403,7 @@ PassOwnPtr<WebGLRenderingContext> WebGLRenderingContext::create(HTMLCanvasElemen
 #else
     attributes.shareResources = false;
 #endif
+    attributes.preferDiscreteGPU = true;
 
 
     RefPtr<GraphicsContext3D> context(GraphicsContext3D::create(attributes, hostWindow));
index 531726398a1f421e510a0c017da44bb1f4f3dd0d..455ffe2bcb90eac9b9014e4f185dee7394761a29 100644 (file)
@@ -443,6 +443,7 @@ public:
             , preserveDrawingBuffer(false)
             , noExtensions(false)
             , shareResources(true)
+            , preferDiscreteGPU(false)
         {
         }
 
@@ -455,6 +456,7 @@ public:
         bool preserveDrawingBuffer;
         bool noExtensions;
         bool shareResources;
+        bool preferDiscreteGPU;
     };
 
     enum RenderStyle {
index a77345caa777a9bc9b2d3a5288565734286bfe13..24af3d8c997b3534dd6ccef2d8a32a2aa0cc30f1 100644 (file)
@@ -38,6 +38,7 @@ GraphicsContext3D* SharedGraphicsContext3D::get()
     attributes.antialias = false;
     attributes.canRecoverFromContextLoss = false; // Canvas contexts can not handle lost contexts.
     attributes.shareResources = true;
+    attributes.preferDiscreteGPU = true;
     static GraphicsContext3D* context = GraphicsContext3D::create(attributes, 0).leakRef();
     if (context && !context->makeContextCurrent())
         context = 0;
index 980d01c3740de7c4f5373403069f69c8b47f9b00..0fab7725aa163d9faccdc277e0418850c70dc3a5 100644 (file)
@@ -1,3 +1,16 @@
+2012-03-08  James Robinson  <jamesr@chromium.org>
+
+        Use an explicit attribute to signal that a context prefers to use a discrete GPU
+        https://bugs.webkit.org/show_bug.cgi?id=80639
+
+        Reviewed by Stephen White.
+
+        * src/GraphicsContext3DChromium.cpp:
+        (WebCore::GraphicsContext3DPrivate::getContextAttributes):
+        (WebCore::GraphicsContext3D::create):
+        * src/WebViewImpl.cpp:
+        (WebKit::WebViewImpl::createCompositorGraphicsContext3D):
+
 2012-03-08  Scott Byer  <scottbyer@chromium.org>
 
         Have ScrollAnimatorNone use requestAnimationFrame
index a5bdbcf2a06f464adf1b33d44fdfdc1d4dbd0c9b..74c533837da3c850239a6694744f2ddfbf620a64 100644 (file)
@@ -573,6 +573,7 @@ GraphicsContext3D::Attributes GraphicsContext3DPrivate::getContextAttributes()
     attributes.antialias = webAttributes.antialias;
     attributes.premultipliedAlpha = webAttributes.premultipliedAlpha;
     attributes.preserveDrawingBuffer = m_preserveDrawingBuffer;
+    attributes.preferDiscreteGPU = webAttributes.preferDiscreteGPU;
     return attributes;
 }
 
@@ -1017,6 +1018,7 @@ PassRefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3D::Attri
     webAttributes.canRecoverFromContextLoss = attrs.canRecoverFromContextLoss;
     webAttributes.noExtensions = attrs.noExtensions;
     webAttributes.shareResources = attrs.shareResources;
+    webAttributes.preferDiscreteGPU = attrs.preferDiscreteGPU;
 
     OwnPtr<WebKit::WebGraphicsContext3D> webContext = adoptPtr(WebKit::webKitPlatformSupport()->createOffscreenGraphicsContext3D(webAttributes));
     if (!webContext)
index 0e30c959058d7e564414a1385f648ef0bf9fe63e..ec9403cbcd699bf51887f438046dde4a740606af 100644 (file)
 using namespace WebCore;
 using namespace std;
 
-namespace {
-
-WebKit::WebGraphicsContext3D::Attributes getCompositorContextAttributes(bool threaded)
-{
-    // Explicitly disable antialiasing for the compositor. As of the time of
-    // this writing, the only platform that supported antialiasing for the
-    // compositor was Mac OS X, because the on-screen OpenGL context creation
-    // code paths on Windows and Linux didn't yet have multisampling support.
-    // Mac OS X essentially always behaves as though it's rendering offscreen.
-    // Multisampling has a heavy cost especially on devices with relatively low
-    // fill rate like most notebooks, and the Mac implementation would need to
-    // be optimized to resolve directly into the IOSurface shared between the
-    // GPU and browser processes. For these reasons and to avoid platform
-    // disparities we explicitly disable antialiasing.
-    WebKit::WebGraphicsContext3D::Attributes attributes;
-    attributes.antialias = false;
-    attributes.shareResources = true;
-    attributes.forUseOnAnotherThread = threaded;
-    return attributes;
-}
-
 // The following constants control parameters for automated scaling of webpages
 // (such as due to a double tap gesture or find in page etc.). These are
 // experimentally determined.
@@ -200,8 +179,6 @@ static const float minScaleDifference = 0.01;
 static const float doubleTapZoomContentDefaultMargin = 5;
 static const float doubleTapZoomContentMinimumMargin = 2;
 
-} // anonymous namespace
-
 namespace WebKit {
 
 // Change the text zoom level by kTextSizeMultiplierRatio each time the user
@@ -3221,7 +3198,20 @@ void WebViewImpl::setIsAcceleratedCompositingActive(bool active)
 
 PassOwnPtr<WebKit::WebGraphicsContext3D> WebViewImpl::createCompositorGraphicsContext3D()
 {
-    WebKit::WebGraphicsContext3D::Attributes attributes = getCompositorContextAttributes(CCProxy::hasImplThread());
+    // Explicitly disable antialiasing for the compositor. As of the time of
+    // this writing, the only platform that supported antialiasing for the
+    // compositor was Mac OS X, because the on-screen OpenGL context creation
+    // code paths on Windows and Linux didn't yet have multisampling support.
+    // Mac OS X essentially always behaves as though it's rendering offscreen.
+    // Multisampling has a heavy cost especially on devices with relatively low
+    // fill rate like most notebooks, and the Mac implementation would need to
+    // be optimized to resolve directly into the IOSurface shared between the
+    // GPU and browser processes. For these reasons and to avoid platform
+    // disparities we explicitly disable antialiasing.
+    WebKit::WebGraphicsContext3D::Attributes attributes;
+    attributes.antialias = false;
+    attributes.shareResources = true;
+
     OwnPtr<WebGraphicsContext3D> webContext = adoptPtr(client()->createGraphicsContext3D(attributes, true /* renderDirectlyToHostWindow */));
     if (!webContext)
         return nullptr;