| Index: android_webview/browser/browser_view_renderer.cc
|
| diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc
|
| index 3c1ceb42be1d1764d60340660eea313ab09ef9aa..3d952df1dedc687aebef9f5821b63a168bd4ad03 100644
|
| --- a/android_webview/browser/browser_view_renderer.cc
|
| +++ b/android_webview/browser/browser_view_renderer.cc
|
| @@ -6,7 +6,6 @@
|
|
|
| #include "android_webview/browser/browser_view_renderer_client.h"
|
| #include "android_webview/browser/shared_renderer_state.h"
|
| -#include "android_webview/common/aw_switches.h"
|
| #include "android_webview/public/browser/draw_gl.h"
|
| #include "base/android/jni_android.h"
|
| #include "base/auto_reset.h"
|
| @@ -17,7 +16,6 @@
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "cc/output/compositor_frame.h"
|
| -#include "content/public/browser/android/synchronous_compositor.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/common/content_switches.h"
|
| @@ -51,31 +49,6 @@ const size_t kTileAllocationStep = 20;
|
| // See AwMainDelegate::BasicStartupComplete.
|
| size_t g_tile_area;
|
|
|
| -class AutoResetWithLock {
|
| - public:
|
| - AutoResetWithLock(gfx::Vector2dF* scoped_variable,
|
| - gfx::Vector2dF new_value,
|
| - base::Lock& lock)
|
| - : scoped_variable_(scoped_variable),
|
| - original_value_(*scoped_variable),
|
| - lock_(lock) {
|
| - base::AutoLock auto_lock(lock_);
|
| - *scoped_variable_ = new_value;
|
| - }
|
| -
|
| - ~AutoResetWithLock() {
|
| - base::AutoLock auto_lock(lock_);
|
| - *scoped_variable_ = original_value_;
|
| - }
|
| -
|
| - private:
|
| - gfx::Vector2dF* scoped_variable_;
|
| - gfx::Vector2dF original_value_;
|
| - base::Lock& lock_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AutoResetWithLock);
|
| -};
|
| -
|
| class TracedValue : public base::debug::ConvertableToTraceFormat {
|
| public:
|
| explicit TracedValue(base::Value* value) : value_(value) {}
|
| @@ -126,7 +99,7 @@ BrowserViewRenderer::BrowserViewRenderer(
|
| weak_factory_on_ui_thread_(this),
|
| ui_thread_weak_ptr_(weak_factory_on_ui_thread_.GetWeakPtr()),
|
| ui_task_runner_(ui_task_runner),
|
| - has_compositor_(false),
|
| + compositor_(NULL),
|
| is_paused_(false),
|
| view_visible_(false),
|
| window_visible_(false),
|
| @@ -145,8 +118,8 @@ BrowserViewRenderer::BrowserViewRenderer(
|
| CHECK(web_contents_);
|
| content::SynchronousCompositor::SetClientForWebContents(web_contents_, this);
|
|
|
| - // Currently the logic in this class relies on |has_compositor_| remaining
|
| - // false until the DidInitializeCompositor() call, hence it is not set here.
|
| + // Currently the logic in this class relies on |compositor_| remaining
|
| + // NULL until the DidInitializeCompositor() call, hence it is not set here.
|
| }
|
|
|
| BrowserViewRenderer::~BrowserViewRenderer() {
|
| @@ -179,7 +152,7 @@ void BrowserViewRenderer::TrimMemory(const int level, const bool visible) {
|
| // Just set the memory limit to 0 and drop all tiles. This will be reset to
|
| // normal levels in the next DrawGL call.
|
| SynchronousCompositorMemoryPolicy zero_policy;
|
| - if (shared_renderer_state_->GetMemoryPolicy() == zero_policy)
|
| + if (memory_policy_ == zero_policy)
|
| return;
|
|
|
| TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory");
|
| @@ -225,24 +198,21 @@ void BrowserViewRenderer::SetNumTiles(size_t num_tiles,
|
| return;
|
| num_tiles_ = num_tiles;
|
|
|
| - SynchronousCompositorMemoryPolicy new_policy;
|
| - new_policy.num_resources_limit = num_tiles_;
|
| - new_policy.bytes_limit = num_bytes_;
|
| - shared_renderer_state_->SetMemoryPolicy(new_policy);
|
| + memory_policy_.num_resources_limit = num_tiles_;
|
| + memory_policy_.bytes_limit = num_bytes_;
|
|
|
| if (effective_immediately)
|
| - EnforceMemoryPolicyImmediately(new_policy);
|
| + EnforceMemoryPolicyImmediately(memory_policy_);
|
| }
|
|
|
| void BrowserViewRenderer::EnforceMemoryPolicyImmediately(
|
| SynchronousCompositorMemoryPolicy new_policy) {
|
| - shared_renderer_state_->GetCompositor()->SetMemoryPolicy(new_policy);
|
| + compositor_->SetMemoryPolicy(new_policy);
|
| ForceFakeCompositeSW();
|
| - shared_renderer_state_->SetMemoryPolicyDirty(false);
|
| }
|
|
|
| size_t BrowserViewRenderer::GetNumTiles() const {
|
| - return shared_renderer_state_->GetMemoryPolicy().num_resources_limit;
|
| + return memory_policy_.num_resources_limit;
|
| }
|
|
|
| bool BrowserViewRenderer::OnDraw(jobject java_canvas,
|
| @@ -256,57 +226,20 @@ bool BrowserViewRenderer::OnDraw(jobject java_canvas,
|
| if (clear_view_)
|
| return false;
|
|
|
| - if (is_hardware_canvas && attached_to_window_) {
|
| - if (switches::UbercompEnabled()) {
|
| - return OnDrawHardware(java_canvas);
|
| - } else {
|
| - return OnDrawHardwareLegacy(java_canvas);
|
| - }
|
| - }
|
| + if (is_hardware_canvas && attached_to_window_)
|
| + return OnDrawHardware(java_canvas);
|
| // Perform a software draw
|
| return DrawSWInternal(java_canvas, clip);
|
| }
|
|
|
| -bool BrowserViewRenderer::OnDrawHardwareLegacy(jobject java_canvas) {
|
| - scoped_ptr<DrawGLInput> draw_gl_input(new DrawGLInput);
|
| - draw_gl_input->scroll_offset = last_on_draw_scroll_offset_;
|
| - draw_gl_input->global_visible_rect = last_on_draw_global_visible_rect_;
|
| - draw_gl_input->width = width_;
|
| - draw_gl_input->height = height_;
|
| -
|
| - SynchronousCompositorMemoryPolicy old_policy =
|
| - shared_renderer_state_->GetMemoryPolicy();
|
| - SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy();
|
| - RequestMemoryPolicy(new_policy);
|
| - // We should be performing a hardware draw here. If we don't have the
|
| - // compositor yet or if RequestDrawGL fails, it means we failed this draw
|
| - // and thus return false here to clear to background color for this draw.
|
| - bool did_draw_gl =
|
| - has_compositor_ && client_->RequestDrawGL(java_canvas, false);
|
| - if (did_draw_gl) {
|
| - GlobalTileManager::GetInstance()->DidUse(tile_manager_key_);
|
| - shared_renderer_state_->SetDrawGLInput(draw_gl_input.Pass());
|
| - } else {
|
| - RequestMemoryPolicy(old_policy);
|
| - }
|
| -
|
| - return did_draw_gl;
|
| -}
|
| -
|
| -void BrowserViewRenderer::DidDrawGL(scoped_ptr<DrawGLResult> result) {
|
| - DidComposite(!result->clip_contains_visible_rect);
|
| -}
|
| -
|
| bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) {
|
| - if (!has_compositor_)
|
| + if (!compositor_)
|
| return false;
|
|
|
| if (!hardware_enabled_) {
|
| - hardware_enabled_ =
|
| - shared_renderer_state_->GetCompositor()->InitializeHwDraw(NULL);
|
| + hardware_enabled_ = compositor_->InitializeHwDraw();
|
| if (hardware_enabled_) {
|
| - gpu::GLInProcessContext* share_context =
|
| - shared_renderer_state_->GetCompositor()->GetShareContext();
|
| + gpu::GLInProcessContext* share_context = compositor_->GetShareContext();
|
| DCHECK(share_context);
|
| shared_renderer_state_->SetSharedContext(share_context);
|
| }
|
| @@ -317,12 +250,10 @@ bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) {
|
| ReturnResources();
|
| SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy();
|
| RequestMemoryPolicy(new_policy);
|
| - shared_renderer_state_->GetCompositor()->SetMemoryPolicy(
|
| - shared_renderer_state_->GetMemoryPolicy());
|
| + compositor_->SetMemoryPolicy(memory_policy_);
|
|
|
| scoped_ptr<DrawGLInput> draw_gl_input(new DrawGLInput);
|
| draw_gl_input->scroll_offset = last_on_draw_scroll_offset_;
|
| - draw_gl_input->global_visible_rect = last_on_draw_global_visible_rect_;
|
| draw_gl_input->width = width_;
|
| draw_gl_input->height = height_;
|
|
|
| @@ -332,10 +263,8 @@ bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) {
|
| // TODO(boliu): Should really be |last_on_draw_global_visible_rect_|.
|
| // See crbug.com/372073.
|
| gfx::Rect clip = viewport;
|
| - bool stencil_enabled = false;
|
| - scoped_ptr<cc::CompositorFrame> frame =
|
| - shared_renderer_state_->GetCompositor()->DemandDrawHw(
|
| - surface_size, transform, viewport, clip, stencil_enabled);
|
| + scoped_ptr<cc::CompositorFrame> frame = compositor_->DemandDrawHw(
|
| + surface_size, transform, viewport, clip);
|
| if (!frame.get())
|
| return false;
|
|
|
| @@ -349,7 +278,7 @@ bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) {
|
| }
|
| shared_renderer_state_->SetDrawGLInput(draw_gl_input.Pass());
|
|
|
| - DidComposite(false);
|
| + DidComposite();
|
| bool did_request = client_->RequestDrawGL(java_canvas, false);
|
| if (did_request)
|
| return true;
|
| @@ -358,13 +287,12 @@ bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) {
|
| return false;
|
| }
|
|
|
| -void BrowserViewRenderer::DidDrawDelegated(scoped_ptr<DrawGLResult> result) {
|
| +void BrowserViewRenderer::DidDrawDelegated() {
|
| if (!ui_task_runner_->BelongsToCurrentThread()) {
|
| // TODO(boliu): This should be a cancelable callback.
|
| ui_task_runner_->PostTask(FROM_HERE,
|
| base::Bind(&BrowserViewRenderer::DidDrawDelegated,
|
| - ui_thread_weak_ptr_,
|
| - base::Passed(&result)));
|
| + ui_thread_weak_ptr_));
|
| return;
|
| }
|
| ReturnResources();
|
| @@ -374,7 +302,7 @@ void BrowserViewRenderer::ReturnResources() {
|
| cc::CompositorFrameAck frame_ack;
|
| shared_renderer_state_->SwapReturnedResources(&frame_ack.resources);
|
| if (!frame_ack.resources.empty()) {
|
| - shared_renderer_state_->GetCompositor()->ReturnResources(frame_ack);
|
| + compositor_->ReturnResources(frame_ack);
|
| }
|
| }
|
|
|
| @@ -386,7 +314,7 @@ bool BrowserViewRenderer::DrawSWInternal(jobject java_canvas,
|
| return true;
|
| }
|
|
|
| - if (!has_compositor_) {
|
| + if (!compositor_) {
|
| TRACE_EVENT_INSTANT0(
|
| "android_webview", "EarlyOut_NoCompositor", TRACE_EVENT_SCOPE_THREAD);
|
| return false;
|
| @@ -412,12 +340,12 @@ skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width,
|
|
|
| // Reset scroll back to the origin, will go back to the old
|
| // value when scroll_reset is out of scope.
|
| - AutoResetWithLock scroll_reset(
|
| - &scroll_offset_dip_, gfx::Vector2dF(), render_thread_lock_);
|
| + base::AutoReset<gfx::Vector2dF> scroll_reset(&scroll_offset_dip_,
|
| + gfx::Vector2dF());
|
|
|
| SkPictureRecorder recorder;
|
| SkCanvas* rec_canvas = recorder.beginRecording(width, height, NULL, 0);
|
| - if (has_compositor_)
|
| + if (compositor_)
|
| CompositeSW(rec_canvas);
|
| return skia::AdoptRef(recorder.endRecording());
|
| }
|
| @@ -504,8 +432,7 @@ void BrowserViewRenderer::OnDetachedFromWindow() {
|
| ReturnResources();
|
| DCHECK(shared_renderer_state_->ReturnedResourcesEmpty());
|
|
|
| - if (switches::UbercompEnabled())
|
| - shared_renderer_state_->GetCompositor()->ReleaseHwDraw();
|
| + compositor_->ReleaseHwDraw();
|
| shared_renderer_state_->SetSharedContext(NULL);
|
| hardware_enabled_ = false;
|
| }
|
| @@ -535,36 +462,31 @@ void BrowserViewRenderer::DidInitializeCompositor(
|
| TRACE_EVENT0("android_webview",
|
| "BrowserViewRenderer::DidInitializeCompositor");
|
| DCHECK(compositor);
|
| - DCHECK(!has_compositor_);
|
| + DCHECK(!compositor_);
|
| DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| - has_compositor_ = true;
|
| - shared_renderer_state_->SetCompositorOnUiThread(compositor);
|
| + compositor_ = compositor;
|
| }
|
|
|
| void BrowserViewRenderer::DidDestroyCompositor(
|
| content::SynchronousCompositor* compositor) {
|
| TRACE_EVENT0("android_webview", "BrowserViewRenderer::DidDestroyCompositor");
|
| - DCHECK(has_compositor_);
|
| + DCHECK(compositor_);
|
| DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| - has_compositor_ = false;
|
| - shared_renderer_state_->SetCompositorOnUiThread(NULL);
|
| + compositor_ = NULL;
|
| SynchronousCompositorMemoryPolicy zero_policy;
|
| - DCHECK(shared_renderer_state_->GetMemoryPolicy() == zero_policy);
|
| + DCHECK(memory_policy_ == zero_policy);
|
| }
|
|
|
| void BrowserViewRenderer::SetContinuousInvalidate(bool invalidate) {
|
| - {
|
| - base::AutoLock lock(render_thread_lock_);
|
| - if (compositor_needs_continuous_invalidate_ == invalidate)
|
| - return;
|
| -
|
| - TRACE_EVENT_INSTANT1("android_webview",
|
| - "BrowserViewRenderer::SetContinuousInvalidate",
|
| - TRACE_EVENT_SCOPE_THREAD,
|
| - "invalidate",
|
| - invalidate);
|
| - compositor_needs_continuous_invalidate_ = invalidate;
|
| - }
|
| + if (compositor_needs_continuous_invalidate_ == invalidate)
|
| + return;
|
| +
|
| + TRACE_EVENT_INSTANT1("android_webview",
|
| + "BrowserViewRenderer::SetContinuousInvalidate",
|
| + TRACE_EVENT_SCOPE_THREAD,
|
| + "invalidate",
|
| + invalidate);
|
| + compositor_needs_continuous_invalidate_ = invalidate;
|
|
|
| if (ui_task_runner_->BelongsToCurrentThread()) {
|
| EnsureContinuousInvalidation(false);
|
| @@ -609,13 +531,10 @@ void BrowserViewRenderer::ScrollTo(gfx::Vector2d scroll_offset) {
|
| DCHECK_LE(scroll_offset_dip.x(), max_scroll_offset_dip_.x());
|
| DCHECK_LE(scroll_offset_dip.y(), max_scroll_offset_dip_.y());
|
|
|
| - {
|
| - base::AutoLock lock(render_thread_lock_);
|
| - if (scroll_offset_dip_ == scroll_offset_dip)
|
| - return;
|
| + if (scroll_offset_dip_ == scroll_offset_dip)
|
| + return;
|
|
|
| - scroll_offset_dip_ = scroll_offset_dip;
|
| - }
|
| + scroll_offset_dip_ = scroll_offset_dip;
|
|
|
| TRACE_EVENT_INSTANT2("android_webview",
|
| "BrowserViewRenderer::ScrollTo",
|
| @@ -625,9 +544,8 @@ void BrowserViewRenderer::ScrollTo(gfx::Vector2d scroll_offset) {
|
| "y",
|
| scroll_offset_dip.y());
|
|
|
| - if (has_compositor_)
|
| - shared_renderer_state_->GetCompositor()->
|
| - DidChangeRootLayerScrollOffset();
|
| + if (compositor_)
|
| + compositor_->DidChangeRootLayerScrollOffset();
|
| }
|
|
|
| void BrowserViewRenderer::DidUpdateContent() {
|
| @@ -647,16 +565,12 @@ void BrowserViewRenderer::DidUpdateContent() {
|
|
|
| void BrowserViewRenderer::SetTotalRootLayerScrollOffset(
|
| gfx::Vector2dF scroll_offset_dip) {
|
| + // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during
|
| + // DrawGl when http://crbug.com/249972 is fixed.
|
| + if (scroll_offset_dip_ == scroll_offset_dip)
|
| + return;
|
|
|
| - {
|
| - base::AutoLock lock(render_thread_lock_);
|
| - // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during
|
| - // DrawGl when http://crbug.com/249972 is fixed.
|
| - if (scroll_offset_dip_ == scroll_offset_dip)
|
| - return;
|
| -
|
| - scroll_offset_dip_ = scroll_offset_dip;
|
| - }
|
| + scroll_offset_dip_ = scroll_offset_dip;
|
|
|
| gfx::Vector2d max_offset = max_scroll_offset();
|
| gfx::Vector2d scroll_offset;
|
| @@ -681,7 +595,6 @@ void BrowserViewRenderer::SetTotalRootLayerScrollOffset(
|
| }
|
|
|
| gfx::Vector2dF BrowserViewRenderer::GetTotalRootLayerScrollOffset() {
|
| - base::AutoLock lock(render_thread_lock_);
|
| return scroll_offset_dip_;
|
| }
|
|
|
| @@ -805,10 +718,7 @@ void BrowserViewRenderer::EnsureContinuousInvalidation(bool force_invalidate) {
|
| if (throttle_fallback_tick)
|
| return;
|
|
|
| - {
|
| - base::AutoLock lock(render_thread_lock_);
|
| - block_invalidates_ = compositor_needs_continuous_invalidate_;
|
| - }
|
| + block_invalidates_ = compositor_needs_continuous_invalidate_;
|
|
|
| // Unretained here is safe because the callback is cancelled when
|
| // |fallback_tick_| is destroyed.
|
| @@ -835,12 +745,12 @@ void BrowserViewRenderer::FallbackTickFired() {
|
| // This should only be called if OnDraw or DrawGL did not come in time, which
|
| // means block_invalidates_ must still be true.
|
| DCHECK(block_invalidates_);
|
| - if (compositor_needs_continuous_invalidate_ && has_compositor_)
|
| + if (compositor_needs_continuous_invalidate_ && compositor_)
|
| ForceFakeCompositeSW();
|
| }
|
|
|
| void BrowserViewRenderer::ForceFakeCompositeSW() {
|
| - DCHECK(has_compositor_);
|
| + DCHECK(compositor_);
|
| SkBitmap bitmap;
|
| bitmap.allocN32Pixels(1, 1);
|
| bitmap.eraseColor(0);
|
| @@ -849,30 +759,26 @@ void BrowserViewRenderer::ForceFakeCompositeSW() {
|
| }
|
|
|
| bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) {
|
| - DCHECK(has_compositor_);
|
| - bool result = shared_renderer_state_->GetCompositor()->
|
| - DemandDrawSw(canvas);
|
| - DidComposite(false);
|
| + DCHECK(compositor_);
|
| + bool result = compositor_->DemandDrawSw(canvas);
|
| + DidComposite();
|
| return result;
|
| }
|
|
|
| -void BrowserViewRenderer::DidComposite(bool force_invalidate) {
|
| - {
|
| - base::AutoLock lock(render_thread_lock_);
|
| - block_invalidates_ = false;
|
| - }
|
| +void BrowserViewRenderer::DidComposite() {
|
| + block_invalidates_ = false;
|
|
|
| if (!ui_task_runner_->BelongsToCurrentThread()) {
|
| ui_task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&BrowserViewRenderer::EnsureContinuousInvalidation,
|
| ui_thread_weak_ptr_,
|
| - force_invalidate));
|
| + false));
|
| return;
|
| }
|
|
|
| fallback_tick_.Cancel();
|
| - EnsureContinuousInvalidation(force_invalidate);
|
| + EnsureContinuousInvalidation(false);
|
| }
|
|
|
| std::string BrowserViewRenderer::ToString(AwDrawGLInfo* draw_info) const {
|
|
|