Index: content/renderer/render_view_impl.cc |
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc |
index 651946597a1f378f54141f152a2d0098af6de412..5884d036deec8f3f66240950f21e730a8ab75c0e 100644 |
--- a/content/renderer/render_view_impl.cc |
+++ b/content/renderer/render_view_impl.cc |
@@ -69,6 +69,7 @@ |
#include "content/renderer/external_popup_menu.h" |
#include "content/renderer/geolocation_dispatcher.h" |
#include "content/renderer/gpu/compositor_thread.h" |
+#include "content/renderer/gpu/compositor_output_surface.h" |
#include "content/renderer/idle_user_detector.h" |
#include "content/renderer/input_tag_speech_dispatcher.h" |
#include "content/renderer/java/java_bridge_dispatcher.h" |
@@ -108,6 +109,7 @@ |
#include "net/base/escape.h" |
#include "net/base/net_errors.h" |
#include "net/http/http_util.h" |
+#include "third_party/WebKit/Source/Platform/chromium/public/WebCompositorOutputSurface.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebAccessibilityObject.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMEvent.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDOMMessageEvent.h" |
@@ -1757,49 +1759,28 @@ WebStorageNamespace* RenderViewImpl::createSessionStorageNamespace( |
return new WebStorageNamespaceImpl(session_storage_namespace_id_); |
} |
-WebGraphicsContext3D* RenderViewImpl::createGraphicsContext3D( |
- const WebGraphicsContext3D::Attributes& attributes) { |
- if (!webview()) |
+WebKit::WebCompositorOutputSurface* RenderViewImpl::createOutputSurface() { |
+ // TODO(aelias): if force-software-mode is on, create an output surface |
+ // without a 3D context. |
+ |
+ // 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; |
+ WebGraphicsContext3D* context = CreateGraphicsContext3D(attributes); |
+ if (!context) |
return NULL; |
- if (GetGuestToEmbedderChannel()) { |
- WebGraphicsContext3DCommandBufferImpl* context = |
- GetGuestToEmbedderChannel()->CreateWebGraphicsContext3D( |
- this, attributes, false); |
- if (!guest_pp_instance()) { |
- guest_uninitialized_context_ = context; |
- guest_attributes_ = attributes; |
- } |
- return context; |
- } |
- |
- // The WebGraphicsContext3DInProcessImpl code path is used for |
- // layout tests (though not through this code) as well as for |
- // debugging and bringing up new ports. |
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kInProcessWebGL)) { |
- return webkit::gpu::WebGraphicsContext3DInProcessImpl::CreateForWebView( |
- attributes, true); |
- } else { |
- GURL url; |
- if (webview()->mainFrame()) |
- url = GURL(webview()->mainFrame()->document().url()); |
- else |
- url = GURL("chrome://gpu/RenderViewImpl::createGraphicsContext3D"); |
- |
- scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( |
- new WebGraphicsContext3DCommandBufferImpl( |
- surface_id(), |
- url, |
- RenderThreadImpl::current(), |
- AsWeakPtr())); |
- |
- if (!context->Initialize( |
- attributes, |
- false /* bind generates resources */, |
- content::CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE)) |
- return NULL; |
- return context.release(); |
- } |
+ return new CompositorOutputSurface(routing_id(), context); |
} |
void RenderViewImpl::didAddMessageToConsole( |
@@ -3574,6 +3555,51 @@ void RenderViewImpl::CheckPreferredSize() { |
preferred_size_)); |
} |
+WebGraphicsContext3D* RenderViewImpl::CreateGraphicsContext3D( |
+ const WebGraphicsContext3D::Attributes& attributes) { |
+ if (!webview()) |
+ return NULL; |
+ |
+ if (GetGuestToEmbedderChannel()) { |
+ WebGraphicsContext3DCommandBufferImpl* context = |
+ GetGuestToEmbedderChannel()->CreateWebGraphicsContext3D( |
+ this, attributes, false); |
+ if (!guest_pp_instance()) { |
+ guest_uninitialized_context_ = context; |
+ guest_attributes_ = attributes; |
+ } |
+ return context; |
+ } |
+ |
+ // The WebGraphicsContext3DInProcessImpl code path is used for |
+ // layout tests (though not through this code) as well as for |
+ // debugging and bringing up new ports. |
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kInProcessWebGL)) { |
+ return webkit::gpu::WebGraphicsContext3DInProcessImpl::CreateForWebView( |
+ attributes, true); |
+ } else { |
+ GURL url; |
+ if (webview()->mainFrame()) |
+ url = GURL(webview()->mainFrame()->document().url()); |
+ else |
+ url = GURL("chrome://gpu/RenderViewImpl::createGraphicsContext3D"); |
+ |
+ scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( |
+ new WebGraphicsContext3DCommandBufferImpl( |
+ surface_id(), |
+ url, |
+ RenderThreadImpl::current(), |
+ AsWeakPtr())); |
+ |
+ if (!context->Initialize( |
+ attributes, |
+ false /* bind generates resources */, |
+ content::CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE)) |
+ return NULL; |
+ return context.release(); |
+ } |
+} |
+ |
void RenderViewImpl::EnsureMediaStreamImpl() { |
if (!RenderThreadImpl::current()) // Will be NULL during unit tests. |
return; |