1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "android_webview/browser/hardware_renderer.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "android_webview/browser/aw_gl_surface.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "android_webview/browser/deferred_gpu_command_service.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "android_webview/browser/parent_output_surface.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "android_webview/browser/shared_renderer_state.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "android_webview/public/browser/draw_gl.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/auto_reset.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/debug/trace_event.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/layers/delegated_frame_provider.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/layers/delegated_renderer_layer.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/layers/layer.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/output/compositor_frame.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/output/output_surface.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/trees/layer_tree_host.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/trees/layer_tree_settings.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "gpu/command_buffer/client/gl_in_process_context.h"
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/frame_time.h"
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/gfx/geometry/rect_conversions.h"
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/gfx/geometry/rect_f.h"
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/transform.h"
280de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "ui/gl/gl_bindings.h"
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "webkit/common/gpu/context_provider_in_process.h"
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace android_webview {
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using webkit::gpu::WebGraphicsContext3DImpl;
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_refptr<cc::ContextProvider> CreateContext(
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_refptr<gfx::GLSurface> surface,
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<gpu::InProcessCommandBuffer::Service> service) {
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebGraphicsContext3D::Attributes attributes;
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  attributes.antialias = false;
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  attributes.depth = false;
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  attributes.stencil = false;
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  attributes.shareResources = true;
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  attributes.noAutomaticFlushes = true;
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gpu::gles2::ContextCreationAttribHelper attribs_for_gles2;
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  WebGraphicsContext3DImpl::ConvertAttributes(
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      attributes, &attribs_for_gles2);
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  attribs_for_gles2.lose_context_when_out_of_memory = true;
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<gpu::GLInProcessContext> context(gpu::GLInProcessContext::Create(
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      service,
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      surface,
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      surface->IsOffscreen(),
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      gfx::kNullAcceleratedWidget,
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      surface->GetSize(),
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NULL /* share_context */,
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      false /* share_resources */,
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      attribs_for_gles2,
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      gpu_preference,
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      gpu::GLInProcessContextSharedMemoryLimits()));
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(context.get());
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return webkit::gpu::ContextProviderInProcess::Create(
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext(
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          context.Pass(), attributes),
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "Parent-Compositor");
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)HardwareRenderer::HardwareRenderer(SharedRendererState* state)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : shared_renderer_state_(state),
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      last_egl_context_(eglGetCurrentContext()),
7934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      width_(0),
8034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      height_(0),
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      stencil_enabled_(false),
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      viewport_clip_valid_for_dcheck_(false),
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      gl_surface_(new AwGLSurface),
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      root_layer_(cc::Layer::Create()),
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      resource_collection_(new cc::DelegatedFrameResourceCollection),
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      output_surface_(NULL) {
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(last_egl_context_);
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  resource_collection_->SetClient(this);
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cc::LayerTreeSettings settings;
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Should be kept in sync with compositor_impl_android.cc.
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings.allow_antialiasing = false;
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings.highp_threshold_min = 2048;
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Webview does not own the surface so should not clear it.
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  settings.should_clear_root_render_pass = false;
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(enne): Update this this compositor to use a synchronous scheduler.
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  settings.single_thread_proxy_scheduler = false;
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  layer_tree_host_ =
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      cc::LayerTreeHost::CreateSingleThreaded(this, this, NULL, settings, NULL);
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layer_tree_host_->SetRootLayer(root_layer_);
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layer_tree_host_->SetLayerTreeHostClientReady();
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  layer_tree_host_->set_has_transparent_background(true);
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)HardwareRenderer::~HardwareRenderer() {
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetFrameData();
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Must reset everything before |resource_collection_| to ensure all
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // resources are returned before resetting |resource_collection_| client.
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layer_tree_host_.reset();
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  root_layer_ = NULL;
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegated_layer_ = NULL;
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  frame_provider_ = NULL;
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if DCHECK_IS_ON
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Check collection is empty.
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cc::ReturnedResourceArray returned_resources;
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  resource_collection_->TakeUnusedResourcesForChildCompositor(
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      &returned_resources);
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK_EQ(0u, returned_resources.size());
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // DCHECK_IS_ON
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  resource_collection_->SetClient(NULL);
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Reset draw constraints.
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  shared_renderer_state_->UpdateDrawConstraints(
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ParentCompositorDrawConstraints());
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HardwareRenderer::DidBeginMainFrame() {
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This is called after OutputSurface is created, but before the impl frame
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // starts. We set the draw constraints here.
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(output_surface_);
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(viewport_clip_valid_for_dcheck_);
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  output_surface_->SetExternalStencilTest(stencil_enabled_);
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  output_surface_->SetDrawConstraints(viewport_, clip_);
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void HardwareRenderer::CommitFrame() {
14434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  scroll_offset_ = shared_renderer_state_->GetScrollOffset();
14534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (committed_frame_.get()) {
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TRACE_EVENT_INSTANT0("android_webview",
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         "EarlyOut_PreviousFrameUnconsumed",
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         TRACE_EVENT_SCOPE_THREAD);
1495b62eb5758cb7b791cfdd45cf78f35dc060631b6Ben Murdoch    shared_renderer_state_->DidSkipCommitFrame();
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  committed_frame_ = shared_renderer_state_->PassCompositorFrame();
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Happens with empty global visible rect.
15534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!committed_frame_.get())
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  DCHECK(!committed_frame_->gl_frame_data);
15934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  DCHECK(!committed_frame_->software_frame_data);
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // DelegatedRendererLayerImpl applies the inverse device_scale_factor of the
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // renderer frame, assuming that the browser compositor will scale
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // it back up to device scale.  But on Android we put our browser layers in
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // physical pixels and set our browser CC device_scale_factor to 1, so this
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // suppresses the transform.
16634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  committed_frame_->delegated_frame_data->device_scale_factor = 1.0f;
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid HardwareRenderer::SetFrameData() {
17034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (!committed_frame_.get())
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
17334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  scoped_ptr<cc::CompositorFrame> frame = committed_frame_.Pass();
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Size frame_size =
17534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      frame->delegated_frame_data->render_pass_list.back()->output_rect.size();
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool size_changed = frame_size != frame_size_;
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  frame_size_ = frame_size;
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!frame_provider_ || size_changed) {
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (delegated_layer_) {
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      delegated_layer_->RemoveFromParent();
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    frame_provider_ = new cc::DelegatedFrameProvider(
18534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        resource_collection_.get(), frame->delegated_frame_data.Pass());
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    delegated_layer_ = cc::DelegatedRendererLayer::Create(frame_provider_);
18834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    delegated_layer_->SetBounds(frame_size_);
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    delegated_layer_->SetIsDrawable(true);
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    root_layer_->AddChild(delegated_layer_);
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else {
19334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    frame_provider_->SetFrameData(frame->delegated_frame_data.Pass());
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HardwareRenderer::DrawGL(bool stencil_enabled,
1980de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)                              int framebuffer_binding_ext,
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              AwDrawGLInfo* draw_info) {
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL");
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // We need to watch if the current Android context has changed and enforce
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // a clean-up in the compositor.
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EGLContext current_context = eglGetCurrentContext();
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(current_context) << "DrawGL called without EGLContext";
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(boliu): Handle context loss.
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (last_egl_context_ != current_context)
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DLOG(WARNING) << "EGLContextChanged";
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetFrameData();
2121675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  if (shared_renderer_state_->ForceCommit()) {
2131675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    CommitFrame();
2141675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch    SetFrameData();
2151675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  }
2161675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Transform transform(gfx::Transform::kSkipInitialization);
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  transform.matrix().setColMajorf(draw_info->transform);
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  transform.Translate(scroll_offset_.x(), scroll_offset_.y());
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Need to post the new transform matrix back to child compositor
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // because there is no onDraw during a Render Thread animation, and child
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // compositor might not have the tiles rasterized as the animation goes on.
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ParentCompositorDrawConstraints draw_constraints(
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      draw_info->is_layer, transform, gfx::Rect(viewport_));
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  draw_constraints_ = draw_constraints;
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  shared_renderer_state_->PostExternalDrawConstraintsToChildCompositor(
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      draw_constraints);
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!delegated_layer_.get())
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  viewport_.SetSize(draw_info->width, draw_info->height);
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layer_tree_host_->SetViewportSize(viewport_);
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  clip_.SetRect(draw_info->clip_left,
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                draw_info->clip_top,
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                draw_info->clip_right - draw_info->clip_left,
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                draw_info->clip_bottom - draw_info->clip_top);
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  stencil_enabled_ = stencil_enabled;
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegated_layer_->SetTransform(transform);
243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gl_surface_->SetBackingFrameBufferObject(framebuffer_binding_ext);
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  {
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::AutoReset<bool> frame_resetter(&viewport_clip_valid_for_dcheck_,
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                         true);
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    layer_tree_host_->SetNeedsRedrawRect(clip_);
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    layer_tree_host_->Composite(gfx::FrameTime::Now());
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gl_surface_->ResetBackingFrameBufferObject();
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid HardwareRenderer::RequestNewOutputSurface(bool fallback) {
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Android webview does not support losing output surface.
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!fallback);
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<cc::ContextProvider> context_provider =
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateContext(gl_surface_,
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    DeferredGpuCommandService::GetInstance());
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<ParentOutputSurface> output_surface_holder(
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new ParentOutputSurface(context_provider));
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  output_surface_ = output_surface_holder.get();
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layer_tree_host_->SetOutputSurface(
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      output_surface_holder.PassAs<cc::OutputSurface>());
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HardwareRenderer::UnusedResourcesAreAvailable() {
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cc::ReturnedResourceArray returned_resources;
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  resource_collection_->TakeUnusedResourcesForChildCompositor(
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      &returned_resources);
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  shared_renderer_state_->InsertReturnedResources(returned_resources);
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace android_webview
275