Index: android_webview/browser/aw_render_thread_context_provider.cc |
diff --git a/ui/compositor/test/in_process_context_provider.cc b/android_webview/browser/aw_render_thread_context_provider.cc |
similarity index 41% |
copy from ui/compositor/test/in_process_context_provider.cc |
copy to android_webview/browser/aw_render_thread_context_provider.cc |
index d59736ff86d2730a1cf6cb39897fe317b73bd4f4..ce3114829e9fb11b16d29d98b62c25fd89bde164 100644 |
--- a/ui/compositor/test/in_process_context_provider.cc |
+++ b/android_webview/browser/aw_render_thread_context_provider.cc |
@@ -1,15 +1,15 @@ |
-// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Copyright 2015 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 "ui/compositor/test/in_process_context_provider.h" |
+#include "android_webview/browser/aw_render_thread_context_provider.h" |
#include "base/bind.h" |
#include "base/callback_helpers.h" |
#include "base/lazy_instance.h" |
-#include "base/strings/stringprintf.h" |
#include "base/trace_event/trace_event.h" |
#include "cc/output/managed_memory_policy.h" |
+#include "gpu/blink/webgraphicscontext3d_impl.h" |
#include "gpu/command_buffer/client/gl_in_process_context.h" |
#include "gpu/command_buffer/client/gles2_implementation.h" |
#include "gpu/command_buffer/client/gles2_lib.h" |
@@ -17,7 +17,7 @@ |
#include "third_party/skia/include/gpu/GrContext.h" |
#include "third_party/skia/include/gpu/gl/GrGLInterface.h" |
-namespace ui { |
+namespace android_webview { |
namespace { |
@@ -38,113 +38,90 @@ base::LazyInstance<GLES2Initializer> g_gles2_initializer = |
} // namespace |
// static |
-scoped_refptr<InProcessContextProvider> InProcessContextProvider::Create( |
- const gpu::gles2::ContextCreationAttribHelper& attribs, |
- bool lose_context_when_out_of_memory, |
- gfx::AcceleratedWidget window, |
- const std::string& debug_name) { |
- return new InProcessContextProvider( |
- attribs, lose_context_when_out_of_memory, window, debug_name); |
+scoped_refptr<AwRenderThreadContextProvider> |
+AwRenderThreadContextProvider::Create( |
+ scoped_refptr<gfx::GLSurface> surface, |
+ scoped_refptr<gpu::InProcessCommandBuffer::Service> service) { |
+ return new AwRenderThreadContextProvider(surface, service); |
} |
-// static |
-scoped_refptr<InProcessContextProvider> |
-InProcessContextProvider::CreateOffscreen( |
- bool lose_context_when_out_of_memory) { |
- gpu::gles2::ContextCreationAttribHelper attribs; |
- attribs.alpha_size = 8; |
- attribs.blue_size = 8; |
- attribs.green_size = 8; |
- attribs.red_size = 8; |
- attribs.depth_size = 0; |
- attribs.stencil_size = 8; |
- attribs.samples = 0; |
- attribs.sample_buffers = 0; |
- attribs.fail_if_major_perf_caveat = false; |
- attribs.bind_generates_resource = false; |
- return new InProcessContextProvider( |
- attribs, lose_context_when_out_of_memory, gfx::kNullAcceleratedWidget, |
- "Offscreen"); |
-} |
- |
-InProcessContextProvider::InProcessContextProvider( |
- const gpu::gles2::ContextCreationAttribHelper& attribs, |
- bool lose_context_when_out_of_memory, |
- gfx::AcceleratedWidget window, |
- const std::string& debug_name) |
- : attribs_(attribs), |
- lose_context_when_out_of_memory_(lose_context_when_out_of_memory), |
- window_(window), |
- debug_name_(debug_name), |
- destroyed_(false) { |
+AwRenderThreadContextProvider::AwRenderThreadContextProvider( |
+ scoped_refptr<gfx::GLSurface> surface, |
+ scoped_refptr<gpu::InProcessCommandBuffer::Service> service) |
+ : destroyed_(false) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
- context_thread_checker_.DetachFromThread(); |
+ |
+ blink::WebGraphicsContext3D::Attributes attributes; |
+ attributes.antialias = false; |
+ attributes.depth = false; |
+ attributes.stencil = false; |
+ attributes.shareResources = true; |
+ attributes.noAutomaticFlushes = true; |
+ gpu::gles2::ContextCreationAttribHelper attribs_for_gles2; |
+ gpu_blink::WebGraphicsContext3DImpl::ConvertAttributes(attributes, |
+ &attribs_for_gles2); |
+ attribs_for_gles2.lose_context_when_out_of_memory = true; |
+ |
+ context_.reset(gpu::GLInProcessContext::Create( |
+ service, |
+ surface, |
+ surface->IsOffscreen(), |
+ gfx::kNullAcceleratedWidget, |
+ surface->GetSize(), |
+ NULL /* share_context */, |
+ false /* share_resources */, |
+ attribs_for_gles2, |
+ gfx::PreferDiscreteGpu, |
+ gpu::GLInProcessContextSharedMemoryLimits(), |
+ nullptr, |
+ nullptr)); |
+ |
+ context_->SetContextLostCallback(base::Bind( |
+ &AwRenderThreadContextProvider::OnLostContext, base::Unretained(this))); |
+ |
+ capabilities_.gpu = context_->GetImplementation()->capabilities(); |
} |
-InProcessContextProvider::~InProcessContextProvider() { |
- DCHECK(main_thread_checker_.CalledOnValidThread() || |
- context_thread_checker_.CalledOnValidThread()); |
+AwRenderThreadContextProvider::~AwRenderThreadContextProvider() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
} |
-bool InProcessContextProvider::BindToCurrentThread() { |
+bool AwRenderThreadContextProvider::BindToCurrentThread() { |
// This is called on the thread the context will be used. |
- DCHECK(context_thread_checker_.CalledOnValidThread()); |
- |
- if (!context_) { |
- gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu; |
- context_.reset(gpu::GLInProcessContext::Create( |
- nullptr, /* service */ |
- nullptr, /* surface */ |
- !window_, /* is_offscreen */ |
- window_, gfx::Size(1, 1), nullptr, /* share_context */ |
- true, /* share_resources */ |
- attribs_, gpu_preference, gpu::GLInProcessContextSharedMemoryLimits(), |
- nullptr, nullptr)); |
- |
- if (!context_) |
- return false; |
- |
- context_->SetContextLostCallback(base::Bind( |
- &InProcessContextProvider::OnLostContext, base::Unretained(this))); |
- } |
- |
- capabilities_.gpu = context_->GetImplementation()->capabilities(); |
- |
- std::string unique_context_name = |
- base::StringPrintf("%s-%p", debug_name_.c_str(), context_.get()); |
- context_->GetImplementation()->TraceBeginCHROMIUM( |
- "gpu_toplevel", unique_context_name.c_str()); |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
return true; |
} |
cc::ContextProvider::Capabilities |
-InProcessContextProvider::ContextCapabilities() { |
- DCHECK(context_thread_checker_.CalledOnValidThread()); |
+AwRenderThreadContextProvider::ContextCapabilities() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
+ |
return capabilities_; |
} |
-gpu::gles2::GLES2Interface* InProcessContextProvider::ContextGL() { |
- DCHECK(context_thread_checker_.CalledOnValidThread()); |
+gpu::gles2::GLES2Interface* AwRenderThreadContextProvider::ContextGL() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
return context_->GetImplementation(); |
} |
-gpu::ContextSupport* InProcessContextProvider::ContextSupport() { |
- DCHECK(context_thread_checker_.CalledOnValidThread()); |
+gpu::ContextSupport* AwRenderThreadContextProvider::ContextSupport() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
return context_->GetImplementation(); |
} |
static void BindGrContextCallback(const GrGLInterface* interface) { |
cc::ContextProvider* context_provider = |
- reinterpret_cast<InProcessContextProvider*>(interface->fCallbackData); |
+ reinterpret_cast<AwRenderThreadContextProvider*>( |
+ interface->fCallbackData); |
gles2::SetGLContext(context_provider->ContextGL()); |
} |
-class GrContext* InProcessContextProvider::GrContext() { |
- DCHECK(context_thread_checker_.CalledOnValidThread()); |
+class GrContext* AwRenderThreadContextProvider::GrContext() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
if (gr_context_) |
return gr_context_.get(); |
@@ -165,25 +142,25 @@ class GrContext* InProcessContextProvider::GrContext() { |
return gr_context_.get(); |
} |
-void InProcessContextProvider::SetupLock() { |
+void AwRenderThreadContextProvider::SetupLock() { |
+ context_->SetLock(&context_lock_); |
} |
-base::Lock* InProcessContextProvider::GetLock() { |
+base::Lock* AwRenderThreadContextProvider::GetLock() { |
return &context_lock_; |
} |
-bool InProcessContextProvider::IsContextLost() { |
- DCHECK(context_thread_checker_.CalledOnValidThread()); |
+bool AwRenderThreadContextProvider::IsContextLost() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
- base::AutoLock lock(destroyed_lock_); |
return destroyed_; |
} |
-void InProcessContextProvider::VerifyContexts() { |
+void AwRenderThreadContextProvider::VerifyContexts() { |
} |
-void InProcessContextProvider::DeleteCachedResources() { |
- DCHECK(context_thread_checker_.CalledOnValidThread()); |
+void AwRenderThreadContextProvider::DeleteCachedResources() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
if (gr_context_) { |
TRACE_EVENT_INSTANT0("gpu", "GrContext::freeGpuResources", |
@@ -192,35 +169,33 @@ void InProcessContextProvider::DeleteCachedResources() { |
} |
} |
-bool InProcessContextProvider::DestroyedOnMainThread() { |
+bool AwRenderThreadContextProvider::DestroyedOnMainThread() { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
- base::AutoLock lock(destroyed_lock_); |
return destroyed_; |
} |
-void InProcessContextProvider::SetLostContextCallback( |
+void AwRenderThreadContextProvider::SetLostContextCallback( |
const LostContextCallback& lost_context_callback) { |
lost_context_callback_ = lost_context_callback; |
} |
-void InProcessContextProvider::SetMemoryPolicyChangedCallback( |
+void AwRenderThreadContextProvider::SetMemoryPolicyChangedCallback( |
const MemoryPolicyChangedCallback& memory_policy_changed_callback) { |
// There's no memory manager for the in-process implementation. |
} |
-void InProcessContextProvider::OnLostContext() { |
- DCHECK(context_thread_checker_.CalledOnValidThread()); |
- { |
- base::AutoLock lock(destroyed_lock_); |
- if (destroyed_) |
- return; |
- destroyed_ = true; |
- } |
+void AwRenderThreadContextProvider::OnLostContext() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
+ |
+ if (destroyed_) |
+ return; |
+ destroyed_ = true; |
+ |
if (!lost_context_callback_.is_null()) |
base::ResetAndReturn(&lost_context_callback_).Run(); |
if (gr_context_) |
gr_context_->abandonContext(); |
} |
-} // namespace ui |
+} // namespace android_webview |