| Index: android_webview/browser/hardware_renderer.cc
|
| diff --git a/android_webview/browser/hardware_renderer.cc b/android_webview/browser/hardware_renderer.cc
|
| index 511969e34f0c029d7d4a0256d319e6e2023e4bc9..eaf34a9a595dc71eacaf0f6ec1ff76be77a5bd59 100644
|
| --- a/android_webview/browser/hardware_renderer.cc
|
| +++ b/android_webview/browser/hardware_renderer.cc
|
| @@ -76,11 +76,13 @@ HardwareRenderer::HardwareRenderer(SharedRendererState* state)
|
| last_egl_context_(eglGetCurrentContext()),
|
| stencil_enabled_(false),
|
| viewport_clip_valid_for_dcheck_(false),
|
| + gl_surface_(new AwGLSurface),
|
| root_layer_(cc::Layer::Create()),
|
| + resource_collection_(new cc::DelegatedFrameResourceCollection),
|
| output_surface_(NULL) {
|
| DCHECK(last_egl_context_);
|
|
|
| - gl_surface_ = new AwGLSurface;
|
| + resource_collection_->SetClient(this);
|
|
|
| cc::LayerTreeSettings settings;
|
|
|
| @@ -105,17 +107,15 @@ HardwareRenderer::~HardwareRenderer() {
|
| root_layer_ = NULL;
|
| delegated_layer_ = NULL;
|
| frame_provider_ = NULL;
|
| - if (resource_collection_.get()) {
|
| #if DCHECK_IS_ON
|
| - // Check collection is empty.
|
| - cc::ReturnedResourceArray returned_resources;
|
| - resource_collection_->TakeUnusedResourcesForChildCompositor(
|
| - &returned_resources);
|
| - DCHECK_EQ(0u, returned_resources.size());
|
| + // Check collection is empty.
|
| + cc::ReturnedResourceArray returned_resources;
|
| + resource_collection_->TakeUnusedResourcesForChildCompositor(
|
| + &returned_resources);
|
| + DCHECK_EQ(0u, returned_resources.size());
|
| #endif // DCHECK_IS_ON
|
|
|
| - resource_collection_->SetClient(NULL);
|
| - }
|
| + resource_collection_->SetClient(NULL);
|
| }
|
|
|
| void HardwareRenderer::DidBeginMainFrame() {
|
| @@ -127,6 +127,48 @@ void HardwareRenderer::DidBeginMainFrame() {
|
| output_surface_->SetDrawConstraints(viewport_, clip_);
|
| }
|
|
|
| +void HardwareRenderer::CommitFrame() {
|
| + scoped_ptr<DrawGLInput> input = shared_renderer_state_->PassDrawGLInput();
|
| + if (!input.get()) {
|
| + DLOG(WARNING) << "No frame to commit";
|
| + return;
|
| + }
|
| +
|
| + DCHECK(!input->frame.gl_frame_data);
|
| + DCHECK(!input->frame.software_frame_data);
|
| +
|
| + // DelegatedRendererLayerImpl applies the inverse device_scale_factor of the
|
| + // renderer frame, assuming that the browser compositor will scale
|
| + // it back up to device scale. But on Android we put our browser layers in
|
| + // physical pixels and set our browser CC device_scale_factor to 1, so this
|
| + // suppresses the transform.
|
| + input->frame.delegated_frame_data->device_scale_factor = 1.0f;
|
| +
|
| + gfx::Size frame_size =
|
| + input->frame.delegated_frame_data->render_pass_list.back()
|
| + ->output_rect.size();
|
| + bool size_changed = frame_size != frame_size_;
|
| + frame_size_ = frame_size;
|
| + scroll_offset_ = input->scroll_offset;
|
| +
|
| + if (!frame_provider_ || size_changed) {
|
| + if (delegated_layer_) {
|
| + delegated_layer_->RemoveFromParent();
|
| + }
|
| +
|
| + frame_provider_ = new cc::DelegatedFrameProvider(
|
| + resource_collection_.get(), input->frame.delegated_frame_data.Pass());
|
| +
|
| + delegated_layer_ = cc::DelegatedRendererLayer::Create(frame_provider_);
|
| + delegated_layer_->SetBounds(gfx::Size(input->width, input->height));
|
| + delegated_layer_->SetIsDrawable(true);
|
| +
|
| + root_layer_->AddChild(delegated_layer_);
|
| + } else {
|
| + frame_provider_->SetFrameData(input->frame.delegated_frame_data.Pass());
|
| + }
|
| +}
|
| +
|
| void HardwareRenderer::DrawGL(bool stencil_enabled,
|
| int framebuffer_binding_ext,
|
| AwDrawGLInfo* draw_info) {
|
| @@ -140,52 +182,15 @@ void HardwareRenderer::DrawGL(bool stencil_enabled,
|
| return;
|
| }
|
|
|
| + if (!delegated_layer_.get()) {
|
| + DLOG(ERROR) << "No frame committed";
|
| + return;
|
| + }
|
| +
|
| // TODO(boliu): Handle context loss.
|
| if (last_egl_context_ != current_context)
|
| DLOG(WARNING) << "EGLContextChanged";
|
|
|
| - scoped_ptr<DrawGLInput> input = shared_renderer_state_->PassDrawGLInput();
|
| - if (!resource_collection_.get()) {
|
| - resource_collection_ = new cc::DelegatedFrameResourceCollection;
|
| - resource_collection_->SetClient(this);
|
| - }
|
| -
|
| - if (input.get()) {
|
| - DCHECK(!input->frame.gl_frame_data);
|
| - DCHECK(!input->frame.software_frame_data);
|
| -
|
| - // DelegatedRendererLayerImpl applies the inverse device_scale_factor of the
|
| - // renderer frame, assuming that the browser compositor will scale
|
| - // it back up to device scale. But on Android we put our browser layers in
|
| - // physical pixels and set our browser CC device_scale_factor to 1, so this
|
| - // suppresses the transform.
|
| - input->frame.delegated_frame_data->device_scale_factor = 1.0f;
|
| -
|
| - gfx::Size frame_size =
|
| - input->frame.delegated_frame_data->render_pass_list.back()
|
| - ->output_rect.size();
|
| - bool size_changed = frame_size != frame_size_;
|
| - frame_size_ = frame_size;
|
| - scroll_offset_ = input->scroll_offset;
|
| -
|
| - if (!frame_provider_ || size_changed) {
|
| - if (delegated_layer_) {
|
| - delegated_layer_->RemoveFromParent();
|
| - }
|
| -
|
| - frame_provider_ = new cc::DelegatedFrameProvider(
|
| - resource_collection_.get(), input->frame.delegated_frame_data.Pass());
|
| -
|
| - delegated_layer_ = cc::DelegatedRendererLayer::Create(frame_provider_);
|
| - delegated_layer_->SetBounds(gfx::Size(input->width, input->height));
|
| - delegated_layer_->SetIsDrawable(true);
|
| -
|
| - root_layer_->AddChild(delegated_layer_);
|
| - } else {
|
| - frame_provider_->SetFrameData(input->frame.delegated_frame_data.Pass());
|
| - }
|
| - }
|
| -
|
| viewport_.SetSize(draw_info->width, draw_info->height);
|
| layer_tree_host_->SetViewportSize(viewport_);
|
| clip_.SetRect(draw_info->clip_left,
|
|
|