diff options
author | tfarina <tfarina@chromium.org> | 2015-01-08 19:16:10 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-09 03:17:25 +0000 |
commit | 70da38b26b718679d02e579c8b0ea89fd38de06a (patch) | |
tree | 570c35625412b05611da291c9bc128a4d1bde305 /gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc | |
parent | 8af6efb11ac963bad4285294a0a2c7f33f0a38ad (diff) | |
download | chromium_src-70da38b26b718679d02e579c8b0ea89fd38de06a.zip chromium_src-70da38b26b718679d02e579c8b0ea89fd38de06a.tar.gz chromium_src-70da38b26b718679d02e579c8b0ea89fd38de06a.tar.bz2 |
Extract WebGraphicsContext3DInProcessCommandBufferImpl from webkit/.
This moves it into gpu/blink/ along side WebGraphicsContext3DImpl,
consolidating more this code as we are in the process of removing
webkit/ glue directory altogether. This is one more step on this way.
BUG=338338
TEST=compositor_unittests, gpu_unittests, content_unittests
R=jamesr@chromium.org,piman@chromium.org
TBR=boliu@chromium.org
Review URL: https://codereview.chromium.org/841773006
Cr-Commit-Position: refs/heads/master@{#310694}
Diffstat (limited to 'gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc')
-rw-r--r-- | gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc b/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc new file mode 100644 index 0000000..386d349 --- /dev/null +++ b/gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc @@ -0,0 +1,178 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.h" + +#include <GLES2/gl2.h> +#ifndef GL_GLEXT_PROTOTYPES +#define GL_GLEXT_PROTOTYPES 1 +#endif +#include <GLES2/gl2ext.h> +#include <GLES2/gl2extchromium.h> + +#include <string> + +#include "base/atomicops.h" +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/callback.h" +#include "base/logging.h" +#include "gpu/command_buffer/client/gles2_implementation.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gl/gl_implementation.h" + +using gpu::gles2::GLES2Implementation; +using gpu::GLInProcessContext; + +namespace gpu_blink { + +// static +scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> +WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext( + const blink::WebGraphicsContext3D::Attributes& attributes, + bool lose_context_when_out_of_memory, + gfx::AcceleratedWidget window) { + DCHECK_NE(gfx::GetGLImplementation(), gfx::kGLImplementationNone); + bool is_offscreen = false; + return make_scoped_ptr(new WebGraphicsContext3DInProcessCommandBufferImpl( + scoped_ptr< ::gpu::GLInProcessContext>(), + attributes, + lose_context_when_out_of_memory, + is_offscreen, + window)); +} + +// static +scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> +WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext( + const blink::WebGraphicsContext3D::Attributes& attributes, + bool lose_context_when_out_of_memory) { + bool is_offscreen = true; + return make_scoped_ptr(new WebGraphicsContext3DInProcessCommandBufferImpl( + scoped_ptr< ::gpu::GLInProcessContext>(), + attributes, + lose_context_when_out_of_memory, + is_offscreen, + gfx::kNullAcceleratedWidget)); +} + +scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> +WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext( + scoped_ptr< ::gpu::GLInProcessContext> context, + const blink::WebGraphicsContext3D::Attributes& attributes) { + bool lose_context_when_out_of_memory = false; // Not used. + bool is_offscreen = true; // Not used. + return make_scoped_ptr(new WebGraphicsContext3DInProcessCommandBufferImpl( + context.Pass(), + attributes, + lose_context_when_out_of_memory, + is_offscreen, + gfx::kNullAcceleratedWidget /* window. Not used. */)); +} + +WebGraphicsContext3DInProcessCommandBufferImpl:: + WebGraphicsContext3DInProcessCommandBufferImpl( + scoped_ptr< ::gpu::GLInProcessContext> context, + const blink::WebGraphicsContext3D::Attributes& attributes, + bool lose_context_when_out_of_memory, + bool is_offscreen, + gfx::AcceleratedWidget window) + : share_resources_(attributes.shareResources), + webgl_context_(attributes.webGL), + is_offscreen_(is_offscreen), + window_(window), + context_(context.Pass()) { + ConvertAttributes(attributes, &attribs_); + attribs_.lose_context_when_out_of_memory = lose_context_when_out_of_memory; +} + +WebGraphicsContext3DInProcessCommandBufferImpl:: + ~WebGraphicsContext3DInProcessCommandBufferImpl() { +} + +size_t WebGraphicsContext3DInProcessCommandBufferImpl::GetMappedMemoryLimit() { + return context_->GetMappedMemoryLimit(); +} + +bool WebGraphicsContext3DInProcessCommandBufferImpl::MaybeInitializeGL() { + if (initialized_) + return true; + + if (initialize_failed_) + return false; + + if (!context_) { + // 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; + context_.reset(GLInProcessContext::Create( + NULL, /* service */ + NULL, /* surface */ + is_offscreen_, + window_, + gfx::Size(1, 1), + NULL, /* share_context */ + share_resources_, + attribs_, + gpu_preference, + ::gpu::GLInProcessContextSharedMemoryLimits(), + nullptr, + nullptr)); + } + + 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; + } + + real_gl_ = context_->GetImplementation(); + setGLInterface(real_gl_); + + if (real_gl_ && webgl_context_) + real_gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation"); + + initialized_ = true; + return true; +} + +bool +WebGraphicsContext3DInProcessCommandBufferImpl::InitializeOnCurrentThread() { + if (!MaybeInitializeGL()) + return false; + return context_ && !isContextLost(); +} + +bool WebGraphicsContext3DInProcessCommandBufferImpl::isContextLost() { + return context_lost_reason_ != GL_NO_ERROR; +} + +WGC3Denum WebGraphicsContext3DInProcessCommandBufferImpl:: + getGraphicsResetStatusARB() { + return context_lost_reason_; +} + +::gpu::ContextSupport* +WebGraphicsContext3DInProcessCommandBufferImpl::GetContextSupport() { + return real_gl_; +} + +void WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost() { + // TODO(kbr): improve the precision here. + context_lost_reason_ = GL_UNKNOWN_CONTEXT_RESET_ARB; + if (context_lost_callback_) { + context_lost_callback_->onContextLost(); + } +} + +} // namespace gpu_blink |