Chromium Code Reviews| 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 42% |
| copy from ui/compositor/test/in_process_context_provider.cc |
| copy to android_webview/browser/aw_render_thread_context_provider.cc |
| index d59736ff86d2730a1cf6cb39897fe317b73bd4f4..fd76c632002a45d62057fbf8288053ad2de2a3af 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,27 +169,25 @@ 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()); |
| +void AwRenderThreadContextProvider::OnLostContext() { |
| + DCHECK(main_thread_checker_.CalledOnValidThread()); |
| { |
|
boliu
2015/04/23 12:23:41
Now the the lock is removed, this block is not ser
boliu
2015/04/23 12:24:41
Maybe 'scope' is a better word..
tfarina
2015/04/24 15:04:55
Done.
boliu
2015/04/24 15:36:54
Not what I meant. I mean just remove the braces, b
tfarina
2015/04/24 17:25:42
Done.
|
| - base::AutoLock lock(destroyed_lock_); |
| if (destroyed_) |
| return; |
| destroyed_ = true; |
| @@ -223,4 +198,4 @@ void InProcessContextProvider::OnLostContext() { |
| gr_context_->abandonContext(); |
| } |
| -} // namespace ui |
| +} // namespace android_webview |