Index: android_webview/browser/compositor_proxy.cc |
diff --git a/android_webview/browser/shared_renderer_state.cc b/android_webview/browser/compositor_proxy.cc |
similarity index 54% |
rename from android_webview/browser/shared_renderer_state.cc |
rename to android_webview/browser/compositor_proxy.cc |
index 0de8371b1c1fcb05a3d471ad263cfd62eb267237..9cec94a4b2498e6743d41e8b626be2dc3687b2de 100644 |
--- a/android_webview/browser/shared_renderer_state.cc |
+++ b/android_webview/browser/compositor_proxy.cc |
@@ -2,9 +2,10 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "android_webview/browser/shared_renderer_state.h" |
+#include "android_webview/browser/compositor_proxy.h" |
-#include "android_webview/browser/browser_view_renderer_client.h" |
+#include "android_webview/browser/aw_gl_methods.h" |
+#include "android_webview/browser/browser_view_renderer.h" |
#include "base/bind.h" |
#include "base/lazy_instance.h" |
#include "base/location.h" |
@@ -16,31 +17,30 @@ namespace internal { |
class RequestDrawGLTracker { |
public: |
RequestDrawGLTracker(); |
- bool ShouldRequestOnNoneUiThread(SharedRendererState* state); |
- bool ShouldRequestOnUiThread(SharedRendererState* state); |
+ bool ShouldRequestOnNonUiThread(CompositorProxy* proxy); |
+ bool ShouldRequestOnUiThread(CompositorProxy* proxy); |
void DidRequestOnUiThread(); |
void ResetPending(); |
private: |
base::Lock lock_; |
- SharedRendererState* pending_ui_; |
- SharedRendererState* pending_non_ui_; |
+ CompositorProxy* pending_ui_; |
+ CompositorProxy* pending_non_ui_; |
}; |
RequestDrawGLTracker::RequestDrawGLTracker() |
: pending_ui_(NULL), pending_non_ui_(NULL) { |
} |
-bool RequestDrawGLTracker::ShouldRequestOnNoneUiThread( |
- SharedRendererState* state) { |
+bool RequestDrawGLTracker::ShouldRequestOnNonUiThread(CompositorProxy* proxy) { |
base::AutoLock lock(lock_); |
if (pending_ui_ || pending_non_ui_) |
return false; |
- pending_non_ui_ = state; |
+ pending_non_ui_ = proxy; |
return true; |
} |
-bool RequestDrawGLTracker::ShouldRequestOnUiThread(SharedRendererState* state) { |
+bool RequestDrawGLTracker::ShouldRequestOnUiThread(CompositorProxy* proxy) { |
base::AutoLock lock(lock_); |
if (pending_non_ui_) { |
pending_non_ui_->ResetRequestDrawGLCallback(); |
@@ -48,7 +48,7 @@ bool RequestDrawGLTracker::ShouldRequestOnUiThread(SharedRendererState* state) { |
} |
if (pending_ui_) |
return false; |
- pending_ui_ = state; |
+ pending_ui_ = proxy; |
return true; |
} |
@@ -64,35 +64,33 @@ namespace { |
base::LazyInstance<internal::RequestDrawGLTracker> g_request_draw_gl_tracker = |
LAZY_INSTANCE_INITIALIZER; |
- |
} |
-SharedRendererState::SharedRendererState( |
- scoped_refptr<base::MessageLoopProxy> ui_loop, |
- BrowserViewRendererClient* client) |
+CompositorProxy::CompositorProxy(scoped_refptr<base::MessageLoopProxy> ui_loop, |
+ AwGLMethods* gl_methods) |
: ui_loop_(ui_loop), |
- client_on_ui_(client), |
+ gl_methods_on_ui_(gl_methods), |
force_commit_(false), |
inside_hardware_release_(false), |
needs_force_invalidate_on_next_draw_gl_(false), |
weak_factory_on_ui_thread_(this) { |
DCHECK(ui_loop_->BelongsToCurrentThread()); |
- DCHECK(client_on_ui_); |
+ DCHECK(gl_methods_on_ui_); |
ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); |
ResetRequestDrawGLCallback(); |
} |
-SharedRendererState::~SharedRendererState() { |
+CompositorProxy::~CompositorProxy() { |
DCHECK(ui_loop_->BelongsToCurrentThread()); |
} |
-void SharedRendererState::ClientRequestDrawGL() { |
+void CompositorProxy::ClientRequestDrawGL() { |
if (ui_loop_->BelongsToCurrentThread()) { |
if (!g_request_draw_gl_tracker.Get().ShouldRequestOnUiThread(this)) |
return; |
ClientRequestDrawGLOnUIThread(); |
} else { |
- if (!g_request_draw_gl_tracker.Get().ShouldRequestOnNoneUiThread(this)) |
+ if (!g_request_draw_gl_tracker.Get().ShouldRequestOnNonUiThread(this)) |
return; |
base::Closure callback; |
{ |
@@ -103,67 +101,67 @@ void SharedRendererState::ClientRequestDrawGL() { |
} |
} |
-void SharedRendererState::DidDrawGLProcess() { |
+void CompositorProxy::DidDrawGLProcess() { |
g_request_draw_gl_tracker.Get().ResetPending(); |
} |
-void SharedRendererState::ResetRequestDrawGLCallback() { |
+void CompositorProxy::ResetRequestDrawGLCallback() { |
DCHECK(ui_loop_->BelongsToCurrentThread()); |
base::AutoLock lock(lock_); |
- request_draw_gl_cancelable_closure_.Reset( |
- base::Bind(&SharedRendererState::ClientRequestDrawGLOnUIThread, |
- base::Unretained(this))); |
+ request_draw_gl_cancelable_closure_.Reset(base::Bind( |
+ &CompositorProxy::ClientRequestDrawGLOnUIThread, base::Unretained(this))); |
request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback(); |
} |
-void SharedRendererState::ClientRequestDrawGLOnUIThread() { |
+void CompositorProxy::ClientRequestDrawGLOnUIThread() { |
DCHECK(ui_loop_->BelongsToCurrentThread()); |
ResetRequestDrawGLCallback(); |
- if (!client_on_ui_->RequestDrawGL(NULL, false)) { |
+ if (!gl_methods_on_ui_->RequestDrawGL(NULL, false)) { |
g_request_draw_gl_tracker.Get().ResetPending(); |
LOG(ERROR) << "Failed to request GL process. Deadlock likely"; |
} |
} |
-void SharedRendererState::UpdateParentDrawConstraintsOnUIThread() { |
+void CompositorProxy::SetParentDrawConstraintsOnUIThread() { |
DCHECK(ui_loop_->BelongsToCurrentThread()); |
- client_on_ui_->UpdateParentDrawConstraints(); |
+ browser_view_renderer_->SetParentDrawConstraints(); |
} |
-void SharedRendererState::SetScrollOffset(gfx::Vector2d scroll_offset) { |
+void CompositorProxy::SetScrollOffset(gfx::Vector2d scroll_offset) { |
base::AutoLock lock(lock_); |
scroll_offset_ = scroll_offset; |
} |
-gfx::Vector2d SharedRendererState::GetScrollOffset() { |
+gfx::Vector2d CompositorProxy::GetScrollOffset() { |
base::AutoLock lock(lock_); |
return scroll_offset_; |
} |
-bool SharedRendererState::HasCompositorFrame() const { |
+bool CompositorProxy::HasCompositorFrame() const { |
base::AutoLock lock(lock_); |
return compositor_frame_.get(); |
} |
-void SharedRendererState::SetCompositorFrame( |
- scoped_ptr<cc::CompositorFrame> frame, bool force_commit) { |
+void CompositorProxy::SetCompositorFrame(scoped_ptr<cc::CompositorFrame> frame, |
+ bool force_commit) { |
+ ReturnUnusedResources(); |
+ |
base::AutoLock lock(lock_); |
- DCHECK(!compositor_frame_.get()); |
compositor_frame_ = frame.Pass(); |
force_commit_ = force_commit; |
} |
-scoped_ptr<cc::CompositorFrame> SharedRendererState::PassCompositorFrame() { |
+scoped_ptr<cc::CompositorFrame> CompositorProxy::PassCompositorFrame() { |
base::AutoLock lock(lock_); |
return compositor_frame_.Pass(); |
} |
-bool SharedRendererState::ForceCommit() const { |
+bool CompositorProxy::ForceCommit() const { |
base::AutoLock lock(lock_); |
return force_commit_; |
} |
-bool SharedRendererState::UpdateDrawConstraints( |
+bool CompositorProxy::SetParentCompositorDrawConstraints( |
const ParentCompositorDrawConstraints& parent_draw_constraints) { |
base::AutoLock lock(lock_); |
if (needs_force_invalidate_on_next_draw_gl_ || |
@@ -175,85 +173,97 @@ bool SharedRendererState::UpdateDrawConstraints( |
return false; |
} |
-void SharedRendererState::PostExternalDrawConstraintsToChildCompositor( |
+void CompositorProxy::PostExternalDrawConstraintsToChildCompositor( |
const ParentCompositorDrawConstraints& parent_draw_constraints) { |
- if (UpdateDrawConstraints(parent_draw_constraints)) { |
+ if (SetParentCompositorDrawConstraints(parent_draw_constraints)) { |
// No need to hold the lock_ during the post task. |
ui_loop_->PostTask( |
FROM_HERE, |
- base::Bind(&SharedRendererState::UpdateParentDrawConstraintsOnUIThread, |
+ base::Bind(&CompositorProxy::SetParentDrawConstraintsOnUIThread, |
ui_thread_weak_ptr_)); |
} |
} |
-void SharedRendererState::DidSkipCommitFrame() { |
- ui_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&SharedRendererState::DidSkipCommitFrameOnUIThread, |
- ui_thread_weak_ptr_)); |
+void CompositorProxy::DidSkipCommitFrame() { |
+ ui_loop_->PostTask(FROM_HERE, |
+ base::Bind(&CompositorProxy::DidSkipCommitFrameOnUIThread, |
+ ui_thread_weak_ptr_)); |
} |
-void SharedRendererState::DidSkipCommitFrameOnUIThread() { |
+void CompositorProxy::DidSkipCommitFrameOnUIThread() { |
DCHECK(ui_loop_->BelongsToCurrentThread()); |
- client_on_ui_->DidSkipCommitFrame(); |
+ DCHECK(browser_view_renderer_); |
+ browser_view_renderer_->DidSkipCommitFrame(); |
} |
const ParentCompositorDrawConstraints |
-SharedRendererState::ParentDrawConstraints() const { |
+CompositorProxy::GetParentDrawConstraints() const { |
base::AutoLock lock(lock_); |
return parent_draw_constraints_; |
} |
-void SharedRendererState::SetForceInvalidateOnNextDrawGL( |
+void CompositorProxy::SetForceInvalidateOnNextDrawGL( |
bool needs_force_invalidate_on_next_draw_gl) { |
base::AutoLock lock(lock_); |
needs_force_invalidate_on_next_draw_gl_ = |
needs_force_invalidate_on_next_draw_gl; |
} |
-bool SharedRendererState::NeedsForceInvalidateOnNextDrawGL() const { |
+bool CompositorProxy::NeedsForceInvalidateOnNextDrawGL() const { |
base::AutoLock lock(lock_); |
return needs_force_invalidate_on_next_draw_gl_; |
} |
-void SharedRendererState::SetInsideHardwareRelease(bool inside) { |
+void CompositorProxy::SetInsideHardwareRelease(bool inside) { |
base::AutoLock lock(lock_); |
inside_hardware_release_ = inside; |
} |
-bool SharedRendererState::IsInsideHardwareRelease() const { |
+void CompositorProxy::ReturnUnusedResources() { |
+ DCHECK(ui_loop_->BelongsToCurrentThread()); |
+ |
+ if (scoped_ptr<cc::CompositorFrame> frame = PassCompositorFrame()) { |
+ cc::ReturnedResourceArray resources; |
+ cc::TransferableResource::ReturnResources( |
+ frame->delegated_frame_data->resource_list, &resources); |
+ InsertReturnedResources(resources); |
+ } |
+} |
+ |
+bool CompositorProxy::IsInsideHardwareRelease() const { |
base::AutoLock lock(lock_); |
return inside_hardware_release_; |
} |
-void SharedRendererState::InsertReturnedResources( |
+void CompositorProxy::InsertReturnedResources( |
const cc::ReturnedResourceArray& resources) { |
base::AutoLock lock(lock_); |
returned_resources_.insert( |
returned_resources_.end(), resources.begin(), resources.end()); |
} |
-void SharedRendererState::SwapReturnedResources( |
+void CompositorProxy::SwapReturnedResources( |
cc::ReturnedResourceArray* resources) { |
DCHECK(resources->empty()); |
base::AutoLock lock(lock_); |
resources->swap(returned_resources_); |
} |
-bool SharedRendererState::ReturnedResourcesEmpty() const { |
+void CompositorProxy::SetBrowserViewRenderer( |
+ BrowserViewRenderer* browser_view_renderer) { |
base::AutoLock lock(lock_); |
- return returned_resources_.empty(); |
+ browser_view_renderer_ = browser_view_renderer; |
} |
InsideHardwareReleaseReset::InsideHardwareReleaseReset( |
- SharedRendererState* shared_renderer_state) |
- : shared_renderer_state_(shared_renderer_state) { |
- DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); |
- shared_renderer_state_->SetInsideHardwareRelease(true); |
+ CompositorProxy* compositor_proxy) |
+ : compositor_proxy_(compositor_proxy) { |
+ DCHECK(!compositor_proxy_->IsInsideHardwareRelease()); |
+ compositor_proxy_->SetInsideHardwareRelease(true); |
} |
InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { |
- shared_renderer_state_->SetInsideHardwareRelease(false); |
+ compositor_proxy_->SetInsideHardwareRelease(false); |
} |
} // namespace android_webview |