| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "android_webview/browser/hardware_renderer.h" | 5 #include "android_webview/browser/hardware_renderer.h" |
| 6 | 6 |
| 7 #include <utility> |
| 8 |
| 7 #include "android_webview/browser/aw_gl_surface.h" | 9 #include "android_webview/browser/aw_gl_surface.h" |
| 8 #include "android_webview/browser/aw_render_thread_context_provider.h" | 10 #include "android_webview/browser/aw_render_thread_context_provider.h" |
| 9 #include "android_webview/browser/child_frame.h" | 11 #include "android_webview/browser/child_frame.h" |
| 10 #include "android_webview/browser/deferred_gpu_command_service.h" | 12 #include "android_webview/browser/deferred_gpu_command_service.h" |
| 11 #include "android_webview/browser/parent_compositor_draw_constraints.h" | 13 #include "android_webview/browser/parent_compositor_draw_constraints.h" |
| 12 #include "android_webview/browser/parent_output_surface.h" | 14 #include "android_webview/browser/parent_output_surface.h" |
| 13 #include "android_webview/browser/shared_renderer_state.h" | 15 #include "android_webview/browser/shared_renderer_state.h" |
| 14 #include "android_webview/public/browser/draw_gl.h" | 16 #include "android_webview/public/browser/draw_gl.h" |
| 15 #include "base/auto_reset.h" | 17 #include "base/auto_reset.h" |
| 16 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 | 75 |
| 74 void HardwareRenderer::CommitFrame() { | 76 void HardwareRenderer::CommitFrame() { |
| 75 TRACE_EVENT0("android_webview", "CommitFrame"); | 77 TRACE_EVENT0("android_webview", "CommitFrame"); |
| 76 scroll_offset_ = shared_renderer_state_->GetScrollOffsetOnRT(); | 78 scroll_offset_ = shared_renderer_state_->GetScrollOffsetOnRT(); |
| 77 scoped_ptr<ChildFrame> child_frame = | 79 scoped_ptr<ChildFrame> child_frame = |
| 78 shared_renderer_state_->PassCompositorFrameOnRT(); | 80 shared_renderer_state_->PassCompositorFrameOnRT(); |
| 79 if (!child_frame.get()) | 81 if (!child_frame.get()) |
| 80 return; | 82 return; |
| 81 | 83 |
| 82 ReturnResourcesInChildFrame(); | 84 ReturnResourcesInChildFrame(); |
| 83 child_frame_ = child_frame.Pass(); | 85 child_frame_ = std::move(child_frame); |
| 84 DCHECK(child_frame_->frame.get()); | 86 DCHECK(child_frame_->frame.get()); |
| 85 DCHECK(!child_frame_->frame->gl_frame_data); | 87 DCHECK(!child_frame_->frame->gl_frame_data); |
| 86 } | 88 } |
| 87 | 89 |
| 88 void HardwareRenderer::DrawGL(bool stencil_enabled, | 90 void HardwareRenderer::DrawGL(bool stencil_enabled, |
| 89 AwDrawGLInfo* draw_info) { | 91 AwDrawGLInfo* draw_info) { |
| 90 TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL"); | 92 TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL"); |
| 91 | 93 |
| 92 // We need to watch if the current Android context has changed and enforce | 94 // We need to watch if the current Android context has changed and enforce |
| 93 // a clean-up in the compositor. | 95 // a clean-up in the compositor. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 113 child_id_ = cc::SurfaceId(); | 115 child_id_ = cc::SurfaceId(); |
| 114 | 116 |
| 115 // This will return all the resources to the previous compositor. | 117 // This will return all the resources to the previous compositor. |
| 116 surface_factory_.reset(); | 118 surface_factory_.reset(); |
| 117 compositor_id_ = child_frame_->compositor_id; | 119 compositor_id_ = child_frame_->compositor_id; |
| 118 surface_factory_.reset( | 120 surface_factory_.reset( |
| 119 new cc::SurfaceFactory(surface_manager_.get(), this)); | 121 new cc::SurfaceFactory(surface_manager_.get(), this)); |
| 120 } | 122 } |
| 121 | 123 |
| 122 scoped_ptr<cc::CompositorFrame> child_compositor_frame = | 124 scoped_ptr<cc::CompositorFrame> child_compositor_frame = |
| 123 child_frame_->frame.Pass(); | 125 std::move(child_frame_->frame); |
| 124 | 126 |
| 125 // On Android we put our browser layers in physical pixels and set our | 127 // On Android we put our browser layers in physical pixels and set our |
| 126 // browser CC device_scale_factor to 1, so suppress the transform between | 128 // browser CC device_scale_factor to 1, so suppress the transform between |
| 127 // DIP and pixels. | 129 // DIP and pixels. |
| 128 child_compositor_frame->delegated_frame_data->device_scale_factor = 1.0f; | 130 child_compositor_frame->delegated_frame_data->device_scale_factor = 1.0f; |
| 129 | 131 |
| 130 gfx::Size frame_size = | 132 gfx::Size frame_size = |
| 131 child_compositor_frame->delegated_frame_data->render_pass_list.back() | 133 child_compositor_frame->delegated_frame_data->render_pass_list.back() |
| 132 ->output_rect.size(); | 134 ->output_rect.size(); |
| 133 bool size_changed = frame_size != frame_size_; | 135 bool size_changed = frame_size != frame_size_; |
| 134 frame_size_ = frame_size; | 136 frame_size_ = frame_size; |
| 135 if (child_id_.is_null() || size_changed) { | 137 if (child_id_.is_null() || size_changed) { |
| 136 if (!child_id_.is_null()) | 138 if (!child_id_.is_null()) |
| 137 surface_factory_->Destroy(child_id_); | 139 surface_factory_->Destroy(child_id_); |
| 138 child_id_ = surface_id_allocator_->GenerateId(); | 140 child_id_ = surface_id_allocator_->GenerateId(); |
| 139 surface_factory_->Create(child_id_); | 141 surface_factory_->Create(child_id_); |
| 140 } | 142 } |
| 141 | 143 |
| 142 surface_factory_->SubmitCompositorFrame(child_id_, | 144 surface_factory_->SubmitCompositorFrame(child_id_, |
| 143 child_compositor_frame.Pass(), | 145 std::move(child_compositor_frame), |
| 144 cc::SurfaceFactory::DrawCallback()); | 146 cc::SurfaceFactory::DrawCallback()); |
| 145 } | 147 } |
| 146 | 148 |
| 147 gfx::Transform transform(gfx::Transform::kSkipInitialization); | 149 gfx::Transform transform(gfx::Transform::kSkipInitialization); |
| 148 transform.matrix().setColMajorf(draw_info->transform); | 150 transform.matrix().setColMajorf(draw_info->transform); |
| 149 transform.Translate(scroll_offset_.x(), scroll_offset_.y()); | 151 transform.Translate(scroll_offset_.x(), scroll_offset_.y()); |
| 150 | 152 |
| 151 gfx::Size viewport(draw_info->width, draw_info->height); | 153 gfx::Size viewport(draw_info->width, draw_info->height); |
| 152 // Need to post the new transform matrix back to child compositor | 154 // Need to post the new transform matrix back to child compositor |
| 153 // because there is no onDraw during a Render Thread animation, and child | 155 // because there is no onDraw during a Render Thread animation, and child |
| (...skipping 25 matching lines...) Expand all Loading... |
| 179 quad_state->visible_quad_layer_rect = gfx::Rect(frame_size_); | 181 quad_state->visible_quad_layer_rect = gfx::Rect(frame_size_); |
| 180 quad_state->opacity = 1.f; | 182 quad_state->opacity = 1.f; |
| 181 | 183 |
| 182 cc::SurfaceDrawQuad* surface_quad = | 184 cc::SurfaceDrawQuad* surface_quad = |
| 183 render_pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); | 185 render_pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); |
| 184 surface_quad->SetNew(quad_state, gfx::Rect(quad_state->quad_layer_bounds), | 186 surface_quad->SetNew(quad_state, gfx::Rect(quad_state->quad_layer_bounds), |
| 185 gfx::Rect(quad_state->quad_layer_bounds), child_id_); | 187 gfx::Rect(quad_state->quad_layer_bounds), child_id_); |
| 186 | 188 |
| 187 scoped_ptr<cc::DelegatedFrameData> delegated_frame( | 189 scoped_ptr<cc::DelegatedFrameData> delegated_frame( |
| 188 new cc::DelegatedFrameData); | 190 new cc::DelegatedFrameData); |
| 189 delegated_frame->render_pass_list.push_back(render_pass.Pass()); | 191 delegated_frame->render_pass_list.push_back(std::move(render_pass)); |
| 190 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); | 192 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
| 191 frame->delegated_frame_data = delegated_frame.Pass(); | 193 frame->delegated_frame_data = std::move(delegated_frame); |
| 192 | 194 |
| 193 if (root_id_.is_null()) { | 195 if (root_id_.is_null()) { |
| 194 root_id_ = surface_id_allocator_->GenerateId(); | 196 root_id_ = surface_id_allocator_->GenerateId(); |
| 195 surface_factory_->Create(root_id_); | 197 surface_factory_->Create(root_id_); |
| 196 display_->SetSurfaceId(root_id_, 1.f); | 198 display_->SetSurfaceId(root_id_, 1.f); |
| 197 } | 199 } |
| 198 surface_factory_->SubmitCompositorFrame(root_id_, frame.Pass(), | 200 surface_factory_->SubmitCompositorFrame(root_id_, std::move(frame), |
| 199 cc::SurfaceFactory::DrawCallback()); | 201 cc::SurfaceFactory::DrawCallback()); |
| 200 | 202 |
| 201 display_->Resize(viewport); | 203 display_->Resize(viewport); |
| 202 | 204 |
| 203 if (!output_surface_) { | 205 if (!output_surface_) { |
| 204 scoped_refptr<cc::ContextProvider> context_provider = | 206 scoped_refptr<cc::ContextProvider> context_provider = |
| 205 AwRenderThreadContextProvider::Create( | 207 AwRenderThreadContextProvider::Create( |
| 206 gl_surface_, DeferredGpuCommandService::GetInstance()); | 208 gl_surface_, DeferredGpuCommandService::GetInstance()); |
| 207 scoped_ptr<ParentOutputSurface> output_surface_holder( | 209 scoped_ptr<ParentOutputSurface> output_surface_holder( |
| 208 new ParentOutputSurface(context_provider)); | 210 new ParentOutputSurface(context_provider)); |
| 209 output_surface_ = output_surface_holder.get(); | 211 output_surface_ = output_surface_holder.get(); |
| 210 display_->Initialize(output_surface_holder.Pass(), nullptr); | 212 display_->Initialize(std::move(output_surface_holder), nullptr); |
| 211 } | 213 } |
| 212 output_surface_->SetExternalStencilTest(stencil_enabled); | 214 output_surface_->SetExternalStencilTest(stencil_enabled); |
| 213 display_->SetExternalClip(clip); | 215 display_->SetExternalClip(clip); |
| 214 display_->DrawAndSwap(); | 216 display_->DrawAndSwap(); |
| 215 } | 217 } |
| 216 | 218 |
| 217 void HardwareRenderer::ReturnResources( | 219 void HardwareRenderer::ReturnResources( |
| 218 const cc::ReturnedResourceArray& resources) { | 220 const cc::ReturnedResourceArray& resources) { |
| 219 ReturnResourcesToCompositor(resources, compositor_id_); | 221 ReturnResourcesToCompositor(resources, compositor_id_); |
| 220 } | 222 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 245 child_frame_.reset(); | 247 child_frame_.reset(); |
| 246 } | 248 } |
| 247 | 249 |
| 248 void HardwareRenderer::ReturnResourcesToCompositor( | 250 void HardwareRenderer::ReturnResourcesToCompositor( |
| 249 const cc::ReturnedResourceArray& resources, | 251 const cc::ReturnedResourceArray& resources, |
| 250 unsigned int compositor_id) { | 252 unsigned int compositor_id) { |
| 251 shared_renderer_state_->InsertReturnedResourcesOnRT(resources, compositor_id); | 253 shared_renderer_state_->InsertReturnedResourcesOnRT(resources, compositor_id); |
| 252 } | 254 } |
| 253 | 255 |
| 254 } // namespace android_webview | 256 } // namespace android_webview |
| OLD | NEW |