OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/browser/android/synchronous_compositor_host.h" | 5 #include "content/browser/android/synchronous_compositor_host.h" |
6 | 6 |
| 7 #include <utility> |
| 8 |
7 #include "base/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
8 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
9 #include "base/trace_event/trace_event_argument.h" | 11 #include "base/trace_event/trace_event_argument.h" |
10 #include "cc/output/compositor_frame_ack.h" | 12 #include "cc/output/compositor_frame_ack.h" |
11 #include "content/browser/renderer_host/render_widget_host_view_android.h" | 13 #include "content/browser/renderer_host/render_widget_host_view_android.h" |
12 #include "content/browser/web_contents/web_contents_impl.h" | 14 #include "content/browser/web_contents/web_contents_impl.h" |
13 #include "content/common/android/sync_compositor_messages.h" | 15 #include "content/common/android/sync_compositor_messages.h" |
14 #include "content/public/browser/android/synchronous_compositor_client.h" | 16 #include "content/public/browser/android/synchronous_compositor_client.h" |
15 #include "content/public/browser/browser_thread.h" | 17 #include "content/public/browser/browser_thread.h" |
16 #include "content/public/browser/render_view_host.h" | 18 #include "content/public/browser/render_view_host.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 if (frame) | 91 if (frame) |
90 UpdateFrameMetaData(frame->metadata); | 92 UpdateFrameMetaData(frame->metadata); |
91 return frame; | 93 return frame; |
92 } | 94 } |
93 | 95 |
94 void SynchronousCompositorHost::UpdateFrameMetaData( | 96 void SynchronousCompositorHost::UpdateFrameMetaData( |
95 const cc::CompositorFrameMetadata& frame_metadata) { | 97 const cc::CompositorFrameMetadata& frame_metadata) { |
96 rwhva_->SynchronousFrameMetadata(frame_metadata); | 98 rwhva_->SynchronousFrameMetadata(frame_metadata); |
97 } | 99 } |
98 | 100 |
| 101 class SynchronousCompositorHost::ScopedSendZeroMemory { |
| 102 public: |
| 103 ScopedSendZeroMemory(SynchronousCompositorHost* host) : host_(host) {} |
| 104 ~ScopedSendZeroMemory() { host_->SendZeroMemory(); } |
| 105 |
| 106 private: |
| 107 SynchronousCompositorHost* const host_; |
| 108 |
| 109 DISALLOW_COPY_AND_ASSIGN(ScopedSendZeroMemory); |
| 110 }; |
| 111 |
| 112 struct SynchronousCompositorHost::SharedMemoryWithSize { |
| 113 base::SharedMemory shm; |
| 114 const size_t stride; |
| 115 const size_t buffer_size; |
| 116 |
| 117 SharedMemoryWithSize(size_t stride, size_t buffer_size) |
| 118 : stride(stride), buffer_size(buffer_size) {} |
| 119 |
| 120 private: |
| 121 DISALLOW_COPY_AND_ASSIGN(SharedMemoryWithSize); |
| 122 }; |
| 123 |
99 bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) { | 124 bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) { |
100 SyncCompositorDemandDrawSwParams params; | 125 SyncCompositorDemandDrawSwParams params; |
101 params.size = gfx::Size(canvas->getBaseLayerSize().width(), | 126 params.size = gfx::Size(canvas->getBaseLayerSize().width(), |
102 canvas->getBaseLayerSize().height()); | 127 canvas->getBaseLayerSize().height()); |
103 SkIRect canvas_clip; | 128 SkIRect canvas_clip; |
104 canvas->getClipDeviceBounds(&canvas_clip); | 129 canvas->getClipDeviceBounds(&canvas_clip); |
105 params.clip = gfx::SkIRectToRect(canvas_clip); | 130 params.clip = gfx::SkIRectToRect(canvas_clip); |
106 params.transform.matrix() = canvas->getTotalMatrix(); | 131 params.transform.matrix() = canvas->getTotalMatrix(); |
107 if (params.size.IsEmpty()) | 132 if (params.size.IsEmpty()) |
108 return true; | 133 return true; |
109 | 134 |
110 SkImageInfo info = | 135 SkImageInfo info = |
111 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); | 136 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); |
112 DCHECK_EQ(kRGBA_8888_SkColorType, info.colorType()); | 137 DCHECK_EQ(kRGBA_8888_SkColorType, info.colorType()); |
113 size_t stride = info.minRowBytes(); | 138 size_t stride = info.minRowBytes(); |
114 size_t buffer_size = info.getSafeSize(stride); | 139 size_t buffer_size = info.getSafeSize(stride); |
115 if (!buffer_size) | 140 if (!buffer_size) |
116 return false; // Overflow. | 141 return false; // Overflow. |
117 | 142 |
118 base::SharedMemory shm; | 143 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size); |
119 { | 144 if (!software_draw_shm_) |
120 TRACE_EVENT1("browser", "AllocateSharedMemory", "buffer_size", buffer_size); | |
121 if (!shm.CreateAndMapAnonymous(buffer_size)) | |
122 return false; | |
123 } | |
124 base::ProcessHandle renderer_process_handle = | |
125 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); | |
126 if (!shm.ShareToProcess(renderer_process_handle, ¶ms.shm_handle)) | |
127 return false; | 145 return false; |
128 | 146 |
129 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); | 147 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
130 SyncCompositorCommonBrowserParams common_browser_params; | 148 SyncCompositorCommonBrowserParams common_browser_params; |
131 PopulateCommonParams(&common_browser_params); | 149 PopulateCommonParams(&common_browser_params); |
132 SyncCompositorCommonRendererParams common_renderer_params; | 150 SyncCompositorCommonRendererParams common_renderer_params; |
133 bool success = false; | 151 bool success = false; |
134 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( | 152 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( |
135 routing_id_, common_browser_params, params, &success, | 153 routing_id_, common_browser_params, params, &success, |
136 &common_renderer_params, frame.get()))) { | 154 &common_renderer_params, frame.get()))) { |
137 return false; | 155 return false; |
138 } | 156 } |
| 157 ScopedSendZeroMemory send_zero_memory(this); |
139 if (!success) | 158 if (!success) |
140 return false; | 159 return false; |
141 | 160 |
142 ProcessCommonParams(common_renderer_params); | 161 ProcessCommonParams(common_renderer_params); |
143 UpdateFrameMetaData(frame->metadata); | 162 UpdateFrameMetaData(frame->metadata); |
144 | 163 |
145 SkBitmap bitmap; | 164 SkBitmap bitmap; |
146 if (!bitmap.installPixels(info, shm.memory(), stride)) | 165 if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride)) |
147 return false; | 166 return false; |
148 | 167 |
149 { | 168 { |
150 TRACE_EVENT0("browser", "DrawBitmap"); | 169 TRACE_EVENT0("browser", "DrawBitmap"); |
151 canvas->save(); | 170 canvas->save(); |
152 canvas->resetMatrix(); | 171 canvas->resetMatrix(); |
153 canvas->drawBitmap(bitmap, 0, 0); | 172 canvas->drawBitmap(bitmap, 0, 0); |
154 canvas->restore(); | 173 canvas->restore(); |
155 } | 174 } |
156 | 175 |
157 return true; | 176 return true; |
158 } | 177 } |
159 | 178 |
| 179 void SynchronousCompositorHost::SetSoftwareDrawSharedMemoryIfNeeded( |
| 180 size_t stride, |
| 181 size_t buffer_size) { |
| 182 if (software_draw_shm_ && software_draw_shm_->stride == stride && |
| 183 software_draw_shm_->buffer_size == buffer_size) |
| 184 return; |
| 185 software_draw_shm_.reset(); |
| 186 scoped_ptr<SharedMemoryWithSize> software_draw_shm( |
| 187 new SharedMemoryWithSize(stride, buffer_size)); |
| 188 { |
| 189 TRACE_EVENT1("browser", "AllocateSharedMemory", "buffer_size", buffer_size); |
| 190 if (!software_draw_shm->shm.CreateAndMapAnonymous(buffer_size)) |
| 191 return; |
| 192 } |
| 193 |
| 194 SyncCompositorSetSharedMemoryParams set_shm_params; |
| 195 set_shm_params.buffer_size = buffer_size; |
| 196 base::ProcessHandle renderer_process_handle = |
| 197 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); |
| 198 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle, |
| 199 &set_shm_params.shm_handle)) { |
| 200 return; |
| 201 } |
| 202 |
| 203 SyncCompositorCommonBrowserParams common_browser_params; |
| 204 PopulateCommonParams(&common_browser_params); |
| 205 bool success = false; |
| 206 SyncCompositorCommonRendererParams common_renderer_params; |
| 207 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory( |
| 208 routing_id_, common_browser_params, set_shm_params, &success, |
| 209 &common_renderer_params)) || |
| 210 !success) { |
| 211 return; |
| 212 } |
| 213 software_draw_shm_ = std::move(software_draw_shm); |
| 214 ProcessCommonParams(common_renderer_params); |
| 215 } |
| 216 |
| 217 void SynchronousCompositorHost::SendZeroMemory() { |
| 218 // No need to check return value. |
| 219 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); |
| 220 } |
| 221 |
160 void SynchronousCompositorHost::ReturnResources( | 222 void SynchronousCompositorHost::ReturnResources( |
161 const cc::CompositorFrameAck& frame_ack) { | 223 const cc::CompositorFrameAck& frame_ack) { |
162 returned_resources_.insert(returned_resources_.end(), | 224 returned_resources_.insert(returned_resources_.end(), |
163 frame_ack.resources.begin(), | 225 frame_ack.resources.begin(), |
164 frame_ack.resources.end()); | 226 frame_ack.resources.end()); |
165 } | 227 } |
166 | 228 |
167 void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) { | 229 void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) { |
168 if (bytes_limit_ == bytes_limit) | 230 if (bytes_limit_ == bytes_limit) |
169 return; | 231 return; |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 params.scrollable_size, params.page_scale_factor, | 373 params.scrollable_size, params.page_scale_factor, |
312 params.min_page_scale_factor, params.max_page_scale_factor); | 374 params.min_page_scale_factor, params.max_page_scale_factor); |
313 } | 375 } |
314 } | 376 } |
315 | 377 |
316 void SynchronousCompositorHost::UpdateNeedsBeginFrames() { | 378 void SynchronousCompositorHost::UpdateNeedsBeginFrames() { |
317 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_); | 379 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_); |
318 } | 380 } |
319 | 381 |
320 } // namespace content | 382 } // namespace content |
OLD | NEW |