Index: gpu/blink/webgraphicscontext3d_in_process_command_buffer_impl.cc |
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 0000000000000000000000000000000000000000..386d349aafdb4c93cdd281d1809f36d352a67463 |
--- /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 |