Index: webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc |
diff --git a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc |
index ae1242252f6c8d29918a3f9796b53d81ec79e323..df0c5309eeab3d3b0c02a922b8fcc61a63839a7d 100644 |
--- a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc |
+++ b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc |
@@ -31,8 +31,9 @@ |
#include "gpu/command_buffer/common/constants.h" |
#include "gpu/command_buffer/service/command_buffer_service.h" |
#include "gpu/command_buffer/service/context_group.h" |
-#include "gpu/command_buffer/service/transfer_buffer_manager.h" |
+#include "gpu/command_buffer/service/gl_context_virtual.h" |
#include "gpu/command_buffer/service/gpu_scheduler.h" |
+#include "gpu/command_buffer/service/transfer_buffer_manager.h" |
#include "ui/gl/gl_context.h" |
#include "ui/gl/gl_share_group.h" |
#include "ui/gl/gl_surface.h" |
@@ -99,7 +100,8 @@ class GLInProcessContext { |
bool share_resources, |
const char* allowed_extensions, |
const int32* attrib_list, |
- gfx::GpuPreference gpu_preference); |
+ gfx::GpuPreference gpu_preference, |
+ bool use_virtualized_gl_context_if_possible); |
// For an offscreen frame buffer GLInProcessContext, return the texture ID |
// with respect to the parent GLInProcessContext. Returns zero if |
@@ -150,7 +152,8 @@ class GLInProcessContext { |
const gfx::Size& size, |
const char* allowed_extensions, |
const int32* attrib_list, |
- gfx::GpuPreference gpu_preference); |
+ gfx::GpuPreference gpu_preference, |
+ bool use_virtualized_gl_context_if_possible); |
void Destroy(); |
void OnContextLost(); |
@@ -214,7 +217,8 @@ GLInProcessContext* GLInProcessContext::CreateContext( |
bool share_resources, |
const char* allowed_extensions, |
const int32* attrib_list, |
- gfx::GpuPreference gpu_preference) { |
+ gfx::GpuPreference gpu_preference, |
+ bool use_virtualized_gl_context_if_possible) { |
scoped_ptr<GLInProcessContext> context( |
new GLInProcessContext(share_resources)); |
if (!context->Initialize( |
@@ -223,7 +227,8 @@ GLInProcessContext* GLInProcessContext::CreateContext( |
size, |
allowed_extensions, |
attrib_list, |
- gpu_preference)) |
+ gpu_preference, |
+ use_virtualized_gl_context_if_possible)) |
return NULL; |
return context.release(); |
@@ -394,7 +399,8 @@ bool GLInProcessContext::Initialize( |
const gfx::Size& size, |
const char* allowed_extensions, |
const int32* attrib_list, |
- gfx::GpuPreference gpu_preference) { |
+ gfx::GpuPreference gpu_preference, |
+ bool use_virtualized_gl_context_if_possible) { |
// Use one share group for all contexts. |
CR_DEFINE_STATIC_LOCAL(scoped_refptr<gfx::GLShareGroup>, share_group, |
(new gfx::GLShareGroup)); |
@@ -478,9 +484,31 @@ bool GLInProcessContext::Initialize( |
return false; |
} |
- context_ = gfx::GLContext::CreateGLContext(share_group.get(), |
- surface_.get(), |
- gpu_preference); |
+ if (use_virtualized_gl_context_if_possible) { |
+ context_ = share_group->GetSharedContext(); |
+ if (!context_) { |
+ context_ = gfx::GLContext::CreateGLContext(share_group.get(), |
+ surface_.get(), |
+ gpu_preference); |
+ share_group->SetSharedContext(context_); |
+ } |
+ |
+ context_ = new ::gpu::GLContextVirtual(share_group.get(), |
+ context_, |
+ decoder_->AsWeakPtr()); |
+ if (context_->Initialize(surface_, gpu_preference)) { |
+ VLOG(1) << "Created virtual GL context."; |
+ } else { |
+ context_ = NULL; |
+ } |
+ } |
+ |
+ if (!context_) { |
+ context_ = gfx::GLContext::CreateGLContext(share_group.get(), |
+ surface_.get(), |
+ gpu_preference); |
+ } |
+ |
if (!context_.get()) { |
LOG(ERROR) << "Could not create GLContext."; |
Destroy(); |
@@ -588,9 +616,10 @@ void GLInProcessContext::OnContextLost() { |
WebGraphicsContext3DInProcessCommandBufferImpl* |
WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext( |
const WebKit::WebGraphicsContext3D::Attributes& attributes, |
- gfx::AcceleratedWidget window) { |
+ gfx::AcceleratedWidget window, |
+ bool use_virtualized_gl_context_if_possible) { |
return new WebGraphicsContext3DInProcessCommandBufferImpl( |
- attributes, false, window); |
+ attributes, false, window, use_virtualized_gl_context_if_possible); |
} |
// static |
@@ -598,16 +627,19 @@ WebGraphicsContext3DInProcessCommandBufferImpl* |
WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext( |
const WebKit::WebGraphicsContext3D::Attributes& attributes) { |
return new WebGraphicsContext3DInProcessCommandBufferImpl( |
- attributes, true, gfx::kNullAcceleratedWidget); |
+ attributes, true, gfx::kNullAcceleratedWidget, false); |
piman
2013/04/19 22:51:00
Why false here?
boliu
2013/04/19 22:53:22
Retaining old behavior to not use GLVirtualContext
|
} |
WebGraphicsContext3DInProcessCommandBufferImpl:: |
WebGraphicsContext3DInProcessCommandBufferImpl( |
const WebKit::WebGraphicsContext3D::Attributes& attributes, |
bool is_offscreen, |
- gfx::AcceleratedWidget window) |
+ gfx::AcceleratedWidget window, |
+ bool use_virtualized_gl_context_if_possible) |
: is_offscreen_(is_offscreen), |
window_(window), |
+ use_virtualized_gl_context_if_possible_( |
+ use_virtualized_gl_context_if_possible), |
initialized_(false), |
initialize_failed_(false), |
context_(NULL), |
@@ -663,7 +695,8 @@ bool WebGraphicsContext3DInProcessCommandBufferImpl::MaybeInitializeGL() { |
attributes_.shareResources, |
preferred_extensions, |
attribs, |
- gpu_preference); |
+ gpu_preference, |
+ use_virtualized_gl_context_if_possible_); |
if (!context_) { |
initialize_failed_ = true; |