shared_renderer_state.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org// Copyright 2014 The Chromium Authors. All rights reserved. 2179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org// Use of this source code is governed by a BSD-style license that can be 3179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org// found in the LICENSE file. 4179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 5179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org#include "android_webview/browser/shared_renderer_state.h" 6179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 7179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org#include "android_webview/browser/browser_view_renderer_client.h" 808595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org#include "base/bind.h" 9179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org#include "base/location.h" 10fbd97aa4c5325eace57d24b89845b9581bac9324jorlow@chromium.org 11fbd97aa4c5325eace57d24b89845b9581bac9324jorlow@chromium.orgnamespace android_webview { 12179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 13179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgDrawGLInput::DrawGLInput() : width(0), height(0) { 14179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 1508595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org 16179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgDrawGLInput::~DrawGLInput() { 17179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 18179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 19179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgDrawGLResult::DrawGLResult() : clip_contains_visible_rect(false) { 20179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 21179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 22179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgSharedRendererState::SharedRendererState( 23179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org scoped_refptr<base::MessageLoopProxy> ui_loop, 24179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org BrowserViewRendererClient* client) 25179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org : ui_loop_(ui_loop), 26179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org client_on_ui_(client), 27179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org weak_factory_on_ui_thread_(this), 28179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org ui_thread_weak_ptr_(weak_factory_on_ui_thread_.GetWeakPtr()), 29179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org compositor_(NULL), 30179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org memory_policy_dirty_(false), 31179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org hardware_allowed_(false), 32179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org hardware_initialized_(false), 33179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org share_context_(NULL) { 34179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org DCHECK(ui_loop_->BelongsToCurrentThread()); 35179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org DCHECK(client_on_ui_); 36179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 37179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 38179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgSharedRendererState::~SharedRendererState() {} 39179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 40179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgvoid SharedRendererState::ClientRequestDrawGL() { 41225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org if (ui_loop_->BelongsToCurrentThread()) { 42225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org ClientRequestDrawGLOnUIThread(); 43225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org } else { 44225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org ui_loop_->PostTask( 45225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org FROM_HERE, 46225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org base::Bind(&SharedRendererState::ClientRequestDrawGLOnUIThread, 47225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org ui_thread_weak_ptr_)); 48225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org } 49225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 50225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org 5108595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.orgvoid SharedRendererState::ClientRequestDrawGLOnUIThread() { 5208595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org DCHECK(ui_loop_->BelongsToCurrentThread()); 5308595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org if (!client_on_ui_->RequestDrawGL(NULL, false)) { 54179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org LOG(ERROR) << "Failed to request GL process. Deadlock likely"; 55179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org } 56179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 57225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org 5808595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.orgvoid SharedRendererState::SetCompositorOnUiThread( 5908595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org content::SynchronousCompositor* compositor) { 6008595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org base::AutoLock lock(lock_); 61179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org DCHECK(ui_loop_->BelongsToCurrentThread()); 62179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org compositor_ = compositor; 63179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 64179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 65179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgcontent::SynchronousCompositor* SharedRendererState::GetCompositor() { 66179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org base::AutoLock lock(lock_); 67179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org DCHECK(compositor_); 68225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org return compositor_; 69179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 70179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 71179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgvoid SharedRendererState::SetMemoryPolicy( 721511be6edb54b6ade2bfad94256f76bc191e92ecdgrogan@chromium.org const content::SynchronousCompositorMemoryPolicy new_policy) { 73179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org base::AutoLock lock(lock_); 74179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org if (memory_policy_ != new_policy) { 75179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org memory_policy_ = new_policy; 76179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org memory_policy_dirty_ = true; 77179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org } 78179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 79179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 80179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgcontent::SynchronousCompositorMemoryPolicy 81179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgSharedRendererState::GetMemoryPolicy() const { 82225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org base::AutoLock lock(lock_); 83225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org return memory_policy_; 84225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 85225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org 86225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.orgvoid SharedRendererState::SetDrawGLInput(scoped_ptr<DrawGLInput> input) { 87179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org base::AutoLock lock(lock_); 88225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org DCHECK(!draw_gl_input_.get()); 89225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org draw_gl_input_ = input.Pass(); 90225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 91225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org 92225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.orgscoped_ptr<DrawGLInput> SharedRendererState::PassDrawGLInput() { 93225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org base::AutoLock lock(lock_); 94225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org return draw_gl_input_.Pass(); 95225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 96225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org 97225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.orgvoid SharedRendererState::SetHardwareAllowed(bool allowed) { 98225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org base::AutoLock lock(lock_); 99225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org hardware_allowed_ = allowed; 100225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 101225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org 102225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.orgbool SharedRendererState::IsHardwareAllowed() const { 103225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org base::AutoLock lock(lock_); 104225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org return hardware_allowed_; 105225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 10608595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org 10708595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.orgvoid SharedRendererState::SetHardwareInitialized(bool initialized) { 10808595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org base::AutoLock lock(lock_); 10908595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org hardware_initialized_ = initialized; 11008595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org} 11108595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org 112179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgbool SharedRendererState::IsHardwareInitialized() const { 113179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org base::AutoLock lock(lock_); 114179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org return hardware_initialized_; 115225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 116179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 117225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.orgvoid SharedRendererState::SetSharedContext(gpu::GLInProcessContext* context) { 118225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org base::AutoLock lock(lock_); 119225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org DCHECK(!share_context_ || !context); 120179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org share_context_ = context; 121179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 12208595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org 12308595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.orggpu::GLInProcessContext* SharedRendererState::GetSharedContext() const { 12408595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org base::AutoLock lock(lock_); 125179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org DCHECK(share_context_); 126179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org return share_context_; 127179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 128179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 129179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgvoid SharedRendererState::SetMemoryPolicyDirty(bool is_dirty) { 130179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org base::AutoLock lock(lock_); 13108595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org memory_policy_dirty_ = is_dirty; 13208595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org} 13308595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org 13408595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.orgbool SharedRendererState::IsMemoryPolicyDirty() const { 13508595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org base::AutoLock lock(lock_); 13608595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org return memory_policy_dirty_; 13708595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org} 13808595b9e51ded54851b7664bd38affad63a67838dgrogan@chromium.org 139179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgvoid SharedRendererState::ReturnResources( 140179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org const cc::TransferableResourceArray& input) { 141179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org base::AutoLock lock(lock_); 142179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org cc::TransferableResource::ReturnResources(input, &returned_resources_); 143179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} 144179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 145179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgvoid SharedRendererState::InsertReturnedResources( 146225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org const cc::ReturnedResourceArray& resources) { 147225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org base::AutoLock lock(lock_); 148225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org returned_resources_.insert( 149225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org returned_resources_.end(), resources.begin(), resources.end()); 150225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 151225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org 152225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.orgvoid SharedRendererState::SwapReturnedResources( 153225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org cc::ReturnedResourceArray* resources) { 154225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org base::AutoLock lock(lock_); 155225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org resources->swap(returned_resources_); 156225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 157179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org 158179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.orgbool SharedRendererState::ReturnedResourcesEmpty() const { 159225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org base::AutoLock lock(lock_); 160225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org return returned_resources_.empty(); 161225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org} 162225a272621a5517a1a8dec8956457a121786d7c4jorlow@chromium.org 163179be588c25dccaa963df9c9c104fc6229435483jorlow@chromium.org} // namespace android_webview 1642d749ea62f0e47281e82794c8e00eb588cd66616dgrogan@chromium.org