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