Chromium Code Reviews| Index: webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc |
| diff --git a/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc b/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc |
| index 57767ec07397880cdeb510260e92cfad9e699d22..886e40f5f46456d3ae1120dc1e9e3e598af349b8 100644 |
| --- a/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc |
| +++ b/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc |
| @@ -73,7 +73,7 @@ WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext( |
| scoped_ptr<WebKit::WebGraphicsContext3D> context; |
| if (gfx::GLSurface::InitializeOneOff()) { |
| context.reset(new WebGraphicsContext3DInProcessCommandBufferImpl( |
| - attributes, false, window)); |
| + scoped_ptr< ::gpu::GLInProcessContext>(), attributes, false, window)); |
| } |
| return context.Pass(); |
| } |
| @@ -83,12 +83,29 @@ scoped_ptr<WebKit::WebGraphicsContext3D> |
| WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext( |
| const WebKit::WebGraphicsContext3D::Attributes& attributes) { |
| return make_scoped_ptr(new WebGraphicsContext3DInProcessCommandBufferImpl( |
| - attributes, true, gfx::kNullAcceleratedWidget)) |
| + scoped_ptr< ::gpu::GLInProcessContext>(), |
| + attributes, |
| + true, |
| + gfx::kNullAcceleratedWidget)) |
| + .PassAs<WebKit::WebGraphicsContext3D>(); |
| +} |
| + |
| +scoped_ptr<WebKit::WebGraphicsContext3D> |
| +WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext( |
| + scoped_ptr< ::gpu::GLInProcessContext> context, |
| + const WebKit::WebGraphicsContext3D::Attributes& attributes) { |
| + return make_scoped_ptr( |
| + new WebGraphicsContext3DInProcessCommandBufferImpl( |
| + context.Pass(), |
| + attributes, |
| + true /* is_offscreen. Not used. */, |
| + gfx::kNullAcceleratedWidget /* window. Not used. */)) |
| .PassAs<WebKit::WebGraphicsContext3D>(); |
| } |
| WebGraphicsContext3DInProcessCommandBufferImpl:: |
| WebGraphicsContext3DInProcessCommandBufferImpl( |
| + scoped_ptr< ::gpu::GLInProcessContext> context, |
| const WebKit::WebGraphicsContext3D::Attributes& attributes, |
| bool is_offscreen, |
| gfx::AcceleratedWidget window) |
| @@ -96,6 +113,7 @@ WebGraphicsContext3DInProcessCommandBufferImpl:: |
| window_(window), |
| initialized_(false), |
| initialize_failed_(false), |
| + context_(context.Pass()), |
| gl_(NULL), |
| context_lost_callback_(NULL), |
| context_lost_reason_(GL_NO_ERROR), |
| @@ -108,6 +126,17 @@ WebGraphicsContext3DInProcessCommandBufferImpl:: |
| ~WebGraphicsContext3DInProcessCommandBufferImpl() { |
| } |
| +// static |
| +void WebGraphicsContext3DInProcessCommandBufferImpl::ConvertAttributes( |
| + const WebKit::WebGraphicsContext3D::Attributes& attributes, |
| + ::gpu::GLInProcessContextAttribs* output_attribs) { |
| + output_attribs->alpha_size = attributes.alpha ? 8 : 0; |
| + output_attribs->depth_size = attributes.depth ? 24 : 0; |
| + output_attribs->stencil_size = attributes.stencil ? 8 : 0; |
| + output_attribs->samples = attributes.antialias ? 4 : 0; |
| + output_attribs->sample_buffers = attributes.antialias ? 1 : 0; |
| +} |
| + |
| bool WebGraphicsContext3DInProcessCommandBufferImpl::MaybeInitializeGL() { |
| if (initialized_) |
| return true; |
| @@ -118,46 +147,35 @@ bool WebGraphicsContext3DInProcessCommandBufferImpl::MaybeInitializeGL() { |
| // Ensure the gles2 library is initialized first in a thread safe way. |
| g_gles2_initializer.Get(); |
| - // Convert WebGL context creation attributes into GLInProcessContext / EGL |
| - // size requests. |
| - const int alpha_size = attributes_.alpha ? 8 : 0; |
| - const int depth_size = attributes_.depth ? 24 : 0; |
| - const int stencil_size = attributes_.stencil ? 8 : 0; |
| - const int samples = attributes_.antialias ? 4 : 0; |
| - const int sample_buffers = attributes_.antialias ? 1 : 0; |
| - const int32 attribs[] = { |
| - GLInProcessContext::ALPHA_SIZE, alpha_size, |
| - GLInProcessContext::DEPTH_SIZE, depth_size, |
| - GLInProcessContext::STENCIL_SIZE, stencil_size, |
| - GLInProcessContext::SAMPLES, samples, |
| - GLInProcessContext::SAMPLE_BUFFERS, sample_buffers, |
| - GLInProcessContext::NONE, |
| - }; |
| - |
| - const char* preferred_extensions = "*"; |
| - |
| - // TODO(kbr): More work will be needed in this implementation to |
| - // properly support GPU switching. Like in the out-of-process |
| - // command buffer implementation, all previously created contexts |
| - // will need to be lost either when the first context requesting the |
| - // discrete GPU is created, or the last one is destroyed. |
| - gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu; |
| - |
| - base::Closure context_lost_callback = |
| - base::Bind(&WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost, |
| - base::Unretained(this)); |
| - |
| - context_.reset(GLInProcessContext::CreateContext( |
| - is_offscreen_, |
| - window_, |
| - gfx::Size(1, 1), |
|
no sievers
2013/08/07 01:52:38
interesting that we pass in 1,1 here
|
| - attributes_.shareResources, |
| - preferred_extensions, |
| - attribs, |
| - gpu_preference, |
| - context_lost_callback)); |
| - |
| if (!context_) { |
| + const char* preferred_extensions = "*"; |
| + |
| + // TODO(kbr): More work will be needed in this implementation to |
| + // properly support GPU switching. Like in the out-of-process |
| + // command buffer implementation, all previously created contexts |
| + // will need to be lost either when the first context requesting the |
| + // discrete GPU is created, or the last one is destroyed. |
| + gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu; |
| + |
| + ::gpu::GLInProcessContextAttribs attrib_struct; |
| + ConvertAttributes(attributes_, &attrib_struct), |
| + |
| + context_.reset(GLInProcessContext::CreateContext( |
| + is_offscreen_, |
| + window_, |
| + gfx::Size(1, 1), |
| + attributes_.shareResources, |
| + preferred_extensions, |
| + attrib_struct, |
| + gpu_preference)); |
| + } |
| + |
| + if (context_) { |
| + base::Closure context_lost_callback = base::Bind( |
| + &WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost, |
| + base::Unretained(this)); |
| + context_->SetContextLostCallback(context_lost_callback); |
| + } else { |
| initialize_failed_ = true; |
| return false; |
| } |